1d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller/*
2d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * Copyright 2011 Christoph Bumiller
3d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller *
4d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * Permission is hereby granted, free of charge, to any person obtaining a
5d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * copy of this software and associated documentation files (the "Software"),
6d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * to deal in the Software without restriction, including without limitation
7d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * and/or sell copies of the Software, and to permit persons to whom the
9d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * Software is furnished to do so, subject to the following conditions:
10d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller *
11d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * The above copyright notice and this permission notice shall be included in
12d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * all copies or substantial portions of the Software.
13d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller *
14d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
19d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller * SOFTWARE.
21d2d19ea51fa3575a8d014a69a9b835c335728817Christoph Bumiller */
2257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
2357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#ifndef __NV50_IR_BUILD_UTIL__
2457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define __NV50_IR_BUILD_UTIL__
2557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
2657594065c30feec9376be9b2132659f7d87362eeChristoph Bumillernamespace nv50_ir {
2757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
2857594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerclass BuildUtil
2957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
3057594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerpublic:
3157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   BuildUtil();
3256d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez   BuildUtil(Program *);
3357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
3457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   inline void setProgram(Program *);
3557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   inline Program *getProgram() const { return prog; }
3657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   inline Function *getFunction() const { return func; }
3757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
3857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   // keeps inserting at head/tail of block
3957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   inline void setPosition(BasicBlock *, bool tail);
4057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   // position advances only if @after is true
4157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   inline void setPosition(Instruction *, bool after);
4257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
4357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   inline BasicBlock *getBB() { return bb; }
4457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
4557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   inline void insert(Instruction *);
4657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   inline void remove(Instruction *i) { assert(i->bb == bb); bb->remove(i); }
4757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
4856cf2da02226aee6b7476675c0e05ac7c218756eChristoph Bumiller   inline LValue *getScratch(int size = 4, DataFile = FILE_GPR);
49322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller   // scratch value for a single assignment:
50322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller   inline LValue *getSSA(int size = 4, DataFile = FILE_GPR);
5157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
5257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   inline Instruction *mkOp(operation, DataType, Value *);
5357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Instruction *mkOp1(operation, DataType, Value *, Value *);
5457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Instruction *mkOp2(operation, DataType, Value *, Value *, Value *);
5557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Instruction *mkOp3(operation, DataType, Value *, Value *, Value *, Value *);
5657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
5757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   LValue *mkOp1v(operation, DataType, Value *, Value *);
5857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   LValue *mkOp2v(operation, DataType, Value *, Value *, Value *);
5957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   LValue *mkOp3v(operation, DataType, Value *, Value *, Value *, Value *);
6057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
6157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   LValue *mkLoad(DataType, Symbol *, Value *ptr);
6257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Instruction *mkStore(operation, DataType, Symbol *, Value *ptr, Value *val);
6357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
6457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Instruction *mkMov(Value *, Value *, DataType = TYPE_U32);
6557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Instruction *mkMovToReg(int id, Value *);
6657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Instruction *mkMovFromReg(Value *, int id);
6757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
6852c8c52b222e1fdb4c1f4ca3dedde9cd7b9c321fChristoph Bumiller   Instruction *mkInterp(unsigned mode, Value *, int32_t offset, Value *rel);
6957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Instruction *mkFetch(Value *, DataType, DataFile, int32_t offset,
7057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller                        Value *attrRel, Value *primRel);
7157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
7257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Instruction *mkCvt(operation, DataType, Value *, DataType, Value *);
73bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller   CmpInstruction *mkCmp(operation, CondCode, DataType,
74bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller			 Value *,
75bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller			 Value *, Value *, Value * = NULL);
7657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Instruction *mkTex(operation, TexTarget, uint8_t tic, uint8_t tsc,
7757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller                      Value **def, Value **src);
7857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Instruction *mkQuadop(uint8_t qop, Value *, uint8_t l, Value *, Value *);
7957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
809bb36d54a2c69ebdc9d1c9c4c71945060de8c860Francisco Jerez   FlowInstruction *mkFlow(operation, void *target, CondCode, Value *pred);
8157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
8257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Instruction *mkSelect(Value *pred, Value *dst, Value *trSrc, Value *flSrc);
8357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
84dffc2fb4e659f41b30e80e23ceb833d53417fb8eChristoph Bumiller   Instruction *mkSplit(Value *half[2], uint8_t halfSize, Value *);
85dffc2fb4e659f41b30e80e23ceb833d53417fb8eChristoph Bumiller
8657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   void mkClobber(DataFile file, uint32_t regMask, int regUnitLog2);
8757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
8857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   ImmediateValue *mkImm(float);
8957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   ImmediateValue *mkImm(uint32_t);
9057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   ImmediateValue *mkImm(uint64_t);
9157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
9257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   ImmediateValue *mkImm(int i) { return mkImm((uint32_t)i); }
9357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
9457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Value *loadImm(Value *dst, float);
9557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Value *loadImm(Value *dst, uint32_t);
9657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Value *loadImm(Value *dst, uint64_t);
9757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
9857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Value *loadImm(Value *dst, int i) { return loadImm(dst, (uint32_t)i); }
9957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
10056d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez   struct Location
10156d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez   {
10256d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez      Location(unsigned array, unsigned arrayIdx, unsigned i, unsigned c)
10356d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez         : array(array), arrayIdx(arrayIdx), i(i), c(c) { }
10456d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez      Location(const Location &l)
10556d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez         : array(l.array), arrayIdx(l.arrayIdx), i(l.i), c(l.c) { }
10656d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez
10756d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez      bool operator==(const Location &l) const
10856d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez      {
10956d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez         return
11056d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez            array == l.array && arrayIdx == l.arrayIdx && i == l.i && c == l.c;
11156d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez      }
11256d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez
11356d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez      bool operator<(const Location &l) const
11456d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez      {
11556d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez         return array != l.array ? array < l.array :
11656d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez            arrayIdx != l.arrayIdx ? arrayIdx < l.arrayIdx :
11756d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez            i != l.i ? i < l.i :
11856d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez            c != l.c ? c < l.c :
11956d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez            false;
12056d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez      }
12156d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez
12256d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez      unsigned array, arrayIdx, i, c;
12356d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez   };
12456d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez
12556d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez   typedef bimap<Location, Value *> ValueMap;
12656d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez
12757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   class DataArray
12857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   {
12957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   public:
13056d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez      DataArray(BuildUtil *bld) : up(bld) { }
13157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
13256d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez      void setup(unsigned array, unsigned arrayIdx,
13356d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez                 uint32_t base, int len, int vecDim, int eltSize,
13456d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez                 DataFile file, int8_t fileIdx);
13557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
13656d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez      inline bool exists(ValueMap&, unsigned int i, unsigned int c);
13757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
13856d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez      Value *load(ValueMap&, int i, int c, Value *ptr);
13956d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez      void store(ValueMap&, int i, int c, Value *ptr, Value *value);
14056d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez      Value *acquire(ValueMap&, int i, int c);
14157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
14257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   private:
14356d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez      inline Value *lookup(ValueMap&, unsigned i, unsigned c);
14456d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez      inline Value *insert(ValueMap&, unsigned i, unsigned c, Value *v);
14556d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez
14656d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez      Symbol *mkSymbol(int i, int c);
14757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
14857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   private:
14956d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez      BuildUtil *up;
15056d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez      unsigned array, arrayIdx;
15156d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez
15257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      uint32_t baseAddr;
15357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      uint32_t arrayLen;
15457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      Symbol *baseSym;
15557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
15657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      uint8_t vecDim;
15757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      uint8_t eltSize; // in bytes
15857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
15957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      DataFile file;
16057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      bool regOnly;
16157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   };
16257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
16357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Symbol *mkSymbol(DataFile file, int8_t fileIndex,
16457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller                    DataType ty, uint32_t baseAddress);
16557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
16657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Symbol *mkSysVal(SVSemantic svName, uint32_t svIndex);
16757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
16857594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerprivate:
16956d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez   void init(Program *);
17057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   void addImmediate(ImmediateValue *);
17157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   inline unsigned int u32Hash(uint32_t);
17257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
17357594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerprotected:
17457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Program *prog;
17557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Function *func;
17657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Instruction *pos;
17757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   BasicBlock *bb;
17857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   bool tail;
17957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
18057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define NV50_IR_BUILD_IMM_HT_SIZE 256
18157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
18257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   ImmediateValue *imms[NV50_IR_BUILD_IMM_HT_SIZE];
18357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   unsigned int immCount;
18457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller};
18557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
18657594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerunsigned int BuildUtil::u32Hash(uint32_t u)
18757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
18857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   return (u % 273) % NV50_IR_BUILD_IMM_HT_SIZE;
18957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
19057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
19157594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid BuildUtil::setProgram(Program *program)
19257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
19357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   prog = program;
19457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
19557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
19657594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid
19757594065c30feec9376be9b2132659f7d87362eeChristoph BumillerBuildUtil::setPosition(BasicBlock *block, bool atTail)
19857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
19957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   bb = block;
20057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   prog = bb->getProgram();
20157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   func = bb->getFunction();
20257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   pos = NULL;
20357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   tail = atTail;
20457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
20557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
20657594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid
20757594065c30feec9376be9b2132659f7d87362eeChristoph BumillerBuildUtil::setPosition(Instruction *i, bool after)
20857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
20957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   bb = i->bb;
21057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   prog = bb->getProgram();
21157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   func = bb->getFunction();
21257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   pos = i;
21357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   tail = after;
21457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   assert(bb);
21557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
21657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
21757594065c30feec9376be9b2132659f7d87362eeChristoph BumillerLValue *
21856cf2da02226aee6b7476675c0e05ac7c218756eChristoph BumillerBuildUtil::getScratch(int size, DataFile f)
21957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
22056cf2da02226aee6b7476675c0e05ac7c218756eChristoph Bumiller   LValue *lval = new_LValue(func, f);
221322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller   lval->reg.size = size;
22257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   return lval;
22357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
22457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
22557594065c30feec9376be9b2132659f7d87362eeChristoph BumillerLValue *
226322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph BumillerBuildUtil::getSSA(int size, DataFile f)
22757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
228322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller   LValue *lval = new_LValue(func, f);
22957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   lval->ssa = 1;
230322bc7ed68ed92233c97168c036d0aa50c11a20eChristoph Bumiller   lval->reg.size = size;
23157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   return lval;
23257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
23357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
23457594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid BuildUtil::insert(Instruction *i)
23557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
23657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   if (!pos) {
23757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      tail ? bb->insertTail(i) : bb->insertHead(i);
23857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   } else {
23957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      if (tail) {
24057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller         bb->insertAfter(pos, i);
24157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller         pos = i;
24257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      } else {
24357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller         bb->insertBefore(pos, i);
24457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      }
24557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   }
24657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
24757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
24857594065c30feec9376be9b2132659f7d87362eeChristoph BumillerInstruction *
24957594065c30feec9376be9b2132659f7d87362eeChristoph BumillerBuildUtil::mkOp(operation op, DataType ty, Value *dst)
25057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
25157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   Instruction *insn = new_Instruction(func, op, ty);
25257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   insn->setDef(0, dst);
25357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   insert(insn);
25457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   if (op == OP_DISCARD || op == OP_EXIT ||
25557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller       op == OP_JOIN ||
25657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller       op == OP_QUADON || op == OP_QUADPOP ||
25757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller       op == OP_EMIT || op == OP_RESTART)
25857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller      insn->fixed = 1;
25957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   return insn;
26057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
26157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
26257594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerinline LValue *
26357594065c30feec9376be9b2132659f7d87362eeChristoph BumillerBuildUtil::mkOp1v(operation op, DataType ty, Value *dst, Value *src)
26457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
26557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   mkOp1(op, ty, dst, src);
26657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   return dst->asLValue();
26757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
26857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
26957594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerinline LValue *
27057594065c30feec9376be9b2132659f7d87362eeChristoph BumillerBuildUtil::mkOp2v(operation op, DataType ty, Value *dst,
27157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller                  Value *src0, Value *src1)
27257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
27357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   mkOp2(op, ty, dst, src0, src1);
27457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   return dst->asLValue();
27557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
27657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
27757594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerinline LValue *
27857594065c30feec9376be9b2132659f7d87362eeChristoph BumillerBuildUtil::mkOp3v(operation op, DataType ty, Value *dst,
27957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller                  Value *src0, Value *src1, Value *src2)
28057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
28157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   mkOp3(op, ty, dst, src0, src1, src2);
28257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   return dst->asLValue();
28357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
28457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
28557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerbool
28656d40aa51b34b77791cc3a49d7e86473a7459b72Francisco JerezBuildUtil::DataArray::exists(ValueMap &m, unsigned int i, unsigned int c)
28757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{
28857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller   assert(i < arrayLen && c < vecDim);
28956d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez   return !regOnly || m.r.count(Location(array, arrayIdx, i, c));
29056d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez}
29156d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez
29256d40aa51b34b77791cc3a49d7e86473a7459b72Francisco JerezValue *
29356d40aa51b34b77791cc3a49d7e86473a7459b72Francisco JerezBuildUtil::DataArray::lookup(ValueMap &m, unsigned i, unsigned c)
29456d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez{
29556d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez   ValueMap::r_iterator it = m.r.find(Location(array, arrayIdx, i, c));
29656d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez   return it != m.r.end() ? it->second : NULL;
29756d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez}
29856d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez
29956d40aa51b34b77791cc3a49d7e86473a7459b72Francisco JerezValue *
30056d40aa51b34b77791cc3a49d7e86473a7459b72Francisco JerezBuildUtil::DataArray::insert(ValueMap &m, unsigned i, unsigned c, Value *v)
30156d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez{
30256d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez   m.insert(Location(array, arrayIdx, i, c), v);
30356d40aa51b34b77791cc3a49d7e86473a7459b72Francisco Jerez   return v;
30457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller}
30557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
30657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} // namespace nv50_ir
30757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller
30857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#endif // __NV50_IR_BUILD_UTIL_H__
309