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