1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2011 Christoph Bumiller 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included in 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * all copies or substantial portions of the Software. 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef __NV50_IR_INLINES_H__ 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define __NV50_IR_INLINES_H__ 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline CondCode reverseCondCode(CondCode cc) 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static const uint8_t ccRev[8] = { 0, 4, 2, 6, 1, 5, 3, 7 }; 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return static_cast<CondCode>(ccRev[cc & 7] | (cc & ~7)); 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline CondCode inverseCondCode(CondCode cc) 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return static_cast<CondCode>(cc ^ 7); 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline bool isMemoryFile(DataFile f) 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (f >= FILE_MEMORY_CONST && f <= FILE_MEMORY_LOCAL); 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// contrary to asTex(), this will never include SULD/SUST 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline bool isTextureOp(operation op) 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (op >= OP_TEX && op <= OP_TEXCSAA); 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline unsigned int typeSizeof(DataType ty) 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (ty) { 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U8: 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S8: 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1; 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_F16: 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U16: 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S16: 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 2; 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_F32: 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U32: 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S32: 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 4; 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_F64: 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U64: 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_S64: 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 8; 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_B96: 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 12; 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_B128: 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 16; 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline DataType typeOfSize(unsigned int size, 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool flt = false, bool sgn = false) 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (size) { 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: return sgn ? TYPE_S8 : TYPE_U8; 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: return flt ? TYPE_F16 : (sgn ? TYPE_S16 : TYPE_U16); 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 8: return flt ? TYPE_F64 : (sgn ? TYPE_S64 : TYPE_U64); 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 12: return TYPE_B96; 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 16: return TYPE_B128; 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return flt ? TYPE_F32 : (sgn ? TYPE_S32 : TYPE_U32); 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return TYPE_NONE; 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline bool isFloatType(DataType ty) 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (ty >= TYPE_F16 && ty <= TYPE_F64); 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline bool isSignedIntType(DataType ty) 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (ty == TYPE_S8 || ty == TYPE_S16 || ty == TYPE_S32); 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline bool isSignedType(DataType ty) 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (ty) { 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_NONE: 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U8: 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U16: 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U32: 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_B96: 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_B128: 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return false; 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return true; 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline DataType intTypeToSigned(DataType ty) 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (ty) { 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U32: return TYPE_S32; 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U16: return TYPE_S16; 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case TYPE_U8: return TYPE_S8; 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ty; 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst ValueRef *ValueRef::getIndirect(int dim) const 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return isIndirect(dim) ? &insn->src(indirect[dim]) : NULL; 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDataFile ValueRef::getFile() const 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return value ? value->reg.file : FILE_NULL; 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunsigned int ValueRef::getSize() const 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return value ? value->reg.size : 0; 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgValue *ValueRef::rep() const 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(value); 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return value->join; 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgValue *ValueDef::rep() const 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(value); 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return value->join; 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDataFile ValueDef::getFile() const 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return value ? value->reg.file : FILE_NULL; 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunsigned int ValueDef::getSize() const 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return value ? value->reg.size : 0; 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid ValueDef::setSSA(LValue *lval) 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org origin = value->asLValue(); 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org set(lval); 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst LValue *ValueDef::preSSA() const 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return origin; 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgInstruction *Value::getInsn() const 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return defs.empty() ? NULL : defs.front()->getInsn(); 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgInstruction *Value::getUniqueInsn() const 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (defs.empty()) 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // after regalloc, the definitions of coalesced values are linked 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (join != this) { 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (DefCIterator it = defs.begin(); it != defs.end(); ++it) 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((*it)->get() == this) 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (*it)->getInsn(); 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org // should be unreachable and trigger assertion at the end 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef DEBUG 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.data.id < 0) { 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int n = 0; 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (DefCIterator it = defs.begin(); n < 2 && it != defs.end(); ++it) 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((*it)->get() == this) // don't count joined values 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ++n; 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (n > 1) 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WARN("value %%%i not uniquely defined\n", id); // return NULL ? 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(defs.front()->get() == this); 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return defs.front()->getInsn(); 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orginline bool Instruction::constrainedDefs() const 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return defExists(1) || op == OP_UNION; 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgValue *Instruction::getIndirect(int s, int dim) const 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return srcs[s].isIndirect(dim) ? getSrc(srcs[s].indirect[dim]) : NULL; 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgValue *Instruction::getPredicate() const 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (predSrc >= 0) ? getSrc(predSrc) : NULL; 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid Instruction::setFlagsDef(int d, Value *val) 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (val) { 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (flagsDef < 0) 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flagsDef = d; 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setDef(flagsDef, val); 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (flagsDef >= 0) { 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setDef(flagsDef, NULL); 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flagsDef = -1; 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid Instruction::setFlagsSrc(int s, Value *val) 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org flagsSrc = s; 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org setSrc(flagsSrc, val); 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgValue *TexInstruction::getIndirectR() const 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return tex.rIndirectSrc >= 0 ? getSrc(tex.rIndirectSrc) : NULL; 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgValue *TexInstruction::getIndirectS() const 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return tex.rIndirectSrc >= 0 ? getSrc(tex.rIndirectSrc) : NULL; 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCmpInstruction *Instruction::asCmp() 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (op >= OP_SET_AND && op <= OP_SLCT && op != OP_SELP) 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return static_cast<CmpInstruction *>(this); 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst CmpInstruction *Instruction::asCmp() const 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (op >= OP_SET_AND && op <= OP_SLCT && op != OP_SELP) 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return static_cast<const CmpInstruction *>(this); 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFlowInstruction *Instruction::asFlow() 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (op >= OP_BRA && op <= OP_JOIN) 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return static_cast<FlowInstruction *>(this); 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst FlowInstruction *Instruction::asFlow() const 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (op >= OP_BRA && op <= OP_JOINAT) 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return static_cast<const FlowInstruction *>(this); 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTexInstruction *Instruction::asTex() 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (op >= OP_TEX && op <= OP_TEXCSAA) 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return static_cast<TexInstruction *>(this); 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst TexInstruction *Instruction::asTex() const 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (op >= OP_TEX && op <= OP_TEXCSAA) 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return static_cast<const TexInstruction *>(this); 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline Instruction *cloneForward(Function *ctx, Instruction *obj) 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org DeepClonePolicy<Function> pol(ctx); 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (int i = 0; obj->srcExists(i); ++i) 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pol.set(obj->getSrc(i), obj->getSrc(i)); 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return obj->clone(pol); 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// XXX: use a virtual function so we're really really safe ? 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgLValue *Value::asLValue() 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.file >= FILE_GPR && reg.file <= FILE_ADDRESS) 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return static_cast<LValue *>(this); 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgSymbol *Value::asSym() 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.file >= FILE_MEMORY_CONST) 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return static_cast<Symbol *>(this); 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst Symbol *Value::asSym() const 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.file >= FILE_MEMORY_CONST) 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return static_cast<const Symbol *>(this); 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid Symbol::setOffset(int32_t offset) 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg.data.offset = offset; 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid Symbol::setAddress(Symbol *base, int32_t offset) 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseSym = base; 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg.data.offset = offset; 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid Symbol::setSV(SVSemantic sv, uint32_t index) 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg.data.sv.sv = sv; 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reg.data.sv.index = index; 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgImmediateValue *Value::asImm() 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.file == FILE_IMMEDIATE) 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return static_cast<ImmediateValue *>(this); 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst ImmediateValue *Value::asImm() const 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (reg.file == FILE_IMMEDIATE) 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return static_cast<const ImmediateValue *>(this); 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgValue *Value::get(Iterator &it) 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return reinterpret_cast<Value *>(it.get()); 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool BasicBlock::reachableBy(const BasicBlock *by, const BasicBlock *term) 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return cfg.reachableBy(&by->cfg, &term->cfg); 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgBasicBlock *BasicBlock::get(Iterator &iter) 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return reinterpret_cast<BasicBlock *>(iter.get()); 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgBasicBlock *BasicBlock::get(Graph::Node *node) 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(node); 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return reinterpret_cast<BasicBlock *>(node->data); 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgFunction *Function::get(Graph::Node *node) 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(node); 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return reinterpret_cast<Function *>(node->data); 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgLValue *Function::getLValue(int id) 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert((unsigned int)id < (unsigned int)allLValues.getSize()); 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return reinterpret_cast<LValue *>(allLValues.get(id)); 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif // __NV50_IR_INLINES_H__ 391