Mesa (master): broadcom/compiler: add a v3d_qpu_writes_accum helper

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Mar 26 07:30:57 UTC 2021


Module: Mesa
Branch: master
Commit: f68f209e39227f1697061bd2263bfee73ebd2100
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=f68f209e39227f1697061bd2263bfee73ebd2100

Author: Iago Toral Quiroga <itoral at igalia.com>
Date:   Wed Mar 24 10:36:10 2021 +0100

broadcom/compiler: add a v3d_qpu_writes_accum helper

We have helpers to check if an instruction writes to specific
accumulators. This one will check if it writes any of the general
purpose accumulators, which will come in handy in a follow-up
patch.

Reviewed-by: Alejandro Piñeiro <apinheiro at igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9825>

---

 src/broadcom/qpu/qpu_instr.c | 61 +++++++++++++++++++++++++++-----------------
 src/broadcom/qpu/qpu_instr.h |  2 ++
 2 files changed, 39 insertions(+), 24 deletions(-)

diff --git a/src/broadcom/qpu/qpu_instr.c b/src/broadcom/qpu/qpu_instr.c
index 711c7cedb0f..9f517874d1f 100644
--- a/src/broadcom/qpu/qpu_instr.c
+++ b/src/broadcom/qpu/qpu_instr.c
@@ -794,27 +794,34 @@ v3d_qpu_uses_vpm(const struct v3d_qpu_instr *inst)
                v3d_qpu_waits_vpm(inst);
 }
 
-bool
-v3d_qpu_writes_r3(const struct v3d_device_info *devinfo,
-                  const struct v3d_qpu_instr *inst)
+static bool
+qpu_writes_magic_waddr_explicitly(const struct v3d_device_info *devinfo,
+                                  const struct v3d_qpu_instr *inst,
+                                  uint32_t waddr)
 {
         if (inst->type == V3D_QPU_INSTR_TYPE_ALU) {
-                if (inst->alu.add.magic_write &&
-                    inst->alu.add.waddr == V3D_QPU_WADDR_R3) {
+                if (inst->alu.add.magic_write && inst->alu.add.waddr == waddr)
                         return true;
-                }
 
-                if (inst->alu.mul.magic_write &&
-                    inst->alu.mul.waddr == V3D_QPU_WADDR_R3) {
+                if (inst->alu.mul.magic_write && inst->alu.mul.waddr == waddr)
                         return true;
-                }
         }
 
         if (v3d_qpu_sig_writes_address(devinfo, &inst->sig) &&
-            inst->sig_magic && inst->sig_addr == V3D_QPU_WADDR_R3) {
+            inst->sig_magic && inst->sig_addr == waddr) {
                 return true;
         }
 
+        return false;
+}
+
+bool
+v3d_qpu_writes_r3(const struct v3d_device_info *devinfo,
+                  const struct v3d_qpu_instr *inst)
+{
+        if (qpu_writes_magic_waddr_explicitly(devinfo, inst, V3D_QPU_WADDR_R3))
+                return true;
+
         return (devinfo->ver < 41 && inst->sig.ldvary) || inst->sig.ldvpm;
 }
 
@@ -850,24 +857,30 @@ bool
 v3d_qpu_writes_r5(const struct v3d_device_info *devinfo,
                   const struct v3d_qpu_instr *inst)
 {
-        if (inst->type == V3D_QPU_INSTR_TYPE_ALU) {
-                if (inst->alu.add.magic_write &&
-                    inst->alu.add.waddr == V3D_QPU_WADDR_R5) {
-                        return true;
-                }
+        if (qpu_writes_magic_waddr_explicitly(devinfo, inst, V3D_QPU_WADDR_R5))
+                return true;
 
-                if (inst->alu.mul.magic_write &&
-                    inst->alu.mul.waddr == V3D_QPU_WADDR_R5) {
-                        return true;
-                }
-        }
+        return inst->sig.ldvary || inst->sig.ldunif || inst->sig.ldunifa;
+}
 
-        if (v3d_qpu_sig_writes_address(devinfo, &inst->sig) &&
-            inst->sig_magic && inst->sig_addr == V3D_QPU_WADDR_R5) {
+bool
+v3d_qpu_writes_accum(const struct v3d_device_info *devinfo,
+                     const struct v3d_qpu_instr *inst)
+{
+        if (v3d_qpu_writes_r5(devinfo, inst))
+                return true;
+        if (v3d_qpu_writes_r4(devinfo, inst))
+                return true;
+        if (v3d_qpu_writes_r3(devinfo, inst))
+                return true;
+        if (qpu_writes_magic_waddr_explicitly(devinfo, inst, V3D_QPU_WADDR_R2))
+                return true;
+        if (qpu_writes_magic_waddr_explicitly(devinfo, inst, V3D_QPU_WADDR_R1))
+                return true;
+        if (qpu_writes_magic_waddr_explicitly(devinfo, inst, V3D_QPU_WADDR_R0))
                 return true;
-        }
 
-        return inst->sig.ldvary || inst->sig.ldunif || inst->sig.ldunifa;
+        return false;
 }
 
 bool
diff --git a/src/broadcom/qpu/qpu_instr.h b/src/broadcom/qpu/qpu_instr.h
index 4996e0134f7..c2885d73525 100644
--- a/src/broadcom/qpu/qpu_instr.h
+++ b/src/broadcom/qpu/qpu_instr.h
@@ -462,6 +462,8 @@ bool v3d_qpu_writes_r4(const struct v3d_device_info *devinfo,
                        const struct v3d_qpu_instr *instr) ATTRIBUTE_CONST;
 bool v3d_qpu_writes_r5(const struct v3d_device_info *devinfo,
                        const struct v3d_qpu_instr *instr) ATTRIBUTE_CONST;
+bool v3d_qpu_writes_accum(const struct v3d_device_info *devinfo,
+                          const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
 bool v3d_qpu_waits_on_tmu(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;
 bool v3d_qpu_uses_mux(const struct v3d_qpu_instr *inst, enum v3d_qpu_mux mux);
 bool v3d_qpu_uses_vpm(const struct v3d_qpu_instr *inst) ATTRIBUTE_CONST;



More information about the mesa-commit mailing list