nak: Dst is no longer Copy
Reviewed-by: Faith Ekstrand <faith.ekstrand@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34794>
This commit is contained in:
@@ -354,7 +354,7 @@ pub trait SSABuilder: Builder {
|
||||
self.push_op(OpIAdd3 {
|
||||
dst: dst.into(),
|
||||
srcs: [x, y, z],
|
||||
overflow: [Dst::None; 2],
|
||||
overflow: [Dst::None, Dst::None],
|
||||
});
|
||||
} else {
|
||||
assert!(z.is_zero());
|
||||
@@ -488,7 +488,7 @@ pub trait SSABuilder: Builder {
|
||||
if self.sm() >= 70 {
|
||||
self.push_op(OpIAdd3 {
|
||||
dst: dst.into(),
|
||||
overflow: [Dst::None; 2],
|
||||
overflow: [Dst::None, Dst::None],
|
||||
srcs: [0.into(), i.ineg(), 0.into()],
|
||||
});
|
||||
} else {
|
||||
|
||||
@@ -1818,7 +1818,7 @@ impl<'a> ShaderFromNir<'a> {
|
||||
let dst = b.alloc_ssa_vec(RegFile::GPR, dst_comps);
|
||||
|
||||
// On Volta and later, the destination is split in two
|
||||
let mut dsts = [Dst::None; 2];
|
||||
let mut dsts = [Dst::None, Dst::None];
|
||||
if dst_comps > 2 && b.sm() >= 70 {
|
||||
dsts[0] = SSARef::try_from(&dst[0..2]).unwrap().into();
|
||||
dsts[1] = SSARef::try_from(&dst[2..]).unwrap().into();
|
||||
|
||||
@@ -660,7 +660,7 @@ impl fmt::Display for RegRef {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy)]
|
||||
#[derive(Clone)]
|
||||
pub enum Dst {
|
||||
None,
|
||||
SSA(SSARef),
|
||||
|
||||
@@ -281,7 +281,7 @@ pub trait LegalizeBuildHelpers: SSABuilder {
|
||||
if self.sm() >= 70 {
|
||||
self.push_op(OpIAdd3 {
|
||||
srcs: [Src::new_zero(), *src, Src::new_zero()],
|
||||
overflow: [Dst::None; 2],
|
||||
overflow: [Dst::None, Dst::None],
|
||||
dst: val.into(),
|
||||
});
|
||||
} else {
|
||||
|
||||
@@ -31,7 +31,7 @@ fn try_combine_outs(emit: &mut Instr, cut: &Instr) -> bool {
|
||||
return false;
|
||||
}
|
||||
|
||||
emit.dst = cut.dst;
|
||||
emit.dst = cut.dst.clone();
|
||||
emit.out_type = OutType::EmitThenCut;
|
||||
|
||||
true
|
||||
|
||||
@@ -242,10 +242,10 @@ impl SM20Encoder<'_> {
|
||||
self.set_bit(range.end - 1, not ^ src.src_mod.is_bnot());
|
||||
}
|
||||
|
||||
fn set_pred_dst(&mut self, range: Range<usize>, dst: Dst) {
|
||||
fn set_pred_dst(&mut self, range: Range<usize>, dst: &Dst) {
|
||||
let reg = match dst {
|
||||
Dst::None => true_reg(),
|
||||
Dst::Reg(reg) => reg,
|
||||
Dst::Reg(reg) => *reg,
|
||||
_ => panic!("Dst is not pred {dst}"),
|
||||
};
|
||||
self.set_pred_reg(range, reg);
|
||||
@@ -255,13 +255,13 @@ impl SM20Encoder<'_> {
|
||||
&mut self,
|
||||
range1: Range<usize>,
|
||||
range2: Range<usize>,
|
||||
dst: Dst,
|
||||
dst: &Dst,
|
||||
) {
|
||||
assert!(range1.len() == 2);
|
||||
assert!(range2.len() == 1);
|
||||
let reg = match dst {
|
||||
Dst::None => true_reg(),
|
||||
Dst::Reg(reg) => reg,
|
||||
Dst::Reg(reg) => *reg,
|
||||
_ => panic!("Dst is not pred {dst}"),
|
||||
};
|
||||
assert!(reg.file() == RegFile::Pred);
|
||||
@@ -304,10 +304,10 @@ impl SM20Encoder<'_> {
|
||||
self.set_reg_src_ref(range, &src.src_ref);
|
||||
}
|
||||
|
||||
fn set_dst(&mut self, range: Range<usize>, dst: Dst) {
|
||||
fn set_dst(&mut self, range: Range<usize>, dst: &Dst) {
|
||||
let reg = match dst {
|
||||
Dst::None => zero_reg(),
|
||||
Dst::Reg(reg) => reg,
|
||||
Dst::Reg(reg) => *reg,
|
||||
_ => panic!("Invalid dst {dst}"),
|
||||
};
|
||||
self.set_reg(range, reg);
|
||||
@@ -325,11 +325,11 @@ impl SM20Encoder<'_> {
|
||||
}
|
||||
}
|
||||
|
||||
fn set_carry_out(&mut self, bit: usize, dst: Dst) {
|
||||
fn set_carry_out(&mut self, bit: usize, dst: &Dst) {
|
||||
match dst {
|
||||
Dst::None => self.set_bit(bit, false),
|
||||
Dst::Reg(reg) => {
|
||||
assert!(reg == RegRef::new(RegFile::Carry, 0, 1));
|
||||
assert!(*reg == RegRef::new(RegFile::Carry, 0, 1));
|
||||
self.set_bit(bit, true);
|
||||
}
|
||||
_ => panic!("Invalid carry out: {dst}"),
|
||||
@@ -372,7 +372,7 @@ impl SM20Encoder<'_> {
|
||||
src2: Option<&Src>,
|
||||
) {
|
||||
self.set_opcode(unit, opcode);
|
||||
if let Some(&dst) = dst {
|
||||
if let Some(dst) = dst {
|
||||
self.set_dst(14..20, dst);
|
||||
}
|
||||
|
||||
@@ -442,7 +442,7 @@ impl SM20Encoder<'_> {
|
||||
imm_src1: u32,
|
||||
) {
|
||||
self.set_opcode(SM20Unit::Imm32, opcode);
|
||||
if let Some(&dst) = dst {
|
||||
if let Some(dst) = dst {
|
||||
self.set_dst(14..20, dst);
|
||||
}
|
||||
|
||||
@@ -459,8 +459,8 @@ impl SM20Encoder<'_> {
|
||||
&mut self,
|
||||
unit: SM20Unit,
|
||||
opcode: u8,
|
||||
dst: Dst,
|
||||
src: Src,
|
||||
dst: &Dst,
|
||||
src: &Src,
|
||||
) {
|
||||
self.set_opcode(unit, opcode);
|
||||
self.set_dst(14..20, dst);
|
||||
@@ -493,7 +493,7 @@ impl SM20Encoder<'_> {
|
||||
}
|
||||
}
|
||||
|
||||
fn encode_form_b_imm32(&mut self, opcode: u8, dst: Dst, imm_src: u32) {
|
||||
fn encode_form_b_imm32(&mut self, opcode: u8, dst: &Dst, imm_src: u32) {
|
||||
self.set_opcode(SM20Unit::Imm32, opcode);
|
||||
self.set_dst(14..20, dst);
|
||||
self.set_field(26..58, imm_src);
|
||||
@@ -740,7 +740,7 @@ impl SM20Op for OpRro {
|
||||
}
|
||||
|
||||
fn encode(&self, e: &mut SM20Encoder<'_>) {
|
||||
e.encode_form_b(SM20Unit::Float, 0x18, self.dst, self.src);
|
||||
e.encode_form_b(SM20Unit::Float, 0x18, &self.dst, &self.src);
|
||||
e.set_field(
|
||||
5..6,
|
||||
match self.op {
|
||||
@@ -762,7 +762,7 @@ impl SM20Op for OpMuFu {
|
||||
fn encode(&self, e: &mut SM20Encoder<'_>) {
|
||||
e.set_opcode(SM20Unit::Float, 0x32);
|
||||
|
||||
e.set_dst(14..20, self.dst);
|
||||
e.set_dst(14..20, &self.dst);
|
||||
e.set_reg_src_ref(20..26, &self.src.src_ref);
|
||||
|
||||
e.set_bit(5, false); // .sat
|
||||
@@ -840,8 +840,8 @@ impl SM20Op for OpFSetP {
|
||||
e.set_bit(7, self.srcs[0].src_mod.has_fabs());
|
||||
e.set_bit(8, self.srcs[1].src_mod.has_fneg());
|
||||
e.set_bit(9, self.srcs[0].src_mod.has_fneg());
|
||||
e.set_pred_dst(14..17, Dst::None);
|
||||
e.set_pred_dst(17..20, self.dst);
|
||||
e.set_pred_dst(14..17, &Dst::None);
|
||||
e.set_pred_dst(17..20, &self.dst);
|
||||
e.set_pred_src(49..53, self.accum);
|
||||
e.set_pred_set_op(53..55, self.set_op);
|
||||
e.set_float_cmp_op(55..59, self.cmp_op);
|
||||
@@ -859,7 +859,7 @@ impl SM20Op for OpFSwz {
|
||||
fn encode(&self, e: &mut SM20Encoder<'_>) {
|
||||
e.set_opcode(SM20Unit::Float, 0x12);
|
||||
|
||||
e.set_dst(14..20, self.dst);
|
||||
e.set_dst(14..20, &self.dst);
|
||||
e.set_reg_src(20..26, self.srcs[0]);
|
||||
e.set_reg_src(26..32, self.srcs[1]);
|
||||
|
||||
@@ -1033,8 +1033,8 @@ impl SM20Op for OpDSetP {
|
||||
e.set_bit(7, self.srcs[0].src_mod.has_fabs());
|
||||
e.set_bit(8, self.srcs[1].src_mod.has_fneg());
|
||||
e.set_bit(9, self.srcs[0].src_mod.has_fneg());
|
||||
e.set_pred_dst(14..17, Dst::None);
|
||||
e.set_pred_dst(17..20, self.dst);
|
||||
e.set_pred_dst(14..17, &Dst::None);
|
||||
e.set_pred_dst(17..20, &self.dst);
|
||||
e.set_pred_src(49..53, self.accum);
|
||||
e.set_pred_set_op(53..55, self.set_op);
|
||||
e.set_float_cmp_op(55..59, self.cmp_op);
|
||||
@@ -1072,7 +1072,7 @@ impl SM20Op for OpFlo {
|
||||
}
|
||||
|
||||
fn encode(&self, e: &mut SM20Encoder<'_>) {
|
||||
e.encode_form_b(SM20Unit::Int, 0x1e, self.dst, self.src);
|
||||
e.encode_form_b(SM20Unit::Int, 0x1e, &self.dst, &self.src);
|
||||
e.set_bit(5, self.signed);
|
||||
e.set_bit(6, self.return_shift_amount);
|
||||
e.set_bit(8, self.src.src_mod.is_bnot());
|
||||
@@ -1106,7 +1106,7 @@ impl SM20Op for OpIAdd2 {
|
||||
Some(&self.srcs[0]),
|
||||
imm32,
|
||||
);
|
||||
e.set_carry_out(58, self.carry_out);
|
||||
e.set_carry_out(58, &self.carry_out);
|
||||
} else {
|
||||
e.encode_form_a(
|
||||
SM20Unit::Int,
|
||||
@@ -1116,7 +1116,7 @@ impl SM20Op for OpIAdd2 {
|
||||
Some(&self.srcs[1]),
|
||||
None,
|
||||
);
|
||||
e.set_carry_out(48, self.carry_out);
|
||||
e.set_carry_out(48, &self.carry_out);
|
||||
}
|
||||
|
||||
e.set_bit(5, false); // saturate
|
||||
@@ -1145,7 +1145,7 @@ impl SM20Op for OpIAdd2X {
|
||||
Some(&self.srcs[0]),
|
||||
imm32,
|
||||
);
|
||||
e.set_carry_out(58, self.carry_out);
|
||||
e.set_carry_out(58, &self.carry_out);
|
||||
} else {
|
||||
e.encode_form_a(
|
||||
SM20Unit::Int,
|
||||
@@ -1155,7 +1155,7 @@ impl SM20Op for OpIAdd2X {
|
||||
Some(&self.srcs[1]),
|
||||
None,
|
||||
);
|
||||
e.set_carry_out(48, self.carry_out);
|
||||
e.set_carry_out(48, &self.carry_out);
|
||||
}
|
||||
|
||||
e.set_bit(5, false); // saturate
|
||||
@@ -1336,8 +1336,8 @@ impl SM20Op for OpISetP {
|
||||
|
||||
e.set_bit(5, self.cmp_type.is_signed());
|
||||
e.set_bit(6, self.ex);
|
||||
e.set_pred_dst(14..17, Dst::None);
|
||||
e.set_pred_dst(17..20, self.dst);
|
||||
e.set_pred_dst(14..17, &Dst::None);
|
||||
e.set_pred_dst(17..20, &self.dst);
|
||||
e.set_pred_src(49..53, self.accum);
|
||||
e.set_pred_set_op(53..55, self.set_op);
|
||||
e.set_int_cmp_op(55..58, self.cmp_op);
|
||||
@@ -1476,7 +1476,7 @@ impl SM20Op for OpF2F {
|
||||
}
|
||||
|
||||
fn encode(&self, e: &mut SM20Encoder<'_>) {
|
||||
e.encode_form_b(SM20Unit::Move, 0x4, self.dst, self.src);
|
||||
e.encode_form_b(SM20Unit::Move, 0x4, &self.dst, &self.src);
|
||||
e.set_bit(5, false); // .sat
|
||||
e.set_bit(6, self.src.src_mod.has_fabs());
|
||||
e.set_bit(7, self.integer_rnd);
|
||||
@@ -1496,7 +1496,7 @@ impl SM20Op for OpF2I {
|
||||
}
|
||||
|
||||
fn encode(&self, e: &mut SM20Encoder<'_>) {
|
||||
e.encode_form_b(SM20Unit::Move, 0x5, self.dst, self.src);
|
||||
e.encode_form_b(SM20Unit::Move, 0x5, &self.dst, &self.src);
|
||||
e.set_bit(6, self.src.src_mod.has_fabs());
|
||||
e.set_bit(7, self.dst_type.is_signed());
|
||||
e.set_bit(8, self.src.src_mod.has_fneg());
|
||||
@@ -1516,7 +1516,7 @@ impl SM20Op for OpI2F {
|
||||
|
||||
fn encode(&self, e: &mut SM20Encoder<'_>) {
|
||||
assert!(self.src.src_mod.is_none());
|
||||
e.encode_form_b(SM20Unit::Move, 0x6, self.dst, self.src);
|
||||
e.encode_form_b(SM20Unit::Move, 0x6, &self.dst, &self.src);
|
||||
e.set_bit(6, false); // .abs
|
||||
e.set_bit(8, false); // .neg
|
||||
e.set_bit(9, self.src_type.is_signed());
|
||||
@@ -1535,7 +1535,7 @@ impl SM20Op for OpI2I {
|
||||
|
||||
fn encode(&self, e: &mut SM20Encoder<'_>) {
|
||||
assert!(self.src.src_mod.is_none());
|
||||
e.encode_form_b(SM20Unit::Move, 0x7, self.dst, self.src);
|
||||
e.encode_form_b(SM20Unit::Move, 0x7, &self.dst, &self.src);
|
||||
e.set_bit(5, self.saturate);
|
||||
e.set_bit(6, self.abs);
|
||||
e.set_bit(7, self.dst_type.is_signed());
|
||||
@@ -1554,9 +1554,9 @@ impl SM20Op for OpMov {
|
||||
|
||||
fn encode(&self, e: &mut SM20Encoder<'_>) {
|
||||
if let Some(imm32) = self.src.as_imm_not_i20() {
|
||||
e.encode_form_b_imm32(0x6, self.dst, imm32);
|
||||
e.encode_form_b_imm32(0x6, &self.dst, imm32);
|
||||
} else {
|
||||
e.encode_form_b(SM20Unit::Move, 0xa, self.dst, self.src);
|
||||
e.encode_form_b(SM20Unit::Move, 0xa, &self.dst, &self.src);
|
||||
}
|
||||
e.set_field(5..9, self.quad_lanes);
|
||||
}
|
||||
@@ -1635,8 +1635,8 @@ impl SM20Op for OpShfl {
|
||||
|
||||
fn encode(&self, e: &mut SM20Encoder<'_>) {
|
||||
e.set_opcode(SM20Unit::Mem, 0x22);
|
||||
e.set_pred_dst2(8..10, 58..59, self.in_bounds);
|
||||
e.set_dst(14..20, self.dst);
|
||||
e.set_pred_dst2(8..10, 58..59, &self.in_bounds);
|
||||
e.set_dst(14..20, &self.dst);
|
||||
e.set_reg_src(20..26, self.src);
|
||||
|
||||
assert!(self.lane.src_mod.is_none());
|
||||
@@ -1677,8 +1677,8 @@ impl SM20Op for OpPSetP {
|
||||
fn encode(&self, e: &mut SM20Encoder<'_>) {
|
||||
e.set_opcode(SM20Unit::Move, 0x3);
|
||||
|
||||
e.set_pred_dst(14..17, self.dsts[1]);
|
||||
e.set_pred_dst(17..20, self.dsts[0]);
|
||||
e.set_pred_dst(14..17, &self.dsts[1]);
|
||||
e.set_pred_dst(17..20, &self.dsts[0]);
|
||||
e.set_pred_src(20..24, self.srcs[0]);
|
||||
e.set_pred_src(26..30, self.srcs[1]);
|
||||
e.set_pred_set_op(30..32, self.ops[0]);
|
||||
@@ -1763,7 +1763,7 @@ impl SM20Op for OpTex {
|
||||
|
||||
e.set_field(7..9, 0x2_u8); // TODO: .p
|
||||
e.set_bit(9, self.nodep);
|
||||
e.set_dst(14..20, self.dsts[0]);
|
||||
e.set_dst(14..20, &self.dsts[0]);
|
||||
assert!(self.dsts[1].is_none());
|
||||
assert!(self.fault.is_none());
|
||||
e.set_reg_src(20..26, self.srcs[0]);
|
||||
@@ -1801,7 +1801,7 @@ impl SM20Op for OpTld {
|
||||
|
||||
e.set_field(7..9, 0x2_u8); // TODO: .p
|
||||
e.set_bit(9, self.nodep);
|
||||
e.set_dst(14..20, self.dsts[0]);
|
||||
e.set_dst(14..20, &self.dsts[0]);
|
||||
assert!(self.dsts[1].is_none());
|
||||
assert!(self.fault.is_none());
|
||||
e.set_reg_src(20..26, self.srcs[0]);
|
||||
@@ -1848,7 +1848,7 @@ impl SM20Op for OpTld4 {
|
||||
e.set_field(5..7, self.comp);
|
||||
e.set_field(7..9, 0x2_u8); // TODO: .p
|
||||
e.set_bit(9, self.nodep);
|
||||
e.set_dst(14..20, self.dsts[0]);
|
||||
e.set_dst(14..20, &self.dsts[0]);
|
||||
assert!(self.dsts[1].is_none());
|
||||
assert!(self.fault.is_none());
|
||||
e.set_reg_src(20..26, self.srcs[0]);
|
||||
@@ -1893,7 +1893,7 @@ impl SM20Op for OpTmml {
|
||||
|
||||
e.set_field(7..9, 0x2_u8); // TODO: .p
|
||||
e.set_bit(9, self.nodep);
|
||||
e.set_dst(14..20, self.dsts[0]);
|
||||
e.set_dst(14..20, &self.dsts[0]);
|
||||
assert!(self.dsts[1].is_none());
|
||||
e.set_reg_src(20..26, self.srcs[0]);
|
||||
e.set_reg_src(26..32, self.srcs[1]);
|
||||
@@ -1927,7 +1927,7 @@ impl SM20Op for OpTxd {
|
||||
|
||||
e.set_field(7..9, 0x2_u8); // TODO: .p
|
||||
e.set_bit(9, self.nodep);
|
||||
e.set_dst(14..20, self.dsts[0]);
|
||||
e.set_dst(14..20, &self.dsts[0]);
|
||||
assert!(self.dsts[1].is_none());
|
||||
e.set_reg_src(20..26, self.srcs[0]);
|
||||
e.set_reg_src(26..32, self.srcs[1]);
|
||||
@@ -1962,7 +1962,7 @@ impl SM20Op for OpTxq {
|
||||
|
||||
e.set_field(7..9, 0x2_u8); // TODO: .p
|
||||
e.set_bit(9, self.nodep);
|
||||
e.set_dst(14..20, self.dsts[0]);
|
||||
e.set_dst(14..20, &self.dsts[0]);
|
||||
assert!(self.dsts[1].is_none());
|
||||
e.set_reg_src(20..26, self.src);
|
||||
e.set_reg_src(26..32, 0.into());
|
||||
@@ -2060,7 +2060,7 @@ impl SM20Op for OpLd {
|
||||
}
|
||||
e.set_mem_type(5..8, self.access.mem_type);
|
||||
// 8..9: cache hints (.ca, .cg, .lu, .cv)
|
||||
e.set_dst(14..20, self.dst);
|
||||
e.set_dst(14..20, &self.dst);
|
||||
e.set_reg_src(20..26, self.addr);
|
||||
}
|
||||
}
|
||||
@@ -2092,7 +2092,7 @@ impl SM20Op for OpLdc {
|
||||
LdcMode::IndexedSegmentedLinear => 3_u8,
|
||||
},
|
||||
);
|
||||
e.set_dst(14..20, self.dst);
|
||||
e.set_dst(14..20, &self.dst);
|
||||
e.set_reg_src(20..26, self.offset);
|
||||
e.set_field(26..42, cb.offset);
|
||||
e.set_field(42..47, cb_idx);
|
||||
@@ -2220,7 +2220,7 @@ impl SM20Op for OpAtom {
|
||||
if self.dst.is_none() {
|
||||
e.set_field(26..58, self.addr_offset);
|
||||
} else {
|
||||
e.set_dst(43..49, self.dst);
|
||||
e.set_dst(43..49, &self.dst);
|
||||
e.set_field(26..43, self.addr_offset & 0x1ffff);
|
||||
e.set_field(55..58, self.addr_offset >> 17);
|
||||
}
|
||||
@@ -2260,7 +2260,7 @@ impl SM20Op for OpALd {
|
||||
e.set_bit(8, self.patch);
|
||||
e.set_bit(9, self.output);
|
||||
|
||||
e.set_dst(14..20, self.dst);
|
||||
e.set_dst(14..20, &self.dst);
|
||||
e.set_reg_src(20..26, self.offset);
|
||||
e.set_reg_src(26..32, self.vtx);
|
||||
e.set_field(32..42, self.addr);
|
||||
@@ -2312,7 +2312,7 @@ impl SM20Op for OpIpa {
|
||||
InterpLoc::Offset => 2_u8,
|
||||
},
|
||||
);
|
||||
e.set_dst(14..20, self.dst);
|
||||
e.set_dst(14..20, &self.dst);
|
||||
e.set_reg_src(20..26, 0.into()); // indirect
|
||||
e.set_reg_src(26..32, self.inv_w);
|
||||
e.set_reg_src(49..55, self.offset);
|
||||
@@ -2352,7 +2352,7 @@ impl SM20Op for OpCCtl {
|
||||
}
|
||||
},
|
||||
);
|
||||
e.set_dst(14..20, Dst::None);
|
||||
e.set_dst(14..20, &Dst::None);
|
||||
e.set_reg_src(20..26, self.addr);
|
||||
e.set_field(26..28, 0); // 1: .u, 2: .c: 3: .i
|
||||
|
||||
@@ -2506,7 +2506,7 @@ impl SM20Op for OpBar {
|
||||
e.set_bit(46, false); // src1_is_imm
|
||||
e.set_bit(47, false); // src0_is_imm
|
||||
e.set_pred_src(49..53, true.into());
|
||||
e.set_pred_dst(53..56, Dst::None);
|
||||
e.set_pred_dst(53..56, &Dst::None);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2529,7 +2529,7 @@ impl SM20Op for OpIsberd {
|
||||
|
||||
fn encode(&self, e: &mut SM20Encoder<'_>) {
|
||||
e.set_opcode(SM20Unit::Tex, 0x0);
|
||||
e.set_dst(14..20, self.dst);
|
||||
e.set_dst(14..20, &self.dst);
|
||||
e.set_reg_src(20..26, self.idx);
|
||||
e.set_field(26..42, 0_u16); // offset
|
||||
}
|
||||
@@ -2575,10 +2575,10 @@ impl SM20Op for OpPixLd {
|
||||
other => panic!("Unsupported PixVal: {other}"),
|
||||
},
|
||||
);
|
||||
e.set_dst(14..20, self.dst);
|
||||
e.set_dst(14..20, &self.dst);
|
||||
e.set_reg_src(20..26, 0.into());
|
||||
e.set_field(26..34, 0_u16); // offset
|
||||
e.set_pred_dst(53..56, Dst::None);
|
||||
e.set_pred_dst(53..56, &Dst::None);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2589,7 +2589,7 @@ impl SM20Op for OpS2R {
|
||||
|
||||
fn encode(&self, e: &mut SM20Encoder<'_>) {
|
||||
e.set_opcode(SM20Unit::Move, 0xb);
|
||||
e.set_dst(14..20, self.dst);
|
||||
e.set_dst(14..20, &self.dst);
|
||||
e.set_field(26..36, self.idx);
|
||||
}
|
||||
}
|
||||
@@ -2609,9 +2609,9 @@ impl SM20Op for OpVote {
|
||||
VoteOp::Eq => 2_u8,
|
||||
},
|
||||
);
|
||||
e.set_dst(14..20, self.ballot);
|
||||
e.set_dst(14..20, &self.ballot);
|
||||
e.set_pred_src(20..24, self.pred);
|
||||
e.set_pred_dst(54..57, self.vote);
|
||||
e.set_pred_dst(54..57, &self.vote);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -302,12 +302,12 @@ impl SM50Encoder<'_> {
|
||||
self.set_bit(not_bit, src.src_mod.is_bnot());
|
||||
}
|
||||
|
||||
fn set_pred_dst(&mut self, range: Range<usize>, dst: Dst) {
|
||||
fn set_pred_dst(&mut self, range: Range<usize>, dst: &Dst) {
|
||||
match dst {
|
||||
Dst::None => {
|
||||
self.set_pred_reg(range, true_reg());
|
||||
}
|
||||
Dst::Reg(reg) => self.set_pred_reg(range, reg),
|
||||
Dst::Reg(reg) => self.set_pred_reg(range, *reg),
|
||||
_ => panic!("Not a register"),
|
||||
}
|
||||
}
|
||||
@@ -323,10 +323,10 @@ impl SM50Encoder<'_> {
|
||||
self.set_bit(not_bit, not ^ src.src_mod.is_bnot());
|
||||
}
|
||||
|
||||
fn set_dst(&mut self, dst: Dst) {
|
||||
fn set_dst(&mut self, dst: &Dst) {
|
||||
let reg = match dst {
|
||||
Dst::None => zero_reg(),
|
||||
Dst::Reg(reg) => reg,
|
||||
Dst::Reg(reg) => *reg,
|
||||
_ => panic!("invalid dst {dst}"),
|
||||
};
|
||||
self.set_reg(0..8, reg);
|
||||
@@ -501,7 +501,7 @@ impl SM50Op for OpFAdd {
|
||||
fn encode(&self, e: &mut SM50Encoder<'_>) {
|
||||
if let Some(imm32) = self.srcs[1].as_imm_not_f20() {
|
||||
e.set_opcode(0x0800);
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_fmod_src(8..16, 54, 56, self.srcs[0]);
|
||||
e.set_src_imm32(20..52, imm32);
|
||||
assert!(self.rnd_mode == FRndMode::NearestEven);
|
||||
@@ -524,7 +524,7 @@ impl SM50Op for OpFAdd {
|
||||
src => panic!("Invalid fadd src1: {src}"),
|
||||
}
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_fmod_src(8..16, 46, 48, self.srcs[0]);
|
||||
|
||||
e.set_rnd_mode(39..41, self.rnd_mode);
|
||||
@@ -594,7 +594,7 @@ impl SM50Op for OpFFma {
|
||||
src => panic!("Invalid ffma src2: {src}"),
|
||||
}
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_src_ref(8..16, self.srcs[0].src_ref);
|
||||
|
||||
e.set_bit(48, fneg_fmul);
|
||||
@@ -635,7 +635,7 @@ impl SM50Op for OpFMnMx {
|
||||
}
|
||||
|
||||
e.set_reg_fmod_src(8..16, 46, 48, self.srcs[0]);
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_pred_src(39..42, 42, self.min);
|
||||
e.set_bit(44, self.ftz);
|
||||
}
|
||||
@@ -706,7 +706,7 @@ impl SM50Op for OpFMul {
|
||||
}
|
||||
|
||||
e.set_reg_src_ref(8..16, self.srcs[0].src_ref);
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -734,7 +734,7 @@ impl SM50Op for OpRro {
|
||||
src => panic!("Invalid rro src: {src}"),
|
||||
}
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_field(
|
||||
39..40,
|
||||
match self.op {
|
||||
@@ -753,7 +753,7 @@ impl SM50Op for OpMuFu {
|
||||
fn encode(&self, e: &mut SM50Encoder<'_>) {
|
||||
e.set_opcode(0x5080);
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_fmod_src(8..16, 46, 48, self.src);
|
||||
|
||||
e.set_field(
|
||||
@@ -864,7 +864,7 @@ impl SM50Op for OpFSet {
|
||||
e.set_float_cmp_op(48..52, self.cmp_op);
|
||||
e.set_bit(52, true); // bool float
|
||||
e.set_bit(55, self.ftz);
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -897,8 +897,8 @@ impl SM50Op for OpFSetP {
|
||||
src => panic!("Invalid fsetp src1: {src}"),
|
||||
}
|
||||
|
||||
e.set_pred_dst(3..6, self.dst);
|
||||
e.set_pred_dst(0..3, Dst::None); // dst1
|
||||
e.set_pred_dst(3..6, &self.dst);
|
||||
e.set_pred_dst(0..3, &Dst::None); // dst1
|
||||
e.set_reg_fmod_src(8..16, 7, 43, self.srcs[0]);
|
||||
e.set_pred_src(39..42, 42, self.accum);
|
||||
e.set_pred_set_op(45..47, self.set_op);
|
||||
@@ -917,7 +917,7 @@ impl SM50Op for OpFSwzAdd {
|
||||
fn encode(&self, e: &mut SM50Encoder<'_>) {
|
||||
e.set_opcode(0x50f8);
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_src(8..16, self.srcs[0]);
|
||||
e.set_reg_src(20..28, self.srcs[1]);
|
||||
|
||||
@@ -976,7 +976,7 @@ impl SM50Op for OpDAdd {
|
||||
src => panic!("Invalid dadd src1: {src}"),
|
||||
}
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_fmod_src(8..16, 46, 48, self.srcs[0]);
|
||||
e.set_rnd_mode(39..41, self.rnd_mode);
|
||||
}
|
||||
@@ -1038,7 +1038,7 @@ impl SM50Op for OpDFma {
|
||||
src => panic!("Invalid dfma src2: {src}"),
|
||||
}
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_src_ref(8..16, self.srcs[0].src_ref);
|
||||
|
||||
e.set_bit(48, fneg_fmul);
|
||||
@@ -1076,7 +1076,7 @@ impl SM50Op for OpDMnMx {
|
||||
}
|
||||
|
||||
e.set_reg_fmod_src(8..16, 46, 48, self.srcs[0]);
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_pred_src(39..42, 42, self.min);
|
||||
}
|
||||
}
|
||||
@@ -1116,7 +1116,7 @@ impl SM50Op for OpDMul {
|
||||
src => panic!("Invalid dmul src1: {src}"),
|
||||
}
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_src_ref(8..16, self.srcs[0].src_ref);
|
||||
|
||||
e.set_rnd_mode(39..41, self.rnd_mode);
|
||||
@@ -1153,8 +1153,8 @@ impl SM50Op for OpDSetP {
|
||||
src => panic!("Invalid dsetp src1: {src}"),
|
||||
}
|
||||
|
||||
e.set_pred_dst(3..6, self.dst);
|
||||
e.set_pred_dst(0..3, Dst::None); // dst1
|
||||
e.set_pred_dst(3..6, &self.dst);
|
||||
e.set_pred_dst(0..3, &Dst::None); // dst1
|
||||
e.set_pred_src(39..42, 42, self.accum);
|
||||
e.set_pred_set_op(45..47, self.set_op);
|
||||
e.set_float_cmp_op(48..52, self.cmp_op);
|
||||
@@ -1195,7 +1195,7 @@ impl SM50Op for OpBfe {
|
||||
}
|
||||
|
||||
e.set_reg_src(8..16, self.base);
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1223,7 +1223,7 @@ impl SM50Op for OpFlo {
|
||||
src => panic!("Invalid flo src: {src}"),
|
||||
}
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_bit(40, self.src.src_mod.is_bnot());
|
||||
e.set_bit(48, self.signed);
|
||||
e.set_bit(41, self.return_shift_amount);
|
||||
@@ -1253,7 +1253,7 @@ impl SM50Op for OpIAdd2 {
|
||||
self.srcs[0].src_mod.is_none() || self.srcs[1].src_mod.is_none()
|
||||
);
|
||||
|
||||
let carry_out = match self.carry_out {
|
||||
let carry_out = match &self.carry_out {
|
||||
Dst::Reg(reg) if reg.file() == RegFile::Carry => true,
|
||||
Dst::None => false,
|
||||
dst => panic!("Invalid iadd carry_out: {dst}"),
|
||||
@@ -1262,7 +1262,7 @@ impl SM50Op for OpIAdd2 {
|
||||
if let Some(imm32) = self.srcs[1].as_imm_not_i20() {
|
||||
e.set_opcode(0x1c00);
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_ineg_src(8..16, 56, self.srcs[0]);
|
||||
e.set_src_imm32(20..52, imm32);
|
||||
|
||||
@@ -1286,7 +1286,7 @@ impl SM50Op for OpIAdd2 {
|
||||
src => panic!("Invalid iadd src1: {src}"),
|
||||
}
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_ineg_src(8..16, 49, self.srcs[0]);
|
||||
|
||||
e.set_bit(43, false); // .X
|
||||
@@ -1309,7 +1309,7 @@ impl SM50Op for OpIAdd2X {
|
||||
src => panic!("Invalid iadd.x carry_in: {src}"),
|
||||
}
|
||||
|
||||
let carry_out = match self.carry_out {
|
||||
let carry_out = match &self.carry_out {
|
||||
Dst::Reg(reg) if reg.file() == RegFile::Carry => true,
|
||||
Dst::None => false,
|
||||
dst => panic!("Invalid iadd.x carry_out: {dst}"),
|
||||
@@ -1318,7 +1318,7 @@ impl SM50Op for OpIAdd2X {
|
||||
if let Some(imm32) = self.srcs[1].as_imm_not_i20() {
|
||||
e.set_opcode(0x1c00);
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_bnot_src(8..16, 56, self.srcs[0]);
|
||||
e.set_src_imm32(20..52, imm32);
|
||||
|
||||
@@ -1342,7 +1342,7 @@ impl SM50Op for OpIAdd2X {
|
||||
src => panic!("Invalid iadd.x src1: {src}"),
|
||||
}
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_bnot_src(8..16, 49, self.srcs[0]);
|
||||
|
||||
e.set_bit(43, true); // .X
|
||||
@@ -1399,7 +1399,7 @@ impl SM50Op for OpIMad {
|
||||
src => panic!("Invalid imad src2: {src}"),
|
||||
}
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_src(8..16, self.srcs[0]);
|
||||
|
||||
e.set_bit(48, self.signed); // src0 signed
|
||||
@@ -1452,7 +1452,7 @@ impl SM50Op for OpIMul {
|
||||
e.set_bit(41, self.signed[1]);
|
||||
}
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_src(8..16, self.srcs[0]);
|
||||
}
|
||||
}
|
||||
@@ -1484,7 +1484,7 @@ impl SM50Op for OpIMnMx {
|
||||
src => panic!("Invalid imnmx src1: {src}"),
|
||||
}
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_src(8..16, self.srcs[0]);
|
||||
e.set_pred_src(39..42, 42, self.min);
|
||||
e.set_bit(47, false); // .CC
|
||||
@@ -1527,8 +1527,8 @@ impl SM50Op for OpISetP {
|
||||
src => panic!("Invalid isetp src1: {src}"),
|
||||
}
|
||||
|
||||
e.set_pred_dst(0..3, Dst::None); // dst1
|
||||
e.set_pred_dst(3..6, self.dst);
|
||||
e.set_pred_dst(0..3, &Dst::None); // dst1
|
||||
e.set_pred_dst(3..6, &self.dst);
|
||||
e.set_reg_src(8..16, self.srcs[0]);
|
||||
e.set_pred_src(39..42, 42, self.accum);
|
||||
|
||||
@@ -1569,7 +1569,7 @@ impl SM50Op for OpLop2 {
|
||||
if let Some(imm32) = self.srcs[1].as_imm_not_i20() {
|
||||
e.set_opcode(0x0400);
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_bnot_src(8..16, 55, self.srcs[0]);
|
||||
e.set_src_imm32(20..52, imm32);
|
||||
e.set_field(
|
||||
@@ -1602,7 +1602,7 @@ impl SM50Op for OpLop2 {
|
||||
src => panic!("Invalid lop2 src1: {src}"),
|
||||
}
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_bnot_src(8..16, 39, self.srcs[0]);
|
||||
|
||||
e.set_field(
|
||||
@@ -1615,7 +1615,7 @@ impl SM50Op for OpLop2 {
|
||||
},
|
||||
);
|
||||
|
||||
e.set_pred_dst(48..51, Dst::None);
|
||||
e.set_pred_dst(48..51, &Dst::None);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1644,7 +1644,7 @@ impl SM50Op for OpPopC {
|
||||
src => panic!("Invalid popc src1: {src}"),
|
||||
}
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1682,7 +1682,7 @@ impl SM50Op for OpShf {
|
||||
},
|
||||
);
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_src(8..16, self.low);
|
||||
e.set_reg_src(39..47, self.high);
|
||||
|
||||
@@ -1707,7 +1707,7 @@ impl SM50Op for OpShl {
|
||||
}
|
||||
|
||||
fn encode(&self, e: &mut SM50Encoder<'_>) {
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_src(8..16, self.src);
|
||||
match &self.shift.src_ref {
|
||||
SrcRef::Zero | SrcRef::Reg(_) => {
|
||||
@@ -1737,7 +1737,7 @@ impl SM50Op for OpShr {
|
||||
}
|
||||
|
||||
fn encode(&self, e: &mut SM50Encoder<'_>) {
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_src(8..16, self.src);
|
||||
match &self.shift.src_ref {
|
||||
SrcRef::Zero | SrcRef::Reg(_) => {
|
||||
@@ -1798,7 +1798,7 @@ impl SM50Op for OpF2F {
|
||||
e.set_bit(44, self.ftz);
|
||||
e.set_bit(50, false); // saturate
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1826,7 +1826,7 @@ impl SM50Op for OpF2I {
|
||||
src => panic!("Invalid f2i src: {src}"),
|
||||
}
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
|
||||
// We can't span 32 bits
|
||||
assert!(
|
||||
@@ -1867,7 +1867,7 @@ impl SM50Op for OpI2F {
|
||||
src => panic!("Invalid i2f src: {src}"),
|
||||
}
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
|
||||
// We can't span 32 bits
|
||||
assert!(
|
||||
@@ -1907,7 +1907,7 @@ impl SM50Op for OpI2I {
|
||||
src => panic!("Invalid i2i src: {src}"),
|
||||
}
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
|
||||
// We can't span 32 bits
|
||||
assert!(
|
||||
@@ -1952,7 +1952,7 @@ impl SM50Op for OpMov {
|
||||
src => panic!("Invalid mov src: {src}"),
|
||||
}
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1981,7 +1981,7 @@ impl SM50Op for OpPrmt {
|
||||
src => panic!("Invalid prmt selector: {src}"),
|
||||
}
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_src(8..16, self.srcs[0]);
|
||||
e.set_reg_src(39..47, self.srcs[1]);
|
||||
e.set_field(
|
||||
@@ -2027,7 +2027,7 @@ impl SM50Op for OpSel {
|
||||
src => panic!("Invalid sel src1: {src}"),
|
||||
}
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_src(8..16, self.srcs[0]);
|
||||
e.set_pred_src(39..42, 42, self.cond);
|
||||
}
|
||||
@@ -2044,8 +2044,8 @@ impl SM50Op for OpShfl {
|
||||
fn encode(&self, e: &mut SM50Encoder<'_>) {
|
||||
e.set_opcode(0xef10);
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_pred_dst(48..51, self.in_bounds);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_pred_dst(48..51, &self.in_bounds);
|
||||
e.set_reg_src(8..16, self.src);
|
||||
|
||||
match &self.lane.src_ref {
|
||||
@@ -2091,8 +2091,8 @@ impl SM50Op for OpPSetP {
|
||||
fn encode(&self, e: &mut SM50Encoder<'_>) {
|
||||
e.set_opcode(0x5090);
|
||||
|
||||
e.set_pred_dst(3..6, self.dsts[0]);
|
||||
e.set_pred_dst(0..3, self.dsts[1]);
|
||||
e.set_pred_dst(3..6, &self.dsts[0]);
|
||||
e.set_pred_dst(0..3, &self.dsts[1]);
|
||||
|
||||
e.set_pred_src(12..15, 15, self.srcs[0]);
|
||||
e.set_pred_src(29..32, 32, self.srcs[1]);
|
||||
@@ -2177,7 +2177,7 @@ impl SM50Op for OpTex {
|
||||
}
|
||||
}
|
||||
|
||||
e.set_dst(self.dsts[0]);
|
||||
e.set_dst(&self.dsts[0]);
|
||||
assert!(self.dsts[1].is_none());
|
||||
assert!(self.fault.is_none());
|
||||
e.set_reg_src(8..16, self.srcs[0]);
|
||||
@@ -2210,7 +2210,7 @@ impl SM50Op for OpTld {
|
||||
}
|
||||
}
|
||||
|
||||
e.set_dst(self.dsts[0]);
|
||||
e.set_dst(&self.dsts[0]);
|
||||
assert!(self.dsts[1].is_none());
|
||||
assert!(self.fault.is_none());
|
||||
e.set_reg_src(8..16, self.srcs[0]);
|
||||
@@ -2258,7 +2258,7 @@ impl SM50Op for OpTld4 {
|
||||
}
|
||||
}
|
||||
|
||||
e.set_dst(self.dsts[0]);
|
||||
e.set_dst(&self.dsts[0]);
|
||||
assert!(self.dsts[1].is_none());
|
||||
assert!(self.fault.is_none());
|
||||
e.set_reg_src(8..16, self.srcs[0]);
|
||||
@@ -2291,7 +2291,7 @@ impl SM50Op for OpTmml {
|
||||
}
|
||||
}
|
||||
|
||||
e.set_dst(self.dsts[0]);
|
||||
e.set_dst(&self.dsts[0]);
|
||||
assert!(self.dsts[1].is_none());
|
||||
e.set_reg_src(8..16, self.srcs[0]);
|
||||
e.set_reg_src(20..28, self.srcs[1]);
|
||||
@@ -2322,7 +2322,7 @@ impl SM50Op for OpTxd {
|
||||
}
|
||||
}
|
||||
|
||||
e.set_dst(self.dsts[0]);
|
||||
e.set_dst(&self.dsts[0]);
|
||||
assert!(self.dsts[1].is_none());
|
||||
assert!(self.fault.is_none());
|
||||
e.set_reg_src(8..16, self.srcs[0]);
|
||||
@@ -2354,7 +2354,7 @@ impl SM50Op for OpTxq {
|
||||
}
|
||||
}
|
||||
|
||||
e.set_dst(self.dsts[0]);
|
||||
e.set_dst(&self.dsts[0]);
|
||||
assert!(self.dsts[1].is_none());
|
||||
e.set_reg_src(8..16, self.src);
|
||||
|
||||
@@ -2475,7 +2475,7 @@ impl SM50Op for OpSuLd {
|
||||
},
|
||||
);
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
|
||||
e.set_reg_src(8..16, self.coord);
|
||||
e.set_reg_src(39..47, self.handle);
|
||||
@@ -2564,7 +2564,7 @@ impl SM50Op for OpSuAtom {
|
||||
// image.
|
||||
e.set_bit(52, true); // .D
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
|
||||
e.set_reg_src(20..28, self.data);
|
||||
e.set_reg_src(8..16, self.coord);
|
||||
@@ -2584,7 +2584,7 @@ impl SM50Op for OpLd {
|
||||
MemSpace::Shared => 0xef48,
|
||||
});
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_src(8..16, self.addr);
|
||||
e.set_field(20..44, self.offset);
|
||||
|
||||
@@ -2609,7 +2609,7 @@ impl SM50Op for OpLdc {
|
||||
|
||||
e.set_opcode(0xef90);
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_src(8..16, self.offset);
|
||||
e.set_field(20..36, cb.offset);
|
||||
e.set_field(36..41, cb_idx);
|
||||
@@ -2707,7 +2707,7 @@ impl SM50Op for OpAtom {
|
||||
} else if let AtomOp::CmpExch(cmp_src) = self.atom_op {
|
||||
e.set_opcode(0xee00);
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
|
||||
// TODO: These are all supported by the disassembler but
|
||||
// only the packed layout appears to be supported by real
|
||||
@@ -2736,7 +2736,7 @@ impl SM50Op for OpAtom {
|
||||
} else {
|
||||
e.set_opcode(0xed00);
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_src(20..28, self.data);
|
||||
|
||||
let data_type = match self.atom_type {
|
||||
@@ -2800,7 +2800,7 @@ impl SM50Op for OpAtom {
|
||||
e.set_atom_op(52..56, self.atom_op);
|
||||
}
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_src(8..16, self.addr);
|
||||
assert_eq!(self.addr_offset % 4, 0);
|
||||
e.set_field(30..52, self.addr_offset / 4);
|
||||
@@ -2817,14 +2817,14 @@ impl SM50Op for OpAL2P {
|
||||
fn encode(&self, e: &mut SM50Encoder<'_>) {
|
||||
e.set_opcode(0xefa0);
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_src(8..16, self.offset);
|
||||
|
||||
e.set_field(20..31, self.addr);
|
||||
e.set_bit(32, self.output);
|
||||
|
||||
e.set_field(47..49, 0_u8); // comps
|
||||
e.set_pred_dst(44..47, Dst::None);
|
||||
e.set_pred_dst(44..47, &Dst::None);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2836,7 +2836,7 @@ impl SM50Op for OpALd {
|
||||
fn encode(&self, e: &mut SM50Encoder<'_>) {
|
||||
e.set_opcode(0xefd8);
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
if self.phys {
|
||||
assert!(!self.patch);
|
||||
assert!(self.offset.src_ref.as_reg().is_some());
|
||||
@@ -2881,7 +2881,7 @@ impl SM50Op for OpIpa {
|
||||
fn encode(&self, e: &mut SM50Encoder<'_>) {
|
||||
e.set_opcode(0xe000);
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_src(8..16, 0.into()); // addr
|
||||
e.set_reg_src(20..28, self.inv_w);
|
||||
e.set_reg_src(39..47, self.offset);
|
||||
@@ -2889,7 +2889,7 @@ impl SM50Op for OpIpa {
|
||||
assert!(self.addr % 4 == 0);
|
||||
e.set_field(28..38, self.addr);
|
||||
e.set_bit(38, false); // .IDX
|
||||
e.set_pred_dst(47..50, Dst::None); // TODO: What is this for?
|
||||
e.set_pred_dst(47..50, &Dst::None); // TODO: What is this for?
|
||||
e.set_bit(51, false); // .SAT
|
||||
e.set_field(
|
||||
52..54,
|
||||
@@ -3119,7 +3119,7 @@ impl SM50Op for OpCS2R {
|
||||
|
||||
fn encode(&self, e: &mut SM50Encoder<'_>) {
|
||||
e.set_opcode(0x50c8);
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_field(20..28, self.idx);
|
||||
}
|
||||
}
|
||||
@@ -3131,7 +3131,7 @@ impl SM50Op for OpIsberd {
|
||||
|
||||
fn encode(&self, e: &mut SM50Encoder<'_>) {
|
||||
e.set_opcode(0xefd0);
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_src(8..16, self.idx);
|
||||
}
|
||||
}
|
||||
@@ -3167,7 +3167,7 @@ impl SM50Op for OpPixLd {
|
||||
|
||||
fn encode(&self, e: &mut SM50Encoder<'_>) {
|
||||
e.set_opcode(0xefe8);
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_src(8..16, 0.into());
|
||||
e.set_field(
|
||||
31..34,
|
||||
@@ -3180,7 +3180,7 @@ impl SM50Op for OpPixLd {
|
||||
other => panic!("Unsupported PixVal: {other}"),
|
||||
},
|
||||
);
|
||||
e.set_pred_dst(45..48, Dst::None);
|
||||
e.set_pred_dst(45..48, &Dst::None);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3191,7 +3191,7 @@ impl SM50Op for OpS2R {
|
||||
|
||||
fn encode(&self, e: &mut SM50Encoder<'_>) {
|
||||
e.set_opcode(0xf0c8);
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_field(20..28, self.idx);
|
||||
}
|
||||
}
|
||||
@@ -3204,8 +3204,8 @@ impl SM50Op for OpVote {
|
||||
fn encode(&self, e: &mut SM50Encoder<'_>) {
|
||||
e.set_opcode(0x50d8);
|
||||
|
||||
e.set_dst(self.ballot);
|
||||
e.set_pred_dst(45..48, self.vote);
|
||||
e.set_dst(&self.ballot);
|
||||
e.set_pred_dst(45..48, &self.vote);
|
||||
e.set_pred_src(39..42, 42, self.pred);
|
||||
|
||||
e.set_field(
|
||||
@@ -3253,7 +3253,7 @@ impl SM50Op for OpOut {
|
||||
);
|
||||
|
||||
e.set_reg_src(8..16, self.handle);
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -94,10 +94,10 @@ impl SM70Encoder<'_> {
|
||||
}
|
||||
}
|
||||
|
||||
fn set_pred_dst(&mut self, range: Range<usize>, dst: Dst) {
|
||||
fn set_pred_dst(&mut self, range: Range<usize>, dst: &Dst) {
|
||||
match dst {
|
||||
Dst::None => self.set_pred_reg(range, self.true_reg(RegFile::Pred)),
|
||||
Dst::Reg(reg) => self.set_pred_reg(range, reg),
|
||||
Dst::Reg(reg) => self.set_pred_reg(range, *reg),
|
||||
_ => panic!("Not a register"),
|
||||
}
|
||||
}
|
||||
@@ -161,18 +161,18 @@ impl SM70Encoder<'_> {
|
||||
self.set_bit(15, pred.pred_inv);
|
||||
}
|
||||
|
||||
fn set_dst(&mut self, dst: Dst) {
|
||||
fn set_dst(&mut self, dst: &Dst) {
|
||||
match dst {
|
||||
Dst::None => self.set_reg(16..24, self.zero_reg(RegFile::GPR)),
|
||||
Dst::Reg(reg) => self.set_reg(16..24, reg),
|
||||
Dst::Reg(reg) => self.set_reg(16..24, *reg),
|
||||
_ => panic!("Not a register"),
|
||||
}
|
||||
}
|
||||
|
||||
fn set_udst(&mut self, dst: Dst) {
|
||||
fn set_udst(&mut self, dst: &Dst) {
|
||||
match dst {
|
||||
Dst::None => self.set_ureg(16..24, self.zero_reg(RegFile::UGPR)),
|
||||
Dst::Reg(reg) => self.set_ureg(16..24, reg),
|
||||
Dst::Reg(reg) => self.set_ureg(16..24, *reg),
|
||||
_ => panic!("Not a register"),
|
||||
}
|
||||
}
|
||||
@@ -184,7 +184,7 @@ impl SM70Encoder<'_> {
|
||||
self.set_field(range, reg.base_idx());
|
||||
}
|
||||
|
||||
fn set_bar_dst(&mut self, range: Range<usize>, dst: Dst) {
|
||||
fn set_bar_dst(&mut self, range: Range<usize>, dst: &Dst) {
|
||||
self.set_bar_reg(range, *dst.as_reg().unwrap());
|
||||
}
|
||||
|
||||
@@ -259,7 +259,7 @@ fn src_mod_is_bnot(src_mod: SrcMod) -> bool {
|
||||
}
|
||||
}
|
||||
|
||||
fn dst_is_bar(dst: Dst) -> bool {
|
||||
fn dst_is_bar(dst: &Dst) -> bool {
|
||||
match dst {
|
||||
Dst::None => false,
|
||||
Dst::SSA(ssa) => ssa.file().unwrap() == RegFile::Bar,
|
||||
@@ -456,7 +456,7 @@ impl SM70Encoder<'_> {
|
||||
is_fp16_alu: bool,
|
||||
) {
|
||||
if let Some(dst) = dst {
|
||||
self.set_dst(*dst);
|
||||
self.set_dst(dst);
|
||||
}
|
||||
|
||||
let src0 = ALUSrc::from_src(self, src0, false);
|
||||
@@ -541,7 +541,7 @@ impl SM70Encoder<'_> {
|
||||
src2: Option<&Src>,
|
||||
) {
|
||||
if let Some(dst) = dst {
|
||||
self.set_udst(*dst);
|
||||
self.set_udst(dst);
|
||||
}
|
||||
|
||||
let src0 = ALUSrc::from_src(self, src0, true);
|
||||
@@ -856,8 +856,8 @@ impl SM70Op for OpFSetP {
|
||||
e.set_float_cmp_op(76..80, self.cmp_op);
|
||||
e.set_bit(80, self.ftz);
|
||||
|
||||
e.set_pred_dst(81..84, self.dst);
|
||||
e.set_pred_dst(84..87, Dst::None); // dst1
|
||||
e.set_pred_dst(81..84, &self.dst);
|
||||
e.set_pred_dst(84..87, &Dst::None); // dst1
|
||||
|
||||
e.set_pred_src(87..90, 90, self.accum);
|
||||
}
|
||||
@@ -873,7 +873,7 @@ impl SM70Op for OpFSwzAdd {
|
||||
|
||||
fn encode(&self, e: &mut SM70Encoder<'_>) {
|
||||
e.set_opcode(0x822);
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
|
||||
e.set_reg_src(24..32, self.srcs[0]);
|
||||
e.set_reg_src(64..72, self.srcs[1]);
|
||||
@@ -1018,8 +1018,8 @@ impl SM70Op for OpDSetP {
|
||||
e.set_pred_set_op(74..76, self.set_op);
|
||||
e.set_float_cmp_op(76..80, self.cmp_op);
|
||||
|
||||
e.set_pred_dst(81..84, self.dst);
|
||||
e.set_pred_dst(84..87, Dst::None); /* dst1 */
|
||||
e.set_pred_dst(81..84, &self.dst);
|
||||
e.set_pred_dst(84..87, &Dst::None); /* dst1 */
|
||||
|
||||
e.set_pred_src(87..90, 90, self.accum);
|
||||
}
|
||||
@@ -1191,8 +1191,8 @@ impl SM70Op for OpHSetP2 {
|
||||
e.set_float_cmp_op(76..80, self.cmp_op);
|
||||
e.set_bit(80, self.ftz);
|
||||
|
||||
e.set_pred_dst(81..84, self.dsts[0]);
|
||||
e.set_pred_dst(84..87, self.dsts[1]);
|
||||
e.set_pred_dst(81..84, &self.dsts[0]);
|
||||
e.set_pred_dst(84..87, &self.dsts[1]);
|
||||
|
||||
e.set_pred_src(87..90, 90, self.accum);
|
||||
}
|
||||
@@ -1282,7 +1282,7 @@ impl SM70Op for OpFlo {
|
||||
} else {
|
||||
e.encode_alu(0x100, Some(&self.dst), None, Some(&self.src), None)
|
||||
};
|
||||
e.set_pred_dst(81..84, Dst::None);
|
||||
e.set_pred_dst(81..84, &Dst::None);
|
||||
e.set_field(74..75, self.return_shift_amount as u8);
|
||||
e.set_field(73..74, self.signed as u8);
|
||||
let not_mod = matches!(self.src.src_mod, SrcMod::BNot);
|
||||
@@ -1346,8 +1346,8 @@ impl SM70Op for OpIAdd3 {
|
||||
e.set_pred_src(87..90, 90, false.into());
|
||||
e.set_pred_src(77..80, 80, false.into());
|
||||
|
||||
e.set_pred_dst(81..84, self.overflow[0]);
|
||||
e.set_pred_dst(84..87, self.overflow[1]);
|
||||
e.set_pred_dst(81..84, &self.overflow[0]);
|
||||
e.set_pred_dst(84..87, &self.overflow[1]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1361,7 +1361,7 @@ impl SM70Op for OpIAdd3X {
|
||||
let val = b.alloc_ssa(gpr);
|
||||
b.push_op(OpIAdd3X {
|
||||
srcs: [Src::new_zero(), *src0, Src::new_zero()],
|
||||
overflow: [Dst::None; 2],
|
||||
overflow: [Dst::None, Dst::None],
|
||||
dst: val.into(),
|
||||
carry: [false.into(); 2],
|
||||
});
|
||||
@@ -1407,8 +1407,8 @@ impl SM70Op for OpIAdd3X {
|
||||
|
||||
e.set_bit(74, true); // .X
|
||||
|
||||
e.set_pred_dst(81..84, self.overflow[0]);
|
||||
e.set_pred_dst(84..87, self.overflow[1]);
|
||||
e.set_pred_dst(81..84, &self.overflow[0]);
|
||||
e.set_pred_dst(84..87, &self.overflow[1]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1480,7 +1480,7 @@ impl SM70Op for OpIMad {
|
||||
Some(&self.srcs[2]),
|
||||
)
|
||||
};
|
||||
e.set_pred_dst(81..84, Dst::None);
|
||||
e.set_pred_dst(81..84, &Dst::None);
|
||||
e.set_bit(73, self.signed);
|
||||
}
|
||||
}
|
||||
@@ -1512,7 +1512,7 @@ impl SM70Op for OpIMad64 {
|
||||
Some(&self.srcs[2]),
|
||||
)
|
||||
};
|
||||
e.set_pred_dst(81..84, Dst::None);
|
||||
e.set_pred_dst(81..84, &Dst::None);
|
||||
e.set_bit(73, self.signed);
|
||||
}
|
||||
}
|
||||
@@ -1596,8 +1596,8 @@ impl SM70Op for OpISetP {
|
||||
e.set_pred_set_op(74..76, self.set_op);
|
||||
e.set_int_cmp_op(76..79, self.cmp_op);
|
||||
|
||||
e.set_pred_dst(81..84, self.dst);
|
||||
e.set_pred_dst(84..87, Dst::None); // dst1
|
||||
e.set_pred_dst(81..84, &self.dst);
|
||||
e.set_pred_dst(84..87, &Dst::None); // dst1
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1649,7 +1649,7 @@ impl SM70Op for OpLea {
|
||||
e.set_bit(72, self.intermediate_mod.is_ineg());
|
||||
e.set_field(75..80, self.shift);
|
||||
e.set_bit(80, self.dst_high);
|
||||
e.set_pred_dst(81..84, self.overflow);
|
||||
e.set_pred_dst(81..84, &self.overflow);
|
||||
e.set_bit(74, false); // .X
|
||||
}
|
||||
}
|
||||
@@ -1704,7 +1704,7 @@ impl SM70Op for OpLeaX {
|
||||
e.set_bit(72, self.intermediate_mod.is_bnot());
|
||||
e.set_field(75..80, self.shift);
|
||||
e.set_bit(80, self.dst_high);
|
||||
e.set_pred_dst(81..84, self.overflow);
|
||||
e.set_pred_dst(81..84, &self.overflow);
|
||||
e.set_bit(74, true); // .X
|
||||
}
|
||||
}
|
||||
@@ -1981,7 +1981,7 @@ impl SM70Op for OpMov {
|
||||
fn encode(&self, e: &mut SM70Encoder<'_>) {
|
||||
if self.is_uniform() {
|
||||
e.set_opcode(0xc82);
|
||||
e.set_udst(self.dst);
|
||||
e.set_udst(&self.dst);
|
||||
|
||||
// umov is encoded like a non-uniform ALU op
|
||||
let src = ALUSrc::from_src(e, Some(&self.src), true);
|
||||
@@ -2126,8 +2126,8 @@ impl SM70Op for OpShfl {
|
||||
_ => panic!("Invalid instruction form"),
|
||||
};
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_pred_dst(81..84, self.in_bounds);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_pred_dst(81..84, &self.in_bounds);
|
||||
e.set_reg_src(24..32, self.src);
|
||||
e.set_field(
|
||||
58..60,
|
||||
@@ -2208,8 +2208,8 @@ impl SM70Op for OpPLop3 {
|
||||
e.set_field(64..67, self.ops[0].lut & 0x7);
|
||||
e.set_field(72..77, self.ops[0].lut >> 3);
|
||||
|
||||
e.set_pred_dst(81..84, self.dsts[0]);
|
||||
e.set_pred_dst(84..87, self.dsts[1]);
|
||||
e.set_pred_dst(81..84, &self.dsts[0]);
|
||||
e.set_pred_dst(84..87, &self.dsts[1]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2220,9 +2220,9 @@ impl SM70Op for OpR2UR {
|
||||
|
||||
fn encode(&self, e: &mut SM70Encoder<'_>) {
|
||||
e.set_opcode(0x3c2);
|
||||
e.set_udst(self.dst);
|
||||
e.set_udst(&self.dst);
|
||||
e.set_reg_src(24..32, self.src);
|
||||
e.set_pred_dst(81..84, Dst::None);
|
||||
e.set_pred_dst(81..84, &Dst::None);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2365,13 +2365,13 @@ impl SM70Op for OpTex {
|
||||
}
|
||||
}
|
||||
|
||||
e.set_dst(self.dsts[0]);
|
||||
e.set_dst(&self.dsts[0]);
|
||||
if let Dst::Reg(reg) = self.dsts[1] {
|
||||
e.set_reg(64..72, reg);
|
||||
} else {
|
||||
e.set_field(64..72, 255_u8);
|
||||
}
|
||||
e.set_pred_dst(81..84, self.fault);
|
||||
e.set_pred_dst(81..84, &self.fault);
|
||||
|
||||
e.set_reg_src(24..32, self.srcs[0]);
|
||||
e.set_reg_src(32..40, self.srcs[1]);
|
||||
@@ -2418,13 +2418,13 @@ impl SM70Op for OpTld {
|
||||
}
|
||||
}
|
||||
|
||||
e.set_dst(self.dsts[0]);
|
||||
e.set_dst(&self.dsts[0]);
|
||||
if let Dst::Reg(reg) = self.dsts[1] {
|
||||
e.set_reg(64..72, reg);
|
||||
} else {
|
||||
e.set_field(64..72, 255_u8);
|
||||
}
|
||||
e.set_pred_dst(81..84, self.fault);
|
||||
e.set_pred_dst(81..84, &self.fault);
|
||||
|
||||
e.set_reg_src(24..32, self.srcs[0]);
|
||||
e.set_reg_src(32..40, self.srcs[1]);
|
||||
@@ -2472,13 +2472,13 @@ impl SM70Op for OpTld4 {
|
||||
}
|
||||
}
|
||||
|
||||
e.set_dst(self.dsts[0]);
|
||||
e.set_dst(&self.dsts[0]);
|
||||
if let Dst::Reg(reg) = self.dsts[1] {
|
||||
e.set_reg(64..72, reg);
|
||||
} else {
|
||||
e.set_field(64..72, 255_u8);
|
||||
}
|
||||
e.set_pred_dst(81..84, self.fault);
|
||||
e.set_pred_dst(81..84, &self.fault);
|
||||
|
||||
e.set_reg_src(24..32, self.srcs[0]);
|
||||
e.set_reg_src(32..40, self.srcs[1]);
|
||||
@@ -2526,7 +2526,7 @@ impl SM70Op for OpTmml {
|
||||
}
|
||||
}
|
||||
|
||||
e.set_dst(self.dsts[0]);
|
||||
e.set_dst(&self.dsts[0]);
|
||||
if let Dst::Reg(reg) = self.dsts[1] {
|
||||
e.set_reg(64..72, reg);
|
||||
} else {
|
||||
@@ -2569,13 +2569,13 @@ impl SM70Op for OpTxd {
|
||||
}
|
||||
}
|
||||
|
||||
e.set_dst(self.dsts[0]);
|
||||
e.set_dst(&self.dsts[0]);
|
||||
if let Dst::Reg(reg) = self.dsts[1] {
|
||||
e.set_reg(64..72, reg);
|
||||
} else {
|
||||
e.set_field(64..72, 255_u8);
|
||||
}
|
||||
e.set_pred_dst(81..84, self.fault);
|
||||
e.set_pred_dst(81..84, &self.fault);
|
||||
|
||||
e.set_reg_src(24..32, self.srcs[0]);
|
||||
e.set_reg_src(32..40, self.srcs[1]);
|
||||
@@ -2614,7 +2614,7 @@ impl SM70Op for OpTxq {
|
||||
}
|
||||
}
|
||||
|
||||
e.set_dst(self.dsts[0]);
|
||||
e.set_dst(&self.dsts[0]);
|
||||
if let Dst::Reg(reg) = self.dsts[1] {
|
||||
e.set_reg(64..72, reg);
|
||||
} else {
|
||||
@@ -2736,10 +2736,10 @@ impl SM70Op for OpSuLd {
|
||||
}
|
||||
}
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_src(24..32, self.coord);
|
||||
e.set_reg_src(64..72, self.handle);
|
||||
e.set_pred_dst(81..84, self.fault);
|
||||
e.set_pred_dst(81..84, &self.fault);
|
||||
|
||||
e.set_image_dim(61..64, self.image_dim);
|
||||
e.set_mem_order(&self.mem_order);
|
||||
@@ -2791,11 +2791,11 @@ impl SM70Op for OpSuAtom {
|
||||
e.set_atom_op(87..91, self.atom_op);
|
||||
};
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_src(24..32, self.coord);
|
||||
e.set_reg_src(32..40, self.data);
|
||||
e.set_reg_src(64..72, self.handle);
|
||||
e.set_pred_dst(81..84, self.fault);
|
||||
e.set_pred_dst(81..84, &self.fault);
|
||||
|
||||
e.set_image_dim(61..64, self.image_dim);
|
||||
e.set_mem_order(&self.mem_order);
|
||||
@@ -2815,7 +2815,7 @@ impl SM70Op for OpLd {
|
||||
match self.access.space {
|
||||
MemSpace::Global(_) => {
|
||||
e.set_opcode(0x381);
|
||||
e.set_pred_dst(81..84, Dst::None);
|
||||
e.set_pred_dst(81..84, &Dst::None);
|
||||
e.set_mem_access(&self.access);
|
||||
}
|
||||
MemSpace::Local => {
|
||||
@@ -2843,7 +2843,7 @@ impl SM70Op for OpLd {
|
||||
}
|
||||
}
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_src(24..32, self.addr);
|
||||
e.set_field(40..64, self.offset);
|
||||
}
|
||||
@@ -2864,13 +2864,13 @@ impl SM70Op for OpLdc {
|
||||
CBuf::Binding(idx) => {
|
||||
if self.is_uniform() {
|
||||
e.set_opcode(0xab9);
|
||||
e.set_udst(self.dst);
|
||||
e.set_udst(&self.dst);
|
||||
|
||||
assert!(self.offset.is_zero());
|
||||
assert!(self.mode == LdcMode::Indexed);
|
||||
} else {
|
||||
e.set_opcode(0xb82);
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
|
||||
e.set_reg_src(24..32, self.offset);
|
||||
e.set_field(
|
||||
@@ -2889,12 +2889,12 @@ impl SM70Op for OpLdc {
|
||||
CBuf::BindlessUGPR(handle) => {
|
||||
if self.is_uniform() {
|
||||
e.set_opcode(0xab9);
|
||||
e.set_udst(self.dst);
|
||||
e.set_udst(&self.dst);
|
||||
|
||||
assert!(self.offset.is_zero());
|
||||
} else {
|
||||
e.set_opcode(0x582);
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
|
||||
e.set_reg_src(64..72, self.offset);
|
||||
}
|
||||
@@ -3049,7 +3049,7 @@ impl SM70Op for OpAtom {
|
||||
e.set_atom_op(87..91, self.atom_op);
|
||||
}
|
||||
|
||||
e.set_pred_dst(81..84, Dst::None);
|
||||
e.set_pred_dst(81..84, &Dst::None);
|
||||
|
||||
e.set_field(
|
||||
72..73,
|
||||
@@ -3093,7 +3093,7 @@ impl SM70Op for OpAtom {
|
||||
}
|
||||
}
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_src(24..32, self.addr);
|
||||
e.set_field(40..64, self.addr_offset);
|
||||
e.set_atom_type(self.atom_type);
|
||||
@@ -3108,7 +3108,7 @@ impl SM70Op for OpAL2P {
|
||||
fn encode(&self, e: &mut SM70Encoder<'_>) {
|
||||
e.set_opcode(0x920);
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_src(24..32, self.offset);
|
||||
|
||||
e.set_field(40..50, self.addr);
|
||||
@@ -3125,7 +3125,7 @@ impl SM70Op for OpALd {
|
||||
fn encode(&self, e: &mut SM70Encoder<'_>) {
|
||||
e.set_opcode(0x321);
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_src(32..40, self.vtx);
|
||||
e.set_reg_src(24..32, self.offset);
|
||||
|
||||
@@ -3164,7 +3164,7 @@ impl SM70Op for OpIpa {
|
||||
fn encode(&self, e: &mut SM70Encoder<'_>) {
|
||||
e.set_opcode(0x326);
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
|
||||
assert!(self.addr % 4 == 0);
|
||||
e.set_field(64..72, self.addr >> 2);
|
||||
@@ -3193,7 +3193,7 @@ impl SM70Op for OpIpa {
|
||||
e.set_reg_src(32..40, self.offset);
|
||||
|
||||
// TODO: What is this for?
|
||||
e.set_pred_dst(81..84, Dst::None);
|
||||
e.set_pred_dst(81..84, &Dst::None);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3204,7 +3204,7 @@ impl SM70Op for OpLdTram {
|
||||
|
||||
fn encode(&self, e: &mut SM70Encoder<'_>) {
|
||||
e.set_opcode(0x3ad);
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_ureg(24..32, e.zero_reg(RegFile::UGPR));
|
||||
|
||||
assert!(self.addr % 4 == 0);
|
||||
@@ -3292,8 +3292,8 @@ impl SM70Op for OpBClear {
|
||||
fn encode(&self, e: &mut SM70Encoder<'_>) {
|
||||
e.set_opcode(0x355);
|
||||
|
||||
e.set_dst(Dst::None);
|
||||
e.set_bar_dst(24..28, self.dst);
|
||||
e.set_dst(&Dst::None);
|
||||
e.set_bar_dst(24..28, &self.dst);
|
||||
|
||||
e.set_bit(84, true); // .CLEAR
|
||||
}
|
||||
@@ -3305,17 +3305,17 @@ impl SM70Op for OpBMov {
|
||||
}
|
||||
|
||||
fn encode(&self, e: &mut SM70Encoder<'_>) {
|
||||
if dst_is_bar(self.dst) {
|
||||
if dst_is_bar(&self.dst) {
|
||||
e.set_opcode(0x356);
|
||||
|
||||
e.set_bar_dst(24..28, self.dst);
|
||||
e.set_bar_dst(24..28, &self.dst);
|
||||
e.set_reg_src(32..40, self.src);
|
||||
|
||||
e.set_bit(84, self.clear);
|
||||
} else {
|
||||
e.set_opcode(0x355);
|
||||
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_bar_src(24..28, self.src);
|
||||
|
||||
e.set_bit(84, self.clear);
|
||||
@@ -3331,7 +3331,7 @@ impl SM70Op for OpBreak {
|
||||
fn encode(&self, e: &mut SM70Encoder<'_>) {
|
||||
e.set_opcode(0x942);
|
||||
assert!(self.bar_in.src_ref.as_reg() == self.bar_out.as_reg());
|
||||
e.set_bar_dst(16..20, self.bar_out);
|
||||
e.set_bar_dst(16..20, &self.bar_out);
|
||||
e.set_pred_src(87..90, 90, self.cond);
|
||||
}
|
||||
}
|
||||
@@ -3344,7 +3344,7 @@ impl SM70Op for OpBSSy {
|
||||
fn encode(&self, e: &mut SM70Encoder<'_>) {
|
||||
e.set_opcode(0x945);
|
||||
assert!(self.bar_in.src_ref.as_reg() == self.bar_out.as_reg());
|
||||
e.set_bar_dst(16..20, self.bar_out);
|
||||
e.set_bar_dst(16..20, &self.bar_out);
|
||||
e.set_rel_offset(34..64, &self.target);
|
||||
e.set_pred_src(87..90, 90, self.cond);
|
||||
}
|
||||
@@ -3436,7 +3436,7 @@ impl SM70Op for OpCS2R {
|
||||
|
||||
fn encode(&self, e: &mut SM70Encoder<'_>) {
|
||||
e.set_opcode(0x805);
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_field(72..80, self.idx);
|
||||
e.set_bit(80, self.dst.as_reg().unwrap().comps() == 2); // .64
|
||||
}
|
||||
@@ -3449,7 +3449,7 @@ impl SM70Op for OpIsberd {
|
||||
|
||||
fn encode(&self, e: &mut SM70Encoder<'_>) {
|
||||
e.set_opcode(0x923);
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_reg_src(24..32, self.idx);
|
||||
}
|
||||
}
|
||||
@@ -3482,7 +3482,7 @@ impl SM70Op for OpPixLd {
|
||||
|
||||
fn encode(&self, e: &mut SM70Encoder<'_>) {
|
||||
e.set_opcode(0x925);
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_field(
|
||||
78..81,
|
||||
match &self.val {
|
||||
@@ -3494,7 +3494,7 @@ impl SM70Op for OpPixLd {
|
||||
other => panic!("Unsupported PixVal: {other}"),
|
||||
},
|
||||
);
|
||||
e.set_pred_dst(81..84, Dst::None);
|
||||
e.set_pred_dst(81..84, &Dst::None);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3506,7 +3506,7 @@ impl SM70Op for OpS2R {
|
||||
fn encode(&self, e: &mut SM70Encoder<'_>) {
|
||||
assert!(!self.is_uniform());
|
||||
e.set_opcode(if self.is_uniform() { 0x9c3 } else { 0x919 });
|
||||
e.set_dst(self.dst);
|
||||
e.set_dst(&self.dst);
|
||||
e.set_field(72..80, self.idx);
|
||||
}
|
||||
}
|
||||
@@ -3563,10 +3563,10 @@ impl SM70Op for OpVote {
|
||||
fn encode(&self, e: &mut SM70Encoder<'_>) {
|
||||
if self.is_uniform() {
|
||||
e.set_opcode(0x886);
|
||||
e.set_udst(self.ballot);
|
||||
e.set_udst(&self.ballot);
|
||||
} else {
|
||||
e.set_opcode(0x806);
|
||||
e.set_dst(self.ballot);
|
||||
e.set_dst(&self.ballot);
|
||||
}
|
||||
|
||||
e.set_field(
|
||||
@@ -3578,7 +3578,7 @@ impl SM70Op for OpVote {
|
||||
},
|
||||
);
|
||||
|
||||
e.set_pred_dst(81..84, self.vote);
|
||||
e.set_pred_dst(81..84, &self.vote);
|
||||
e.set_pred_src(87..90, 90, self.pred);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -333,8 +333,8 @@ impl Function {
|
||||
}
|
||||
|
||||
let tmp = self.ssa_alloc.alloc(file);
|
||||
pcopy.push(*dst, tmp.into());
|
||||
*dst = tmp.into();
|
||||
let old_dst = std::mem::replace(dst, tmp.into());
|
||||
pcopy.push(old_dst, tmp.into());
|
||||
}
|
||||
|
||||
instrs.push(instr);
|
||||
|
||||
Reference in New Issue
Block a user