nak: Implement iadd and ishl

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24998>
This commit is contained in:
Faith Ekstrand 2023-01-30 20:53:17 -06:00 committed by Marge Bot
parent 241caaf5ff
commit 93eb2f884a
3 changed files with 37 additions and 0 deletions

View file

@ -197,6 +197,22 @@ fn encode_mov(bs: &mut impl BitSetMut, instr: &Instr) {
bs.set_field(72..76, 0xf_u32 /* TODO: Quad lanes */);
}
fn encode_iadd3(bs: &mut impl BitSetMut, instr: &Instr) {
encode_alu(bs, instr, 0x010);
bs.set_field(81..84, 7_u32); /* pred */
bs.set_field(84..87, 7_u32); /* pred */
}
fn encode_shl(bs: &mut impl BitSetMut, instr: &Instr) {
encode_alu(bs, instr, 0x019);
bs.set_field(73..75, 3_u32 /* U32 */);
bs.set_bit(75, true /* W? */);
bs.set_bit(76, false /* Left */);
bs.set_bit(80, false /* HI */);
}
fn encode_ald(bs: &mut impl BitSetMut, instr: &Instr, attr: &AttrAccess) {
encode_instr_base(bs, &instr, 0x321);
@ -299,6 +315,8 @@ pub fn encode_instr(instr: &Instr) -> [u32; 4] {
match &instr.op {
Opcode::S2R(i) => encode_s2r(&mut bs, instr, *i),
Opcode::MOV => encode_mov(&mut bs, instr),
Opcode::IADD3 => encode_iadd3(&mut bs, instr),
Opcode::SHL => encode_shl(&mut bs, instr),
Opcode::ALD(a) => encode_ald(&mut bs, instr, &a),
Opcode::AST(a) => encode_ast(&mut bs, instr, &a),
Opcode::LD(a) => encode_ld(&mut bs, instr, a),

View file

@ -85,6 +85,12 @@ impl<'a> ShaderFromNir<'a> {
nir_op_fadd => {
self.instrs.push(Instr::new_fadd(dst, srcs[0], srcs[1]));
}
nir_op_iadd => {
self.instrs.push(Instr::new_iadd(dst, srcs[0], srcs[1]));
}
nir_op_ishl => {
self.instrs.push(Instr::new_shl(dst, srcs[0], srcs[1]));
}
nir_op_mov => {
self.instrs.push(Instr::new_mov(dst, srcs[0]));
}

View file

@ -628,6 +628,14 @@ impl Instr {
Instr::new(Opcode::FADD, slice::from_ref(&dst), &[x, y])
}
pub fn new_iadd(dst: Dst, x: Src, y: Src) -> Instr {
Instr::new(Opcode::IADD3, slice::from_ref(&dst), &[Src::Zero, x, y])
}
pub fn new_shl(dst: Dst, x: Src, shift: Src) -> Instr {
Instr::new(Opcode::SHL, slice::from_ref(&dst), &[x, shift])
}
pub fn new_s2r(dst: Dst, idx: u8) -> Instr {
Instr::new(Opcode::S2R(idx), slice::from_ref(&dst), &[])
}
@ -779,6 +787,9 @@ pub enum Opcode {
FMNMX,
FMUL,
IADD3,
SHL,
S2R(u8),
MOV,
VEC,
@ -803,6 +814,8 @@ impl fmt::Display for Opcode {
Opcode::FFMA => write!(f, "FFMA"),
Opcode::FMNMX => write!(f, "FMNMX"),
Opcode::FMUL => write!(f, "FMUL"),
Opcode::IADD3 => write!(f, "IADD3"),
Opcode::SHL => write!(f, "SHL"),
Opcode::S2R(i) => write!(f, "S2R({})", i),
Opcode::MOV => write!(f, "MOV"),
Opcode::VEC => write!(f, "VEC"),