nv50/ir: add isAccessSupported check for memory access coalescing
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Fri, 6 Apr 2012 16:34:44 +0000 (18:34 +0200)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Sat, 14 Apr 2012 19:54:00 +0000 (21:54 +0200)
src/gallium/drivers/nv50/codegen/nv50_ir_inlines.h
src/gallium/drivers/nv50/codegen/nv50_ir_peephole.cpp
src/gallium/drivers/nv50/codegen/nv50_ir_target.h
src/gallium/drivers/nvc0/codegen/nv50_ir_emit_nvc0.cpp
src/gallium/drivers/nvc0/codegen/nv50_ir_target_nvc0.cpp
src/gallium/drivers/nvc0/codegen/nv50_ir_target_nvc0.h

index 0137da3b85b273c2e19bce6ff81450a89e3872ee..0352cafb1caa9c38ab7e1b73e025f0a1bdc86926 100644 (file)
@@ -82,8 +82,9 @@ static inline DataType typeOfSize(unsigned int size,
    case 12: return TYPE_B96;
    case 16: return TYPE_B128;
    case 4:
-   default:
       return flt ? TYPE_F32 : (sgn ? TYPE_S32 : TYPE_U32);
+   default:
+      return TYPE_NONE;
    }
 }
 
index 43d6b21a3f63f7b73a8fe6f241910aaa454cadc8..9ffc75c685abcc02e8da4f96234ae112934d7853 100644 (file)
@@ -1212,8 +1212,8 @@ MemoryOpt::combineLd(Record *rec, Instruction *ld)
    int size = sizeRc + sizeLd;
    int d, j;
 
-   // only VFETCH can do a 96 byte load
-   if (ld->op != OP_VFETCH && size == 12)
+   if (!prog->getTarget()->
+       isAccessSupported(ld->getSrc(0)->reg.file, typeOfSize(size)))
       return false;
    // no unaligned loads
    if (((size == 0x8) && (MIN2(offLd, offRc) & 0x7)) ||
@@ -1267,7 +1267,8 @@ MemoryOpt::combineSt(Record *rec, Instruction *st)
    Value *src[4]; // no modifiers in ValueRef allowed for st
    Value *extra[3];
 
-   if (size == 12) // XXX: check if EXPORT a[] can do this after all
+   if (!prog->getTarget()->
+       isAccessSupported(st->getSrc(0)->reg.file, typeOfSize(size)))
       return false;
    if (size == 8 && MIN2(offRc, offSt) & 0x7)
       return false;
index d3e32caa363a4089b394c1d45e7fcde49e2ba6ce..b685eca0f1d8ef5a01a2f41128b12dc7b6c556e9 100644 (file)
@@ -138,6 +138,7 @@ public:
    virtual bool insnCanLoad(const Instruction *insn, int s,
                             const Instruction *ld) const = 0;
    virtual bool isOpSupported(operation, DataType) const = 0;
+   virtual bool isAccessSupported(DataFile, DataType) const = 0;
    virtual bool isModSupported(const Instruction *,
                                int s, Modifier) const = 0;
    virtual bool isSatSupported(const Instruction *) const = 0;
index da2c885eb87b7613f51abb48672431de9782e51f..7468733f699159f55c46b5568473b3aae80ae339 100644 (file)
@@ -1190,7 +1190,7 @@ CodeEmitterNVC0::emitEXPORT(const Instruction *i)
    code[0] = 0x00000006 | ((size / 4 - 1) << 5);
    code[1] = 0x0a000000 | i->src[0].get()->reg.data.offset;
 
-   assert(size != 12 && !(code[1] & (size - 1)));
+   assert(!(code[1] & ((size == 12) ? 15 : (size - 1))));
 
    if (i->perPatch)
       code[0] |= 0x100;
index 8e9386494e6901bd41c988d3c43dd55ce6717070..bcc2c43a55fd41bfe5e912171bb127e0662c80a0 100644 (file)
@@ -440,6 +440,16 @@ TargetNVC0::insnCanLoad(const Instruction *i, int s,
    return true;
 }
 
+bool
+TargetNVC0::isAccessSupported(DataFile file, DataType ty) const
+{
+   if (ty == TYPE_NONE)
+      return false;
+   if (ty == TYPE_B96)
+      return (file == FILE_SHADER_INPUT) || (file == FILE_SHADER_OUTPUT);
+   return true;
+}
+
 bool
 TargetNVC0::isOpSupported(operation op, DataType ty) const
 {
index 2522d1ea288363d79c9512d976bc15a04f27d733..1a49f3699206eae8156ac3ac8e2cd7c63195a1ee 100644 (file)
@@ -45,6 +45,7 @@ public:
    virtual bool insnCanLoad(const Instruction *insn, int s,
                             const Instruction *ld) const;
    virtual bool isOpSupported(operation, DataType) const;
+   virtual bool isAccessSupported(DataFile, DataType) const;
    virtual bool isModSupported(const Instruction *, int s, Modifier) const;
    virtual bool isSatSupported(const Instruction *) const;
    virtual bool mayPredicate(const Instruction *, const Value *) const;