pan/bi: Add swizzles
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Tue, 3 Mar 2020 13:35:51 +0000 (08:35 -0500)
committerMarge Bot <eric+marge@anholt.net>
Thu, 5 Mar 2020 14:35:38 +0000 (14:35 +0000)
Requires a new field on bifrost_instruction, as well as a new class
property and a new class for the dedicated swizzle ops.

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

src/panfrost/bifrost/bi_tables.c
src/panfrost/bifrost/compiler.h

index 97244817301ffb4c7ccd640047e2d8de953b36bf..5d3de06e2227818bf22c0fc2eec230ff9830c816 100644 (file)
@@ -33,7 +33,7 @@ unsigned bi_class_props[BI_NUM_CLASSES] = {
         [BI_CMP]               = BI_GENERIC | BI_MODS | BI_SCHED_ALL,
         [BI_BLEND]             = BI_ADD,
         [BI_BITWISE]           = BI_GENERIC | BI_SCHED_ALL,
-        [BI_CONVERT]           = BI_SCHED_ALL,
+        [BI_CONVERT]           = BI_SCHED_ALL | BI_SWIZZLABLE,
         [BI_CSEL]              = BI_SCHED_FMA,
         [BI_DISCARD]           = BI_SCHED_ADD,
         [BI_FMA]               = BI_ROUNDMODE | BI_SCHED_FMA,
@@ -48,6 +48,7 @@ unsigned bi_class_props[BI_NUM_CLASSES] = {
         [BI_STORE]             = BI_SCHED_ADD,
         [BI_STORE_VAR]                 = BI_SCHED_ADD,
         [BI_SPECIAL]           = BI_SCHED_ADD | BI_SCHED_SLOW,
+        [BI_SWIZZLE]            = BI_SCHED_ALL | BI_SWIZZLABLE,
         [BI_TEX]               = BI_SCHED_ADD,
         [BI_ROUND]             = BI_GENERIC | BI_ROUNDMODE | BI_SCHED_ALL,
 };
index 6eddf448ad793aaed3a4a0ea28d5affa269e7dad..5385f21d4b51c37bf31b8ce443f110ffd3ffde5c 100644 (file)
@@ -67,6 +67,7 @@ enum bi_class {
         BI_STORE,
         BI_STORE_VAR,
         BI_SPECIAL, /* _FAST, _TABLE on supported GPUs */
+        BI_SWIZZLE,
         BI_TEX,
         BI_ROUND,
         BI_NUM_CLASSES
@@ -99,6 +100,9 @@ extern unsigned bi_class_props[BI_NUM_CLASSES];
  * nopped out. Used for _FAST operations. */
 #define BI_SCHED_SLOW (1 << 5)
 
+/* Swizzling allowed for the 8/16-bit source */
+#define BI_SWIZZLABLE (1 << 6)
+
 /* It can't get any worse than csel4... can it? */
 #define BIR_SRC_COUNT 4
 
@@ -171,6 +175,13 @@ typedef struct {
          * int). Zero if there is no destination. Bitsize included */
         nir_alu_type dest_type;
 
+        /* If the source type is 8-bit or 16-bit such that SIMD is possible, and
+         * the class has BI_SWIZZLABLE, this is a swizzle for the input. Swizzles
+         * in practice only occur with one-source arguments (conversions,
+         * dedicated swizzle ops) and as component selection on two-sources
+         * where it is unambiguous which is which. Bounds are 32/type_size. */
+        unsigned swizzle[4];
+
         /* A class-specific op from which the actual opcode can be derived
          * (along with the above information) */