1d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/*
2d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * Copyright 2014 Red Hat Inc.
3d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs *
4d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * Permission is hereby granted, free of charge, to any person obtaining a
5d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * copy of this software and associated documentation files (the "Software"),
6d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * to deal in the Software without restriction, including without limitation
7d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * and/or sell copies of the Software, and to permit persons to whom the
9d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * Software is furnished to do so, subject to the following conditions:
10d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs *
11d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * The above copyright notice and this permission notice shall be included in
12d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * all copies or substantial portions of the Software.
13d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs *
14d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * OTHER DEALINGS IN THE SOFTWARE.
21d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs *
22d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * Authors: Ben Skeggs <bskeggs@redhat.com>
23d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs */
24d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
25d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs#include "codegen/nv50_ir_target_gm107.h"
26d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
27f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset//#define GM107_DEBUG_SCHED_DATA
28f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
29d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsnamespace nv50_ir {
30d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
31d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsclass CodeEmitterGM107 : public CodeEmitter
32d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
33d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggspublic:
34d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   CodeEmitterGM107(const TargetGM107 *);
35d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
36d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   virtual bool emitInstruction(Instruction *);
37d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   virtual uint32_t getMinEncodingSize(const Instruction *) const;
38d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
39d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   virtual void prepareEmission(Program *);
40d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   virtual void prepareEmission(Function *);
41d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
42d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline void setProgramType(Program::Type pType) { progType = pType; }
43d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
44d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsprivate:
45d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   const TargetGM107 *targGM107;
46d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
47d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   Program::Type progType;
48d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
49d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   const Instruction *insn;
50d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   const bool writeIssueDelays;
51d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   uint32_t *data;
52d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
53d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsprivate:
54d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline void emitField(uint32_t *, int, int, uint32_t);
55d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline void emitField(int b, int s, uint32_t v) { emitField(code, b, s, v); }
56d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
57d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline void emitInsn(uint32_t, bool);
58d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline void emitInsn(uint32_t o) { emitInsn(o, true); }
59d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline void emitPred();
60d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline void emitGPR(int, const Value *);
61d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline void emitGPR(int pos) {
62d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR(pos, (const Value *)NULL);
63d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
64d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline void emitGPR(int pos, const ValueRef &ref) {
65d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR(pos, ref.get() ? ref.rep() : (const Value *)NULL);
66d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
67d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline void emitGPR(int pos, const ValueRef *ref) {
68d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR(pos, ref ? ref->rep() : (const Value *)NULL);
69d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
70d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline void emitGPR(int pos, const ValueDef &def) {
71d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR(pos, def.get() ? def.rep() : (const Value *)NULL);
72d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
73d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline void emitSYS(int, const Value *);
74d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline void emitSYS(int pos, const ValueRef &ref) {
75d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitSYS(pos, ref.get() ? ref.rep() : (const Value *)NULL);
76d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
77d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline void emitPRED(int, const Value *);
78d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline void emitPRED(int pos) {
79d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitPRED(pos, (const Value *)NULL);
80d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
81d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline void emitPRED(int pos, const ValueRef &ref) {
82d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitPRED(pos, ref.get() ? ref.rep() : (const Value *)NULL);
83d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
84d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline void emitPRED(int pos, const ValueDef &def) {
85d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitPRED(pos, def.get() ? def.rep() : (const Value *)NULL);
86d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
87d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline void emitADDR(int, int, int, int, const ValueRef &);
88d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline void emitCBUF(int, int, int, int, int, const ValueRef &);
89d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline bool longIMMD(const ValueRef &);
90d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline void emitIMMD(int, int, const ValueRef &);
91d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
92d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitCond3(int, CondCode);
93d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitCond4(int, CondCode);
94d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitCond5(int pos, CondCode cc) { emitCond4(pos, cc); }
95d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline void emitO(int);
96d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline void emitP(int);
97d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline void emitSAT(int);
98d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline void emitCC(int);
99d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline void emitX(int);
100d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline void emitABS(int, const ValueRef &);
101d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline void emitNEG(int, const ValueRef &);
102d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline void emitNEG2(int, const ValueRef &, const ValueRef &);
103d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline void emitFMZ(int, int);
104d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline void emitRND(int, RoundMode, int);
105d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline void emitRND(int pos) {
106d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitRND(pos, insn->rnd, -1);
107d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
108d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline void emitPDIV(int);
109d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   inline void emitINV(int, const ValueRef &);
110d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
111d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitEXIT();
112d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitBRA();
113d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitCAL();
114d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitPCNT();
115d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitCONT();
116d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitPBK();
117d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitBRK();
118d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitPRET();
119d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitRET();
120d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitSSY();
121d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitSYNC();
122d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitSAM();
123d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitRAM();
124d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
125d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitMOV();
126d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitS2R();
127d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitF2F();
128d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitF2I();
129d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitI2F();
130d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitI2I();
131d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin   void emitSEL();
132d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitSHFL();
133d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
134d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitDADD();
135d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitDMUL();
136d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitDFMA();
137d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitDMNMX();
138d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitDSET();
139d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitDSETP();
140d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
141d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitFADD();
142d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitFMUL();
143d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitFFMA();
144d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitMUFU();
145d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitFMNMX();
146d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitRRO();
147d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitFCMP();
148d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitFSET();
149d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitFSETP();
150d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitFSWZADD();
151d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
152d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitLOP();
153d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitNOT();
154d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitIADD();
155d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitIMUL();
156d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitIMAD();
15731545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset   void emitISCADD();
158d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitIMNMX();
159d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitICMP();
160d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitISET();
161d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitISETP();
162d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitSHL();
163d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitSHR();
164d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitPOPC();
165d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitBFI();
166d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitBFE();
167d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitFLO();
168d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
169d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitLDSTs(int, DataType);
170d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitLDSTc(int);
171d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitLDC();
172d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitLDL();
173d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitLDS();
174d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitLD();
175d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitSTL();
176d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitSTS();
177d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitST();
178d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitALD();
179d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitAST();
180d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitISBERD();
1819d60793a03e40e1d139b78fce0144cad57438741Ilia Mirkin   void emitAL2P();
182d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitIPA();
18371a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin   void emitATOM();
1848f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset   void emitATOMS();
185a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset   void emitRED();
18671a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin   void emitCCTL();
187d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
188d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitPIXLD();
189d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
190d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitTEXs(int);
191d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitTEX();
192d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitTLD();
193d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitTLD4();
194d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitTXD();
195d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitTXQ();
196d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitTMML();
197d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitDEPBAR();
198d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
199d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitNOP();
200d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitKIL();
201d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   void emitOUT();
202d11266aa06a507d8895bdc1f454a5837131cc1afSamuel Pitoiset
203c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset   void emitBAR();
204d11266aa06a507d8895bdc1f454a5837131cc1afSamuel Pitoiset   void emitMEMBAR();
20507ed003faf3199a3e95852e7a34763aeaf76503dSamuel Pitoiset
20607ed003faf3199a3e95852e7a34763aeaf76503dSamuel Pitoiset   void emitVOTE();
2074aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset
2084aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   void emitSUTarget();
2094aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   void emitSUHandle(const int s);
2104aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   void emitSUSTx();
2114aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   void emitSULDx();
2121edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset   void emitSUREDx();
213d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs};
214d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
215d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/*******************************************************************************
216d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * general instruction layout/fields
217d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs ******************************************************************************/
218d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
219d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
220d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitField(uint32_t *data, int b, int s, uint32_t v)
221d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
222d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (b >= 0) {
223d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      uint32_t m = ((1ULL << s) - 1);
224d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      uint64_t d = (uint64_t)(v & m) << b;
225d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!(v & ~m) || (v & ~m) == ~m);
226d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      data[1] |= d >> 32;
227d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      data[0] |= d;
228d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
229d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
230d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
231d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
232d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitPred()
233d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
234d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (insn->predSrc >= 0) {
235d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(16, 3, insn->getSrc(insn->predSrc)->rep()->reg.data.id);
236d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(19, 1, insn->cc == CC_NOT_P);
237d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   } else {
238d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(16, 3, 7);
239d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
240d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
241d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
242d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
243d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitInsn(uint32_t hi, bool pred)
244d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
245d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   code[0] = 0x00000000;
246d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   code[1] = hi;
247d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (pred)
248d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitPred();
249d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
250d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
251d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
252d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitGPR(int pos, const Value *val)
253d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
254d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(pos, 8, val ? val->reg.data.id : 255);
255d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
256d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
257d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
258d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitSYS(int pos, const Value *val)
259d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
260d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   int id = val ? val->reg.data.id : -1;
261d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
262d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (id) {
2639143940da2c4f0deb07d01c1b48d16bb16022997Ilia Mirkin   case SV_LANEID         : id = 0x00; break;
2649143940da2c4f0deb07d01c1b48d16bb16022997Ilia Mirkin   case SV_VERTEX_COUNT   : id = 0x10; break;
265d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case SV_INVOCATION_ID  : id = 0x11; break;
26639f51ec96f00f601b9c4d4e321dacb3af9dc866fIlia Mirkin   case SV_THREAD_KILL    : id = 0x13; break;
267d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case SV_INVOCATION_INFO: id = 0x1d; break;
2687f0a19400eb26f555a0db535eff156a0a5091cb3Samuel Pitoiset   case SV_TID            : id = 0x21 + val->reg.data.sv.index; break;
2697f0a19400eb26f555a0db535eff156a0a5091cb3Samuel Pitoiset   case SV_CTAID          : id = 0x25 + val->reg.data.sv.index; break;
270d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
271d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"invalid system value");
272d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      id = 0;
273d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
274d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
275d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
276d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(pos, 8, id);
277d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
278d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
279d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
280d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitPRED(int pos, const Value *val)
281d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
282d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(pos, 3, val ? val->reg.data.id : 7);
283d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
284d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
285d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
286d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitADDR(int gpr, int off, int len, int shr,
287d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs                           const ValueRef &ref)
288d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
289d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   const Value *v = ref.get();
290d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   assert(!(v->reg.data.offset & ((1 << shr) - 1)));
291d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (gpr >= 0)
292d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR(gpr, ref.getIndirect(0));
293d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(off, len, v->reg.data.offset >> shr);
294d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
295d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
296d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
297d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitCBUF(int buf, int gpr, int off, int len, int shr,
298d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs                           const ValueRef &ref)
299d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
300d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   const Value *v = ref.get();
301d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   const Symbol *s = v->asSym();
302d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
303d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   assert(!(s->reg.data.offset & ((1 << shr) - 1)));
304d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
305d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(buf,  5, v->reg.fileIndex);
306d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (gpr >= 0)
307d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR(gpr, ref.getIndirect(0));
308d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(off, 16, s->reg.data.offset >> shr);
309d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
310d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
311d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsbool
312d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::longIMMD(const ValueRef &ref)
313d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
314d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (ref.getFile() == FILE_IMMEDIATE) {
315d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      const ImmediateValue *imm = ref.get()->asImm();
316d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      if (isFloatType(insn->sType)) {
317d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         if ((imm->reg.data.u32 & 0x00000fff) != 0x00000000)
318d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs            return true;
319d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      } else {
320d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         if ((imm->reg.data.u32 & 0xfff00000) != 0x00000000 &&
321d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs             (imm->reg.data.u32 & 0xfff00000) != 0xfff00000)
322d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs            return true;
323d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      }
324d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
325d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   return false;
326d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
327d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
328d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
329d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitIMMD(int pos, int len, const ValueRef &ref)
330d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
331d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   const ImmediateValue *imm = ref.get()->asImm();
332d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   uint32_t val = imm->reg.data.u32;
333d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
334d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (len == 19) {
335b487b55f7d08c00f2efabc097c7138403528893fHans de Goede      if (insn->sType == TYPE_F32 || insn->sType == TYPE_F16) {
336d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         assert(!(val & 0x00000fff));
337d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         val >>= 12;
338b487b55f7d08c00f2efabc097c7138403528893fHans de Goede      } else if (insn->sType == TYPE_F64) {
339b487b55f7d08c00f2efabc097c7138403528893fHans de Goede         assert(!(imm->reg.data.u64 & 0x00000fffffffffffULL));
340b487b55f7d08c00f2efabc097c7138403528893fHans de Goede         val = imm->reg.data.u64 >> 44;
341d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      }
342d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!(val & 0xfff00000) || (val & 0xfff00000) == 0xfff00000);
343d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField( 56,   1, (val & 0x80000) >> 19);
344d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(pos, len, (val & 0x7ffff));
345d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   } else {
346d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(pos, len, val);
347d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
348d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
349d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
350d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/*******************************************************************************
351d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * modifiers
352d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs ******************************************************************************/
353d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
354d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
355d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitCond3(int pos, CondCode code)
356d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
357d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   int data = 0;
358d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
359d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (code) {
360d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case CC_FL : data = 0x00; break;
361d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case CC_LTU:
362d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case CC_LT : data = 0x01; break;
363d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case CC_EQU:
364d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case CC_EQ : data = 0x02; break;
365d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case CC_LEU:
366d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case CC_LE : data = 0x03; break;
367d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case CC_GTU:
368d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case CC_GT : data = 0x04; break;
369d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case CC_NEU:
370d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case CC_NE : data = 0x05; break;
371d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case CC_GEU:
372d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case CC_GE : data = 0x06; break;
373d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case CC_TR : data = 0x07; break;
374d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
375d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"invalid cond3");
376d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
377d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
378d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
379d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(pos, 3, data);
380d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
381d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
382d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
383d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitCond4(int pos, CondCode code)
384d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
385d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   int data = 0;
386d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
387d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (code) {
388d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case CC_FL: data = 0x00; break;
389d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case CC_LT: data = 0x01; break;
390d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case CC_EQ: data = 0x02; break;
391d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case CC_LE: data = 0x03; break;
392d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case CC_GT: data = 0x04; break;
393d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case CC_NE: data = 0x05; break;
394d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case CC_GE: data = 0x06; break;
395d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs//   case CC_NUM: data = 0x07; break;
396d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs//   case CC_NAN: data = 0x08; break;
397d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case CC_LTU: data = 0x09; break;
398d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case CC_EQU: data = 0x0a; break;
399d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case CC_LEU: data = 0x0b; break;
400d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case CC_GTU: data = 0x0c; break;
401d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case CC_NEU: data = 0x0d; break;
402d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case CC_GEU: data = 0x0e; break;
403d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case CC_TR:  data = 0x0f; break;
404d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
405d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"invalid cond4");
406d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
407d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
408d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
409d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(pos, 4, data);
410d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
411d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
412d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
413d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitO(int pos)
414d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
415d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(pos, 1, insn->getSrc(0)->reg.file == FILE_SHADER_OUTPUT);
416d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
417d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
418d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
419d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitP(int pos)
420d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
421d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(pos, 1, insn->perPatch);
422d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
423d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
424d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
425d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitSAT(int pos)
426d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
427d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(pos, 1, insn->saturate);
428d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
429d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
430d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
431d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitCC(int pos)
432d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
433cc97b6a34a81e58c29bed6dae06613b388506283Samuel Pitoiset   emitField(pos, 1, insn->flagsDef >= 0);
434d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
435d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
436d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
437d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitX(int pos)
438d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
439d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(pos, 1, insn->flagsSrc >= 0);
440d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
441d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
442d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
443d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitABS(int pos, const ValueRef &ref)
444d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
445d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(pos, 1, ref.mod.abs());
446d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
447d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
448d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
449d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitNEG(int pos, const ValueRef &ref)
450d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
451d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(pos, 1, ref.mod.neg());
452d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
453d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
454d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
455d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitNEG2(int pos, const ValueRef &a, const ValueRef &b)
456d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
457d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(pos, 1, a.mod.neg() ^ b.mod.neg());
458d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
459d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
460d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
461d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitFMZ(int pos, int len)
462d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
463d58037ccf5f362cabecb09bd4874db52629bbd71Ilia Mirkin   emitField(pos, len, insn->dnz << 1 | insn->ftz);
464d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
465d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
466d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
467d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitRND(int rmp, RoundMode rnd, int rip)
468d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
469d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   int rm = 0, ri = 0;
470d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (rnd) {
471d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case ROUND_NI: ri = 1;
472d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case ROUND_N : rm = 0; break;
473d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case ROUND_MI: ri = 1;
474d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case ROUND_M : rm = 1; break;
475d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case ROUND_PI: ri = 1;
476d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case ROUND_P : rm = 2; break;
477d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case ROUND_ZI: ri = 1;
478d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case ROUND_Z : rm = 3; break;
479d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
480d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"invalid round mode");
481d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
482d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
483d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(rip, 1, ri);
484d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(rmp, 2, rm);
485d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
486d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
487d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
488d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitPDIV(int pos)
489d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
490d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   assert(insn->postFactor >= -3 && insn->postFactor <= 3);
491d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (insn->postFactor > 0)
492d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(pos, 3, 7 - insn->postFactor);
493d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   else
494d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(pos, 3, 0 - insn->postFactor);
495d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
496d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
497d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
498d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitINV(int pos, const ValueRef &ref)
499d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
500d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(pos, 1, !!(ref.mod & Modifier(NV50_IR_MOD_NOT)));
501d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
502d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
503d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/*******************************************************************************
504d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * control flow
505d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs ******************************************************************************/
506d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
507d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
508d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitEXIT()
509d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
510d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitInsn (0xe3000000);
511d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCond5(0x00, CC_TR);
512d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
513d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
514d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
515d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitBRA()
516d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
517d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   const FlowInstruction *insn = this->insn->asFlow();
518d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   int gpr = -1;
519d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
520d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (insn->indirect) {
521d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      if (insn->absolute)
522d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0xe2000000); // JMX
523d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      else
524d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0xe2500000); // BRX
525d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      gpr = 0x08;
526d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   } else {
527d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      if (insn->absolute)
528d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0xe2100000); // JMP
529d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      else
530d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0xe2400000); // BRA
531d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x07, 1, insn->allWarp);
532d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
533d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
534d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x06, 1, insn->limit);
535d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCond5(0x00, CC_TR);
536d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
537d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (!insn->srcExists(0) || insn->src(0).getFile() != FILE_MEMORY_CONST) {
5380ec6b8ea8ce0929ecacf6edc8db198b7b9604f18Ilia Mirkin      int32_t pos = insn->target.bb->binPos;
5390ec6b8ea8ce0929ecacf6edc8db198b7b9604f18Ilia Mirkin      if (writeIssueDelays && !(pos & 0x1f))
5400ec6b8ea8ce0929ecacf6edc8db198b7b9604f18Ilia Mirkin         pos += 8;
541d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      if (!insn->absolute)
5420ec6b8ea8ce0929ecacf6edc8db198b7b9604f18Ilia Mirkin         emitField(0x14, 24, pos - (codeSize + 8));
543d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      else
5440ec6b8ea8ce0929ecacf6edc8db198b7b9604f18Ilia Mirkin         emitField(0x14, 32, pos);
545d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   } else {
546d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF (0x24, gpr, 20, 16, 0, insn->src(0));
547d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x05, 1, 1);
548d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
549d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
550d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
551d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
552d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitCAL()
553d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
554d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   const FlowInstruction *insn = this->insn->asFlow();
555d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
556d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (insn->absolute) {
557d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0xe2200000, 0); // JCAL
558d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   } else {
559d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0xe2600000, 0); // CAL
560d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
561d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
562d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (!insn->srcExists(0) || insn->src(0).getFile() != FILE_MEMORY_CONST) {
563d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      if (!insn->absolute)
564d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitField(0x14, 24, insn->target.bb->binPos - (codeSize + 8));
565d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      else {
566d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         if (insn->builtin) {
567d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs            int pcAbs = targGM107->getBuiltinOffset(insn->target.builtin);
568d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs            addReloc(RelocEntry::TYPE_BUILTIN, 0, pcAbs, 0xfff00000,  20);
569d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs            addReloc(RelocEntry::TYPE_BUILTIN, 1, pcAbs, 0x000fffff, -12);
570d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         } else {
571d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs            emitField(0x14, 32, insn->target.bb->binPos);
572d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         }
573d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      }
574d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   } else {
575d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF (0x24, -1, 20, 16, 0, insn->src(0));
576d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x05, 1, 1);
577d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
578d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
579d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
580d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
581d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitPCNT()
582d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
583d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   const FlowInstruction *insn = this->insn->asFlow();
584d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
585d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitInsn(0xe2b00000, 0);
586d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
587d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (!insn->srcExists(0) || insn->src(0).getFile() != FILE_MEMORY_CONST) {
588d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x14, 24, insn->target.bb->binPos - (codeSize + 8));
589d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   } else {
590d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF (0x24, -1, 20, 16, 0, insn->src(0));
591d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x05, 1, 1);
592d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
593d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
594d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
595d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
596d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitCONT()
597d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
598d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitInsn (0xe3500000);
599d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCond5(0x00, CC_TR);
600d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
601d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
602d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
603d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitPBK()
604d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
605d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   const FlowInstruction *insn = this->insn->asFlow();
606d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
607d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitInsn(0xe2a00000, 0);
608d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
609d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (!insn->srcExists(0) || insn->src(0).getFile() != FILE_MEMORY_CONST) {
610d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x14, 24, insn->target.bb->binPos - (codeSize + 8));
611d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   } else {
612d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF (0x24, -1, 20, 16, 0, insn->src(0));
613d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x05, 1, 1);
614d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
615d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
616d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
617d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
618d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitBRK()
619d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
620d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitInsn (0xe3400000);
621d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCond5(0x00, CC_TR);
622d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
623d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
624d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
625d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitPRET()
626d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
627d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   const FlowInstruction *insn = this->insn->asFlow();
628d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
629d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitInsn(0xe2700000, 0);
630d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
631d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (!insn->srcExists(0) || insn->src(0).getFile() != FILE_MEMORY_CONST) {
632d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x14, 24, insn->target.bb->binPos - (codeSize + 8));
633d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   } else {
634d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF (0x24, -1, 20, 16, 0, insn->src(0));
635d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x05, 1, 1);
636d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
637d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
638d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
639d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
640d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitRET()
641d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
642d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitInsn (0xe3200000);
643d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCond5(0x00, CC_TR);
644d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
645d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
646d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
647d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitSSY()
648d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
649d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   const FlowInstruction *insn = this->insn->asFlow();
650d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
651d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitInsn(0xe2900000, 0);
652d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
653d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (!insn->srcExists(0) || insn->src(0).getFile() != FILE_MEMORY_CONST) {
654d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x14, 24, insn->target.bb->binPos - (codeSize + 8));
655d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   } else {
656d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF (0x24, -1, 20, 16, 0, insn->src(0));
657d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x05, 1, 1);
658d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
659d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
660d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
661d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
662d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitSYNC()
663d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
664d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitInsn (0xf0f80000);
665d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCond5(0x00, CC_TR);
666d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
667d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
668d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
669d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitSAM()
670d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
671d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitInsn(0xe3700000, 0);
672d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
673d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
674d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
675d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitRAM()
676d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
677d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitInsn(0xe3800000, 0);
678d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
679d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
680d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/*******************************************************************************
681d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * predicate/cc
682d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs ******************************************************************************/
683d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
684d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/*******************************************************************************
685d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * movement / conversion
686d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs ******************************************************************************/
687d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
688d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
689d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitMOV()
690d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
691c7fa3c92f8fc9634af966e760a7601922cca43f6Samuel Pitoiset   if (insn->src(0).getFile() != FILE_IMMEDIATE) {
692d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      switch (insn->src(0).getFile()) {
693d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_GPR:
6941a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin         if (insn->def(0).getFile() == FILE_PREDICATE) {
6951a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin            emitInsn(0x5b6a0000);
6961a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin            emitGPR (0x08);
6971a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin         } else {
6981a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin            emitInsn(0x5c980000);
6991a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin         }
700d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitGPR (0x14, insn->src(0));
701d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
702d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_MEMORY_CONST:
703d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x4c980000);
704d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(0));
705d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
706d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_IMMEDIATE:
707d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x38980000);
708d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitIMMD(0x14, 19, insn->src(0));
709d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
7101a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin      case FILE_PREDICATE:
7111a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin         emitInsn(0x50880000);
7121a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin         emitPRED(0x0c, insn->src(0));
7131a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin         emitPRED(0x1d);
7141a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin         emitPRED(0x27);
7151a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin         break;
716d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      default:
717d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         assert(!"bad src file");
718d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
719d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      }
7201a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin      if (insn->def(0).getFile() != FILE_PREDICATE &&
7211a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin          insn->src(0).getFile() != FILE_PREDICATE)
7221a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin         emitField(0x27, 4, insn->lanes);
723d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   } else {
724d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn (0x01000000);
725d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitIMMD (0x14, 32, insn->src(0));
726d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x0c, 4, insn->lanes);
727d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
728d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
7291a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin   if (insn->def(0).getFile() == FILE_PREDICATE) {
7301a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin      emitPRED(0x27);
7311a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin      emitPRED(0x03, insn->def(0));
7321a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin      emitPRED(0x00);
7331a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin   } else {
7341a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin      emitGPR(0x00, insn->def(0));
7351a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin   }
736d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
737d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
738d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
739d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitS2R()
740d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
741d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitInsn(0xf0c80000);
742d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitSYS (0x14, insn->src(0));
743d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR (0x00, insn->def(0));
744d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
745d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
746d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
747d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitF2F()
748d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
749d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   RoundMode rnd = insn->rnd;
750d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
751d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (insn->op) {
752d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_FLOOR: rnd = ROUND_MI; break;
753d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_CEIL : rnd = ROUND_PI; break;
754d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_TRUNC: rnd = ROUND_ZI; break;
755d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
756d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
757d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
758d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
759d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (insn->src(0).getFile()) {
760d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_GPR:
761d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x5ca80000);
762d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x14, insn->src(0));
763d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
764d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_MEMORY_CONST:
765d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x4ca80000);
766d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(0));
767d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
768d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_IMMEDIATE:
769d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x38a80000);
770d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitIMMD(0x14, 19, insn->src(0));
771d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
772d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
773d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"bad src0 file");
774d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
775d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
776d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
777d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x32, 1, (insn->op == OP_SAT) || insn->saturate);
778d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x31, 1, (insn->op == OP_ABS) || insn->src(0).mod.abs());
779d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCC   (0x2f);
780d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x2d, 1, (insn->op == OP_NEG) || insn->src(0).mod.neg());
781d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitFMZ  (0x2c, 1);
78234217018c4ae9c2c672534494be0c5b9569609e2Ilia Mirkin   emitField(0x29, 1, insn->subOp);
783d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitRND  (0x27, rnd, 0x2a);
78493ebe91baed86a63f81fa852c5e7cc0ea52ff562Ilia Mirkin   emitField(0x0a, 2, util_logbase2(typeSizeof(insn->sType)));
78593ebe91baed86a63f81fa852c5e7cc0ea52ff562Ilia Mirkin   emitField(0x08, 2, util_logbase2(typeSizeof(insn->dType)));
786d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
787d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
788d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
789d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
790d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitF2I()
791d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
792d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   RoundMode rnd = insn->rnd;
793d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
794d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (insn->op) {
795d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_FLOOR: rnd = ROUND_M; break;
796d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_CEIL : rnd = ROUND_P; break;
797d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_TRUNC: rnd = ROUND_Z; break;
798d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
799d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
800d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
801d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
802d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (insn->src(0).getFile()) {
803d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_GPR:
804d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x5cb00000);
805d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x14, insn->src(0));
806d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
807d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_MEMORY_CONST:
808d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x4cb00000);
809d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(0));
810d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
811d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_IMMEDIATE:
812d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x38b00000);
813d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitIMMD(0x14, 19, insn->src(0));
814d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
815d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
816d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"bad src0 file");
817d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
818d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
819d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
820d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x31, 1, (insn->op == OP_ABS) || insn->src(0).mod.abs());
821d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCC   (0x2f);
822d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x2d, 1, (insn->op == OP_NEG) || insn->src(0).mod.neg());
823d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitFMZ  (0x2c, 1);
824d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitRND  (0x27, rnd, 0x2a);
825d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x0c, 1, isSignedType(insn->dType));
826d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x0a, 2, util_logbase2(typeSizeof(insn->sType)));
827d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x08, 2, util_logbase2(typeSizeof(insn->dType)));
828d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
829d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
830d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
831d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
832d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitI2F()
833d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
834d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   RoundMode rnd = insn->rnd;
835d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
836d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (insn->op) {
837d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_FLOOR: rnd = ROUND_M; break;
838d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_CEIL : rnd = ROUND_P; break;
839d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_TRUNC: rnd = ROUND_Z; break;
840d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
841d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
842d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
843d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
844d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (insn->src(0).getFile()) {
845d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_GPR:
846d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x5cb80000);
847d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x14, insn->src(0));
848d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
849d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_MEMORY_CONST:
850d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x4cb80000);
851d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(0));
852d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
853d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_IMMEDIATE:
854d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x38b80000);
855d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitIMMD(0x14, 19, insn->src(0));
856d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
857d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
858d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"bad src0 file");
859d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
860d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
861d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
862d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x31, 1, (insn->op == OP_ABS) || insn->src(0).mod.abs());
863d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCC   (0x2f);
864d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x2d, 1, (insn->op == OP_NEG) || insn->src(0).mod.neg());
86563cb85e567ad1025ee990b38f43c2f1ef811821bIlia Mirkin   emitField(0x29, 2, insn->subOp);
866d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitRND  (0x27, rnd, -1);
867d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x0d, 1, isSignedType(insn->sType));
868d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x0a, 2, util_logbase2(typeSizeof(insn->sType)));
869d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x08, 2, util_logbase2(typeSizeof(insn->dType)));
870d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
871d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
872d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
873d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
874d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitI2I()
875d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
876d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (insn->src(0).getFile()) {
877d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_GPR:
878d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x5ce00000);
879d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x14, insn->src(0));
880d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
881d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_MEMORY_CONST:
882d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x4ce00000);
883d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(0));
884d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
885d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_IMMEDIATE:
886d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x38e00000);
887d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitIMMD(0x14, 19, insn->src(0));
888d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
889d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
890d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"bad src0 file");
891d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
892d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
893d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
894d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitSAT  (0x32);
895d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x31, 1, (insn->op == OP_ABS) || insn->src(0).mod.abs());
896d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCC   (0x2f);
897d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x2d, 1, (insn->op == OP_NEG) || insn->src(0).mod.neg());
89863cb85e567ad1025ee990b38f43c2f1ef811821bIlia Mirkin   emitField(0x29, 2, insn->subOp);
899d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x0d, 1, isSignedType(insn->sType));
900d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x0c, 1, isSignedType(insn->dType));
901d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x0a, 2, util_logbase2(typeSizeof(insn->sType)));
902d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x08, 2, util_logbase2(typeSizeof(insn->dType)));
903d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
904d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
905d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
906ba3f0b6d5920165c735d51500544da8c29b09060Ilia Mirkinstatic void
907ba3f0b6d5920165c735d51500544da8c29b09060Ilia MirkinselpFlip(const FixupEntry *entry, uint32_t *code, const FixupData& data)
908ba3f0b6d5920165c735d51500544da8c29b09060Ilia Mirkin{
909ba3f0b6d5920165c735d51500544da8c29b09060Ilia Mirkin   int loc = entry->loc;
910ba3f0b6d5920165c735d51500544da8c29b09060Ilia Mirkin   if (data.force_persample_interp)
911ba3f0b6d5920165c735d51500544da8c29b09060Ilia Mirkin      code[loc + 1] |= 1 << 10;
912ba3f0b6d5920165c735d51500544da8c29b09060Ilia Mirkin   else
913ba3f0b6d5920165c735d51500544da8c29b09060Ilia Mirkin      code[loc + 1] &= ~(1 << 10);
914ba3f0b6d5920165c735d51500544da8c29b09060Ilia Mirkin}
915ba3f0b6d5920165c735d51500544da8c29b09060Ilia Mirkin
916d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
917d64134ecaec46f95189e355de65f631b1b7f7007Ilia MirkinCodeEmitterGM107::emitSEL()
918d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin{
919d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin   switch (insn->src(1).getFile()) {
920d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin   case FILE_GPR:
921d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin      emitInsn(0x5ca00000);
922d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin      emitGPR (0x14, insn->src(1));
923d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin      break;
924d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin   case FILE_MEMORY_CONST:
925d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin      emitInsn(0x4ca00000);
926d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin      emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1));
927d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin      break;
928d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin   case FILE_IMMEDIATE:
929d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin      emitInsn(0x38a00000);
930d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin      emitIMMD(0x14, 19, insn->src(1));
931d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin      break;
932d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin   default:
933d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin      assert(!"bad src1 file");
934d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin      break;
935d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin   }
936d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin
937ba3f0b6d5920165c735d51500544da8c29b09060Ilia Mirkin   emitINV (0x2a, insn->src(2));
938d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin   emitPRED(0x27, insn->src(2));
939d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin   emitGPR (0x08, insn->src(0));
940d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin   emitGPR (0x00, insn->def(0));
941ba3f0b6d5920165c735d51500544da8c29b09060Ilia Mirkin
942ba3f0b6d5920165c735d51500544da8c29b09060Ilia Mirkin   if (insn->subOp == 1) {
943ba3f0b6d5920165c735d51500544da8c29b09060Ilia Mirkin      addInterp(0, 0, selpFlip);
944ba3f0b6d5920165c735d51500544da8c29b09060Ilia Mirkin   }
945d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin}
946d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin
947d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkinvoid
948d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitSHFL()
949d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
950d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   int type = 0;
951d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
952d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitInsn (0xef100000);
953d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
954d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (insn->src(1).getFile()) {
955d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_GPR:
956d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR(0x14, insn->src(1));
957d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
958d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_IMMEDIATE:
959d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitIMMD(0x14, 5, insn->src(1));
960d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      type |= 1;
961d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
962d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
963d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"invalid src1 file");
964d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
965d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
966d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
967d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   /*XXX: what is this arg? hardcode immediate for now */
968d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x22, 13, 0x1c03);
969d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   type |= 2;
970d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
971d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitPRED (0x30);
972d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x1e, 2, insn->subOp);
973d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x1c, 2, type);
974d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x08, insn->src(0));
975d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
976d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
977d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
978d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/*******************************************************************************
979d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * double
980d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs ******************************************************************************/
981d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
982d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
983d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitDADD()
984d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
985d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (insn->src(1).getFile()) {
986d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_GPR:
987d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x5c700000);
988d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x14, insn->src(1));
989d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
990d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_MEMORY_CONST:
991d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x4c700000);
992d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1));
993d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
994d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_IMMEDIATE:
995d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x38700000);
996d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitIMMD(0x14, 19, insn->src(1));
997d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
998d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
999d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"bad src1 file");
1000d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1001d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
1002d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitABS(0x31, insn->src(1));
1003d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitNEG(0x30, insn->src(0));
1004d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCC (0x2f);
1005d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitABS(0x2e, insn->src(0));
1006d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitNEG(0x2d, insn->src(1));
1007d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1008d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (insn->op == OP_SUB)
1009d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      code[1] ^= 0x00002000;
1010d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1011d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR(0x08, insn->src(0));
1012d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR(0x00, insn->def(0));
1013d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
1014d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1015d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
1016d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitDMUL()
1017d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
1018d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (insn->src(1).getFile()) {
1019d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_GPR:
1020727018bb0c4fb7ca6e047937af5a58e17a1b4f7cIlia Mirkin      emitInsn(0x5c800000);
1021d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x14, insn->src(1));
1022d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1023d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_MEMORY_CONST:
1024727018bb0c4fb7ca6e047937af5a58e17a1b4f7cIlia Mirkin      emitInsn(0x4c800000);
1025d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1));
1026d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1027d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_IMMEDIATE:
1028727018bb0c4fb7ca6e047937af5a58e17a1b4f7cIlia Mirkin      emitInsn(0x38800000);
1029d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitIMMD(0x14, 19, insn->src(1));
1030d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1031d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
1032d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"bad src1 file");
1033d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1034d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
1035d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1036d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitNEG2(0x30, insn->src(0), insn->src(1));
1037d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCC  (0x2f);
1038d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitRND (0x27);
1039d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR (0x08, insn->src(0));
1040d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR (0x00, insn->def(0));
1041d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
1042d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1043d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
1044d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitDFMA()
1045d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
1046d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch(insn->src(2).getFile()) {
1047d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_GPR:
1048d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      switch (insn->src(1).getFile()) {
1049d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_GPR:
1050d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x5b700000);
1051d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitGPR (0x14, insn->src(1));
1052d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1053d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_MEMORY_CONST:
1054d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x4b700000);
1055d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1));
1056d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1057d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_IMMEDIATE:
1058d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x36700000);
1059d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitIMMD(0x14, 19, insn->src(1));
1060d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1061d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      default:
1062d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         assert(!"bad src1 file");
1063d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1064d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      }
1065d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x27, insn->src(2));
1066d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1067d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_MEMORY_CONST:
1068d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x53700000);
1069d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x27, insn->src(1));
1070d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(2));
1071d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1072d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
1073d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"bad src2 file");
1074d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1075d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
1076d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1077d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitRND (0x32);
1078d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitNEG (0x31, insn->src(2));
1079d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitNEG2(0x30, insn->src(0), insn->src(1));
1080d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCC  (0x2f);
1081d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR (0x08, insn->src(0));
1082d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR (0x00, insn->def(0));
1083d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
1084d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1085d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
1086d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitDMNMX()
1087d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
1088d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (insn->src(1).getFile()) {
1089d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_GPR:
1090d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x5c500000);
1091d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x14, insn->src(1));
1092d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1093d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_MEMORY_CONST:
1094d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x4c500000);
1095d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1));
1096d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1097d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_IMMEDIATE:
1098d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x38500000);
1099d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitIMMD(0x14, 19, insn->src(1));
1100d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1101d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
1102d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"bad src1 file");
1103d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1104d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
1105d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1106d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitABS  (0x31, insn->src(1));
1107d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitNEG  (0x30, insn->src(0));
1108d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCC   (0x2f);
1109d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitABS  (0x2e, insn->src(0));
1110d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitNEG  (0x2d, insn->src(1));
1111d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x2a, 1, insn->op == OP_MAX);
1112d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitPRED (0x27);
1113d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x08, insn->src(0));
1114d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
1115d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
1116d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1117d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
1118d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitDSET()
1119d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
1120d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   const CmpInstruction *insn = this->insn->asCmp();
1121d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1122d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (insn->src(1).getFile()) {
1123d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_GPR:
1124d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x59000000);
1125d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x14, insn->src(1));
1126d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1127d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_MEMORY_CONST:
1128d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x49000000);
1129d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1));
1130d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1131d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_IMMEDIATE:
1132d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x32000000);
1133d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitIMMD(0x14, 19, insn->src(1));
1134d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1135d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
1136d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"bad src1 file");
1137d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1138d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
1139d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1140d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (insn->op != OP_SET) {
1141d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      switch (insn->op) {
1142d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case OP_SET_AND: emitField(0x2d, 2, 0); break;
1143d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case OP_SET_OR : emitField(0x2d, 2, 1); break;
1144d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case OP_SET_XOR: emitField(0x2d, 2, 2); break;
1145d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      default:
1146d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         assert(!"invalid set op");
1147d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1148d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      }
1149d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitPRED(0x27, insn->src(2));
1150d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   } else {
1151d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitPRED(0x27);
1152d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
1153d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1154d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitABS  (0x36, insn->src(0));
1155d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitNEG  (0x35, insn->src(1));
1156dbf4a674b94fc8fca21997f8145b96bcf2f7a260Ilia Mirkin   emitField(0x34, 1, insn->dType == TYPE_F32);
1157d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCond4(0x30, insn->setCond);
1158d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCC   (0x2f);
1159d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitABS  (0x2c, insn->src(1));
1160d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitNEG  (0x2b, insn->src(0));
1161d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x08, insn->src(0));
1162d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
1163d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
1164d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1165d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
1166d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitDSETP()
1167d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
1168d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   const CmpInstruction *insn = this->insn->asCmp();
1169d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1170d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (insn->src(1).getFile()) {
1171d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_GPR:
1172d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x5b800000);
1173d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x14, insn->src(1));
1174d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1175d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_MEMORY_CONST:
1176d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x4b800000);
1177d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1));
1178d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1179d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_IMMEDIATE:
1180d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x36800000);
1181d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitIMMD(0x14, 19, insn->src(1));
1182d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1183d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
1184d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"bad src1 file");
1185d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1186d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
1187d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1188d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (insn->op != OP_SET) {
1189d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      switch (insn->op) {
1190d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case OP_SET_AND: emitField(0x2d, 2, 0); break;
1191d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case OP_SET_OR : emitField(0x2d, 2, 1); break;
1192d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case OP_SET_XOR: emitField(0x2d, 2, 2); break;
1193d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      default:
1194d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         assert(!"invalid set op");
1195d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1196d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      }
1197d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitPRED(0x27, insn->src(2));
1198d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   } else {
1199d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitPRED(0x27);
1200d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
1201d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1202d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCond4(0x30, insn->setCond);
1203d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitABS  (0x2c, insn->src(1));
1204d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitNEG  (0x2b, insn->src(0));
1205d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x08, insn->src(0));
1206d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitABS  (0x07, insn->src(0));
1207d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitNEG  (0x06, insn->src(1));
1208d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitPRED (0x03, insn->def(0));
1209d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (insn->defExists(1))
1210d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitPRED(0x00, insn->def(1));
1211d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   else
1212d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitPRED(0x00);
1213d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
1214d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1215d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/*******************************************************************************
1216d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * float
1217d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs ******************************************************************************/
1218d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1219d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
1220d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitFADD()
1221d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
1222d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (!longIMMD(insn->src(1))) {
1223d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      switch (insn->src(1).getFile()) {
1224d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_GPR:
1225d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x5c580000);
1226d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitGPR (0x14, insn->src(1));
1227d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1228d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_MEMORY_CONST:
1229d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x4c580000);
1230d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1));
1231d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1232d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_IMMEDIATE:
1233d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x38580000);
1234d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitIMMD(0x14, 19, insn->src(1));
1235d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1236d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      default:
1237d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         assert(!"bad src1 file");
1238d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1239d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      }
1240d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitSAT(0x32);
1241d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitABS(0x31, insn->src(1));
1242d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitNEG(0x30, insn->src(0));
1243d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCC (0x2f);
1244d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitABS(0x2e, insn->src(0));
1245d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitNEG(0x2d, insn->src(1));
1246d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitFMZ(0x2c, 1);
1247cb828b7b18d83cb2ea3dcaed54c1678616c56fc8Samuel Pitoiset
1248cb828b7b18d83cb2ea3dcaed54c1678616c56fc8Samuel Pitoiset      if (insn->op == OP_SUB)
1249cb828b7b18d83cb2ea3dcaed54c1678616c56fc8Samuel Pitoiset         code[1] ^= 0x00002000;
1250d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   } else {
1251d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x08000000);
1252d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitABS(0x39, insn->src(1));
1253d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitNEG(0x38, insn->src(0));
1254d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitFMZ(0x37, 1);
1255d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitABS(0x36, insn->src(0));
1256d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitNEG(0x35, insn->src(1));
1257d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCC  (0x34);
1258d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitIMMD(0x14, 32, insn->src(1));
1259d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1260cb828b7b18d83cb2ea3dcaed54c1678616c56fc8Samuel Pitoiset      if (insn->op == OP_SUB)
1261cb828b7b18d83cb2ea3dcaed54c1678616c56fc8Samuel Pitoiset         code[1] ^= 0x00080000;
1262cb828b7b18d83cb2ea3dcaed54c1678616c56fc8Samuel Pitoiset   }
1263d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1264d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR(0x08, insn->src(0));
1265d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR(0x00, insn->def(0));
1266d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
1267d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1268d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
1269d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitFMUL()
1270d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
1271d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (!longIMMD(insn->src(1))) {
1272d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      switch (insn->src(1).getFile()) {
1273d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_GPR:
1274d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x5c680000);
1275d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitGPR (0x14, insn->src(1));
1276d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1277d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_MEMORY_CONST:
1278d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x4c680000);
1279d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1));
1280d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1281d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_IMMEDIATE:
1282d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x38680000);
1283d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitIMMD(0x14, 19, insn->src(1));
1284d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1285d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      default:
1286d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         assert(!"bad src1 file");
1287d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1288d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      }
1289d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitSAT (0x32);
1290d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitNEG2(0x30, insn->src(0), insn->src(1));
1291d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCC  (0x2f);
1292d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitFMZ (0x2c, 2);
1293d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitPDIV(0x29);
1294d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitRND (0x27);
1295d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   } else {
1296d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x1e000000);
1297d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitSAT (0x37);
1298d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitFMZ (0x35, 2);
1299d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCC  (0x34);
1300d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitIMMD(0x14, 32, insn->src(1));
1301d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      if (insn->src(0).mod.neg() ^ insn->src(1).mod.neg())
1302d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         code[1] ^= 0x00080000; /* flip immd sign bit */
1303d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
1304d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1305d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR(0x08, insn->src(0));
1306d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR(0x00, insn->def(0));
1307d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
1308d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1309d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
1310d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitFFMA()
1311d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
1312d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   /*XXX: ffma32i exists, but not using it as third src overlaps dst */
1313d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch(insn->src(2).getFile()) {
1314d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_GPR:
1315d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      switch (insn->src(1).getFile()) {
1316d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_GPR:
1317d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x59800000);
1318d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitGPR (0x14, insn->src(1));
1319d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1320d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_MEMORY_CONST:
1321d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x49800000);
1322d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1));
1323d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1324d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_IMMEDIATE:
1325d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x32800000);
1326d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitIMMD(0x14, 19, insn->src(1));
1327d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1328d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      default:
1329d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         assert(!"bad src1 file");
1330d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1331d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      }
1332d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x27, insn->src(2));
1333d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1334d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_MEMORY_CONST:
1335d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x51800000);
1336d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x27, insn->src(1));
1337d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(2));
1338d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1339d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
1340d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"bad src2 file");
1341d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1342d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
1343d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitRND (0x33);
1344d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitSAT (0x32);
1345d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitNEG (0x31, insn->src(2));
1346d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitNEG2(0x30, insn->src(0), insn->src(1));
1347d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCC  (0x2f);
1348d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1349d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitFMZ(0x35, 2);
1350d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR(0x08, insn->src(0));
1351d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR(0x00, insn->def(0));
1352d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
1353d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1354d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
1355d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitMUFU()
1356d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
1357d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   int mufu = 0;
1358d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1359d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (insn->op) {
1360d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_COS: mufu = 0; break;
1361d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_SIN: mufu = 1; break;
1362d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_EX2: mufu = 2; break;
1363d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_LG2: mufu = 3; break;
1364b87b498b88c51fb8c80901b8f581331d3fbcd972Ilia Mirkin   case OP_RCP: mufu = 4 + 2 * insn->subOp; break;
1365b87b498b88c51fb8c80901b8f581331d3fbcd972Ilia Mirkin   case OP_RSQ: mufu = 5 + 2 * insn->subOp; break;
1366d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
1367d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"invalid mufu");
1368d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1369d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
1370d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1371d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitInsn (0x50800000);
1372d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitSAT  (0x32);
1373d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitNEG  (0x30, insn->src(0));
1374d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitABS  (0x2e, insn->src(0));
1375d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x14, 3, mufu);
1376d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x08, insn->src(0));
1377d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
1378d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
1379d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1380d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
1381d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitFMNMX()
1382d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
1383d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (insn->src(1).getFile()) {
1384d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_GPR:
1385d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x5c600000);
1386d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x14, insn->src(1));
1387d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1388d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_MEMORY_CONST:
1389d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x4c600000);
1390d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1));
1391d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1392d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_IMMEDIATE:
1393d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x38600000);
1394d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitIMMD(0x14, 19, insn->src(1));
1395d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1396d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
1397d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"bad src1 file");
1398d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1399d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
1400d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1401d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x2a, 1, insn->op == OP_MAX);
1402d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitPRED (0x27);
1403d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1404d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitABS(0x31, insn->src(1));
1405d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitNEG(0x30, insn->src(0));
1406d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCC (0x2f);
1407d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitABS(0x2e, insn->src(0));
1408d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitNEG(0x2d, insn->src(1));
1409d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitFMZ(0x2c, 1);
1410d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR(0x08, insn->src(0));
1411d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR(0x00, insn->def(0));
1412d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
1413d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1414d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
1415d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitRRO()
1416d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
1417d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (insn->src(0).getFile()) {
1418d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_GPR:
1419d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x5c900000);
1420d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x14, insn->src(0));
1421d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1422d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_MEMORY_CONST:
1423d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x4c900000);
1424d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(0));
1425d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1426d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_IMMEDIATE:
1427d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x38900000);
1428d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitIMMD(0x14, 19, insn->src(0));
1429d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1430d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
1431d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"bad src file");
1432d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1433d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
1434d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1435d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitABS  (0x31, insn->src(0));
1436d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitNEG  (0x2d, insn->src(0));
1437d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x27, 1, insn->op == OP_PREEX2);
1438d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
1439d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
1440d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1441d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
1442d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitFCMP()
1443d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
1444d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   const CmpInstruction *insn = this->insn->asCmp();
1445d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   CondCode cc = insn->setCond;
1446d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1447d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (insn->src(2).mod.neg())
1448d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      cc = reverseCondCode(cc);
1449d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1450d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch(insn->src(2).getFile()) {
1451d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_GPR:
1452d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      switch (insn->src(1).getFile()) {
1453d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_GPR:
1454d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x5ba00000);
1455d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitGPR (0x14, insn->src(1));
1456d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1457d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_MEMORY_CONST:
1458d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x4ba00000);
1459d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1));
1460d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1461d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_IMMEDIATE:
1462d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x36a00000);
1463d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitIMMD(0x14, 19, insn->src(1));
1464d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1465d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      default:
1466d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         assert(!"bad src1 file");
1467d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1468d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      }
1469d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x27, insn->src(2));
1470d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1471d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_MEMORY_CONST:
1472d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x53a00000);
1473d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x27, insn->src(1));
1474d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(2));
1475d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1476d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
1477d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"bad src2 file");
1478d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1479d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
1480d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1481d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCond4(0x30, cc);
1482d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitFMZ  (0x2f, 1);
1483d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x08, insn->src(0));
1484d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
1485d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
1486d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1487d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
1488d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitFSET()
1489d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
1490d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   const CmpInstruction *insn = this->insn->asCmp();
1491d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1492d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (insn->src(1).getFile()) {
1493d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_GPR:
1494d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x58000000);
1495d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x14, insn->src(1));
1496d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1497d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_MEMORY_CONST:
1498d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x48000000);
1499d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1));
1500d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1501d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_IMMEDIATE:
1502d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x30000000);
1503d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitIMMD(0x14, 19, insn->src(1));
1504d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1505d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
1506d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"bad src1 file");
1507d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1508d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
1509d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1510d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (insn->op != OP_SET) {
1511d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      switch (insn->op) {
1512d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case OP_SET_AND: emitField(0x2d, 2, 0); break;
1513d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case OP_SET_OR : emitField(0x2d, 2, 1); break;
1514d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case OP_SET_XOR: emitField(0x2d, 2, 2); break;
1515d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      default:
1516d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         assert(!"invalid set op");
1517d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1518d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      }
1519d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitPRED(0x27, insn->src(2));
1520d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   } else {
1521d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitPRED(0x27);
1522d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
1523d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1524d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitFMZ  (0x37, 1);
1525d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitABS  (0x36, insn->src(0));
1526d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitNEG  (0x35, insn->src(1));
1527d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x34, 1, insn->dType == TYPE_F32);
1528d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCond4(0x30, insn->setCond);
1529d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCC   (0x2f);
1530d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitABS  (0x2c, insn->src(1));
1531d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitNEG  (0x2b, insn->src(0));
1532d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x08, insn->src(0));
1533d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
1534d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
1535d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1536d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
1537d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitFSETP()
1538d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
1539d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   const CmpInstruction *insn = this->insn->asCmp();
1540d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1541d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (insn->src(1).getFile()) {
1542d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_GPR:
1543d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x5bb00000);
1544d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x14, insn->src(1));
1545d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1546d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_MEMORY_CONST:
1547d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x4bb00000);
1548d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1));
1549d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1550d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_IMMEDIATE:
1551d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x36b00000);
1552d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitIMMD(0x14, 19, insn->src(1));
1553d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1554d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
1555d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"bad src1 file");
1556d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1557d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
1558d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1559d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (insn->op != OP_SET) {
1560d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      switch (insn->op) {
1561d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case OP_SET_AND: emitField(0x2d, 2, 0); break;
1562d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case OP_SET_OR : emitField(0x2d, 2, 1); break;
1563d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case OP_SET_XOR: emitField(0x2d, 2, 2); break;
1564d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      default:
1565d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         assert(!"invalid set op");
1566d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1567d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      }
1568d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitPRED(0x27, insn->src(2));
1569d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   } else {
1570d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitPRED(0x27);
1571d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
1572d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1573d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCond4(0x30, insn->setCond);
1574d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitFMZ  (0x2f, 1);
1575d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitABS  (0x2c, insn->src(1));
1576d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitNEG  (0x2b, insn->src(0));
1577d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x08, insn->src(0));
1578d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitABS  (0x07, insn->src(0));
1579d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitNEG  (0x06, insn->src(1));
1580d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitPRED (0x03, insn->def(0));
1581d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (insn->defExists(1))
1582d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitPRED(0x00, insn->def(1));
1583d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   else
1584d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitPRED(0x00);
1585d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
1586d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1587d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
1588d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitFSWZADD()
1589d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
1590d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitInsn (0x50f80000);
1591d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCC   (0x2f);
1592d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitFMZ  (0x2c, 1);
1593d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitRND  (0x27);
1594d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x26, 1, insn->lanes); /* abused for .ndv */
1595d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x1c, 8, insn->subOp);
1596ca23c8081f1f9f709df7a63b9e6de379c0b8df44Ilia Mirkin   if (insn->predSrc != 1)
1597ca23c8081f1f9f709df7a63b9e6de379c0b8df44Ilia Mirkin      emitGPR  (0x14, insn->src(1));
1598ca23c8081f1f9f709df7a63b9e6de379c0b8df44Ilia Mirkin   else
1599ca23c8081f1f9f709df7a63b9e6de379c0b8df44Ilia Mirkin      emitGPR  (0x14);
1600d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x08, insn->src(0));
1601d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
1602d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
1603d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1604d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/*******************************************************************************
1605d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * integer
1606d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs ******************************************************************************/
1607d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1608d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
1609d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitLOP()
1610d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
1611d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   int lop = 0;
1612d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1613d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (insn->op) {
1614d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_AND: lop = 0; break;
1615d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_OR : lop = 1; break;
1616d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_XOR: lop = 2; break;
1617d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
1618d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"invalid lop");
1619d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1620d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
1621d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
162283a4f28dc27bd3f679d001fb0065940ad1f0f422Samuel Pitoiset   if (insn->src(1).getFile() != FILE_IMMEDIATE) {
1623d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      switch (insn->src(1).getFile()) {
1624d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_GPR:
1625d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x5c400000);
1626d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitGPR (0x14, insn->src(1));
1627d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1628d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_MEMORY_CONST:
1629d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x4c400000);
1630d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1));
1631d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1632d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_IMMEDIATE:
1633d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x38400000);
1634d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitIMMD(0x14, 19, insn->src(1));
1635d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1636d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      default:
1637d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         assert(!"bad src1 file");
1638d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1639d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      }
1640d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitPRED (0x30);
16417b9b0967756c7d552f5ad80eba46379b2115e604Samuel Pitoiset      emitCC   (0x2f);
164273c9ca754487fa5f39122119e1588e13ffcf5f47Ilia Mirkin      emitX    (0x2b);
1643d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x29, 2, lop);
1644d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitINV  (0x28, insn->src(1));
1645d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitINV  (0x27, insn->src(0));
1646d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   } else {
1647d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn (0x04000000);
164873c9ca754487fa5f39122119e1588e13ffcf5f47Ilia Mirkin      emitX    (0x39);
1649d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitINV  (0x38, insn->src(1));
1650d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitINV  (0x37, insn->src(0));
1651d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x35, 2, lop);
16527b9b0967756c7d552f5ad80eba46379b2115e604Samuel Pitoiset      emitCC   (0x34);
1653d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitIMMD (0x14, 32, insn->src(1));
1654d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
1655d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1656d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x08, insn->src(0));
1657d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
1658d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
1659d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1660d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/* special-case of emitLOP(): lop pass_b dst 0 ~src */
1661d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
1662d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitNOT()
1663d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
1664d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (!longIMMD(insn->src(0))) {
1665d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      switch (insn->src(0).getFile()) {
1666d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_GPR:
1667d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x5c400700);
1668d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitGPR (0x14, insn->src(0));
1669d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1670d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_MEMORY_CONST:
1671d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x4c400700);
1672d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(0));
1673d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1674d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_IMMEDIATE:
1675d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x38400700);
1676d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitIMMD(0x14, 19, insn->src(0));
1677d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1678d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      default:
1679d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         assert(!"bad src1 file");
1680d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1681d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      }
1682d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitPRED (0x30);
1683d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   } else {
1684d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn (0x05600000);
1685d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitIMMD (0x14, 32, insn->src(1));
1686d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
1687d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1688d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR(0x08);
1689d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR(0x00, insn->def(0));
1690d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
1691d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1692d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
1693d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitIADD()
1694d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
16959c63224540ef0f727aae24274fa4afdf2e2376acSamuel Pitoiset   if (insn->src(1).getFile() != FILE_IMMEDIATE) {
1696d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      switch (insn->src(1).getFile()) {
1697d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_GPR:
1698d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x5c100000);
1699d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitGPR (0x14, insn->src(1));
1700d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1701d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_MEMORY_CONST:
1702d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x4c100000);
1703d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1));
1704d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1705d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_IMMEDIATE:
1706d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x38100000);
1707d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitIMMD(0x14, 19, insn->src(1));
1708d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1709d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      default:
1710d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         assert(!"bad src1 file");
1711d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1712d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      }
1713d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitSAT(0x32);
1714d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitNEG(0x31, insn->src(0));
1715d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitNEG(0x30, insn->src(1));
1716d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCC (0x2f);
171773c9ca754487fa5f39122119e1588e13ffcf5f47Ilia Mirkin      emitX  (0x2b);
1718d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   } else {
1719d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x1c000000);
17200904a2ba9717e5706f8869dc9244e2c742fadd12Samuel Pitoiset      emitNEG (0x38, insn->src(0));
1721d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitSAT (0x36);
172273c9ca754487fa5f39122119e1588e13ffcf5f47Ilia Mirkin      emitX   (0x35);
1723d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCC  (0x34);
1724d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitIMMD(0x14, 32, insn->src(1));
1725d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
1726d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1727d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (insn->op == OP_SUB)
1728d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      code[1] ^= 0x00010000;
1729d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1730d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR(0x08, insn->src(0));
1731d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR(0x00, insn->def(0));
1732d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
1733d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1734d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
1735d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitIMUL()
1736d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
1737b84c97587b4a838c32fb7ac4eab31a6ba4f69886Samuel Pitoiset   if (insn->src(1).getFile() != FILE_IMMEDIATE) {
1738d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      switch (insn->src(1).getFile()) {
1739d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_GPR:
1740d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x5c380000);
1741d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitGPR (0x14, insn->src(1));
1742d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1743d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_MEMORY_CONST:
1744d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x4c380000);
1745d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1));
1746d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1747d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_IMMEDIATE:
1748d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x38380000);
1749d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitIMMD(0x14, 19, insn->src(1));
1750d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1751d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      default:
1752d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         assert(!"bad src1 file");
1753d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1754d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      }
1755d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCC   (0x2f);
1756d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x29, 1, isSignedType(insn->sType));
1757d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x28, 1, isSignedType(insn->dType));
1758d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x27, 1, insn->subOp == NV50_IR_SUBOP_MUL_HIGH);
1759d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   } else {
1760d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn (0x1f000000);
1761d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x37, 1, isSignedType(insn->sType));
1762d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x36, 1, isSignedType(insn->dType));
1763d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x35, 1, insn->subOp == NV50_IR_SUBOP_MUL_HIGH);
1764d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCC   (0x34);
1765d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitIMMD (0x14, 32, insn->src(1));
1766d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
1767d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1768d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR(0x08, insn->src(0));
1769d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR(0x00, insn->def(0));
1770d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
1771d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1772d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
1773d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitIMAD()
1774d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
1775d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   /*XXX: imad32i exists, but not using it as third src overlaps dst */
1776d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch(insn->src(2).getFile()) {
1777d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_GPR:
1778d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      switch (insn->src(1).getFile()) {
1779d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_GPR:
1780d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x5a000000);
1781d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitGPR (0x14, insn->src(1));
1782d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1783d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_MEMORY_CONST:
1784d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x4a000000);
1785d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1));
1786d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1787d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_IMMEDIATE:
1788d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x34000000);
1789d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitIMMD(0x14, 19, insn->src(1));
1790d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1791d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      default:
1792d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         assert(!"bad src1 file");
1793d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1794d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      }
1795d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x27, insn->src(2));
1796d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1797d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_MEMORY_CONST:
1798d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x52000000);
1799d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x27, insn->src(1));
1800d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(2));
1801d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1802d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
1803d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"bad src2 file");
1804d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1805d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
1806d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1807d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x36, 1, insn->subOp == NV50_IR_SUBOP_MUL_HIGH);
1808d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x35, 1, isSignedType(insn->sType));
1809d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitNEG  (0x34, insn->src(2));
1810d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitNEG2 (0x33, insn->src(0), insn->src(1));
1811d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitSAT  (0x32);
1812d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitX    (0x31);
1813d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x30, 1, isSignedType(insn->dType));
1814d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCC   (0x2f);
1815d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x08, insn->src(0));
1816d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
1817d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
1818d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1819d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
182031545b64b80aa939a693723e07f06fe45160ae62Samuel PitoisetCodeEmitterGM107::emitISCADD()
182131545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset{
182231545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset   switch (insn->src(2).getFile()) {
182331545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset   case FILE_GPR:
182431545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset      emitInsn(0x5c180000);
182531545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset      emitGPR (0x14, insn->src(2));
182631545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset      break;
182731545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset   case FILE_MEMORY_CONST:
182831545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset      emitInsn(0x4c180000);
182931545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset      emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(2));
183031545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset      break;
183131545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset   case FILE_IMMEDIATE:
183231545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset      emitInsn(0x38180000);
183331545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset      emitIMMD(0x14, 19, insn->src(2));
183431545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset      break;
183531545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset   default:
183631545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset      assert(!"bad src1 file");
183731545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset      break;
183831545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset   }
183931545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset   emitNEG (0x31, insn->src(0));
184031545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset   emitNEG (0x30, insn->src(2));
184131545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset   emitCC  (0x2f);
184231545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset   emitIMMD(0x27, 5, insn->src(1));
184331545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset   emitGPR (0x08, insn->src(0));
184431545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset   emitGPR (0x00, insn->def(0));
184531545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset}
184631545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset
184731545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoisetvoid
1848d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitIMNMX()
1849d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
1850d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (insn->src(1).getFile()) {
1851d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_GPR:
1852d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x5c200000);
1853d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x14, insn->src(1));
1854d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1855d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_MEMORY_CONST:
1856d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x4c200000);
1857d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1));
1858d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1859d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_IMMEDIATE:
1860d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x38200000);
1861d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitIMMD(0x14, 19, insn->src(1));
1862d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1863d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
1864d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"bad src1 file");
1865d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1866d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
1867d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1868d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x30, 1, isSignedType(insn->dType));
1869d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCC   (0x2f);
1870d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x2a, 1, insn->op == OP_MAX);
1871d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitPRED (0x27);
1872d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x08, insn->src(0));
1873d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
1874d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
1875d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1876d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
1877d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitICMP()
1878d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
1879d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   const CmpInstruction *insn = this->insn->asCmp();
1880d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   CondCode cc = insn->setCond;
1881d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1882d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (insn->src(2).mod.neg())
1883d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      cc = reverseCondCode(cc);
1884d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1885d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch(insn->src(2).getFile()) {
1886d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_GPR:
1887d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      switch (insn->src(1).getFile()) {
1888d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_GPR:
1889d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x5b400000);
1890d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitGPR (0x14, insn->src(1));
1891d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1892d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_MEMORY_CONST:
1893d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x4b400000);
1894d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1));
1895d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1896d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_IMMEDIATE:
1897d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x36400000);
1898d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitIMMD(0x14, 19, insn->src(1));
1899d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1900d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      default:
1901d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         assert(!"bad src1 file");
1902d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1903d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      }
1904d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x27, insn->src(2));
1905d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1906d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_MEMORY_CONST:
1907d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x53400000);
1908d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x27, insn->src(1));
1909d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(2));
1910d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1911d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
1912d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"bad src2 file");
1913d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1914d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
1915d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1916d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCond3(0x31, cc);
1917d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x30, 1, isSignedType(insn->sType));
1918d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x08, insn->src(0));
1919d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
1920d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
1921d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1922d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
1923d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitISET()
1924d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
1925d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   const CmpInstruction *insn = this->insn->asCmp();
1926d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1927d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (insn->src(1).getFile()) {
1928d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_GPR:
1929d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x5b500000);
1930d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x14, insn->src(1));
1931d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1932d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_MEMORY_CONST:
1933d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x4b500000);
1934d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1));
1935d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1936d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_IMMEDIATE:
1937d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x36500000);
1938d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitIMMD(0x14, 19, insn->src(1));
1939d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1940d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
1941d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"bad src1 file");
1942d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1943d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
1944d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1945d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (insn->op != OP_SET) {
1946d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      switch (insn->op) {
1947d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case OP_SET_AND: emitField(0x2d, 2, 0); break;
1948d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case OP_SET_OR : emitField(0x2d, 2, 1); break;
1949d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case OP_SET_XOR: emitField(0x2d, 2, 2); break;
1950d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      default:
1951d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         assert(!"invalid set op");
1952d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1953d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      }
1954d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitPRED(0x27, insn->src(2));
1955d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   } else {
1956d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitPRED(0x27);
1957d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
1958d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1959d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCond3(0x31, insn->setCond);
1960d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x30, 1, isSignedType(insn->sType));
1961d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCC   (0x2f);
1962e5ad19a46e87ed22943d7f6ad046f974fd5977e1Ilia Mirkin   emitField(0x2c, 1, insn->dType == TYPE_F32);
1963d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitX    (0x2b);
1964d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x08, insn->src(0));
1965d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
1966d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
1967d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1968d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
1969d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitISETP()
1970d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
1971d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   const CmpInstruction *insn = this->insn->asCmp();
1972d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1973d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (insn->src(1).getFile()) {
1974d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_GPR:
1975d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x5b600000);
1976d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x14, insn->src(1));
1977d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1978d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_MEMORY_CONST:
1979d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x4b600000);
1980d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1));
1981d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1982d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_IMMEDIATE:
1983d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x36600000);
1984d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitIMMD(0x14, 19, insn->src(1));
1985d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1986d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
1987d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"bad src1 file");
1988d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
1989d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
1990d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
1991d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (insn->op != OP_SET) {
1992d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      switch (insn->op) {
1993d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case OP_SET_AND: emitField(0x2d, 2, 0); break;
1994d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case OP_SET_OR : emitField(0x2d, 2, 1); break;
1995d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case OP_SET_XOR: emitField(0x2d, 2, 2); break;
1996d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      default:
1997d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         assert(!"invalid set op");
1998d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
1999d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      }
2000d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitPRED(0x27, insn->src(2));
2001d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   } else {
2002d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitPRED(0x27);
2003d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
2004d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2005d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCond3(0x31, insn->setCond);
2006d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x30, 1, isSignedType(insn->sType));
2007d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitX    (0x2b);
2008d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x08, insn->src(0));
2009d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitPRED (0x03, insn->def(0));
2010d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (insn->defExists(1))
2011d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitPRED(0x00, insn->def(1));
2012d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   else
2013d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitPRED(0x00);
2014d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
2015d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2016d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
2017d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitSHL()
2018d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
2019d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (insn->src(1).getFile()) {
2020d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_GPR:
2021d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x5c480000);
2022d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x14, insn->src(1));
2023d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
2024d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_MEMORY_CONST:
2025d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x4c480000);
2026d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1));
2027d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
2028d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_IMMEDIATE:
2029d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x38480000);
2030d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitIMMD(0x14, 19, insn->src(1));
2031d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
2032d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
2033d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"bad src1 file");
2034d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
2035d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
2036d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2037d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCC   (0x2f);
2038d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitX    (0x2b);
2039d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x27, 1, insn->subOp == NV50_IR_SUBOP_SHIFT_WRAP);
2040d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x08, insn->src(0));
2041d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
2042d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
2043d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2044d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
2045d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitSHR()
2046d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
2047d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (insn->src(1).getFile()) {
2048d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_GPR:
2049d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x5c280000);
2050d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x14, insn->src(1));
2051d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
2052d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_MEMORY_CONST:
2053d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x4c280000);
2054d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1));
2055d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
2056d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_IMMEDIATE:
2057d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x38280000);
2058d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitIMMD(0x14, 19, insn->src(1));
2059d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
2060d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
2061d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"bad src1 file");
2062d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
2063d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
2064d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2065d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x30, 1, isSignedType(insn->dType));
2066d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCC   (0x2f);
2067d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitX    (0x2c);
2068d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x27, 1, insn->subOp == NV50_IR_SUBOP_SHIFT_WRAP);
2069d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x08, insn->src(0));
2070d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
2071d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
2072d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2073d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
2074d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitPOPC()
2075d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
2076d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (insn->src(0).getFile()) {
2077d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_GPR:
2078d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x5c080000);
2079d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x14, insn->src(0));
2080d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
2081d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_MEMORY_CONST:
2082d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x4c080000);
2083d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(0));
2084d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
2085d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_IMMEDIATE:
2086d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x38080000);
2087d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitIMMD(0x14, 19, insn->src(0));
2088d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
2089d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
2090d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"bad src1 file");
2091d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
2092d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
2093d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2094d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitINV(0x28, insn->src(0));
2095d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR(0x00, insn->def(0));
2096d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
2097d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2098d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
2099d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitBFI()
2100d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
2101d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch(insn->src(2).getFile()) {
2102d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_GPR:
2103d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      switch (insn->src(1).getFile()) {
2104d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_GPR:
2105d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x5bf00000);
2106d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitGPR (0x14, insn->src(1));
2107d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
2108d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_MEMORY_CONST:
2109d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x4bf00000);
2110d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1));
2111d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
2112d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_IMMEDIATE:
2113d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitInsn(0x36f00000);
2114d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitIMMD(0x14, 19, insn->src(1));
2115d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
2116d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      default:
2117d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         assert(!"bad src1 file");
2118d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
2119d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      }
2120d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x27, insn->src(2));
2121d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
2122d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_MEMORY_CONST:
2123d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x53f00000);
2124d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x27, insn->src(1));
2125d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(2));
2126d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
2127d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
2128d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"bad src2 file");
2129d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
2130d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
2131d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2132d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCC   (0x2f);
2133d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x08, insn->src(0));
2134d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
2135d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
2136d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2137d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
2138d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitBFE()
2139d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
2140d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (insn->src(1).getFile()) {
2141d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_GPR:
2142d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x5c000000);
2143d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x14, insn->src(1));
2144d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
2145d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_MEMORY_CONST:
2146d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x4c000000);
2147d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1));
2148d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
2149d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_IMMEDIATE:
2150d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x38000000);
2151d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitIMMD(0x14, 19, insn->src(1));
2152d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
2153d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
2154d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"bad src1 file");
2155d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
2156d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
2157d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2158d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x30, 1, isSignedType(insn->dType));
2159d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCC   (0x2f);
2160d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x28, 1, insn->subOp == NV50_IR_SUBOP_EXTBF_REV);
2161d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x08, insn->src(0));
2162d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
2163d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
2164d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2165d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
2166d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitFLO()
2167d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
2168d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (insn->src(0).getFile()) {
2169d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_GPR:
2170d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x5c300000);
2171d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x14, insn->src(0));
2172d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
2173d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_MEMORY_CONST:
2174d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x4c300000);
2175d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(0));
2176d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
2177d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_IMMEDIATE:
2178d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0x38300000);
2179d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitIMMD(0x14, 19, insn->src(0));
2180d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
2181d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
2182d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"bad src1 file");
2183d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
2184d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
2185d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2186d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x30, 1, isSignedType(insn->dType));
2187d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCC   (0x2f);
2188d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x29, 1, insn->subOp == NV50_IR_SUBOP_BFIND_SAMT);
2189d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitINV  (0x28, insn->src(0));
2190d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
2191d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
2192d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2193d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/*******************************************************************************
2194d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * memory
2195d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs ******************************************************************************/
2196d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2197d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
2198d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitLDSTs(int pos, DataType type)
2199d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
2200d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   int data = 0;
2201d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2202d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (typeSizeof(type)) {
2203d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case  1: data = isSignedType(type) ? 1 : 0; break;
2204d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case  2: data = isSignedType(type) ? 3 : 2; break;
2205d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case  4: data = 4; break;
2206d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case  8: data = 5; break;
2207d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case 16: data = 6; break;
2208d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
2209d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"bad type");
2210d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
2211d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
2212d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2213d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(pos, 3, data);
2214d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
2215d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2216d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
2217d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitLDSTc(int pos)
2218d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
2219d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   int mode = 0;
2220d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2221d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (insn->cache) {
2222d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case CACHE_CA: mode = 0; break;
2223d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case CACHE_CG: mode = 1; break;
2224d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case CACHE_CS: mode = 2; break;
2225d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case CACHE_CV: mode = 3; break;
2226d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
2227d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"invalid caching mode");
2228d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
2229d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
2230d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2231d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(pos, 2, mode);
2232d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
2233d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2234d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
2235d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitLDC()
2236d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
2237d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitInsn (0xef900000);
2238d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitLDSTs(0x30, insn->dType);
22394eef537960dff2fbdafe7946143c1a99d7ba7036Ilia Mirkin   emitField(0x2c, 2, insn->subOp);
2240d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCBUF (0x24, 0x08, 0x14, 16, 0, insn->src(0));
2241d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
2242d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
2243d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2244d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
2245d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitLDL()
2246d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
2247d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitInsn (0xef400000);
2248d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitLDSTs(0x30, insn->dType);
2249d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitLDSTc(0x2c);
2250d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitADDR (0x08, 0x14, 24, 0, insn->src(0));
2251d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
2252d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
2253d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2254d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
2255d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitLDS()
2256d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
2257d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitInsn (0xef480000);
2258d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitLDSTs(0x30, insn->dType);
2259d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitADDR (0x08, 0x14, 24, 0, insn->src(0));
2260d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
2261d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
2262d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2263d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
2264d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitLD()
2265d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
2266d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitInsn (0x80000000);
2267d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitPRED (0x3a);
2268d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitLDSTc(0x38);
2269d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitLDSTs(0x35, insn->dType);
227057b00258146632ba5ef4b84513ec4faa8a5907c1Ilia Mirkin   emitField(0x34, 1, insn->src(0).getIndirect(0)->getSize() == 8);
2271d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitADDR (0x08, 0x14, 32, 0, insn->src(0));
2272d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
2273d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
2274d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2275d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
2276d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitSTL()
2277d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
2278d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitInsn (0xef500000);
2279d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitLDSTs(0x30, insn->dType);
2280d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitLDSTc(0x2c);
2281d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitADDR (0x08, 0x14, 24, 0, insn->src(0));
2282d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->src(1));
2283d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
2284d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2285d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
2286d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitSTS()
2287d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
2288d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitInsn (0xef580000);
2289d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitLDSTs(0x30, insn->dType);
2290d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitADDR (0x08, 0x14, 24, 0, insn->src(0));
2291d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->src(1));
2292d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
2293d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2294d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
2295d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitST()
2296d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
2297d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitInsn (0xa0000000);
2298d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitPRED (0x3a);
2299d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitLDSTc(0x38);
2300d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitLDSTs(0x35, insn->dType);
230157b00258146632ba5ef4b84513ec4faa8a5907c1Ilia Mirkin   emitField(0x34, 1, insn->src(0).getIndirect(0)->getSize() == 8);
2302d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitADDR (0x08, 0x14, 32, 0, insn->src(0));
2303d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->src(1));
2304d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
2305d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2306d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
2307d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitALD()
2308d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
2309d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitInsn (0xefd80000);
2310d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x2f, 2, (insn->getDef(0)->reg.size / 4) - 1);
2311d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x27, insn->src(0).getIndirect(1));
2312d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitO    (0x20);
2313d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitP    (0x1f);
2314d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitADDR (0x08, 20, 10, 0, insn->src(0));
2315d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
2316d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
2317d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2318d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
2319d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitAST()
2320d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
2321d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitInsn (0xeff00000);
2322d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x2f, 2, (typeSizeof(insn->dType) / 4) - 1);
2323d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x27, insn->src(0).getIndirect(1));
2324d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitP    (0x1f);
2325d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitADDR (0x08, 20, 10, 0, insn->src(0));
2326d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->src(1));
2327d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
2328d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2329d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
2330d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitISBERD()
2331d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
2332d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitInsn(0xefd00000);
2333d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR (0x08, insn->src(0));
2334d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR (0x00, insn->def(0));
2335d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
2336d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2337d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
23389d60793a03e40e1d139b78fce0144cad57438741Ilia MirkinCodeEmitterGM107::emitAL2P()
23399d60793a03e40e1d139b78fce0144cad57438741Ilia Mirkin{
23409d60793a03e40e1d139b78fce0144cad57438741Ilia Mirkin   emitInsn (0xefa00000);
23419d60793a03e40e1d139b78fce0144cad57438741Ilia Mirkin   emitField(0x2f, 2, (insn->getDef(0)->reg.size / 4) - 1);
2342a22aee5ad1154918aff77af5102fecd2aa39a631Ilia Mirkin   emitPRED (0x2c);
23439d60793a03e40e1d139b78fce0144cad57438741Ilia Mirkin   emitO    (0x20);
23449d60793a03e40e1d139b78fce0144cad57438741Ilia Mirkin   emitField(0x14, 11, insn->src(0).get()->reg.data.offset);
23459d60793a03e40e1d139b78fce0144cad57438741Ilia Mirkin   emitGPR  (0x08, insn->src(0).getIndirect(0));
23469d60793a03e40e1d139b78fce0144cad57438741Ilia Mirkin   emitGPR  (0x00, insn->def(0));
23479d60793a03e40e1d139b78fce0144cad57438741Ilia Mirkin}
23489d60793a03e40e1d139b78fce0144cad57438741Ilia Mirkin
2349b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkinstatic void
2350f5fe9030021af830e6c4453f4ad1521cbb697c81Ilia MirkininterpApply(const FixupEntry *entry, uint32_t *code, const FixupData& data)
2351b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin{
2352b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin   int ipa = entry->ipa;
2353b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin   int reg = entry->reg;
2354b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin   int loc = entry->loc;
2355b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin
2356f5fe9030021af830e6c4453f4ad1521cbb697c81Ilia Mirkin   if (data.flatshade &&
2357b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin       (ipa & NV50_IR_INTERP_MODE_MASK) == NV50_IR_INTERP_SC) {
2358b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin      ipa = NV50_IR_INTERP_FLAT;
2359b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin      reg = 0xff;
2360f5fe9030021af830e6c4453f4ad1521cbb697c81Ilia Mirkin   } else if (data.force_persample_interp &&
2361b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin              (ipa & NV50_IR_INTERP_SAMPLE_MASK) == NV50_IR_INTERP_DEFAULT &&
2362b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin              (ipa & NV50_IR_INTERP_MODE_MASK) != NV50_IR_INTERP_FLAT) {
2363b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin      ipa |= NV50_IR_INTERP_CENTROID;
2364b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin   }
2365b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin   code[loc + 1] &= ~(0xf << 0x14);
2366b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin   code[loc + 1] |= (ipa & 0x3) << 0x16;
2367b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin   code[loc + 1] |= (ipa & 0xc) << (0x14 - 2);
2368b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin   code[loc + 0] &= ~(0xff << 0x14);
2369b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin   code[loc + 0] |= reg << 0x14;
2370b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin}
2371b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin
23729d60793a03e40e1d139b78fce0144cad57438741Ilia Mirkinvoid
2373d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitIPA()
2374d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
2375d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   int ipam = 0, ipas = 0;
2376d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2377d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (insn->getInterpMode()) {
2378d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case NV50_IR_INTERP_LINEAR     : ipam = 0; break;
2379d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case NV50_IR_INTERP_PERSPECTIVE: ipam = 1; break;
2380d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case NV50_IR_INTERP_FLAT       : ipam = 2; break;
2381d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case NV50_IR_INTERP_SC         : ipam = 3; break;
2382d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
2383d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"invalid ipa mode");
2384d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
2385d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
2386d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2387d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (insn->getSampleMode()) {
2388d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case NV50_IR_INTERP_DEFAULT : ipas = 0; break;
2389d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case NV50_IR_INTERP_CENTROID: ipas = 1; break;
2390d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case NV50_IR_INTERP_OFFSET  : ipas = 2; break;
2391d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
2392d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"invalid ipa sample mode");
2393d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
2394d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
2395d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2396d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitInsn (0xe0000000);
2397d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x36, 2, ipam);
2398d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x34, 2, ipas);
2399d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitSAT  (0x33);
2400d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x2f, 3, 7);
2401d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitADDR (0x08, 0x1c, 10, 0, insn->src(0));
2402d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if ((code[0] & 0x0000ff00) != 0x0000ff00)
2403d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      code[1] |= 0x00000040; /* .idx */
2404d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR(0x00, insn->def(0));
2405d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2406d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (insn->op == OP_PINTERP) {
2407d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR(0x14, insn->src(1));
2408d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      if (insn->getSampleMode() == NV50_IR_INTERP_OFFSET)
2409d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitGPR(0x27, insn->src(2));
2410b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin      addInterp(insn->ipa, insn->getSrc(1)->reg.data.id, interpApply);
2411d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   } else {
2412d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      if (insn->getSampleMode() == NV50_IR_INTERP_OFFSET)
2413d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitGPR(0x27, insn->src(1));
2414d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR(0x14);
2415b75fff70d82474a571c59c2a3a01e4f9f02286a7Ilia Mirkin      addInterp(insn->ipa, 0xff, interpApply);
2416d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
2417d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2418d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (insn->getSampleMode() != NV50_IR_INTERP_OFFSET)
2419d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR(0x27);
2420d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
2421d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
242271a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkinvoid
242371a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia MirkinCodeEmitterGM107::emitATOM()
242471a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin{
242571a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin   unsigned dType, subOp;
242671a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin
2427f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset   if (insn->subOp == NV50_IR_SUBOP_ATOM_CAS) {
2428f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset      switch (insn->dType) {
2429f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset      case TYPE_U32: dType = 0; break;
2430f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset      case TYPE_U64: dType = 1; break;
2431f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset      default: assert(!"unexpected dType"); dType = 0; break;
2432f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset      }
2433f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset      subOp = 15;
2434f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset
2435f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset      emitInsn (0xee000000);
2436f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset   } else {
2437f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset      switch (insn->dType) {
2438f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset      case TYPE_U32: dType = 0; break;
2439f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset      case TYPE_S32: dType = 1; break;
2440f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset      case TYPE_U64: dType = 2; break;
2441f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset      case TYPE_F32: dType = 3; break;
2442f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset      case TYPE_B128: dType = 4; break;
2443f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset      case TYPE_S64: dType = 5; break;
2444f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset      default: assert(!"unexpected dType"); dType = 0; break;
2445f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset      }
2446f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset      if (insn->subOp == NV50_IR_SUBOP_ATOM_EXCH)
2447f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset         subOp = 8;
2448f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset      else
2449f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset         subOp = insn->subOp;
2450f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset
2451f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset      emitInsn (0xed000000);
2452f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset   }
2453f63851289077714509e30b70cd922848cbe06499Samuel Pitoiset
245471a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin   emitField(0x34, 4, subOp);
245571a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin   emitField(0x31, 3, dType);
245671a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin   emitField(0x30, 1, insn->src(0).getIndirect(0)->getSize() == 8);
245771a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin   emitGPR  (0x14, insn->src(1));
245871a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin   emitADDR (0x08, 0x1c, 20, 0, insn->src(0));
245971a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin   emitGPR  (0x00, insn->def(0));
246071a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin}
246171a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin
246271a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkinvoid
24638f99c1bbce629b9d3db0321e2d74414772615637Samuel PitoisetCodeEmitterGM107::emitATOMS()
24648f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset{
24658f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset   unsigned dType, subOp;
24668f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset
24678f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset   if (insn->subOp == NV50_IR_SUBOP_ATOM_CAS) {
24688f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset      switch (insn->dType) {
24698f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset      case TYPE_U32: dType = 0; break;
24708f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset      case TYPE_U64: dType = 1; break;
24718f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset      default: assert(!"unexpected dType"); dType = 0; break;
24728f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset      }
24738f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset      subOp = 4;
24748f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset
24758f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset      emitInsn (0xee000000);
24768f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset      emitField(0x34, 1, dType);
24778f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset   } else {
24788f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset      switch (insn->dType) {
24798f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset      case TYPE_U32: dType = 0; break;
24808f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset      case TYPE_S32: dType = 1; break;
24818f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset      case TYPE_U64: dType = 2; break;
24828f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset      case TYPE_S64: dType = 3; break;
24838f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset      default: assert(!"unexpected dType"); dType = 0; break;
24848f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset      }
24858f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset
24868f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset      if (insn->subOp == NV50_IR_SUBOP_ATOM_EXCH)
24878f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset         subOp = 8;
24888f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset      else
24898f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset         subOp = insn->subOp;
24908f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset
24918f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset      emitInsn (0xec000000);
24928f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset      emitField(0x1c, 3, dType);
24938f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset   }
24948f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset
24958f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset   emitField(0x34, 4, subOp);
24968f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset   emitGPR  (0x14, insn->src(1));
2497138be7ed9f3293189d4ff868a80be052b389908cIlia Mirkin   emitADDR (0x08, 0x1e, 22, 2, insn->src(0));
24988f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset   emitGPR  (0x00, insn->def(0));
24998f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset}
25008f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset
25018f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoisetvoid
2502a29536459694017bf4e7424764574808553a6d7fSamuel PitoisetCodeEmitterGM107::emitRED()
2503a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset{
2504a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset   unsigned dType;
2505a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset
2506a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset   switch (insn->dType) {
2507a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset   case TYPE_U32: dType = 0; break;
2508a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset   case TYPE_S32: dType = 1; break;
2509a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset   case TYPE_U64: dType = 2; break;
2510a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset   case TYPE_F32: dType = 3; break;
2511a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset   case TYPE_B128: dType = 4; break;
2512a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset   case TYPE_S64: dType = 5; break;
2513a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset   default: assert(!"unexpected dType"); dType = 0; break;
2514a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset   }
2515a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset
2516a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset   emitInsn (0xebf80000);
2517a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset   emitField(0x30, 1, insn->src(0).getIndirect(0)->getSize() == 8);
2518a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset   emitField(0x17, 3, insn->subOp);
2519a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset   emitField(0x14, 3, dType);
2520a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset   emitADDR (0x08, 0x1c, 20, 0, insn->src(0));
2521a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset   emitGPR  (0x00, insn->src(1));
2522a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset}
2523a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset
2524a29536459694017bf4e7424764574808553a6d7fSamuel Pitoisetvoid
252571a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia MirkinCodeEmitterGM107::emitCCTL()
252671a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin{
252771a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin   unsigned width;
252871a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin   if (insn->src(0).getFile() == FILE_MEMORY_GLOBAL) {
252971a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin      emitInsn(0xef600000);
253071a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin      width = 30;
253171a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin   } else {
253271a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin      emitInsn(0xef800000);
253371a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin      width = 22;
253471a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin   }
253571a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin   emitField(0x34, 1, insn->src(0).getIndirect(0)->getSize() == 8);
253671a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin   emitADDR (0x08, 0x16, width, 2, insn->src(0));
253771a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin   emitField(0x00, 4, insn->subOp);
253871a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin}
253971a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin
2540d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/*******************************************************************************
2541d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * surface
2542d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs ******************************************************************************/
2543d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2544d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
2545d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitPIXLD()
2546d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
2547d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitInsn (0xefe80000);
2548d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitPRED (0x2d);
2549d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x1f, 3, insn->subOp);
2550d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x08, insn->src(0));
2551d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
2552d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
2553d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2554d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/*******************************************************************************
2555d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * texture
2556d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs ******************************************************************************/
2557d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2558d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
2559d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitTEXs(int pos)
2560d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
2561d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   int src1 = insn->predSrc == 1 ? 2 : 1;
2562d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (insn->srcExists(src1))
2563d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR(pos, insn->src(src1));
2564d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   else
2565d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR(pos);
2566d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
2567d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2568d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
2569d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitTEX()
2570d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
2571d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   const TexInstruction *insn = this->insn->asTex();
2572d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   int lodm = 0;
2573d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2574d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (!insn->tex.levelZero) {
2575d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      switch (insn->op) {
2576d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case OP_TEX: lodm = 0; break;
2577d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case OP_TXB: lodm = 2; break;
2578d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case OP_TXL: lodm = 3; break;
2579d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      default:
2580d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         assert(!"invalid tex op");
2581d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
2582d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      }
2583d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   } else {
2584d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      lodm = 1;
2585d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
2586d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2587d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (insn->tex.rIndirectSrc >= 0) {
2588d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn (0xdeb80000);
25898c78fdb328c8a8ea7c7c3cdd0e745f06938cd0ffIlia Mirkin      emitField(0x25, 2, lodm);
2590d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x24, 1, insn->tex.useOffsets == 1);
2591d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   } else {
2592d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn (0xc0380000);
2593d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x37, 2, lodm);
2594d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x36, 1, insn->tex.useOffsets == 1);
2595d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x24, 13, insn->tex.r);
2596d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
2597d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2598d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x32, 1, insn->tex.target.isShadow());
2599d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x31, 1, insn->tex.liveOnly);
2600d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x23, 1, insn->tex.derivAll);
2601d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x1f, 4, insn->tex.mask);
2602d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x1d, 2, insn->tex.target.isCube() ? 3 :
2603d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs                      insn->tex.target.getDim() - 1);
2604d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x1c, 1, insn->tex.target.isArray());
2605d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitTEXs (0x14);
2606d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x08, insn->src(0));
2607d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
2608d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
2609d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2610d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
2611d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitTLD()
2612d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
2613d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   const TexInstruction *insn = this->insn->asTex();
2614d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2615d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (insn->tex.rIndirectSrc >= 0) {
2616d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn (0xdd380000);
2617d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   } else {
2618d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn (0xdc380000);
2619d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x24, 13, insn->tex.r);
2620d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
2621d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2622d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x37, 1, insn->tex.levelZero == 0);
2623d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x32, 1, insn->tex.target.isMS());
2624d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x31, 1, insn->tex.liveOnly);
2625d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x23, 1, insn->tex.useOffsets == 1);
2626d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x1f, 4, insn->tex.mask);
2627d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x1d, 2, insn->tex.target.isCube() ? 3 :
2628d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs                      insn->tex.target.getDim() - 1);
2629d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x1c, 1, insn->tex.target.isArray());
2630d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitTEXs (0x14);
2631d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x08, insn->src(0));
2632d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
2633d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
2634d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2635d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
2636d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitTLD4()
2637d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
2638d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   const TexInstruction *insn = this->insn->asTex();
2639d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2640d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (insn->tex.rIndirectSrc >= 0) {
2641d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn (0xdef80000);
2642d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x26, 2, insn->tex.gatherComp);
2643d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x25, 2, insn->tex.useOffsets == 4);
2644d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x24, 2, insn->tex.useOffsets == 1);
2645d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   } else {
2646d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn (0xc8380000);
2647d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x38, 2, insn->tex.gatherComp);
2648d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x37, 2, insn->tex.useOffsets == 4);
2649d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x36, 2, insn->tex.useOffsets == 1);
2650d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x24, 13, insn->tex.r);
2651d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
2652d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2653d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x32, 1, insn->tex.target.isShadow());
2654d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x31, 1, insn->tex.liveOnly);
2655d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x23, 1, insn->tex.derivAll);
2656d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x1f, 4, insn->tex.mask);
2657d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x1d, 2, insn->tex.target.isCube() ? 3 :
2658d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs                      insn->tex.target.getDim() - 1);
2659d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x1c, 1, insn->tex.target.isArray());
2660d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitTEXs (0x14);
2661d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x08, insn->src(0));
2662d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
2663d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
2664d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2665d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
2666d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitTXD()
2667d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
2668d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   const TexInstruction *insn = this->insn->asTex();
2669d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2670d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (insn->tex.rIndirectSrc >= 0) {
2671d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn (0xde780000);
2672d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   } else {
2673d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn (0xde380000);
2674d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x24, 13, insn->tex.r);
2675d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
2676d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2677d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x31, 1, insn->tex.liveOnly);
2678d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x23, 1, insn->tex.useOffsets == 1);
2679d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x1f, 4, insn->tex.mask);
2680d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x1d, 2, insn->tex.target.isCube() ? 3 :
2681d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs                      insn->tex.target.getDim() - 1);
2682d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x1c, 1, insn->tex.target.isArray());
2683d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitTEXs (0x14);
2684d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x08, insn->src(0));
2685d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
2686d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
2687d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2688d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
2689d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitTMML()
2690d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
2691d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   const TexInstruction *insn = this->insn->asTex();
2692d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2693d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (insn->tex.rIndirectSrc >= 0) {
2694d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn (0xdf600000);
2695d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   } else {
2696d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn (0xdf580000);
2697d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(0x24, 13, insn->tex.r);
2698d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
2699d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2700d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x31, 1, insn->tex.liveOnly);
2701d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x23, 1, insn->tex.derivAll);
2702d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x1f, 4, insn->tex.mask);
2703d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x1d, 2, insn->tex.target.isCube() ? 3 :
2704d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs                      insn->tex.target.getDim() - 1);
2705d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x1c, 1, insn->tex.target.isArray());
2706d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitTEXs (0x14);
2707d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x08, insn->src(0));
2708d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
2709d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
2710d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2711d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
2712d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitTXQ()
2713d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
2714d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   const TexInstruction *insn = this->insn->asTex();
2715d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   int type = 0;
2716d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2717d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (insn->tex.query) {
2718d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case TXQ_DIMS           : type = 0x01; break;
2719d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case TXQ_TYPE           : type = 0x02; break;
2720d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case TXQ_SAMPLE_POSITION: type = 0x05; break;
2721d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case TXQ_FILTER         : type = 0x10; break;
2722d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case TXQ_LOD            : type = 0x12; break;
2723d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case TXQ_WRAP           : type = 0x14; break;
2724d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case TXQ_BORDER_COLOUR  : type = 0x16; break;
2725d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
2726d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"invalid txq query");
2727d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
2728d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
2729d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
27308c8a71f0d125bb655b17a32914ffecf8d159593bIlia Mirkin   if (insn->tex.rIndirectSrc >= 0) {
27318c8a71f0d125bb655b17a32914ffecf8d159593bIlia Mirkin      emitInsn (0xdf500000);
27328c8a71f0d125bb655b17a32914ffecf8d159593bIlia Mirkin   } else {
27338c8a71f0d125bb655b17a32914ffecf8d159593bIlia Mirkin      emitInsn (0xdf480000);
27348c8a71f0d125bb655b17a32914ffecf8d159593bIlia Mirkin      emitField(0x24, 13, insn->tex.r);
27358c8a71f0d125bb655b17a32914ffecf8d159593bIlia Mirkin   }
27368c8a71f0d125bb655b17a32914ffecf8d159593bIlia Mirkin
27378c8a71f0d125bb655b17a32914ffecf8d159593bIlia Mirkin   emitField(0x31, 1, insn->tex.liveOnly);
2738d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x1f, 4, insn->tex.mask);
2739d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x16, 6, type);
2740d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x08, insn->src(0));
2741d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
2742d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
2743d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2744d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
2745d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitDEPBAR()
2746d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
2747d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitInsn (0xf0f00000);
2748d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x1d, 1, 1); /* le */
2749d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x1a, 3, 5);
2750d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x14, 6, insn->subOp);
2751d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x00, 6, insn->subOp);
2752d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
2753d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2754d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/*******************************************************************************
2755d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * misc
2756d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs ******************************************************************************/
2757d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2758d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
2759d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitNOP()
2760d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
2761d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitInsn(0x50b00000);
2762d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
2763d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2764d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
2765d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitKIL()
2766d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
2767d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitInsn (0xe3300000);
2768d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitCond5(0x00, CC_TR);
2769d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
2770d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2771d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
2772d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitOUT()
2773d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
2774d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   const int cut  = insn->op == OP_RESTART || insn->subOp;
2775d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   const int emit = insn->op == OP_EMIT;
2776d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2777d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (insn->src(1).getFile()) {
2778d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_GPR:
2779d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0xfbe00000);
2780d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitGPR (0x14, insn->src(1));
2781d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
2782d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_IMMEDIATE:
2783d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0xf6e00000);
2784d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitIMMD(0x14, 19, insn->src(1));
2785d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
2786d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case FILE_MEMORY_CONST:
2787d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitInsn(0xebe00000);
2788d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCBUF(0x22, -1, 0x14, 16, 2, insn->src(1));
2789d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
2790d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
2791d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"bad src1 file");
2792d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
2793d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
2794d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2795d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitField(0x27, 2, (cut << 1) | emit);
2796d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x08, insn->src(0));
2797d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emitGPR  (0x00, insn->def(0));
2798d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
2799d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
2800d11266aa06a507d8895bdc1f454a5837131cc1afSamuel Pitoisetvoid
2801c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel PitoisetCodeEmitterGM107::emitBAR()
2802c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset{
2803c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset   uint8_t subop;
2804c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset
2805c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset   emitInsn (0xf0a80000);
2806c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset
2807c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset   switch (insn->subOp) {
2808c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset   case NV50_IR_SUBOP_BAR_RED_POPC: subop = 0x02; break;
2809c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset   case NV50_IR_SUBOP_BAR_RED_AND:  subop = 0x0a; break;
2810c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset   case NV50_IR_SUBOP_BAR_RED_OR:   subop = 0x12; break;
2811c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset   case NV50_IR_SUBOP_BAR_ARRIVE:   subop = 0x81; break;
2812c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset   default:
2813c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset      subop = 0x80;
2814c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset      assert(insn->subOp == NV50_IR_SUBOP_BAR_SYNC);
2815c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset      break;
2816c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset   }
2817c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset
2818c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset   emitField(0x20, 8, subop);
2819c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset
2820c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset   // barrier id
2821c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset   if (insn->src(0).getFile() == FILE_GPR) {
2822c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset      emitGPR(0x08, insn->src(0));
2823c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset   } else {
2824c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset      ImmediateValue *imm = insn->getSrc(0)->asImm();
2825c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset      assert(imm);
2826c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset      emitField(0x08, 8, imm->reg.data.u32);
2827c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset      emitField(0x2b, 1, 1);
2828c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset   }
2829c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset
2830c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset   // thread count
2831c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset   if (insn->src(1).getFile() == FILE_GPR) {
2832c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset      emitGPR(0x14, insn->src(1));
2833c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset   } else {
2834c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset      ImmediateValue *imm = insn->getSrc(0)->asImm();
2835c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset      assert(imm);
2836c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset      emitField(0x14, 12, imm->reg.data.u32);
2837c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset      emitField(0x2c, 1, 1);
2838c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset   }
2839c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset
2840c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset   if (insn->srcExists(2) && (insn->predSrc != 2)) {
2841c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset      emitPRED (0x27, insn->src(2));
2842c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset      emitField(0x2a, 1, insn->src(2).mod == Modifier(NV50_IR_MOD_NOT));
2843c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset   } else {
2844c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset      emitField(0x27, 3, 7);
2845c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset   }
2846c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset}
2847c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset
2848c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoisetvoid
2849d11266aa06a507d8895bdc1f454a5837131cc1afSamuel PitoisetCodeEmitterGM107::emitMEMBAR()
2850d11266aa06a507d8895bdc1f454a5837131cc1afSamuel Pitoiset{
2851d11266aa06a507d8895bdc1f454a5837131cc1afSamuel Pitoiset   emitInsn (0xef980000);
2852d11266aa06a507d8895bdc1f454a5837131cc1afSamuel Pitoiset   emitField(0x08, 2, insn->subOp >> 2);
2853d11266aa06a507d8895bdc1f454a5837131cc1afSamuel Pitoiset}
2854d11266aa06a507d8895bdc1f454a5837131cc1afSamuel Pitoiset
285507ed003faf3199a3e95852e7a34763aeaf76503dSamuel Pitoisetvoid
285607ed003faf3199a3e95852e7a34763aeaf76503dSamuel PitoisetCodeEmitterGM107::emitVOTE()
285707ed003faf3199a3e95852e7a34763aeaf76503dSamuel Pitoiset{
2858704bc0f0e98f3bbdef33cad12646d4e1bf01e8aaIlia Mirkin   assert(insn->src(0).getFile() == FILE_PREDICATE);
285907ed003faf3199a3e95852e7a34763aeaf76503dSamuel Pitoiset
2860704bc0f0e98f3bbdef33cad12646d4e1bf01e8aaIlia Mirkin   int r = -1, p = -1;
2861704bc0f0e98f3bbdef33cad12646d4e1bf01e8aaIlia Mirkin   for (int i = 0; insn->defExists(i); i++) {
2862704bc0f0e98f3bbdef33cad12646d4e1bf01e8aaIlia Mirkin      if (insn->def(i).getFile() == FILE_GPR)
2863704bc0f0e98f3bbdef33cad12646d4e1bf01e8aaIlia Mirkin         r = i;
2864704bc0f0e98f3bbdef33cad12646d4e1bf01e8aaIlia Mirkin      else if (insn->def(i).getFile() == FILE_PREDICATE)
2865704bc0f0e98f3bbdef33cad12646d4e1bf01e8aaIlia Mirkin         p = i;
286607ed003faf3199a3e95852e7a34763aeaf76503dSamuel Pitoiset   }
286707ed003faf3199a3e95852e7a34763aeaf76503dSamuel Pitoiset
286807ed003faf3199a3e95852e7a34763aeaf76503dSamuel Pitoiset   emitInsn (0x50d80000);
2869704bc0f0e98f3bbdef33cad12646d4e1bf01e8aaIlia Mirkin   emitField(0x30, 2, insn->subOp);
2870704bc0f0e98f3bbdef33cad12646d4e1bf01e8aaIlia Mirkin   if (r >= 0)
2871704bc0f0e98f3bbdef33cad12646d4e1bf01e8aaIlia Mirkin      emitGPR  (0x00, insn->def(r));
2872704bc0f0e98f3bbdef33cad12646d4e1bf01e8aaIlia Mirkin   else
2873704bc0f0e98f3bbdef33cad12646d4e1bf01e8aaIlia Mirkin      emitGPR  (0x00);
2874704bc0f0e98f3bbdef33cad12646d4e1bf01e8aaIlia Mirkin   if (p >= 0)
2875704bc0f0e98f3bbdef33cad12646d4e1bf01e8aaIlia Mirkin      emitPRED (0x2d, insn->def(p));
2876704bc0f0e98f3bbdef33cad12646d4e1bf01e8aaIlia Mirkin   else
2877704bc0f0e98f3bbdef33cad12646d4e1bf01e8aaIlia Mirkin      emitPRED (0x2d);
287807ed003faf3199a3e95852e7a34763aeaf76503dSamuel Pitoiset   emitField(0x2a, 1, insn->src(0).mod == Modifier(NV50_IR_MOD_NOT));
287907ed003faf3199a3e95852e7a34763aeaf76503dSamuel Pitoiset   emitPRED (0x27, insn->src(0));
288007ed003faf3199a3e95852e7a34763aeaf76503dSamuel Pitoiset}
288107ed003faf3199a3e95852e7a34763aeaf76503dSamuel Pitoiset
28824aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoisetvoid
28834aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel PitoisetCodeEmitterGM107::emitSUTarget()
28844aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset{
28854aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   const TexInstruction *insn = this->insn->asTex();
28864aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   int target = 0;
28874aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset
28884aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   assert(insn->op >= OP_SULDB && insn->op <= OP_SUREDP);
28894aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset
28904aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   if (insn->tex.target == TEX_TARGET_BUFFER) {
28914aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset      target = 2;
28924aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   } else if (insn->tex.target == TEX_TARGET_1D_ARRAY) {
28934aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset      target = 4;
28944aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   } else if (insn->tex.target == TEX_TARGET_2D ||
28954aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset              insn->tex.target == TEX_TARGET_RECT) {
28964aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset      target = 6;
28974aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   } else if (insn->tex.target == TEX_TARGET_2D_ARRAY ||
28984aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset              insn->tex.target == TEX_TARGET_CUBE ||
28994aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset              insn->tex.target == TEX_TARGET_CUBE_ARRAY) {
29004aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset      target = 8;
29014aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   } else if (insn->tex.target == TEX_TARGET_3D) {
29024aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset      target = 10;
29034aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   } else {
29044aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset      assert(insn->tex.target == TEX_TARGET_1D);
29054aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   }
29064aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   emitField(0x20, 4, target);
29074aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset}
29084aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset
29094aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoisetvoid
29104aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel PitoisetCodeEmitterGM107::emitSUHandle(const int s)
29114aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset{
29124aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   const TexInstruction *insn = this->insn->asTex();
29134aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset
29144aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   assert(insn->op >= OP_SULDB && insn->op <= OP_SUREDP);
29154aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset
29164aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   if (insn->src(s).getFile() == FILE_GPR) {
29174aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset      emitGPR(0x27, insn->src(s));
29184aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   } else {
29194aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset      ImmediateValue *imm = insn->getSrc(s)->asImm();
29204aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset      assert(imm);
29214aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset      emitField(0x33, 1, 1);
29224aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset      emitField(0x24, 13, imm->reg.data.u32);
29234aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   }
29244aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset}
29254aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset
29264aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoisetvoid
29274aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel PitoisetCodeEmitterGM107::emitSUSTx()
29284aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset{
29294aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   const TexInstruction *insn = this->insn->asTex();
29304aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset
29314aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   emitInsn(0xeb200000);
29324aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   if (insn->op == OP_SUSTB)
29334aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset      emitField(0x34, 1, 1);
29344aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   emitSUTarget();
29354aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset
29364aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   emitLDSTc(0x18);
29374aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   emitField(0x14, 4, 0xf); // rgba
29384aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   emitGPR  (0x08, insn->src(0));
29394aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   emitGPR  (0x00, insn->src(1));
29404aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset
29414aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   emitSUHandle(2);
29424aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset}
29434aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset
29444aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoisetvoid
29454aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel PitoisetCodeEmitterGM107::emitSULDx()
29464aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset{
29474aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   const TexInstruction *insn = this->insn->asTex();
29484aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   int type = 0;
29494aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset
29504aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   emitInsn(0xeb000000);
29514aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   if (insn->op == OP_SULDB)
29524aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset      emitField(0x34, 1, 1);
29534aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   emitSUTarget();
29544aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset
29554aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   switch (insn->dType) {
29564aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   case TYPE_S8:   type = 1; break;
29574aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   case TYPE_U16:  type = 2; break;
29584aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   case TYPE_S16:  type = 3; break;
29594aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   case TYPE_U32:  type = 4; break;
29604aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   case TYPE_U64:  type = 5; break;
29614aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   case TYPE_B128: type = 6; break;
29624aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   default:
29634aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset      assert(insn->dType == TYPE_U8);
29644aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset      break;
29654aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   }
29664aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   emitLDSTc(0x18);
29674aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   emitField(0x14, 3, type);
29684aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   emitGPR  (0x00, insn->def(0));
29694aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   emitGPR  (0x08, insn->src(0));
29704aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset
29714aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   emitSUHandle(1);
29724aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset}
29731edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset
29741edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoisetvoid
29751edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel PitoisetCodeEmitterGM107::emitSUREDx()
29761edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset{
29771edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset   const TexInstruction *insn = this->insn->asTex();
29781edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset   uint8_t type = 0, subOp;
29791edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset
29801edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset   if (insn->subOp == NV50_IR_SUBOP_ATOM_CAS)
29811edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset      emitInsn(0xeac00000);
29821edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset   else
29831edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset      emitInsn(0xea600000);
29841edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset
29851edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset   if (insn->op == OP_SUREDB)
29861edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset      emitField(0x34, 1, 1);
29871edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset   emitSUTarget();
29881edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset
29891edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset   // destination type
29901edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset   switch (insn->dType) {
29911edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset   case TYPE_S32: type = 1; break;
29921edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset   case TYPE_U64: type = 2; break;
29931edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset   case TYPE_F32: type = 3; break;
29941edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset   case TYPE_S64: type = 5; break;
29951edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset   default:
29961edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset      assert(insn->dType == TYPE_U32);
29971edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset      break;
29981edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset   }
29991edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset
30001edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset   // atomic operation
30011edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset   if (insn->subOp == NV50_IR_SUBOP_ATOM_CAS) {
30021edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset      subOp = 0;
30031edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset   } else if (insn->subOp == NV50_IR_SUBOP_ATOM_EXCH) {
30041edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset      subOp = 8;
30051edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset   } else {
30061edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset      subOp = insn->subOp;
30071edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset   }
30081edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset
30091edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset   emitField(0x24, 3, type);
30101edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset   emitField(0x1d, 4, subOp);
30111edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset   emitGPR  (0x14, insn->src(1));
30121edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset   emitGPR  (0x08, insn->src(0));
30131edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset   emitGPR  (0x00, insn->def(0));
30141edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset
30151edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset   emitSUHandle(2);
30161edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset}
30171edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset
3018d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/*******************************************************************************
3019d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * assembler front-end
3020d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs ******************************************************************************/
3021d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
3022d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsbool
3023d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::emitInstruction(Instruction *i)
3024d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
3025d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   const unsigned int size = (writeIssueDelays && !(codeSize & 0x1f)) ? 16 : 8;
3026d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   bool ret = true;
3027d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
3028d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   insn = i;
3029d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
3030d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (insn->encSize != 8) {
3031d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      ERROR("skipping undecodable instruction: "); insn->print();
3032d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      return false;
3033d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   } else
3034d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (codeSize + size > codeSizeLimit) {
3035d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      ERROR("code emitter output buffer too small\n");
3036d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      return false;
3037d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
3038d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
3039d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (writeIssueDelays) {
3040d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      int n = ((codeSize & 0x1f) / 8) - 1;
3041d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      if (n < 0) {
3042d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         data = code;
3043d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         data[0] = 0x00000000;
3044d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         data[1] = 0x00000000;
3045d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         code += 2;
3046d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         codeSize += 8;
3047d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         n++;
3048d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      }
3049d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
3050d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitField(data, n * 21, 21, insn->sched);
3051d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
3052d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
3053d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   switch (insn->op) {
3054d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_EXIT:
3055d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitEXIT();
3056d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3057d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_BRA:
3058d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitBRA();
3059d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3060d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_CALL:
3061d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCAL();
3062d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3063d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_PRECONT:
3064d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitPCNT();
3065d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3066d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_CONT:
3067d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitCONT();
3068d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3069d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_PREBREAK:
3070d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitPBK();
3071d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3072d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_BREAK:
3073d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitBRK();
3074d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3075d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_PRERET:
3076d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitPRET();
3077d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3078d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_RET:
3079d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitRET();
3080d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3081d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_JOINAT:
3082d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitSSY();
3083d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3084d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_JOIN:
3085d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitSYNC();
3086d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3087d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_QUADON:
3088d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitSAM();
3089d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3090d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_QUADPOP:
3091d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitRAM();
3092d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3093d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_MOV:
30941a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin      emitMOV();
3095d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3096d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_RDSV:
3097d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitS2R();
3098d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3099d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_ABS:
3100d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_NEG:
3101d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_SAT:
3102d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_FLOOR:
3103d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_CEIL:
3104d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_TRUNC:
3105d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_CVT:
31061a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin      if (insn->op == OP_CVT && (insn->def(0).getFile() == FILE_PREDICATE ||
31071a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin                                 insn->src(0).getFile() == FILE_PREDICATE)) {
31081a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin         emitMOV();
31091a0fde1f52c59e0dbada03f387c8e25d9475ebbeIlia Mirkin      } else if (isFloatType(insn->dType)) {
3110d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         if (isFloatType(insn->sType))
3111d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs            emitF2F();
3112d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         else
3113d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs            emitI2F();
3114d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      } else {
3115d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         if (isFloatType(insn->sType))
3116d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs            emitF2I();
3117d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         else
3118d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs            emitI2I();
3119d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      }
3120d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3121d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_SHFL:
3122d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitSHFL();
3123d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3124d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_ADD:
3125d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_SUB:
3126d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      if (isFloatType(insn->dType)) {
3127d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         if (insn->dType == TYPE_F64)
3128d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs            emitDADD();
3129d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         else
3130d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs            emitFADD();
3131d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      } else {
3132d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitIADD();
3133d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      }
3134d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3135d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_MUL:
3136d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      if (isFloatType(insn->dType)) {
3137d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         if (insn->dType == TYPE_F64)
3138d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs            emitDMUL();
3139d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         else
3140d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs            emitFMUL();
3141d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      } else {
3142d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitIMUL();
3143d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      }
3144d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3145d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_MAD:
3146d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_FMA:
3147d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      if (isFloatType(insn->dType)) {
3148d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         if (insn->dType == TYPE_F64)
3149d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs            emitDFMA();
3150d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         else
3151d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs            emitFFMA();
3152d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      } else {
3153d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitIMAD();
3154d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      }
3155d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
315631545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset   case OP_SHLADD:
315731545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset      emitISCADD();
315831545b64b80aa939a693723e07f06fe45160ae62Samuel Pitoiset      break;
3159d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_MIN:
3160d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_MAX:
3161d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      if (isFloatType(insn->dType)) {
3162d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         if (insn->dType == TYPE_F64)
3163d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs            emitDMNMX();
3164d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         else
3165d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs            emitFMNMX();
3166d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      } else {
3167d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitIMNMX();
3168d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      }
3169d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3170d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_SHL:
3171d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitSHL();
3172d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3173d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_SHR:
3174d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitSHR();
3175d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3176d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_POPCNT:
3177d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitPOPC();
3178d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3179d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_INSBF:
3180d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitBFI();
3181d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3182d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_EXTBF:
3183d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitBFE();
3184d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3185d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_BFIND:
3186d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitFLO();
3187d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3188d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_SLCT:
3189d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      if (isFloatType(insn->dType))
3190d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitFCMP();
3191d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      else
3192d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitICMP();
3193d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3194d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_SET:
3195d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_SET_AND:
3196d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_SET_OR:
3197d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_SET_XOR:
3198d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      if (insn->def(0).getFile() != FILE_PREDICATE) {
3199d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         if (isFloatType(insn->sType))
3200d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs            if (insn->sType == TYPE_F64)
3201d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs               emitDSET();
3202d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs            else
3203d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs               emitFSET();
3204d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         else
3205d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs            emitISET();
3206d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      } else {
3207d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         if (isFloatType(insn->sType))
3208d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs            if (insn->sType == TYPE_F64)
3209d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs               emitDSETP();
3210d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs            else
3211d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs               emitFSETP();
3212d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         else
3213d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs            emitISETP();
3214d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      }
3215d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3216d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin   case OP_SELP:
3217d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin      emitSEL();
3218d64134ecaec46f95189e355de65f631b1b7f7007Ilia Mirkin      break;
3219d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_PRESIN:
3220d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_PREEX2:
3221d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitRRO();
3222d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3223d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_COS:
3224d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_SIN:
3225d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_EX2:
3226d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_LG2:
3227d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_RCP:
3228d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_RSQ:
3229d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitMUFU();
3230d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3231d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_AND:
3232d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_OR:
3233d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_XOR:
3234d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitLOP();
3235d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3236d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_NOT:
3237d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitNOT();
3238d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3239d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_LOAD:
3240d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      switch (insn->src(0).getFile()) {
3241d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_MEMORY_CONST : emitLDC(); break;
3242d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_MEMORY_LOCAL : emitLDL(); break;
3243d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_MEMORY_SHARED: emitLDS(); break;
3244d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_MEMORY_GLOBAL: emitLD(); break;
3245d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      default:
3246d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         assert(!"invalid load");
3247d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitNOP();
3248d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
3249d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      }
3250d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3251d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_STORE:
3252d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      switch (insn->src(0).getFile()) {
3253d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_MEMORY_LOCAL : emitSTL(); break;
3254d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_MEMORY_SHARED: emitSTS(); break;
3255d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      case FILE_MEMORY_GLOBAL: emitST(); break;
3256d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      default:
3257725431a5dbce37f011f27521053707dce63731ffSamuel Pitoiset         assert(!"invalid store");
3258d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         emitNOP();
3259d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         break;
3260d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      }
3261d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
326271a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin   case OP_ATOM:
32638f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset      if (insn->src(0).getFile() == FILE_MEMORY_SHARED)
32648f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset         emitATOMS();
32658f99c1bbce629b9d3db0321e2d74414772615637Samuel Pitoiset      else
3266a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset         if (!insn->defExists(0) && insn->subOp < NV50_IR_SUBOP_ATOM_CAS)
3267a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset            emitRED();
3268a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset         else
3269a29536459694017bf4e7424764574808553a6d7fSamuel Pitoiset            emitATOM();
327071a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin      break;
327171a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin   case OP_CCTL:
327271a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin      emitCCTL();
327371a489633b1bdd8492e22fe15bb9a57e30fa4ccdIlia Mirkin      break;
3274d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_VFETCH:
3275d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitALD();
3276d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3277d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_EXPORT:
3278d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitAST();
3279d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3280d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_PFETCH:
3281d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitISBERD();
3282d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
32839d60793a03e40e1d139b78fce0144cad57438741Ilia Mirkin   case OP_AFETCH:
32849d60793a03e40e1d139b78fce0144cad57438741Ilia Mirkin      emitAL2P();
32859d60793a03e40e1d139b78fce0144cad57438741Ilia Mirkin      break;
3286d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_LINTERP:
3287d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_PINTERP:
3288d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitIPA();
3289d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3290d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_PIXLD:
3291d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitPIXLD();
3292d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3293d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_TEX:
3294d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_TXB:
3295d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_TXL:
3296d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitTEX();
3297d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3298d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_TXF:
3299d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitTLD();
3300d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3301d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_TXG:
3302d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitTLD4();
3303d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3304d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_TXD:
3305d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitTXD();
3306d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3307d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_TXQ:
3308d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitTXQ();
3309d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3310d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_TXLQ:
3311d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitTMML();
3312d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3313d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_TEXBAR:
3314d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitDEPBAR();
3315d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3316d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_QUADOP:
3317d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitFSWZADD();
3318d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3319d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_NOP:
3320d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitNOP();
3321d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3322d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_DISCARD:
3323d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitKIL();
3324d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3325d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_EMIT:
3326d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   case OP_RESTART:
3327d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitOUT();
3328d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3329c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset   case OP_BAR:
3330c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset      emitBAR();
3331c82086f7e9e251a7ad60f6aa1f64f011b14720b6Samuel Pitoiset      break;
3332d11266aa06a507d8895bdc1f454a5837131cc1afSamuel Pitoiset   case OP_MEMBAR:
3333d11266aa06a507d8895bdc1f454a5837131cc1afSamuel Pitoiset      emitMEMBAR();
3334d11266aa06a507d8895bdc1f454a5837131cc1afSamuel Pitoiset      break;
333507ed003faf3199a3e95852e7a34763aeaf76503dSamuel Pitoiset   case OP_VOTE:
333607ed003faf3199a3e95852e7a34763aeaf76503dSamuel Pitoiset      emitVOTE();
333707ed003faf3199a3e95852e7a34763aeaf76503dSamuel Pitoiset      break;
33384aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   case OP_SUSTB:
33394aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   case OP_SUSTP:
33404aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset      emitSUSTx();
33414aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset      break;
33424aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   case OP_SULDB:
33434aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset   case OP_SULDP:
33444aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset      emitSULDx();
33454aaacd6dd0a562d5cc428e350cb0e5addf06d39cSamuel Pitoiset      break;
33461edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset   case OP_SUREDB:
33471edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset   case OP_SUREDP:
33481edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset      emitSUREDx();
33491edc44bfd3a0be72bbc77ee82a833692cc404cbdSamuel Pitoiset      break;
3350d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   default:
3351d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      assert(!"invalid opcode");
3352d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      emitNOP();
3353d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      ret = false;
3354d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      break;
3355d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
3356d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
3357d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   if (insn->join) {
3358d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      /*XXX*/
3359d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
3360d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
3361d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   code += 2;
3362d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   codeSize += 8;
3363d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   return ret;
3364d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
3365d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
3366d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsuint32_t
3367d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::getMinEncodingSize(const Instruction *i) const
3368d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
3369d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   return 8;
3370d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
3371d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
3372d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/*******************************************************************************
3373d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * sched data calculator
3374d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs ******************************************************************************/
3375d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
3376d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsclass SchedDataCalculatorGM107 : public Pass
3377d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
3378d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggspublic:
3379f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   SchedDataCalculatorGM107(const TargetGM107 *targ) : targ(targ) {}
3380f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3381d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsprivate:
3382f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   struct RegScores
3383f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   {
3384f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      struct ScoreData {
3385f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         int r[256];
3386f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         int p[8];
3387f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         int c;
3388f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      } rd, wr;
3389f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      int base;
3390f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3391f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      void rebase(const int base)
3392f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      {
3393f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         const int delta = this->base - base;
3394f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         if (!delta)
3395f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            return;
3396f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         this->base = 0;
3397f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3398f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         for (int i = 0; i < 256; ++i) {
3399f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            rd.r[i] += delta;
3400f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            wr.r[i] += delta;
3401f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         }
3402f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         for (int i = 0; i < 8; ++i) {
3403f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            rd.p[i] += delta;
3404f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            wr.p[i] += delta;
3405f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         }
3406f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         rd.c += delta;
3407f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         wr.c += delta;
3408f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      }
3409f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      void wipe()
3410f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      {
3411f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         memset(&rd, 0, sizeof(rd));
3412f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         memset(&wr, 0, sizeof(wr));
3413f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      }
3414f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      int getLatest(const ScoreData& d) const
3415f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      {
3416f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         int max = 0;
3417f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         for (int i = 0; i < 256; ++i)
3418f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            if (d.r[i] > max)
3419f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset               max = d.r[i];
3420f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         for (int i = 0; i < 8; ++i)
3421f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            if (d.p[i] > max)
3422f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset               max = d.p[i];
3423f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         if (d.c > max)
3424f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            max = d.c;
3425f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         return max;
3426f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      }
3427f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      inline int getLatestRd() const
3428f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      {
3429f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         return getLatest(rd);
3430f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      }
3431f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      inline int getLatestWr() const
3432f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      {
3433f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         return getLatest(wr);
3434f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      }
3435f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      inline int getLatest() const
3436f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      {
3437f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         return MAX2(getLatestRd(), getLatestWr());
3438f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      }
3439f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      void setMax(const RegScores *that)
3440f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      {
3441f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         for (int i = 0; i < 256; ++i) {
3442f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            rd.r[i] = MAX2(rd.r[i], that->rd.r[i]);
3443f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            wr.r[i] = MAX2(wr.r[i], that->wr.r[i]);
3444f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         }
3445f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         for (int i = 0; i < 8; ++i) {
3446f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            rd.p[i] = MAX2(rd.p[i], that->rd.p[i]);
3447f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            wr.p[i] = MAX2(wr.p[i], that->wr.p[i]);
3448f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         }
3449f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         rd.c = MAX2(rd.c, that->rd.c);
3450f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         wr.c = MAX2(wr.c, that->wr.c);
3451f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      }
3452f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      void print(int cycle)
3453f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      {
3454f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         for (int i = 0; i < 256; ++i) {
3455f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            if (rd.r[i] > cycle)
3456f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset               INFO("rd $r%i @ %i\n", i, rd.r[i]);
3457f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            if (wr.r[i] > cycle)
3458f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset               INFO("wr $r%i @ %i\n", i, wr.r[i]);
3459f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         }
3460f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         for (int i = 0; i < 8; ++i) {
3461f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            if (rd.p[i] > cycle)
3462f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset               INFO("rd $p%i @ %i\n", i, rd.p[i]);
3463f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            if (wr.p[i] > cycle)
3464f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset               INFO("wr $p%i @ %i\n", i, wr.p[i]);
3465f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         }
3466f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         if (rd.c > cycle)
3467f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            INFO("rd $c @ %i\n", rd.c);
3468f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         if (wr.c > cycle)
3469f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            INFO("wr $c @ %i\n", wr.c);
3470f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      }
3471f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   };
3472f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3473f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   RegScores *score; // for current BB
3474f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   std::vector<RegScores> scoreBoards;
3475f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3476f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   const TargetGM107 *targ;
3477f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   bool visit(Function *);
3478f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   bool visit(BasicBlock *);
3479f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3480f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   void commitInsn(const Instruction *, int);
3481f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   int calcDelay(const Instruction *, int) const;
3482f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   void setDelay(Instruction *, int, const Instruction *);
3483f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   void recordWr(const Value *, int, int);
3484f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   void checkRd(const Value *, int, int&) const;
3485f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3486f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   inline void emitYield(Instruction *);
3487f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   inline void emitStall(Instruction *, uint8_t);
3488f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   inline void emitReuse(Instruction *, uint8_t);
3489f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   inline void emitWrDepBar(Instruction *, uint8_t);
3490f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   inline void emitRdDepBar(Instruction *, uint8_t);
3491f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   inline void emitWtDepBar(Instruction *, uint8_t);
3492f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3493f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   inline int getStall(const Instruction *) const;
3494f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   inline int getWrDepBar(const Instruction *) const;
3495f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   inline int getRdDepBar(const Instruction *) const;
3496f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   inline int getWtDepBar(const Instruction *) const;
3497f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3498f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   void setReuseFlag(Instruction *);
3499f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3500f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   inline void printSchedInfo(int, const Instruction *) const;
3501f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3502f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   struct LiveBarUse {
3503f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      LiveBarUse(Instruction *insn, Instruction *usei)
3504f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         : insn(insn), usei(usei) { }
3505f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      Instruction *insn;
3506f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      Instruction *usei;
3507f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   };
3508f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3509f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   struct LiveBarDef {
3510f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      LiveBarDef(Instruction *insn, Instruction *defi)
3511f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         : insn(insn), defi(defi) { }
3512f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      Instruction *insn;
3513f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      Instruction *defi;
3514f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   };
3515f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3516f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   bool insertBarriers(BasicBlock *);
3517f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3518f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   Instruction *findFirstUse(const Instruction *) const;
3519f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   Instruction *findFirstDef(const Instruction *) const;
3520f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3521f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   bool needRdDepBar(const Instruction *) const;
3522f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   bool needWrDepBar(const Instruction *) const;
3523d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs};
3524d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
3525f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetinline void
3526f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::emitStall(Instruction *insn, uint8_t cnt)
3527f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{
3528f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   assert(cnt < 16);
3529f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   insn->sched |= cnt;
3530f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset}
3531f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3532f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetinline void
3533f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::emitYield(Instruction *insn)
3534f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{
3535f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   insn->sched |= 1 << 4;
3536f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset}
3537f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3538f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetinline void
3539f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::emitWrDepBar(Instruction *insn, uint8_t id)
3540f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{
3541f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   assert(id < 6);
3542f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   if ((insn->sched & 0xe0) == 0xe0)
3543f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      insn->sched ^= 0xe0;
3544f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   insn->sched |= id << 5;
3545f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset}
3546f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3547f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetinline void
3548f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::emitRdDepBar(Instruction *insn, uint8_t id)
3549f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{
3550f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   assert(id < 6);
3551f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   if ((insn->sched & 0x700) == 0x700)
3552f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      insn->sched ^= 0x700;
3553f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   insn->sched |= id << 8;
3554f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset}
3555f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3556f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetinline void
3557f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::emitWtDepBar(Instruction *insn, uint8_t id)
3558f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{
3559f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   assert(id < 6);
3560f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   insn->sched |= 1 << (11 + id);
3561f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset}
3562f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3563f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetinline void
3564f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::emitReuse(Instruction *insn, uint8_t id)
3565f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{
3566f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   assert(id < 4);
3567f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   insn->sched |= 1 << (17 + id);
3568f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset}
3569f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3570f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetinline void
3571f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::printSchedInfo(int cycle,
3572f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset                                         const Instruction *insn) const
3573f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{
3574f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   uint8_t st, yl, wr, rd, wt, ru;
3575f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3576f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   st = (insn->sched & 0x00000f) >> 0;
3577f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   yl = (insn->sched & 0x000010) >> 4;
3578f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   wr = (insn->sched & 0x0000e0) >> 5;
3579f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   rd = (insn->sched & 0x000700) >> 8;
3580f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   wt = (insn->sched & 0x01f800) >> 11;
3581f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   ru = (insn->sched & 0x1e0000) >> 17;
3582f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3583f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   INFO("cycle %i, (st 0x%x, yl 0x%x, wr 0x%x, rd 0x%x, wt 0x%x, ru 0x%x)\n",
3584f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset        cycle, st, yl, wr, rd, wt, ru);
3585f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset}
3586f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3587f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetinline int
3588f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::getStall(const Instruction *insn) const
3589f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{
3590f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   return insn->sched & 0xf;
3591f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset}
3592f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3593f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetinline int
3594f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::getWrDepBar(const Instruction *insn) const
3595f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{
3596f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   return (insn->sched & 0x0000e0) >> 5;
3597f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset}
3598f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3599f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetinline int
3600f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::getRdDepBar(const Instruction *insn) const
3601f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{
3602f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   return (insn->sched & 0x000700) >> 8;
3603f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset}
3604f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3605f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetinline int
3606f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::getWtDepBar(const Instruction *insn) const
3607f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{
3608f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   return (insn->sched & 0x01f800) >> 11;
3609f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset}
3610f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3611f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// Emit the reuse flag which allows to make use of the new memory hierarchy
3612f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// introduced since Maxwell, the operand reuse cache.
3613f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset//
3614f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// It allows to reduce bank conflicts by caching operands. Each time you issue
3615f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// an instruction, that flag can tell the hw which operands are going to be
3616f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// re-used by the next instruction. Note that the next instruction has to use
3617f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// the same GPR id in the same operand slot.
3618f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetvoid
3619f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::setReuseFlag(Instruction *insn)
3620f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{
3621f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   Instruction *next = insn->next;
3622f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   BitSet defs(255, 1);
3623f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3624f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   if (!targ->isReuseSupported(insn))
3625f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      return;
3626f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3627f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   for (int d = 0; insn->defExists(d); ++d) {
3628f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      const Value *def = insn->def(d).rep();
3629f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      if (insn->def(d).getFile() != FILE_GPR)
3630f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         continue;
3631f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      if (typeSizeof(insn->dType) != 4 || def->reg.data.id == 255)
3632f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         continue;
3633f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      defs.set(def->reg.data.id);
3634f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   }
3635f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3636f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   for (int s = 0; insn->srcExists(s); s++) {
3637f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      const Value *src = insn->src(s).rep();
3638f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      if (insn->src(s).getFile() != FILE_GPR)
3639f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         continue;
3640f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      if (typeSizeof(insn->sType) != 4 || src->reg.data.id == 255)
3641f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         continue;
3642f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      if (defs.test(src->reg.data.id))
3643f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         continue;
3644f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      if (!next->srcExists(s) || next->src(s).getFile() != FILE_GPR)
3645f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         continue;
3646f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      if (src->reg.data.id != next->getSrc(s)->reg.data.id)
3647f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         continue;
3648f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      assert(s < 4);
3649f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      emitReuse(insn, s);
3650f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   }
3651f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset}
3652f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3653f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetvoid
3654f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::recordWr(const Value *v, int cycle, int ready)
3655f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{
3656f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   int a = v->reg.data.id, b;
3657f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3658f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   switch (v->reg.file) {
3659f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   case FILE_GPR:
3660f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      b = a + v->reg.size / 4;
3661f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      for (int r = a; r < b; ++r)
3662f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         score->rd.r[r] = ready;
3663f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      break;
3664f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   case FILE_PREDICATE:
3665f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      // To immediately use a predicate set by any instructions, the minimum
3666f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      // number of stall counts is 13.
3667f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      score->rd.p[a] = cycle + 13;
3668f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      break;
3669f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   case FILE_FLAGS:
3670f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      score->rd.c = ready;
3671f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      break;
3672f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   default:
3673f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      break;
3674f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   }
3675f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset}
3676f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3677f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetvoid
3678f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::checkRd(const Value *v, int cycle, int &delay) const
3679f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{
3680f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   int a = v->reg.data.id, b;
3681f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   int ready = cycle;
3682f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3683f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   switch (v->reg.file) {
3684f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   case FILE_GPR:
3685f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      b = a + v->reg.size / 4;
3686f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      for (int r = a; r < b; ++r)
3687f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         ready = MAX2(ready, score->rd.r[r]);
3688f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      break;
3689f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   case FILE_PREDICATE:
3690f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      ready = MAX2(ready, score->rd.p[a]);
3691f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      break;
3692f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   case FILE_FLAGS:
3693f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      ready = MAX2(ready, score->rd.c);
3694f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      break;
3695f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   default:
3696f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      break;
3697f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   }
3698f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   if (cycle < ready)
3699f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      delay = MAX2(delay, ready - cycle);
3700f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset}
3701f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3702f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetvoid
3703f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::commitInsn(const Instruction *insn, int cycle)
3704f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{
3705f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   const int ready = cycle + targ->getLatency(insn);
3706f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3707f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   for (int d = 0; insn->defExists(d); ++d)
3708f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      recordWr(insn->getDef(d), cycle, ready);
3709f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3710f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset#ifdef GM107_DEBUG_SCHED_DATA
3711f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   score->print(cycle);
3712f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset#endif
3713f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset}
3714f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3715f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset#define GM107_MIN_ISSUE_DELAY 0x1
3716f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset#define GM107_MAX_ISSUE_DELAY 0xf
3717f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3718f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetint
3719f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::calcDelay(const Instruction *insn, int cycle) const
3720f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{
3721f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   int delay = 0, ready = cycle;
3722f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3723f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   for (int s = 0; insn->srcExists(s); ++s)
3724f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      checkRd(insn->getSrc(s), cycle, delay);
3725f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3726f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   // TODO: make use of getReadLatency()!
3727f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3728f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   return MAX2(delay, ready - cycle);
3729f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset}
3730f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3731f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetvoid
3732f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::setDelay(Instruction *insn, int delay,
3733f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset                                   const Instruction *next)
3734f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{
3735f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   const OpClass cl = targ->getOpClass(insn->op);
3736f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   int wr, rd;
3737f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3738f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   if (insn->op == OP_EXIT ||
3739f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset       insn->op == OP_BAR ||
3740f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset       insn->op == OP_MEMBAR) {
3741f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      delay = GM107_MAX_ISSUE_DELAY;
3742f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   } else
3743f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   if (insn->op == OP_QUADON ||
3744f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset       insn->op == OP_QUADPOP) {
3745f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      delay = 0xd;
3746f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   } else
3747f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   if (cl == OPCLASS_FLOW || insn->join) {
3748f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      delay = 0xd;
3749f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   }
3750f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3751f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   if (!next || !targ->canDualIssue(insn, next)) {
3752f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      delay = CLAMP(delay, GM107_MIN_ISSUE_DELAY, GM107_MAX_ISSUE_DELAY);
3753f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   } else {
3754f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      delay = 0x0; // dual-issue
3755f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   }
3756f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3757f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   wr = getWrDepBar(insn);
3758f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   rd = getRdDepBar(insn);
3759f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3760f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   if (delay == GM107_MIN_ISSUE_DELAY && (wr & rd) != 7) {
3761f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      // Barriers take one additional clock cycle to become active on top of
3762f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      // the clock consumed by the instruction producing it.
3763f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      if (!next || insn->bb != next->bb) {
3764f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         delay = 0x2;
3765f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      } else {
3766f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         int wt = getWtDepBar(next);
3767f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         if ((wt & (1 << wr)) | (wt & (1 << rd)))
3768f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            delay = 0x2;
3769f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      }
3770f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   }
3771f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3772f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   emitStall(insn, delay);
3773f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset}
3774f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3775f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3776f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// Return true when the given instruction needs to emit a read dependency
3777f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// barrier (for WaR hazards) because it doesn't operate at a fixed latency, and
3778f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// setting the maximum number of stall counts is not enough.
3779f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetbool
3780f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::needRdDepBar(const Instruction *insn) const
3781f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{
3782f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   BitSet srcs(255, 1), defs(255, 1);
3783f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   int a, b;
3784f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3785f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   if (!targ->isBarrierRequired(insn))
3786f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      return false;
3787f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3788f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   // Do not emit a read dependency barrier when the instruction doesn't use
3789f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   // any GPR (like st s[0x4] 0x0) as input because it's unnecessary.
3790f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   for (int s = 0; insn->srcExists(s); ++s) {
3791f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      const Value *src = insn->src(s).rep();
3792f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      if (insn->src(s).getFile() != FILE_GPR)
3793f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         continue;
3794f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      if (src->reg.data.id == 255)
3795f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         continue;
3796f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3797f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      a = src->reg.data.id;
3798f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      b = a + src->reg.size / 4;
3799f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      for (int r = a; r < b; ++r)
3800f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         srcs.set(r);
3801f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   }
3802f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3803f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   if (!srcs.popCount())
3804f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      return false;
3805f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3806f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   // Do not emit a read dependency barrier when the output GPRs are equal to
3807f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   // the input GPRs (like rcp $r0 $r0) because a write dependency barrier will
3808f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   // be produced and WaR hazards are prevented.
3809f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   for (int d = 0; insn->defExists(d); ++d) {
3810f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      const Value *def = insn->def(d).rep();
3811f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      if (insn->def(d).getFile() != FILE_GPR)
3812f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         continue;
3813f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      if (def->reg.data.id == 255)
3814f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         continue;
3815f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3816f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      a = def->reg.data.id;
3817f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      b = a + def->reg.size / 4;
3818f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      for (int r = a; r < b; ++r)
3819f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         defs.set(r);
3820f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   }
3821f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3822f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   srcs.andNot(defs);
3823f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   if (!srcs.popCount())
3824f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      return false;
3825f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3826f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   return true;
3827f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset}
3828f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3829f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// Return true when the given instruction needs to emit a write dependency
3830f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// barrier (for RaW hazards) because it doesn't operate at a fixed latency, and
3831f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// setting the maximum number of stall counts is not enough. This is only legal
3832f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// if the instruction output something.
3833f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetbool
3834f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::needWrDepBar(const Instruction *insn) const
3835f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{
3836f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   if (!targ->isBarrierRequired(insn))
3837f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      return false;
3838f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3839f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   for (int d = 0; insn->defExists(d); ++d) {
3840f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      if (insn->def(d).getFile() == FILE_GPR ||
3841f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset          insn->def(d).getFile() == FILE_PREDICATE)
3842f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         return true;
3843f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   }
3844f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   return false;
3845f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset}
3846f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3847f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// Find the next instruction inside the same basic block which uses the output
3848f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// of the given instruction in order to avoid RaW hazards.
3849f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetInstruction *
3850f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::findFirstUse(const Instruction *bari) const
3851f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{
3852f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   Instruction *insn, *next;
3853f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   int minGPR, maxGPR;
3854f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3855f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   if (!bari->defExists(0))
3856f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      return NULL;
3857f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3858f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   minGPR = bari->def(0).rep()->reg.data.id;
3859f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   maxGPR = minGPR + bari->def(0).rep()->reg.size / 4 - 1;
3860f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3861f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   for (insn = bari->next; insn != NULL; insn = next) {
3862f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      next = insn->next;
3863f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3864f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      for (int s = 0; insn->srcExists(s); ++s) {
3865f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         const Value *src = insn->src(s).rep();
3866f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         if (bari->def(0).getFile() == FILE_GPR) {
3867f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            if (insn->src(s).getFile() != FILE_GPR ||
3868f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset                src->reg.data.id + src->reg.size / 4 - 1 < minGPR ||
3869f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset                src->reg.data.id > maxGPR)
3870f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset               continue;
3871f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            return insn;
3872f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         } else
3873f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         if (bari->def(0).getFile() == FILE_PREDICATE) {
3874f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            if (insn->src(s).getFile() != FILE_PREDICATE ||
3875f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset                src->reg.data.id != minGPR)
3876f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset               continue;
3877f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            return insn;
3878f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         }
3879f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      }
3880f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   }
3881f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   return NULL;
3882f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset}
3883f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3884f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// Find the next instruction inside the same basic block which overwrites, at
3885f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// least, one source of the given instruction in order to avoid WaR hazards.
3886f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetInstruction *
3887f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::findFirstDef(const Instruction *bari) const
3888f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{
3889f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   Instruction *insn, *next;
3890f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   int minGPR, maxGPR;
3891f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3892f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   for (insn = bari->next; insn != NULL; insn = next) {
3893f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      next = insn->next;
3894f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3895f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      for (int d = 0; insn->defExists(d); ++d) {
3896f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         const Value *def = insn->def(d).rep();
3897f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         if (insn->def(d).getFile() != FILE_GPR)
3898f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            continue;
3899f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3900f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         minGPR = def->reg.data.id;
3901f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         maxGPR = minGPR + def->reg.size / 4 - 1;
3902f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3903f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         for (int s = 0; bari->srcExists(s); ++s) {
3904f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            const Value *src = bari->src(s).rep();
3905f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            if (bari->src(s).getFile() != FILE_GPR ||
3906f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset                src->reg.data.id + src->reg.size / 4 - 1 < minGPR ||
3907f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset                src->reg.data.id > maxGPR)
3908f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset               continue;
3909f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            return insn;
3910f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         }
3911f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      }
3912f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   }
3913f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   return NULL;
3914f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset}
3915f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3916f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// Dependency barriers:
3917f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// This pass is a bit ugly and could probably be improved by performing a
3918f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// better allocation.
3919f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset//
3920f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// The main idea is to avoid WaR and RaW hazards by emitting read/write
3921f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset// dependency barriers using the control codes.
3922f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetbool
3923f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::insertBarriers(BasicBlock *bb)
3924f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{
3925f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   std::list<LiveBarUse> live_uses;
3926f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   std::list<LiveBarDef> live_defs;
3927f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   Instruction *insn, *next;
3928f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   BitSet bars(6, 1);
3929f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   int bar_id;
3930f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3931f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   for (insn = bb->getEntry(); insn != NULL; insn = next) {
3932f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      Instruction *usei = NULL, *defi = NULL;
3933f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      bool need_wr_bar, need_rd_bar;
3934f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3935f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      next = insn->next;
3936f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3937f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      // Expire old barrier uses.
3938f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      for (std::list<LiveBarUse>::iterator it = live_uses.begin();
3939f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset           it != live_uses.end();) {
3940f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         if (insn->serial >= it->usei->serial) {
3941f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            int wr = getWrDepBar(it->insn);
3942f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            emitWtDepBar(insn, wr);
3943f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            bars.clr(wr); // free barrier
3944f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            it = live_uses.erase(it);
3945f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            continue;
3946f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         }
3947f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         ++it;
3948f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      }
3949f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3950f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      // Expire old barrier defs.
3951f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      for (std::list<LiveBarDef>::iterator it = live_defs.begin();
3952f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset           it != live_defs.end();) {
3953f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         if (insn->serial >= it->defi->serial) {
3954f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            int rd = getRdDepBar(it->insn);
3955f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            emitWtDepBar(insn, rd);
3956f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            bars.clr(rd); // free barrier
3957f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            it = live_defs.erase(it);
3958f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            continue;
3959f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         }
3960f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         ++it;
3961f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      }
3962f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3963f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      need_wr_bar = needWrDepBar(insn);
3964f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      need_rd_bar = needRdDepBar(insn);
3965f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3966f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      if (need_wr_bar) {
3967f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         // When the instruction requires to emit a write dependency barrier
3968f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         // (all which write something at a variable latency), find the next
3969f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         // instruction which reads the outputs.
3970f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         usei = findFirstUse(insn);
3971f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3972f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         // Allocate and emit a new barrier.
3973f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         bar_id = bars.findFreeRange(1);
3974f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         if (bar_id == -1)
3975f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            bar_id = 5;
3976f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         bars.set(bar_id);
3977f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         emitWrDepBar(insn, bar_id);
3978f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         if (usei)
3979f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            live_uses.push_back(LiveBarUse(insn, usei));
3980f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      }
3981f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3982f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      if (need_rd_bar) {
3983f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         // When the instruction requires to emit a read dependency barrier
3984f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         // (all which read something at a variable latency), find the next
3985f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         // instruction which will write the inputs.
3986f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         defi = findFirstDef(insn);
3987f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3988f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         if (usei && defi && usei->serial <= defi->serial)
3989f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            continue;
3990f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
3991f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         // Allocate and emit a new barrier.
3992f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         bar_id = bars.findFreeRange(1);
3993f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         if (bar_id == -1)
3994f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            bar_id = 5;
3995f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         bars.set(bar_id);
3996f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         emitRdDepBar(insn, bar_id);
3997f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         if (defi)
3998f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            live_defs.push_back(LiveBarDef(insn, defi));
3999f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      }
4000f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   }
4001f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
4002f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   // Remove unnecessary barrier waits.
4003f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   BitSet alive_bars(6, 1);
4004f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   for (insn = bb->getEntry(); insn != NULL; insn = next) {
4005f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      int wr, rd, wt;
4006f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
4007f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      next = insn->next;
4008f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
4009f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      wr = getWrDepBar(insn);
4010f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      rd = getRdDepBar(insn);
4011f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      wt = getWtDepBar(insn);
4012f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
4013f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      for (int idx = 0; idx < 6; ++idx) {
4014f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         if (!(wt & (1 << idx)))
4015f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            continue;
4016f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         if (!alive_bars.test(idx)) {
4017f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            insn->sched &= ~(1 << (11  + idx));
4018f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         } else {
4019f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            alive_bars.clr(idx);
4020f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         }
4021f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      }
4022f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
4023f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      if (wr < 6)
4024f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         alive_bars.set(wr);
4025f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      if (rd < 6)
4026f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         alive_bars.set(rd);
4027f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   }
4028f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
4029f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   return true;
4030f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset}
4031f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
4032f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoisetbool
4033f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel PitoisetSchedDataCalculatorGM107::visit(Function *func)
4034f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset{
4035f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   ArrayList insns;
4036f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
4037f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   func->orderInstructions(insns);
4038f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
4039f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   scoreBoards.resize(func->cfg.getSize());
4040f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   for (size_t i = 0; i < scoreBoards.size(); ++i)
4041f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      scoreBoards[i].wipe();
4042f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   return true;
4043f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset}
4044f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
4045d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsbool
4046d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsSchedDataCalculatorGM107::visit(BasicBlock *bb)
4047d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
4048f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   Instruction *insn, *next = NULL;
4049f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   int cycle = 0;
4050f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
4051d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   for (Instruction *insn = bb->getEntry(); insn; insn = insn->next) {
4052d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      /*XXX*/
4053d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      insn->sched = 0x7e0;
4054d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
4055d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
4056f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   if (!debug_get_bool_option("NV50_PROG_SCHED", true))
4057f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      return true;
4058f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
4059f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   // Insert read/write dependency barriers for instructions which don't
4060f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   // operate at a fixed latency.
4061f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   insertBarriers(bb);
4062f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
4063f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   score = &scoreBoards.at(bb->getId());
4064f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
4065f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   for (Graph::EdgeIterator ei = bb->cfg.incident(); !ei.end(); ei.next()) {
4066f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      // back branches will wait until all target dependencies are satisfied
4067f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      if (ei.getType() == Graph::Edge::BACK) // sched would be uninitialized
4068f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         continue;
4069f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      BasicBlock *in = BasicBlock::get(ei.getNode());
4070f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      score->setMax(&scoreBoards.at(in->getId()));
4071f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   }
4072f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
4073f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset#ifdef GM107_DEBUG_SCHED_DATA
4074f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   INFO("=== BB:%i initial scores\n", bb->getId());
4075f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   score->print(cycle);
4076f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset#endif
4077f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
4078f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   // Because barriers are allocated locally (intra-BB), we have to make sure
4079f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   // that all produced barriers have been consumed before entering inside a
4080f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   // new basic block. The best way is to do a global allocation pre RA but
4081f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   // it's really more difficult, especially because of the phi nodes. Anyways,
4082f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   // it seems like that waiting on a barrier which has already been consumed
4083f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   // doesn't add any additional cost, it's just not elegant!
4084f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   Instruction *start = bb->getEntry();
4085f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   if (start && bb->cfg.incidentCount() > 0) {
4086f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      for (int b = 0; b < 6; b++)
4087f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         emitWtDepBar(start, b);
4088f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   }
4089f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
4090f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   for (insn = bb->getEntry(); insn && insn->next; insn = insn->next) {
4091f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      next = insn->next;
4092f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
4093f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      commitInsn(insn, cycle);
4094f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      int delay = calcDelay(next, cycle);
4095f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      setDelay(insn, delay, next);
4096f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      cycle += getStall(insn);
4097f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
4098f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      setReuseFlag(insn);
4099f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
4100f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      // XXX: The yield flag seems to destroy a bunch of things when it is
4101f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      // set on every instruction, need investigation.
4102f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      //emitYield(insn);
4103f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
4104f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset#ifdef GM107_DEBUG_SCHED_DATA
4105f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      printSchedInfo(cycle, insn);
4106f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      insn->print();
4107f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      next->print();
4108f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset#endif
4109f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   }
4110f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
4111f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   if (!insn)
4112f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      return true;
4113f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   commitInsn(insn, cycle);
4114f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
4115f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   int bbDelay = -1;
4116f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
4117f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset#ifdef GM107_DEBUG_SCHED_DATA
4118f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   fprintf(stderr, "last instruction is : ");
4119f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   insn->print();
4120f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   fprintf(stderr, "cycle=%d\n", cycle);
4121f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset#endif
4122f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
4123f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   for (Graph::EdgeIterator ei = bb->cfg.outgoing(); !ei.end(); ei.next()) {
4124f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      BasicBlock *out = BasicBlock::get(ei.getNode());
4125f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
4126f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      if (ei.getType() != Graph::Edge::BACK) {
4127f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         // Only test the first instruction of the outgoing block.
4128f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         next = out->getEntry();
4129f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         if (next) {
4130f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            bbDelay = MAX2(bbDelay, calcDelay(next, cycle));
4131f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         } else {
4132f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            // When the outgoing BB is empty, make sure to set the number of
4133f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            // stall counts needed by the instruction because we don't know the
4134f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            // next instruction.
4135f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            bbDelay = MAX2(bbDelay, targ->getLatency(insn));
4136f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         }
4137f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      } else {
4138f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         // Wait until all dependencies are satisfied.
4139f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         const int regsFree = score->getLatest();
4140f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         next = out->getFirst();
4141f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         for (int c = cycle; next && c < regsFree; next = next->next) {
4142f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            bbDelay = MAX2(bbDelay, calcDelay(next, c));
4143f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset            c += getStall(next);
4144f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         }
4145f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset         next = NULL;
4146f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      }
4147f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   }
4148f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   if (bb->cfg.outgoingCount() != 1)
4149f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset      next = NULL;
4150f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   setDelay(insn, bbDelay, next);
4151f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   cycle += getStall(insn);
4152f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset
4153f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   score->rebase(cycle); // common base for initializing out blocks' scores
4154d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   return true;
4155d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
4156d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
4157d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs/*******************************************************************************
4158d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs * main
4159d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs ******************************************************************************/
4160d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
4161d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
4162d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::prepareEmission(Function *func)
4163d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
4164f519c47f7d47d88ecf3b5e8f28fdffaa12f684d3Samuel Pitoiset   SchedDataCalculatorGM107 sched(targGM107);
4165d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   CodeEmitter::prepareEmission(func);
4166d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   sched.run(func, true, true);
4167d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
4168d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
4169d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsstatic inline uint32_t sizeToBundlesGM107(uint32_t size)
4170d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
4171d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   return (size + 23) / 24;
4172d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
4173d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
4174d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggsvoid
4175d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::prepareEmission(Program *prog)
4176d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
4177d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   for (ArrayList::Iterator fi = prog->allFuncs.iterator();
4178d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs        !fi.end(); fi.next()) {
4179d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      Function *func = reinterpret_cast<Function *>(fi.get());
4180d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      func->binPos = prog->binSize;
4181d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      prepareEmission(func);
4182d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
4183d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      // adjust sizes & positions for schedulding info:
4184d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      if (prog->getTarget()->hasSWSched) {
4185d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         uint32_t adjPos = func->binPos;
4186d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         BasicBlock *bb = NULL;
4187d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         for (int i = 0; i < func->bbCount; ++i) {
4188d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs            bb = func->bbArray[i];
4189d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs            int32_t adjSize = bb->binSize;
4190d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs            if (adjPos % 32) {
4191d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs               adjSize -= 32 - adjPos % 32;
4192d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs               if (adjSize < 0)
4193d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs                  adjSize = 0;
4194d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs            }
4195d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs            adjSize = bb->binSize + sizeToBundlesGM107(adjSize) * 8;
4196d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs            bb->binPos = adjPos;
4197d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs            bb->binSize = adjSize;
4198d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs            adjPos += adjSize;
4199d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         }
4200d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs         if (bb)
4201d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs            func->binSize = adjPos - func->binPos;
4202d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      }
4203d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
4204d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs      prog->binSize += func->binSize;
4205d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   }
4206d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
4207d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
4208d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitterGM107::CodeEmitterGM107(const TargetGM107 *target)
4209d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   : CodeEmitter(target),
4210d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs     targGM107(target),
4211d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs     writeIssueDelays(target->hasSWSched)
4212d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
4213d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   code = NULL;
4214d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   codeSize = codeSizeLimit = 0;
4215d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   relocInfo = NULL;
4216d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
4217d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
4218d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsCodeEmitter *
4219d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben SkeggsTargetGM107::createCodeEmitterGM107(Program::Type type)
4220d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs{
4221d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   CodeEmitterGM107 *emit = new CodeEmitterGM107(this);
4222d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   emit->setProgramType(type);
4223d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs   return emit;
4224d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs}
4225d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs
4226d548d47edf9f05e6dbf9656abc2f8e78d02cb2f6Ben Skeggs} // namespace nv50_ir
4227