pan/bi: Expand out FMA conversion opcodes
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Fri, 27 Mar 2020 22:34:21 +0000 (18:34 -0400)
committerMarge Bot <eric+marge@anholt.net>
Tue, 31 Mar 2020 01:12:26 +0000 (01:12 +0000)
There are a *lot* of them, with lots of symmetry we can exploit to
simplify the packing logic (but not entirely). Let's add the
corresponding header structs/defines, although we don't actually poke
the disassembler at this stage.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4382>

src/panfrost/bifrost/bifrost.h
src/panfrost/bifrost/disassemble.c

index 77a641d71357cb0e6fde34aa6b6099f54ddac663..1c06968d70a26dafbce1625af3366de7a3000a09 100644 (file)
@@ -283,6 +283,40 @@ struct bifrost_shift_add {
         unsigned op : 7;
 } __attribute__((packed));
 
+#define BIFROST_FMA_INT16_TO_32 (0xe0198 >> 3)
+
+struct bifrost_fma_int16_to_32 {
+        unsigned src0 : 3;
+        unsigned is_unsigned : 1;
+        unsigned swizzle : 1;
+        unsigned to_float : 1;
+        unsigned op : 17;
+} __attribute__((packed));
+
+/* We could combine but it's easier to just use FMA_ONE_SRC */
+#define BIFROST_FMA_FLOAT16_TO_32(y) (0xe01a2 | ((y) ? 1 : 0))
+
+/* Two sources for vectorization */
+#define BIFROST_FMA_FLOAT32_TO_16 (0xdd000 >> 3)
+
+/* Again we could combine but easier to just ONE_SRC with an
+ * argumnt for unsignedness */
+#define BIFROST_FMA_FLOAT32_TO_INT(u) (0xe0136 | ((u) ? 1 : 0))
+#define BIFROST_FMA_INT_TO_FLOAT32(u) (0xe0178 | ((u) ? 1 : 0))
+
+/* Used for f2i16 and i2f16 */
+#define BIFROST_FMA_F2I16 (0xe00)
+
+struct bifrost_fma_f2i_i2f16 {
+        unsigned src0 : 3;
+        unsigned is_unsigned : 1;
+        unsigned direction : 2; /* 00 for i2f, 11 for f2i */
+        unsigned swizzle : 2;
+        unsigned unk : 2; /* always 10 */
+        unsigned direction_2 : 1; /* 0 for f2i, 1 for i2f */
+        unsigned op : 12;
+} __attribute__((packed));
+
 enum bifrost_ldst_type {
         BIFROST_LDST_F16 = 0,
         BIFROST_LDST_F32 = 1,
index e025d5c89d4d90e9ed9b569026a10d7eb9297443..cef8b58462e4fc2f1a78143a380eb0de90a9c1b3 100644 (file)
@@ -480,6 +480,8 @@ static const struct fma_op_info FMAOpInfos[] = {
         { false, 0xd8000, "ADD.v2f16", FMA_FADD16 },
         { false, 0xdc000, "CSEL4.v16", FMA_CSEL4 },
         { false, 0xdd000, "F32_TO_F16", FMA_TWO_SRC },
+
+        /* TODO: Combine to bifrost_fma_f2i_i2f16 */
         { true,  0x00046, "F16_TO_I16.XX", FMA_ONE_SRC },
         { true,  0x00047, "F16_TO_U16.XX", FMA_ONE_SRC },
         { true,  0x0004e, "F16_TO_I16.YX", FMA_ONE_SRC },
@@ -496,10 +498,13 @@ static const struct fma_op_info FMAOpInfos[] = {
         { true,  0x000d1, "U16_TO_F16.XY", FMA_ONE_SRC },
         { true,  0x000d8, "I16_TO_F16.YY", FMA_ONE_SRC },
         { true,  0x000d9, "U16_TO_F16.YY", FMA_ONE_SRC },
+
         { true,  0x00136, "F32_TO_I32", FMA_ONE_SRC },
         { true,  0x00137, "F32_TO_U32", FMA_ONE_SRC },
         { true,  0x00178, "I32_TO_F32", FMA_ONE_SRC },
         { true,  0x00179, "U32_TO_F32", FMA_ONE_SRC },
+
+        /* TODO: cleanup to use bifrost_fma_int16_to_32 */
         { true,  0x00198, "I16_TO_I32.X", FMA_ONE_SRC },
         { true,  0x00199, "U16_TO_U32.X", FMA_ONE_SRC },
         { true,  0x0019a, "I16_TO_I32.Y", FMA_ONE_SRC },
@@ -508,8 +513,10 @@ static const struct fma_op_info FMAOpInfos[] = {
         { true,  0x0019d, "U16_TO_F32.X", FMA_ONE_SRC },
         { true,  0x0019e, "I16_TO_F32.Y", FMA_ONE_SRC },
         { true,  0x0019f, "U16_TO_F32.Y", FMA_ONE_SRC },
+
         { true,  0x001a2, "F16_TO_F32.X", FMA_ONE_SRC },
         { true,  0x001a3, "F16_TO_F32.Y", FMA_ONE_SRC },
+
         { true,  0x0032c, "NOP",  FMA_ONE_SRC },
         { true,  0x0032d, "MOV",  FMA_ONE_SRC },
         { true,  0x0032f, "SWZ.YY.v2i16",  FMA_ONE_SRC },