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_INLINES_H__ 2457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#define __NV50_IR_INLINES_H__ 2557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 2657594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerstatic inline CondCode reverseCondCode(CondCode cc) 2757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 2857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller static const uint8_t ccRev[8] = { 0, 4, 2, 6, 1, 5, 3, 7 }; 2957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 3057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return static_cast<CondCode>(ccRev[cc & 7] | (cc & ~7)); 3157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 3257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 3357594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerstatic inline CondCode inverseCondCode(CondCode cc) 3457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 3557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return static_cast<CondCode>(cc ^ 7); 3657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 3757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 3857594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerstatic inline bool isMemoryFile(DataFile f) 3957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 4057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return (f >= FILE_MEMORY_CONST && f <= FILE_MEMORY_LOCAL); 4157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 4257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 43e44089b2f79aa2dcaacf348911433d1e21235c0cChristoph Bumiller// contrary to asTex(), this will never include SULD/SUST 4457594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerstatic inline bool isTextureOp(operation op) 4557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 4657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return (op >= OP_TEX && op <= OP_TEXCSAA); 4757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 4857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 4957594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerstatic inline unsigned int typeSizeof(DataType ty) 5057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 5157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (ty) { 5257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_U8: 5357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_S8: 5457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return 1; 5557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_F16: 5657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_U16: 5757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_S16: 5857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return 2; 5957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_F32: 6057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_U32: 6157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_S32: 6257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return 4; 6357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_F64: 6457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_U64: 6557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_S64: 6657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return 8; 6757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_B96: 6857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return 12; 6957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_B128: 7057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return 16; 7157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 7257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return 0; 7357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 7457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 7557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 7657594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerstatic inline DataType typeOfSize(unsigned int size, 7757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller bool flt = false, bool sgn = false) 7857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 7957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (size) { 8057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case 1: return sgn ? TYPE_S8 : TYPE_U8; 8157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case 2: return flt ? TYPE_F16 : (sgn ? TYPE_S16 : TYPE_U16); 8257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case 8: return flt ? TYPE_F64 : (sgn ? TYPE_S64 : TYPE_U64); 8357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case 12: return TYPE_B96; 8457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case 16: return TYPE_B128; 8557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case 4: 8657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return flt ? TYPE_F32 : (sgn ? TYPE_S32 : TYPE_U32); 87286abcb51ec2c27970e901ed815a814b3f0bebf6Christoph Bumiller default: 88286abcb51ec2c27970e901ed815a814b3f0bebf6Christoph Bumiller return TYPE_NONE; 8957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 9057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 9157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 9257594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerstatic inline bool isFloatType(DataType ty) 9357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 9457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return (ty >= TYPE_F16 && ty <= TYPE_F64); 9557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 9657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 9757594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerstatic inline bool isSignedIntType(DataType ty) 9857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 9957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return (ty == TYPE_S8 || ty == TYPE_S16 || ty == TYPE_S32); 10057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 10157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 10257594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerstatic inline bool isSignedType(DataType ty) 10357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 10457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller switch (ty) { 10557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_NONE: 10657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_U8: 10757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_U16: 10857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_U32: 10957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_B96: 11057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller case TYPE_B128: 11157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return false; 11257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller default: 11357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return true; 11457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 11557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 11657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 1171f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumillerstatic inline DataType intTypeToSigned(DataType ty) 1181f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller{ 1191f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller switch (ty) { 1201f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller case TYPE_U32: return TYPE_S32; 1211f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller case TYPE_U16: return TYPE_S16; 1221f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller case TYPE_U8: return TYPE_S8; 1231f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller default: 1241f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller return ty; 1251f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller } 1261f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller} 1271f4c154f0253ed8fb448402532cfa670f74e69cdChristoph Bumiller 12857594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerconst ValueRef *ValueRef::getIndirect(int dim) const 12957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 1309362d4bc0a03860ec386156cf499e855a9c2d2a5Christoph Bumiller return isIndirect(dim) ? &insn->src(indirect[dim]) : NULL; 13157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 13257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 13357594065c30feec9376be9b2132659f7d87362eeChristoph BumillerDataFile ValueRef::getFile() const 13457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 13557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return value ? value->reg.file : FILE_NULL; 13657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 13757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 13857594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerunsigned int ValueRef::getSize() const 13957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 14057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return value ? value->reg.size : 0; 14157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 14257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 14357594065c30feec9376be9b2132659f7d87362eeChristoph BumillerValue *ValueRef::rep() const 14457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 14557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(value); 14657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return value->join; 14757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 14857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 14957594065c30feec9376be9b2132659f7d87362eeChristoph BumillerValue *ValueDef::rep() const 15057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 15157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(value); 15257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return value->join; 15357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 15457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 15557594065c30feec9376be9b2132659f7d87362eeChristoph BumillerDataFile ValueDef::getFile() const 15657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 15757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return value ? value->reg.file : FILE_NULL; 15857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 15957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 16057594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerunsigned int ValueDef::getSize() const 16157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 16257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return value ? value->reg.size : 0; 16357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 16457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 16557594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid ValueDef::setSSA(LValue *lval) 16657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 1678cc2eca5df0116aa7fb8233a9ab6ad1c9e4203cdFrancisco Jerez origin = value->asLValue(); 1688cc2eca5df0116aa7fb8233a9ab6ad1c9e4203cdFrancisco Jerez set(lval); 16957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 17057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 17157594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerconst LValue *ValueDef::preSSA() const 17257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 1738cc2eca5df0116aa7fb8233a9ab6ad1c9e4203cdFrancisco Jerez return origin; 17457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 17557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 17657594065c30feec9376be9b2132659f7d87362eeChristoph BumillerInstruction *Value::getInsn() const 17757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 1788cc2eca5df0116aa7fb8233a9ab6ad1c9e4203cdFrancisco Jerez return defs.empty() ? NULL : defs.front()->getInsn(); 17957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 18057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 18157594065c30feec9376be9b2132659f7d87362eeChristoph BumillerInstruction *Value::getUniqueInsn() const 18257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 1838cc2eca5df0116aa7fb8233a9ab6ad1c9e4203cdFrancisco Jerez if (defs.empty()) 1848cc2eca5df0116aa7fb8233a9ab6ad1c9e4203cdFrancisco Jerez return NULL; 1858cc2eca5df0116aa7fb8233a9ab6ad1c9e4203cdFrancisco Jerez 1868cc2eca5df0116aa7fb8233a9ab6ad1c9e4203cdFrancisco Jerez // after regalloc, the definitions of coalesced values are linked 1878cc2eca5df0116aa7fb8233a9ab6ad1c9e4203cdFrancisco Jerez if (join != this) { 1888cc2eca5df0116aa7fb8233a9ab6ad1c9e4203cdFrancisco Jerez for (DefCIterator it = defs.begin(); it != defs.end(); ++it) 1898cc2eca5df0116aa7fb8233a9ab6ad1c9e4203cdFrancisco Jerez if ((*it)->get() == this) 1908cc2eca5df0116aa7fb8233a9ab6ad1c9e4203cdFrancisco Jerez return (*it)->getInsn(); 1918cc2eca5df0116aa7fb8233a9ab6ad1c9e4203cdFrancisco Jerez // should be unreachable and trigger assertion at the end 1928cc2eca5df0116aa7fb8233a9ab6ad1c9e4203cdFrancisco Jerez } 1938cc2eca5df0116aa7fb8233a9ab6ad1c9e4203cdFrancisco Jerez#ifdef DEBUG 1948cc2eca5df0116aa7fb8233a9ab6ad1c9e4203cdFrancisco Jerez if (reg.data.id < 0) { 1958cc2eca5df0116aa7fb8233a9ab6ad1c9e4203cdFrancisco Jerez int n = 0; 1968cc2eca5df0116aa7fb8233a9ab6ad1c9e4203cdFrancisco Jerez for (DefCIterator it = defs.begin(); n < 2 && it != defs.end(); ++it) 1978cc2eca5df0116aa7fb8233a9ab6ad1c9e4203cdFrancisco Jerez if ((*it)->get() == this) // don't count joined values 1988cc2eca5df0116aa7fb8233a9ab6ad1c9e4203cdFrancisco Jerez ++n; 1998cc2eca5df0116aa7fb8233a9ab6ad1c9e4203cdFrancisco Jerez if (n > 1) 2008cc2eca5df0116aa7fb8233a9ab6ad1c9e4203cdFrancisco Jerez WARN("value %%%i not uniquely defined\n", id); // return NULL ? 20157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller } 2028cc2eca5df0116aa7fb8233a9ab6ad1c9e4203cdFrancisco Jerez#endif 2038cc2eca5df0116aa7fb8233a9ab6ad1c9e4203cdFrancisco Jerez assert(defs.front()->get() == this); 2048cc2eca5df0116aa7fb8233a9ab6ad1c9e4203cdFrancisco Jerez return defs.front()->getInsn(); 20557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 20657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 207e43a3a66a9d8a99021d76ff4d07dec7b8cfd62caChristoph Bumillerinline bool Instruction::constrainedDefs() const 208e43a3a66a9d8a99021d76ff4d07dec7b8cfd62caChristoph Bumiller{ 209e43a3a66a9d8a99021d76ff4d07dec7b8cfd62caChristoph Bumiller return defExists(1) || op == OP_UNION; 210e43a3a66a9d8a99021d76ff4d07dec7b8cfd62caChristoph Bumiller} 211e43a3a66a9d8a99021d76ff4d07dec7b8cfd62caChristoph Bumiller 21257594065c30feec9376be9b2132659f7d87362eeChristoph BumillerValue *Instruction::getIndirect(int s, int dim) const 21357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 2149362d4bc0a03860ec386156cf499e855a9c2d2a5Christoph Bumiller return srcs[s].isIndirect(dim) ? getSrc(srcs[s].indirect[dim]) : NULL; 21557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 21657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 21757594065c30feec9376be9b2132659f7d87362eeChristoph BumillerValue *Instruction::getPredicate() const 21857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 21957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return (predSrc >= 0) ? getSrc(predSrc) : NULL; 22057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 22157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 22256cf2da02226aee6b7476675c0e05ac7c218756eChristoph Bumillervoid Instruction::setFlagsDef(int d, Value *val) 22356cf2da02226aee6b7476675c0e05ac7c218756eChristoph Bumiller{ 22456cf2da02226aee6b7476675c0e05ac7c218756eChristoph Bumiller if (val) { 22556cf2da02226aee6b7476675c0e05ac7c218756eChristoph Bumiller if (flagsDef < 0) 22656cf2da02226aee6b7476675c0e05ac7c218756eChristoph Bumiller flagsDef = d; 22756cf2da02226aee6b7476675c0e05ac7c218756eChristoph Bumiller setDef(flagsDef, val); 22856cf2da02226aee6b7476675c0e05ac7c218756eChristoph Bumiller } else { 22956cf2da02226aee6b7476675c0e05ac7c218756eChristoph Bumiller if (flagsDef >= 0) { 23056cf2da02226aee6b7476675c0e05ac7c218756eChristoph Bumiller setDef(flagsDef, NULL); 23156cf2da02226aee6b7476675c0e05ac7c218756eChristoph Bumiller flagsDef = -1; 23256cf2da02226aee6b7476675c0e05ac7c218756eChristoph Bumiller } 23356cf2da02226aee6b7476675c0e05ac7c218756eChristoph Bumiller } 23456cf2da02226aee6b7476675c0e05ac7c218756eChristoph Bumiller} 23556cf2da02226aee6b7476675c0e05ac7c218756eChristoph Bumiller 23656cf2da02226aee6b7476675c0e05ac7c218756eChristoph Bumillervoid Instruction::setFlagsSrc(int s, Value *val) 23756cf2da02226aee6b7476675c0e05ac7c218756eChristoph Bumiller{ 23856cf2da02226aee6b7476675c0e05ac7c218756eChristoph Bumiller flagsSrc = s; 23956cf2da02226aee6b7476675c0e05ac7c218756eChristoph Bumiller setSrc(flagsSrc, val); 24056cf2da02226aee6b7476675c0e05ac7c218756eChristoph Bumiller} 24156cf2da02226aee6b7476675c0e05ac7c218756eChristoph Bumiller 24257594065c30feec9376be9b2132659f7d87362eeChristoph BumillerValue *TexInstruction::getIndirectR() const 24357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 24457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return tex.rIndirectSrc >= 0 ? getSrc(tex.rIndirectSrc) : NULL; 24557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 24657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 24757594065c30feec9376be9b2132659f7d87362eeChristoph BumillerValue *TexInstruction::getIndirectS() const 24857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 24957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return tex.rIndirectSrc >= 0 ? getSrc(tex.rIndirectSrc) : NULL; 25057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 25157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 25257594065c30feec9376be9b2132659f7d87362eeChristoph BumillerCmpInstruction *Instruction::asCmp() 25357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 25457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (op >= OP_SET_AND && op <= OP_SLCT && op != OP_SELP) 25557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return static_cast<CmpInstruction *>(this); 25657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return NULL; 25757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 25857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 25957594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerconst CmpInstruction *Instruction::asCmp() const 26057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 26157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (op >= OP_SET_AND && op <= OP_SLCT && op != OP_SELP) 26257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return static_cast<const CmpInstruction *>(this); 26357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return NULL; 26457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 26557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 26657594065c30feec9376be9b2132659f7d87362eeChristoph BumillerFlowInstruction *Instruction::asFlow() 26757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 26857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (op >= OP_BRA && op <= OP_JOIN) 26957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return static_cast<FlowInstruction *>(this); 27057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return NULL; 27157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 27257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 27357594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerconst FlowInstruction *Instruction::asFlow() const 27457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 27557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (op >= OP_BRA && op <= OP_JOINAT) 27657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return static_cast<const FlowInstruction *>(this); 27757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return NULL; 27857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 27957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 28057594065c30feec9376be9b2132659f7d87362eeChristoph BumillerTexInstruction *Instruction::asTex() 28157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 28257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (op >= OP_TEX && op <= OP_TEXCSAA) 28357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return static_cast<TexInstruction *>(this); 28457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return NULL; 28557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 28657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 28757594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerconst TexInstruction *Instruction::asTex() const 28857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 28957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (op >= OP_TEX && op <= OP_TEXCSAA) 29057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return static_cast<const TexInstruction *>(this); 29157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return NULL; 29257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 29357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 294a05e6a3fa28168d58a13cfb07f7a664e84b925aeFrancisco Jerezstatic inline Instruction *cloneForward(Function *ctx, Instruction *obj) 295a05e6a3fa28168d58a13cfb07f7a664e84b925aeFrancisco Jerez{ 296a05e6a3fa28168d58a13cfb07f7a664e84b925aeFrancisco Jerez DeepClonePolicy<Function> pol(ctx); 297a05e6a3fa28168d58a13cfb07f7a664e84b925aeFrancisco Jerez 298a05e6a3fa28168d58a13cfb07f7a664e84b925aeFrancisco Jerez for (int i = 0; obj->srcExists(i); ++i) 299a05e6a3fa28168d58a13cfb07f7a664e84b925aeFrancisco Jerez pol.set(obj->getSrc(i), obj->getSrc(i)); 300a05e6a3fa28168d58a13cfb07f7a664e84b925aeFrancisco Jerez 301a05e6a3fa28168d58a13cfb07f7a664e84b925aeFrancisco Jerez return obj->clone(pol); 302a05e6a3fa28168d58a13cfb07f7a664e84b925aeFrancisco Jerez} 303a05e6a3fa28168d58a13cfb07f7a664e84b925aeFrancisco Jerez 30457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller// XXX: use a virtual function so we're really really safe ? 30557594065c30feec9376be9b2132659f7d87362eeChristoph BumillerLValue *Value::asLValue() 30657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 30757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (reg.file >= FILE_GPR && reg.file <= FILE_ADDRESS) 30857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return static_cast<LValue *>(this); 30957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return NULL; 31057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 31157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 31257594065c30feec9376be9b2132659f7d87362eeChristoph BumillerSymbol *Value::asSym() 31357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 31457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (reg.file >= FILE_MEMORY_CONST) 31557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return static_cast<Symbol *>(this); 31657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return NULL; 31757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 31857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 31957594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerconst Symbol *Value::asSym() const 32057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 32157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (reg.file >= FILE_MEMORY_CONST) 32257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return static_cast<const Symbol *>(this); 32357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return NULL; 32457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 32557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 32657594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid Symbol::setOffset(int32_t offset) 32757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 32857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller reg.data.offset = offset; 32957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 33057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 33157594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid Symbol::setAddress(Symbol *base, int32_t offset) 33257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 33357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller baseSym = base; 33457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller reg.data.offset = offset; 33557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 33657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 33757594065c30feec9376be9b2132659f7d87362eeChristoph Bumillervoid Symbol::setSV(SVSemantic sv, uint32_t index) 33857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 33957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller reg.data.sv.sv = sv; 34057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller reg.data.sv.index = index; 34157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 34257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 34357594065c30feec9376be9b2132659f7d87362eeChristoph BumillerImmediateValue *Value::asImm() 34457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 34557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (reg.file == FILE_IMMEDIATE) 34657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return static_cast<ImmediateValue *>(this); 34757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return NULL; 34857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 34957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 35057594065c30feec9376be9b2132659f7d87362eeChristoph Bumillerconst ImmediateValue *Value::asImm() const 35157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 35257594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller if (reg.file == FILE_IMMEDIATE) 35357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return static_cast<const ImmediateValue *>(this); 35457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return NULL; 35557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 35657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 35757594065c30feec9376be9b2132659f7d87362eeChristoph BumillerValue *Value::get(Iterator &it) 35857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 35957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return reinterpret_cast<Value *>(it.get()); 36057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 36157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 36240c224a573f2b763046001e622aafca90f68c693Christoph Bumillerbool BasicBlock::reachableBy(const BasicBlock *by, const BasicBlock *term) 36357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 36457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return cfg.reachableBy(&by->cfg, &term->cfg); 36557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 36657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 36757594065c30feec9376be9b2132659f7d87362eeChristoph BumillerBasicBlock *BasicBlock::get(Iterator &iter) 36857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 36957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return reinterpret_cast<BasicBlock *>(iter.get()); 37057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 37157594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 37257594065c30feec9376be9b2132659f7d87362eeChristoph BumillerBasicBlock *BasicBlock::get(Graph::Node *node) 37357594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 37457594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert(node); 37557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return reinterpret_cast<BasicBlock *>(node->data); 37657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 37757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 378d32ebb8c304725fa6bb7ec2d3d40ce828c713917Francisco JerezFunction *Function::get(Graph::Node *node) 379d32ebb8c304725fa6bb7ec2d3d40ce828c713917Francisco Jerez{ 380d32ebb8c304725fa6bb7ec2d3d40ce828c713917Francisco Jerez assert(node); 381d32ebb8c304725fa6bb7ec2d3d40ce828c713917Francisco Jerez return reinterpret_cast<Function *>(node->data); 382d32ebb8c304725fa6bb7ec2d3d40ce828c713917Francisco Jerez} 383d32ebb8c304725fa6bb7ec2d3d40ce828c713917Francisco Jerez 38457594065c30feec9376be9b2132659f7d87362eeChristoph BumillerLValue *Function::getLValue(int id) 38557594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller{ 38657594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller assert((unsigned int)id < (unsigned int)allLValues.getSize()); 38757594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller return reinterpret_cast<LValue *>(allLValues.get(id)); 38857594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller} 38957594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller 39057594065c30feec9376be9b2132659f7d87362eeChristoph Bumiller#endif // __NV50_IR_INLINES_H__ 391