nv50/ir: add CCTL (cache control) op
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Mon, 11 Mar 2013 16:34:05 +0000 (17:34 +0100)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Tue, 12 Mar 2013 11:55:37 +0000 (12:55 +0100)
src/gallium/drivers/nv50/codegen/nv50_ir.h
src/gallium/drivers/nv50/codegen/nv50_ir_peephole.cpp
src/gallium/drivers/nv50/codegen/nv50_ir_print.cpp
src/gallium/drivers/nv50/codegen/nv50_ir_target.cpp
src/gallium/drivers/nvc0/codegen/nv50_ir_emit_nvc0.cpp

index 7862724411e799975924b58bebdc11c496421777..236673c24891beb43044eb20ac67c093a0adcec6 100644 (file)
@@ -153,6 +153,7 @@ enum operation
    OP_VSHR,
    OP_VSHL,
    OP_VSEL,
+   OP_CCTL, // cache control
    OP_LAST
 };
 
@@ -199,6 +200,8 @@ enum operation
 #define NV50_IR_SUBOP_ATOM_XOR      7
 #define NV50_IR_SUBOP_ATOM_CAS      8
 #define NV50_IR_SUBOP_ATOM_EXCH     9
+#define NV50_IR_SUBOP_CCTL_IV      5
+#define NV50_IR_SUBOP_CCTL_IVALL   6
 #define NV50_IR_SUBOP_SUST_IGN     0
 #define NV50_IR_SUBOP_SUST_TRAP    1
 #define NV50_IR_SUBOP_SUST_SDCL    3
index 2926907cdf19a2dbc180815c57a0f38dc94c842d..aee3d55c22a46e5809453e5bc2869b00d52593bc 100644 (file)
@@ -1791,7 +1791,7 @@ MemoryOpt::runOpt(BasicBlock *bb)
             purgeRecords(NULL, FILE_MEMORY_SHARED);
             purgeRecords(NULL, FILE_SHADER_OUTPUT);
          } else
-         if (ldst->op == OP_ATOM) {
+         if (ldst->op == OP_ATOM || ldst->op == OP_CCTL) {
             if (ldst->src(0).getFile() == FILE_MEMORY_GLOBAL) {
                purgeRecords(NULL, FILE_MEMORY_LOCAL);
                purgeRecords(NULL, FILE_MEMORY_GLOBAL);
index 1c3b768259a380f215a0bca1503e4a4c62d44d72..c7121bf1340c082251bdcb1724585bcdf12bf31f 100644 (file)
@@ -183,6 +183,7 @@ const char *operationStr[OP_LAST + 1] =
    "vshr",
    "vshl",
    "vsel",
+   "cctl",
    "(invalid)"
 };
 
index 1b6d1830ee51ed1d8f9f384a1a057102cb0e0407..63da152d164b37fa7f65efb57035d35c6f84a7d3 100644 (file)
@@ -53,7 +53,7 @@ const uint8_t Target::operationSrcNr[OP_LAST + 1] =
    2, 3, 2, 3,             // POPCNT, INSBF, EXTBF, PERMT
    2, 2,                   // ATOM, BAR
    2, 2, 2, 2, 3, 2,       // VADD, VAVG, VMIN, VMAX, VSAD, VSET,
-   2, 2, 2,                // VSHR, VSHL, VSEL
+   2, 2, 2, 1,             // VSHR, VSHL, VSEL, CCTL
    0
 };
 
@@ -123,8 +123,8 @@ const OpClass Target::operationClass[OP_LAST + 1] =
    OPCLASS_VECTOR, OPCLASS_VECTOR, OPCLASS_VECTOR, OPCLASS_VECTOR,
    // VSAD, VSET, VSHR, VSHL
    OPCLASS_VECTOR, OPCLASS_VECTOR, OPCLASS_VECTOR, OPCLASS_VECTOR,
-   // VSEL
-   OPCLASS_VECTOR,
+   // VSEL, CCTL
+   OPCLASS_VECTOR, OPCLASS_CONTROL,
    OPCLASS_PSEUDO // LAST
 };
 
index 64207d71aace3d2d62a3d11c5137927dced2ea0b..ba2f73be9c26ae64ab022f73d4563838115e78cc 100644 (file)
@@ -82,6 +82,7 @@ private:
    void emitMOV(const Instruction *);
    void emitATOM(const Instruction *);
    void emitMEMBAR(const Instruction *);
+   void emitCCTL(const Instruction *);
 
    void emitINTERP(const Instruction *);
    void emitPFETCH(const Instruction *);
@@ -1885,6 +1886,27 @@ CodeEmitterNVC0::emitMEMBAR(const Instruction *i)
    emitPredicate(i);
 }
 
+void
+CodeEmitterNVC0::emitCCTL(const Instruction *i)
+{
+   code[0] = 0x00000005 | (i->subOp << 5);
+
+   if (i->src(0).getFile() == FILE_MEMORY_GLOBAL) {
+      code[1] = 0x98000000;
+      srcAddr32(i->src(0), 28, 2);
+   } else {
+      code[1] = 0xd0000000;
+      setAddress24(i->src(0));
+   }
+   if (uses64bitAddress(i))
+      code[1] |= 1 << 26;
+   srcId(i->src(0).getIndirect(0), 20);
+
+   emitPredicate(i);
+
+   defId(i, 0, 14);
+}
+
 void
 CodeEmitterNVC0::emitSUCLAMPMode(uint16_t subOp)
 {
@@ -2348,6 +2370,9 @@ CodeEmitterNVC0::emitInstruction(Instruction *insn)
    case OP_MEMBAR:
       emitMEMBAR(insn);
       break;
+   case OP_CCTL:
+      emitCCTL(insn);
+      break;
    case OP_VSHL:
       emitVSHL(insn);
       break;