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