mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-25 00:00:11 +01:00
nak: Legalize a bunch of instructions for SM50
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26114>
This commit is contained in:
parent
bbd2de34c5
commit
588cfcaec7
2 changed files with 83 additions and 17 deletions
|
|
@ -607,7 +607,6 @@ impl SM50Instr {
|
|||
}
|
||||
|
||||
fn encode_sel(&mut self, op: &OpSel) {
|
||||
/* TODO: This should happen as part of a legalization pass */
|
||||
assert!(op.srcs[1].is_reg_or_zero());
|
||||
|
||||
let src_modifier = Some(ALUSrcsModifier {
|
||||
|
|
@ -793,8 +792,8 @@ impl SM50Instr {
|
|||
}
|
||||
|
||||
fn encode_shf(&mut self, op: &OpShf) {
|
||||
/* TODO: This should happen as part of a legalization pass */
|
||||
assert!(op.shift.is_reg_or_zero());
|
||||
assert!(op.high.is_reg_or_zero());
|
||||
|
||||
let src_modifier = Some(ALUSrcsModifier {
|
||||
src0_opt: None,
|
||||
|
|
@ -870,7 +869,6 @@ impl SM50Instr {
|
|||
}
|
||||
|
||||
fn encode_f2f(&mut self, op: &OpF2F) {
|
||||
/* TODO: This should happen as part of a legalization pass */
|
||||
assert!(op.src.is_reg_or_zero());
|
||||
|
||||
let src_modifier = Some(ALUSrcsModifier {
|
||||
|
|
@ -920,7 +918,6 @@ impl SM50Instr {
|
|||
}
|
||||
|
||||
fn encode_imad(&mut self, op: &OpIMad) {
|
||||
/* TODO: This should happen as part of a legalization pass */
|
||||
assert!(op.srcs[0].is_reg_or_zero());
|
||||
assert!(op.srcs[1].is_reg_or_zero());
|
||||
assert!(op.srcs[2].is_reg_or_zero());
|
||||
|
|
@ -966,7 +963,6 @@ impl SM50Instr {
|
|||
}
|
||||
|
||||
fn encode_f2i(&mut self, op: &OpF2I) {
|
||||
/* TODO: This should happen as part of a legalization pass */
|
||||
assert!(op.src.is_reg_or_zero());
|
||||
|
||||
let src_modifier = Some(ALUSrcsModifier {
|
||||
|
|
@ -1015,7 +1011,6 @@ impl SM50Instr {
|
|||
}
|
||||
|
||||
fn encode_imnmx(&mut self, op: &OpIMnMx) {
|
||||
/* TODO: This should happen as part of a legalization pass */
|
||||
assert!(op.srcs[0].is_reg_or_zero());
|
||||
assert!(op.srcs[1].is_reg_or_zero());
|
||||
|
||||
|
|
@ -1119,7 +1114,6 @@ impl SM50Instr {
|
|||
}
|
||||
|
||||
fn encode_ipa(&mut self, op: &OpIpa) {
|
||||
/* TODO: This should happen as part of a legalization pass */
|
||||
assert!(op.offset.is_reg_or_zero());
|
||||
|
||||
self.set_opcode(0xe000);
|
||||
|
|
@ -1256,7 +1250,6 @@ impl SM50Instr {
|
|||
}
|
||||
|
||||
fn encode_popc(&mut self, op: &OpPopC) {
|
||||
/* TODO: This should happen as part of a legalization pass */
|
||||
assert!(op.src.is_reg_or_zero());
|
||||
|
||||
let src_modifier = Some(ALUSrcsModifier {
|
||||
|
|
@ -1286,7 +1279,6 @@ impl SM50Instr {
|
|||
}
|
||||
|
||||
fn encode_brev(&mut self, op: &OpBrev) {
|
||||
/* TODO: This should happen as part of a legalization pass */
|
||||
assert!(op.src.is_reg_or_zero());
|
||||
|
||||
// BREV doesn't exist on SM50, but we have BFE.BREV.
|
||||
|
|
@ -1362,7 +1354,6 @@ impl SM50Instr {
|
|||
}
|
||||
|
||||
fn encode_fmnmx(&mut self, op: &OpFMnMx) {
|
||||
/* TODO: This should happen as part of a legalization pass */
|
||||
assert!(op.srcs[0].is_reg_or_zero());
|
||||
assert!(op.srcs[1].is_reg_or_zero());
|
||||
|
||||
|
|
@ -1399,7 +1390,6 @@ impl SM50Instr {
|
|||
}
|
||||
|
||||
fn encode_fmul(&mut self, op: &OpFMul) {
|
||||
/* TODO: This should happen as part of a legalization pass */
|
||||
assert!(op.srcs[0].is_reg_or_zero());
|
||||
assert!(op.srcs[1].is_reg_or_zero());
|
||||
|
||||
|
|
@ -1467,7 +1457,6 @@ impl SM50Instr {
|
|||
}
|
||||
|
||||
fn encode_fset(&mut self, op: &OpFSet) {
|
||||
/* TODO: This should happen as part of a legalization pass */
|
||||
assert!(op.srcs[0].is_reg_or_zero());
|
||||
assert!(op.srcs[1].is_reg_or_zero());
|
||||
|
||||
|
|
@ -1505,7 +1494,6 @@ impl SM50Instr {
|
|||
}
|
||||
|
||||
fn encode_fsetp(&mut self, op: &OpFSetP) {
|
||||
/* TODO: This should happen as part of a legalization pass */
|
||||
assert!(op.srcs[0].is_reg_or_zero());
|
||||
assert!(op.srcs[1].is_reg_or_zero());
|
||||
|
||||
|
|
@ -1546,7 +1534,6 @@ impl SM50Instr {
|
|||
}
|
||||
|
||||
fn encode_mufu(&mut self, op: &OpMuFu) {
|
||||
/* TODO: This should happen as part of a legalization pass */
|
||||
assert!(op.src.is_reg_or_zero());
|
||||
|
||||
// TODO: This is following ALU encoding, figure out the correct form of this.
|
||||
|
|
@ -1580,7 +1567,6 @@ impl SM50Instr {
|
|||
}
|
||||
|
||||
fn encode_iabs(&mut self, op: &OpIAbs) {
|
||||
/* TODO: This should happen as part of a legalization pass */
|
||||
assert!(op.src.is_reg_or_zero());
|
||||
|
||||
// IABS isn't a thing on SM50, we use I2I instead.
|
||||
|
|
@ -1629,7 +1615,6 @@ impl SM50Instr {
|
|||
}
|
||||
|
||||
fn encode_iadd3(&mut self, op: &OpIAdd3) {
|
||||
/* TODO: This should happen as part of a legalization pass */
|
||||
assert!(op.srcs[0].is_reg_or_zero());
|
||||
|
||||
let src_modifier = Some(ALUSrcsModifier {
|
||||
|
|
@ -1668,7 +1653,6 @@ impl SM50Instr {
|
|||
}
|
||||
|
||||
fn encode_prmt(&mut self, op: &OpPrmt) {
|
||||
/* TODO: This should happen as part of a legalization pass */
|
||||
assert!(op.srcs[0].is_reg_or_zero());
|
||||
assert!(op.sel.is_reg_or_zero());
|
||||
assert!(op.srcs[1].is_reg_or_zero());
|
||||
|
|
|
|||
|
|
@ -79,6 +79,88 @@ fn legalize_sm50_instr(
|
|||
instr: &mut Instr,
|
||||
) {
|
||||
match &mut instr.op {
|
||||
Op::Shf(op) => {
|
||||
copy_src_if_not_reg(b, &mut op.shift, RegFile::GPR);
|
||||
copy_src_if_not_reg(b, &mut op.high, RegFile::GPR);
|
||||
}
|
||||
Op::FAdd(op) => {
|
||||
let [ref mut src0, ref mut src1] = op.srcs;
|
||||
swap_srcs_if_not_reg(src0, src1);
|
||||
copy_src_if_not_reg(b, src1, RegFile::GPR);
|
||||
}
|
||||
Op::FMul(op) => {
|
||||
copy_src_if_not_reg(b, &mut op.srcs[0], RegFile::GPR);
|
||||
copy_src_if_not_reg(b, &mut op.srcs[1], RegFile::GPR);
|
||||
}
|
||||
Op::FSet(op) => {
|
||||
copy_src_if_not_reg(b, &mut op.srcs[0], RegFile::GPR);
|
||||
copy_src_if_not_reg(b, &mut op.srcs[1], RegFile::GPR);
|
||||
}
|
||||
Op::FSetP(op) => {
|
||||
copy_src_if_not_reg(b, &mut op.srcs[0], RegFile::GPR);
|
||||
copy_src_if_not_reg(b, &mut op.srcs[1], RegFile::GPR);
|
||||
}
|
||||
Op::ISetP(op) => {
|
||||
copy_src_if_not_reg(b, &mut op.srcs[0], RegFile::GPR);
|
||||
copy_src_if_not_reg(b, &mut op.srcs[1], RegFile::GPR);
|
||||
}
|
||||
Op::Lop2(op) => {
|
||||
copy_src_if_not_reg(b, &mut op.srcs[0], RegFile::GPR);
|
||||
copy_src_if_not_reg(b, &mut op.srcs[1], RegFile::GPR);
|
||||
}
|
||||
Op::PSetP(op) => {
|
||||
copy_src_if_not_reg(b, &mut op.srcs[0], RegFile::Pred);
|
||||
copy_src_if_not_reg(b, &mut op.srcs[1], RegFile::Pred);
|
||||
copy_src_if_not_reg(b, &mut op.srcs[2], RegFile::Pred);
|
||||
}
|
||||
Op::MuFu(op) => {
|
||||
copy_src_if_not_reg(b, &mut op.src, RegFile::GPR);
|
||||
}
|
||||
Op::IAbs(op) => {
|
||||
copy_src_if_not_reg(b, &mut op.src, RegFile::GPR);
|
||||
}
|
||||
Op::Sel(op) => {
|
||||
copy_src_if_not_reg(b, &mut op.srcs[1], RegFile::GPR);
|
||||
}
|
||||
Op::IAdd3(op) => {
|
||||
copy_src_if_not_reg(b, &mut op.srcs[1], RegFile::GPR);
|
||||
}
|
||||
Op::I2F(op) => {
|
||||
copy_src_if_not_reg(b, &mut op.src, RegFile::GPR);
|
||||
}
|
||||
Op::F2F(op) => {
|
||||
copy_src_if_not_reg(b, &mut op.src, RegFile::GPR);
|
||||
}
|
||||
Op::IMad(op) => {
|
||||
copy_src_if_not_reg(b, &mut op.srcs[0], RegFile::GPR);
|
||||
copy_src_if_not_reg(b, &mut op.srcs[1], RegFile::GPR);
|
||||
copy_src_if_not_reg(b, &mut op.srcs[2], RegFile::GPR);
|
||||
}
|
||||
Op::F2I(op) => {
|
||||
copy_src_if_not_reg(b, &mut op.src, RegFile::GPR);
|
||||
}
|
||||
Op::IMnMx(op) => {
|
||||
copy_src_if_not_reg(b, &mut op.srcs[0], RegFile::GPR);
|
||||
copy_src_if_not_reg(b, &mut op.srcs[1], RegFile::GPR);
|
||||
}
|
||||
Op::Ipa(op) => {
|
||||
copy_src_if_not_reg(b, &mut op.offset, RegFile::GPR);
|
||||
}
|
||||
Op::PopC(op) => {
|
||||
copy_src_if_not_reg(b, &mut op.src, RegFile::GPR);
|
||||
}
|
||||
Op::Brev(op) => {
|
||||
copy_src_if_not_reg(b, &mut op.src, RegFile::GPR);
|
||||
}
|
||||
Op::FMnMx(op) => {
|
||||
copy_src_if_not_reg(b, &mut op.srcs[0], RegFile::GPR);
|
||||
copy_src_if_not_reg(b, &mut op.srcs[1], RegFile::GPR);
|
||||
}
|
||||
Op::Prmt(op) => {
|
||||
copy_src_if_not_reg(b, &mut op.srcs[0], RegFile::GPR);
|
||||
copy_src_if_not_reg(b, &mut op.sel, RegFile::GPR);
|
||||
copy_src_if_not_reg(b, &mut op.srcs[1], RegFile::GPR);
|
||||
}
|
||||
Op::Copy(_) => (), // Nothing to do
|
||||
_ => {
|
||||
let src_types = instr.src_types();
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue