diff options
author | Samuel Pitoiset <[email protected]> | 2020-05-08 16:21:07 +0200 |
---|---|---|
committer | Marge Bot <[email protected]> | 2020-05-19 17:05:05 +0000 |
commit | bbbb4057e64f95e95bd9f302a19e5775556ad600 (patch) | |
tree | 923c0da911c411627c6b7b68f84e336c39ed3b5d | |
parent | 34f2c4dc6a6d62677bb7478a70e71b0e5719fc4c (diff) |
aco: emit v_interp_*_f16 instructions as VOP3 instead of VINTRP
This adds a separate emission path in the assembly for the 16-bit
interp instructions.
Signed-off-by: Samuel Pitoiset <[email protected]>
Reviewed-by: Rhys Perry <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4966>
-rw-r--r-- | src/amd/compiler/aco_assembler.cpp | 56 |
1 files changed, 42 insertions, 14 deletions
diff --git a/src/amd/compiler/aco_assembler.cpp b/src/amd/compiler/aco_assembler.cpp index ed2e3982976..bac91c899e7 100644 --- a/src/amd/compiler/aco_assembler.cpp +++ b/src/amd/compiler/aco_assembler.cpp @@ -274,22 +274,50 @@ void emit_instruction(asm_context& ctx, std::vector<uint32_t>& out, Instruction* Interp_instruction* interp = static_cast<Interp_instruction*>(instr); uint32_t encoding = 0; - if (ctx.chip_class == GFX8 || ctx.chip_class == GFX9) { - encoding = (0b110101 << 26); /* Vega ISA doc says 110010 but it's wrong */ + if (instr->opcode == aco_opcode::v_interp_p1ll_f16 || + instr->opcode == aco_opcode::v_interp_p1lv_f16 || + instr->opcode == aco_opcode::v_interp_p2_legacy_f16 || + instr->opcode == aco_opcode::v_interp_p2_f16) { + if (ctx.chip_class == GFX8 || ctx.chip_class == GFX9) { + encoding = (0b110100 << 26); + } else if (ctx.chip_class == GFX10) { + encoding = (0b110101 << 26); + } else { + unreachable("Unknown chip_class."); + } + + encoding |= opcode << 16; + encoding |= (0xFF & instr->definitions[0].physReg()); + out.push_back(encoding); + + encoding = 0; + encoding |= interp->attribute; + encoding |= interp->component << 6; + encoding |= instr->operands[0].physReg() << 9; + if (instr->opcode == aco_opcode::v_interp_p2_f16 || + instr->opcode == aco_opcode::v_interp_p2_legacy_f16 || + instr->opcode == aco_opcode::v_interp_p1lv_f16) { + encoding |= instr->operands[2].physReg() << 18; + } + out.push_back(encoding); } else { - encoding = (0b110010 << 26); - } + if (ctx.chip_class == GFX8 || ctx.chip_class == GFX9) { + encoding = (0b110101 << 26); /* Vega ISA doc says 110010 but it's wrong */ + } else { + encoding = (0b110010 << 26); + } - assert(encoding); - encoding |= (0xFF & instr->definitions[0].physReg()) << 18; - encoding |= opcode << 16; - encoding |= interp->attribute << 10; - encoding |= interp->component << 8; - if (instr->opcode == aco_opcode::v_interp_mov_f32) - encoding |= (0x3 & instr->operands[0].constantValue()); - else - encoding |= (0xFF & instr->operands[0].physReg()); - out.push_back(encoding); + assert(encoding); + encoding |= (0xFF & instr->definitions[0].physReg()) << 18; + encoding |= opcode << 16; + encoding |= interp->attribute << 10; + encoding |= interp->component << 8; + if (instr->opcode == aco_opcode::v_interp_mov_f32) + encoding |= (0x3 & instr->operands[0].constantValue()); + else + encoding |= (0xFF & instr->operands[0].physReg()); + out.push_back(encoding); + } break; } case Format::DS: { |