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