aco: add builder function for subdword copy()
authorDaniel Schürmann <daniel@schuermann.dev>
Thu, 27 Feb 2020 12:04:39 +0000 (13:04 +0100)
committerDaniel Schürmann <daniel@schuermann.dev>
Fri, 3 Apr 2020 22:13:15 +0000 (23:13 +0100)
Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-By: Timur Kristóf <timur.kristof@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4002>

src/amd/compiler/aco_builder_h.py

index 65eee5ebd1d29e70040eff13f95d454281180f41..9e4e64101b88f2b1abb99b403b9ebc329b7e2a79 100644 (file)
@@ -352,6 +352,7 @@ public:
 
    Result copy(Definition dst, Op op_) {
       Operand op = op_.op;
+      assert(op.bytes() == dst.bytes());
       if (dst.regClass() == s1 && op.size() == 1 && op.isLiteral()) {
          uint32_t imm = op.constantValue();
          if (imm == 0x3e22f983) {
@@ -372,15 +373,24 @@ public:
          }
       }
 
-      if (dst.regClass() == s2) {
+      if (dst.regClass() == s1) {
+        return sop1(aco_opcode::s_mov_b32, dst, op);
+      } else if (dst.regClass() == s2) {
         return sop1(aco_opcode::s_mov_b64, dst, op);
-      } else if (op.size() > 1) {
-         return pseudo(aco_opcode::p_create_vector, dst, op);
       } else if (dst.regClass() == v1 || dst.regClass() == v1.as_linear()) {
         return vop1(aco_opcode::v_mov_b32, dst, op);
+      } else if (op.bytes() > 2) {
+         return pseudo(aco_opcode::p_create_vector, dst, op);
+      } else if (dst.regClass().is_subdword()) {
+        aco_ptr<SDWA_instruction> sdwa{create_instruction<SDWA_instruction>(aco_opcode::v_mov_b32, asSDWA(Format::VOP1), 1, 1)};
+        sdwa->operands[0] = op;
+        sdwa->definitions[0] = dst;
+        sdwa->sel[0] = op.bytes() == 1 ? sdwa_ubyte : sdwa_uword;
+        sdwa->dst_sel = dst.bytes() == 1 ? sdwa_ubyte : sdwa_uword;
+        sdwa->dst_preserve = true;
+        return insert(std::move(sdwa));
       } else {
-        assert(dst.regClass() == s1);
-        return sop1(aco_opcode::s_mov_b32, dst, op);
+        unreachable("Unhandled case in bld.copy()");
       }
    }