Module: Mesa
Branch: main
Commit: 85462f74553cd835e9ba4c954330499cee832893
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=85462f74553cd835e9ba4c954330499cee832893

Author: Faith Ekstrand <[email protected]>
Date:   Tue Dec  5 23:28:52 2023 -0600

nak: Legalize immediates with source modifiers

We can just apply the source modifier to the immediate.  Also, make
IAdd3X have I32 sources.  They do get a bit odd in the high form but

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26535>

---

 src/nouveau/compiler/nak_legalize.rs | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)

diff --git a/src/nouveau/compiler/nak_legalize.rs 
b/src/nouveau/compiler/nak_legalize.rs
index 2d61bf29a39..ee1d0a8c783 100644
--- a/src/nouveau/compiler/nak_legalize.rs
+++ b/src/nouveau/compiler/nak_legalize.rs
@@ -323,6 +323,37 @@ fn legalize_instr(
         }
     }
 
+    let src_types = instr.src_types();
+    for (i, src) in instr.srcs_mut().iter_mut().enumerate() {
+        if let SrcRef::Imm32(u) = &mut src.src_ref {
+            *u = match src_types[i] {
+                SrcType::F32 | SrcType::F64 => match src.src_mod {
+                    SrcMod::None => *u,
+                    SrcMod::FAbs => *u & !(1_u32 << 31),
+                    SrcMod::FNeg => *u ^ !(1_u32 << 31),
+                    SrcMod::FNegAbs => *u | !(1_u32 << 31),
+                    _ => panic!("Not a float source modifier"),
+
+                }
+                SrcType::I32 => match src.src_mod {
+                    SrcMod::None => *u,
+                    SrcMod::INeg => -(*u as i32) as u32,
+                    _ => panic!("Not an integer source modifier"),
+                }
+                SrcType::B32 => match src.src_mod {
+                    SrcMod::None => *u,
+                    SrcMod::BNot => !*u,
+                    _ => panic!("Not a bitwise source modifier"),
+                }
+                _ => {
+                    assert!(src.src_mod.is_none());
+                    *u
+                }
+            };
+            src.src_mod = SrcMod::None;
+        }
+    }
+
     let mut vec_src_map: HashMap<SSARef, SSARef> = HashMap::new();
     let mut vec_comps = HashSet::new();
     for src in instr.srcs_mut() {

Reply via email to