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>
This commit is contained in:

committed by
Marge Bot

parent
48917600fb
commit
b736cdcb83
@@ -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
|
||||
}
|
||||
|
@@ -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]);
|
||||
|
@@ -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()],
|
||||
});
|
||||
|
@@ -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),
|
||||
|
@@ -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();
|
||||
|
Reference in New Issue
Block a user