1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv50_ir.h"
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv50_ir_target.h"
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv50_ir_build_util.h"
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv50_ir_from_sm4.h"
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// WTF: pass-through is implicit ??? check ReadWriteMask
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnamespace tgsi {
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic nv50_ir::SVSemantic irSemantic(unsigned sn)
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (sn) {
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TGSI_SEMANTIC_POSITION:      return nv50_ir::SV_POSITION;
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TGSI_SEMANTIC_FACE:          return nv50_ir::SV_FACE;
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case NV50_SEMANTIC_LAYER:         return nv50_ir::SV_LAYER;
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case NV50_SEMANTIC_VIEWPORTINDEX: return nv50_ir::SV_VIEWPORT_INDEX;
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TGSI_SEMANTIC_PSIZE:         return nv50_ir::SV_POINT_SIZE;
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case NV50_SEMANTIC_CLIPDISTANCE:  return nv50_ir::SV_CLIP_DISTANCE;
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TGSI_SEMANTIC_VERTEXID:      return nv50_ir::SV_VERTEX_ID;
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TGSI_SEMANTIC_INSTANCEID:    return nv50_ir::SV_INSTANCE_ID;
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TGSI_SEMANTIC_PRIMID:        return nv50_ir::SV_PRIMITIVE_ID;
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case NV50_SEMANTIC_TESSFACTOR:    return nv50_ir::SV_TESS_FACTOR;
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case NV50_SEMANTIC_TESSCOORD:     return nv50_ir::SV_TESS_COORD;
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return nv50_ir::SV_UNDEFINED;
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} // namespace tgsi
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnamespace {
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgusing namespace nv50_ir;
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NV50_IR_MAX_RESOURCES 64
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass Converter : public BuildUtil
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic:
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Converter(Program *, struct nv50_ir_prog_info *);
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ~Converter();
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprivate:
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DataArray tData32;
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DataArray tData64;
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned int nrRegVals;
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DataArray *lData;
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned int nrArrays;
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned int arrayVol;
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DataArray oData;
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint8_t interpMode[PIPE_MAX_SHADER_INPUTS];
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   // outputs for each phase
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nv50_ir_varying out[3][PIPE_MAX_SHADER_OUTPUTS];
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int phase;
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int subPhaseCnt[2];
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int subPhase;
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned int phaseStart;
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned int phaseInstance;
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned int *phaseInstCnt[2];
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool unrollPhase;
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool phaseInstanceUsed;
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int phaseEnded; // (phase + 1) if $phase ended
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool finalized;
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Value *srcPtr[3][3]; // for indirect addressing, save pointer values
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Value *dstPtr[3];
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Value *vtxBase[3]; // base address of vertex in a primitive (TP/GP)
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Value *domainPt[3]; // pre-fetched TessCoord
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned int nDstOpnds;
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Stack condBBs;
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Stack joinBBs;
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Stack loopBBs;
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Stack breakBBs;
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Stack entryBBs;
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Stack leaveBBs;
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Stack retIPs;
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool shadow[NV50_IR_MAX_RESOURCES];
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TexTarget resourceType[NV50_IR_MAX_RESOURCES][2];
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nv50_ir_prog_info& info;
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Value *fragCoord[4];
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic:
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool run();
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprivate:
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool handleInstruction(unsigned int pos);
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool inspectInstruction(unsigned int pos);
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool handleDeclaration(const sm4_dcl& dcl);
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool inspectDeclaration(const sm4_dcl& dcl);
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool parseSignature();
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool haveNextPhase(unsigned int pos) const;
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void allocateValues();
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void exportOutputs();
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitTex(Value *dst0[4], TexInstruction *, const uint8_t swizzle[4]);
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void handleLOAD(Value *dst0[4]);
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void handleSAMPLE(operation, Value *dst0[4]);
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void handleQUERY(Value *dst0[4], enum TexQuery query);
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void handleDP(Value *dst0[4], int dim);
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Symbol *iSym(int i, int c);
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Symbol *oSym(int i, int c);
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Value *src(int i, int c);
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Value *src(const sm4_op&, int c, int i);
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Value *dst(int i, int c);
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Value *dst(const sm4_op&, int c, int i);
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void saveDst(int i, int c, Value *value);
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void saveDst(const sm4_op&, int c, Value *value, int i);
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void saveFragDepth(operation op, Value *value);
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Value *interpolate(const sm4_op&, int c, int i);
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Value *getSrcPtr(int s, int dim, int shl);
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Value *getDstPtr(int d, int dim, int shl);
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Value *getVtxPtr(int s);
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool checkDstSrcAliasing() const;
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void insertConvergenceOps(BasicBlock *conv, BasicBlock *fork);
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void finalizeShader();
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   operation cvtOpcode(enum sm4_opcode op) const;
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned int getDstOpndCount(enum sm4_opcode opcode) const;
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DataType inferSrcType(enum sm4_opcode op) const;
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DataType inferDstType(enum sm4_opcode op) const;
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned g3dPrim(const unsigned prim, unsigned *patchSize = NULL) const;
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CondCode cvtCondCode(enum sm4_opcode op) const;
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   RoundMode cvtRoundingMode(enum sm4_opcode op) const;
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TexTarget cvtTexTarget(enum sm4_target,
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           enum sm4_opcode, operation *) const;
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   SVSemantic cvtSemantic(enum sm4_sv, uint8_t &index) const;
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint8_t cvtInterpMode(enum sm4_interpolation) const;
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned tgsiSemantic(SVSemantic, int index);
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void recordSV(unsigned sn, unsigned si, unsigned mask, bool input);
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprivate:
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sm4_insn *insn;
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DataType dTy, sTy;
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct sm4_program& sm4;
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Program *prog;
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define PRIM_CASE(a, b) \
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case D3D_PRIMITIVE_TOPOLOGY_##a: return PIPE_PRIM_##b;
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunsigned
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::g3dPrim(const unsigned prim, unsigned *patchSize) const
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (prim) {
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PRIM_CASE(UNDEFINED, POINTS);
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PRIM_CASE(POINTLIST, POINTS);
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PRIM_CASE(LINELIST, LINES);
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PRIM_CASE(LINESTRIP, LINE_STRIP);
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PRIM_CASE(TRIANGLELIST, TRIANGLES);
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PRIM_CASE(TRIANGLESTRIP, TRIANGLE_STRIP);
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PRIM_CASE(LINELIST_ADJ, LINES_ADJACENCY);
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PRIM_CASE(LINESTRIP_ADJ, LINE_STRIP_ADJACENCY);
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PRIM_CASE(TRIANGLELIST_ADJ, TRIANGLES_ADJACENCY);
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   PRIM_CASE(TRIANGLESTRIP_ADJ, TRIANGLES_ADJACENCY);
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (prim < D3D_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST ||
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          prim > D3D_PRIMITIVE_TOPOLOGY_32_CONTROL_POINT_PATCHLIST)
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return PIPE_PRIM_POINTS;
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (patchSize)
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *patchSize =
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            prim - D3D_PRIMITIVE_TOPOLOGY_1_CONTROL_POINT_PATCHLIST + 1;
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NV50_PRIM_PATCHES;
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define IPM_CASE(n, a, b) \
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_INTERPOLATION_##n: return NV50_IR_INTERP_##a | NV50_IR_INTERP_##b
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orguint8_t
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::cvtInterpMode(enum sm4_interpolation mode) const
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (mode) {
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   IPM_CASE(CONSTANT,                      FLAT, FLAT);
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   IPM_CASE(LINEAR,                        PERSPECTIVE, PERSPECTIVE);
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   IPM_CASE(LINEAR_CENTROID,               PERSPECTIVE, CENTROID);
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   IPM_CASE(LINEAR_NOPERSPECTIVE,          LINEAR, LINEAR);
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   IPM_CASE(LINEAR_NOPERSPECTIVE_CENTROID, LINEAR, CENTROID);
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   IPM_CASE(LINEAR_SAMPLE,                 PERSPECTIVE, OFFSET);
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   IPM_CASE(LINEAR_NOPERSPECTIVE_SAMPLE,   LINEAR, OFFSET);
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   IPM_CASE(UNDEFINED,                     LINEAR, LINEAR);
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(!"invalid interpolation mode");
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsetVaryingInterpMode(struct nv50_ir_varying *var, uint8_t mode)
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (mode & NV50_IR_INTERP_MODE_MASK) {
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case NV50_IR_INTERP_LINEAR:
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      var->linear = 1;
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case NV50_IR_INTERP_FLAT:
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      var->flat = 1;
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (mode & NV50_IR_INTERP_CENTROID)
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      var->centroid = 1;
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgRoundMode
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::cvtRoundingMode(enum sm4_opcode op) const
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (op) {
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ROUND_NE: return ROUND_NI;
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ROUND_NI: return ROUND_MI;
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ROUND_PI: return ROUND_PI;
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ROUND_Z:  return ROUND_ZI;
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return ROUND_N;
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCondCode
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::cvtCondCode(enum sm4_opcode op) const
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (op) {
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_EQ:
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DEQ:
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_IEQ: return CC_EQ;
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_GE:
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DGE:
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_IGE:
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_UGE: return CC_GE;
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_LT:
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DLT:
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ILT:
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ULT: return CC_LT;
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_NE:
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_INE:
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DNE: return CC_NEU;
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return CC_ALWAYS;
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDataType
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::inferSrcType(enum sm4_opcode op) const
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (op) {
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_IADD:
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_IEQ:
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_IGE:
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ILT:
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_IMAD:
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_IMAX:
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_IMIN:
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_IMUL:
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_INE:
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_INEG:
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ISHL:
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ISHR:
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ITOF:
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ATOMIC_IADD:
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ATOMIC_IMAX:
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ATOMIC_IMIN:
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TYPE_S32;
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_AND:
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_NOT:
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_OR:
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_UDIV:
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ULT:
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_UGE:
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_UMUL:
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_UMAD:
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_UMAX:
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_UMIN:
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_USHR:
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_UTOF:
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_XOR:
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_UADDC:
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_USUBB:
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ATOMIC_AND:
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ATOMIC_OR:
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ATOMIC_XOR:
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ATOMIC_UMAX:
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ATOMIC_UMIN:
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TYPE_U32;
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DADD:
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DMAX:
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DMIN:
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DMUL:
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DEQ:
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DGE:
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DLT:
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DNE:
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DMOV:
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DMOVC:
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DTOF:
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TYPE_F64;
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_F16TOF32:
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TYPE_F16;
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TYPE_F32;
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgDataType
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::inferDstType(enum sm4_opcode op) const
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (op) {
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_FTOI:
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TYPE_S32;
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_FTOU:
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_EQ:
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_GE:
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_LT:
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_NE:
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TYPE_U32;
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_FTOD:
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TYPE_F64;
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_F32TOF16:
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TYPE_F16;
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ITOF:
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_UTOF:
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DTOF:
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TYPE_F32;
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return inferSrcType(op);
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgoperation
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::cvtOpcode(enum sm4_opcode op) const
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (op) {
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ADD:         return OP_ADD;
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_AND:         return OP_AND;
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_BREAK:       return OP_BREAK;
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_BREAKC:      return OP_BREAK;
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_CALL:        return OP_CALL;
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_CALLC:       return OP_CALL;
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_CASE:        return OP_NOP;
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_CONTINUE:    return OP_CONT;
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_CONTINUEC:   return OP_CONT;
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_CUT:         return OP_RESTART;
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DEFAULT:     return OP_NOP;
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DERIV_RTX:   return OP_DFDX;
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DERIV_RTY:   return OP_DFDY;
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DISCARD:     return OP_DISCARD;
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DIV:         return OP_DIV;
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DP2:         return OP_MAD;
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DP3:         return OP_MAD;
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DP4:         return OP_MAD;
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ELSE:        return OP_BRA;
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_EMIT:        return OP_EMIT;
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_EMITTHENCUT: return OP_EMIT;
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ENDIF:       return OP_BRA;
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ENDLOOP:     return OP_PREBREAK;
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ENDSWITCH:   return OP_NOP;
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_EQ:          return OP_SET;
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_EXP:         return OP_EX2;
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_FRC:         return OP_CVT;
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_FTOI:        return OP_CVT;
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_FTOU:        return OP_CVT;
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_GE:          return OP_SET;
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_IADD:        return OP_ADD;
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_IF:          return OP_BRA;
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_IEQ:         return OP_SET;
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_IGE:         return OP_SET;
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ILT:         return OP_SET;
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_IMAD:        return OP_MAD;
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_IMAX:        return OP_MAX;
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_IMIN:        return OP_MIN;
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_IMUL:        return OP_MUL;
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_INE:         return OP_SET;
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_INEG:        return OP_NEG;
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ISHL:        return OP_SHL;
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ISHR:        return OP_SHR;
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ITOF:        return OP_CVT;
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_LD:          return OP_TXF;
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_LD_MS:       return OP_TXF;
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_LOG:         return OP_LG2;
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_LOOP:        return OP_PRECONT;
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_LT:          return OP_SET;
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_MAD:         return OP_MAD;
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_MIN:         return OP_MIN;
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_MAX:         return OP_MAX;
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_MOV:         return OP_MOV;
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_MOVC:        return OP_MOV;
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_MUL:         return OP_MUL;
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_NE:          return OP_SET;
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_NOP:         return OP_NOP;
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_NOT:         return OP_NOT;
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_OR:          return OP_OR;
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_RESINFO:     return OP_TXQ;
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_RET:         return OP_RET;
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_RETC:        return OP_RET;
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ROUND_NE:    return OP_CVT;
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ROUND_NI:    return OP_FLOOR;
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ROUND_PI:    return OP_CEIL;
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ROUND_Z:     return OP_TRUNC;
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_RSQ:         return OP_RSQ;
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_SAMPLE:      return OP_TEX;
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_SAMPLE_C:    return OP_TEX;
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_SAMPLE_C_LZ: return OP_TEX;
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_SAMPLE_L:    return OP_TXL;
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_SAMPLE_D:    return OP_TXD;
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_SAMPLE_B:    return OP_TXB;
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_SQRT:        return OP_SQRT;
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_SWITCH:      return OP_NOP;
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_SINCOS:      return OP_PRESIN;
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_UDIV:        return OP_DIV;
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ULT:         return OP_SET;
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_UGE:         return OP_SET;
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_UMUL:        return OP_MUL;
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_UMAD:        return OP_MAD;
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_UMAX:        return OP_MAX;
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_UMIN:        return OP_MIN;
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_USHR:        return OP_SHR;
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_UTOF:        return OP_CVT;
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_XOR:         return OP_XOR;
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_GATHER4:            return OP_TXG;
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_SAMPLE_POS:         return OP_PIXLD;
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_SAMPLE_INFO:        return OP_PIXLD;
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_EMIT_STREAM:        return OP_EMIT;
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_CUT_STREAM:         return OP_RESTART;
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_EMITTHENCUT_STREAM: return OP_EMIT;
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_INTERFACE_CALL:     return OP_CALL;
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_BUFINFO:            return OP_TXQ;
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DERIV_RTX_COARSE:   return OP_DFDX;
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DERIV_RTX_FINE:     return OP_DFDX;
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DERIV_RTY_COARSE:   return OP_DFDY;
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DERIV_RTY_FINE:     return OP_DFDY;
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_GATHER4_C:          return OP_TXG;
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_GATHER4_PO:         return OP_TXG;
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_GATHER4_PO_C:       return OP_TXG;
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_RCP:       return OP_RCP;
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_F32TOF16:  return OP_CVT;
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_F16TOF32:  return OP_CVT;
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_UADDC:     return OP_ADD;
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_USUBB:     return OP_SUB;
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_COUNTBITS: return OP_POPCNT;
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ATOMIC_AND:       return OP_AND;
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ATOMIC_OR:        return OP_OR;
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ATOMIC_XOR:       return OP_XOR;
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ATOMIC_CMP_STORE: return OP_STORE;
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ATOMIC_IADD:      return OP_ADD;
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ATOMIC_IMAX:      return OP_MAX;
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ATOMIC_IMIN:      return OP_MIN;
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ATOMIC_UMAX:      return OP_MAX;
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ATOMIC_UMIN:      return OP_MIN;
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_SYNC:  return OP_MEMBAR;
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DADD:  return OP_ADD;
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DMAX:  return OP_MAX;
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DMIN:  return OP_MIN;
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DMUL:  return OP_MUL;
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DEQ:   return OP_SET;
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DGE:   return OP_SET;
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DLT:   return OP_SET;
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DNE:   return OP_SET;
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DMOV:  return OP_MOV;
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DMOVC: return OP_MOV;
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DTOF:  return OP_CVT;
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_FTOD:  return OP_CVT;
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return OP_NOP;
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunsigned int
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::getDstOpndCount(enum sm4_opcode opcode) const
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (opcode) {
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_SINCOS:
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_UDIV:
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_IMUL:
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_UMUL:
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 2;
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_BREAK:
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_BREAKC:
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_CALL:
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_CALLC:
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_CONTINUE:
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_CONTINUEC:
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DISCARD:
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_EMIT:
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_EMIT_STREAM:
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_CUT:
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_CUT_STREAM:
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_EMITTHENCUT:
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_EMITTHENCUT_STREAM:
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_IF:
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ELSE:
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ENDIF:
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_LOOP:
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ENDLOOP:
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_RET:
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_RETC:
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_SYNC:
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_SWITCH:
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_CASE:
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_HS_DECLS:
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_HS_CONTROL_POINT_PHASE:
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_HS_FORK_PHASE:
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_HS_JOIN_PHASE:
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 1;
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TARG_CASE_1(a, b) case SM4_TARGET_##a: return TEX_TARGET_##b;
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TARG_CASE_2(a, b) case SM4_TARGET_##a: \
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return dc ? TEX_TARGET_##b##_SHADOW : TEX_TARGET_##b
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTexTarget
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::cvtTexTarget(enum sm4_target targ,
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        enum sm4_opcode op, operation *opr) const
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool dc = (op == SM4_OPCODE_SAMPLE_C ||
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              op == SM4_OPCODE_SAMPLE_C_LZ ||
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              op == SM4_OPCODE_GATHER4_C ||
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org              op == SM4_OPCODE_GATHER4_PO_C);
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (opr) {
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (targ) {
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case SM4_TARGET_RAW_BUFFER:        *opr = OP_LOAD; break;
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case SM4_TARGET_STRUCTURED_BUFFER: *opr = OP_SULD; break;
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *opr = OP_TEX;
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (targ) {
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TARG_CASE_1(UNKNOWN, 2D);
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TARG_CASE_2(TEXTURE1D,         1D);
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TARG_CASE_2(TEXTURE2D,         2D);
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TARG_CASE_1(TEXTURE2DMS,       2D_MS);
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TARG_CASE_1(TEXTURE3D,         3D);
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TARG_CASE_2(TEXTURECUBE,       CUBE);
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TARG_CASE_2(TEXTURE1DARRAY,    1D_ARRAY);
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TARG_CASE_2(TEXTURE2DARRAY,    2D_ARRAY);
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TARG_CASE_1(TEXTURE2DMSARRAY,  2D_MS_ARRAY);
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TARG_CASE_2(TEXTURECUBEARRAY,  CUBE_ARRAY);
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TARG_CASE_1(BUFFER,            BUFFER);
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TARG_CASE_1(RAW_BUFFER,        BUFFER);
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TARG_CASE_1(STRUCTURED_BUFFER, BUFFER);
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(!"invalid SM4 texture target");
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return dc ? TEX_TARGET_2D_SHADOW : TEX_TARGET_2D;
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline uint32_t
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggetSVIndex(enum sm4_sv sv)
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (sv) {
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_FINAL_QUAD_U_EQ_0_EDGE_TESSFACTOR: return 0;
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_FINAL_QUAD_V_EQ_0_EDGE_TESSFACTOR: return 1;
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_FINAL_QUAD_U_EQ_1_EDGE_TESSFACTOR: return 2;
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_FINAL_QUAD_V_EQ_1_EDGE_TESSFACTOR: return 3;
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_FINAL_QUAD_U_INSIDE_TESSFACTOR: return 4;
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_FINAL_QUAD_V_INSIDE_TESSFACTOR: return 5;
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_FINAL_TRI_U_EQ_0_EDGE_TESSFACTOR: return 0;
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_FINAL_TRI_V_EQ_0_EDGE_TESSFACTOR: return 1;
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_FINAL_TRI_W_EQ_0_EDGE_TESSFACTOR: return 2;
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_FINAL_TRI_INSIDE_TESSFACTOR: return 4;
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_FINAL_LINE_DETAIL_TESSFACTOR: return 0;
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_FINAL_LINE_DENSITY_TESSFACTOR: return 4;
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgSVSemantic
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::cvtSemantic(enum sm4_sv sv, uint8_t &idx) const
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   idx = 0;
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (sv) {
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_UNDEFINED:     return SV_UNDEFINED;
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_POSITION:      return SV_POSITION;
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_CLIP_DISTANCE: return SV_CLIP_DISTANCE;
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_CULL_DISTANCE: return SV_CLIP_DISTANCE; // XXX: distinction
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_RENDER_TARGET_ARRAY_INDEX: return SV_LAYER;
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_VIEWPORT_ARRAY_INDEX:  return SV_VIEWPORT_INDEX;
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_VERTEX_ID:     return SV_VERTEX_ID;
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_PRIMITIVE_ID:  return SV_PRIMITIVE_ID;
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_INSTANCE_ID:   return SV_INSTANCE_ID;
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_IS_FRONT_FACE: return SV_FACE;
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_SAMPLE_INDEX:  return SV_SAMPLE_INDEX;
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_FINAL_QUAD_U_EQ_0_EDGE_TESSFACTOR:
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_FINAL_QUAD_V_EQ_0_EDGE_TESSFACTOR:
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_FINAL_QUAD_U_EQ_1_EDGE_TESSFACTOR:
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_FINAL_QUAD_V_EQ_1_EDGE_TESSFACTOR:
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_FINAL_QUAD_U_INSIDE_TESSFACTOR:
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_FINAL_QUAD_V_INSIDE_TESSFACTOR:
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_FINAL_TRI_U_EQ_0_EDGE_TESSFACTOR:
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_FINAL_TRI_V_EQ_0_EDGE_TESSFACTOR:
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_FINAL_TRI_W_EQ_0_EDGE_TESSFACTOR:
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_FINAL_TRI_INSIDE_TESSFACTOR:
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_FINAL_LINE_DETAIL_TESSFACTOR:
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_SV_FINAL_LINE_DENSITY_TESSFACTOR:
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      idx = getSVIndex(sv);
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return SV_TESS_FACTOR;
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(!"invalid SM4 system value");
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return SV_UNDEFINED;
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunsigned
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::tgsiSemantic(SVSemantic sv, int index)
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (sv) {
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SV_POSITION:       return TGSI_SEMANTIC_POSITION;
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SV_FACE:           return TGSI_SEMANTIC_FACE;
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SV_LAYER:          return NV50_SEMANTIC_LAYER;
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SV_VIEWPORT_INDEX: return NV50_SEMANTIC_VIEWPORTINDEX;
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SV_POINT_SIZE:     return TGSI_SEMANTIC_PSIZE;
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SV_CLIP_DISTANCE:  return NV50_SEMANTIC_CLIPDISTANCE;
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SV_VERTEX_ID:      return TGSI_SEMANTIC_VERTEXID;
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SV_INSTANCE_ID:    return TGSI_SEMANTIC_INSTANCEID;
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SV_PRIMITIVE_ID:   return TGSI_SEMANTIC_PRIMID;
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SV_TESS_FACTOR:    return NV50_SEMANTIC_TESSFACTOR;
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SV_TESS_COORD:     return NV50_SEMANTIC_TESSCOORD;
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SV_INVOCATION_ID:  return NV50_SEMANTIC_INVOCATIONID;
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TGSI_SEMANTIC_GENERIC;
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::recordSV(unsigned sn, unsigned si, unsigned mask, bool input)
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned int i;
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < info.numSysVals; ++i)
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (info.sv[i].sn == sn &&
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          info.sv[i].si == si)
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return;
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   info.numSysVals = i + 1;
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   info.sv[i].sn = sn;
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   info.sv[i].si = si;
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   info.sv[i].mask = mask;
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   info.sv[i].input = input ? 1 : 0;
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::parseSignature()
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct nv50_ir_varying *patch;
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned int i, r, n;
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   info.numInputs = 0;
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   info.numOutputs = 0;
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   info.numPatchConstants = 0;
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (n = 0, i = 0; i < sm4.num_params_in; ++i) {
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r = sm4.params_in[i].Register;
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      info.in[r].mask |= sm4.params_in[i].ReadWriteMask;
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      // mask might be uninitialized ...
696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!sm4.params_in[i].ReadWriteMask)
697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  info.in[r].mask = 0xf;
698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      info.in[r].id = r;
699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (info.in[r].regular) // already assigned semantic name/index
700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         continue;
701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      info.in[r].regular = 1;
702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      info.in[r].patch = 0;
703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      info.numInputs = MAX2(info.numInputs, r + 1);
705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (sm4.params_in[i].SystemValueType) {
707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_NAME_UNDEFINED:
708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.in[r].sn = TGSI_SEMANTIC_GENERIC;
709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.in[r].si = n++;
710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_NAME_POSITION:
712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.in[r].sn = TGSI_SEMANTIC_POSITION;
713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_NAME_VERTEX_ID:
715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.in[r].sn = TGSI_SEMANTIC_VERTEXID;
716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_NAME_PRIMITIVE_ID:
718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.in[r].sn = TGSI_SEMANTIC_PRIMID;
719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         // no corresponding output
720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         recordSV(TGSI_SEMANTIC_PRIMID, 0, 1, true);
721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_NAME_INSTANCE_ID:
723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.in[r].sn = TGSI_SEMANTIC_INSTANCEID;
724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_NAME_IS_FRONT_FACE:
726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.in[r].sn = TGSI_SEMANTIC_FACE;
727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         // no corresponding output
728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         recordSV(TGSI_SEMANTIC_FACE, 0, 1, true);
729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(!"invalid/unsupported input linkage semantic");
732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (n = 0, i = 0; i < sm4.num_params_out; ++i) {
737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r = sm4.params_out[i].Register;
738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      info.out[r].mask |= ~sm4.params_out[i].ReadWriteMask;
740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      info.out[r].id = r;
741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (info.out[r].regular) // already assigned semantic name/index
742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         continue;
743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      info.out[r].regular = 1;
744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      info.out[r].patch = 0;
745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      info.numOutputs = MAX2(info.numOutputs, r + 1);
747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (sm4.params_out[i].SystemValueType) {
749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_NAME_UNDEFINED:
750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (prog->getType() == Program::TYPE_FRAGMENT) {
751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            info.out[r].sn = TGSI_SEMANTIC_COLOR;
752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            info.out[r].si = info.prop.fp.numColourResults++;
753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         } else {
754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            info.out[r].sn = TGSI_SEMANTIC_GENERIC;
755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            info.out[r].si = n++;
756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_NAME_POSITION:
759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_NAME_DEPTH:
760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_NAME_DEPTH_GREATER_EQUAL:
761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_NAME_DEPTH_LESS_EQUAL:
762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.out[r].sn = TGSI_SEMANTIC_POSITION;
763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.io.fragDepth = r;
764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_NAME_CULL_DISTANCE:
766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_NAME_CLIP_DISTANCE:
767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.out[r].sn = NV50_SEMANTIC_CLIPDISTANCE;
768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.out[r].si = sm4.params_out[i].SemanticIndex;
769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_NAME_RENDER_TARGET_ARRAY_INDEX:
771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.out[r].sn = NV50_SEMANTIC_LAYER;
772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_NAME_VIEWPORT_ARRAY_INDEX:
774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.out[r].sn = NV50_SEMANTIC_VIEWPORTINDEX;
775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_NAME_PRIMITIVE_ID:
777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.out[r].sn = TGSI_SEMANTIC_PRIMID;
778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_NAME_TARGET:
780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.out[r].sn = TGSI_SEMANTIC_COLOR;
781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.out[r].si = sm4.params_out[i].SemanticIndex;
782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_NAME_COVERAGE:
784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.out[r].sn = NV50_SEMANTIC_SAMPLEMASK;
785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.io.sampleMask = r;
786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_NAME_SAMPLE_INDEX:
788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(!"invalid/unsupported output linkage semantic");
790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (prog->getType() == Program::TYPE_TESSELLATION_EVAL)
795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      patch = &info.in[info.numInputs];
796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      patch = &info.out[info.numOutputs];
798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (n = 0, i = 0; i < sm4.num_params_patch; ++i) {
800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      r = sm4.params_patch[i].Register;
801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      patch[r].mask |= sm4.params_patch[i].Mask;
803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      patch[r].id = r;
804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (patch[r].regular) // already visited
805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         continue;
806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      patch[r].regular = 1;
807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      patch[r].patch = 1;
808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      info.numPatchConstants = MAX2(info.numPatchConstants, r + 1);
810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (sm4.params_patch[i].SystemValueType) {
812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_NAME_UNDEFINED:
813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         patch[r].sn = TGSI_SEMANTIC_GENERIC;
814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         patch[r].si = n++;
815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_NAME_FINAL_QUAD_EDGE_TESSFACTOR:
817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_NAME_FINAL_TRI_EDGE_TESSFACTOR:
818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_NAME_FINAL_LINE_DETAIL_TESSFACTOR:
819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         patch[r].sn = NV50_SEMANTIC_TESSFACTOR;
820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         patch[r].si = sm4.params_patch[i].SemanticIndex;
821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_NAME_FINAL_QUAD_INSIDE_TESSFACTOR:
823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_NAME_FINAL_TRI_INSIDE_TESSFACTOR:
824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_NAME_FINAL_LINE_DENSITY_TESSFACTOR:
825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         patch[r].sn = NV50_SEMANTIC_TESSFACTOR;
826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         patch[r].si = sm4.params_patch[i].SemanticIndex + 4;
827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(!"invalid patch-constant linkage semantic");
830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (prog->getType() == Program::TYPE_TESSELLATION_EVAL)
834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      info.numInputs += info.numPatchConstants;
835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      info.numOutputs += info.numPatchConstants;
837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return true;
839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool
842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::inspectDeclaration(const sm4_dcl& dcl)
843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int idx = -1;
845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   enum sm4_interpolation ipa_mode;
846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dcl.op.get() && dcl.op->is_index_simple(0))
848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      idx = dcl.op->indices[0].disp;
849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (dcl.opcode) {
851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_SAMPLER:
852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(idx >= 0);
853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      shadow[idx] = dcl.dcl_sampler.shadow;
854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_RESOURCE:
856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      enum sm4_target targ = (enum sm4_target)dcl.dcl_resource.target;
858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(idx >= 0 && idx < NV50_IR_MAX_RESOURCES);
860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      resourceType[idx][0] = cvtTexTarget(targ, SM4_OPCODE_SAMPLE, NULL);
861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      resourceType[idx][1] = cvtTexTarget(targ, SM4_OPCODE_SAMPLE_C, NULL);
862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_CONSTANT_BUFFER:
865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      // nothing to do
866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_CUSTOMDATA:
868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      info.immd.bufSize = dcl.num * 4;
869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      info.immd.buf = (uint32_t *)MALLOC(info.immd.bufSize);
870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      memcpy(info.immd.buf, dcl.data, info.immd.bufSize);
871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_INDEX_RANGE:
873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      // XXX: ?
874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_INPUT_PS_SGV:
876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_INPUT_PS_SIV:
877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_INPUT_PS:
878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(idx >= 0 && idx < info.numInputs);
880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ipa_mode = (enum sm4_interpolation)dcl.dcl_input_ps.interpolation;
881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      interpMode[idx] = cvtInterpMode(ipa_mode);
882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      setVaryingInterpMode(&info.in[idx], interpMode[idx]);
883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_INPUT_SGV:
886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_INPUT_SIV:
887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_INPUT:
888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (dcl.op->file == SM4_FILE_INPUT_DOMAIN_POINT) {
889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         idx = info.numInputs++;
890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.in[idx].sn = NV50_SEMANTIC_TESSCOORD;
891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.in[idx].mask = dcl.op->mask;
892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      // rest handled in parseSignature
894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_OUTPUT_SGV:
896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_OUTPUT_SIV:
897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (dcl.sv) {
898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case SM4_SV_POSITION:
899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(prog->getType() != Program::TYPE_FRAGMENT);
900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case SM4_SV_CULL_DISTANCE: // XXX: order ?
902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.io.cullDistanceMask |= 1 << info.io.clipDistanceMask;
903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      // fall through
904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case SM4_SV_CLIP_DISTANCE:
905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.io.clipDistanceMask++; // abuse as count
906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (dcl.op->file) {
911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case SM4_FILE_OUTPUT_DEPTH_LESS_EQUAL:
912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case SM4_FILE_OUTPUT_DEPTH_GREATER_EQUAL:
913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case SM4_FILE_OUTPUT_DEPTH:
914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (info.io.fragDepth < 0xff)
915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         idx = info.io.fragDepth = info.numOutputs++;
917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.out[idx].sn = TGSI_SEMANTIC_POSITION;
918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case SM4_FILE_OUTPUT_COVERAGE_MASK:
920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (info.io.sampleMask < 0xff)
921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         idx = info.io.sampleMask = info.numOutputs++;
923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.out[idx].sn = NV50_SEMANTIC_SAMPLEMASK;
924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_OUTPUT:
930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      // handled in parseSignature
931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_TEMPS:
933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      nrRegVals += dcl.num;
934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_INDEXABLE_TEMP:
936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      nrArrays++;
937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_GLOBAL_FLAGS:
939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (prog->getType() == Program::TYPE_FRAGMENT)
940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.prop.fp.earlyFragTests = dcl.dcl_global_flags.early_depth_stencil;
941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_FUNCTION_BODY:
944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_FUNCTION_TABLE:
946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_INTERFACE:
948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      // GP
951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_GS_OUTPUT_PRIMITIVE_TOPOLOGY:
952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      info.prop.gp.outputPrim = g3dPrim(
953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dcl.dcl_gs_output_primitive_topology.primitive_topology);
954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_GS_INPUT_PRIMITIVE:
956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      info.prop.gp.inputPrim = g3dPrim(dcl.dcl_gs_input_primitive.primitive);
957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_MAX_OUTPUT_VERTEX_COUNT:
959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      info.prop.gp.maxVertices = dcl.num;
960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_GS_INSTANCE_COUNT:
962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      info.prop.gp.instanceCount = dcl.num;
963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_STREAM:
965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      // TCP/TEP
968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_INPUT_CONTROL_POINT_COUNT:
969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      info.prop.tp.inputPatchSize =
970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dcl.dcl_input_control_point_count.control_points;
971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_OUTPUT_CONTROL_POINT_COUNT:
973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      info.prop.tp.outputPatchSize =
974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         dcl.dcl_output_control_point_count.control_points;
975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_TESS_DOMAIN:
977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (dcl.dcl_tess_domain.domain) {
978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_TESSELLATOR_DOMAIN_ISOLINE:
979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.prop.tp.domain = PIPE_PRIM_LINES;
980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_TESSELLATOR_DOMAIN_TRI:
982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.prop.tp.domain = PIPE_PRIM_TRIANGLES;
983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_TESSELLATOR_DOMAIN_QUAD:
985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.prop.tp.domain = PIPE_PRIM_QUADS;
986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_TESSELLATOR_DOMAIN_UNDEFINED:
988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.prop.tp.domain = PIPE_PRIM_MAX;
990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_TESS_PARTITIONING:
994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (dcl.dcl_tess_partitioning.partitioning) {
995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_TESSELLATOR_PARTITIONING_FRACTIONAL_ODD:
996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.prop.tp.partitioning = NV50_TESS_PART_FRACT_ODD;
997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_TESSELLATOR_PARTITIONING_FRACTIONAL_EVEN:
999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.prop.tp.partitioning = NV50_TESS_PART_FRACT_EVEN;
1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_TESSELLATOR_PARTITIONING_POW2:
1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.prop.tp.partitioning = NV50_TESS_PART_POW2;
1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_TESSELLATOR_PARTITIONING_INTEGER:
1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_TESSELLATOR_PARTITIONING_UNDEFINED:
1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.prop.tp.partitioning = NV50_TESS_PART_INTEGER;
1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_TESS_OUTPUT_PRIMITIVE:
1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (dcl.dcl_tess_output_primitive.primitive) {
1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_TESSELLATOR_OUTPUT_LINE:
1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.prop.tp.outputPrim = PIPE_PRIM_LINES;
1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_TESSELLATOR_OUTPUT_TRIANGLE_CW:
1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.prop.tp.outputPrim = PIPE_PRIM_TRIANGLES;
1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.prop.tp.winding = +1;
1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_TESSELLATOR_OUTPUT_TRIANGLE_CCW:
1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.prop.tp.outputPrim = PIPE_PRIM_TRIANGLES;
1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.prop.tp.winding = -1;
1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_TESSELLATOR_OUTPUT_POINT:
1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.prop.tp.outputPrim = PIPE_PRIM_POINTS;
1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case D3D_TESSELLATOR_OUTPUT_UNDEFINED:
1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         info.prop.tp.outputPrim = PIPE_PRIM_MAX;
1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_HS_FORK_PHASE:
1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ++subPhaseCnt[0];
1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      phase = 1;
1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_HS_JOIN_PHASE:
1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      phase = 2;
1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ++subPhaseCnt[1];
1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_HS_FORK_PHASE_INSTANCE_COUNT:
1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_HS_JOIN_PHASE_INSTANCE_COUNT:
1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_HS_MAX_TESSFACTOR:
1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      // weird stuff
1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_THREAD_GROUP:
1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_UNORDERED_ACCESS_VIEW_TYPED:
1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_UNORDERED_ACCESS_VIEW_RAW:
1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_UNORDERED_ACCESS_VIEW_STRUCTURED:
1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_THREAD_GROUP_SHARED_MEMORY_RAW:
1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_THREAD_GROUP_SHARED_MEMORY_STRUCTURED:
1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_RESOURCE_RAW:
1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_RESOURCE_STRUCTURED:
1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ERROR("unhandled declaration\n");
1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      abort();
1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return false;
1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(!"invalid SM4 declaration");
1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return false;
1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return true;
1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::allocateValues()
1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   lData = new DataArray[nrArrays];
1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (unsigned int i = 0; i < nrArrays; ++i)
1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      lData[i].setParent(this);
1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tData32.setup(0, nrRegVals, 4, 4, FILE_GPR);
1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   tData64.setup(0, nrRegVals, 2, 8, FILE_GPR);
1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (prog->getType() == Program::TYPE_FRAGMENT)
1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      oData.setup(0, info.numOutputs, 4, 4, FILE_GPR);
1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool Converter::handleDeclaration(const sm4_dcl& dcl)
1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (dcl.opcode) {
1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_INDEXABLE_TEMP:
1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      lData[nrArrays++].setup(arrayVol,
1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              dcl.indexable_temp.num, dcl.indexable_temp.comps,
1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              4, FILE_MEMORY_LOCAL);
1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      arrayVol += dcl.indexable_temp.num * dcl.indexable_temp.comps * 4;
1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_HS_FORK_PHASE:
1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (subPhaseCnt[0])
1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         phaseInstCnt[0][subPhaseCnt[0]] = phaseInstCnt[0][subPhaseCnt[0] - 1];
1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ++subPhaseCnt[0];
1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_HS_JOIN_PHASE:
1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (subPhaseCnt[1])
1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         phaseInstCnt[1][subPhaseCnt[1]] = phaseInstCnt[1][subPhaseCnt[1] - 1];
1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ++subPhaseCnt[1];
1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_HS_FORK_PHASE_INSTANCE_COUNT:
1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      phaseInstCnt[0][subPhaseCnt[0] - 1] = dcl.num;
1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DCL_HS_JOIN_PHASE_INSTANCE_COUNT:
1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      phaseInstCnt[1][subPhaseCnt[1] - 1] = dcl.num;
1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break; // already handled in inspection
1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return true;
1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgSymbol *
1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::iSym(int i, int c)
1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (info.in[i].regular) {
1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return mkSymbol(FILE_SHADER_INPUT, 0, sTy, info.in[i].slot[c] * 4);
1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return mkSysVal(tgsi::irSemantic(info.in[i].sn), info.in[i].si);
1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgSymbol *
1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::oSym(int i, int c)
1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (info.out[i].regular) {
1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return mkSymbol(FILE_SHADER_OUTPUT, 0, dTy, info.out[i].slot[c] * 4);
1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return mkSysVal(tgsi::irSemantic(info.out[i].sn), info.out[i].si);
1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgValue *
1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::getSrcPtr(int s, int dim, int shl)
1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (srcPtr[s][dim])
1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return srcPtr[s][dim];
1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sm4_op *op = insn->ops[s + nDstOpnds]->indices[dim].reg.get();
1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!op)
1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Value *index = src(*op, 0, s);
1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   srcPtr[s][dim] = index;
1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (shl)
1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      srcPtr[s][dim] = mkOp2v(OP_SHL, TYPE_U32, getSSA(), index, mkImm(shl));
1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return srcPtr[s][dim];
1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgValue *
1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::getDstPtr(int d, int dim, int shl)
1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(d == 0);
1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dstPtr[dim])
1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return dstPtr[dim];
1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sm4_op *op = insn->ops[d]->indices[dim].reg.get();
1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!op)
1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Value *index = src(*op, 0, d);
1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (shl)
1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      index = mkOp2v(OP_SHL, TYPE_U32, getSSA(), index, mkImm(shl));
1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (dstPtr[dim] = index);
1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgValue *
1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::getVtxPtr(int s)
1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(s < 3);
1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (vtxBase[s])
1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return vtxBase[s];
1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sm4_op *op = insn->ops[s + nDstOpnds].get();
1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!op)
1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int idx = op->indices[0].disp;
1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vtxBase[s] = getSrcPtr(s, 0, 0);
1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   vtxBase[s] = mkOp2v(OP_PFETCH, TYPE_U32, getSSA(), mkImm(idx), vtxBase[s]);
1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return vtxBase[s];
1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgValue *
1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::src(int i, int c)
1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return src(*insn->ops[i + nDstOpnds], c, i);
1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgValue *
1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::dst(int i, int c)
1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return dst(*insn->ops[i], c, i);
1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::saveDst(int i, int c, Value *value)
1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (insn->insn.sat)
1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mkOp1(OP_SAT, dTy, value, value);
1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return saveDst(*insn->ops[i], c, value, i);
1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgValue *
1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::interpolate(const sm4_op& op, int c, int i)
1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int idx = op.indices[0].disp;
1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int swz = op.swizzle[c];
1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   operation opr =
1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (info.in[idx].linear || info.in[idx].flat) ? OP_LINTERP : OP_PINTERP;
1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Value *ptr = getSrcPtr(i, 0, 4);
1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Instruction *insn = new_Instruction(func, opr, TYPE_F32);
1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   insn->setDef(0, getScratch());
1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   insn->setSrc(0, iSym(idx, swz));
1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (opr == OP_PINTERP)
1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      insn->setSrc(1, fragCoord[3]);
1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ptr)
1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      insn->setIndirect(0, 0, ptr);
1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   insn->setInterpolate(interpMode[idx]);
1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bb->insertTail(insn);
1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return insn->getDef(0);
1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgValue *
1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::src(const sm4_op& op, int c, int s)
1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const int size = typeSizeof(sTy);
1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Instruction *ld;
1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Value *res, *ptr, *vtx;
1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int idx, dim, off;
1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const int swz = op.swizzle[c];
1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (op.file) {
1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_IMMEDIATE32:
1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      res = loadImm(NULL, (uint32_t)op.imm_values[swz].u32);
1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_IMMEDIATE64:
1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(c < 2);
1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      res = loadImm(NULL, op.imm_values[swz].u64);
1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_TEMP:
1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(op.is_index_simple(0));
1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      idx = op.indices[0].disp;
1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (size == 8)
1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         res = tData64.load(idx, swz, NULL);
1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         res = tData32.load(idx, swz, NULL);
1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_INPUT:
1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_INPUT_CONTROL_POINT:
1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_INPUT_PATCH_CONSTANT:
1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (prog->getType() == Program::TYPE_FRAGMENT)
1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return interpolate(op, c, s);
1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      idx = 0;
1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (op.file == SM4_FILE_INPUT_PATCH_CONSTANT)
1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         idx = info.numInputs - info.numPatchConstants;
1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (op.num_indices == 2) {
1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         vtx = getVtxPtr(s);
1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ptr = getSrcPtr(s, 1, 4);
1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         idx += op.indices[1].disp;
1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         res = getSSA();
1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ld = mkOp1(OP_VFETCH, TYPE_U32, res, iSym(idx, swz));
1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ld->setIndirect(0, 0, ptr);
1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ld->setIndirect(0, 1, vtx);
1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         idx += op.indices[0].disp;
1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         res = mkLoad(sTy, iSym(idx, swz), getSrcPtr(s, 0, 4));
1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (op.file == SM4_FILE_INPUT_PATCH_CONSTANT)
1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         res->defs->getInsn()->perPatch = 1;
1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_CONSTANT_BUFFER:
1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(op.num_indices == 2);
1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(op.is_index_simple(0));
1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ptr = getSrcPtr(s, 1, 4);
1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dim = op.indices[0].disp;
1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      off = (op.indices[1].disp * 4 + swz) * (sTy == TYPE_F64 ? 8 : 4);
1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      res = mkLoad(sTy, mkSymbol(FILE_MEMORY_CONST, dim, sTy, off), ptr);
1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_IMMEDIATE_CONSTANT_BUFFER:
1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ptr = getSrcPtr(s, 0, 4);
1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      off = (op.indices[0].disp * 4 + swz) * 4;
1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      res = mkLoad(sTy, mkSymbol(FILE_MEMORY_CONST, 14, sTy, off), ptr);
1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_INDEXABLE_TEMP:
1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(op.is_index_simple(0));
1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int a = op.indices[0].disp;
1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      idx = op.indices[1].disp;
1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      res = lData[a].load(idx, swz, getSrcPtr(s, 1, 4));
1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_INPUT_PRIMITIVEID:
1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      recordSV(TGSI_SEMANTIC_PRIMID, 0, 1, true);
1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      res = mkOp1v(OP_RDSV, TYPE_U32, getSSA(), mkSysVal(SV_PRIMITIVE_ID, 0));
1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_INPUT_GS_INSTANCE_ID:
1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_OUTPUT_CONTROL_POINT_ID:
1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      recordSV(NV50_SEMANTIC_INVOCATIONID, 0, 1, true);
1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      res = mkOp1v(OP_RDSV, TYPE_U32, getSSA(), mkSysVal(SV_INVOCATION_ID, 0));
1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_CYCLE_COUNTER:
1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      res =
1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mkOp1v(OP_RDSV, TYPE_U32, getSSA(), mkSysVal(SV_CLOCK, swz ? 1 : 0));
1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_INPUT_FORK_INSTANCE_ID:
1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_INPUT_JOIN_INSTANCE_ID:
1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      phaseInstanceUsed = true;
1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (unrollPhase)
1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return loadImm(NULL, phaseInstance);
1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const unsigned int cnt = phaseInstCnt[phase - 1][subPhase];
1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      res = getScratch();
1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      res = mkOp1v(OP_RDSV, TYPE_U32, res, mkSysVal(SV_INVOCATION_ID, 0));
1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      res = mkOp2v(OP_MIN, TYPE_U32, res, res, loadImm(NULL, cnt - 1));
1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_INPUT_DOMAIN_POINT:
1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(swz < 3);
1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      res = domainPt[swz];
1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_THREAD_GROUP_SHARED_MEMORY:
1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      off = (op.indices[0].disp * 4 + swz) * (sTy == TYPE_F64 ? 8 : 4);
1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ptr = getSrcPtr(s, 0, 4);
1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      res = mkLoad(sTy, mkSymbol(FILE_MEMORY_SHARED, 0, sTy, off), ptr);
1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_RESOURCE:
1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_SAMPLER:
1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_UNORDERED_ACCESS_VIEW:
1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_INPUT_THREAD_ID:
1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      res = mkOp1v(OP_RDSV, TYPE_U32, getSSA(), mkSysVal(SV_TID, swz));
1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_INPUT_THREAD_GROUP_ID:
1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      res = mkOp1v(OP_RDSV, TYPE_U32, getSSA(), mkSysVal(SV_CTAID, swz));
1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_FUNCTION_INPUT:
1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_INPUT_THREAD_ID_IN_GROUP:
1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(!"unhandled source file");
1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(!"invalid source file");
1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (op.abs)
1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      res = mkOp1v(OP_ABS, sTy, getSSA(res->reg.size), res);
1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (op.neg)
1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      res = mkOp1v(OP_NEG, sTy, getSSA(res->reg.size), res);
1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return res;
1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgValue *
1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::dst(const sm4_op &op, int c, int i)
1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (op.file) {
1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_TEMP:
1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return tData32.acquire(op.indices[0].disp, c);
1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_INDEXABLE_TEMP:
1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return getScratch();
1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_OUTPUT:
1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (prog->getType() == Program::TYPE_FRAGMENT)
1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return oData.acquire(op.indices[0].disp, c);
1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return getScratch();
1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_NULL:
1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_OUTPUT_DEPTH:
1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_OUTPUT_DEPTH_GREATER_EQUAL:
1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_OUTPUT_DEPTH_LESS_EQUAL:
1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_OUTPUT_COVERAGE_MASK:
1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return getScratch();
1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_IMMEDIATE32:
1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_IMMEDIATE64:
1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_CONSTANT_BUFFER:
1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_RESOURCE:
1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_SAMPLER:
1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_UNORDERED_ACCESS_VIEW:
1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(!"invalid destination file");
1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(!"invalid file");
1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::saveFragDepth(operation op, Value *value)
1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (op == OP_MIN || op == OP_MAX) {
1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      Value *zIn;
1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      zIn = mkOp1v(OP_RDSV, TYPE_F32, getSSA(), mkSysVal(SV_POSITION, 2));
1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      value = mkOp2v(op, TYPE_F32, getSSA(), value, zIn);
1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   oData.store(info.io.fragDepth, 2, NULL, value);
1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::saveDst(const sm4_op &op, int c, Value *value, int s)
1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Symbol *sym;
1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Instruction *st;
1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int a, idx;
1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (op.file) {
1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_TEMP:
1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      idx = op.indices[0].disp;
1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      tData32.store(idx, c, NULL, value);
1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_INDEXABLE_TEMP:
1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      a = op.indices[0].disp;
1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      idx = op.indices[1].disp;
1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      // FIXME: shift is wrong, depends in lData
1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      lData[a].store(idx, c, getDstPtr(s, 1, 4), value);
1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_OUTPUT:
1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(op.num_indices == 1);
1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      idx = op.indices[0].disp;
1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (prog->getType() == Program::TYPE_FRAGMENT) {
1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         oData.store(idx, c, NULL, value);
1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (phase)
1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            idx += info.numOutputs - info.numPatchConstants;
1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         const int shl = (info.out[idx].sn == NV50_SEMANTIC_TESSFACTOR) ? 2 : 4;
1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         sym = oSym(idx, c);
1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (sym->reg.file == FILE_SHADER_OUTPUT)
1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            st = mkStore(OP_EXPORT, dTy, sym, getDstPtr(s, 0, shl), value);
1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else
1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            st = mkStore(OP_WRSV, dTy, sym, getDstPtr(s, 0, 2), value);
1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         st->perPatch = phase ? 1 : 0;
1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_OUTPUT_DEPTH_GREATER_EQUAL:
1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      saveFragDepth(OP_MAX, value);
1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_OUTPUT_DEPTH_LESS_EQUAL:
1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      saveFragDepth(OP_MIN, value);
1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_OUTPUT_DEPTH:
1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      saveFragDepth(OP_NOP, value);
1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_OUTPUT_COVERAGE_MASK:
1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      oData.store(info.io.sampleMask, 0, NULL, value);
1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_IMMEDIATE32:
1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_IMMEDIATE64:
1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_INPUT:
1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_CONSTANT_BUFFER:
1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_RESOURCE:
1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_FILE_SAMPLER:
1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(!"invalid destination file");
1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(!"invalid file");
1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::emitTex(Value *dst0[4], TexInstruction *tex, const uint8_t swz[4])
1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Value *res[4] = { NULL, NULL, NULL, NULL };
1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned int c, d;
1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (c = 0; c < 4; ++c)
1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (dst0[c])
1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         tex->tex.mask |= 1 << swz[c];
1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (d = 0, c = 0; c < 4; ++c)
1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (tex->tex.mask & (1 << c))
1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         tex->setDef(d++, (res[c] = getScratch()));
1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bb->insertTail(tex);
1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (insn->opcode == SM4_OPCODE_RESINFO) {
1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (tex->tex.target.getDim() == 1) {
1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 res[2] = loadImm(NULL, 0);
1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!tex->tex.target.isArray())
1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            res[1] = res[2];
1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else
1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (tex->tex.target.getDim() == 2 && !tex->tex.target.isArray()) {
1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         res[2] = loadImm(NULL, 0);
1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (c = 0; c < 4; ++c) {
1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!dst0[c])
1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            continue;
1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         Value *src = res[swz[c]];
1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(src);
1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         switch (insn->insn.resinfo_return_type) {
1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 0:
1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            mkCvt(OP_CVT, TYPE_F32, dst0[c], TYPE_U32, src);
1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 1:
1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            mkCvt(OP_CVT, TYPE_F32, dst0[c], TYPE_U32, src);
1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (swz[c] < tex->tex.target.getDim())
1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               mkOp1(OP_RCP, TYPE_F32, dst0[c], dst0[c]);
1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            mkMov(dst0[c], src);
1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (c = 0; c < 4; ++c)
1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (dst0[c])
1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            mkMov(dst0[c], res[swz[c]]);
1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::handleQUERY(Value *dst0[4], enum TexQuery query)
1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TexInstruction *texi = new_TexInstruction(func, OP_TXQ);
1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texi->tex.query = query;
1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(insn->ops[2]->file == SM4_FILE_RESOURCE); // TODO: UAVs
1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const int rOp = (query == TXQ_DIMS) ? 2 : 1;
1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const int sOp = (query == TXQ_DIMS) ? 0 : 1;
1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const int tR = insn->ops[rOp]->indices[0].disp;
1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texi->setTexture(resourceType[tR][0], tR, 0);
1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texi->setSrc(0, src(sOp, 0)); // mip level or sample index
1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emitTex(dst0, texi, insn->ops[rOp]->swizzle);
1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::handleLOAD(Value *dst0[4])
1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TexInstruction *texi = new_TexInstruction(func, OP_TXF);
1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned int c;
1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const int tR = insn->ops[2]->indices[0].disp;
1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texi->setTexture(resourceType[tR][0], tR, 0);
1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (c = 0; c < texi->tex.target.getArgCount(); ++c)
1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      texi->setSrc(c, src(0, c));
1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (texi->tex.target == TEX_TARGET_BUFFER) {
1557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      texi->tex.levelZero = true;
1558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
1559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      texi->setSrc(c++, src(0, 3));
1560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (c = 0; c < 3; ++c) {
1561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         texi->tex.offset[0][c] = insn->sample_offset[c];
1562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (texi->tex.offset[0][c])
1563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            texi->tex.useOffsets = 1;
1564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emitTex(dst0, texi, insn->ops[2]->swizzle);
1568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// order of nv50 ir sources: x y z/layer lod/bias dc
1571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::handleSAMPLE(operation opr, Value *dst0[4])
1573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TexInstruction *texi = new_TexInstruction(func, opr);
1575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned int c, s;
1576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Value *arg[4], *src0[4];
1577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Value *val;
1578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Value *lod = NULL, *dc = NULL;
1579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const int tR = insn->ops[2]->indices[0].disp;
1581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const int tS = insn->ops[3]->indices[0].disp;
1582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   TexInstruction::Target tgt = resourceType[tR][shadow[tS] ? 1 : 0];
1584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (c = 0; c < tgt.getArgCount(); ++c)
1586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      arg[c] = src0[c] = src(0, c);
1587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (insn->opcode == SM4_OPCODE_SAMPLE_L ||
1589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       insn->opcode == SM4_OPCODE_SAMPLE_B) {
1590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      lod = src(3, 0);
1591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else
1592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (insn->opcode == SM4_OPCODE_SAMPLE_C ||
1593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       insn->opcode == SM4_OPCODE_SAMPLE_C_LZ) {
1594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dc = src(3, 0);
1595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (insn->opcode == SM4_OPCODE_SAMPLE_C_LZ)
1596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         texi->tex.levelZero = true;
1597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else
1598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (insn->opcode == SM4_OPCODE_SAMPLE_D) {
1599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (c = 0; c < tgt.getDim(); ++c) {
1600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         texi->dPdx[c] = src(3, c);
1601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         texi->dPdy[c] = src(4, c);
1602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (tgt.isCube()) {
1606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (c = 0; c < 3; ++c)
1607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         src0[c] = mkOp1v(OP_ABS, TYPE_F32, getSSA(), arg[c]);
1608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      val = getScratch();
1609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mkOp2(OP_MAX, TYPE_F32, val, src0[0], src0[1]);
1610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mkOp2(OP_MAX, TYPE_F32, val, src0[2], val);
1611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mkOp1(OP_RCP, TYPE_F32, val, val);
1612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (c = 0; c < 3; ++c)
1613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         src0[c] = mkOp2v(OP_MUL, TYPE_F32, getSSA(), arg[c], val);
1614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (s = 0; s < tgt.getArgCount(); ++s)
1617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      texi->setSrc(s, src0[s]);
1618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (lod)
1619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      texi->setSrc(s++, lod);
1620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (dc)
1621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      texi->setSrc(s++, dc);
1622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (c = 0; c < 3; ++c) {
1624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      texi->tex.offset[0][c] = insn->sample_offset[c];
1625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (texi->tex.offset[0][c])
1626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         texi->tex.useOffsets = 1;
1627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   texi->setTexture(tgt, tR, tS);
1630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emitTex(dst0, texi, insn->ops[2]->swizzle);
1632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::handleDP(Value *dst0[4], int dim)
1636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Value *src0 = src(0, 0), *src1 = src(1, 0);
1638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Value *dotp = getScratch();
1639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(dim > 0);
1641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mkOp2(OP_MUL, TYPE_F32, dotp, src0, src1);
1643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (int c = 1; c < dim; ++c)
1644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mkOp3(OP_MAD, TYPE_F32, dotp, src(0, c), src(1, c), dotp);
1645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (int c = 0; c < 4; ++c)
1647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dst0[c] = dotp;
1648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::insertConvergenceOps(BasicBlock *conv, BasicBlock *fork)
1652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FlowInstruction *join = new_FlowInstruction(func, OP_JOIN, NULL);
1654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   join->fixed = 1;
1655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   conv->insertHead(join);
1656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fork->joinAt = new_FlowInstruction(func, OP_JOINAT, conv);
1658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fork->insertBefore(fork->getExit(), fork->joinAt);
1659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::finalizeShader()
1663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (finalized)
1665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BasicBlock *epilogue = reinterpret_cast<BasicBlock *>(leaveBBs.pop().u.p);
1667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   entryBBs.pop();
1668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   finalized = true;
1670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bb->cfg.attach(&epilogue->cfg, Graph::Edge::TREE);
1672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   setPosition(epilogue, true);
1673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (prog->getType() == Program::TYPE_FRAGMENT)
1675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      exportOutputs();
1676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mkOp(OP_EXIT, TYPE_NONE, NULL)->terminator = 1;
1678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FOR_EACH_DST0_ENABLED_CHANNEL32(chan)         \
1681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for ((chan) = 0; (chan) < 4; ++(chan))             \
1682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (insn->ops[0].get()->mask & (1 << (chan)))
1683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FOR_EACH_DST0_ENABLED_CHANNEL64(chan)         \
1685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for ((chan) = 0; (chan) < 2; ++(chan))             \
1686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (insn->ops[0].get()->mask & (1 << (chan)))
1687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool
1689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::checkDstSrcAliasing() const
1690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (unsigned int d = 0; d < nDstOpnds; ++d) {
1692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (unsigned int s = nDstOpnds; s < insn->num_ops; ++s) {
1693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (insn->ops[d]->file != insn->ops[s]->file)
1694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            continue;
1695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         int i = insn->ops[s]->num_indices - 1;
1696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (i != insn->ops[d]->num_indices - 1)
1697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            continue;
1698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (insn->ops[d]->is_index_simple(i) &&
1699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             insn->ops[s]->is_index_simple(i) &&
1700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             insn->ops[d]->indices[i].disp == insn->ops[s]->indices[i].disp)
1701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return true;
1702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return false;
1705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool
1708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::handleInstruction(unsigned int pos)
1709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Value *dst0[4], *rDst0[4];
1711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Value *dst1[4], *rDst1[4];
1712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int c, nc;
1713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   insn = sm4.insns[pos];
1715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   enum sm4_opcode opcode = static_cast<sm4_opcode>(insn->opcode);
1716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   operation op = cvtOpcode(opcode);
1718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sTy = inferSrcType(opcode);
1720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dTy = inferDstType(opcode);
1721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   nc = dTy == TYPE_F64 ? 2 : 4;
1723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   nDstOpnds = getDstOpndCount(opcode);
1725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool useScratchDst = checkDstSrcAliasing();
1727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   INFO("SM4_OPCODE_##%u, aliasing = %u\n", insn->opcode, useScratchDst);
1729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (nDstOpnds >= 1) {
1731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (c = 0; c < nc; ++c)
1732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         rDst0[c] = dst0[c] =
1733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            insn->ops[0].get()->mask & (1 << c) ? dst(0, c) : NULL;
1734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (useScratchDst)
1735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (c = 0; c < nc; ++c)
1736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dst0[c] = rDst0[c] ? getScratch() : NULL;
1737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (nDstOpnds >= 2) {
1740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (c = 0; c < nc; ++c)
1741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         rDst1[c] = dst1[c] =
1742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            insn->ops[1].get()->mask & (1 << c) ? dst(1, c) : NULL;
1743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (useScratchDst)
1744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (c = 0; c < nc; ++c)
1745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dst1[c] = rDst1[c] ? getScratch() : NULL;
1746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (insn->opcode) {
1749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ADD:
1750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_AND:
1751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DIV:
1752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_IADD:
1753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_IMAX:
1754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_IMIN:
1755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_MIN:
1756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_MAX:
1757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_MUL:
1758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_OR:
1759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_UMAX:
1760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_UMIN:
1761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_XOR:
1762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FOR_EACH_DST0_ENABLED_CHANNEL32(c) {
1763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         Instruction *insn = mkOp2(op, dTy, dst0[c], src(0, c), src(1, c));
1764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (dTy == TYPE_F32)
1765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            insn->ftz = 1;
1766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ISHL:
1770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ISHR:
1771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_USHR:
1772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FOR_EACH_DST0_ENABLED_CHANNEL32(c) {
1773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         Instruction *insn = mkOp2(op, dTy, dst0[c], src(0, c), src(1, c));
1774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         insn->subOp = NV50_IR_SUBOP_SHIFT_WRAP;
1775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_IMAD:
1779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_MAD:
1780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_UMAD:
1781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FOR_EACH_DST0_ENABLED_CHANNEL32(c) {
1782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mkOp3(OP_MAD, dTy, dst0[c], src(0, c), src(1, c), src(2, c));
1783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DADD:
1787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DMAX:
1788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DMIN:
1789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DMUL:
1790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FOR_EACH_DST0_ENABLED_CHANNEL64(c) {
1791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mkOp2(op, dTy, dst0[c], src(0, c), src(1, c));
1792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_UDIV:
1796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (c = 0; c < 4; ++c) {
1797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         Value *dvn, *dvs;
1798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (dst0[c] || dst1[c]) {
1799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dvn = src(0, c);
1800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            dvs = src(1, c);
1801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (dst0[c])
1803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            mkOp2(OP_DIV, TYPE_U32, dst0[c], dvn, dvs);
1804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (dst1[c])
1805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            mkOp2(OP_MOD, TYPE_U32, dst1[c], dvn, dvs);
1806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_IMUL:
1810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_UMUL:
1811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (c = 0; c < 4; ++c) {
1812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         Value *a, *b;
1813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (dst0[c] || dst1[c]) {
1814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            a = src(0, c);
1815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            b = src(1, c);
1816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (dst0[c])
1818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            mkOp2(OP_MUL, dTy, dst0[c], a, b)->subOp =
1819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               NV50_IR_SUBOP_MUL_HIGH;
1820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (dst1[c])
1821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            mkOp2(OP_MUL, dTy, dst1[c], a, b);
1822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DP2:
1826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      handleDP(dst0, 2);
1827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DP3:
1829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      handleDP(dst0, 3);
1830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DP4:
1832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      handleDP(dst0, 4);
1833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DERIV_RTX:
1836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DERIV_RTX_COARSE:
1837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DERIV_RTX_FINE:
1838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DERIV_RTY:
1839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DERIV_RTY_COARSE:
1840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DERIV_RTY_FINE:
1841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_MOV:
1842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_INEG:
1843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_NOT:
1844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_SQRT:
1845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_COUNTBITS:
1846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_EXP:
1847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_LOG:
1848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_RCP:
1849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FOR_EACH_DST0_ENABLED_CHANNEL32(c) {
1850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mkOp1(op, dTy, dst0[c], src(0, c));
1851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_FRC:
1855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FOR_EACH_DST0_ENABLED_CHANNEL32(c) {
1856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         Value *val = getScratch();
1857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         Value *src0 = src(0, c);
1858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mkOp1(OP_FLOOR, TYPE_F32, val, src0);
1859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mkOp2(OP_SUB, TYPE_F32, dst0[c], src0, val);
1860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_MOVC:
1864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FOR_EACH_DST0_ENABLED_CHANNEL32(c)
1865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mkCmp(OP_SLCT, CC_NE, TYPE_U32, dst0[c], src(1, c), src(2, c),
1866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               src(0, c));
1867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ROUND_NE:
1870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ROUND_NI:
1871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ROUND_PI:
1872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ROUND_Z:
1873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FOR_EACH_DST0_ENABLED_CHANNEL32(c) {
1874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         Instruction *rnd = mkOp1(op, dTy, dst0[c], src(0, c));
1875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         rnd->ftz = 1;
1876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         rnd->rnd = cvtRoundingMode(opcode);
1877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_RSQ:
1881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FOR_EACH_DST0_ENABLED_CHANNEL32(c)
1882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mkOp1(op, dTy, dst0[c], src(0, c));
1883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_SINCOS:
1886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (c = 0; c < 4; ++c) {
1887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!dst0[c] && !dst1[c])
1888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            continue;
1889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         Value *val = mkOp1v(OP_PRESIN, TYPE_F32, getScratch(), src(0, c));
1890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (dst0[c])
1891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            mkOp1(OP_SIN, TYPE_F32, dst0[c], val);
1892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (dst1[c])
1893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            mkOp1(OP_COS, TYPE_F32, dst1[c], val);
1894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_EQ:
1898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_GE:
1899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_IEQ:
1900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_IGE:
1901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ILT:
1902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_LT:
1903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_NE:
1904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_INE:
1905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ULT:
1906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_UGE:
1907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DEQ:
1908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DGE:
1909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DLT:
1910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DNE:
1911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
1912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      CondCode cc = cvtCondCode(opcode);
1913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FOR_EACH_DST0_ENABLED_CHANNEL32(c) {
1914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         CmpInstruction *set;
1915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         set = mkCmp(op, cc, sTy, dst0[c], src(0, c), src(1, c), NULL);
1916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         set->setType(dTy, sTy);
1917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (sTy == TYPE_F32)
1918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            set->ftz = 1;
1919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_FTOI:
1924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_FTOU:
1925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FOR_EACH_DST0_ENABLED_CHANNEL32(c)
1926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mkCvt(op, dTy, dst0[c], sTy, src(0, c))->rnd = ROUND_Z;
1927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ITOF:
1929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_UTOF:
1930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_F32TOF16:
1931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_F16TOF32:
1932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DTOF:
1933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_FTOD:
1934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FOR_EACH_DST0_ENABLED_CHANNEL32(c)
1935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mkCvt(op, dTy, dst0[c], sTy, src(0, c));
1936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_CUT:
1939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_CUT_STREAM:
1940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mkOp1(OP_RESTART, TYPE_U32, NULL, mkImm(0))->fixed = 1;
1941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_EMIT:
1943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_EMIT_STREAM:
1944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mkOp1(OP_EMIT, TYPE_U32, NULL, mkImm(0))->fixed = 1;
1945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_EMITTHENCUT:
1947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_EMITTHENCUT_STREAM:
1948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
1949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      Instruction *cut = mkOp1(OP_EMIT, TYPE_U32, NULL,  mkImm(0));
1950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cut->fixed = 1;
1951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cut->subOp = NV50_IR_SUBOP_EMIT_RESTART;
1952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_DISCARD:
1956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      info.prop.fp.usesDiscard = TRUE;
1957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mkOp(OP_DISCARD, TYPE_NONE, NULL)->setPredicate(
1958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         insn->insn.test_nz ? CC_P : CC_NOT_P, src(0, 0));
1959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_CALL:
1962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_CALLC:
1963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(!"CALL/CALLC not implemented");
1964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_RET:
1967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      // XXX: the following doesn't work with subroutines / early ret
1968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!haveNextPhase(pos))
1969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         finalizeShader();
1970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
1971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         phaseEnded = phase + 1;
1972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_IF:
1975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
1976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      BasicBlock *ifClause = new BasicBlock(func);
1977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bb->cfg.attach(&ifClause->cfg, Graph::Edge::TREE);
1979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      condBBs.push(bb);
1980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      joinBBs.push(bb);
1981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mkFlow(OP_BRA, NULL, insn->insn.test_nz ? CC_NOT_P : CC_P, src(0, 0));
1983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      setPosition(ifClause, true);
1985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ELSE:
1988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
1989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      BasicBlock *elseClause = new BasicBlock(func);
1990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      BasicBlock *forkPoint = reinterpret_cast<BasicBlock *>(condBBs.pop().u.p);
1991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      forkPoint->cfg.attach(&elseClause->cfg, Graph::Edge::TREE);
1993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      condBBs.push(bb);
1994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      forkPoint->getExit()->asFlow()->target.bb = elseClause;
1996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!bb->isTerminated())
1997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mkFlow(OP_BRA, NULL, CC_ALWAYS, NULL);
1998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      setPosition(elseClause, true);
2000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
2002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ENDIF:
2003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
2004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      BasicBlock *convPoint = new BasicBlock(func);
2005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      BasicBlock *lastBB = reinterpret_cast<BasicBlock *>(condBBs.pop().u.p);
2006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      BasicBlock *forkPoint = reinterpret_cast<BasicBlock *>(joinBBs.pop().u.p);
2007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!bb->isTerminated()) {
2009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         // we only want join if none of the clauses ended with CONT/BREAK/RET
2010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (lastBB->getExit()->op == OP_BRA && joinBBs.getSize() < 6)
2011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            insertConvergenceOps(convPoint, forkPoint);
2012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mkFlow(OP_BRA, convPoint, CC_ALWAYS, NULL);
2013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         bb->cfg.attach(&convPoint->cfg, Graph::Edge::FORWARD);
2014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (lastBB->getExit()->op == OP_BRA) {
2017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         lastBB->cfg.attach(&convPoint->cfg, Graph::Edge::FORWARD);
2018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         lastBB->getExit()->asFlow()->target.bb = convPoint;
2019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      setPosition(convPoint, true);
2021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
2023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_SWITCH:
2025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_CASE:
2026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ENDSWITCH:
2027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(!"SWITCH/CASE/ENDSWITCH not implemented");
2028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
2029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_LOOP:
2031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
2032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      BasicBlock *loopHeader = new BasicBlock(func);
2033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      BasicBlock *loopBreak = new BasicBlock(func);
2034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      loopBBs.push(loopHeader);
2036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      breakBBs.push(loopBreak);
2037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (loopBBs.getSize() > func->loopNestingBound)
2038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         func->loopNestingBound++;
2039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mkFlow(OP_PREBREAK, loopBreak, CC_ALWAYS, NULL);
2041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bb->cfg.attach(&loopHeader->cfg, Graph::Edge::TREE);
2043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      setPosition(loopHeader, true);
2044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mkFlow(OP_PRECONT, loopHeader, CC_ALWAYS, NULL);
2045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
2047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_ENDLOOP:
2048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
2049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      BasicBlock *loopBB = reinterpret_cast<BasicBlock *>(loopBBs.pop().u.p);
2050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!bb->isTerminated()) {
2052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mkFlow(OP_CONT, loopBB, CC_ALWAYS, NULL);
2053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         bb->cfg.attach(&loopBB->cfg, Graph::Edge::BACK);
2054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      setPosition(reinterpret_cast<BasicBlock *>(breakBBs.pop().u.p), true);
2056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
2058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_BREAK:
2059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
2060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (bb->isTerminated())
2061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
2062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      BasicBlock *breakBB = reinterpret_cast<BasicBlock *>(breakBBs.peek().u.p);
2063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mkFlow(OP_BREAK, breakBB, CC_ALWAYS, NULL);
2064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bb->cfg.attach(&breakBB->cfg, Graph::Edge::CROSS);
2065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
2067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_BREAKC:
2068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
2069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      BasicBlock *nextBB = new BasicBlock(func);
2070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      BasicBlock *breakBB = reinterpret_cast<BasicBlock *>(breakBBs.peek().u.p);
2071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      CondCode cc = insn->insn.test_nz ? CC_P : CC_NOT_P;
2072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mkFlow(OP_BREAK, breakBB, cc, src(0, 0));
2073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bb->cfg.attach(&breakBB->cfg, Graph::Edge::CROSS);
2074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bb->cfg.attach(&nextBB->cfg, Graph::Edge::FORWARD);
2075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      setPosition(nextBB, true);
2076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
2078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_CONTINUE:
2079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
2080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (bb->isTerminated())
2081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
2082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      BasicBlock *contBB = reinterpret_cast<BasicBlock *>(loopBBs.peek().u.p);
2083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mkFlow(OP_CONT, contBB, CC_ALWAYS, NULL);
2084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      contBB->explicitCont = true;
2085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bb->cfg.attach(&contBB->cfg, Graph::Edge::BACK);
2086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
2088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_CONTINUEC:
2089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
2090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      BasicBlock *nextBB = new BasicBlock(func);
2091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      BasicBlock *contBB = reinterpret_cast<BasicBlock *>(loopBBs.peek().u.p);
2092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mkFlow(OP_CONT, contBB, insn->insn.test_nz ? CC_P : CC_NOT_P, src(0, 0));
2093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bb->cfg.attach(&contBB->cfg, Graph::Edge::BACK);
2094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bb->cfg.attach(&nextBB->cfg, Graph::Edge::FORWARD);
2095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      setPosition(nextBB, true);
2096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
2098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_SAMPLE:
2100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_SAMPLE_C:
2101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_SAMPLE_C_LZ:
2102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_SAMPLE_L:
2103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_SAMPLE_D:
2104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_SAMPLE_B:
2105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      handleSAMPLE(op, dst0);
2106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
2107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_LD:
2108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_LD_MS:
2109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      handleLOAD(dst0);
2110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
2111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_GATHER4:
2113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(!"GATHER4 not implemented\n");
2114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
2115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_RESINFO:
2117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      handleQUERY(dst0, TXQ_DIMS);
2118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
2119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_SAMPLE_POS:
2120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      handleQUERY(dst0, TXQ_SAMPLE_POSITION);
2121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
2122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_NOP:
2124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mkOp(OP_NOP, TYPE_NONE, NULL);
2125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
2126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_HS_DECLS:
2128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      // XXX: any significance ?
2129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
2130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_HS_CONTROL_POINT_PHASE:
2131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      phase = 0;
2132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
2133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_HS_FORK_PHASE:
2134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (phase != 1)
2135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         subPhase = 0;
2136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      phase = 1;
2137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      phaseInstance = (phaseStart == pos) ? (phaseInstance + 1) : 0;
2138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      phaseStart = pos;
2139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (info.prop.tp.outputPatchSize < phaseInstCnt[0][subPhase])
2140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         unrollPhase = true;
2141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
2142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case SM4_OPCODE_HS_JOIN_PHASE:
2143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (phase != 2)
2144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         subPhase = 0;
2145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      phase = 2;
2146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      phaseInstance = (phaseStart == pos) ? (phaseInstance + 1) : 0;
2147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      phaseStart = pos;
2148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (info.prop.tp.outputPatchSize < phaseInstCnt[1][subPhase])
2149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         unrollPhase = true;
2150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
2151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
2153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ERROR("SM4_OPCODE_#%u illegal / not supported\n", insn->opcode);
2154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      abort();
2155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return false;
2156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (c = 0; c < nc; ++c) {
2159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (nDstOpnds >= 1 && rDst0[c]) {
2160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (dst0[c] != rDst0[c])
2161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            mkMov(rDst0[c], dst0[c]);
2162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         saveDst(0, c, rDst0[c]);
2163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (nDstOpnds >= 2 && rDst1[c]) {
2165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (dst1[c] != rDst1[c])
2166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            mkMov(rDst1[c], dst1[c]);
2167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         saveDst(1, c, rDst1[c]);
2168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(srcPtr, 0, sizeof(srcPtr));
2172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(dstPtr, 0, sizeof(dstPtr));
2173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(vtxBase, 0, sizeof(vtxBase));
2174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return true;
2175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
2178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::exportOutputs()
2179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (int i = 0; i < info.numOutputs; ++i) {
2181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (int c = 0; c < 4; ++c) {
2182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!oData.exists(i, c))
2183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            continue;
2184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         Symbol *sym = mkSymbol(FILE_SHADER_OUTPUT, 0, TYPE_F32,
2185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                info.out[i].slot[c] * 4);
2186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         Value *val = oData.load(i, c, NULL);
2187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (val)
2188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            mkStore(OP_EXPORT, TYPE_F32, sym, NULL, val);
2189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::Converter(Program *p, struct nv50_ir_prog_info *s)
2194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   : tData32(this),
2195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     tData64(this),
2196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     oData(this),
2197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     info(*s),
2198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     sm4(*reinterpret_cast<const sm4_program *>(s->bin.source)),
2199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org     prog(p)
2200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(srcPtr, 0, sizeof(srcPtr));
2202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(dstPtr, 0, sizeof(dstPtr));
2203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(vtxBase, 0, sizeof(vtxBase));
2204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(interpMode, 0, sizeof(interpMode));
2206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   nrRegVals = nrArrays = arrayVol = 0;
2208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (phase = 3; phase > 0; --phase)
2210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (unsigned int i = 0; i < PIPE_MAX_SHADER_OUTPUTS; ++i)
2211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         out[phase - 1][i].sn = TGSI_SEMANTIC_COUNT;
2212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unrollPhase = false;
2214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   phaseStart = 0;
2215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   subPhaseCnt[0] = subPhaseCnt[1] = 0;
2216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::~Converter()
2219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (lData)
2221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      delete[] lData;
2222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (subPhaseCnt[0])
2224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      delete[] phaseInstCnt[0];
2225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (subPhaseCnt[1])
2226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      delete[] phaseInstCnt[1];
2227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool
2230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::haveNextPhase(unsigned int pos) const
2231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ++pos;
2233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return (pos < sm4.insns.size()) &&
2234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (sm4.insns[pos]->opcode == SM4_OPCODE_HS_FORK_PHASE ||
2235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       sm4.insns[pos]->opcode == SM4_OPCODE_HS_JOIN_PHASE);
2236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool
2239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgConverter::run()
2240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   parseSignature();
2242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (unsigned int pos = 0; pos < sm4.dcls.size(); ++pos)
2244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      inspectDeclaration(*sm4.dcls[pos]);
2245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   phaseInstCnt[0] = new unsigned int [subPhaseCnt[0]];
2247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   phaseInstCnt[1] = new unsigned int [subPhaseCnt[1]];
2248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (int i = 0; i < subPhaseCnt[0]; ++i)
2249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      phaseInstCnt[0][i] = -1;
2250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (int i = 0; i < subPhaseCnt[1]; ++i)
2251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      phaseInstCnt[1][i] = -1;
2252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   // re-increased in handleDeclaration:
2253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   subPhaseCnt[0] = subPhaseCnt[1] = 0;
2254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   allocateValues();
2256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   nrArrays = 0;
2257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (unsigned int pos = 0; pos < sm4.dcls.size(); ++pos)
2258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      handleDeclaration(*sm4.dcls[pos]);
2259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   info.io.genUserClip = -1; // no UCPs permitted with SM4 shaders
2261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   info.io.clipDistanceMask = (1 << info.io.clipDistanceMask) - 1;
2262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   info.assignSlots(&info);
2264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (sm4.dcls.size() == 0 && sm4.insns.size() == 0)
2266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return true;
2267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BasicBlock *entry = new BasicBlock(prog->main);
2269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BasicBlock *leave = new BasicBlock(prog->main);
2270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prog->main->setEntry(entry);
2272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prog->main->setExit(leave);
2273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   setPosition(entry, true);
2275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   entryBBs.push(entry);
2277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   leaveBBs.push(leave);
2278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (prog->getType() == Program::TYPE_FRAGMENT) {
2280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      Symbol *sv = mkSysVal(SV_POSITION, 3);
2281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fragCoord[3] = mkOp1v(OP_RDSV, TYPE_F32, getSSA(), sv);
2282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mkOp1(OP_RCP, TYPE_F32, fragCoord[3], fragCoord[3]);
2283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else
2284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (prog->getType() == Program::TYPE_TESSELLATION_EVAL) {
2285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const int n = (info.prop.tp.domain == PIPE_PRIM_TRIANGLES) ? 3 : 2;
2286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int c;
2287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (c = 0; c < n; ++c)
2288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         domainPt[c] =
2289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            mkOp1v(OP_RDSV, TYPE_F32, getSSA(), mkSysVal(SV_TESS_COORD, c));
2290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (c == 2)
2291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         domainPt[2] = loadImm(NULL, 0.0f);
2292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   finalized = false;
2295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   phaseEnded = 0;
2296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   phase = 0;
2297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   subPhase = 0;
2298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (unsigned int pos = 0; pos < sm4.insns.size(); ++pos) {
2299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      handleInstruction(pos);
2300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (likely(phase == 0) || (phaseEnded < 2))
2301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         continue;
2302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      phaseEnded = 0;
2303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!unrollPhase || !phaseInstanceUsed) {
2304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ++subPhase;
2305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         continue;
2306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
2307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      phaseInstanceUsed = false;
2308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (phaseInstance < (phaseInstCnt[phase - 1][subPhase] - 1))
2309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         pos = phaseStart - 1;
2310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
2311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ++subPhase;
2312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
2313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   finalizeShader();
2314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return true;
2316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} // anonymous namespace
2319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnamespace nv50_ir {
2321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool
2323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgProgram::makeFromSM4(struct nv50_ir_prog_info *info)
2324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
2325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Converter bld(this, info);
2326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return bld.run();
2327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
2328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
2329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} // namespace nv50_ir
2330