nvir: introduce OP_SGXT
authorBen Skeggs <bskeggs@redhat.com>
Sat, 6 Jun 2020 23:51:56 +0000 (09:51 +1000)
committerMarge Bot <eric+marge@anholt.net>
Wed, 10 Jun 2020 22:52:41 +0000 (22:52 +0000)
Required for SM70 EXTBF lowering.

v2:
- added constant folding

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Reviewed-by: Karol Herbst <kherbst@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5377>

src/gallium/drivers/nouveau/codegen/nv50_ir.h
src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp
src/gallium/drivers/nouveau/codegen/nv50_ir_print.cpp
src/gallium/drivers/nouveau/codegen/nv50_ir_target.cpp

index baddd49d591bf9187d0e415a5901457c5a98c997..add0e270e567fbec88a7c882ca39e09f202b7d9e 100644 (file)
@@ -156,6 +156,7 @@ enum operation
    OP_BREV,   // bitfield reverse
    OP_BMSK,   // bitfield mask
    OP_PERMT,  // dst = bytes from src2,src0 selected by src1 (nvc0's src order)
+   OP_SGXT,
    OP_ATOM,
    OP_BAR,    // execution barrier, sources = { id, thread count, predicate }
    OP_VADD,   // byte/word vector operations
index e30e996499ba23b9dbefeac334d44e3a92bee219..669bfbcf548bc572508b34a32f3446e797662cae 100644 (file)
@@ -558,6 +558,16 @@ ConstantFolding::expr(Instruction *i,
    memset(&res.data, 0, sizeof(res.data));
 
    switch (i->op) {
+   case OP_SGXT: {
+      int bits = b->data.u32;
+      if (bits) {
+         uint32_t data = a->data.u32 & (0xffffffff >> (32 - bits));
+         if (bits < 32 && (data & (1 << (bits - 1))))
+            data = data - (1 << bits);
+         res.data.u32 = data;
+      }
+      break;
+   }
    case OP_BMSK:
       res.data.u32 = ((1 << b->data.u32) - 1) << a->data.u32;
       break;
index 8a8e95cd2729ab054a5fe9da21d58a051704fb9b..a0fd9eb08bf635d8095659e5248060ddd3ccb188 100644 (file)
@@ -182,6 +182,7 @@ const char *operationStr[OP_LAST + 1] =
    "brev",
    "bmsk",
    "permt",
+   "sgxt",
    "atom",
    "bar",
    "vadd",
index 97b025cf7a796c82169e079326c705f520c15503..3a772003271407a917119e1e0073ecd7b17142fb 100644 (file)
@@ -52,6 +52,7 @@ const uint8_t Target::operationSrcNr[] =
    1, 1,                   // DFDX, DFDY
    1, 2, 1, 2, 0, 0,       // RDSV, WRSV, PIXLD, QUADOP, QUADON, QUADPOP
    2, 3, 2, 1, 1, 2, 3,    // POPCNT, INSBF, EXTBF, BFIND, BREV, BMSK, PERMT
+   2,                      // SGXT
    2, 2,                   // ATOM, BAR
    2, 2, 2, 2, 3, 2,       // VADD, VAVG, VMIN, VMAX, VSAD, VSET,
    2, 2, 2, 1,             // VSHR, VSHL, VSEL, CCTL
@@ -120,9 +121,9 @@ const OpClass Target::operationClass[] =
    // DFDX, DFDY, RDSV, WRSV; PIXLD, QUADOP, QUADON, QUADPOP
    OPCLASS_OTHER, OPCLASS_OTHER, OPCLASS_OTHER, OPCLASS_OTHER,
    OPCLASS_OTHER, OPCLASS_OTHER, OPCLASS_CONTROL, OPCLASS_CONTROL,
-   // POPCNT, INSBF, EXTBF, BFIND, BREV, BMSK; PERMT
+   // POPCNT, INSBF, EXTBF, BFIND, BREV, BMSK; PERMT, SGXT
+   OPCLASS_BITFIELD, OPCLASS_BITFIELD, OPCLASS_BITFIELD, OPCLASS_BITFIELD,
    OPCLASS_BITFIELD, OPCLASS_BITFIELD, OPCLASS_BITFIELD, OPCLASS_BITFIELD,
-   OPCLASS_BITFIELD, OPCLASS_BITFIELD, OPCLASS_BITFIELD,
    // ATOM, BAR
    OPCLASS_ATOMIC, OPCLASS_CONTROL,
    // VADD, VAVG, VMIN, VMAX