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