xref: /aosp_15_r20/external/llvm/lib/Target/AMDGPU/R600Instructions.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//===-- R600Instructions.td - R600 Instruction defs  -------*- tablegen -*-===//
2*9880d681SAndroid Build Coastguard Worker//
3*9880d681SAndroid Build Coastguard Worker//                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker//
5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker//
8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker//
10*9880d681SAndroid Build Coastguard Worker// TableGen definitions for instructions which are available on R600 family
11*9880d681SAndroid Build Coastguard Worker// GPUs.
12*9880d681SAndroid Build Coastguard Worker//
13*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Workerinclude "R600Intrinsics.td"
16*9880d681SAndroid Build Coastguard Workerinclude "R600InstrFormats.td"
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Workerclass InstR600ISA <dag outs, dag ins, string asm, list<dag> pattern = []> :
19*9880d681SAndroid Build Coastguard Worker    InstR600 <outs, ins, asm, pattern, NullALU> {
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Worker  let Namespace = "AMDGPU";
22*9880d681SAndroid Build Coastguard Worker}
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Workerdef MEMxi : Operand<iPTR> {
25*9880d681SAndroid Build Coastguard Worker  let MIOperandInfo = (ops R600_TReg32_X:$ptr, i32imm:$index);
26*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printMemOperand";
27*9880d681SAndroid Build Coastguard Worker}
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Workerdef MEMrr : Operand<iPTR> {
30*9880d681SAndroid Build Coastguard Worker  let MIOperandInfo = (ops R600_Reg32:$ptr, R600_Reg32:$index);
31*9880d681SAndroid Build Coastguard Worker}
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Worker// Operands for non-registers
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Workerclass InstFlag<string PM = "printOperand", int Default = 0>
36*9880d681SAndroid Build Coastguard Worker    : OperandWithDefaultOps <i32, (ops (i32 Default))> {
37*9880d681SAndroid Build Coastguard Worker  let PrintMethod = PM;
38*9880d681SAndroid Build Coastguard Worker}
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker// src_sel for ALU src operands, see also ALU_CONST, ALU_PARAM registers
41*9880d681SAndroid Build Coastguard Workerdef SEL : OperandWithDefaultOps <i32, (ops (i32 -1))> {
42*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printSel";
43*9880d681SAndroid Build Coastguard Worker}
44*9880d681SAndroid Build Coastguard Workerdef BANK_SWIZZLE : OperandWithDefaultOps <i32, (ops (i32 0))> {
45*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printBankSwizzle";
46*9880d681SAndroid Build Coastguard Worker}
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Workerdef LITERAL : InstFlag<"printLiteral">;
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Workerdef WRITE : InstFlag <"printWrite", 1>;
51*9880d681SAndroid Build Coastguard Workerdef OMOD : InstFlag <"printOMOD">;
52*9880d681SAndroid Build Coastguard Workerdef REL : InstFlag <"printRel">;
53*9880d681SAndroid Build Coastguard Workerdef CLAMP : InstFlag <"printClamp">;
54*9880d681SAndroid Build Coastguard Workerdef NEG : InstFlag <"printNeg">;
55*9880d681SAndroid Build Coastguard Workerdef ABS : InstFlag <"printAbs">;
56*9880d681SAndroid Build Coastguard Workerdef UEM : InstFlag <"printUpdateExecMask">;
57*9880d681SAndroid Build Coastguard Workerdef UP : InstFlag <"printUpdatePred">;
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker// XXX: The r600g finalizer in Mesa expects last to be one in most cases.
60*9880d681SAndroid Build Coastguard Worker// Once we start using the packetizer in this backend we should have this
61*9880d681SAndroid Build Coastguard Worker// default to 0.
62*9880d681SAndroid Build Coastguard Workerdef LAST : InstFlag<"printLast", 1>;
63*9880d681SAndroid Build Coastguard Workerdef RSel : Operand<i32> {
64*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printRSel";
65*9880d681SAndroid Build Coastguard Worker}
66*9880d681SAndroid Build Coastguard Workerdef CT: Operand<i32> {
67*9880d681SAndroid Build Coastguard Worker  let PrintMethod = "printCT";
68*9880d681SAndroid Build Coastguard Worker}
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Workerdef FRAMEri : Operand<iPTR> {
71*9880d681SAndroid Build Coastguard Worker  let MIOperandInfo = (ops R600_Reg32:$ptr, i32imm:$index);
72*9880d681SAndroid Build Coastguard Worker}
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Workerdef ADDRParam : ComplexPattern<i32, 2, "SelectADDRParam", [], []>;
75*9880d681SAndroid Build Coastguard Workerdef ADDRDWord : ComplexPattern<i32, 1, "SelectADDRDWord", [], []>;
76*9880d681SAndroid Build Coastguard Workerdef ADDRVTX_READ : ComplexPattern<i32, 2, "SelectADDRVTX_READ", [], []>;
77*9880d681SAndroid Build Coastguard Workerdef ADDRGA_CONST_OFFSET : ComplexPattern<i32, 1, "SelectGlobalValueConstantOffset", [], []>;
78*9880d681SAndroid Build Coastguard Workerdef ADDRGA_VAR_OFFSET : ComplexPattern<i32, 2, "SelectGlobalValueVariableOffset", [], []>;
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Workerdef R600_Pred : PredicateOperand<i32, (ops R600_Predicate),
82*9880d681SAndroid Build Coastguard Worker                                     (ops PRED_SEL_OFF)>;
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in {
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Worker// Class for instructions with only one source register.
88*9880d681SAndroid Build Coastguard Worker// If you add new ins to this instruction, make sure they are listed before
89*9880d681SAndroid Build Coastguard Worker// $literal, because the backend currently assumes that the last operand is
90*9880d681SAndroid Build Coastguard Worker// a literal.  Also be sure to update the enum R600Op1OperandIndex::ROI in
91*9880d681SAndroid Build Coastguard Worker// R600Defines.h, R600InstrInfo::buildDefaultInstruction(),
92*9880d681SAndroid Build Coastguard Worker// and R600InstrInfo::getOperandIdx().
93*9880d681SAndroid Build Coastguard Workerclass R600_1OP <bits<11> inst, string opName, list<dag> pattern,
94*9880d681SAndroid Build Coastguard Worker                InstrItinClass itin = AnyALU> :
95*9880d681SAndroid Build Coastguard Worker    InstR600 <(outs R600_Reg32:$dst),
96*9880d681SAndroid Build Coastguard Worker              (ins WRITE:$write, OMOD:$omod, REL:$dst_rel, CLAMP:$clamp,
97*9880d681SAndroid Build Coastguard Worker                   R600_Reg32:$src0, NEG:$src0_neg, REL:$src0_rel, ABS:$src0_abs, SEL:$src0_sel,
98*9880d681SAndroid Build Coastguard Worker                   LAST:$last, R600_Pred:$pred_sel, LITERAL:$literal,
99*9880d681SAndroid Build Coastguard Worker                   BANK_SWIZZLE:$bank_swizzle),
100*9880d681SAndroid Build Coastguard Worker              !strconcat("  ", opName,
101*9880d681SAndroid Build Coastguard Worker                   "$clamp $last $dst$write$dst_rel$omod, "
102*9880d681SAndroid Build Coastguard Worker                   "$src0_neg$src0_abs$src0$src0_abs$src0_rel, "
103*9880d681SAndroid Build Coastguard Worker                   "$pred_sel $bank_swizzle"),
104*9880d681SAndroid Build Coastguard Worker              pattern,
105*9880d681SAndroid Build Coastguard Worker              itin>,
106*9880d681SAndroid Build Coastguard Worker    R600ALU_Word0,
107*9880d681SAndroid Build Coastguard Worker    R600ALU_Word1_OP2 <inst> {
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Worker  let src1 = 0;
110*9880d681SAndroid Build Coastguard Worker  let src1_rel = 0;
111*9880d681SAndroid Build Coastguard Worker  let src1_neg = 0;
112*9880d681SAndroid Build Coastguard Worker  let src1_abs = 0;
113*9880d681SAndroid Build Coastguard Worker  let update_exec_mask = 0;
114*9880d681SAndroid Build Coastguard Worker  let update_pred = 0;
115*9880d681SAndroid Build Coastguard Worker  let HasNativeOperands = 1;
116*9880d681SAndroid Build Coastguard Worker  let Op1 = 1;
117*9880d681SAndroid Build Coastguard Worker  let ALUInst = 1;
118*9880d681SAndroid Build Coastguard Worker  let DisableEncoding = "$literal";
119*9880d681SAndroid Build Coastguard Worker  let UseNamedOperandTable = 1;
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Worker  let Inst{31-0}  = Word0;
122*9880d681SAndroid Build Coastguard Worker  let Inst{63-32} = Word1;
123*9880d681SAndroid Build Coastguard Worker}
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Workerclass R600_1OP_Helper <bits<11> inst, string opName, SDPatternOperator node,
126*9880d681SAndroid Build Coastguard Worker                    InstrItinClass itin = AnyALU> :
127*9880d681SAndroid Build Coastguard Worker    R600_1OP <inst, opName,
128*9880d681SAndroid Build Coastguard Worker              [(set R600_Reg32:$dst, (node R600_Reg32:$src0))], itin
129*9880d681SAndroid Build Coastguard Worker>;
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Worker// If you add or change the operands for R600_2OP instructions, you must
132*9880d681SAndroid Build Coastguard Worker// also update the R600Op2OperandIndex::ROI enum in R600Defines.h,
133*9880d681SAndroid Build Coastguard Worker// R600InstrInfo::buildDefaultInstruction(), and R600InstrInfo::getOperandIdx().
134*9880d681SAndroid Build Coastguard Workerclass R600_2OP <bits<11> inst, string opName, list<dag> pattern,
135*9880d681SAndroid Build Coastguard Worker                InstrItinClass itin = AnyALU> :
136*9880d681SAndroid Build Coastguard Worker  InstR600 <(outs R600_Reg32:$dst),
137*9880d681SAndroid Build Coastguard Worker          (ins UEM:$update_exec_mask, UP:$update_pred, WRITE:$write,
138*9880d681SAndroid Build Coastguard Worker               OMOD:$omod, REL:$dst_rel, CLAMP:$clamp,
139*9880d681SAndroid Build Coastguard Worker               R600_Reg32:$src0, NEG:$src0_neg, REL:$src0_rel, ABS:$src0_abs, SEL:$src0_sel,
140*9880d681SAndroid Build Coastguard Worker               R600_Reg32:$src1, NEG:$src1_neg, REL:$src1_rel, ABS:$src1_abs, SEL:$src1_sel,
141*9880d681SAndroid Build Coastguard Worker               LAST:$last, R600_Pred:$pred_sel, LITERAL:$literal,
142*9880d681SAndroid Build Coastguard Worker               BANK_SWIZZLE:$bank_swizzle),
143*9880d681SAndroid Build Coastguard Worker          !strconcat("  ", opName,
144*9880d681SAndroid Build Coastguard Worker                "$clamp $last $update_exec_mask$update_pred$dst$write$dst_rel$omod, "
145*9880d681SAndroid Build Coastguard Worker                "$src0_neg$src0_abs$src0$src0_abs$src0_rel, "
146*9880d681SAndroid Build Coastguard Worker                "$src1_neg$src1_abs$src1$src1_abs$src1_rel, "
147*9880d681SAndroid Build Coastguard Worker                "$pred_sel $bank_swizzle"),
148*9880d681SAndroid Build Coastguard Worker          pattern,
149*9880d681SAndroid Build Coastguard Worker          itin>,
150*9880d681SAndroid Build Coastguard Worker    R600ALU_Word0,
151*9880d681SAndroid Build Coastguard Worker    R600ALU_Word1_OP2 <inst> {
152*9880d681SAndroid Build Coastguard Worker
153*9880d681SAndroid Build Coastguard Worker  let HasNativeOperands = 1;
154*9880d681SAndroid Build Coastguard Worker  let Op2 = 1;
155*9880d681SAndroid Build Coastguard Worker  let ALUInst = 1;
156*9880d681SAndroid Build Coastguard Worker  let DisableEncoding = "$literal";
157*9880d681SAndroid Build Coastguard Worker  let UseNamedOperandTable = 1;
158*9880d681SAndroid Build Coastguard Worker
159*9880d681SAndroid Build Coastguard Worker  let Inst{31-0}  = Word0;
160*9880d681SAndroid Build Coastguard Worker  let Inst{63-32} = Word1;
161*9880d681SAndroid Build Coastguard Worker}
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Workerclass R600_2OP_Helper <bits<11> inst, string opName,
164*9880d681SAndroid Build Coastguard Worker                       SDPatternOperator node = null_frag,
165*9880d681SAndroid Build Coastguard Worker                       InstrItinClass itin = AnyALU> :
166*9880d681SAndroid Build Coastguard Worker    R600_2OP <inst, opName,
167*9880d681SAndroid Build Coastguard Worker              [(set R600_Reg32:$dst, (node R600_Reg32:$src0,
168*9880d681SAndroid Build Coastguard Worker                                           R600_Reg32:$src1))], itin
169*9880d681SAndroid Build Coastguard Worker>;
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Worker// If you add our change the operands for R600_3OP instructions, you must
172*9880d681SAndroid Build Coastguard Worker// also update the R600Op3OperandIndex::ROI enum in R600Defines.h,
173*9880d681SAndroid Build Coastguard Worker// R600InstrInfo::buildDefaultInstruction(), and
174*9880d681SAndroid Build Coastguard Worker// R600InstrInfo::getOperandIdx().
175*9880d681SAndroid Build Coastguard Workerclass R600_3OP <bits<5> inst, string opName, list<dag> pattern,
176*9880d681SAndroid Build Coastguard Worker                InstrItinClass itin = AnyALU> :
177*9880d681SAndroid Build Coastguard Worker  InstR600 <(outs R600_Reg32:$dst),
178*9880d681SAndroid Build Coastguard Worker          (ins REL:$dst_rel, CLAMP:$clamp,
179*9880d681SAndroid Build Coastguard Worker               R600_Reg32:$src0, NEG:$src0_neg, REL:$src0_rel, SEL:$src0_sel,
180*9880d681SAndroid Build Coastguard Worker               R600_Reg32:$src1, NEG:$src1_neg, REL:$src1_rel, SEL:$src1_sel,
181*9880d681SAndroid Build Coastguard Worker               R600_Reg32:$src2, NEG:$src2_neg, REL:$src2_rel, SEL:$src2_sel,
182*9880d681SAndroid Build Coastguard Worker               LAST:$last, R600_Pred:$pred_sel, LITERAL:$literal,
183*9880d681SAndroid Build Coastguard Worker               BANK_SWIZZLE:$bank_swizzle),
184*9880d681SAndroid Build Coastguard Worker          !strconcat("  ", opName, "$clamp $last $dst$dst_rel, "
185*9880d681SAndroid Build Coastguard Worker                             "$src0_neg$src0$src0_rel, "
186*9880d681SAndroid Build Coastguard Worker                             "$src1_neg$src1$src1_rel, "
187*9880d681SAndroid Build Coastguard Worker                             "$src2_neg$src2$src2_rel, "
188*9880d681SAndroid Build Coastguard Worker                             "$pred_sel"
189*9880d681SAndroid Build Coastguard Worker                             "$bank_swizzle"),
190*9880d681SAndroid Build Coastguard Worker          pattern,
191*9880d681SAndroid Build Coastguard Worker          itin>,
192*9880d681SAndroid Build Coastguard Worker    R600ALU_Word0,
193*9880d681SAndroid Build Coastguard Worker    R600ALU_Word1_OP3<inst>{
194*9880d681SAndroid Build Coastguard Worker
195*9880d681SAndroid Build Coastguard Worker  let HasNativeOperands = 1;
196*9880d681SAndroid Build Coastguard Worker  let DisableEncoding = "$literal";
197*9880d681SAndroid Build Coastguard Worker  let Op3 = 1;
198*9880d681SAndroid Build Coastguard Worker  let UseNamedOperandTable = 1;
199*9880d681SAndroid Build Coastguard Worker  let ALUInst = 1;
200*9880d681SAndroid Build Coastguard Worker
201*9880d681SAndroid Build Coastguard Worker  let Inst{31-0}  = Word0;
202*9880d681SAndroid Build Coastguard Worker  let Inst{63-32} = Word1;
203*9880d681SAndroid Build Coastguard Worker}
204*9880d681SAndroid Build Coastguard Worker
205*9880d681SAndroid Build Coastguard Workerclass R600_REDUCTION <bits<11> inst, dag ins, string asm, list<dag> pattern,
206*9880d681SAndroid Build Coastguard Worker                      InstrItinClass itin = VecALU> :
207*9880d681SAndroid Build Coastguard Worker  InstR600 <(outs R600_Reg32:$dst),
208*9880d681SAndroid Build Coastguard Worker          ins,
209*9880d681SAndroid Build Coastguard Worker          asm,
210*9880d681SAndroid Build Coastguard Worker          pattern,
211*9880d681SAndroid Build Coastguard Worker          itin>;
212*9880d681SAndroid Build Coastguard Worker
213*9880d681SAndroid Build Coastguard Worker
214*9880d681SAndroid Build Coastguard Worker
215*9880d681SAndroid Build Coastguard Worker} // End mayLoad = 1, mayStore = 0, hasSideEffects = 0
216*9880d681SAndroid Build Coastguard Worker
217*9880d681SAndroid Build Coastguard Workerdef TEX_SHADOW : PatLeaf<
218*9880d681SAndroid Build Coastguard Worker  (imm),
219*9880d681SAndroid Build Coastguard Worker  [{uint32_t TType = (uint32_t)N->getZExtValue();
220*9880d681SAndroid Build Coastguard Worker    return (TType >= 6 && TType <= 8) || TType == 13;
221*9880d681SAndroid Build Coastguard Worker  }]
222*9880d681SAndroid Build Coastguard Worker>;
223*9880d681SAndroid Build Coastguard Worker
224*9880d681SAndroid Build Coastguard Workerdef TEX_RECT : PatLeaf<
225*9880d681SAndroid Build Coastguard Worker  (imm),
226*9880d681SAndroid Build Coastguard Worker  [{uint32_t TType = (uint32_t)N->getZExtValue();
227*9880d681SAndroid Build Coastguard Worker    return TType == 5;
228*9880d681SAndroid Build Coastguard Worker  }]
229*9880d681SAndroid Build Coastguard Worker>;
230*9880d681SAndroid Build Coastguard Worker
231*9880d681SAndroid Build Coastguard Workerdef TEX_ARRAY : PatLeaf<
232*9880d681SAndroid Build Coastguard Worker  (imm),
233*9880d681SAndroid Build Coastguard Worker  [{uint32_t TType = (uint32_t)N->getZExtValue();
234*9880d681SAndroid Build Coastguard Worker    return TType == 9 || TType == 10 || TType == 16;
235*9880d681SAndroid Build Coastguard Worker  }]
236*9880d681SAndroid Build Coastguard Worker>;
237*9880d681SAndroid Build Coastguard Worker
238*9880d681SAndroid Build Coastguard Workerdef TEX_SHADOW_ARRAY : PatLeaf<
239*9880d681SAndroid Build Coastguard Worker  (imm),
240*9880d681SAndroid Build Coastguard Worker  [{uint32_t TType = (uint32_t)N->getZExtValue();
241*9880d681SAndroid Build Coastguard Worker    return TType == 11 || TType == 12 || TType == 17;
242*9880d681SAndroid Build Coastguard Worker  }]
243*9880d681SAndroid Build Coastguard Worker>;
244*9880d681SAndroid Build Coastguard Worker
245*9880d681SAndroid Build Coastguard Workerdef TEX_MSAA : PatLeaf<
246*9880d681SAndroid Build Coastguard Worker  (imm),
247*9880d681SAndroid Build Coastguard Worker  [{uint32_t TType = (uint32_t)N->getZExtValue();
248*9880d681SAndroid Build Coastguard Worker    return TType == 14;
249*9880d681SAndroid Build Coastguard Worker  }]
250*9880d681SAndroid Build Coastguard Worker>;
251*9880d681SAndroid Build Coastguard Worker
252*9880d681SAndroid Build Coastguard Workerdef TEX_ARRAY_MSAA : PatLeaf<
253*9880d681SAndroid Build Coastguard Worker  (imm),
254*9880d681SAndroid Build Coastguard Worker  [{uint32_t TType = (uint32_t)N->getZExtValue();
255*9880d681SAndroid Build Coastguard Worker    return TType == 15;
256*9880d681SAndroid Build Coastguard Worker  }]
257*9880d681SAndroid Build Coastguard Worker>;
258*9880d681SAndroid Build Coastguard Worker
259*9880d681SAndroid Build Coastguard Workerclass EG_CF_RAT <bits <8> cfinst, bits <6> ratinst, bits<4> ratid, bits<4> mask,
260*9880d681SAndroid Build Coastguard Worker                 dag outs, dag ins, string asm, list<dag> pattern> :
261*9880d681SAndroid Build Coastguard Worker    InstR600ISA <outs, ins, asm, pattern>,
262*9880d681SAndroid Build Coastguard Worker    CF_ALLOC_EXPORT_WORD0_RAT, CF_ALLOC_EXPORT_WORD1_BUF  {
263*9880d681SAndroid Build Coastguard Worker
264*9880d681SAndroid Build Coastguard Worker  let rat_id = ratid;
265*9880d681SAndroid Build Coastguard Worker  let rat_inst = ratinst;
266*9880d681SAndroid Build Coastguard Worker  let rim         = 0;
267*9880d681SAndroid Build Coastguard Worker  // XXX: Have a separate instruction for non-indexed writes.
268*9880d681SAndroid Build Coastguard Worker  let type        = 1;
269*9880d681SAndroid Build Coastguard Worker  let rw_rel      = 0;
270*9880d681SAndroid Build Coastguard Worker  let elem_size   = 0;
271*9880d681SAndroid Build Coastguard Worker
272*9880d681SAndroid Build Coastguard Worker  let array_size  = 0;
273*9880d681SAndroid Build Coastguard Worker  let comp_mask   = mask;
274*9880d681SAndroid Build Coastguard Worker  let burst_count = 0;
275*9880d681SAndroid Build Coastguard Worker  let vpm         = 0;
276*9880d681SAndroid Build Coastguard Worker  let cf_inst = cfinst;
277*9880d681SAndroid Build Coastguard Worker  let mark        = 0;
278*9880d681SAndroid Build Coastguard Worker  let barrier     = 1;
279*9880d681SAndroid Build Coastguard Worker
280*9880d681SAndroid Build Coastguard Worker  let Inst{31-0} = Word0;
281*9880d681SAndroid Build Coastguard Worker  let Inst{63-32} = Word1;
282*9880d681SAndroid Build Coastguard Worker  let IsExport = 1;
283*9880d681SAndroid Build Coastguard Worker
284*9880d681SAndroid Build Coastguard Worker}
285*9880d681SAndroid Build Coastguard Worker
286*9880d681SAndroid Build Coastguard Workerclass VTX_READ <string name, bits<8> buffer_id, dag outs, list<dag> pattern>
287*9880d681SAndroid Build Coastguard Worker    : InstR600ISA <outs, (ins MEMxi:$src_gpr), !strconcat("  ", name), pattern>,
288*9880d681SAndroid Build Coastguard Worker      VTX_WORD1_GPR {
289*9880d681SAndroid Build Coastguard Worker
290*9880d681SAndroid Build Coastguard Worker  // Static fields
291*9880d681SAndroid Build Coastguard Worker  let DST_REL = 0;
292*9880d681SAndroid Build Coastguard Worker  // The docs say that if this bit is set, then DATA_FORMAT, NUM_FORMAT_ALL,
293*9880d681SAndroid Build Coastguard Worker  // FORMAT_COMP_ALL, SRF_MODE_ALL, and ENDIAN_SWAP fields will be ignored,
294*9880d681SAndroid Build Coastguard Worker  // however, based on my testing if USE_CONST_FIELDS is set, then all
295*9880d681SAndroid Build Coastguard Worker  // these fields need to be set to 0.
296*9880d681SAndroid Build Coastguard Worker  let USE_CONST_FIELDS = 0;
297*9880d681SAndroid Build Coastguard Worker  let NUM_FORMAT_ALL = 1;
298*9880d681SAndroid Build Coastguard Worker  let FORMAT_COMP_ALL = 0;
299*9880d681SAndroid Build Coastguard Worker  let SRF_MODE_ALL = 0;
300*9880d681SAndroid Build Coastguard Worker
301*9880d681SAndroid Build Coastguard Worker  let Inst{63-32} = Word1;
302*9880d681SAndroid Build Coastguard Worker  // LLVM can only encode 64-bit instructions, so these fields are manually
303*9880d681SAndroid Build Coastguard Worker  // encoded in R600CodeEmitter
304*9880d681SAndroid Build Coastguard Worker  //
305*9880d681SAndroid Build Coastguard Worker  // bits<16> OFFSET;
306*9880d681SAndroid Build Coastguard Worker  // bits<2>  ENDIAN_SWAP = 0;
307*9880d681SAndroid Build Coastguard Worker  // bits<1>  CONST_BUF_NO_STRIDE = 0;
308*9880d681SAndroid Build Coastguard Worker  // bits<1>  MEGA_FETCH = 0;
309*9880d681SAndroid Build Coastguard Worker  // bits<1>  ALT_CONST = 0;
310*9880d681SAndroid Build Coastguard Worker  // bits<2>  BUFFER_INDEX_MODE = 0;
311*9880d681SAndroid Build Coastguard Worker
312*9880d681SAndroid Build Coastguard Worker  // VTX_WORD2 (LLVM can only encode 64-bit instructions, so WORD2 encoding
313*9880d681SAndroid Build Coastguard Worker  // is done in R600CodeEmitter
314*9880d681SAndroid Build Coastguard Worker  //
315*9880d681SAndroid Build Coastguard Worker  // Inst{79-64} = OFFSET;
316*9880d681SAndroid Build Coastguard Worker  // Inst{81-80} = ENDIAN_SWAP;
317*9880d681SAndroid Build Coastguard Worker  // Inst{82}    = CONST_BUF_NO_STRIDE;
318*9880d681SAndroid Build Coastguard Worker  // Inst{83}    = MEGA_FETCH;
319*9880d681SAndroid Build Coastguard Worker  // Inst{84}    = ALT_CONST;
320*9880d681SAndroid Build Coastguard Worker  // Inst{86-85} = BUFFER_INDEX_MODE;
321*9880d681SAndroid Build Coastguard Worker  // Inst{95-86} = 0; Reserved
322*9880d681SAndroid Build Coastguard Worker
323*9880d681SAndroid Build Coastguard Worker  // VTX_WORD3 (Padding)
324*9880d681SAndroid Build Coastguard Worker  //
325*9880d681SAndroid Build Coastguard Worker  // Inst{127-96} = 0;
326*9880d681SAndroid Build Coastguard Worker
327*9880d681SAndroid Build Coastguard Worker  let VTXInst = 1;
328*9880d681SAndroid Build Coastguard Worker}
329*9880d681SAndroid Build Coastguard Worker
330*9880d681SAndroid Build Coastguard Workerclass LoadParamFrag <PatFrag load_type> : PatFrag <
331*9880d681SAndroid Build Coastguard Worker  (ops node:$ptr), (load_type node:$ptr),
332*9880d681SAndroid Build Coastguard Worker  [{ return isConstantLoad(cast<LoadSDNode>(N), 0) ||
333*9880d681SAndroid Build Coastguard Worker            (cast<LoadSDNode>(N)->getAddressSpace() == AMDGPUAS::PARAM_I_ADDRESS); }]
334*9880d681SAndroid Build Coastguard Worker>;
335*9880d681SAndroid Build Coastguard Worker
336*9880d681SAndroid Build Coastguard Workerdef load_param : LoadParamFrag<load>;
337*9880d681SAndroid Build Coastguard Workerdef load_param_exti8 : LoadParamFrag<az_extloadi8>;
338*9880d681SAndroid Build Coastguard Workerdef load_param_exti16 : LoadParamFrag<az_extloadi16>;
339*9880d681SAndroid Build Coastguard Worker
340*9880d681SAndroid Build Coastguard Workerclass LoadVtxId1 <PatFrag load> : PatFrag <
341*9880d681SAndroid Build Coastguard Worker  (ops node:$ptr), (load node:$ptr), [{
342*9880d681SAndroid Build Coastguard Worker  const MemSDNode *LD = cast<MemSDNode>(N);
343*9880d681SAndroid Build Coastguard Worker  return LD->getAddressSpace() == AMDGPUAS::GLOBAL_ADDRESS ||
344*9880d681SAndroid Build Coastguard Worker         (LD->getAddressSpace() == AMDGPUAS::CONSTANT_ADDRESS &&
345*9880d681SAndroid Build Coastguard Worker           !isa<GlobalValue>(GetUnderlyingObject(
346*9880d681SAndroid Build Coastguard Worker           LD->getMemOperand()->getValue(), CurDAG->getDataLayout())));
347*9880d681SAndroid Build Coastguard Worker}]>;
348*9880d681SAndroid Build Coastguard Worker
349*9880d681SAndroid Build Coastguard Workerdef vtx_id1_az_extloadi8 : LoadVtxId1 <az_extloadi8>;
350*9880d681SAndroid Build Coastguard Workerdef vtx_id1_az_extloadi16 : LoadVtxId1 <az_extloadi16>;
351*9880d681SAndroid Build Coastguard Workerdef vtx_id1_load : LoadVtxId1 <load>;
352*9880d681SAndroid Build Coastguard Worker
353*9880d681SAndroid Build Coastguard Workerclass LoadVtxId2 <PatFrag load> : PatFrag <
354*9880d681SAndroid Build Coastguard Worker  (ops node:$ptr), (load node:$ptr), [{
355*9880d681SAndroid Build Coastguard Worker  const MemSDNode *LD = cast<MemSDNode>(N);
356*9880d681SAndroid Build Coastguard Worker  return LD->getAddressSpace() == AMDGPUAS::CONSTANT_ADDRESS &&
357*9880d681SAndroid Build Coastguard Worker         isa<GlobalValue>(GetUnderlyingObject(
358*9880d681SAndroid Build Coastguard Worker         LD->getMemOperand()->getValue(), CurDAG->getDataLayout()));
359*9880d681SAndroid Build Coastguard Worker}]>;
360*9880d681SAndroid Build Coastguard Worker
361*9880d681SAndroid Build Coastguard Workerdef vtx_id2_az_extloadi8 : LoadVtxId2 <az_extloadi8>;
362*9880d681SAndroid Build Coastguard Workerdef vtx_id2_az_extloadi16 : LoadVtxId2 <az_extloadi16>;
363*9880d681SAndroid Build Coastguard Workerdef vtx_id2_load : LoadVtxId2 <load>;
364*9880d681SAndroid Build Coastguard Worker
365*9880d681SAndroid Build Coastguard Workerdef isR600 : Predicate<"Subtarget->getGeneration() <= R600Subtarget::R700">;
366*9880d681SAndroid Build Coastguard Worker
367*9880d681SAndroid Build Coastguard Workerdef isR600toCayman
368*9880d681SAndroid Build Coastguard Worker    : Predicate<
369*9880d681SAndroid Build Coastguard Worker          "Subtarget->getGeneration() <= R600Subtarget::NORTHERN_ISLANDS">;
370*9880d681SAndroid Build Coastguard Worker
371*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
372*9880d681SAndroid Build Coastguard Worker// R600 SDNodes
373*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
374*9880d681SAndroid Build Coastguard Worker
375*9880d681SAndroid Build Coastguard Workerdef INTERP_PAIR_XY :  AMDGPUShaderInst <
376*9880d681SAndroid Build Coastguard Worker  (outs R600_TReg32_X:$dst0, R600_TReg32_Y:$dst1),
377*9880d681SAndroid Build Coastguard Worker  (ins i32imm:$src0, R600_TReg32_Y:$src1, R600_TReg32_X:$src2),
378*9880d681SAndroid Build Coastguard Worker  "INTERP_PAIR_XY $src0 $src1 $src2 : $dst0 dst1",
379*9880d681SAndroid Build Coastguard Worker  []>;
380*9880d681SAndroid Build Coastguard Worker
381*9880d681SAndroid Build Coastguard Workerdef INTERP_PAIR_ZW :  AMDGPUShaderInst <
382*9880d681SAndroid Build Coastguard Worker  (outs R600_TReg32_Z:$dst0, R600_TReg32_W:$dst1),
383*9880d681SAndroid Build Coastguard Worker  (ins i32imm:$src0, R600_TReg32_Y:$src1, R600_TReg32_X:$src2),
384*9880d681SAndroid Build Coastguard Worker  "INTERP_PAIR_ZW $src0 $src1 $src2 : $dst0 dst1",
385*9880d681SAndroid Build Coastguard Worker  []>;
386*9880d681SAndroid Build Coastguard Worker
387*9880d681SAndroid Build Coastguard Workerdef CONST_ADDRESS: SDNode<"AMDGPUISD::CONST_ADDRESS",
388*9880d681SAndroid Build Coastguard Worker  SDTypeProfile<1, -1, [SDTCisInt<0>, SDTCisPtrTy<1>]>,
389*9880d681SAndroid Build Coastguard Worker  [SDNPVariadic]
390*9880d681SAndroid Build Coastguard Worker>;
391*9880d681SAndroid Build Coastguard Worker
392*9880d681SAndroid Build Coastguard Workerdef DOT4 : SDNode<"AMDGPUISD::DOT4",
393*9880d681SAndroid Build Coastguard Worker  SDTypeProfile<1, 8, [SDTCisFP<0>, SDTCisVT<1, f32>, SDTCisVT<2, f32>,
394*9880d681SAndroid Build Coastguard Worker      SDTCisVT<3, f32>, SDTCisVT<4, f32>, SDTCisVT<5, f32>,
395*9880d681SAndroid Build Coastguard Worker      SDTCisVT<6, f32>, SDTCisVT<7, f32>, SDTCisVT<8, f32>]>,
396*9880d681SAndroid Build Coastguard Worker  []
397*9880d681SAndroid Build Coastguard Worker>;
398*9880d681SAndroid Build Coastguard Worker
399*9880d681SAndroid Build Coastguard Workerdef COS_HW : SDNode<"AMDGPUISD::COS_HW",
400*9880d681SAndroid Build Coastguard Worker  SDTypeProfile<1, 1, [SDTCisFP<0>, SDTCisFP<1>]>
401*9880d681SAndroid Build Coastguard Worker>;
402*9880d681SAndroid Build Coastguard Worker
403*9880d681SAndroid Build Coastguard Workerdef SIN_HW : SDNode<"AMDGPUISD::SIN_HW",
404*9880d681SAndroid Build Coastguard Worker  SDTypeProfile<1, 1, [SDTCisFP<0>, SDTCisFP<1>]>
405*9880d681SAndroid Build Coastguard Worker>;
406*9880d681SAndroid Build Coastguard Worker
407*9880d681SAndroid Build Coastguard Workerdef TEXTURE_FETCH_Type : SDTypeProfile<1, 19, [SDTCisFP<0>]>;
408*9880d681SAndroid Build Coastguard Worker
409*9880d681SAndroid Build Coastguard Workerdef TEXTURE_FETCH: SDNode<"AMDGPUISD::TEXTURE_FETCH", TEXTURE_FETCH_Type, []>;
410*9880d681SAndroid Build Coastguard Worker
411*9880d681SAndroid Build Coastguard Workermulticlass TexPattern<bits<32> TextureOp, Instruction inst, ValueType vt = v4f32> {
412*9880d681SAndroid Build Coastguard Workerdef : Pat<(TEXTURE_FETCH (i32 TextureOp), vt:$SRC_GPR,
413*9880d681SAndroid Build Coastguard Worker          (i32 imm:$srcx), (i32 imm:$srcy), (i32 imm:$srcz), (i32 imm:$srcw),
414*9880d681SAndroid Build Coastguard Worker          (i32 imm:$offsetx), (i32 imm:$offsety), (i32 imm:$offsetz),
415*9880d681SAndroid Build Coastguard Worker          (i32 imm:$DST_SEL_X), (i32 imm:$DST_SEL_Y), (i32 imm:$DST_SEL_Z),
416*9880d681SAndroid Build Coastguard Worker          (i32 imm:$DST_SEL_W),
417*9880d681SAndroid Build Coastguard Worker          (i32 imm:$RESOURCE_ID), (i32 imm:$SAMPLER_ID),
418*9880d681SAndroid Build Coastguard Worker          (i32 imm:$COORD_TYPE_X), (i32 imm:$COORD_TYPE_Y), (i32 imm:$COORD_TYPE_Z),
419*9880d681SAndroid Build Coastguard Worker          (i32 imm:$COORD_TYPE_W)),
420*9880d681SAndroid Build Coastguard Worker          (inst R600_Reg128:$SRC_GPR,
421*9880d681SAndroid Build Coastguard Worker          imm:$srcx, imm:$srcy, imm:$srcz, imm:$srcw,
422*9880d681SAndroid Build Coastguard Worker          imm:$offsetx, imm:$offsety, imm:$offsetz,
423*9880d681SAndroid Build Coastguard Worker          imm:$DST_SEL_X, imm:$DST_SEL_Y, imm:$DST_SEL_Z,
424*9880d681SAndroid Build Coastguard Worker          imm:$DST_SEL_W,
425*9880d681SAndroid Build Coastguard Worker          imm:$RESOURCE_ID, imm:$SAMPLER_ID,
426*9880d681SAndroid Build Coastguard Worker          imm:$COORD_TYPE_X, imm:$COORD_TYPE_Y, imm:$COORD_TYPE_Z,
427*9880d681SAndroid Build Coastguard Worker          imm:$COORD_TYPE_W)>;
428*9880d681SAndroid Build Coastguard Worker}
429*9880d681SAndroid Build Coastguard Worker
430*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
431*9880d681SAndroid Build Coastguard Worker// Interpolation Instructions
432*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
433*9880d681SAndroid Build Coastguard Worker
434*9880d681SAndroid Build Coastguard Workerdef INTERP_VEC_LOAD :  AMDGPUShaderInst <
435*9880d681SAndroid Build Coastguard Worker  (outs R600_Reg128:$dst),
436*9880d681SAndroid Build Coastguard Worker  (ins i32imm:$src0),
437*9880d681SAndroid Build Coastguard Worker  "INTERP_LOAD $src0 : $dst">;
438*9880d681SAndroid Build Coastguard Worker
439*9880d681SAndroid Build Coastguard Workerdef INTERP_XY : R600_2OP <0xD6, "INTERP_XY", []> {
440*9880d681SAndroid Build Coastguard Worker  let bank_swizzle = 5;
441*9880d681SAndroid Build Coastguard Worker}
442*9880d681SAndroid Build Coastguard Worker
443*9880d681SAndroid Build Coastguard Workerdef INTERP_ZW : R600_2OP <0xD7, "INTERP_ZW", []> {
444*9880d681SAndroid Build Coastguard Worker  let bank_swizzle = 5;
445*9880d681SAndroid Build Coastguard Worker}
446*9880d681SAndroid Build Coastguard Worker
447*9880d681SAndroid Build Coastguard Workerdef INTERP_LOAD_P0 : R600_1OP <0xE0, "INTERP_LOAD_P0", []>;
448*9880d681SAndroid Build Coastguard Worker
449*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
450*9880d681SAndroid Build Coastguard Worker// Export Instructions
451*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
452*9880d681SAndroid Build Coastguard Worker
453*9880d681SAndroid Build Coastguard Workerdef ExportType : SDTypeProfile<0, 7, [SDTCisFP<0>, SDTCisInt<1>]>;
454*9880d681SAndroid Build Coastguard Worker
455*9880d681SAndroid Build Coastguard Workerdef EXPORT: SDNode<"AMDGPUISD::EXPORT", ExportType,
456*9880d681SAndroid Build Coastguard Worker  [SDNPHasChain, SDNPSideEffect]>;
457*9880d681SAndroid Build Coastguard Worker
458*9880d681SAndroid Build Coastguard Workerclass ExportWord0 {
459*9880d681SAndroid Build Coastguard Worker  field bits<32> Word0;
460*9880d681SAndroid Build Coastguard Worker
461*9880d681SAndroid Build Coastguard Worker  bits<13> arraybase;
462*9880d681SAndroid Build Coastguard Worker  bits<2> type;
463*9880d681SAndroid Build Coastguard Worker  bits<7> gpr;
464*9880d681SAndroid Build Coastguard Worker  bits<2> elem_size;
465*9880d681SAndroid Build Coastguard Worker
466*9880d681SAndroid Build Coastguard Worker  let Word0{12-0} = arraybase;
467*9880d681SAndroid Build Coastguard Worker  let Word0{14-13} = type;
468*9880d681SAndroid Build Coastguard Worker  let Word0{21-15} = gpr;
469*9880d681SAndroid Build Coastguard Worker  let Word0{22} = 0; // RW_REL
470*9880d681SAndroid Build Coastguard Worker  let Word0{29-23} = 0; // INDEX_GPR
471*9880d681SAndroid Build Coastguard Worker  let Word0{31-30} = elem_size;
472*9880d681SAndroid Build Coastguard Worker}
473*9880d681SAndroid Build Coastguard Worker
474*9880d681SAndroid Build Coastguard Workerclass ExportSwzWord1 {
475*9880d681SAndroid Build Coastguard Worker  field bits<32> Word1;
476*9880d681SAndroid Build Coastguard Worker
477*9880d681SAndroid Build Coastguard Worker  bits<3> sw_x;
478*9880d681SAndroid Build Coastguard Worker  bits<3> sw_y;
479*9880d681SAndroid Build Coastguard Worker  bits<3> sw_z;
480*9880d681SAndroid Build Coastguard Worker  bits<3> sw_w;
481*9880d681SAndroid Build Coastguard Worker  bits<1> eop;
482*9880d681SAndroid Build Coastguard Worker  bits<8> inst;
483*9880d681SAndroid Build Coastguard Worker
484*9880d681SAndroid Build Coastguard Worker  let Word1{2-0} = sw_x;
485*9880d681SAndroid Build Coastguard Worker  let Word1{5-3} = sw_y;
486*9880d681SAndroid Build Coastguard Worker  let Word1{8-6} = sw_z;
487*9880d681SAndroid Build Coastguard Worker  let Word1{11-9} = sw_w;
488*9880d681SAndroid Build Coastguard Worker}
489*9880d681SAndroid Build Coastguard Worker
490*9880d681SAndroid Build Coastguard Workerclass ExportBufWord1 {
491*9880d681SAndroid Build Coastguard Worker  field bits<32> Word1;
492*9880d681SAndroid Build Coastguard Worker
493*9880d681SAndroid Build Coastguard Worker  bits<12> arraySize;
494*9880d681SAndroid Build Coastguard Worker  bits<4> compMask;
495*9880d681SAndroid Build Coastguard Worker  bits<1> eop;
496*9880d681SAndroid Build Coastguard Worker  bits<8> inst;
497*9880d681SAndroid Build Coastguard Worker
498*9880d681SAndroid Build Coastguard Worker  let Word1{11-0} = arraySize;
499*9880d681SAndroid Build Coastguard Worker  let Word1{15-12} = compMask;
500*9880d681SAndroid Build Coastguard Worker}
501*9880d681SAndroid Build Coastguard Worker
502*9880d681SAndroid Build Coastguard Workermulticlass ExportPattern<Instruction ExportInst, bits<8> cf_inst> {
503*9880d681SAndroid Build Coastguard Worker  def : Pat<(EXPORT (v4f32 R600_Reg128:$src), (i32 imm:$base), (i32 imm:$type),
504*9880d681SAndroid Build Coastguard Worker    (i32 imm:$swz_x), (i32 imm:$swz_y), (i32 imm:$swz_z), (i32 imm:$swz_w)),
505*9880d681SAndroid Build Coastguard Worker        (ExportInst R600_Reg128:$src, imm:$type, imm:$base,
506*9880d681SAndroid Build Coastguard Worker        imm:$swz_x, imm:$swz_y, imm:$swz_z, imm:$swz_w, cf_inst, 0)
507*9880d681SAndroid Build Coastguard Worker  >;
508*9880d681SAndroid Build Coastguard Worker
509*9880d681SAndroid Build Coastguard Worker}
510*9880d681SAndroid Build Coastguard Worker
511*9880d681SAndroid Build Coastguard Workermulticlass SteamOutputExportPattern<Instruction ExportInst,
512*9880d681SAndroid Build Coastguard Worker    bits<8> buf0inst, bits<8> buf1inst, bits<8> buf2inst, bits<8> buf3inst> {
513*9880d681SAndroid Build Coastguard Worker// Stream0
514*9880d681SAndroid Build Coastguard Worker  def : Pat<(int_R600_store_stream_output (v4f32 R600_Reg128:$src),
515*9880d681SAndroid Build Coastguard Worker      (i32 imm:$arraybase), (i32 0), (i32 imm:$mask)),
516*9880d681SAndroid Build Coastguard Worker      (ExportInst R600_Reg128:$src, 0, imm:$arraybase,
517*9880d681SAndroid Build Coastguard Worker      4095, imm:$mask, buf0inst, 0)>;
518*9880d681SAndroid Build Coastguard Worker// Stream1
519*9880d681SAndroid Build Coastguard Worker  def : Pat<(int_R600_store_stream_output (v4f32 R600_Reg128:$src),
520*9880d681SAndroid Build Coastguard Worker      (i32 imm:$arraybase), (i32 1), (i32 imm:$mask)),
521*9880d681SAndroid Build Coastguard Worker      (ExportInst $src, 0, imm:$arraybase,
522*9880d681SAndroid Build Coastguard Worker      4095, imm:$mask, buf1inst, 0)>;
523*9880d681SAndroid Build Coastguard Worker// Stream2
524*9880d681SAndroid Build Coastguard Worker  def : Pat<(int_R600_store_stream_output (v4f32 R600_Reg128:$src),
525*9880d681SAndroid Build Coastguard Worker      (i32 imm:$arraybase), (i32 2), (i32 imm:$mask)),
526*9880d681SAndroid Build Coastguard Worker      (ExportInst $src, 0, imm:$arraybase,
527*9880d681SAndroid Build Coastguard Worker      4095, imm:$mask, buf2inst, 0)>;
528*9880d681SAndroid Build Coastguard Worker// Stream3
529*9880d681SAndroid Build Coastguard Worker  def : Pat<(int_R600_store_stream_output (v4f32 R600_Reg128:$src),
530*9880d681SAndroid Build Coastguard Worker      (i32 imm:$arraybase), (i32 3), (i32 imm:$mask)),
531*9880d681SAndroid Build Coastguard Worker      (ExportInst $src, 0, imm:$arraybase,
532*9880d681SAndroid Build Coastguard Worker      4095, imm:$mask, buf3inst, 0)>;
533*9880d681SAndroid Build Coastguard Worker}
534*9880d681SAndroid Build Coastguard Worker
535*9880d681SAndroid Build Coastguard Worker// Export Instructions should not be duplicated by TailDuplication pass
536*9880d681SAndroid Build Coastguard Worker// (which assumes that duplicable instruction are affected by exec mask)
537*9880d681SAndroid Build Coastguard Workerlet usesCustomInserter = 1, isNotDuplicable = 1 in {
538*9880d681SAndroid Build Coastguard Worker
539*9880d681SAndroid Build Coastguard Workerclass ExportSwzInst : InstR600ISA<(
540*9880d681SAndroid Build Coastguard Worker    outs),
541*9880d681SAndroid Build Coastguard Worker    (ins R600_Reg128:$gpr, i32imm:$type, i32imm:$arraybase,
542*9880d681SAndroid Build Coastguard Worker    RSel:$sw_x, RSel:$sw_y, RSel:$sw_z, RSel:$sw_w, i32imm:$inst,
543*9880d681SAndroid Build Coastguard Worker    i32imm:$eop),
544*9880d681SAndroid Build Coastguard Worker    !strconcat("EXPORT", " $gpr.$sw_x$sw_y$sw_z$sw_w"),
545*9880d681SAndroid Build Coastguard Worker    []>, ExportWord0, ExportSwzWord1 {
546*9880d681SAndroid Build Coastguard Worker  let elem_size = 3;
547*9880d681SAndroid Build Coastguard Worker  let Inst{31-0} = Word0;
548*9880d681SAndroid Build Coastguard Worker  let Inst{63-32} = Word1;
549*9880d681SAndroid Build Coastguard Worker  let IsExport = 1;
550*9880d681SAndroid Build Coastguard Worker}
551*9880d681SAndroid Build Coastguard Worker
552*9880d681SAndroid Build Coastguard Worker} // End usesCustomInserter = 1
553*9880d681SAndroid Build Coastguard Worker
554*9880d681SAndroid Build Coastguard Workerclass ExportBufInst : InstR600ISA<(
555*9880d681SAndroid Build Coastguard Worker    outs),
556*9880d681SAndroid Build Coastguard Worker    (ins R600_Reg128:$gpr, i32imm:$type, i32imm:$arraybase,
557*9880d681SAndroid Build Coastguard Worker    i32imm:$arraySize, i32imm:$compMask, i32imm:$inst, i32imm:$eop),
558*9880d681SAndroid Build Coastguard Worker    !strconcat("EXPORT", " $gpr"),
559*9880d681SAndroid Build Coastguard Worker    []>, ExportWord0, ExportBufWord1 {
560*9880d681SAndroid Build Coastguard Worker  let elem_size = 0;
561*9880d681SAndroid Build Coastguard Worker  let Inst{31-0} = Word0;
562*9880d681SAndroid Build Coastguard Worker  let Inst{63-32} = Word1;
563*9880d681SAndroid Build Coastguard Worker  let IsExport = 1;
564*9880d681SAndroid Build Coastguard Worker}
565*9880d681SAndroid Build Coastguard Worker
566*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
567*9880d681SAndroid Build Coastguard Worker// Control Flow Instructions
568*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
569*9880d681SAndroid Build Coastguard Worker
570*9880d681SAndroid Build Coastguard Worker
571*9880d681SAndroid Build Coastguard Workerdef KCACHE : InstFlag<"printKCache">;
572*9880d681SAndroid Build Coastguard Worker
573*9880d681SAndroid Build Coastguard Workerclass ALU_CLAUSE<bits<4> inst, string OpName> : AMDGPUInst <(outs),
574*9880d681SAndroid Build Coastguard Worker(ins i32imm:$ADDR, i32imm:$KCACHE_BANK0, i32imm:$KCACHE_BANK1,
575*9880d681SAndroid Build Coastguard WorkerKCACHE:$KCACHE_MODE0, KCACHE:$KCACHE_MODE1,
576*9880d681SAndroid Build Coastguard Workeri32imm:$KCACHE_ADDR0, i32imm:$KCACHE_ADDR1,
577*9880d681SAndroid Build Coastguard Workeri32imm:$COUNT, i32imm:$Enabled),
578*9880d681SAndroid Build Coastguard Worker!strconcat(OpName, " $COUNT, @$ADDR, "
579*9880d681SAndroid Build Coastguard Worker"KC0[$KCACHE_MODE0], KC1[$KCACHE_MODE1]"),
580*9880d681SAndroid Build Coastguard Worker[] >, CF_ALU_WORD0, CF_ALU_WORD1 {
581*9880d681SAndroid Build Coastguard Worker  field bits<64> Inst;
582*9880d681SAndroid Build Coastguard Worker
583*9880d681SAndroid Build Coastguard Worker  let CF_INST = inst;
584*9880d681SAndroid Build Coastguard Worker  let ALT_CONST = 0;
585*9880d681SAndroid Build Coastguard Worker  let WHOLE_QUAD_MODE = 0;
586*9880d681SAndroid Build Coastguard Worker  let BARRIER = 1;
587*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1;
588*9880d681SAndroid Build Coastguard Worker  let UseNamedOperandTable = 1;
589*9880d681SAndroid Build Coastguard Worker
590*9880d681SAndroid Build Coastguard Worker  let Inst{31-0} = Word0;
591*9880d681SAndroid Build Coastguard Worker  let Inst{63-32} = Word1;
592*9880d681SAndroid Build Coastguard Worker}
593*9880d681SAndroid Build Coastguard Worker
594*9880d681SAndroid Build Coastguard Workerclass CF_WORD0_R600 {
595*9880d681SAndroid Build Coastguard Worker  field bits<32> Word0;
596*9880d681SAndroid Build Coastguard Worker
597*9880d681SAndroid Build Coastguard Worker  bits<32> ADDR;
598*9880d681SAndroid Build Coastguard Worker
599*9880d681SAndroid Build Coastguard Worker  let Word0 = ADDR;
600*9880d681SAndroid Build Coastguard Worker}
601*9880d681SAndroid Build Coastguard Worker
602*9880d681SAndroid Build Coastguard Workerclass CF_CLAUSE_R600 <bits<7> inst, dag ins, string AsmPrint> : AMDGPUInst <(outs),
603*9880d681SAndroid Build Coastguard Workerins, AsmPrint, [] >, CF_WORD0_R600, CF_WORD1_R600 {
604*9880d681SAndroid Build Coastguard Worker  field bits<64> Inst;
605*9880d681SAndroid Build Coastguard Worker  bits<4> CNT;
606*9880d681SAndroid Build Coastguard Worker
607*9880d681SAndroid Build Coastguard Worker  let CF_INST = inst;
608*9880d681SAndroid Build Coastguard Worker  let BARRIER = 1;
609*9880d681SAndroid Build Coastguard Worker  let CF_CONST = 0;
610*9880d681SAndroid Build Coastguard Worker  let VALID_PIXEL_MODE = 0;
611*9880d681SAndroid Build Coastguard Worker  let COND = 0;
612*9880d681SAndroid Build Coastguard Worker  let COUNT = CNT{2-0};
613*9880d681SAndroid Build Coastguard Worker  let CALL_COUNT = 0;
614*9880d681SAndroid Build Coastguard Worker  let COUNT_3 = CNT{3};
615*9880d681SAndroid Build Coastguard Worker  let END_OF_PROGRAM = 0;
616*9880d681SAndroid Build Coastguard Worker  let WHOLE_QUAD_MODE = 0;
617*9880d681SAndroid Build Coastguard Worker
618*9880d681SAndroid Build Coastguard Worker  let Inst{31-0} = Word0;
619*9880d681SAndroid Build Coastguard Worker  let Inst{63-32} = Word1;
620*9880d681SAndroid Build Coastguard Worker}
621*9880d681SAndroid Build Coastguard Worker
622*9880d681SAndroid Build Coastguard Workerclass CF_CLAUSE_EG <bits<8> inst, dag ins, string AsmPrint> : AMDGPUInst <(outs),
623*9880d681SAndroid Build Coastguard Workerins, AsmPrint, [] >, CF_WORD0_EG, CF_WORD1_EG {
624*9880d681SAndroid Build Coastguard Worker  field bits<64> Inst;
625*9880d681SAndroid Build Coastguard Worker
626*9880d681SAndroid Build Coastguard Worker  let CF_INST = inst;
627*9880d681SAndroid Build Coastguard Worker  let BARRIER = 1;
628*9880d681SAndroid Build Coastguard Worker  let JUMPTABLE_SEL = 0;
629*9880d681SAndroid Build Coastguard Worker  let CF_CONST = 0;
630*9880d681SAndroid Build Coastguard Worker  let VALID_PIXEL_MODE = 0;
631*9880d681SAndroid Build Coastguard Worker  let COND = 0;
632*9880d681SAndroid Build Coastguard Worker  let END_OF_PROGRAM = 0;
633*9880d681SAndroid Build Coastguard Worker
634*9880d681SAndroid Build Coastguard Worker  let Inst{31-0} = Word0;
635*9880d681SAndroid Build Coastguard Worker  let Inst{63-32} = Word1;
636*9880d681SAndroid Build Coastguard Worker}
637*9880d681SAndroid Build Coastguard Worker
638*9880d681SAndroid Build Coastguard Workerdef CF_ALU : ALU_CLAUSE<8, "ALU">;
639*9880d681SAndroid Build Coastguard Workerdef CF_ALU_PUSH_BEFORE : ALU_CLAUSE<9, "ALU_PUSH_BEFORE">;
640*9880d681SAndroid Build Coastguard Workerdef CF_ALU_POP_AFTER : ALU_CLAUSE<10, "ALU_POP_AFTER">;
641*9880d681SAndroid Build Coastguard Workerdef CF_ALU_CONTINUE : ALU_CLAUSE<13, "ALU_CONTINUE">;
642*9880d681SAndroid Build Coastguard Workerdef CF_ALU_BREAK : ALU_CLAUSE<14, "ALU_BREAK">;
643*9880d681SAndroid Build Coastguard Workerdef CF_ALU_ELSE_AFTER : ALU_CLAUSE<15, "ALU_ELSE_AFTER">;
644*9880d681SAndroid Build Coastguard Worker
645*9880d681SAndroid Build Coastguard Workerdef FETCH_CLAUSE : AMDGPUInst <(outs),
646*9880d681SAndroid Build Coastguard Worker(ins i32imm:$addr), "Fetch clause starting at $addr:", [] > {
647*9880d681SAndroid Build Coastguard Worker  field bits<8> Inst;
648*9880d681SAndroid Build Coastguard Worker  bits<8> num;
649*9880d681SAndroid Build Coastguard Worker  let Inst = num;
650*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1;
651*9880d681SAndroid Build Coastguard Worker}
652*9880d681SAndroid Build Coastguard Worker
653*9880d681SAndroid Build Coastguard Workerdef ALU_CLAUSE : AMDGPUInst <(outs),
654*9880d681SAndroid Build Coastguard Worker(ins i32imm:$addr), "ALU clause starting at $addr:", [] > {
655*9880d681SAndroid Build Coastguard Worker  field bits<8> Inst;
656*9880d681SAndroid Build Coastguard Worker  bits<8> num;
657*9880d681SAndroid Build Coastguard Worker  let Inst = num;
658*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1;
659*9880d681SAndroid Build Coastguard Worker}
660*9880d681SAndroid Build Coastguard Worker
661*9880d681SAndroid Build Coastguard Workerdef LITERALS : AMDGPUInst <(outs),
662*9880d681SAndroid Build Coastguard Worker(ins LITERAL:$literal1, LITERAL:$literal2), "$literal1, $literal2", [] > {
663*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1;
664*9880d681SAndroid Build Coastguard Worker
665*9880d681SAndroid Build Coastguard Worker  field bits<64> Inst;
666*9880d681SAndroid Build Coastguard Worker  bits<32> literal1;
667*9880d681SAndroid Build Coastguard Worker  bits<32> literal2;
668*9880d681SAndroid Build Coastguard Worker
669*9880d681SAndroid Build Coastguard Worker  let Inst{31-0} = literal1;
670*9880d681SAndroid Build Coastguard Worker  let Inst{63-32} = literal2;
671*9880d681SAndroid Build Coastguard Worker}
672*9880d681SAndroid Build Coastguard Worker
673*9880d681SAndroid Build Coastguard Workerdef PAD : AMDGPUInst <(outs), (ins), "PAD", [] > {
674*9880d681SAndroid Build Coastguard Worker  field bits<64> Inst;
675*9880d681SAndroid Build Coastguard Worker}
676*9880d681SAndroid Build Coastguard Worker
677*9880d681SAndroid Build Coastguard Workerlet Predicates = [isR600toCayman] in {
678*9880d681SAndroid Build Coastguard Worker
679*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
680*9880d681SAndroid Build Coastguard Worker// Common Instructions R600, R700, Evergreen, Cayman
681*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
682*9880d681SAndroid Build Coastguard Worker
683*9880d681SAndroid Build Coastguard Workerdef ADD : R600_2OP_Helper <0x0, "ADD", fadd>;
684*9880d681SAndroid Build Coastguard Worker// Non-IEEE MUL: 0 * anything = 0
685*9880d681SAndroid Build Coastguard Workerdef MUL : R600_2OP_Helper <0x1, "MUL NON-IEEE">;
686*9880d681SAndroid Build Coastguard Workerdef MUL_IEEE : R600_2OP_Helper <0x2, "MUL_IEEE", fmul>;
687*9880d681SAndroid Build Coastguard Worker// TODO: Do these actually match the regular fmin/fmax behavior?
688*9880d681SAndroid Build Coastguard Workerdef MAX : R600_2OP_Helper <0x3, "MAX", AMDGPUfmax_legacy>;
689*9880d681SAndroid Build Coastguard Workerdef MIN : R600_2OP_Helper <0x4, "MIN", AMDGPUfmin_legacy>;
690*9880d681SAndroid Build Coastguard Worker// According to https://msdn.microsoft.com/en-us/library/windows/desktop/cc308050%28v=vs.85%29.aspx
691*9880d681SAndroid Build Coastguard Worker// DX10 min/max returns the other operand if one is NaN,
692*9880d681SAndroid Build Coastguard Worker// this matches http://llvm.org/docs/LangRef.html#llvm-minnum-intrinsic
693*9880d681SAndroid Build Coastguard Workerdef MAX_DX10 : R600_2OP_Helper <0x5, "MAX_DX10", fmaxnum>;
694*9880d681SAndroid Build Coastguard Workerdef MIN_DX10 : R600_2OP_Helper <0x6, "MIN_DX10", fminnum>;
695*9880d681SAndroid Build Coastguard Worker
696*9880d681SAndroid Build Coastguard Worker// For the SET* instructions there is a naming conflict in TargetSelectionDAG.td,
697*9880d681SAndroid Build Coastguard Worker// so some of the instruction names don't match the asm string.
698*9880d681SAndroid Build Coastguard Worker// XXX: Use the defs in TargetSelectionDAG.td instead of intrinsics.
699*9880d681SAndroid Build Coastguard Workerdef SETE : R600_2OP <
700*9880d681SAndroid Build Coastguard Worker  0x08, "SETE",
701*9880d681SAndroid Build Coastguard Worker  [(set f32:$dst, (selectcc f32:$src0, f32:$src1, FP_ONE, FP_ZERO, COND_OEQ))]
702*9880d681SAndroid Build Coastguard Worker>;
703*9880d681SAndroid Build Coastguard Worker
704*9880d681SAndroid Build Coastguard Workerdef SGT : R600_2OP <
705*9880d681SAndroid Build Coastguard Worker  0x09, "SETGT",
706*9880d681SAndroid Build Coastguard Worker  [(set f32:$dst, (selectcc f32:$src0, f32:$src1, FP_ONE, FP_ZERO, COND_OGT))]
707*9880d681SAndroid Build Coastguard Worker>;
708*9880d681SAndroid Build Coastguard Worker
709*9880d681SAndroid Build Coastguard Workerdef SGE : R600_2OP <
710*9880d681SAndroid Build Coastguard Worker  0xA, "SETGE",
711*9880d681SAndroid Build Coastguard Worker  [(set f32:$dst, (selectcc f32:$src0, f32:$src1, FP_ONE, FP_ZERO, COND_OGE))]
712*9880d681SAndroid Build Coastguard Worker>;
713*9880d681SAndroid Build Coastguard Worker
714*9880d681SAndroid Build Coastguard Workerdef SNE : R600_2OP <
715*9880d681SAndroid Build Coastguard Worker  0xB, "SETNE",
716*9880d681SAndroid Build Coastguard Worker  [(set f32:$dst, (selectcc f32:$src0, f32:$src1, FP_ONE, FP_ZERO, COND_UNE_NE))]
717*9880d681SAndroid Build Coastguard Worker>;
718*9880d681SAndroid Build Coastguard Worker
719*9880d681SAndroid Build Coastguard Workerdef SETE_DX10 : R600_2OP <
720*9880d681SAndroid Build Coastguard Worker  0xC, "SETE_DX10",
721*9880d681SAndroid Build Coastguard Worker  [(set i32:$dst, (selectcc f32:$src0, f32:$src1, -1, 0, COND_OEQ))]
722*9880d681SAndroid Build Coastguard Worker>;
723*9880d681SAndroid Build Coastguard Worker
724*9880d681SAndroid Build Coastguard Workerdef SETGT_DX10 : R600_2OP <
725*9880d681SAndroid Build Coastguard Worker  0xD, "SETGT_DX10",
726*9880d681SAndroid Build Coastguard Worker  [(set i32:$dst, (selectcc f32:$src0, f32:$src1, -1, 0, COND_OGT))]
727*9880d681SAndroid Build Coastguard Worker>;
728*9880d681SAndroid Build Coastguard Worker
729*9880d681SAndroid Build Coastguard Workerdef SETGE_DX10 : R600_2OP <
730*9880d681SAndroid Build Coastguard Worker  0xE, "SETGE_DX10",
731*9880d681SAndroid Build Coastguard Worker  [(set i32:$dst, (selectcc f32:$src0, f32:$src1, -1, 0, COND_OGE))]
732*9880d681SAndroid Build Coastguard Worker>;
733*9880d681SAndroid Build Coastguard Worker
734*9880d681SAndroid Build Coastguard Worker// FIXME: This should probably be COND_ONE
735*9880d681SAndroid Build Coastguard Workerdef SETNE_DX10 : R600_2OP <
736*9880d681SAndroid Build Coastguard Worker  0xF, "SETNE_DX10",
737*9880d681SAndroid Build Coastguard Worker  [(set i32:$dst, (selectcc f32:$src0, f32:$src1, -1, 0, COND_UNE_NE))]
738*9880d681SAndroid Build Coastguard Worker>;
739*9880d681SAndroid Build Coastguard Worker
740*9880d681SAndroid Build Coastguard Worker// FIXME: Need combine for AMDGPUfract
741*9880d681SAndroid Build Coastguard Workerdef FRACT : R600_1OP_Helper <0x10, "FRACT", AMDGPUfract>;
742*9880d681SAndroid Build Coastguard Workerdef TRUNC : R600_1OP_Helper <0x11, "TRUNC", ftrunc>;
743*9880d681SAndroid Build Coastguard Workerdef CEIL : R600_1OP_Helper <0x12, "CEIL", fceil>;
744*9880d681SAndroid Build Coastguard Workerdef RNDNE : R600_1OP_Helper <0x13, "RNDNE", frint>;
745*9880d681SAndroid Build Coastguard Workerdef FLOOR : R600_1OP_Helper <0x14, "FLOOR", ffloor>;
746*9880d681SAndroid Build Coastguard Worker
747*9880d681SAndroid Build Coastguard Workerdef MOV : R600_1OP <0x19, "MOV", []>;
748*9880d681SAndroid Build Coastguard Worker
749*9880d681SAndroid Build Coastguard Workerlet isPseudo = 1, isCodeGenOnly = 1, usesCustomInserter = 1 in {
750*9880d681SAndroid Build Coastguard Worker
751*9880d681SAndroid Build Coastguard Workerclass MOV_IMM <ValueType vt, Operand immType> : AMDGPUInst <
752*9880d681SAndroid Build Coastguard Worker  (outs R600_Reg32:$dst),
753*9880d681SAndroid Build Coastguard Worker  (ins immType:$imm),
754*9880d681SAndroid Build Coastguard Worker  "",
755*9880d681SAndroid Build Coastguard Worker  []
756*9880d681SAndroid Build Coastguard Worker>;
757*9880d681SAndroid Build Coastguard Worker
758*9880d681SAndroid Build Coastguard Worker} // end let isPseudo = 1, isCodeGenOnly = 1, usesCustomInserter = 1
759*9880d681SAndroid Build Coastguard Worker
760*9880d681SAndroid Build Coastguard Workerdef MOV_IMM_I32 : MOV_IMM<i32, i32imm>;
761*9880d681SAndroid Build Coastguard Workerdef : Pat <
762*9880d681SAndroid Build Coastguard Worker  (imm:$val),
763*9880d681SAndroid Build Coastguard Worker  (MOV_IMM_I32 imm:$val)
764*9880d681SAndroid Build Coastguard Worker>;
765*9880d681SAndroid Build Coastguard Worker
766*9880d681SAndroid Build Coastguard Workerdef MOV_IMM_GLOBAL_ADDR : MOV_IMM<iPTR, i32imm>;
767*9880d681SAndroid Build Coastguard Workerdef : Pat <
768*9880d681SAndroid Build Coastguard Worker  (AMDGPUconstdata_ptr tglobaladdr:$addr),
769*9880d681SAndroid Build Coastguard Worker  (MOV_IMM_GLOBAL_ADDR tglobaladdr:$addr)
770*9880d681SAndroid Build Coastguard Worker>;
771*9880d681SAndroid Build Coastguard Worker
772*9880d681SAndroid Build Coastguard Worker
773*9880d681SAndroid Build Coastguard Workerdef MOV_IMM_F32 : MOV_IMM<f32, f32imm>;
774*9880d681SAndroid Build Coastguard Workerdef : Pat <
775*9880d681SAndroid Build Coastguard Worker  (fpimm:$val),
776*9880d681SAndroid Build Coastguard Worker  (MOV_IMM_F32  fpimm:$val)
777*9880d681SAndroid Build Coastguard Worker>;
778*9880d681SAndroid Build Coastguard Worker
779*9880d681SAndroid Build Coastguard Workerdef PRED_SETE : R600_2OP <0x20, "PRED_SETE", []>;
780*9880d681SAndroid Build Coastguard Workerdef PRED_SETGT : R600_2OP <0x21, "PRED_SETGT", []>;
781*9880d681SAndroid Build Coastguard Workerdef PRED_SETGE : R600_2OP <0x22, "PRED_SETGE", []>;
782*9880d681SAndroid Build Coastguard Workerdef PRED_SETNE : R600_2OP <0x23, "PRED_SETNE", []>;
783*9880d681SAndroid Build Coastguard Worker
784*9880d681SAndroid Build Coastguard Workerlet hasSideEffects = 1 in {
785*9880d681SAndroid Build Coastguard Worker
786*9880d681SAndroid Build Coastguard Workerdef KILLGT : R600_2OP <0x2D, "KILLGT", []>;
787*9880d681SAndroid Build Coastguard Worker
788*9880d681SAndroid Build Coastguard Worker} // end hasSideEffects
789*9880d681SAndroid Build Coastguard Worker
790*9880d681SAndroid Build Coastguard Workerdef AND_INT : R600_2OP_Helper <0x30, "AND_INT", and>;
791*9880d681SAndroid Build Coastguard Workerdef OR_INT : R600_2OP_Helper <0x31, "OR_INT", or>;
792*9880d681SAndroid Build Coastguard Workerdef XOR_INT : R600_2OP_Helper <0x32, "XOR_INT", xor>;
793*9880d681SAndroid Build Coastguard Workerdef NOT_INT : R600_1OP_Helper <0x33, "NOT_INT", not>;
794*9880d681SAndroid Build Coastguard Workerdef ADD_INT : R600_2OP_Helper <0x34, "ADD_INT", add>;
795*9880d681SAndroid Build Coastguard Workerdef SUB_INT : R600_2OP_Helper <0x35, "SUB_INT", sub>;
796*9880d681SAndroid Build Coastguard Workerdef MAX_INT : R600_2OP_Helper <0x36, "MAX_INT", smax>;
797*9880d681SAndroid Build Coastguard Workerdef MIN_INT : R600_2OP_Helper <0x37, "MIN_INT", smin>;
798*9880d681SAndroid Build Coastguard Workerdef MAX_UINT : R600_2OP_Helper <0x38, "MAX_UINT", umax>;
799*9880d681SAndroid Build Coastguard Workerdef MIN_UINT : R600_2OP_Helper <0x39, "MIN_UINT", umin>;
800*9880d681SAndroid Build Coastguard Worker
801*9880d681SAndroid Build Coastguard Workerdef SETE_INT : R600_2OP <
802*9880d681SAndroid Build Coastguard Worker  0x3A, "SETE_INT",
803*9880d681SAndroid Build Coastguard Worker  [(set i32:$dst, (selectcc i32:$src0, i32:$src1, -1, 0, SETEQ))]
804*9880d681SAndroid Build Coastguard Worker>;
805*9880d681SAndroid Build Coastguard Worker
806*9880d681SAndroid Build Coastguard Workerdef SETGT_INT : R600_2OP <
807*9880d681SAndroid Build Coastguard Worker  0x3B, "SETGT_INT",
808*9880d681SAndroid Build Coastguard Worker  [(set i32:$dst, (selectcc i32:$src0, i32:$src1, -1, 0, SETGT))]
809*9880d681SAndroid Build Coastguard Worker>;
810*9880d681SAndroid Build Coastguard Worker
811*9880d681SAndroid Build Coastguard Workerdef SETGE_INT : R600_2OP <
812*9880d681SAndroid Build Coastguard Worker  0x3C, "SETGE_INT",
813*9880d681SAndroid Build Coastguard Worker  [(set i32:$dst, (selectcc i32:$src0, i32:$src1, -1, 0, SETGE))]
814*9880d681SAndroid Build Coastguard Worker>;
815*9880d681SAndroid Build Coastguard Worker
816*9880d681SAndroid Build Coastguard Workerdef SETNE_INT : R600_2OP <
817*9880d681SAndroid Build Coastguard Worker  0x3D, "SETNE_INT",
818*9880d681SAndroid Build Coastguard Worker  [(set i32:$dst, (selectcc i32:$src0, i32:$src1, -1, 0, SETNE))]
819*9880d681SAndroid Build Coastguard Worker>;
820*9880d681SAndroid Build Coastguard Worker
821*9880d681SAndroid Build Coastguard Workerdef SETGT_UINT : R600_2OP <
822*9880d681SAndroid Build Coastguard Worker  0x3E, "SETGT_UINT",
823*9880d681SAndroid Build Coastguard Worker  [(set i32:$dst, (selectcc i32:$src0, i32:$src1, -1, 0, SETUGT))]
824*9880d681SAndroid Build Coastguard Worker>;
825*9880d681SAndroid Build Coastguard Worker
826*9880d681SAndroid Build Coastguard Workerdef SETGE_UINT : R600_2OP <
827*9880d681SAndroid Build Coastguard Worker  0x3F, "SETGE_UINT",
828*9880d681SAndroid Build Coastguard Worker  [(set i32:$dst, (selectcc i32:$src0, i32:$src1, -1, 0, SETUGE))]
829*9880d681SAndroid Build Coastguard Worker>;
830*9880d681SAndroid Build Coastguard Worker
831*9880d681SAndroid Build Coastguard Workerdef PRED_SETE_INT : R600_2OP <0x42, "PRED_SETE_INT", []>;
832*9880d681SAndroid Build Coastguard Workerdef PRED_SETGT_INT : R600_2OP <0x43, "PRED_SETGE_INT", []>;
833*9880d681SAndroid Build Coastguard Workerdef PRED_SETGE_INT : R600_2OP <0x44, "PRED_SETGE_INT", []>;
834*9880d681SAndroid Build Coastguard Workerdef PRED_SETNE_INT : R600_2OP <0x45, "PRED_SETNE_INT", []>;
835*9880d681SAndroid Build Coastguard Worker
836*9880d681SAndroid Build Coastguard Workerdef CNDE_INT : R600_3OP <
837*9880d681SAndroid Build Coastguard Worker  0x1C, "CNDE_INT",
838*9880d681SAndroid Build Coastguard Worker  [(set i32:$dst, (selectcc i32:$src0, 0, i32:$src1, i32:$src2, COND_EQ))]
839*9880d681SAndroid Build Coastguard Worker>;
840*9880d681SAndroid Build Coastguard Worker
841*9880d681SAndroid Build Coastguard Workerdef CNDGE_INT : R600_3OP <
842*9880d681SAndroid Build Coastguard Worker  0x1E, "CNDGE_INT",
843*9880d681SAndroid Build Coastguard Worker  [(set i32:$dst, (selectcc i32:$src0, 0, i32:$src1, i32:$src2, COND_SGE))]
844*9880d681SAndroid Build Coastguard Worker>;
845*9880d681SAndroid Build Coastguard Worker
846*9880d681SAndroid Build Coastguard Workerdef CNDGT_INT : R600_3OP <
847*9880d681SAndroid Build Coastguard Worker  0x1D, "CNDGT_INT",
848*9880d681SAndroid Build Coastguard Worker  [(set i32:$dst, (selectcc i32:$src0, 0, i32:$src1, i32:$src2, COND_SGT))]
849*9880d681SAndroid Build Coastguard Worker>;
850*9880d681SAndroid Build Coastguard Worker
851*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
852*9880d681SAndroid Build Coastguard Worker// Texture instructions
853*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
854*9880d681SAndroid Build Coastguard Worker
855*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in {
856*9880d681SAndroid Build Coastguard Worker
857*9880d681SAndroid Build Coastguard Workerclass R600_TEX <bits<11> inst, string opName> :
858*9880d681SAndroid Build Coastguard Worker  InstR600 <(outs R600_Reg128:$DST_GPR),
859*9880d681SAndroid Build Coastguard Worker          (ins R600_Reg128:$SRC_GPR,
860*9880d681SAndroid Build Coastguard Worker          RSel:$srcx, RSel:$srcy, RSel:$srcz, RSel:$srcw,
861*9880d681SAndroid Build Coastguard Worker          i32imm:$offsetx, i32imm:$offsety, i32imm:$offsetz,
862*9880d681SAndroid Build Coastguard Worker          RSel:$DST_SEL_X, RSel:$DST_SEL_Y, RSel:$DST_SEL_Z, RSel:$DST_SEL_W,
863*9880d681SAndroid Build Coastguard Worker          i32imm:$RESOURCE_ID, i32imm:$SAMPLER_ID,
864*9880d681SAndroid Build Coastguard Worker          CT:$COORD_TYPE_X, CT:$COORD_TYPE_Y, CT:$COORD_TYPE_Z,
865*9880d681SAndroid Build Coastguard Worker          CT:$COORD_TYPE_W),
866*9880d681SAndroid Build Coastguard Worker          !strconcat("  ", opName,
867*9880d681SAndroid Build Coastguard Worker          " $DST_GPR.$DST_SEL_X$DST_SEL_Y$DST_SEL_Z$DST_SEL_W, "
868*9880d681SAndroid Build Coastguard Worker          "$SRC_GPR.$srcx$srcy$srcz$srcw "
869*9880d681SAndroid Build Coastguard Worker          "RID:$RESOURCE_ID SID:$SAMPLER_ID "
870*9880d681SAndroid Build Coastguard Worker          "CT:$COORD_TYPE_X$COORD_TYPE_Y$COORD_TYPE_Z$COORD_TYPE_W"),
871*9880d681SAndroid Build Coastguard Worker          [],
872*9880d681SAndroid Build Coastguard Worker          NullALU>, TEX_WORD0, TEX_WORD1, TEX_WORD2 {
873*9880d681SAndroid Build Coastguard Worker  let Inst{31-0} = Word0;
874*9880d681SAndroid Build Coastguard Worker  let Inst{63-32} = Word1;
875*9880d681SAndroid Build Coastguard Worker
876*9880d681SAndroid Build Coastguard Worker  let TEX_INST = inst{4-0};
877*9880d681SAndroid Build Coastguard Worker  let SRC_REL = 0;
878*9880d681SAndroid Build Coastguard Worker  let DST_REL = 0;
879*9880d681SAndroid Build Coastguard Worker  let LOD_BIAS = 0;
880*9880d681SAndroid Build Coastguard Worker
881*9880d681SAndroid Build Coastguard Worker  let INST_MOD = 0;
882*9880d681SAndroid Build Coastguard Worker  let FETCH_WHOLE_QUAD = 0;
883*9880d681SAndroid Build Coastguard Worker  let ALT_CONST = 0;
884*9880d681SAndroid Build Coastguard Worker  let SAMPLER_INDEX_MODE = 0;
885*9880d681SAndroid Build Coastguard Worker  let RESOURCE_INDEX_MODE = 0;
886*9880d681SAndroid Build Coastguard Worker
887*9880d681SAndroid Build Coastguard Worker  let TEXInst = 1;
888*9880d681SAndroid Build Coastguard Worker}
889*9880d681SAndroid Build Coastguard Worker
890*9880d681SAndroid Build Coastguard Worker} // End mayLoad = 0, mayStore = 0, hasSideEffects = 0
891*9880d681SAndroid Build Coastguard Worker
892*9880d681SAndroid Build Coastguard Worker
893*9880d681SAndroid Build Coastguard Worker
894*9880d681SAndroid Build Coastguard Workerdef TEX_SAMPLE : R600_TEX <0x10, "TEX_SAMPLE">;
895*9880d681SAndroid Build Coastguard Workerdef TEX_SAMPLE_C : R600_TEX <0x18, "TEX_SAMPLE_C">;
896*9880d681SAndroid Build Coastguard Workerdef TEX_SAMPLE_L : R600_TEX <0x11, "TEX_SAMPLE_L">;
897*9880d681SAndroid Build Coastguard Workerdef TEX_SAMPLE_C_L : R600_TEX <0x19, "TEX_SAMPLE_C_L">;
898*9880d681SAndroid Build Coastguard Workerdef TEX_SAMPLE_LB : R600_TEX <0x12, "TEX_SAMPLE_LB">;
899*9880d681SAndroid Build Coastguard Workerdef TEX_SAMPLE_C_LB : R600_TEX <0x1A, "TEX_SAMPLE_C_LB">;
900*9880d681SAndroid Build Coastguard Workerdef TEX_LD : R600_TEX <0x03, "TEX_LD">;
901*9880d681SAndroid Build Coastguard Workerdef TEX_LDPTR : R600_TEX <0x03, "TEX_LDPTR"> {
902*9880d681SAndroid Build Coastguard Worker  let INST_MOD = 1;
903*9880d681SAndroid Build Coastguard Worker}
904*9880d681SAndroid Build Coastguard Workerdef TEX_GET_TEXTURE_RESINFO : R600_TEX <0x04, "TEX_GET_TEXTURE_RESINFO">;
905*9880d681SAndroid Build Coastguard Workerdef TEX_GET_GRADIENTS_H : R600_TEX <0x07, "TEX_GET_GRADIENTS_H">;
906*9880d681SAndroid Build Coastguard Workerdef TEX_GET_GRADIENTS_V : R600_TEX <0x08, "TEX_GET_GRADIENTS_V">;
907*9880d681SAndroid Build Coastguard Workerdef TEX_SET_GRADIENTS_H : R600_TEX <0x0B, "TEX_SET_GRADIENTS_H">;
908*9880d681SAndroid Build Coastguard Workerdef TEX_SET_GRADIENTS_V : R600_TEX <0x0C, "TEX_SET_GRADIENTS_V">;
909*9880d681SAndroid Build Coastguard Workerdef TEX_SAMPLE_G : R600_TEX <0x14, "TEX_SAMPLE_G">;
910*9880d681SAndroid Build Coastguard Workerdef TEX_SAMPLE_C_G : R600_TEX <0x1C, "TEX_SAMPLE_C_G">;
911*9880d681SAndroid Build Coastguard Worker
912*9880d681SAndroid Build Coastguard Workerdefm : TexPattern<0, TEX_SAMPLE>;
913*9880d681SAndroid Build Coastguard Workerdefm : TexPattern<1, TEX_SAMPLE_C>;
914*9880d681SAndroid Build Coastguard Workerdefm : TexPattern<2, TEX_SAMPLE_L>;
915*9880d681SAndroid Build Coastguard Workerdefm : TexPattern<3, TEX_SAMPLE_C_L>;
916*9880d681SAndroid Build Coastguard Workerdefm : TexPattern<4, TEX_SAMPLE_LB>;
917*9880d681SAndroid Build Coastguard Workerdefm : TexPattern<5, TEX_SAMPLE_C_LB>;
918*9880d681SAndroid Build Coastguard Workerdefm : TexPattern<6, TEX_LD, v4i32>;
919*9880d681SAndroid Build Coastguard Workerdefm : TexPattern<7, TEX_GET_TEXTURE_RESINFO, v4i32>;
920*9880d681SAndroid Build Coastguard Workerdefm : TexPattern<8, TEX_GET_GRADIENTS_H>;
921*9880d681SAndroid Build Coastguard Workerdefm : TexPattern<9, TEX_GET_GRADIENTS_V>;
922*9880d681SAndroid Build Coastguard Workerdefm : TexPattern<10, TEX_LDPTR, v4i32>;
923*9880d681SAndroid Build Coastguard Worker
924*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
925*9880d681SAndroid Build Coastguard Worker// Helper classes for common instructions
926*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
927*9880d681SAndroid Build Coastguard Worker
928*9880d681SAndroid Build Coastguard Workerclass MUL_LIT_Common <bits<5> inst> : R600_3OP <
929*9880d681SAndroid Build Coastguard Worker  inst, "MUL_LIT",
930*9880d681SAndroid Build Coastguard Worker  []
931*9880d681SAndroid Build Coastguard Worker>;
932*9880d681SAndroid Build Coastguard Worker
933*9880d681SAndroid Build Coastguard Workerclass MULADD_Common <bits<5> inst> : R600_3OP <
934*9880d681SAndroid Build Coastguard Worker  inst, "MULADD",
935*9880d681SAndroid Build Coastguard Worker  []
936*9880d681SAndroid Build Coastguard Worker>;
937*9880d681SAndroid Build Coastguard Worker
938*9880d681SAndroid Build Coastguard Workerclass MULADD_IEEE_Common <bits<5> inst> : R600_3OP <
939*9880d681SAndroid Build Coastguard Worker  inst, "MULADD_IEEE",
940*9880d681SAndroid Build Coastguard Worker  [(set f32:$dst, (fmad f32:$src0, f32:$src1, f32:$src2))]
941*9880d681SAndroid Build Coastguard Worker>;
942*9880d681SAndroid Build Coastguard Worker
943*9880d681SAndroid Build Coastguard Workerclass FMA_Common <bits<5> inst> : R600_3OP <
944*9880d681SAndroid Build Coastguard Worker  inst, "FMA",
945*9880d681SAndroid Build Coastguard Worker  [(set f32:$dst, (fma f32:$src0, f32:$src1, f32:$src2))], VecALU
946*9880d681SAndroid Build Coastguard Worker>;
947*9880d681SAndroid Build Coastguard Worker
948*9880d681SAndroid Build Coastguard Workerclass CNDE_Common <bits<5> inst> : R600_3OP <
949*9880d681SAndroid Build Coastguard Worker  inst, "CNDE",
950*9880d681SAndroid Build Coastguard Worker  [(set f32:$dst, (selectcc f32:$src0, FP_ZERO, f32:$src1, f32:$src2, COND_OEQ))]
951*9880d681SAndroid Build Coastguard Worker>;
952*9880d681SAndroid Build Coastguard Worker
953*9880d681SAndroid Build Coastguard Workerclass CNDGT_Common <bits<5> inst> : R600_3OP <
954*9880d681SAndroid Build Coastguard Worker  inst, "CNDGT",
955*9880d681SAndroid Build Coastguard Worker  [(set f32:$dst, (selectcc f32:$src0, FP_ZERO, f32:$src1, f32:$src2, COND_OGT))]
956*9880d681SAndroid Build Coastguard Worker> {
957*9880d681SAndroid Build Coastguard Worker  let Itinerary = VecALU;
958*9880d681SAndroid Build Coastguard Worker}
959*9880d681SAndroid Build Coastguard Worker
960*9880d681SAndroid Build Coastguard Workerclass CNDGE_Common <bits<5> inst> : R600_3OP <
961*9880d681SAndroid Build Coastguard Worker  inst, "CNDGE",
962*9880d681SAndroid Build Coastguard Worker  [(set f32:$dst, (selectcc f32:$src0, FP_ZERO, f32:$src1, f32:$src2, COND_OGE))]
963*9880d681SAndroid Build Coastguard Worker> {
964*9880d681SAndroid Build Coastguard Worker  let Itinerary = VecALU;
965*9880d681SAndroid Build Coastguard Worker}
966*9880d681SAndroid Build Coastguard Worker
967*9880d681SAndroid Build Coastguard Worker
968*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, isPseudo = 1, Namespace = "AMDGPU"  in {
969*9880d681SAndroid Build Coastguard Workerclass R600_VEC2OP<list<dag> pattern> : InstR600 <(outs R600_Reg32:$dst), (ins
970*9880d681SAndroid Build Coastguard Worker// Slot X
971*9880d681SAndroid Build Coastguard Worker   UEM:$update_exec_mask_X, UP:$update_pred_X, WRITE:$write_X,
972*9880d681SAndroid Build Coastguard Worker   OMOD:$omod_X, REL:$dst_rel_X, CLAMP:$clamp_X,
973*9880d681SAndroid Build Coastguard Worker   R600_TReg32_X:$src0_X, NEG:$src0_neg_X, REL:$src0_rel_X, ABS:$src0_abs_X, SEL:$src0_sel_X,
974*9880d681SAndroid Build Coastguard Worker   R600_TReg32_X:$src1_X, NEG:$src1_neg_X, REL:$src1_rel_X, ABS:$src1_abs_X, SEL:$src1_sel_X,
975*9880d681SAndroid Build Coastguard Worker   R600_Pred:$pred_sel_X,
976*9880d681SAndroid Build Coastguard Worker// Slot Y
977*9880d681SAndroid Build Coastguard Worker   UEM:$update_exec_mask_Y, UP:$update_pred_Y, WRITE:$write_Y,
978*9880d681SAndroid Build Coastguard Worker   OMOD:$omod_Y, REL:$dst_rel_Y, CLAMP:$clamp_Y,
979*9880d681SAndroid Build Coastguard Worker   R600_TReg32_Y:$src0_Y, NEG:$src0_neg_Y, REL:$src0_rel_Y, ABS:$src0_abs_Y, SEL:$src0_sel_Y,
980*9880d681SAndroid Build Coastguard Worker   R600_TReg32_Y:$src1_Y, NEG:$src1_neg_Y, REL:$src1_rel_Y, ABS:$src1_abs_Y, SEL:$src1_sel_Y,
981*9880d681SAndroid Build Coastguard Worker   R600_Pred:$pred_sel_Y,
982*9880d681SAndroid Build Coastguard Worker// Slot Z
983*9880d681SAndroid Build Coastguard Worker   UEM:$update_exec_mask_Z, UP:$update_pred_Z, WRITE:$write_Z,
984*9880d681SAndroid Build Coastguard Worker   OMOD:$omod_Z, REL:$dst_rel_Z, CLAMP:$clamp_Z,
985*9880d681SAndroid Build Coastguard Worker   R600_TReg32_Z:$src0_Z, NEG:$src0_neg_Z, REL:$src0_rel_Z, ABS:$src0_abs_Z, SEL:$src0_sel_Z,
986*9880d681SAndroid Build Coastguard Worker   R600_TReg32_Z:$src1_Z, NEG:$src1_neg_Z, REL:$src1_rel_Z, ABS:$src1_abs_Z, SEL:$src1_sel_Z,
987*9880d681SAndroid Build Coastguard Worker   R600_Pred:$pred_sel_Z,
988*9880d681SAndroid Build Coastguard Worker// Slot W
989*9880d681SAndroid Build Coastguard Worker   UEM:$update_exec_mask_W, UP:$update_pred_W, WRITE:$write_W,
990*9880d681SAndroid Build Coastguard Worker   OMOD:$omod_W, REL:$dst_rel_W, CLAMP:$clamp_W,
991*9880d681SAndroid Build Coastguard Worker   R600_TReg32_W:$src0_W, NEG:$src0_neg_W, REL:$src0_rel_W, ABS:$src0_abs_W, SEL:$src0_sel_W,
992*9880d681SAndroid Build Coastguard Worker   R600_TReg32_W:$src1_W, NEG:$src1_neg_W, REL:$src1_rel_W, ABS:$src1_abs_W, SEL:$src1_sel_W,
993*9880d681SAndroid Build Coastguard Worker   R600_Pred:$pred_sel_W,
994*9880d681SAndroid Build Coastguard Worker   LITERAL:$literal0, LITERAL:$literal1),
995*9880d681SAndroid Build Coastguard Worker  "",
996*9880d681SAndroid Build Coastguard Worker  pattern,
997*9880d681SAndroid Build Coastguard Worker  AnyALU> {
998*9880d681SAndroid Build Coastguard Worker
999*9880d681SAndroid Build Coastguard Worker  let UseNamedOperandTable = 1;
1000*9880d681SAndroid Build Coastguard Worker
1001*9880d681SAndroid Build Coastguard Worker}
1002*9880d681SAndroid Build Coastguard Worker}
1003*9880d681SAndroid Build Coastguard Worker
1004*9880d681SAndroid Build Coastguard Workerdef DOT_4 : R600_VEC2OP<[(set R600_Reg32:$dst, (DOT4
1005*9880d681SAndroid Build Coastguard Worker  R600_TReg32_X:$src0_X, R600_TReg32_X:$src1_X,
1006*9880d681SAndroid Build Coastguard Worker  R600_TReg32_Y:$src0_Y, R600_TReg32_Y:$src1_Y,
1007*9880d681SAndroid Build Coastguard Worker  R600_TReg32_Z:$src0_Z, R600_TReg32_Z:$src1_Z,
1008*9880d681SAndroid Build Coastguard Worker  R600_TReg32_W:$src0_W, R600_TReg32_W:$src1_W))]>;
1009*9880d681SAndroid Build Coastguard Worker
1010*9880d681SAndroid Build Coastguard Worker
1011*9880d681SAndroid Build Coastguard Workerclass DOT4_Common <bits<11> inst> : R600_2OP <inst, "DOT4", []>;
1012*9880d681SAndroid Build Coastguard Worker
1013*9880d681SAndroid Build Coastguard Worker
1014*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 0 in {
1015*9880d681SAndroid Build Coastguard Workermulticlass CUBE_Common <bits<11> inst> {
1016*9880d681SAndroid Build Coastguard Worker
1017*9880d681SAndroid Build Coastguard Worker  def _pseudo : InstR600 <
1018*9880d681SAndroid Build Coastguard Worker    (outs R600_Reg128:$dst),
1019*9880d681SAndroid Build Coastguard Worker    (ins R600_Reg128:$src0),
1020*9880d681SAndroid Build Coastguard Worker    "CUBE $dst $src0",
1021*9880d681SAndroid Build Coastguard Worker    [(set v4f32:$dst, (int_AMDGPU_cube v4f32:$src0))],
1022*9880d681SAndroid Build Coastguard Worker    VecALU
1023*9880d681SAndroid Build Coastguard Worker  > {
1024*9880d681SAndroid Build Coastguard Worker    let isPseudo = 1;
1025*9880d681SAndroid Build Coastguard Worker    let UseNamedOperandTable = 1;
1026*9880d681SAndroid Build Coastguard Worker  }
1027*9880d681SAndroid Build Coastguard Worker
1028*9880d681SAndroid Build Coastguard Worker  def _real : R600_2OP <inst, "CUBE", []>;
1029*9880d681SAndroid Build Coastguard Worker}
1030*9880d681SAndroid Build Coastguard Worker} // End mayLoad = 0, mayStore = 0, hasSideEffects = 0
1031*9880d681SAndroid Build Coastguard Worker
1032*9880d681SAndroid Build Coastguard Workerclass EXP_IEEE_Common <bits<11> inst> : R600_1OP_Helper <
1033*9880d681SAndroid Build Coastguard Worker  inst, "EXP_IEEE", fexp2
1034*9880d681SAndroid Build Coastguard Worker> {
1035*9880d681SAndroid Build Coastguard Worker  let Itinerary = TransALU;
1036*9880d681SAndroid Build Coastguard Worker}
1037*9880d681SAndroid Build Coastguard Worker
1038*9880d681SAndroid Build Coastguard Workerclass FLT_TO_INT_Common <bits<11> inst> : R600_1OP_Helper <
1039*9880d681SAndroid Build Coastguard Worker  inst, "FLT_TO_INT", fp_to_sint
1040*9880d681SAndroid Build Coastguard Worker> {
1041*9880d681SAndroid Build Coastguard Worker  let Itinerary = TransALU;
1042*9880d681SAndroid Build Coastguard Worker}
1043*9880d681SAndroid Build Coastguard Worker
1044*9880d681SAndroid Build Coastguard Workerclass INT_TO_FLT_Common <bits<11> inst> : R600_1OP_Helper <
1045*9880d681SAndroid Build Coastguard Worker  inst, "INT_TO_FLT", sint_to_fp
1046*9880d681SAndroid Build Coastguard Worker> {
1047*9880d681SAndroid Build Coastguard Worker  let Itinerary = TransALU;
1048*9880d681SAndroid Build Coastguard Worker}
1049*9880d681SAndroid Build Coastguard Worker
1050*9880d681SAndroid Build Coastguard Workerclass FLT_TO_UINT_Common <bits<11> inst> : R600_1OP_Helper <
1051*9880d681SAndroid Build Coastguard Worker  inst, "FLT_TO_UINT", fp_to_uint
1052*9880d681SAndroid Build Coastguard Worker> {
1053*9880d681SAndroid Build Coastguard Worker  let Itinerary = TransALU;
1054*9880d681SAndroid Build Coastguard Worker}
1055*9880d681SAndroid Build Coastguard Worker
1056*9880d681SAndroid Build Coastguard Workerclass UINT_TO_FLT_Common <bits<11> inst> : R600_1OP_Helper <
1057*9880d681SAndroid Build Coastguard Worker  inst, "UINT_TO_FLT", uint_to_fp
1058*9880d681SAndroid Build Coastguard Worker> {
1059*9880d681SAndroid Build Coastguard Worker  let Itinerary = TransALU;
1060*9880d681SAndroid Build Coastguard Worker}
1061*9880d681SAndroid Build Coastguard Worker
1062*9880d681SAndroid Build Coastguard Workerclass LOG_CLAMPED_Common <bits<11> inst> : R600_1OP <
1063*9880d681SAndroid Build Coastguard Worker  inst, "LOG_CLAMPED", []
1064*9880d681SAndroid Build Coastguard Worker>;
1065*9880d681SAndroid Build Coastguard Worker
1066*9880d681SAndroid Build Coastguard Workerclass LOG_IEEE_Common <bits<11> inst> : R600_1OP_Helper <
1067*9880d681SAndroid Build Coastguard Worker  inst, "LOG_IEEE", flog2
1068*9880d681SAndroid Build Coastguard Worker> {
1069*9880d681SAndroid Build Coastguard Worker  let Itinerary = TransALU;
1070*9880d681SAndroid Build Coastguard Worker}
1071*9880d681SAndroid Build Coastguard Worker
1072*9880d681SAndroid Build Coastguard Workerclass LSHL_Common <bits<11> inst> : R600_2OP_Helper <inst, "LSHL", shl>;
1073*9880d681SAndroid Build Coastguard Workerclass LSHR_Common <bits<11> inst> : R600_2OP_Helper <inst, "LSHR", srl>;
1074*9880d681SAndroid Build Coastguard Workerclass ASHR_Common <bits<11> inst> : R600_2OP_Helper <inst, "ASHR", sra>;
1075*9880d681SAndroid Build Coastguard Workerclass MULHI_INT_Common <bits<11> inst> : R600_2OP_Helper <
1076*9880d681SAndroid Build Coastguard Worker  inst, "MULHI_INT", mulhs
1077*9880d681SAndroid Build Coastguard Worker> {
1078*9880d681SAndroid Build Coastguard Worker  let Itinerary = TransALU;
1079*9880d681SAndroid Build Coastguard Worker}
1080*9880d681SAndroid Build Coastguard Workerclass MULHI_UINT_Common <bits<11> inst> : R600_2OP_Helper <
1081*9880d681SAndroid Build Coastguard Worker  inst, "MULHI", mulhu
1082*9880d681SAndroid Build Coastguard Worker> {
1083*9880d681SAndroid Build Coastguard Worker  let Itinerary = TransALU;
1084*9880d681SAndroid Build Coastguard Worker}
1085*9880d681SAndroid Build Coastguard Workerclass MULLO_INT_Common <bits<11> inst> : R600_2OP_Helper <
1086*9880d681SAndroid Build Coastguard Worker  inst, "MULLO_INT", mul
1087*9880d681SAndroid Build Coastguard Worker> {
1088*9880d681SAndroid Build Coastguard Worker  let Itinerary = TransALU;
1089*9880d681SAndroid Build Coastguard Worker}
1090*9880d681SAndroid Build Coastguard Workerclass MULLO_UINT_Common <bits<11> inst> : R600_2OP <inst, "MULLO_UINT", []> {
1091*9880d681SAndroid Build Coastguard Worker  let Itinerary = TransALU;
1092*9880d681SAndroid Build Coastguard Worker}
1093*9880d681SAndroid Build Coastguard Worker
1094*9880d681SAndroid Build Coastguard Workerclass RECIP_CLAMPED_Common <bits<11> inst> : R600_1OP <
1095*9880d681SAndroid Build Coastguard Worker  inst, "RECIP_CLAMPED", []
1096*9880d681SAndroid Build Coastguard Worker> {
1097*9880d681SAndroid Build Coastguard Worker  let Itinerary = TransALU;
1098*9880d681SAndroid Build Coastguard Worker}
1099*9880d681SAndroid Build Coastguard Worker
1100*9880d681SAndroid Build Coastguard Workerclass RECIP_IEEE_Common <bits<11> inst> : R600_1OP <
1101*9880d681SAndroid Build Coastguard Worker  inst, "RECIP_IEEE", [(set f32:$dst, (AMDGPUrcp f32:$src0))]
1102*9880d681SAndroid Build Coastguard Worker> {
1103*9880d681SAndroid Build Coastguard Worker  let Itinerary = TransALU;
1104*9880d681SAndroid Build Coastguard Worker}
1105*9880d681SAndroid Build Coastguard Worker
1106*9880d681SAndroid Build Coastguard Workerclass RECIP_UINT_Common <bits<11> inst> : R600_1OP_Helper <
1107*9880d681SAndroid Build Coastguard Worker  inst, "RECIP_UINT", AMDGPUurecip
1108*9880d681SAndroid Build Coastguard Worker> {
1109*9880d681SAndroid Build Coastguard Worker  let Itinerary = TransALU;
1110*9880d681SAndroid Build Coastguard Worker}
1111*9880d681SAndroid Build Coastguard Worker
1112*9880d681SAndroid Build Coastguard Worker// Clamped to maximum.
1113*9880d681SAndroid Build Coastguard Workerclass RECIPSQRT_CLAMPED_Common <bits<11> inst> : R600_1OP_Helper <
1114*9880d681SAndroid Build Coastguard Worker  inst, "RECIPSQRT_CLAMPED", AMDGPUrsq_clamp
1115*9880d681SAndroid Build Coastguard Worker> {
1116*9880d681SAndroid Build Coastguard Worker  let Itinerary = TransALU;
1117*9880d681SAndroid Build Coastguard Worker}
1118*9880d681SAndroid Build Coastguard Worker
1119*9880d681SAndroid Build Coastguard Workerclass RECIPSQRT_IEEE_Common <bits<11> inst> : R600_1OP_Helper <
1120*9880d681SAndroid Build Coastguard Worker  inst, "RECIPSQRT_IEEE", AMDGPUrsq_legacy
1121*9880d681SAndroid Build Coastguard Worker> {
1122*9880d681SAndroid Build Coastguard Worker  let Itinerary = TransALU;
1123*9880d681SAndroid Build Coastguard Worker}
1124*9880d681SAndroid Build Coastguard Worker
1125*9880d681SAndroid Build Coastguard Worker// TODO: There is also RECIPSQRT_FF which clamps to zero.
1126*9880d681SAndroid Build Coastguard Worker
1127*9880d681SAndroid Build Coastguard Workerclass SIN_Common <bits<11> inst> : R600_1OP <
1128*9880d681SAndroid Build Coastguard Worker  inst, "SIN", [(set f32:$dst, (SIN_HW f32:$src0))]>{
1129*9880d681SAndroid Build Coastguard Worker  let Trig = 1;
1130*9880d681SAndroid Build Coastguard Worker  let Itinerary = TransALU;
1131*9880d681SAndroid Build Coastguard Worker}
1132*9880d681SAndroid Build Coastguard Worker
1133*9880d681SAndroid Build Coastguard Workerclass COS_Common <bits<11> inst> : R600_1OP <
1134*9880d681SAndroid Build Coastguard Worker  inst, "COS", [(set f32:$dst, (COS_HW f32:$src0))]> {
1135*9880d681SAndroid Build Coastguard Worker  let Trig = 1;
1136*9880d681SAndroid Build Coastguard Worker  let Itinerary = TransALU;
1137*9880d681SAndroid Build Coastguard Worker}
1138*9880d681SAndroid Build Coastguard Worker
1139*9880d681SAndroid Build Coastguard Workerdef CLAMP_R600 :  CLAMP <R600_Reg32>;
1140*9880d681SAndroid Build Coastguard Workerdef FABS_R600 : FABS<R600_Reg32>;
1141*9880d681SAndroid Build Coastguard Workerdef FNEG_R600 : FNEG<R600_Reg32>;
1142*9880d681SAndroid Build Coastguard Worker
1143*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1144*9880d681SAndroid Build Coastguard Worker// Helper patterns for complex intrinsics
1145*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1146*9880d681SAndroid Build Coastguard Worker
1147*9880d681SAndroid Build Coastguard Worker// FIXME: Should be predicated on unsafe fp math.
1148*9880d681SAndroid Build Coastguard Workermulticlass DIV_Common <InstR600 recip_ieee> {
1149*9880d681SAndroid Build Coastguard Workerdef : Pat<
1150*9880d681SAndroid Build Coastguard Worker  (fdiv f32:$src0, f32:$src1),
1151*9880d681SAndroid Build Coastguard Worker  (MUL_IEEE $src0, (recip_ieee $src1))
1152*9880d681SAndroid Build Coastguard Worker>;
1153*9880d681SAndroid Build Coastguard Worker
1154*9880d681SAndroid Build Coastguard Workerdef : RcpPat<recip_ieee, f32>;
1155*9880d681SAndroid Build Coastguard Worker}
1156*9880d681SAndroid Build Coastguard Worker
1157*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1158*9880d681SAndroid Build Coastguard Worker// R600 / R700 Instructions
1159*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1160*9880d681SAndroid Build Coastguard Worker
1161*9880d681SAndroid Build Coastguard Workerlet Predicates = [isR600] in {
1162*9880d681SAndroid Build Coastguard Worker
1163*9880d681SAndroid Build Coastguard Worker  def MUL_LIT_r600 : MUL_LIT_Common<0x0C>;
1164*9880d681SAndroid Build Coastguard Worker  def MULADD_r600 : MULADD_Common<0x10>;
1165*9880d681SAndroid Build Coastguard Worker  def MULADD_IEEE_r600 : MULADD_IEEE_Common<0x14>;
1166*9880d681SAndroid Build Coastguard Worker  def CNDE_r600 : CNDE_Common<0x18>;
1167*9880d681SAndroid Build Coastguard Worker  def CNDGT_r600 : CNDGT_Common<0x19>;
1168*9880d681SAndroid Build Coastguard Worker  def CNDGE_r600 : CNDGE_Common<0x1A>;
1169*9880d681SAndroid Build Coastguard Worker  def DOT4_r600 : DOT4_Common<0x50>;
1170*9880d681SAndroid Build Coastguard Worker  defm CUBE_r600 : CUBE_Common<0x52>;
1171*9880d681SAndroid Build Coastguard Worker  def EXP_IEEE_r600 : EXP_IEEE_Common<0x61>;
1172*9880d681SAndroid Build Coastguard Worker  def LOG_CLAMPED_r600 : LOG_CLAMPED_Common<0x62>;
1173*9880d681SAndroid Build Coastguard Worker  def LOG_IEEE_r600 : LOG_IEEE_Common<0x63>;
1174*9880d681SAndroid Build Coastguard Worker  def RECIP_CLAMPED_r600 : RECIP_CLAMPED_Common<0x64>;
1175*9880d681SAndroid Build Coastguard Worker  def RECIP_IEEE_r600 : RECIP_IEEE_Common<0x66>;
1176*9880d681SAndroid Build Coastguard Worker  def RECIPSQRT_CLAMPED_r600 : RECIPSQRT_CLAMPED_Common<0x67>;
1177*9880d681SAndroid Build Coastguard Worker  def RECIPSQRT_IEEE_r600 : RECIPSQRT_IEEE_Common<0x69>;
1178*9880d681SAndroid Build Coastguard Worker  def FLT_TO_INT_r600 : FLT_TO_INT_Common<0x6b>;
1179*9880d681SAndroid Build Coastguard Worker  def INT_TO_FLT_r600 : INT_TO_FLT_Common<0x6c>;
1180*9880d681SAndroid Build Coastguard Worker  def FLT_TO_UINT_r600 : FLT_TO_UINT_Common<0x79>;
1181*9880d681SAndroid Build Coastguard Worker  def UINT_TO_FLT_r600 : UINT_TO_FLT_Common<0x6d>;
1182*9880d681SAndroid Build Coastguard Worker  def SIN_r600 : SIN_Common<0x6E>;
1183*9880d681SAndroid Build Coastguard Worker  def COS_r600 : COS_Common<0x6F>;
1184*9880d681SAndroid Build Coastguard Worker  def ASHR_r600 : ASHR_Common<0x70>;
1185*9880d681SAndroid Build Coastguard Worker  def LSHR_r600 : LSHR_Common<0x71>;
1186*9880d681SAndroid Build Coastguard Worker  def LSHL_r600 : LSHL_Common<0x72>;
1187*9880d681SAndroid Build Coastguard Worker  def MULLO_INT_r600 : MULLO_INT_Common<0x73>;
1188*9880d681SAndroid Build Coastguard Worker  def MULHI_INT_r600 : MULHI_INT_Common<0x74>;
1189*9880d681SAndroid Build Coastguard Worker  def MULLO_UINT_r600 : MULLO_UINT_Common<0x75>;
1190*9880d681SAndroid Build Coastguard Worker  def MULHI_UINT_r600 : MULHI_UINT_Common<0x76>;
1191*9880d681SAndroid Build Coastguard Worker  def RECIP_UINT_r600 : RECIP_UINT_Common <0x78>;
1192*9880d681SAndroid Build Coastguard Worker
1193*9880d681SAndroid Build Coastguard Worker  defm DIV_r600 : DIV_Common<RECIP_IEEE_r600>;
1194*9880d681SAndroid Build Coastguard Worker  def : POW_Common <LOG_IEEE_r600, EXP_IEEE_r600, MUL>;
1195*9880d681SAndroid Build Coastguard Worker
1196*9880d681SAndroid Build Coastguard Worker  def : Pat<(fsqrt f32:$src), (MUL $src, (RECIPSQRT_CLAMPED_r600 $src))>;
1197*9880d681SAndroid Build Coastguard Worker  def : RsqPat<RECIPSQRT_IEEE_r600, f32>;
1198*9880d681SAndroid Build Coastguard Worker
1199*9880d681SAndroid Build Coastguard Worker  def R600_ExportSwz : ExportSwzInst {
1200*9880d681SAndroid Build Coastguard Worker    let Word1{20-17} = 0; // BURST_COUNT
1201*9880d681SAndroid Build Coastguard Worker    let Word1{21} = eop;
1202*9880d681SAndroid Build Coastguard Worker    let Word1{22} = 0; // VALID_PIXEL_MODE
1203*9880d681SAndroid Build Coastguard Worker    let Word1{30-23} = inst;
1204*9880d681SAndroid Build Coastguard Worker    let Word1{31} = 1; // BARRIER
1205*9880d681SAndroid Build Coastguard Worker  }
1206*9880d681SAndroid Build Coastguard Worker  defm : ExportPattern<R600_ExportSwz, 39>;
1207*9880d681SAndroid Build Coastguard Worker
1208*9880d681SAndroid Build Coastguard Worker  def R600_ExportBuf : ExportBufInst {
1209*9880d681SAndroid Build Coastguard Worker    let Word1{20-17} = 0; // BURST_COUNT
1210*9880d681SAndroid Build Coastguard Worker    let Word1{21} = eop;
1211*9880d681SAndroid Build Coastguard Worker    let Word1{22} = 0; // VALID_PIXEL_MODE
1212*9880d681SAndroid Build Coastguard Worker    let Word1{30-23} = inst;
1213*9880d681SAndroid Build Coastguard Worker    let Word1{31} = 1; // BARRIER
1214*9880d681SAndroid Build Coastguard Worker  }
1215*9880d681SAndroid Build Coastguard Worker  defm : SteamOutputExportPattern<R600_ExportBuf, 0x20, 0x21, 0x22, 0x23>;
1216*9880d681SAndroid Build Coastguard Worker
1217*9880d681SAndroid Build Coastguard Worker  def CF_TC_R600 : CF_CLAUSE_R600<1, (ins i32imm:$ADDR, i32imm:$CNT),
1218*9880d681SAndroid Build Coastguard Worker  "TEX $CNT @$ADDR"> {
1219*9880d681SAndroid Build Coastguard Worker    let POP_COUNT = 0;
1220*9880d681SAndroid Build Coastguard Worker  }
1221*9880d681SAndroid Build Coastguard Worker  def CF_VC_R600 : CF_CLAUSE_R600<2, (ins i32imm:$ADDR, i32imm:$CNT),
1222*9880d681SAndroid Build Coastguard Worker  "VTX $CNT @$ADDR"> {
1223*9880d681SAndroid Build Coastguard Worker    let POP_COUNT = 0;
1224*9880d681SAndroid Build Coastguard Worker  }
1225*9880d681SAndroid Build Coastguard Worker  def WHILE_LOOP_R600 : CF_CLAUSE_R600<6, (ins i32imm:$ADDR),
1226*9880d681SAndroid Build Coastguard Worker  "LOOP_START_DX10 @$ADDR"> {
1227*9880d681SAndroid Build Coastguard Worker    let POP_COUNT = 0;
1228*9880d681SAndroid Build Coastguard Worker    let CNT = 0;
1229*9880d681SAndroid Build Coastguard Worker  }
1230*9880d681SAndroid Build Coastguard Worker  def END_LOOP_R600 : CF_CLAUSE_R600<5, (ins i32imm:$ADDR), "END_LOOP @$ADDR"> {
1231*9880d681SAndroid Build Coastguard Worker    let POP_COUNT = 0;
1232*9880d681SAndroid Build Coastguard Worker    let CNT = 0;
1233*9880d681SAndroid Build Coastguard Worker  }
1234*9880d681SAndroid Build Coastguard Worker  def LOOP_BREAK_R600 : CF_CLAUSE_R600<9, (ins i32imm:$ADDR),
1235*9880d681SAndroid Build Coastguard Worker  "LOOP_BREAK @$ADDR"> {
1236*9880d681SAndroid Build Coastguard Worker    let POP_COUNT = 0;
1237*9880d681SAndroid Build Coastguard Worker    let CNT = 0;
1238*9880d681SAndroid Build Coastguard Worker  }
1239*9880d681SAndroid Build Coastguard Worker  def CF_CONTINUE_R600 : CF_CLAUSE_R600<8, (ins i32imm:$ADDR),
1240*9880d681SAndroid Build Coastguard Worker  "CONTINUE @$ADDR"> {
1241*9880d681SAndroid Build Coastguard Worker    let POP_COUNT = 0;
1242*9880d681SAndroid Build Coastguard Worker    let CNT = 0;
1243*9880d681SAndroid Build Coastguard Worker  }
1244*9880d681SAndroid Build Coastguard Worker  def CF_JUMP_R600 : CF_CLAUSE_R600<10, (ins i32imm:$ADDR, i32imm:$POP_COUNT),
1245*9880d681SAndroid Build Coastguard Worker  "JUMP @$ADDR POP:$POP_COUNT"> {
1246*9880d681SAndroid Build Coastguard Worker    let CNT = 0;
1247*9880d681SAndroid Build Coastguard Worker  }
1248*9880d681SAndroid Build Coastguard Worker  def CF_PUSH_ELSE_R600 : CF_CLAUSE_R600<12, (ins i32imm:$ADDR),
1249*9880d681SAndroid Build Coastguard Worker  "PUSH_ELSE @$ADDR"> {
1250*9880d681SAndroid Build Coastguard Worker    let CNT = 0;
1251*9880d681SAndroid Build Coastguard Worker    let POP_COUNT = 0; // FIXME?
1252*9880d681SAndroid Build Coastguard Worker  }
1253*9880d681SAndroid Build Coastguard Worker  def CF_ELSE_R600 : CF_CLAUSE_R600<13, (ins i32imm:$ADDR, i32imm:$POP_COUNT),
1254*9880d681SAndroid Build Coastguard Worker  "ELSE @$ADDR POP:$POP_COUNT"> {
1255*9880d681SAndroid Build Coastguard Worker    let CNT = 0;
1256*9880d681SAndroid Build Coastguard Worker  }
1257*9880d681SAndroid Build Coastguard Worker  def CF_CALL_FS_R600 : CF_CLAUSE_R600<19, (ins), "CALL_FS"> {
1258*9880d681SAndroid Build Coastguard Worker    let ADDR = 0;
1259*9880d681SAndroid Build Coastguard Worker    let CNT = 0;
1260*9880d681SAndroid Build Coastguard Worker    let POP_COUNT = 0;
1261*9880d681SAndroid Build Coastguard Worker  }
1262*9880d681SAndroid Build Coastguard Worker  def POP_R600 : CF_CLAUSE_R600<14, (ins i32imm:$ADDR, i32imm:$POP_COUNT),
1263*9880d681SAndroid Build Coastguard Worker  "POP @$ADDR POP:$POP_COUNT"> {
1264*9880d681SAndroid Build Coastguard Worker    let CNT = 0;
1265*9880d681SAndroid Build Coastguard Worker  }
1266*9880d681SAndroid Build Coastguard Worker  def CF_END_R600 : CF_CLAUSE_R600<0, (ins), "CF_END"> {
1267*9880d681SAndroid Build Coastguard Worker    let CNT = 0;
1268*9880d681SAndroid Build Coastguard Worker    let POP_COUNT = 0;
1269*9880d681SAndroid Build Coastguard Worker    let ADDR = 0;
1270*9880d681SAndroid Build Coastguard Worker    let END_OF_PROGRAM = 1;
1271*9880d681SAndroid Build Coastguard Worker  }
1272*9880d681SAndroid Build Coastguard Worker
1273*9880d681SAndroid Build Coastguard Worker}
1274*9880d681SAndroid Build Coastguard Worker
1275*9880d681SAndroid Build Coastguard Worker
1276*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1277*9880d681SAndroid Build Coastguard Worker// Regist loads and stores - for indirect addressing
1278*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1279*9880d681SAndroid Build Coastguard Worker
1280*9880d681SAndroid Build Coastguard Workerdefm R600_ : RegisterLoadStore <R600_Reg32, FRAMEri, ADDRIndirect>;
1281*9880d681SAndroid Build Coastguard Worker
1282*9880d681SAndroid Build Coastguard Worker
1283*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1284*9880d681SAndroid Build Coastguard Worker// Pseudo instructions
1285*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1286*9880d681SAndroid Build Coastguard Worker
1287*9880d681SAndroid Build Coastguard Workerlet isPseudo = 1 in {
1288*9880d681SAndroid Build Coastguard Worker
1289*9880d681SAndroid Build Coastguard Workerdef PRED_X : InstR600 <
1290*9880d681SAndroid Build Coastguard Worker  (outs R600_Predicate_Bit:$dst),
1291*9880d681SAndroid Build Coastguard Worker  (ins R600_Reg32:$src0, i32imm:$src1, i32imm:$flags),
1292*9880d681SAndroid Build Coastguard Worker  "", [], NullALU> {
1293*9880d681SAndroid Build Coastguard Worker  let FlagOperandIdx = 3;
1294*9880d681SAndroid Build Coastguard Worker}
1295*9880d681SAndroid Build Coastguard Worker
1296*9880d681SAndroid Build Coastguard Workerlet isTerminator = 1, isBranch = 1 in {
1297*9880d681SAndroid Build Coastguard Workerdef JUMP_COND : InstR600 <
1298*9880d681SAndroid Build Coastguard Worker          (outs),
1299*9880d681SAndroid Build Coastguard Worker          (ins brtarget:$target, R600_Predicate_Bit:$p),
1300*9880d681SAndroid Build Coastguard Worker          "JUMP $target ($p)",
1301*9880d681SAndroid Build Coastguard Worker          [], AnyALU
1302*9880d681SAndroid Build Coastguard Worker  >;
1303*9880d681SAndroid Build Coastguard Worker
1304*9880d681SAndroid Build Coastguard Workerdef JUMP : InstR600 <
1305*9880d681SAndroid Build Coastguard Worker          (outs),
1306*9880d681SAndroid Build Coastguard Worker          (ins brtarget:$target),
1307*9880d681SAndroid Build Coastguard Worker          "JUMP $target",
1308*9880d681SAndroid Build Coastguard Worker          [], AnyALU
1309*9880d681SAndroid Build Coastguard Worker  >
1310*9880d681SAndroid Build Coastguard Worker{
1311*9880d681SAndroid Build Coastguard Worker  let isPredicable = 1;
1312*9880d681SAndroid Build Coastguard Worker  let isBarrier = 1;
1313*9880d681SAndroid Build Coastguard Worker}
1314*9880d681SAndroid Build Coastguard Worker
1315*9880d681SAndroid Build Coastguard Worker}  // End isTerminator = 1, isBranch = 1
1316*9880d681SAndroid Build Coastguard Worker
1317*9880d681SAndroid Build Coastguard Workerlet usesCustomInserter = 1 in {
1318*9880d681SAndroid Build Coastguard Worker
1319*9880d681SAndroid Build Coastguard Workerlet mayLoad = 0, mayStore = 0, hasSideEffects = 1 in {
1320*9880d681SAndroid Build Coastguard Worker
1321*9880d681SAndroid Build Coastguard Workerdef MASK_WRITE : AMDGPUShaderInst <
1322*9880d681SAndroid Build Coastguard Worker    (outs),
1323*9880d681SAndroid Build Coastguard Worker    (ins R600_Reg32:$src),
1324*9880d681SAndroid Build Coastguard Worker    "MASK_WRITE $src",
1325*9880d681SAndroid Build Coastguard Worker    []
1326*9880d681SAndroid Build Coastguard Worker>;
1327*9880d681SAndroid Build Coastguard Worker
1328*9880d681SAndroid Build Coastguard Worker} // End mayLoad = 0, mayStore = 0, hasSideEffects = 1
1329*9880d681SAndroid Build Coastguard Worker
1330*9880d681SAndroid Build Coastguard Worker
1331*9880d681SAndroid Build Coastguard Workerdef TXD: InstR600 <
1332*9880d681SAndroid Build Coastguard Worker  (outs R600_Reg128:$dst),
1333*9880d681SAndroid Build Coastguard Worker  (ins R600_Reg128:$src0, R600_Reg128:$src1, R600_Reg128:$src2,
1334*9880d681SAndroid Build Coastguard Worker       i32imm:$resourceId, i32imm:$samplerId, i32imm:$textureTarget),
1335*9880d681SAndroid Build Coastguard Worker  "TXD $dst, $src0, $src1, $src2, $resourceId, $samplerId, $textureTarget", [],
1336*9880d681SAndroid Build Coastguard Worker  NullALU > {
1337*9880d681SAndroid Build Coastguard Worker  let TEXInst = 1;
1338*9880d681SAndroid Build Coastguard Worker}
1339*9880d681SAndroid Build Coastguard Worker
1340*9880d681SAndroid Build Coastguard Workerdef TXD_SHADOW: InstR600 <
1341*9880d681SAndroid Build Coastguard Worker  (outs R600_Reg128:$dst),
1342*9880d681SAndroid Build Coastguard Worker  (ins R600_Reg128:$src0, R600_Reg128:$src1, R600_Reg128:$src2,
1343*9880d681SAndroid Build Coastguard Worker       i32imm:$resourceId, i32imm:$samplerId, i32imm:$textureTarget),
1344*9880d681SAndroid Build Coastguard Worker  "TXD_SHADOW $dst, $src0, $src1, $src2, $resourceId, $samplerId, $textureTarget",
1345*9880d681SAndroid Build Coastguard Worker  [], NullALU> {
1346*9880d681SAndroid Build Coastguard Worker  let TEXInst = 1;
1347*9880d681SAndroid Build Coastguard Worker}
1348*9880d681SAndroid Build Coastguard Worker} // End isPseudo = 1
1349*9880d681SAndroid Build Coastguard Worker} // End usesCustomInserter = 1
1350*9880d681SAndroid Build Coastguard Worker
1351*9880d681SAndroid Build Coastguard Worker
1352*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1353*9880d681SAndroid Build Coastguard Worker// Constant Buffer Addressing Support
1354*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1355*9880d681SAndroid Build Coastguard Worker
1356*9880d681SAndroid Build Coastguard Workerlet usesCustomInserter = 1, isCodeGenOnly = 1, isPseudo = 1, Namespace = "AMDGPU"  in {
1357*9880d681SAndroid Build Coastguard Workerdef CONST_COPY : Instruction {
1358*9880d681SAndroid Build Coastguard Worker  let OutOperandList = (outs R600_Reg32:$dst);
1359*9880d681SAndroid Build Coastguard Worker  let InOperandList = (ins i32imm:$src);
1360*9880d681SAndroid Build Coastguard Worker  let Pattern =
1361*9880d681SAndroid Build Coastguard Worker      [(set R600_Reg32:$dst, (CONST_ADDRESS ADDRGA_CONST_OFFSET:$src))];
1362*9880d681SAndroid Build Coastguard Worker  let AsmString = "CONST_COPY";
1363*9880d681SAndroid Build Coastguard Worker  let hasSideEffects = 0;
1364*9880d681SAndroid Build Coastguard Worker  let isAsCheapAsAMove = 1;
1365*9880d681SAndroid Build Coastguard Worker  let Itinerary = NullALU;
1366*9880d681SAndroid Build Coastguard Worker}
1367*9880d681SAndroid Build Coastguard Worker} // end usesCustomInserter = 1, isCodeGenOnly = 1, isPseudo = 1, Namespace = "AMDGPU"
1368*9880d681SAndroid Build Coastguard Worker
1369*9880d681SAndroid Build Coastguard Workerdef TEX_VTX_CONSTBUF :
1370*9880d681SAndroid Build Coastguard Worker  InstR600ISA <(outs R600_Reg128:$dst), (ins MEMxi:$ptr, i32imm:$BUFFER_ID), "VTX_READ_eg $dst, $ptr",
1371*9880d681SAndroid Build Coastguard Worker      [(set v4i32:$dst, (CONST_ADDRESS ADDRGA_VAR_OFFSET:$ptr, (i32 imm:$BUFFER_ID)))]>,
1372*9880d681SAndroid Build Coastguard Worker  VTX_WORD1_GPR, VTX_WORD0_eg {
1373*9880d681SAndroid Build Coastguard Worker
1374*9880d681SAndroid Build Coastguard Worker  let VC_INST = 0;
1375*9880d681SAndroid Build Coastguard Worker  let FETCH_TYPE = 2;
1376*9880d681SAndroid Build Coastguard Worker  let FETCH_WHOLE_QUAD = 0;
1377*9880d681SAndroid Build Coastguard Worker  let SRC_REL = 0;
1378*9880d681SAndroid Build Coastguard Worker  let SRC_SEL_X = 0;
1379*9880d681SAndroid Build Coastguard Worker  let DST_REL = 0;
1380*9880d681SAndroid Build Coastguard Worker  let USE_CONST_FIELDS = 0;
1381*9880d681SAndroid Build Coastguard Worker  let NUM_FORMAT_ALL = 2;
1382*9880d681SAndroid Build Coastguard Worker  let FORMAT_COMP_ALL = 1;
1383*9880d681SAndroid Build Coastguard Worker  let SRF_MODE_ALL = 1;
1384*9880d681SAndroid Build Coastguard Worker  let MEGA_FETCH_COUNT = 16;
1385*9880d681SAndroid Build Coastguard Worker  let DST_SEL_X        = 0;
1386*9880d681SAndroid Build Coastguard Worker  let DST_SEL_Y        = 1;
1387*9880d681SAndroid Build Coastguard Worker  let DST_SEL_Z        = 2;
1388*9880d681SAndroid Build Coastguard Worker  let DST_SEL_W        = 3;
1389*9880d681SAndroid Build Coastguard Worker  let DATA_FORMAT      = 35;
1390*9880d681SAndroid Build Coastguard Worker
1391*9880d681SAndroid Build Coastguard Worker  let Inst{31-0} = Word0;
1392*9880d681SAndroid Build Coastguard Worker  let Inst{63-32} = Word1;
1393*9880d681SAndroid Build Coastguard Worker
1394*9880d681SAndroid Build Coastguard Worker// LLVM can only encode 64-bit instructions, so these fields are manually
1395*9880d681SAndroid Build Coastguard Worker// encoded in R600CodeEmitter
1396*9880d681SAndroid Build Coastguard Worker//
1397*9880d681SAndroid Build Coastguard Worker// bits<16> OFFSET;
1398*9880d681SAndroid Build Coastguard Worker// bits<2>  ENDIAN_SWAP = 0;
1399*9880d681SAndroid Build Coastguard Worker// bits<1>  CONST_BUF_NO_STRIDE = 0;
1400*9880d681SAndroid Build Coastguard Worker// bits<1>  MEGA_FETCH = 0;
1401*9880d681SAndroid Build Coastguard Worker// bits<1>  ALT_CONST = 0;
1402*9880d681SAndroid Build Coastguard Worker// bits<2>  BUFFER_INDEX_MODE = 0;
1403*9880d681SAndroid Build Coastguard Worker
1404*9880d681SAndroid Build Coastguard Worker
1405*9880d681SAndroid Build Coastguard Worker
1406*9880d681SAndroid Build Coastguard Worker// VTX_WORD2 (LLVM can only encode 64-bit instructions, so WORD2 encoding
1407*9880d681SAndroid Build Coastguard Worker// is done in R600CodeEmitter
1408*9880d681SAndroid Build Coastguard Worker//
1409*9880d681SAndroid Build Coastguard Worker// Inst{79-64} = OFFSET;
1410*9880d681SAndroid Build Coastguard Worker// Inst{81-80} = ENDIAN_SWAP;
1411*9880d681SAndroid Build Coastguard Worker// Inst{82}    = CONST_BUF_NO_STRIDE;
1412*9880d681SAndroid Build Coastguard Worker// Inst{83}    = MEGA_FETCH;
1413*9880d681SAndroid Build Coastguard Worker// Inst{84}    = ALT_CONST;
1414*9880d681SAndroid Build Coastguard Worker// Inst{86-85} = BUFFER_INDEX_MODE;
1415*9880d681SAndroid Build Coastguard Worker// Inst{95-86} = 0; Reserved
1416*9880d681SAndroid Build Coastguard Worker
1417*9880d681SAndroid Build Coastguard Worker// VTX_WORD3 (Padding)
1418*9880d681SAndroid Build Coastguard Worker//
1419*9880d681SAndroid Build Coastguard Worker// Inst{127-96} = 0;
1420*9880d681SAndroid Build Coastguard Worker  let VTXInst = 1;
1421*9880d681SAndroid Build Coastguard Worker}
1422*9880d681SAndroid Build Coastguard Worker
1423*9880d681SAndroid Build Coastguard Workerdef TEX_VTX_TEXBUF:
1424*9880d681SAndroid Build Coastguard Worker  InstR600ISA <(outs R600_Reg128:$dst), (ins MEMxi:$ptr, i32imm:$BUFFER_ID), "TEX_VTX_EXPLICIT_READ $dst, $ptr">,
1425*9880d681SAndroid Build Coastguard WorkerVTX_WORD1_GPR, VTX_WORD0_eg {
1426*9880d681SAndroid Build Coastguard Worker
1427*9880d681SAndroid Build Coastguard Workerlet VC_INST = 0;
1428*9880d681SAndroid Build Coastguard Workerlet FETCH_TYPE = 2;
1429*9880d681SAndroid Build Coastguard Workerlet FETCH_WHOLE_QUAD = 0;
1430*9880d681SAndroid Build Coastguard Workerlet SRC_REL = 0;
1431*9880d681SAndroid Build Coastguard Workerlet SRC_SEL_X = 0;
1432*9880d681SAndroid Build Coastguard Workerlet DST_REL = 0;
1433*9880d681SAndroid Build Coastguard Workerlet USE_CONST_FIELDS = 1;
1434*9880d681SAndroid Build Coastguard Workerlet NUM_FORMAT_ALL = 0;
1435*9880d681SAndroid Build Coastguard Workerlet FORMAT_COMP_ALL = 0;
1436*9880d681SAndroid Build Coastguard Workerlet SRF_MODE_ALL = 1;
1437*9880d681SAndroid Build Coastguard Workerlet MEGA_FETCH_COUNT = 16;
1438*9880d681SAndroid Build Coastguard Workerlet DST_SEL_X        = 0;
1439*9880d681SAndroid Build Coastguard Workerlet DST_SEL_Y        = 1;
1440*9880d681SAndroid Build Coastguard Workerlet DST_SEL_Z        = 2;
1441*9880d681SAndroid Build Coastguard Workerlet DST_SEL_W        = 3;
1442*9880d681SAndroid Build Coastguard Workerlet DATA_FORMAT      = 0;
1443*9880d681SAndroid Build Coastguard Worker
1444*9880d681SAndroid Build Coastguard Workerlet Inst{31-0} = Word0;
1445*9880d681SAndroid Build Coastguard Workerlet Inst{63-32} = Word1;
1446*9880d681SAndroid Build Coastguard Worker
1447*9880d681SAndroid Build Coastguard Worker// LLVM can only encode 64-bit instructions, so these fields are manually
1448*9880d681SAndroid Build Coastguard Worker// encoded in R600CodeEmitter
1449*9880d681SAndroid Build Coastguard Worker//
1450*9880d681SAndroid Build Coastguard Worker// bits<16> OFFSET;
1451*9880d681SAndroid Build Coastguard Worker// bits<2>  ENDIAN_SWAP = 0;
1452*9880d681SAndroid Build Coastguard Worker// bits<1>  CONST_BUF_NO_STRIDE = 0;
1453*9880d681SAndroid Build Coastguard Worker// bits<1>  MEGA_FETCH = 0;
1454*9880d681SAndroid Build Coastguard Worker// bits<1>  ALT_CONST = 0;
1455*9880d681SAndroid Build Coastguard Worker// bits<2>  BUFFER_INDEX_MODE = 0;
1456*9880d681SAndroid Build Coastguard Worker
1457*9880d681SAndroid Build Coastguard Worker
1458*9880d681SAndroid Build Coastguard Worker
1459*9880d681SAndroid Build Coastguard Worker// VTX_WORD2 (LLVM can only encode 64-bit instructions, so WORD2 encoding
1460*9880d681SAndroid Build Coastguard Worker// is done in R600CodeEmitter
1461*9880d681SAndroid Build Coastguard Worker//
1462*9880d681SAndroid Build Coastguard Worker// Inst{79-64} = OFFSET;
1463*9880d681SAndroid Build Coastguard Worker// Inst{81-80} = ENDIAN_SWAP;
1464*9880d681SAndroid Build Coastguard Worker// Inst{82}    = CONST_BUF_NO_STRIDE;
1465*9880d681SAndroid Build Coastguard Worker// Inst{83}    = MEGA_FETCH;
1466*9880d681SAndroid Build Coastguard Worker// Inst{84}    = ALT_CONST;
1467*9880d681SAndroid Build Coastguard Worker// Inst{86-85} = BUFFER_INDEX_MODE;
1468*9880d681SAndroid Build Coastguard Worker// Inst{95-86} = 0; Reserved
1469*9880d681SAndroid Build Coastguard Worker
1470*9880d681SAndroid Build Coastguard Worker// VTX_WORD3 (Padding)
1471*9880d681SAndroid Build Coastguard Worker//
1472*9880d681SAndroid Build Coastguard Worker// Inst{127-96} = 0;
1473*9880d681SAndroid Build Coastguard Worker  let VTXInst = 1;
1474*9880d681SAndroid Build Coastguard Worker}
1475*9880d681SAndroid Build Coastguard Worker
1476*9880d681SAndroid Build Coastguard Worker//===---------------------------------------------------------------------===//
1477*9880d681SAndroid Build Coastguard Worker// Flow and Program control Instructions
1478*9880d681SAndroid Build Coastguard Worker//===---------------------------------------------------------------------===//
1479*9880d681SAndroid Build Coastguard Workerclass ILFormat<dag outs, dag ins, string asmstr, list<dag> pattern>
1480*9880d681SAndroid Build Coastguard Worker: Instruction {
1481*9880d681SAndroid Build Coastguard Worker
1482*9880d681SAndroid Build Coastguard Worker     let Namespace = "AMDGPU";
1483*9880d681SAndroid Build Coastguard Worker     dag OutOperandList = outs;
1484*9880d681SAndroid Build Coastguard Worker     dag InOperandList = ins;
1485*9880d681SAndroid Build Coastguard Worker     let Pattern = pattern;
1486*9880d681SAndroid Build Coastguard Worker     let AsmString = !strconcat(asmstr, "\n");
1487*9880d681SAndroid Build Coastguard Worker     let isPseudo = 1;
1488*9880d681SAndroid Build Coastguard Worker     let Itinerary = NullALU;
1489*9880d681SAndroid Build Coastguard Worker     bit hasIEEEFlag = 0;
1490*9880d681SAndroid Build Coastguard Worker     bit hasZeroOpFlag = 0;
1491*9880d681SAndroid Build Coastguard Worker     let mayLoad = 0;
1492*9880d681SAndroid Build Coastguard Worker     let mayStore = 0;
1493*9880d681SAndroid Build Coastguard Worker     let hasSideEffects = 0;
1494*9880d681SAndroid Build Coastguard Worker     let isCodeGenOnly = 1;
1495*9880d681SAndroid Build Coastguard Worker}
1496*9880d681SAndroid Build Coastguard Worker
1497*9880d681SAndroid Build Coastguard Workermulticlass BranchConditional<SDNode Op, RegisterClass rci, RegisterClass rcf> {
1498*9880d681SAndroid Build Coastguard Worker    def _i32 : ILFormat<(outs),
1499*9880d681SAndroid Build Coastguard Worker  (ins brtarget:$target, rci:$src0),
1500*9880d681SAndroid Build Coastguard Worker        "; i32 Pseudo branch instruction",
1501*9880d681SAndroid Build Coastguard Worker  [(Op bb:$target, (i32 rci:$src0))]>;
1502*9880d681SAndroid Build Coastguard Worker    def _f32 : ILFormat<(outs),
1503*9880d681SAndroid Build Coastguard Worker  (ins brtarget:$target, rcf:$src0),
1504*9880d681SAndroid Build Coastguard Worker        "; f32 Pseudo branch instruction",
1505*9880d681SAndroid Build Coastguard Worker  [(Op bb:$target, (f32 rcf:$src0))]>;
1506*9880d681SAndroid Build Coastguard Worker}
1507*9880d681SAndroid Build Coastguard Worker
1508*9880d681SAndroid Build Coastguard Worker// Only scalar types should generate flow control
1509*9880d681SAndroid Build Coastguard Workermulticlass BranchInstr<string name> {
1510*9880d681SAndroid Build Coastguard Worker  def _i32 : ILFormat<(outs), (ins R600_Reg32:$src),
1511*9880d681SAndroid Build Coastguard Worker      !strconcat(name, " $src"), []>;
1512*9880d681SAndroid Build Coastguard Worker  def _f32 : ILFormat<(outs), (ins R600_Reg32:$src),
1513*9880d681SAndroid Build Coastguard Worker      !strconcat(name, " $src"), []>;
1514*9880d681SAndroid Build Coastguard Worker}
1515*9880d681SAndroid Build Coastguard Worker// Only scalar types should generate flow control
1516*9880d681SAndroid Build Coastguard Workermulticlass BranchInstr2<string name> {
1517*9880d681SAndroid Build Coastguard Worker  def _i32 : ILFormat<(outs), (ins R600_Reg32:$src0, R600_Reg32:$src1),
1518*9880d681SAndroid Build Coastguard Worker      !strconcat(name, " $src0, $src1"), []>;
1519*9880d681SAndroid Build Coastguard Worker  def _f32 : ILFormat<(outs), (ins R600_Reg32:$src0, R600_Reg32:$src1),
1520*9880d681SAndroid Build Coastguard Worker      !strconcat(name, " $src0, $src1"), []>;
1521*9880d681SAndroid Build Coastguard Worker}
1522*9880d681SAndroid Build Coastguard Worker
1523*9880d681SAndroid Build Coastguard Worker//===---------------------------------------------------------------------===//
1524*9880d681SAndroid Build Coastguard Worker// Custom Inserter for Branches and returns, this eventually will be a
1525*9880d681SAndroid Build Coastguard Worker// separate pass
1526*9880d681SAndroid Build Coastguard Worker//===---------------------------------------------------------------------===//
1527*9880d681SAndroid Build Coastguard Workerlet isTerminator = 1, usesCustomInserter = 1, isBranch = 1, isBarrier = 1 in {
1528*9880d681SAndroid Build Coastguard Worker  def BRANCH : ILFormat<(outs), (ins brtarget:$target),
1529*9880d681SAndroid Build Coastguard Worker      "; Pseudo unconditional branch instruction",
1530*9880d681SAndroid Build Coastguard Worker      [(br bb:$target)]>;
1531*9880d681SAndroid Build Coastguard Worker  defm BRANCH_COND : BranchConditional<IL_brcond, R600_Reg32, R600_Reg32>;
1532*9880d681SAndroid Build Coastguard Worker}
1533*9880d681SAndroid Build Coastguard Worker
1534*9880d681SAndroid Build Coastguard Worker//===---------------------------------------------------------------------===//
1535*9880d681SAndroid Build Coastguard Worker// Return instruction
1536*9880d681SAndroid Build Coastguard Worker//===---------------------------------------------------------------------===//
1537*9880d681SAndroid Build Coastguard Workerlet isTerminator = 1, isReturn = 1, hasCtrlDep = 1,
1538*9880d681SAndroid Build Coastguard Worker    usesCustomInserter = 1 in {
1539*9880d681SAndroid Build Coastguard Worker  def RETURN : ILFormat<(outs), (ins variable_ops),
1540*9880d681SAndroid Build Coastguard Worker    "RETURN", [(AMDGPUendpgm)]
1541*9880d681SAndroid Build Coastguard Worker  >;
1542*9880d681SAndroid Build Coastguard Worker}
1543*9880d681SAndroid Build Coastguard Worker
1544*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1545*9880d681SAndroid Build Coastguard Worker// Branch Instructions
1546*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1547*9880d681SAndroid Build Coastguard Worker
1548*9880d681SAndroid Build Coastguard Workerdef IF_PREDICATE_SET  : ILFormat<(outs), (ins R600_Reg32:$src),
1549*9880d681SAndroid Build Coastguard Worker  "IF_PREDICATE_SET $src", []>;
1550*9880d681SAndroid Build Coastguard Worker
1551*9880d681SAndroid Build Coastguard Workerlet isTerminator=1 in {
1552*9880d681SAndroid Build Coastguard Worker  def BREAK       : ILFormat< (outs), (ins),
1553*9880d681SAndroid Build Coastguard Worker      "BREAK", []>;
1554*9880d681SAndroid Build Coastguard Worker  def CONTINUE    : ILFormat< (outs), (ins),
1555*9880d681SAndroid Build Coastguard Worker      "CONTINUE", []>;
1556*9880d681SAndroid Build Coastguard Worker  def DEFAULT     : ILFormat< (outs), (ins),
1557*9880d681SAndroid Build Coastguard Worker      "DEFAULT", []>;
1558*9880d681SAndroid Build Coastguard Worker  def ELSE        : ILFormat< (outs), (ins),
1559*9880d681SAndroid Build Coastguard Worker      "ELSE", []>;
1560*9880d681SAndroid Build Coastguard Worker  def ENDSWITCH   : ILFormat< (outs), (ins),
1561*9880d681SAndroid Build Coastguard Worker      "ENDSWITCH", []>;
1562*9880d681SAndroid Build Coastguard Worker  def ENDMAIN     : ILFormat< (outs), (ins),
1563*9880d681SAndroid Build Coastguard Worker      "ENDMAIN", []>;
1564*9880d681SAndroid Build Coastguard Worker  def END         : ILFormat< (outs), (ins),
1565*9880d681SAndroid Build Coastguard Worker      "END", []>;
1566*9880d681SAndroid Build Coastguard Worker  def ENDFUNC     : ILFormat< (outs), (ins),
1567*9880d681SAndroid Build Coastguard Worker      "ENDFUNC", []>;
1568*9880d681SAndroid Build Coastguard Worker  def ENDIF       : ILFormat< (outs), (ins),
1569*9880d681SAndroid Build Coastguard Worker      "ENDIF", []>;
1570*9880d681SAndroid Build Coastguard Worker  def WHILELOOP   : ILFormat< (outs), (ins),
1571*9880d681SAndroid Build Coastguard Worker      "WHILE", []>;
1572*9880d681SAndroid Build Coastguard Worker  def ENDLOOP     : ILFormat< (outs), (ins),
1573*9880d681SAndroid Build Coastguard Worker      "ENDLOOP", []>;
1574*9880d681SAndroid Build Coastguard Worker  def FUNC        : ILFormat< (outs), (ins),
1575*9880d681SAndroid Build Coastguard Worker      "FUNC", []>;
1576*9880d681SAndroid Build Coastguard Worker  def RETDYN      : ILFormat< (outs), (ins),
1577*9880d681SAndroid Build Coastguard Worker      "RET_DYN", []>;
1578*9880d681SAndroid Build Coastguard Worker  // This opcode has custom swizzle pattern encoded in Swizzle Encoder
1579*9880d681SAndroid Build Coastguard Worker  defm IF_LOGICALNZ  : BranchInstr<"IF_LOGICALNZ">;
1580*9880d681SAndroid Build Coastguard Worker  // This opcode has custom swizzle pattern encoded in Swizzle Encoder
1581*9880d681SAndroid Build Coastguard Worker  defm IF_LOGICALZ   : BranchInstr<"IF_LOGICALZ">;
1582*9880d681SAndroid Build Coastguard Worker  // This opcode has custom swizzle pattern encoded in Swizzle Encoder
1583*9880d681SAndroid Build Coastguard Worker  defm BREAK_LOGICALNZ : BranchInstr<"BREAK_LOGICALNZ">;
1584*9880d681SAndroid Build Coastguard Worker  // This opcode has custom swizzle pattern encoded in Swizzle Encoder
1585*9880d681SAndroid Build Coastguard Worker  defm BREAK_LOGICALZ : BranchInstr<"BREAK_LOGICALZ">;
1586*9880d681SAndroid Build Coastguard Worker  // This opcode has custom swizzle pattern encoded in Swizzle Encoder
1587*9880d681SAndroid Build Coastguard Worker  defm CONTINUE_LOGICALNZ : BranchInstr<"CONTINUE_LOGICALNZ">;
1588*9880d681SAndroid Build Coastguard Worker  // This opcode has custom swizzle pattern encoded in Swizzle Encoder
1589*9880d681SAndroid Build Coastguard Worker  defm CONTINUE_LOGICALZ : BranchInstr<"CONTINUE_LOGICALZ">;
1590*9880d681SAndroid Build Coastguard Worker  defm IFC         : BranchInstr2<"IFC">;
1591*9880d681SAndroid Build Coastguard Worker  defm BREAKC      : BranchInstr2<"BREAKC">;
1592*9880d681SAndroid Build Coastguard Worker  defm CONTINUEC   : BranchInstr2<"CONTINUEC">;
1593*9880d681SAndroid Build Coastguard Worker}
1594*9880d681SAndroid Build Coastguard Worker
1595*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1596*9880d681SAndroid Build Coastguard Worker// Indirect addressing pseudo instructions
1597*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1598*9880d681SAndroid Build Coastguard Worker
1599*9880d681SAndroid Build Coastguard Workerlet isPseudo = 1 in {
1600*9880d681SAndroid Build Coastguard Worker
1601*9880d681SAndroid Build Coastguard Workerclass ExtractVertical <RegisterClass vec_rc> : InstR600 <
1602*9880d681SAndroid Build Coastguard Worker  (outs R600_Reg32:$dst),
1603*9880d681SAndroid Build Coastguard Worker  (ins vec_rc:$vec, R600_Reg32:$index), "",
1604*9880d681SAndroid Build Coastguard Worker  [],
1605*9880d681SAndroid Build Coastguard Worker  AnyALU
1606*9880d681SAndroid Build Coastguard Worker>;
1607*9880d681SAndroid Build Coastguard Worker
1608*9880d681SAndroid Build Coastguard Workerlet Constraints = "$dst = $vec" in {
1609*9880d681SAndroid Build Coastguard Worker
1610*9880d681SAndroid Build Coastguard Workerclass InsertVertical <RegisterClass vec_rc> : InstR600 <
1611*9880d681SAndroid Build Coastguard Worker  (outs vec_rc:$dst),
1612*9880d681SAndroid Build Coastguard Worker  (ins vec_rc:$vec, R600_Reg32:$value, R600_Reg32:$index), "",
1613*9880d681SAndroid Build Coastguard Worker  [],
1614*9880d681SAndroid Build Coastguard Worker  AnyALU
1615*9880d681SAndroid Build Coastguard Worker>;
1616*9880d681SAndroid Build Coastguard Worker
1617*9880d681SAndroid Build Coastguard Worker} // End Constraints = "$dst = $vec"
1618*9880d681SAndroid Build Coastguard Worker
1619*9880d681SAndroid Build Coastguard Worker} // End isPseudo = 1
1620*9880d681SAndroid Build Coastguard Worker
1621*9880d681SAndroid Build Coastguard Workerdef R600_EXTRACT_ELT_V2 : ExtractVertical <R600_Reg64Vertical>;
1622*9880d681SAndroid Build Coastguard Workerdef R600_EXTRACT_ELT_V4 : ExtractVertical <R600_Reg128Vertical>;
1623*9880d681SAndroid Build Coastguard Worker
1624*9880d681SAndroid Build Coastguard Workerdef R600_INSERT_ELT_V2 : InsertVertical <R600_Reg64Vertical>;
1625*9880d681SAndroid Build Coastguard Workerdef R600_INSERT_ELT_V4 : InsertVertical <R600_Reg128Vertical>;
1626*9880d681SAndroid Build Coastguard Worker
1627*9880d681SAndroid Build Coastguard Workerclass ExtractVerticalPat <Instruction inst, ValueType vec_ty,
1628*9880d681SAndroid Build Coastguard Worker                          ValueType scalar_ty> : Pat <
1629*9880d681SAndroid Build Coastguard Worker  (scalar_ty (extractelt vec_ty:$vec, i32:$index)),
1630*9880d681SAndroid Build Coastguard Worker  (inst $vec, $index)
1631*9880d681SAndroid Build Coastguard Worker>;
1632*9880d681SAndroid Build Coastguard Worker
1633*9880d681SAndroid Build Coastguard Workerdef : ExtractVerticalPat <R600_EXTRACT_ELT_V2, v2i32, i32>;
1634*9880d681SAndroid Build Coastguard Workerdef : ExtractVerticalPat <R600_EXTRACT_ELT_V2, v2f32, f32>;
1635*9880d681SAndroid Build Coastguard Workerdef : ExtractVerticalPat <R600_EXTRACT_ELT_V4, v4i32, i32>;
1636*9880d681SAndroid Build Coastguard Workerdef : ExtractVerticalPat <R600_EXTRACT_ELT_V4, v4f32, f32>;
1637*9880d681SAndroid Build Coastguard Worker
1638*9880d681SAndroid Build Coastguard Workerclass InsertVerticalPat <Instruction inst, ValueType vec_ty,
1639*9880d681SAndroid Build Coastguard Worker                         ValueType scalar_ty> : Pat <
1640*9880d681SAndroid Build Coastguard Worker  (vec_ty (insertelt vec_ty:$vec, scalar_ty:$value, i32:$index)),
1641*9880d681SAndroid Build Coastguard Worker  (inst $vec, $value, $index)
1642*9880d681SAndroid Build Coastguard Worker>;
1643*9880d681SAndroid Build Coastguard Worker
1644*9880d681SAndroid Build Coastguard Workerdef : InsertVerticalPat <R600_INSERT_ELT_V2, v2i32, i32>;
1645*9880d681SAndroid Build Coastguard Workerdef : InsertVerticalPat <R600_INSERT_ELT_V2, v2f32, f32>;
1646*9880d681SAndroid Build Coastguard Workerdef : InsertVerticalPat <R600_INSERT_ELT_V4, v4i32, i32>;
1647*9880d681SAndroid Build Coastguard Workerdef : InsertVerticalPat <R600_INSERT_ELT_V4, v4f32, f32>;
1648*9880d681SAndroid Build Coastguard Worker
1649*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1650*9880d681SAndroid Build Coastguard Worker// ISel Patterns
1651*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
1652*9880d681SAndroid Build Coastguard Worker
1653*9880d681SAndroid Build Coastguard Worker// CND*_INT Patterns for f32 True / False values
1654*9880d681SAndroid Build Coastguard Worker
1655*9880d681SAndroid Build Coastguard Workerclass CND_INT_f32 <InstR600 cnd, CondCode cc> : Pat <
1656*9880d681SAndroid Build Coastguard Worker  (selectcc i32:$src0, 0, f32:$src1, f32:$src2, cc),
1657*9880d681SAndroid Build Coastguard Worker  (cnd $src0, $src1, $src2)
1658*9880d681SAndroid Build Coastguard Worker>;
1659*9880d681SAndroid Build Coastguard Worker
1660*9880d681SAndroid Build Coastguard Workerdef : CND_INT_f32 <CNDE_INT,  SETEQ>;
1661*9880d681SAndroid Build Coastguard Workerdef : CND_INT_f32 <CNDGT_INT, SETGT>;
1662*9880d681SAndroid Build Coastguard Workerdef : CND_INT_f32 <CNDGE_INT, SETGE>;
1663*9880d681SAndroid Build Coastguard Worker
1664*9880d681SAndroid Build Coastguard Worker//CNDGE_INT extra pattern
1665*9880d681SAndroid Build Coastguard Workerdef : Pat <
1666*9880d681SAndroid Build Coastguard Worker  (selectcc i32:$src0, -1, i32:$src1, i32:$src2, COND_SGT),
1667*9880d681SAndroid Build Coastguard Worker  (CNDGE_INT $src0, $src1, $src2)
1668*9880d681SAndroid Build Coastguard Worker>;
1669*9880d681SAndroid Build Coastguard Worker
1670*9880d681SAndroid Build Coastguard Worker// KIL Patterns
1671*9880d681SAndroid Build Coastguard Workerdef KILP : Pat <
1672*9880d681SAndroid Build Coastguard Worker  (int_AMDGPU_kilp),
1673*9880d681SAndroid Build Coastguard Worker  (MASK_WRITE (KILLGT (f32 ONE), (f32 ZERO)))
1674*9880d681SAndroid Build Coastguard Worker>;
1675*9880d681SAndroid Build Coastguard Worker
1676*9880d681SAndroid Build Coastguard Workerdef KIL : Pat <
1677*9880d681SAndroid Build Coastguard Worker  (int_AMDGPU_kill f32:$src0),
1678*9880d681SAndroid Build Coastguard Worker  (MASK_WRITE (KILLGT (f32 ZERO), $src0))
1679*9880d681SAndroid Build Coastguard Worker>;
1680*9880d681SAndroid Build Coastguard Worker
1681*9880d681SAndroid Build Coastguard Workerdef : Extract_Element <f32, v4f32, 0, sub0>;
1682*9880d681SAndroid Build Coastguard Workerdef : Extract_Element <f32, v4f32, 1, sub1>;
1683*9880d681SAndroid Build Coastguard Workerdef : Extract_Element <f32, v4f32, 2, sub2>;
1684*9880d681SAndroid Build Coastguard Workerdef : Extract_Element <f32, v4f32, 3, sub3>;
1685*9880d681SAndroid Build Coastguard Worker
1686*9880d681SAndroid Build Coastguard Workerdef : Insert_Element <f32, v4f32, 0, sub0>;
1687*9880d681SAndroid Build Coastguard Workerdef : Insert_Element <f32, v4f32, 1, sub1>;
1688*9880d681SAndroid Build Coastguard Workerdef : Insert_Element <f32, v4f32, 2, sub2>;
1689*9880d681SAndroid Build Coastguard Workerdef : Insert_Element <f32, v4f32, 3, sub3>;
1690*9880d681SAndroid Build Coastguard Worker
1691*9880d681SAndroid Build Coastguard Workerdef : Extract_Element <i32, v4i32, 0, sub0>;
1692*9880d681SAndroid Build Coastguard Workerdef : Extract_Element <i32, v4i32, 1, sub1>;
1693*9880d681SAndroid Build Coastguard Workerdef : Extract_Element <i32, v4i32, 2, sub2>;
1694*9880d681SAndroid Build Coastguard Workerdef : Extract_Element <i32, v4i32, 3, sub3>;
1695*9880d681SAndroid Build Coastguard Worker
1696*9880d681SAndroid Build Coastguard Workerdef : Insert_Element <i32, v4i32, 0, sub0>;
1697*9880d681SAndroid Build Coastguard Workerdef : Insert_Element <i32, v4i32, 1, sub1>;
1698*9880d681SAndroid Build Coastguard Workerdef : Insert_Element <i32, v4i32, 2, sub2>;
1699*9880d681SAndroid Build Coastguard Workerdef : Insert_Element <i32, v4i32, 3, sub3>;
1700*9880d681SAndroid Build Coastguard Worker
1701*9880d681SAndroid Build Coastguard Workerdef : Extract_Element <f32, v2f32, 0, sub0>;
1702*9880d681SAndroid Build Coastguard Workerdef : Extract_Element <f32, v2f32, 1, sub1>;
1703*9880d681SAndroid Build Coastguard Worker
1704*9880d681SAndroid Build Coastguard Workerdef : Insert_Element <f32, v2f32, 0, sub0>;
1705*9880d681SAndroid Build Coastguard Workerdef : Insert_Element <f32, v2f32, 1, sub1>;
1706*9880d681SAndroid Build Coastguard Worker
1707*9880d681SAndroid Build Coastguard Workerdef : Extract_Element <i32, v2i32, 0, sub0>;
1708*9880d681SAndroid Build Coastguard Workerdef : Extract_Element <i32, v2i32, 1, sub1>;
1709*9880d681SAndroid Build Coastguard Worker
1710*9880d681SAndroid Build Coastguard Workerdef : Insert_Element <i32, v2i32, 0, sub0>;
1711*9880d681SAndroid Build Coastguard Workerdef : Insert_Element <i32, v2i32, 1, sub1>;
1712*9880d681SAndroid Build Coastguard Worker
1713*9880d681SAndroid Build Coastguard Worker// bitconvert patterns
1714*9880d681SAndroid Build Coastguard Worker
1715*9880d681SAndroid Build Coastguard Workerdef : BitConvert <i32, f32, R600_Reg32>;
1716*9880d681SAndroid Build Coastguard Workerdef : BitConvert <f32, i32, R600_Reg32>;
1717*9880d681SAndroid Build Coastguard Workerdef : BitConvert <v2f32, v2i32, R600_Reg64>;
1718*9880d681SAndroid Build Coastguard Workerdef : BitConvert <v2i32, v2f32, R600_Reg64>;
1719*9880d681SAndroid Build Coastguard Workerdef : BitConvert <v4f32, v4i32, R600_Reg128>;
1720*9880d681SAndroid Build Coastguard Workerdef : BitConvert <v4i32, v4f32, R600_Reg128>;
1721*9880d681SAndroid Build Coastguard Worker
1722*9880d681SAndroid Build Coastguard Worker// DWORDADDR pattern
1723*9880d681SAndroid Build Coastguard Workerdef : DwordAddrPat  <i32, R600_Reg32>;
1724*9880d681SAndroid Build Coastguard Worker
1725*9880d681SAndroid Build Coastguard Worker} // End isR600toCayman Predicate
1726*9880d681SAndroid Build Coastguard Worker
1727*9880d681SAndroid Build Coastguard Workerdef getLDSNoRetOp : InstrMapping {
1728*9880d681SAndroid Build Coastguard Worker  let FilterClass = "R600_LDS_1A1D";
1729*9880d681SAndroid Build Coastguard Worker  let RowFields = ["BaseOp"];
1730*9880d681SAndroid Build Coastguard Worker  let ColFields = ["DisableEncoding"];
1731*9880d681SAndroid Build Coastguard Worker  let KeyCol = ["$dst"];
1732*9880d681SAndroid Build Coastguard Worker  let ValueCols = [[""""]];
1733*9880d681SAndroid Build Coastguard Worker}
1734