vc4: Add disasm for A-file unpack operations.
authorEric Anholt <eric@anholt.net>
Fri, 22 Aug 2014 21:16:19 +0000 (14:16 -0700)
committerEric Anholt <eric@anholt.net>
Tue, 23 Sep 2014 20:40:10 +0000 (13:40 -0700)
The A-file unpack is just like R4 unpack, except that if you don't do a
floating-point operation it won't do float conversion (so int16 gets
scaled up to int32).

src/gallium/drivers/vc4/vc4_qpu_defines.h
src/gallium/drivers/vc4/vc4_qpu_disasm.c
src/gallium/drivers/vc4/vc4_qpu_emit.c

index 0715df25b2d2e42039c5424b4d7bfb6ee212e6ea..cee2ae8a928f2038cd9216016266499548ad199b 100644 (file)
@@ -195,15 +195,15 @@ enum qpu_pack_a {
         QPU_PACK_A_8D_SAT,
 };
 
-enum qpu_unpack_r4 {
-        QPU_UNPACK_R4_NOP,
-        QPU_UNPACK_R4_F16A_TO_F32,
-        QPU_UNPACK_R4_F16B_TO_F32,
-        QPU_UNPACK_R4_8D_REP,
-        QPU_UNPACK_R4_8A,
-        QPU_UNPACK_R4_8B,
-        QPU_UNPACK_R4_8C,
-        QPU_UNPACK_R4_8D,
+enum qpu_unpack {
+        QPU_UNPACK_NOP,
+        QPU_UNPACK_F16A_TO_F32,
+        QPU_UNPACK_F16B_TO_F32,
+        QPU_UNPACK_8D_REP,
+        QPU_UNPACK_8A,
+        QPU_UNPACK_8B,
+        QPU_UNPACK_8C,
+        QPU_UNPACK_8D,
 };
 
 #define QPU_MASK(high, low) ((((uint64_t)1<<((high)-(low)+1))-1)<<(low))
index 525710585aedc7bbb5d256a56a5580bbfde6b992..403a18e6531c2c449ca3ca325da6877d497d04a7 100644 (file)
@@ -93,15 +93,18 @@ static const char *qpu_pack_mul[] = {
         [QPU_PACK_MUL_8D] = "8d",
 };
 
-static const char *qpu_unpack_r4[] = {
-        [QPU_UNPACK_R4_NOP] = "",
-        [QPU_UNPACK_R4_F16A_TO_F32] = "f16a",
-        [QPU_UNPACK_R4_F16B_TO_F32] = "f16b",
-        [QPU_UNPACK_R4_8D_REP] = "8d_rep",
-        [QPU_UNPACK_R4_8A] = "8a",
-        [QPU_UNPACK_R4_8B] = "8b",
-        [QPU_UNPACK_R4_8C] = "8c",
-        [QPU_UNPACK_R4_8D] = "8d",
+/* The QPU unpack for A and R4 files can be described the same, it's just that
+ * the R4 variants are convert-to-float only, with no int support.
+ */
+static const char *qpu_unpack[] = {
+        [QPU_UNPACK_NOP] = "",
+        [QPU_UNPACK_F16A_TO_F32] = "f16a",
+        [QPU_UNPACK_F16B_TO_F32] = "f16b",
+        [QPU_UNPACK_8D_REP] = "8d_rep",
+        [QPU_UNPACK_8A] = "8a",
+        [QPU_UNPACK_8B] = "8b",
+        [QPU_UNPACK_8C] = "8c",
+        [QPU_UNPACK_8D] = "8d",
 };
 
 static const char *special_read_a[] = {
@@ -300,9 +303,10 @@ print_alu_src(uint64_t inst, uint32_t mux)
                         fprintf(stderr, "%s", DESC(special_read_b, raddr - 32));
         }
 
-        if (mux == QPU_MUX_R4 && (inst & QPU_PM) &&
-            unpack != QPU_UNPACK_R4_NOP) {
-                fprintf(stderr, ".%s", DESC(qpu_unpack_r4, unpack));
+        if (unpack != QPU_UNPACK_NOP &&
+            ((mux == QPU_MUX_A && !(inst & QPU_PM)) ||
+             (mux == QPU_MUX_R4) && (inst & QPU_PM))) {
+                fprintf(stderr, ".%s", DESC(qpu_unpack, unpack));
         }
 }
 
index 9a5dfa47a5b64537069a735609448fa8db8052d7..3f30f2cd3c586159df90eb7f1e6aaa494381883f 100644 (file)
@@ -483,7 +483,7 @@ vc4_generate_code(struct vc4_context *vc4, struct vc4_compile *c)
                         assert(src[0].mux == QPU_MUX_R4);
                         queue(c, qpu_a_MOV(dst, src[0]));
                         *last_inst(c) |= QPU_PM;
-                        *last_inst(c) |= QPU_SET_FIELD(QPU_UNPACK_R4_8A +
+                        *last_inst(c) |= QPU_SET_FIELD(QPU_UNPACK_8A +
                                                        (qinst->op -
                                                         QOP_R4_UNPACK_A),
                                                        QPU_UNPACK);