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

Author: Faith Ekstrand <faith.ekstr...@collabora.com>
Date:   Tue Dec  5 23:52:24 2023 -0600

nak: Rework the OpIAdd3/OpIAdd3X split

This lets us use the correct source types on OpIAdd3X

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

---

 src/nouveau/compiler/nak_builder.rs     |  1 +
 src/nouveau/compiler/nak_encode_sm70.rs |  7 +++----
 src/nouveau/compiler/nak_from_nir.rs    | 10 ++--------
 src/nouveau/compiler/nak_ir.rs          | 26 ++++++++++++--------------
 src/nouveau/compiler/nak_legalize.rs    |  1 +
 5 files changed, 19 insertions(+), 26 deletions(-)

diff --git a/src/nouveau/compiler/nak_builder.rs 
b/src/nouveau/compiler/nak_builder.rs
index 6f54069bfec..0eb2cf5e955 100644
--- a/src/nouveau/compiler/nak_builder.rs
+++ b/src/nouveau/compiler/nak_builder.rs
@@ -154,6 +154,7 @@ pub trait SSABuilder: Builder {
         self.push_op(OpIAdd3 {
             dst: dst.into(),
             srcs: [Src::new_zero(), x, y],
+            overflow: [Dst::None; 2],
         });
         dst
     }
diff --git a/src/nouveau/compiler/nak_encode_sm70.rs 
b/src/nouveau/compiler/nak_encode_sm70.rs
index f1c15575a18..15a6527dcff 100644
--- a/src/nouveau/compiler/nak_encode_sm70.rs
+++ b/src/nouveau/compiler/nak_encode_sm70.rs
@@ -636,8 +636,8 @@ impl SM70Instr {
             ALUSrc::from_src(&op.srcs[2]),
         );
 
-        self.set_pred_dst(81..84, Dst::None);
-        self.set_pred_dst(84..87, Dst::None);
+        self.set_pred_dst(81..84, op.overflow[0]);
+        self.set_pred_dst(84..87, op.overflow[1]);
     }
 
     fn encode_iadd3x(&mut self, op: &OpIAdd3X) {
@@ -652,8 +652,7 @@ impl SM70Instr {
             ALUSrc::from_src(&op.srcs[2]),
         );
 
-        // .X
-        self.set_bit(74, op.high);
+        self.set_bit(74, true); // .X
 
         self.set_pred_dst(81..84, op.overflow[0]);
         self.set_pred_dst(84..87, op.overflow[1]);
diff --git a/src/nouveau/compiler/nak_from_nir.rs 
b/src/nouveau/compiler/nak_from_nir.rs
index 1e58d8cc54a..a7d3f76a892 100644
--- a/src/nouveau/compiler/nak_from_nir.rs
+++ b/src/nouveau/compiler/nak_from_nir.rs
@@ -757,17 +757,14 @@ impl<'a> ShaderFromNir<'a> {
                     let y = srcs[1].as_ssa().unwrap();
                     let sum = b.alloc_ssa(RegFile::GPR, 2);
                     let carry = b.alloc_ssa(RegFile::Pred, 1);
-                    b.push_op(OpIAdd3X {
+                    b.push_op(OpIAdd3 {
                         dst: sum[0].into(),
                         overflow: [carry.into(), Dst::None],
-                        high: false,
                         srcs: [x[0].into(), y[0].into(), 0.into()],
-                        carry: [SrcRef::False.into(), SrcRef::False.into()],
                     });
                     b.push_op(OpIAdd3X {
                         dst: sum[1].into(),
                         overflow: [Dst::None, Dst::None],
-                        high: true,
                         srcs: [x[1].into(), y[1].into(), 0.into()],
                         carry: [carry.into(), SrcRef::False.into()],
                     });
@@ -867,17 +864,14 @@ impl<'a> ShaderFromNir<'a> {
                     let x = srcs[0].as_ssa().unwrap();
                     let sum = b.alloc_ssa(RegFile::GPR, 2);
                     let carry = b.alloc_ssa(RegFile::Pred, 1);
-                    b.push_op(OpIAdd3X {
+                    b.push_op(OpIAdd3 {
                         dst: sum[0].into(),
                         overflow: [carry.into(), Dst::None],
-                        high: false,
                         srcs: [0.into(), Src::from(x[0]).ineg(), 0.into()],
-                        carry: [SrcRef::False.into(), SrcRef::False.into()],
                     });
                     b.push_op(OpIAdd3X {
                         dst: sum[1].into(),
                         overflow: [Dst::None, Dst::None],
-                        high: true,
                         srcs: [0.into(), Src::from(x[1]).bnot(), 0.into()],
                         carry: [carry.into(), SrcRef::False.into()],
                     });
diff --git a/src/nouveau/compiler/nak_ir.rs b/src/nouveau/compiler/nak_ir.rs
index c76c65b69e8..1a8a47d5e78 100644
--- a/src/nouveau/compiler/nak_ir.rs
+++ b/src/nouveau/compiler/nak_ir.rs
@@ -2405,6 +2405,7 @@ impl_display_for_op!(OpINeg);
 #[derive(SrcsAsSlice, DstsAsSlice)]
 pub struct OpIAdd3 {
     pub dst: Dst,
+    pub overflow: [Dst; 2],
 
     #[src_type(I32)]
     pub srcs: [Src; 3],
@@ -2427,9 +2428,7 @@ pub struct OpIAdd3X {
     pub dst: Dst,
     pub overflow: [Dst; 2],
 
-    pub high: bool,
-
-    #[src_type(ALU)]
+    #[src_type(B32)]
     pub srcs: [Src; 3],
 
     #[src_type(Pred)]
@@ -2438,17 +2437,15 @@ pub struct OpIAdd3X {
 
 impl DisplayOp for OpIAdd3X {
     fn fmt_op(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-        write!(f, "iadd3")?;
-        if self.high {
-            write!(f, ".hi")?;
-        } else {
-            write!(f, ".lo")?;
-        }
-        write!(f, " {} {} {}", self.srcs[0], self.srcs[1], self.srcs[2])?;
-        if self.high {
-            write!(f, " {} {}", self.carry[0], self.carry[1])?;
-        }
-        Ok(())
+        write!(
+            f,
+            "iadd3.x {} {} {} {} {}",
+            self.srcs[0],
+            self.srcs[1],
+            self.srcs[2],
+            self.carry[0],
+            self.carry[1]
+        )
     }
 }
 impl_display_for_op!(OpIAdd3X);
@@ -5306,6 +5303,7 @@ impl Shader {
             match instr.op {
                 Op::INeg(neg) => MappedInstrs::One(Instr::new_boxed(OpIAdd3 {
                     dst: neg.dst,
+                    overflow: [Dst::None; 2],
                     srcs: [Src::new_zero(), neg.src.ineg(), Src::new_zero()],
                 })),
                 _ => MappedInstrs::One(instr),
diff --git a/src/nouveau/compiler/nak_legalize.rs 
b/src/nouveau/compiler/nak_legalize.rs
index 92370d8a4fa..41afeecdcde 100644
--- a/src/nouveau/compiler/nak_legalize.rs
+++ b/src/nouveau/compiler/nak_legalize.rs
@@ -128,6 +128,7 @@ fn legalize_instr(
                 let val = b.alloc_ssa(RegFile::GPR, 1);
                 b.push_op(OpIAdd3 {
                     srcs: [Src::new_zero(), *src0, Src::new_zero()],
+                    overflow: [Dst::None; 2],
                     dst: val.into(),
                 });
                 *src0 = val.into();

Reply via email to