aco: Assemble opsel in VOP3 instructions.
authorRhys Perry <pendingchaos02@gmail.com>
Thu, 12 Sep 2019 18:55:12 +0000 (19:55 +0100)
committerTimur Kristóf <timur.kristof@gmail.com>
Thu, 10 Oct 2019 07:57:53 +0000 (09:57 +0200)
Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-By: Timur Kristóf <timur.kristof@gmail.com>
Reviewed-by: Daniel Schürmann <daniel@schuermann.dev>
src/amd/compiler/aco_assembler.cpp
src/amd/compiler/aco_ir.h

index 272be08858911b61892c262e2ca08ccbff137ba6..34eb9fb730f8eabc696b2a415b4ef0925491b705 100644 (file)
@@ -475,7 +475,6 @@ void emit_instruction(asm_context& ctx, std::vector<uint32_t>& out, Instruction*
             opcode = opcode + 0x270;
          }
 
-         // TODO: op_sel
          uint32_t encoding;
          if (ctx.chip_class <= GFX9) {
             encoding = (0b110100 << 26);
@@ -487,6 +486,8 @@ void emit_instruction(asm_context& ctx, std::vector<uint32_t>& out, Instruction*
          encoding |= (vop3->clamp ? 1 : 0) << 15;
          for (unsigned i = 0; i < 3; i++)
             encoding |= vop3->abs[i] << (8+i);
+         for (unsigned i = 0; i < 4; i++)
+            encoding |= vop3->opsel[i] << (11+i);
          if (instr->definitions.size() == 2)
             encoding |= instr->definitions[1].physReg() << 8;
          encoding |= (0xFF & instr->definitions[0].physReg().reg);
index b393ef15283d37bb047a9b24e5343ee2e7630b4f..22692516098de1e431b46bbeae4ebb5f5899b8bf 100644 (file)
@@ -665,7 +665,7 @@ struct VOPC_instruction : public Instruction {
 
 struct VOP3A_instruction : public Instruction {
    bool abs[3];
-   bool opsel[3];
+   bool opsel[4];
    bool clamp;
    unsigned omod;
    bool neg[3];