1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2011 Christoph Bumiller
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions:
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included in
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * all copies or substantial portions of the Software.
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE.
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv50_ir.h"
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "nv50_ir_target_nv50.h"
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnamespace nv50_ir {
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NV50_OP_ENC_LONG     0
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NV50_OP_ENC_SHORT    1
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NV50_OP_ENC_IMM      2
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NV50_OP_ENC_LONG_ALT 3
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclass CodeEmitterNV50 : public CodeEmitter
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpublic:
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CodeEmitterNV50(const TargetNV50 *);
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   virtual bool emitInstruction(Instruction *);
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   virtual uint32_t getMinEncodingSize(const Instruction *) const;
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   inline void setProgramType(Program::Type pType) { progType = pType; }
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   virtual void prepareEmission(Function *);
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprivate:
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Program::Type progType;
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const TargetNV50 *targ;
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprivate:
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   inline void defId(const ValueDef&, const int pos);
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   inline void srcId(const ValueRef&, const int pos);
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   inline void srcId(const ValueRef *, const int pos);
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   inline void srcAddr16(const ValueRef&, bool adj, const int pos);
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   inline void srcAddr8(const ValueRef&, const int pos);
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitFlagsRd(const Instruction *);
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitFlagsWr(const Instruction *);
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitCondCode(CondCode cc, DataType ty, int pos);
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   inline void setARegBits(unsigned int);
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void setAReg16(const Instruction *, int s);
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void setImmediate(const Instruction *, int s);
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void setDst(const Value *);
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void setDst(const Instruction *, int d);
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void setSrcFileBits(const Instruction *, int enc);
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void setSrc(const Instruction *, unsigned int s, int slot);
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitForm_MAD(const Instruction *);
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitForm_ADD(const Instruction *);
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitForm_MUL(const Instruction *);
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitForm_IMM(const Instruction *);
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitLoadStoreSizeLG(DataType ty, int pos);
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitLoadStoreSizeCS(DataType ty);
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void roundMode_MAD(const Instruction *);
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void roundMode_CVT(RoundMode);
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitMNeg12(const Instruction *);
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitLOAD(const Instruction *);
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitSTORE(const Instruction *);
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitMOV(const Instruction *);
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitNOP();
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitINTERP(const Instruction *);
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitPFETCH(const Instruction *);
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitOUT(const Instruction *);
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitUADD(const Instruction *);
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitAADD(const Instruction *);
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitFADD(const Instruction *);
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitIMUL(const Instruction *);
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitFMUL(const Instruction *);
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitFMAD(const Instruction *);
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitIMAD(const Instruction *);
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitISAD(const Instruction *);
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitMINMAX(const Instruction *);
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitPreOp(const Instruction *);
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitSFnOp(const Instruction *, uint8_t subOp);
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitShift(const Instruction *);
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitARL(const Instruction *, unsigned int shl);
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitLogicOp(const Instruction *);
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitNOT(const Instruction *);
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitCVT(const Instruction *);
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitSET(const Instruction *);
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitTEX(const TexInstruction *);
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitTXQ(const TexInstruction *);
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitQUADOP(const Instruction *, uint8_t lane, uint8_t quOp);
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitFlow(const Instruction *, uint8_t flowOp);
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void emitPRERETEmu(const FlowInstruction *);
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SDATA(a) ((a).rep()->reg.data)
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DDATA(a) ((a).rep()->reg.data)
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid CodeEmitterNV50::srcId(const ValueRef& src, const int pos)
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(src.get());
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[pos / 32] |= SDATA(src).id << (pos % 32);
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid CodeEmitterNV50::srcId(const ValueRef *src, const int pos)
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(src->get());
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[pos / 32] |= SDATA(*src).id << (pos % 32);
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid CodeEmitterNV50::srcAddr16(const ValueRef& src, bool adj, const int pos)
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(src.get());
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int32_t offset = SDATA(src).offset;
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(!adj || src.get()->reg.size <= 4);
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (adj)
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      offset /= src.get()->reg.size;
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(offset <= 0x7fff && offset >= (int32_t)-0x8000 && (pos % 32) <= 16);
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (offset < 0)
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      offset &= adj ? (0xffff >> (src.get()->reg.size >> 1)) : 0xffff;
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[pos / 32] |= offset << (pos % 32);
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid CodeEmitterNV50::srcAddr8(const ValueRef& src, const int pos)
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(src.get());
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t offset = SDATA(src).offset;
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert((offset <= 0x1fc || offset == 0x3fc) && !(offset & 0x3));
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[pos / 32] |= (offset >> 2) << (pos % 32);
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid CodeEmitterNV50::defId(const ValueDef& def, const int pos)
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(def.get() && def.getFile() != FILE_SHADER_OUTPUT);
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[pos / 32] |= DDATA(def).id << (pos % 32);
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::roundMode_MAD(const Instruction *insn)
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (insn->rnd) {
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case ROUND_M: code[1] |= 1 << 22; break;
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case ROUND_P: code[1] |= 2 << 22; break;
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case ROUND_Z: code[1] |= 3 << 22; break;
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(insn->rnd == ROUND_N);
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitMNeg12(const Instruction *i)
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[1] |= i->src(0).mod.neg() << 26;
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[1] |= i->src(1).mod.neg() << 27;
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid CodeEmitterNV50::emitCondCode(CondCode cc, DataType ty, int pos)
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint8_t enc;
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(pos >= 32 || pos <= 27);
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (cc) {
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case CC_LT:  enc = 0x1; break;
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case CC_LTU: enc = 0x9; break;
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case CC_EQ:  enc = 0x2; break;
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case CC_EQU: enc = 0xa; break;
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case CC_LE:  enc = 0x3; break;
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case CC_LEU: enc = 0xb; break;
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case CC_GT:  enc = 0x4; break;
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case CC_GTU: enc = 0xc; break;
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case CC_NE:  enc = 0x5; break;
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case CC_NEU: enc = 0xd; break;
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case CC_GE:  enc = 0x6; break;
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case CC_GEU: enc = 0xe; break;
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case CC_TR:  enc = 0xf; break;
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case CC_FL:  enc = 0x0; break;
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case CC_O:  enc = 0x10; break;
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case CC_C:  enc = 0x11; break;
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case CC_A:  enc = 0x12; break;
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case CC_S:  enc = 0x13; break;
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case CC_NS: enc = 0x1c; break;
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case CC_NA: enc = 0x1d; break;
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case CC_NC: enc = 0x1e; break;
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case CC_NO: enc = 0x1f; break;
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      enc = 0;
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(!"invalid condition code");
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ty != TYPE_NONE && !isFloatType(ty))
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      enc &= ~0x8; // unordered only exists for float types
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[pos / 32] |= enc << (pos % 32);
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitFlagsRd(const Instruction *i)
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int s = (i->flagsSrc >= 0) ? i->flagsSrc : i->predSrc;
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(!(code[1] & 0x00003f80));
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (s >= 0) {
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(i->getSrc(s)->reg.file == FILE_FLAGS);
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitCondCode(i->cc, TYPE_NONE, 32 + 7);
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      srcId(i->src(s), 32 + 12);
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] |= 0x0780;
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitFlagsWr(const Instruction *i)
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(!(code[1] & 0x70));
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int flagsDef = i->flagsDef;
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   // find flags definition and check that it is the last def
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (flagsDef < 0) {
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (int d = 0; i->defExists(d); ++d)
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (i->def(d).getFile() == FILE_FLAGS)
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            flagsDef = d;
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (flagsDef >= 0 && 0) // TODO: enforce use of flagsDef at some point
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         WARN("Instruction::flagsDef was not set properly\n");
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (flagsDef == 0 && i->defExists(1))
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      WARN("flags def should not be the primary definition\n");
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (flagsDef >= 0)
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] |= (DDATA(i->def(flagsDef)).id << 4) | 0x40;
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::setARegBits(unsigned int u)
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] |= (u & 3) << 26;
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[1] |= (u & 4);
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::setAReg16(const Instruction *i, int s)
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->srcExists(s)) {
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      s = i->src(s).indirect[0];
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (s >= 0)
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         setARegBits(SDATA(i->src(s)).id + 1);
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::setImmediate(const Instruction *i, int s)
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const ImmediateValue *imm = i->src(s).get()->asImm();
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(imm);
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t u = imm->reg.data.u32;
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->src(s).mod & Modifier(NV50_IR_MOD_NOT))
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      u = ~u;
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[1] |= 3;
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] |= (u & 0x3f) << 16;
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[1] |= (u >> 6) << 2;
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::setDst(const Value *dst)
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const Storage *reg = &dst->join->reg;
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(reg->file != FILE_ADDRESS);
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (reg->data.id < 0 || reg->file == FILE_FLAGS) {
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] |= (127 << 2) | 1;
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] |= 8;
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int id;
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (reg->file == FILE_SHADER_OUTPUT) {
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[1] |= 8;
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         id = reg->data.offset / 4;
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         id = reg->data.id;
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] |= id << 2;
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::setDst(const Instruction *i, int d)
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->defExists(d)) {
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      setDst(i->getDef(d));
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!d) {
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] |= 0x01fc; // bit bucket
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] |= 0x0008;
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 3 * 2 bits:
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 0: r
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 1: a/s
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 2: c
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 3: i
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::setSrcFileBits(const Instruction *i, int enc)
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint8_t mode = 0;
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (unsigned int s = 0; s < Target::operationSrcNr[i->op]; ++s) {
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (i->src(s).getFile()) {
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case FILE_GPR:
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case FILE_MEMORY_SHARED:
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case FILE_SHADER_INPUT:
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mode |= 1 << (s * 2);
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case FILE_MEMORY_CONST:
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mode |= 2 << (s * 2);
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case FILE_IMMEDIATE:
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         mode |= 3 << (s * 2);
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	      ERROR("invalid file on source %i: %u\n", s, i->src(s).getFile());
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(0);
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (mode) {
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 0x00: // rrr
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 0x01: // arr/grr
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (progType == Program::TYPE_GEOMETRY) {
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[0] |= 0x01800000;
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (enc == NV50_OP_ENC_LONG || enc == NV50_OP_ENC_LONG_ALT)
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            code[1] |= 0x00200000;
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (enc == NV50_OP_ENC_SHORT)
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            code[0] |= 0x01000000;
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            code[1] |= 0x00200000;
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 0x03: // irr
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(i->op == OP_MOV);
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 0x0c: // rir
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 0x0d: // gir
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] |= 0x01000000;
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(progType == Program::TYPE_GEOMETRY ||
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             progType == Program::TYPE_COMPUTE);
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 0x08: // rcr
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] |= (enc == NV50_OP_ENC_LONG_ALT) ? 0x01000000 : 0x00800000;
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] |= (i->getSrc(1)->reg.fileIndex << 22);
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 0x09: // acr/gcr
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (progType == Program::TYPE_GEOMETRY) {
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[0] |= 0x01800000;
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[0] |= (enc == NV50_OP_ENC_LONG_ALT) ? 0x01000000 : 0x00800000;
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[1] |= 0x00200000;
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] |= (i->getSrc(1)->reg.fileIndex << 22);
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 0x20: // rrc
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] |= 0x01000000;
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] |= (i->getSrc(2)->reg.fileIndex << 22);
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 0x21: // arc
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] |= 0x01000000;
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] |= 0x00200000 | (i->getSrc(2)->reg.fileIndex << 22);
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(progType != Program::TYPE_GEOMETRY);
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ERROR("not encodable: %x\n", mode);
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(0);
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (progType != Program::TYPE_COMPUTE)
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if ((mode & 3) == 1) {
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const int pos = i->src(1).getFile() == FILE_IMMEDIATE ? 13 : 14;
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (i->getSrc(0)->reg.type) {
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_U8:
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_U16:
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[0] |= 1 << pos;
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_S16:
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[0] |= 2 << pos;
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[0] |= 3 << pos;
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(i->getSrc(0)->reg.size == 4);
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::setSrc(const Instruction *i, unsigned int s, int slot)
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (Target::operationSrcNr[i->op] <= s)
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const Storage *reg = &i->src(s).rep()->reg;
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned int id = (reg->file == FILE_GPR) ?
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      reg->data.id :
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      reg->data.offset >> (reg->size >> 1); // no > 4 byte sources here
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (slot) {
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 0: code[0] |= id << 9; break;
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 1: code[0] |= id << 16; break;
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case 2: code[1] |= id << 14; break;
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(0);
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// the default form:
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//  - long instruction
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//  - 1 to 3 sources in slots 0, 1, 2 (rrr, arr, rcr, acr, rrc, arc, gcr, grr)
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org//  - address & flags
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitForm_MAD(const Instruction *i)
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(i->encSize == 8);
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] |= 1;
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emitFlagsRd(i);
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emitFlagsWr(i);
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   setDst(i, 0);
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   setSrcFileBits(i, NV50_OP_ENC_LONG);
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   setSrc(i, 0, 0);
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   setSrc(i, 1, 1);
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   setSrc(i, 2, 2);
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   setAReg16(i, 1);
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// like default form, but 2nd source in slot 2, and no 3rd source
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitForm_ADD(const Instruction *i)
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(i->encSize == 8);
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] |= 1;
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emitFlagsRd(i);
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emitFlagsWr(i);
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   setDst(i, 0);
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   setSrcFileBits(i, NV50_OP_ENC_LONG_ALT);
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   setSrc(i, 0, 0);
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   setSrc(i, 1, 2);
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   setAReg16(i, 1);
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// default short form (rr, ar, rc, gr)
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitForm_MUL(const Instruction *i)
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(i->encSize == 4 && !(code[0] & 1));
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(i->defExists(0));
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(!i->getPredicate());
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   setDst(i, 0);
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   setSrcFileBits(i, NV50_OP_ENC_SHORT);
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   setSrc(i, 0, 0);
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   setSrc(i, 1, 1);
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// usual immediate form
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// - 1 to 3 sources where last is immediate (rir, gir)
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// - no address or predicate possible
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitForm_IMM(const Instruction *i)
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(i->encSize == 8);
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] |= 1;
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(i->defExists(0) && i->srcExists(0));
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   setDst(i, 0);
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   setSrcFileBits(i, NV50_OP_ENC_IMM);
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (Target::operationSrcNr[i->op] > 1) {
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      setSrc(i, 0, 0);
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      setImmediate(i, 1);
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      setSrc(i, 2, 1);
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      setImmediate(i, 0);
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitLoadStoreSizeLG(DataType ty, int pos)
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint8_t enc;
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (ty) {
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_F32: // fall through
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_S32: // fall through
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_U32:  enc = 0x6; break;
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_B128: enc = 0x5; break;
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_F64: // fall through
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_S64: // fall through
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_U64:  enc = 0x4; break;
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_S16:  enc = 0x3; break;
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_U16:  enc = 0x2; break;
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_S8:   enc = 0x1; break;
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_U8:   enc = 0x0; break;
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      enc = 0;
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(!"invalid load/store type");
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[pos / 32] |= enc << (pos % 32);
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitLoadStoreSizeCS(DataType ty)
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (ty) {
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_U8: break;
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_U16: code[1] |= 0x4000; break;
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_S16: code[1] |= 0x8000; break;
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_F32:
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_S32:
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_U32: code[1] |= 0xc000; break;
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(0);
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitLOAD(const Instruction *i)
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DataFile sf = i->src(0).getFile();
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int32_t offset = i->getSrc(0)->reg.data.offset;
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (sf) {
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case FILE_SHADER_INPUT:
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      // use 'mov' where we can
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] = i->src(0).isIndirect(0) ? 0x00000001 : 0x10000001;
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] = 0x00200000 | (i->lanes << 14);
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (typeSizeof(i->dType) == 4)
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[1] |= 0x04000000;
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case FILE_MEMORY_SHARED:
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (targ->getChipset() >= 0x84) {
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(offset <= (int32_t)(0x3fff * typeSizeof(i->sType)));
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[0] = 0x10000001;
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[1] = 0x40000000;
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (typeSizeof(i->dType) == 4)
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            code[1] |= 0x04000000;
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         emitLoadStoreSizeCS(i->sType);
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(offset <= (int32_t)(0x1f * typeSizeof(i->sType)));
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[0] = 0x10000001;
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[1] = 0x00200000 | (i->lanes << 14);
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         emitLoadStoreSizeCS(i->sType);
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case FILE_MEMORY_CONST:
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] = 0x10000001;
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] = 0x20000000 | (i->getSrc(0)->reg.fileIndex << 22);
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (typeSizeof(i->dType) == 4)
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[1] |= 0x04000000;
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitLoadStoreSizeCS(i->sType);
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case FILE_MEMORY_LOCAL:
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] = 0xd0000001;
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] = 0x40000000;
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case FILE_MEMORY_GLOBAL:
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] = 0xd0000001 | (i->getSrc(0)->reg.fileIndex << 16);
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] = 0x80000000;
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(!"invalid load source file");
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (sf == FILE_MEMORY_LOCAL ||
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       sf == FILE_MEMORY_GLOBAL)
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitLoadStoreSizeLG(i->sType, 21 + 32);
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   setDst(i, 0);
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emitFlagsRd(i);
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emitFlagsWr(i);
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->src(0).getFile() == FILE_MEMORY_GLOBAL) {
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      srcId(*i->src(0).getIndirect(0), 9);
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      setAReg16(i, 0);
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      srcAddr16(i->src(0), i->src(0).getFile() != FILE_MEMORY_LOCAL, 9);
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitSTORE(const Instruction *i)
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DataFile f = i->getSrc(0)->reg.file;
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int32_t offset = i->getSrc(0)->reg.data.offset;
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (f) {
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case FILE_SHADER_OUTPUT:
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] = 0x00000001 | ((offset >> 2) << 9);
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] = 0x80c00000;
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      srcId(i->src(1), 32 + 14);
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case FILE_MEMORY_GLOBAL:
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] = 0xd0000001 | (i->getSrc(0)->reg.fileIndex << 16);
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] = 0xa0000000;
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitLoadStoreSizeLG(i->dType, 21 + 32);
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      srcId(i->src(1), 2);
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case FILE_MEMORY_LOCAL:
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] = 0xd0000001;
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] = 0x60000000;
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitLoadStoreSizeLG(i->dType, 21 + 32);
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      srcId(i->src(1), 2);
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case FILE_MEMORY_SHARED:
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] = 0x00000001;
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] = 0xe0000000;
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (typeSizeof(i->dType)) {
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 1:
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[0] |= offset << 9;
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[1] |= 0x00400000;
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 2:
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[0] |= (offset >> 1) << 9;
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case 4:
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[0] |= (offset >> 2) << 9;
696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[1] |= 0x04200000;
697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(0);
700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      srcId(i->src(1), 32 + 14);
703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(!"invalid store destination file");
706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (f == FILE_MEMORY_GLOBAL)
710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      srcId(*i->src(0).getIndirect(0), 9);
711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      setAReg16(i, 0);
713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (f == FILE_MEMORY_LOCAL)
715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      srcAddr16(i->src(0), false, 9);
716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emitFlagsRd(i);
718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitMOV(const Instruction *i)
722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DataFile sf = i->getSrc(0)->reg.file;
724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   DataFile df = i->getDef(0)->reg.file;
725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(sf == FILE_GPR || df == FILE_GPR);
727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (sf == FILE_FLAGS) {
729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] = 0x00000001;
730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] = 0x20000000;
731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      defId(i->def(0), 2);
732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      srcId(i->src(0), 12);
733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitFlagsRd(i);
734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else
735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (sf == FILE_ADDRESS) {
736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] = 0x00000001;
737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] = 0x40000000;
738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      defId(i->def(0), 2);
739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      setARegBits(SDATA(i->src(0)).id + 1);
740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitFlagsRd(i);
741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else
742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (df == FILE_FLAGS) {
743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] = 0x00000001;
744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] = 0xa0000000;
745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      defId(i->def(0), 4);
746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      srcId(i->src(0), 9);
747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitFlagsRd(i);
748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else
749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (sf == FILE_IMMEDIATE) {
750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] = 0x10008001;
751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] = 0x00000003;
752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitForm_IMM(i);
753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (i->encSize == 4) {
755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[0] = 0x10008000;
756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[0] = 0x10000001;
758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[1] = (typeSizeof(i->dType) == 2) ? 0 : 0x04000000;
759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[1] |= (i->lanes << 14);
760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         emitFlagsRd(i);
761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      defId(i->def(0), 2);
763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      srcId(i->src(0), 9);
764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (df == FILE_SHADER_OUTPUT) {
766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(i->encSize == 8);
767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] |= 0x8;
768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitNOP()
773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] = 0xf0000001;
775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[1] = 0xe0000000;
776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitQUADOP(const Instruction *i, uint8_t lane, uint8_t quOp)
780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] = 0xc0000000 | (lane << 16);
782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[1] = 0x80000000;
783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] |= (quOp & 0x03) << 20;
785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[1] |= (quOp & 0xfc) << 20;
786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emitForm_ADD(i);
788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!i->srcExists(1))
790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      srcId(i->src(0), 32 + 14);
791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitPFETCH(const Instruction *i)
795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] = 0x11800001;
797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[1] = 0x04200000 | (0xf << 14);
798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   defId(i->def(0), 2);
800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   srcAddr8(i->src(0), 9);
801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   setAReg16(i, 0);
802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitINTERP(const Instruction *i)
806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] = 0x80000000;
808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   defId(i->def(0), 2);
810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   srcAddr8(i->src(0), 16);
811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->getInterpMode() == NV50_IR_INTERP_FLAT) {
813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] |= 1 << 8;
814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (i->op == OP_PINTERP) {
816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[0] |= 1 << 25;
817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         srcId(i->src(1), 9);
818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (i->getSampleMode() == NV50_IR_INTERP_CENTROID)
820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[0] |= 1 << 24;
821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->encSize == 8) {
824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] =
825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         (code[0] & (3 << 24)) >> (24 - 16) |
826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         (code[0] & (1 <<  8)) << (18 -  8);
827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] &= ~0x03000100;
828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] |= 1;
829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitFlagsRd(i);
830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitMINMAX(const Instruction *i)
835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->dType == TYPE_F64) {
837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] = 0xe0000000;
838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] = (i->op == OP_MIN) ? 0xa0000000 : 0xc0000000;
839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] = 0x30000000;
841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] = 0x80000000;
842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (i->op == OP_MIN)
843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[1] |= 0x20000000;
844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (i->dType) {
846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_F32: code[0] |= 0x80000000; break;
847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_S32: code[1] |= 0x8c000000; break;
848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_U32: code[1] |= 0x84000000; break;
849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_S16: code[1] |= 0x80000000; break;
850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_U16: break;
851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(0);
853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] |= i->src(0).mod.abs() << 20;
856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] |= i->src(1).mod.abs() << 19;
857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emitForm_MAD(i);
859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitFMAD(const Instruction *i)
863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const int neg_mul = i->src(0).mod.neg() ^ i->src(1).mod.neg();
865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const int neg_add = i->src(2).mod.neg();
866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] = 0xe0000000;
868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->encSize == 4) {
870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitForm_MUL(i);
871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(!neg_mul && !neg_add);
872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1]  = neg_mul << 26;
874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] |= neg_add << 27;
875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (i->saturate)
876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[1] |= 1 << 29;
877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitForm_MAD(i);
878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitFADD(const Instruction *i)
883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const int neg0 = i->src(0).mod.neg();
885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const int neg1 = i->src(1).mod.neg() ^ ((i->op == OP_SUB) ? 1 : 0);
886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] = 0xb0000000;
888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(!(i->src(0).mod | i->src(1).mod).abs());
890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->src(1).getFile() == FILE_IMMEDIATE) {
892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] = 0;
893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitForm_IMM(i);
894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] |= neg0 << 15;
895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] |= neg1 << 22;
896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (i->saturate)
897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[0] |= 1 << 8;
898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else
899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->encSize == 8) {
900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] = 0;
901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitForm_ADD(i);
902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] |= neg0 << 26;
903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] |= neg1 << 27;
904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (i->saturate)
905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[1] |= 1 << 29;
906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitForm_MUL(i);
908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] |= neg0 << 15;
909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] |= neg1 << 22;
910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (i->saturate)
911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[0] |= 1 << 8;
912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitUADD(const Instruction *i)
917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const int neg0 = i->src(0).mod.neg();
919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const int neg1 = i->src(1).mod.neg() ^ ((i->op == OP_SUB) ? 1 : 0);
920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] = 0x20008000;
922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->src(1).getFile() == FILE_IMMEDIATE) {
924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] = 0;
925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitForm_IMM(i);
926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else
927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->encSize == 8) {
928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] = 0x20000000;
929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] = (typeSizeof(i->dType) == 2) ? 0 : 0x04000000;
930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitForm_ADD(i);
931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitForm_MUL(i);
933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(!(neg0 && neg1));
935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] |= neg0 << 28;
936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] |= neg1 << 22;
937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->flagsSrc >= 0) {
939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      // addc == sub | subr
940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(!(code[0] & 0x10400000) && !i->getPredicate());
941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] |= 0x10400000;
942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      srcId(i->src(i->flagsSrc), 32 + 12);
943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitAADD(const Instruction *i)
948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const int s = (i->op == OP_MOV) ? 0 : 1;
950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] = 0xd0000001 | (i->getSrc(s)->reg.data.u16 << 9);
952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[1] = 0x20000000;
953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] |= (DDATA(i->def(0)).id + 1) << 2;
955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emitFlagsRd(i);
957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (s && i->srcExists(0))
959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      setARegBits(SDATA(i->src(0)).id + 1);
960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitIMUL(const Instruction *i)
964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] = 0x40000000;
966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->encSize == 8) {
968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] = (i->sType == TYPE_S16) ? (0x8000 | 0x4000) : 0x0000;
969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitForm_MAD(i);
970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (i->sType == TYPE_S16)
972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[0] |= 0x8100;
973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitForm_MUL(i);
974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitFMUL(const Instruction *i)
979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const int neg = (i->src(0).mod ^ i->src(1).mod).neg();
981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] = 0xc0000000;
983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->src(1).getFile() == FILE_IMMEDIATE) {
985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] = 0;
986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitForm_IMM(i);
987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (neg)
988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[0] |= 0x8000;
989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else
990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->encSize == 8) {
991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] = i->rnd == ROUND_Z ? 0x0000c000 : 0;
992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (neg)
993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[1] |= 0x08000000;
994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitForm_MAD(i);
995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitForm_MUL(i);
997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (neg)
998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[0] |= 0x8000;
999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitIMAD(const Instruction *i)
1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] = 0x60000000;
1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (isSignedType(i->sType))
1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] = i->saturate ? 0x40000000 : 0x20000000;
1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] = 0x00000000;
1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int neg1 = i->src(0).mod.neg() ^ i->src(1).mod.neg();
1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int neg2 = i->src(2).mod.neg();
1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(!(neg1 & neg2));
1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[1] |= neg1 << 27;
1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[1] |= neg2 << 26;
1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emitForm_MAD(i);
1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->flagsSrc >= 0) {
1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      // add with carry from $cX
1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(!(code[1] & 0x0c000000) && !i->getPredicate());
1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] |= 0xc << 24;
1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      srcId(i->src(i->flagsSrc), 32 + 12);
1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitISAD(const Instruction *i)
1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->encSize == 8) {
1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] = 0x50000000;
1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (i->sType) {
1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_U32: code[1] = 0x04000000; break;
1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_S32: code[1] = 0x0c000000; break;
1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_U16: code[1] = 0x00000000; break;
1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_S16: code[1] = 0x08000000; break;
1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(0);
1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitForm_MAD(i);
1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (i->sType) {
1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_U32: code[0] = 0x50008000; break;
1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_S32: code[0] = 0x50008100; break;
1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_U16: code[0] = 0x50000000; break;
1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_S16: code[0] = 0x50000100; break;
1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(0);
1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitForm_MUL(i);
1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitSET(const Instruction *i)
1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] = 0x30000000;
1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[1] = 0x60000000;
1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emitCondCode(i->asCmp()->setCond, i->sType, 32 + 14);
1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (i->sType) {
1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_F32: code[0] |= 0x80000000; break;
1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_S32: code[1] |= 0x0c000000; break;
1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_U32: code[1] |= 0x04000000; break;
1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_S16: code[1] |= 0x08000000; break;
1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_U16: break;
1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(0);
1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->src(0).mod.neg()) code[1] |= 0x04000000;
1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->src(1).mod.neg()) code[1] |= 0x08000000;
1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->src(0).mod.abs()) code[1] |= 0x00100000;
1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->src(1).mod.abs()) code[1] |= 0x00080000;
1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emitForm_MAD(i);
1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::roundMode_CVT(RoundMode rnd)
1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (rnd) {
1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case ROUND_NI: code[1] |= 0x08000000; break;
1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case ROUND_M:  code[1] |= 0x00020000; break;
1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case ROUND_MI: code[1] |= 0x08020000; break;
1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case ROUND_P:  code[1] |= 0x00040000; break;
1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case ROUND_PI: code[1] |= 0x08040000; break;
1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case ROUND_Z:  code[1] |= 0x00060000; break;
1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case ROUND_ZI: code[1] |= 0x08060000; break;
1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(rnd == ROUND_N);
1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitCVT(const Instruction *i)
1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const bool f2f = isFloatType(i->dType) && isFloatType(i->sType);
1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   RoundMode rnd;
1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (i->op) {
1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_CEIL:  rnd = f2f ? ROUND_PI : ROUND_P; break;
1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_FLOOR: rnd = f2f ? ROUND_MI : ROUND_M; break;
1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_TRUNC: rnd = f2f ? ROUND_ZI : ROUND_Z; break;
1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      rnd = i->rnd;
1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] = 0xa0000000;
1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (i->dType) {
1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_F64:
1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (i->sType) {
1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_F64: code[1] = 0xc4404000; break;
1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_S64: code[1] = 0x44414000; break;
1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_U64: code[1] = 0x44404000; break;
1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_F32: code[1] = 0xc4400000; break;
1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_S32: code[1] = 0x44410000; break;
1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_U32: code[1] = 0x44400000; break;
1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(0);
1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_S64:
1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (i->sType) {
1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_F64: code[1] = 0x8c404000; break;
1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_F32: code[1] = 0x8c400000; break;
1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(0);
1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_U64:
1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (i->sType) {
1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_F64: code[1] = 0x84404000; break;
1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_F32: code[1] = 0x84400000; break;
1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(0);
1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_F32:
1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (i->sType) {
1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_F64: code[1] = 0xc0404000; break;
1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_S64: code[1] = 0x40414000; break;
1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_U64: code[1] = 0x40404000; break;
1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_F32: code[1] = 0xc4004000; break;
1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_S32: code[1] = 0x44014000; break;
1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_U32: code[1] = 0x44004000; break;
1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_F16: code[1] = 0xc4000000; break;
1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(0);
1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_S32:
1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (i->sType) {
1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_F64: code[1] = 0x88404000; break;
1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_F32: code[1] = 0x8c004000; break;
1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_S32: code[1] = 0x0c014000; break;
1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_U32: code[1] = 0x0c004000; break;
1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_F16: code[1] = 0x8c000000; break;
1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_S16: code[1] = 0x0c010000; break;
1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_U16: code[1] = 0x0c000000; break;
1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_S8:  code[1] = 0x0c018000; break;
1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_U8:  code[1] = 0x0c008000; break;
1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(0);
1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_U32:
1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (i->sType) {
1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_F64: code[1] = 0x80404000; break;
1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_F32: code[1] = 0x84004000; break;
1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_S32: code[1] = 0x04014000; break;
1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_U32: code[1] = 0x04004000; break;
1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_F16: code[1] = 0x84000000; break;
1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_S16: code[1] = 0x04010000; break;
1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_U16: code[1] = 0x04000000; break;
1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_S8:  code[1] = 0x04018000; break;
1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TYPE_U8:  code[1] = 0x04008000; break;
1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(0);
1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_S16:
1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_U16:
1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_S8:
1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_U8:
1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(0);
1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (typeSizeof(i->sType) == 1 && i->getSrc(0)->reg.size == 4)
1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] |= 0x00004000;
1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   roundMode_CVT(rnd);
1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (i->op) {
1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_ABS: code[1] |= 1 << 20; break;
1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_SAT: code[1] |= 1 << 19; break;
1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_NEG: code[1] |= 1 << 29; break;
1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[1] ^= i->src(0).mod.neg() << 29;
1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[1] |= i->src(0).mod.abs() << 20;
1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->saturate)
1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] |= 1 << 19;
1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(i->op != OP_ABS || !i->src(0).mod.neg());
1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emitForm_MAD(i);
1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitPreOp(const Instruction *i)
1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] = 0xb0000000;
1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[1] = (i->op == OP_PREEX2) ? 0xc0004000 : 0xc0000000;
1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[1] |= i->src(0).mod.abs() << 20;
1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[1] |= i->src(0).mod.neg() << 26;
1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emitForm_MAD(i);
1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitSFnOp(const Instruction *i, uint8_t subOp)
1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] = 0x90000000;
1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->encSize == 4) {
1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(i->op == OP_RCP);
1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] |= i->src(0).mod.abs() << 15;
1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] |= i->src(0).mod.neg() << 22;
1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitForm_MUL(i);
1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] = subOp << 29;
1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] |= i->src(0).mod.abs() << 20;
1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] |= i->src(0).mod.neg() << 26;
1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitForm_MAD(i);
1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitNOT(const Instruction *i)
1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] = 0xd0000000;
1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[1] = 0x0002c000;
1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (i->sType) {
1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_U32:
1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TYPE_S32:
1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] |= 0x04000000;
1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emitForm_MAD(i);
1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   setSrc(i, 0, 1);
1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitLogicOp(const Instruction *i)
1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] = 0xd0000000;
1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[1] = 0;
1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->src(1).getFile() == FILE_IMMEDIATE) {
1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (i->op) {
1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case OP_OR:  code[0] |= 0x0100; break;
1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case OP_XOR: code[0] |= 0x8000; break;
1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(i->op == OP_AND);
1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (i->src(0).mod & Modifier(NV50_IR_MOD_NOT))
1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[0] |= 1 << 22;
1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitForm_IMM(i);
1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (i->op) {
1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case OP_AND: code[1] = 0x04000000; break;
1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case OP_OR:  code[1] = 0x04004000; break;
1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case OP_XOR: code[1] = 0x04008000; break;
1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(0);
1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (i->src(0).mod & Modifier(NV50_IR_MOD_NOT))
1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[1] |= 1 << 16;
1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (i->src(1).mod & Modifier(NV50_IR_MOD_NOT))
1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[1] |= 1 << 17;
1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitForm_MAD(i);
1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitARL(const Instruction *i, unsigned int shl)
1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] = 0x00000001 | (shl << 16);
1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[1] = 0xc0000000;
1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] |= (DDATA(i->def(0)).id + 1) << 2;
1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   setSrcFileBits(i, NV50_OP_ENC_IMM);
1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   setSrc(i, 0, 0);
1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emitFlagsRd(i);
1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitShift(const Instruction *i)
1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->def(0).getFile() == FILE_ADDRESS) {
1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(i->srcExists(1) && i->src(1).getFile() == FILE_IMMEDIATE);
1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitARL(i, i->getSrc(1)->reg.data.u32 & 0x3f);
1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] = 0x30000001;
1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] = (i->op == OP_SHR) ? 0xe4000000 : 0xc4000000;
1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (i->op == OP_SHR && isSignedType(i->sType))
1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          code[1] |= 1 << 27;
1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (i->src(1).getFile() == FILE_IMMEDIATE) {
1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[1] |= 1 << 20;
1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         code[0] |= (i->getSrc(1)->reg.data.u32 & 0x7f) << 16;
1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         defId(i->def(0), 2);
1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         srcId(i->src(0), 9);
1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         emitFlagsRd(i);
1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         emitForm_MAD(i);
1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitOUT(const Instruction *i)
1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] = (i->op == OP_EMIT) ? 0xf0000200 : 0xf0000400;
1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[1] = 0xc0000001;
1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emitFlagsRd(i);
1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitTEX(const TexInstruction *i)
1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] = 0xf0000001;
1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[1] = 0x00000000;
1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (i->op) {
1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_TXB:
1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] = 0x20000000;
1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_TXL:
1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] = 0x40000000;
1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_TXF:
1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] |= 0x01000000;
1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_TXG:
1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] = 0x01000000;
1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] = 0x80000000;
1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(i->op == OP_TEX);
1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] |= i->tex.r << 9;
1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] |= i->tex.s << 17;
1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int argc = i->tex.target.getArgCount();
1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->op == OP_TXB || i->op == OP_TXL || i->op == OP_TXF)
1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      argc += 1;
1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->tex.target.isShadow())
1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      argc += 1;
1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(argc <= 4);
1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] |= (argc - 1) << 22;
1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->tex.target.isCube()) {
1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] |= 0x08000000;
1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else
1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->tex.useOffsets) {
1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] |= (i->tex.offset[0][0] & 0xf) << 24;
1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] |= (i->tex.offset[0][1] & 0xf) << 20;
1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] |= (i->tex.offset[0][2] & 0xf) << 16;
1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] |= (i->tex.mask & 0x3) << 25;
1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[1] |= (i->tex.mask & 0xc) << 12;
1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->tex.liveOnly)
1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] |= 4;
1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   defId(i->def(0), 2);
1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emitFlagsRd(i);
1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitTXQ(const TexInstruction *i)
1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(i->tex.query == TXQ_DIMS);
1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] = 0xf0000001;
1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[1] = 0x60000000;
1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] |= i->tex.r << 9;
1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] |= i->tex.s << 17;
1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] |= (i->tex.mask & 0x3) << 25;
1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[1] |= (i->tex.mask & 0xc) << 12;
1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   defId(i->def(0), 2);
1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emitFlagsRd(i);
1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitPRERETEmu(const FlowInstruction *i)
1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint32_t pos = i->target.bb->binPos + 8; // +8 to skip an op */
1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] = 0x10000003; // bra
1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[1] = 0x00000780; // always
1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (i->subOp) {
1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case NV50_IR_SUBOP_EMU_PRERET + 0: // bra to the call
1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case NV50_IR_SUBOP_EMU_PRERET + 1: // bra to skip the call
1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pos += 8;
1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(i->subOp == (NV50_IR_SUBOP_EMU_PRERET + 2));
1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] = 0x20000003; // call
1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] = 0x00000000; // no predicate
1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   addReloc(RelocEntry::TYPE_CODE, 0, pos, 0x07fff800, 9);
1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   addReloc(RelocEntry::TYPE_CODE, 1, pos, 0x000fc000, -4);
1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitFlow(const Instruction *i, uint8_t flowOp)
1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const FlowInstruction *f = i->asFlow();
1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool hasPred = false;
1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bool hasTarg = false;
1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[0] = 0x00000003 | (flowOp << 28);
1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code[1] = 0x00000000;
1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (i->op) {
1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_BRA:
1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      hasPred = true;
1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      hasTarg = true;
1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_BREAK:
1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_BRKPT:
1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_DISCARD:
1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_RET:
1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      hasPred = true;
1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_CALL:
1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_PREBREAK:
1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_JOINAT:
1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      hasTarg = true;
1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_PRERET:
1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      hasTarg = true;
1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (i->subOp >= NV50_IR_SUBOP_EMU_PRERET) {
1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         emitPRERETEmu(f);
1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return;
1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (hasPred)
1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitFlagsRd(i);
1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (hasTarg && f) {
1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint32_t pos;
1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (f->op == OP_CALL) {
1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (f->builtin) {
1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            pos = targ->getBuiltinOffset(f->target.builtin);
1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         } else {
1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            pos = f->target.fn->binPos;
1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         pos = f->target.bb->binPos;
1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[0] |= ((pos >>  2) & 0xffff) << 11;
1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] |= ((pos >> 18) & 0x003f) << 14;
1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      RelocEntry::Type relocTy;
1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      relocTy = f->builtin ? RelocEntry::TYPE_BUILTIN : RelocEntry::TYPE_CODE;
1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      addReloc(relocTy, 0, pos, 0x07fff800, 9);
1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      addReloc(relocTy, 1, pos, 0x000fc000, -4);
1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool
1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::emitInstruction(Instruction *insn)
1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!insn->encSize) {
1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ERROR("skipping unencodable instruction: "); insn->print();
1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return false;
1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else
1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (codeSize + insn->encSize > codeSizeLimit) {
1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ERROR("code emitter output buffer too small\n");
1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return false;
1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (insn->bb->getProgram()->dbgFlags & NV50_IR_DEBUG_BASIC) {
1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      INFO("EMIT: "); insn->print();
1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (insn->op) {
1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_MOV:
1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitMOV(insn);
1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_EXIT:
1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_NOP:
1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_JOIN:
1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitNOP();
1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_VFETCH:
1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_LOAD:
1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitLOAD(insn);
1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_EXPORT:
1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_STORE:
1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitSTORE(insn);
1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_PFETCH:
1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitPFETCH(insn);
1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_LINTERP:
1558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_PINTERP:
1559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitINTERP(insn);
1560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_ADD:
1562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_SUB:
1563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (isFloatType(insn->dType))
1564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         emitFADD(insn);
1565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (insn->getDef(0)->reg.file == FILE_ADDRESS)
1566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         emitAADD(insn);
1567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
1568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         emitUADD(insn);
1569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_MUL:
1571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (isFloatType(insn->dType))
1572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         emitFMUL(insn);
1573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
1574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         emitIMUL(insn);
1575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_MAD:
1577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_FMA:
1578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (isFloatType(insn->dType))
1579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         emitFMAD(insn);
1580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
1581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         emitIMAD(insn);
1582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_SAD:
1584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitISAD(insn);
1585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_NOT:
1587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitNOT(insn);
1588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_AND:
1590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_OR:
1591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_XOR:
1592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitLogicOp(insn);
1593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_SHL:
1595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_SHR:
1596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitShift(insn);
1597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_SET:
1599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitSET(insn);
1600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_MIN:
1602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_MAX:
1603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitMINMAX(insn);
1604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_CEIL:
1606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_FLOOR:
1607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_TRUNC:
1608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_ABS:
1609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_NEG:
1610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_SAT:
1611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitCVT(insn);
1612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_CVT:
1614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (insn->def(0).getFile() == FILE_ADDRESS)
1615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         emitARL(insn, 0);
1616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
1617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (insn->def(0).getFile() == FILE_FLAGS ||
1618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          insn->src(0).getFile() == FILE_FLAGS ||
1619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          insn->src(0).getFile() == FILE_ADDRESS)
1620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         emitMOV(insn);
1621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
1622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         emitCVT(insn);
1623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_RCP:
1625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitSFnOp(insn, 0);
1626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_RSQ:
1628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitSFnOp(insn, 2);
1629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_LG2:
1631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitSFnOp(insn, 3);
1632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_SIN:
1634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitSFnOp(insn, 4);
1635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_COS:
1637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitSFnOp(insn, 5);
1638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_EX2:
1640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitSFnOp(insn, 6);
1641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_PRESIN:
1643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_PREEX2:
1644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitPreOp(insn);
1645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_TEX:
1647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_TXB:
1648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_TXL:
1649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_TXF:
1650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitTEX(insn->asTex());
1651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_TXQ:
1653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitTXQ(insn->asTex());
1654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_EMIT:
1656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_RESTART:
1657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitOUT(insn);
1658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_DISCARD:
1660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitFlow(insn, 0x0);
1661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_BRA:
1663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitFlow(insn, 0x1);
1664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_CALL:
1666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitFlow(insn, 0x2);
1667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_RET:
1669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitFlow(insn, 0x3);
1670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_PREBREAK:
1672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitFlow(insn, 0x4);
1673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_BREAK:
1675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitFlow(insn, 0x5);
1676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_QUADON:
1678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitFlow(insn, 0x6);
1679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_QUADPOP:
1681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitFlow(insn, 0x7);
1682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_JOINAT:
1684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitFlow(insn, 0xa);
1685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_PRERET:
1687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitFlow(insn, 0xd);
1688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_QUADOP:
1690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitQUADOP(insn, insn->lanes, insn->subOp);
1691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_DFDX:
1693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitQUADOP(insn, 4, insn->src(0).mod.neg() ? 0x66 : 0x99);
1694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_DFDY:
1696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      emitQUADOP(insn, 5, insn->src(0).mod.neg() ? 0x5a : 0xa5);
1697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_PHI:
1699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_UNION:
1700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_CONSTRAINT:
1701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ERROR("operation should have been eliminated\n");
1702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return false;
1703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_EXP:
1704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_LOG:
1705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_SQRT:
1706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_POW:
1707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_SELP:
1708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_SLCT:
1709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_TXD:
1710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_PRECONT:
1711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_CONT:
1712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_POPCNT:
1713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_INSBF:
1714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case OP_EXTBF:
1715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ERROR("operation should have been lowered\n");
1716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return false;
1717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ERROR("unknown op: %u\n", insn->op);
1719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return false;
1720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (insn->join || insn->op == OP_JOIN)
1722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] |= 0x2;
1723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
1724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (insn->exit || insn->op == OP_EXIT)
1725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code[1] |= 0x1;
1726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert((insn->encSize == 8) == (code[0] & 1));
1728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code += insn->encSize / 4;
1730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   codeSize += insn->encSize;
1731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return true;
1732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orguint32_t
1735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::getMinEncodingSize(const Instruction *i) const
1736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const Target::OpInfo &info = targ->getOpInfo(i);
1738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (info.minEncSize > 4)
1740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 8;
1741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   // check constraints on dst and src operands
1743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (int d = 0; i->defExists(d); ++d) {
1744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (i->def(d).rep()->reg.data.id > 63 ||
1745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          i->def(d).rep()->reg.file != FILE_GPR)
1746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return 8;
1747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (int s = 0; i->srcExists(s); ++s) {
1750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      DataFile sf = i->src(s).getFile();
1751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (sf != FILE_GPR)
1752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (sf != FILE_SHADER_INPUT || progType != Program::TYPE_FRAGMENT)
1753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return 8;
1754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (i->src(s).rep()->reg.data.id > 63)
1755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return 8;
1756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   // check modifiers & rounding
1759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->join || i->lanes != 0xf || i->exit)
1760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 8;
1761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->op == OP_MUL && i->rnd != ROUND_N)
1762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 8;
1763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i->asTex())
1765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 8; // TODO: short tex encoding
1766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   // check constraints on short MAD
1768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (info.srcNr >= 2 && i->srcExists(2)) {
1769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (i->saturate || i->src(2).mod)
1770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return 8;
1771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ((i->src(0).mod ^ i->src(1).mod) ||
1772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          (i->src(0).mod | i->src(1).mod).abs())
1773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return 8;
1774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!i->defExists(0) ||
1775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          i->def(0).rep()->reg.data.id != i->src(2).rep()->reg.data.id)
1776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return 8;
1777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return info.minEncSize;
1780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Change the encoding size of an instruction after BBs have been scheduled.
1783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgmakeInstructionLong(Instruction *insn)
1785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (insn->encSize == 8)
1787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   Function *fn = insn->bb->getFunction();
1789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int n = 0;
1790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int adj = 4;
1791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (Instruction *i = insn->next; i && i->encSize == 4; ++n, i = i->next);
1793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (n & 1) {
1795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      adj = 8;
1796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      insn->next->encSize = 8;
1797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else
1798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (insn->prev && insn->prev->encSize == 4) {
1799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      adj = 8;
1800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      insn->prev->encSize = 8;
1801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   insn->encSize = 8;
1803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (int i = fn->bbCount - 1; i >= 0 && fn->bbArray[i] != insn->bb; --i) {
1805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      fn->bbArray[i]->binPos += 4;
1806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   fn->binSize += adj;
1808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   insn->bb->binSize += adj;
1809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic bool
1812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtrySetExitModifier(Instruction *insn)
1813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (insn->op == OP_DISCARD ||
1815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       insn->op == OP_QUADON ||
1816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       insn->op == OP_QUADPOP)
1817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return false;
1818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (int s = 0; insn->srcExists(s); ++s)
1819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (insn->src(s).getFile() == FILE_IMMEDIATE)
1820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return false;
1821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (insn->asFlow()) {
1822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (insn->op == OP_CALL) // side effects !
1823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return false;
1824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (insn->getPredicate()) // cannot do conditional exit (or can we ?)
1825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return false;
1826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      insn->op = OP_EXIT;
1827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   insn->exit = 1;
1829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   makeInstructionLong(insn);
1830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return true;
1831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgreplaceExitWithModifier(Function *func)
1835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   BasicBlock *epilogue = BasicBlock::get(func->cfgExit);
1837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!epilogue->getExit() ||
1839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       epilogue->getExit()->op != OP_EXIT) // only main will use OP_EXIT
1840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (epilogue->getEntry()->op != OP_EXIT) {
1843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      Instruction *insn = epilogue->getExit()->prev;
1844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!insn || !trySetExitModifier(insn))
1845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return;
1846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      insn->exit = 1;
1847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
1848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (Graph::EdgeIterator ei = func->cfgExit->incident();
1849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           !ei.end(); ei.next()) {
1850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         BasicBlock *bb = BasicBlock::get(ei.getNode());
1851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         Instruction *i = bb->getExit();
1852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!i || !trySetExitModifier(i))
1854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return;
1855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   epilogue->binSize -= 8;
1858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   func->binSize -= 8;
1859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   delete_Instruction(func->getProgram(), epilogue->getExit());
1860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::prepareEmission(Function *func)
1864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CodeEmitter::prepareEmission(func);
1866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   replaceExitWithModifier(func);
1868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitterNV50::CodeEmitterNV50(const TargetNV50 *target) : CodeEmitter(target)
1871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   targ = target; // specialized
1873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   code = NULL;
1874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   codeSize = codeSizeLimit = 0;
1875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   relocInfo = NULL;
1876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgCodeEmitter *
1879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgTargetNV50::getCodeEmitter(Program::Type type)
1880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   CodeEmitterNV50 *emit = new CodeEmitterNV50(this);
1882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   emit->setProgramType(type);
1883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return emit;
1884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} // namespace nv50_ir
1887