aco: handle read2st64/write2st64 in optimizer
authorRhys Perry <pendingchaos02@gmail.com>
Mon, 15 Nov 2021 16:40:53 +0000 (16:40 +0000)
committerMarge Bot <emma+marge@anholt.net>
Wed, 13 Apr 2022 23:08:07 +0000 (23:08 +0000)
Signed-off-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/13778>

src/amd/compiler/aco_optimizer.cpp

index 763bfdf..e2f540c 100644 (file)
@@ -1390,15 +1390,21 @@ label_instruction(opt_ctx& ctx, aco_ptr<Instruction>& instr)
             if (instr->opcode == aco_opcode::ds_write2_b32 ||
                 instr->opcode == aco_opcode::ds_read2_b32 ||
                 instr->opcode == aco_opcode::ds_write2_b64 ||
-                instr->opcode == aco_opcode::ds_read2_b64) {
-               unsigned mask = (instr->opcode == aco_opcode::ds_write2_b64 ||
-                                instr->opcode == aco_opcode::ds_read2_b64)
-                                  ? 0x7
-                                  : 0x3;
-               unsigned shifts = (instr->opcode == aco_opcode::ds_write2_b64 ||
-                                  instr->opcode == aco_opcode::ds_read2_b64)
-                                    ? 3
-                                    : 2;
+                instr->opcode == aco_opcode::ds_read2_b64 ||
+                instr->opcode == aco_opcode::ds_write2st64_b32 ||
+                instr->opcode == aco_opcode::ds_read2st64_b32 ||
+                instr->opcode == aco_opcode::ds_write2st64_b64 ||
+                instr->opcode == aco_opcode::ds_read2st64_b64) {
+               bool is64bit = instr->opcode == aco_opcode::ds_write2_b64 ||
+                              instr->opcode == aco_opcode::ds_read2_b64 ||
+                              instr->opcode == aco_opcode::ds_write2st64_b64 ||
+                              instr->opcode == aco_opcode::ds_read2st64_b64;
+               bool st64 = instr->opcode == aco_opcode::ds_write2st64_b32 ||
+                           instr->opcode == aco_opcode::ds_read2st64_b32 ||
+                           instr->opcode == aco_opcode::ds_write2st64_b64 ||
+                           instr->opcode == aco_opcode::ds_read2st64_b64;
+               unsigned shifts = (is64bit ? 3 : 2) + (st64 ? 6 : 0);
+               unsigned mask = BITFIELD_MASK(shifts);
 
                if ((offset & mask) == 0 && ds.offset0 + (offset >> shifts) <= 255 &&
                    ds.offset1 + (offset >> shifts) <= 255) {