nv50_ir_build_util.h revision 57594065c30feec9376be9b2132659f7d87362ee
157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#ifndef __NV50_IR_BUILD_UTIL__
357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define __NV50_IR_BUILD_UTIL__
457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillernamespace nv50_ir {
657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
757594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerclass BuildUtil
857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
957594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerpublic:
1057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   BuildUtil();
1157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
1257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   inline void setProgram(Program *);
1357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   inline Program *getProgram() const { return prog; }
1457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   inline Function *getFunction() const { return func; }
1557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
1657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   // keeps inserting at head/tail of block
1757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   inline void setPosition(BasicBlock *, bool tail);
1857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   // position advances only if @after is true
1957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   inline void setPosition(Instruction *, bool after);
2057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
2157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   inline BasicBlock *getBB() { return bb; }
2257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
2357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   inline void insert(Instruction *);
2457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   inline void remove(Instruction *i) { assert(i->bb == bb); bb->remove(i); }
2557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
2657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   inline LValue *getScratch(int size = 4);
2757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   inline LValue *getSSA(int size = 4); // scratch value for a single assignment
2857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
2957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   inline Instruction *mkOp(operation, DataType, Value *);
3057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Instruction *mkOp1(operation, DataType, Value *, Value *);
3157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Instruction *mkOp2(operation, DataType, Value *, Value *, Value *);
3257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Instruction *mkOp3(operation, DataType, Value *, Value *, Value *, Value *);
3357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
3457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   LValue *mkOp1v(operation, DataType, Value *, Value *);
3557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   LValue *mkOp2v(operation, DataType, Value *, Value *, Value *);
3657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   LValue *mkOp3v(operation, DataType, Value *, Value *, Value *, Value *);
3757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
3857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   LValue *mkLoad(DataType, Symbol *, Value *ptr);
3957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Instruction *mkStore(operation, DataType, Symbol *, Value *ptr, Value *val);
4057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
4157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Instruction *mkMov(Value *, Value *, DataType = TYPE_U32);
4257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Instruction *mkMovToReg(int id, Value *);
4357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Instruction *mkMovFromReg(Value *, int id);
4457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
4557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Instruction *mkFetch(Value *, DataType, DataFile, int32_t offset,
4657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller                        Value *attrRel, Value *primRel);
4757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
4857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Instruction *mkCvt(operation, DataType, Value *, DataType, Value *);
4957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Instruction *mkCmp(operation, CondCode, DataType,
5057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller                      Value *,
5157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller                      Value *, Value *, Value * = NULL);
5257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Instruction *mkTex(operation, TexTarget, uint8_t tic, uint8_t tsc,
5357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller                      Value **def, Value **src);
5457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Instruction *mkQuadop(uint8_t qop, Value *, uint8_t l, Value *, Value *);
5557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
5657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   FlowInstruction *mkFlow(operation, BasicBlock *target,
5757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller                           CondCode, Value *pred);
5857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
5957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Instruction *mkSelect(Value *pred, Value *dst, Value *trSrc, Value *flSrc);
6057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
6157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   void mkClobber(DataFile file, uint32_t regMask, int regUnitLog2);
6257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
6357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   ImmediateValue *mkImm(float);
6457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   ImmediateValue *mkImm(uint32_t);
6557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   ImmediateValue *mkImm(uint64_t);
6657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
6757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   ImmediateValue *mkImm(int i) { return mkImm((uint32_t)i); }
6857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
6957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Value *loadImm(Value *dst, float);
7057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Value *loadImm(Value *dst, uint32_t);
7157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Value *loadImm(Value *dst, uint64_t);
7257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
7357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Value *loadImm(Value *dst, int i) { return loadImm(dst, (uint32_t)i); }
7457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
7557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   class DataArray
7657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   {
7757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   public:
7857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      DataArray();
7957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      DataArray(BuildUtil *);
8057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      ~DataArray();
8157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
8257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      inline void setParent(BuildUtil *bld) { assert(!up); up = bld; }
8357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
8457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      void setup(uint32_t base, int len, int vecDim, int size,
8557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller                 DataFile, int8_t fileIndex = 0);
8657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
8757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      inline bool exists(unsigned int i, unsigned int c);
8857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
8957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      Value *load(int i, int c, Value *ptr);
9057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      void store(int i, int c, Value *ptr, Value *value);
9157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      Value *acquire(int i, int c);
9257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
9357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   private:
9457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      Symbol *mkSymbol(int i, int c, Symbol *base);
9557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
9657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   private:
9757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      Value **values;
9857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      uint32_t baseAddr;
9957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      uint32_t arrayLen;
10057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      Symbol *baseSym;
10157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
10257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      uint8_t vecDim;
10357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      uint8_t eltSize; // in bytes
10457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
10557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      DataFile file;
10657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      bool regOnly;
10757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
10857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      BuildUtil *up;
10957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
11057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      void init();
11157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   };
11257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
11357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Symbol *mkSymbol(DataFile file, int8_t fileIndex,
11457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller                    DataType ty, uint32_t baseAddress);
11557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
11657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Symbol *mkSysVal(SVSemantic svName, uint32_t svIndex);
11757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
11857594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerprivate:
11957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   void addImmediate(ImmediateValue *);
12057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   inline unsigned int u32Hash(uint32_t);
12157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
12257594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerprotected:
12357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Program *prog;
12457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Function *func;
12557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Instruction *pos;
12657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   BasicBlock *bb;
12757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   bool tail;
12857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
12957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define NV50_IR_BUILD_IMM_HT_SIZE 256
13057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
13157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   ImmediateValue *imms[NV50_IR_BUILD_IMM_HT_SIZE];
13257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   unsigned int immCount;
13357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller};
13457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
13557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerunsigned int BuildUtil::u32Hash(uint32_t u)
13657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
13757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   return (u % 273) % NV50_IR_BUILD_IMM_HT_SIZE;
13857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
13957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
14057594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid BuildUtil::setProgram(Program *program)
14157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
14257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   prog = program;
14357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
14457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
14557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid
14657594065c30feec9376be9b2132659f7d87362eeChristoph BumillerBuildUtil::setPosition(BasicBlock *block, bool atTail)
14757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
14857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   bb = block;
14957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   prog = bb->getProgram();
15057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   func = bb->getFunction();
15157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   pos = NULL;
15257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   tail = atTail;
15357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
15457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
15557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid
15657594065c30feec9376be9b2132659f7d87362eeChristoph BumillerBuildUtil::setPosition(Instruction *i, bool after)
15757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
15857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   bb = i->bb;
15957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   prog = bb->getProgram();
16057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   func = bb->getFunction();
16157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   pos = i;
16257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   tail = after;
16357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   assert(bb);
16457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
16557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
16657594065c30feec9376be9b2132659f7d87362eeChristoph BumillerLValue *
16757594065c30feec9376be9b2132659f7d87362eeChristoph BumillerBuildUtil::getScratch(int size)
16857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
16957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   LValue *lval = new_LValue(func, FILE_GPR);
17057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   if (size != 4)
17157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      lval->reg.size = size;
17257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   return lval;
17357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
17457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
17557594065c30feec9376be9b2132659f7d87362eeChristoph BumillerLValue *
17657594065c30feec9376be9b2132659f7d87362eeChristoph BumillerBuildUtil::getSSA(int size)
17757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
17857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   LValue *lval = new_LValue(func, FILE_GPR);
17957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   lval->ssa = 1;
18057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   if (size != 4)
18157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      lval->reg.size = size;
18257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   return lval;
18357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
18457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
18557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid BuildUtil::insert(Instruction *i)
18657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
18757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   if (!pos) {
18857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      tail ? bb->insertTail(i) : bb->insertHead(i);
18957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   } else {
19057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      if (tail) {
19157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller         bb->insertAfter(pos, i);
19257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller         pos = i;
19357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      } else {
19457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller         bb->insertBefore(pos, i);
19557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      }
19657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   }
19757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
19857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
19957594065c30feec9376be9b2132659f7d87362eeChristoph BumillerInstruction *
20057594065c30feec9376be9b2132659f7d87362eeChristoph BumillerBuildUtil::mkOp(operation op, DataType ty, Value *dst)
20157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
20257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Instruction *insn = new_Instruction(func, op, ty);
20357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   insn->setDef(0, dst);
20457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   insert(insn);
20557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   if (op == OP_DISCARD || op == OP_EXIT ||
20657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller       op == OP_JOIN ||
20757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller       op == OP_QUADON || op == OP_QUADPOP ||
20857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller       op == OP_EMIT || op == OP_RESTART)
20957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      insn->fixed = 1;
21057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   return insn;
21157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
21257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
21357594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerinline LValue *
21457594065c30feec9376be9b2132659f7d87362eeChristoph BumillerBuildUtil::mkOp1v(operation op, DataType ty, Value *dst, Value *src)
21557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
21657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   mkOp1(op, ty, dst, src);
21757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   return dst->asLValue();
21857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
21957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
22057594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerinline LValue *
22157594065c30feec9376be9b2132659f7d87362eeChristoph BumillerBuildUtil::mkOp2v(operation op, DataType ty, Value *dst,
22257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller                  Value *src0, Value *src1)
22357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
22457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   mkOp2(op, ty, dst, src0, src1);
22557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   return dst->asLValue();
22657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
22757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
22857594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerinline LValue *
22957594065c30feec9376be9b2132659f7d87362eeChristoph BumillerBuildUtil::mkOp3v(operation op, DataType ty, Value *dst,
23057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller                  Value *src0, Value *src1, Value *src2)
23157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
23257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   mkOp3(op, ty, dst, src0, src1, src2);
23357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   return dst->asLValue();
23457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
23557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
23657594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerbool
23757594065c30feec9376be9b2132659f7d87362eeChristoph BumillerBuildUtil::DataArray::exists(unsigned int i, unsigned int c)
23857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
23957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   assert(i < arrayLen && c < vecDim);
24057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   return !regOnly || values[i * vecDim + c];
24157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
24257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
24357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} // namespace nv50_ir
24457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
24557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#endif // __NV50_IR_BUILD_UTIL_H__
246