R600/SI: Add pattern for AMDGPUurecip
[oota-llvm.git] / lib / Target / R600 / R600Instructions.td
1 //===-- R600Instructions.td - R600 Instruction defs  -------*- tablegen -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // R600 Tablegen instruction definitions
11 //
12 //===----------------------------------------------------------------------===//
13
14 include "R600Intrinsics.td"
15
16 class InstR600 <bits<11> inst, dag outs, dag ins, string asm, list<dag> pattern,
17                 InstrItinClass itin>
18     : AMDGPUInst <outs, ins, asm, pattern> {
19
20   field bits<64> Inst;
21   bit Trig = 0;
22   bit Op3 = 0;
23   bit isVector = 0;
24   bits<2> FlagOperandIdx = 0;
25   bit Op1 = 0;
26   bit Op2 = 0;
27   bit HasNativeOperands = 0;
28
29   bits<11> op_code = inst;
30   //let Inst = inst;
31   let Namespace = "AMDGPU";
32   let OutOperandList = outs;
33   let InOperandList = ins;
34   let AsmString = asm;
35   let Pattern = pattern;
36   let Itinerary = itin;
37
38   let TSFlags{4} = Trig;
39   let TSFlags{5} = Op3;
40
41   // Vector instructions are instructions that must fill all slots in an
42   // instruction group
43   let TSFlags{6} = isVector;
44   let TSFlags{8-7} = FlagOperandIdx;
45   let TSFlags{9} = HasNativeOperands;
46   let TSFlags{10} = Op1;
47   let TSFlags{11} = Op2;
48 }
49
50 class InstR600ISA <dag outs, dag ins, string asm, list<dag> pattern> :
51     AMDGPUInst <outs, ins, asm, pattern> {
52   field bits<64> Inst;
53
54   let Namespace = "AMDGPU";
55 }
56
57 def MEMxi : Operand<iPTR> {
58   let MIOperandInfo = (ops R600_TReg32_X:$ptr, i32imm:$index);
59   let PrintMethod = "printMemOperand";
60 }
61
62 def MEMrr : Operand<iPTR> {
63   let MIOperandInfo = (ops R600_Reg32:$ptr, R600_Reg32:$index);
64 }
65
66 // Operands for non-registers
67
68 class InstFlag<string PM = "printOperand", int Default = 0>
69     : OperandWithDefaultOps <i32, (ops (i32 Default))> {
70   let PrintMethod = PM;
71 }
72
73 // src_sel for ALU src operands, see also ALU_CONST, ALU_PARAM registers
74 def SEL : OperandWithDefaultOps <i32, (ops (i32 -1))> {
75   let PrintMethod = "printSel";
76 }
77
78 def LITERAL : InstFlag<"printLiteral">;
79
80 def WRITE : InstFlag <"printWrite", 1>;
81 def OMOD : InstFlag <"printOMOD">;
82 def REL : InstFlag <"printRel">;
83 def CLAMP : InstFlag <"printClamp">;
84 def NEG : InstFlag <"printNeg">;
85 def ABS : InstFlag <"printAbs">;
86 def UEM : InstFlag <"printUpdateExecMask">;
87 def UP : InstFlag <"printUpdatePred">;
88
89 // XXX: The r600g finalizer in Mesa expects last to be one in most cases.
90 // Once we start using the packetizer in this backend we should have this
91 // default to 0.
92 def LAST : InstFlag<"printLast", 1>;
93
94 def FRAMEri : Operand<iPTR> {
95   let MIOperandInfo = (ops R600_Reg32:$ptr, i32imm:$index);
96 }
97
98 def ADDRParam : ComplexPattern<i32, 2, "SelectADDRParam", [], []>;
99 def ADDRDWord : ComplexPattern<i32, 1, "SelectADDRDWord", [], []>;
100 def ADDRVTX_READ : ComplexPattern<i32, 2, "SelectADDRVTX_READ", [], []>;
101 def ADDRGA_CONST_OFFSET : ComplexPattern<i32, 1, "SelectGlobalValueConstantOffset", [], []>;
102 def ADDRGA_VAR_OFFSET : ComplexPattern<i32, 2, "SelectGlobalValueVariableOffset", [], []>;
103 def ADDRIndirect : ComplexPattern<iPTR, 2, "SelectADDRIndirect", [], []>;
104
105 class R600ALU_Word0 {
106   field bits<32> Word0;
107
108   bits<11> src0;
109   bits<1>  src0_neg;
110   bits<1>  src0_rel;
111   bits<11> src1;
112   bits<1>  src1_rel;
113   bits<1>  src1_neg;
114   bits<3>  index_mode = 0;
115   bits<2>  pred_sel;
116   bits<1>  last;
117
118   bits<9>  src0_sel  = src0{8-0};
119   bits<2>  src0_chan = src0{10-9};
120   bits<9>  src1_sel  = src1{8-0};
121   bits<2>  src1_chan = src1{10-9};
122
123   let Word0{8-0}   = src0_sel;
124   let Word0{9}     = src0_rel;
125   let Word0{11-10} = src0_chan;
126   let Word0{12}    = src0_neg;
127   let Word0{21-13} = src1_sel;
128   let Word0{22}    = src1_rel;
129   let Word0{24-23} = src1_chan;
130   let Word0{25}    = src1_neg;
131   let Word0{28-26} = index_mode;
132   let Word0{30-29} = pred_sel;
133   let Word0{31}    = last;
134 }
135
136 class R600ALU_Word1 {
137   field bits<32> Word1;
138
139   bits<11> dst;
140   bits<3>  bank_swizzle = 0;
141   bits<1>  dst_rel;
142   bits<1>  clamp;
143
144   bits<7>  dst_sel  = dst{6-0};
145   bits<2>  dst_chan = dst{10-9};
146
147   let Word1{20-18} = bank_swizzle;
148   let Word1{27-21} = dst_sel;
149   let Word1{28}    = dst_rel;
150   let Word1{30-29} = dst_chan;
151   let Word1{31}    = clamp;
152 }
153
154 class R600ALU_Word1_OP2 <bits<11> alu_inst> : R600ALU_Word1{
155
156   bits<1>  src0_abs;
157   bits<1>  src1_abs;
158   bits<1>  update_exec_mask;
159   bits<1>  update_pred;
160   bits<1>  write;
161   bits<2>  omod;
162
163   let Word1{0}     = src0_abs;
164   let Word1{1}     = src1_abs;
165   let Word1{2}     = update_exec_mask;
166   let Word1{3}     = update_pred;
167   let Word1{4}     = write;
168   let Word1{6-5}   = omod;
169   let Word1{17-7}  = alu_inst;
170 }
171
172 class R600ALU_Word1_OP3 <bits<5> alu_inst> : R600ALU_Word1{
173
174   bits<11> src2;
175   bits<1>  src2_rel;
176   bits<1>  src2_neg;
177
178   bits<9>  src2_sel = src2{8-0};
179   bits<2>  src2_chan = src2{10-9};
180
181   let Word1{8-0}   = src2_sel;
182   let Word1{9}     = src2_rel;
183   let Word1{11-10} = src2_chan;
184   let Word1{12}    = src2_neg;
185   let Word1{17-13} = alu_inst;
186 }
187
188 class VTX_WORD0 {
189   field bits<32> Word0;
190   bits<7> SRC_GPR;
191   bits<5> VC_INST;
192   bits<2> FETCH_TYPE;
193   bits<1> FETCH_WHOLE_QUAD;
194   bits<8> BUFFER_ID;
195   bits<1> SRC_REL;
196   bits<2> SRC_SEL_X;
197   bits<6> MEGA_FETCH_COUNT;
198
199   let Word0{4-0}   = VC_INST;
200   let Word0{6-5}   = FETCH_TYPE;
201   let Word0{7}     = FETCH_WHOLE_QUAD;
202   let Word0{15-8}  = BUFFER_ID;
203   let Word0{22-16} = SRC_GPR;
204   let Word0{23}    = SRC_REL;
205   let Word0{25-24} = SRC_SEL_X;
206   let Word0{31-26} = MEGA_FETCH_COUNT;
207 }
208
209 class VTX_WORD1_GPR {
210   field bits<32> Word1;
211   bits<7> DST_GPR;
212   bits<1> DST_REL;
213   bits<3> DST_SEL_X;
214   bits<3> DST_SEL_Y;
215   bits<3> DST_SEL_Z;
216   bits<3> DST_SEL_W;
217   bits<1> USE_CONST_FIELDS;
218   bits<6> DATA_FORMAT;
219   bits<2> NUM_FORMAT_ALL;
220   bits<1> FORMAT_COMP_ALL;
221   bits<1> SRF_MODE_ALL;
222
223   let Word1{6-0} = DST_GPR;
224   let Word1{7}    = DST_REL;
225   let Word1{8}    = 0; // Reserved
226   let Word1{11-9} = DST_SEL_X;
227   let Word1{14-12} = DST_SEL_Y;
228   let Word1{17-15} = DST_SEL_Z;
229   let Word1{20-18} = DST_SEL_W;
230   let Word1{21}    = USE_CONST_FIELDS;
231   let Word1{27-22} = DATA_FORMAT;
232   let Word1{29-28} = NUM_FORMAT_ALL;
233   let Word1{30}    = FORMAT_COMP_ALL;
234   let Word1{31}    = SRF_MODE_ALL;
235 }
236
237 class TEX_WORD0 {
238   field bits<32> Word0;
239
240   bits<5> TEX_INST;
241   bits<2> INST_MOD;
242   bits<1> FETCH_WHOLE_QUAD;
243   bits<8> RESOURCE_ID;
244   bits<7> SRC_GPR;
245   bits<1> SRC_REL;
246   bits<1> ALT_CONST;
247   bits<2> RESOURCE_INDEX_MODE;
248   bits<2> SAMPLER_INDEX_MODE;
249
250   let Word0{4-0} = TEX_INST;
251   let Word0{6-5} = INST_MOD;
252   let Word0{7} = FETCH_WHOLE_QUAD;
253   let Word0{15-8} = RESOURCE_ID;
254   let Word0{22-16} = SRC_GPR;
255   let Word0{23} = SRC_REL;
256   let Word0{24} = ALT_CONST;
257   let Word0{26-25} = RESOURCE_INDEX_MODE;
258   let Word0{28-27} = SAMPLER_INDEX_MODE;
259 }
260
261 class TEX_WORD1 {
262   field bits<32> Word1;
263
264   bits<7> DST_GPR;
265   bits<1> DST_REL;
266   bits<3> DST_SEL_X;
267   bits<3> DST_SEL_Y;
268   bits<3> DST_SEL_Z;
269   bits<3> DST_SEL_W;
270   bits<7> LOD_BIAS;
271   bits<1> COORD_TYPE_X;
272   bits<1> COORD_TYPE_Y;
273   bits<1> COORD_TYPE_Z;
274   bits<1> COORD_TYPE_W;
275
276   let Word1{6-0} = DST_GPR;
277   let Word1{7} = DST_REL;
278   let Word1{11-9} = DST_SEL_X;
279   let Word1{14-12} = DST_SEL_Y;
280   let Word1{17-15} = DST_SEL_Z;
281   let Word1{20-18} = DST_SEL_W;
282   let Word1{27-21} = LOD_BIAS;
283   let Word1{28} = COORD_TYPE_X;
284   let Word1{29} = COORD_TYPE_Y;
285   let Word1{30} = COORD_TYPE_Z;
286   let Word1{31} = COORD_TYPE_W;
287 }
288
289 class TEX_WORD2 {
290   field bits<32> Word2;
291
292   bits<5> OFFSET_X;
293   bits<5> OFFSET_Y;
294   bits<5> OFFSET_Z;
295   bits<5> SAMPLER_ID;
296   bits<3> SRC_SEL_X;
297   bits<3> SRC_SEL_Y;
298   bits<3> SRC_SEL_Z;
299   bits<3> SRC_SEL_W;
300
301   let Word2{4-0} = OFFSET_X;
302   let Word2{9-5} = OFFSET_Y;
303   let Word2{14-10} = OFFSET_Z;
304   let Word2{19-15} = SAMPLER_ID;
305   let Word2{22-20} = SRC_SEL_X;
306   let Word2{25-23} = SRC_SEL_Y;
307   let Word2{28-26} = SRC_SEL_Z;
308   let Word2{31-29} = SRC_SEL_W;
309 }
310
311 /*
312 XXX: R600 subtarget uses a slightly different encoding than the other
313 subtargets.  We currently handle this in R600MCCodeEmitter, but we may
314 want to use these instruction classes in the future.
315
316 class R600ALU_Word1_OP2_r600 : R600ALU_Word1_OP2 {
317
318   bits<1>  fog_merge;
319   bits<10> alu_inst;
320
321   let Inst{37}    = fog_merge;
322   let Inst{39-38} = omod;
323   let Inst{49-40} = alu_inst;
324 }
325
326 class R600ALU_Word1_OP2_r700 : R600ALU_Word1_OP2 {
327
328   bits<11> alu_inst;
329
330   let Inst{38-37} = omod;
331   let Inst{49-39} = alu_inst;
332 }
333 */
334
335 def R600_Pred : PredicateOperand<i32, (ops R600_Predicate),
336                                      (ops PRED_SEL_OFF)>;
337
338
339 let mayLoad = 0, mayStore = 0, hasSideEffects = 0 in {
340
341 // Class for instructions with only one source register.
342 // If you add new ins to this instruction, make sure they are listed before
343 // $literal, because the backend currently assumes that the last operand is
344 // a literal.  Also be sure to update the enum R600Op1OperandIndex::ROI in
345 // R600Defines.h, R600InstrInfo::buildDefaultInstruction(),
346 // and R600InstrInfo::getOperandIdx().
347 class R600_1OP <bits<11> inst, string opName, list<dag> pattern,
348                 InstrItinClass itin = AnyALU> :
349     InstR600 <0,
350               (outs R600_Reg32:$dst),
351               (ins WRITE:$write, OMOD:$omod, REL:$dst_rel, CLAMP:$clamp,
352                    R600_Reg32:$src0, NEG:$src0_neg, REL:$src0_rel, ABS:$src0_abs, SEL:$src0_sel,
353                    LAST:$last, R600_Pred:$pred_sel, LITERAL:$literal),
354               !strconcat("  ", opName,
355                    "$clamp $dst$write$dst_rel$omod, "
356                    "$src0_neg$src0_abs$src0$src0_abs$src0_rel, "
357                    "$literal $pred_sel$last"),
358               pattern,
359               itin>,
360     R600ALU_Word0,
361     R600ALU_Word1_OP2 <inst> {
362
363   let src1 = 0;
364   let src1_rel = 0;
365   let src1_neg = 0;
366   let src1_abs = 0;
367   let update_exec_mask = 0;
368   let update_pred = 0;
369   let HasNativeOperands = 1;
370   let Op1 = 1;
371   let DisableEncoding = "$literal";
372
373   let Inst{31-0}  = Word0;
374   let Inst{63-32} = Word1;
375 }
376
377 class R600_1OP_Helper <bits<11> inst, string opName, SDPatternOperator node,
378                     InstrItinClass itin = AnyALU> :
379     R600_1OP <inst, opName,
380               [(set R600_Reg32:$dst, (node R600_Reg32:$src0))]
381 >;
382
383 // If you add our change the operands for R600_2OP instructions, you must
384 // also update the R600Op2OperandIndex::ROI enum in R600Defines.h,
385 // R600InstrInfo::buildDefaultInstruction(), and R600InstrInfo::getOperandIdx().
386 class R600_2OP <bits<11> inst, string opName, list<dag> pattern,
387                 InstrItinClass itin = AnyALU> :
388   InstR600 <inst,
389           (outs R600_Reg32:$dst),
390           (ins UEM:$update_exec_mask, UP:$update_pred, WRITE:$write,
391                OMOD:$omod, REL:$dst_rel, CLAMP:$clamp,
392                R600_Reg32:$src0, NEG:$src0_neg, REL:$src0_rel, ABS:$src0_abs, SEL:$src0_sel,
393                R600_Reg32:$src1, NEG:$src1_neg, REL:$src1_rel, ABS:$src1_abs, SEL:$src1_sel,
394                LAST:$last, R600_Pred:$pred_sel, LITERAL:$literal),
395           !strconcat("  ", opName,
396                 "$clamp $update_exec_mask$update_pred$dst$write$dst_rel$omod, "
397                 "$src0_neg$src0_abs$src0$src0_abs$src0_rel, "
398                 "$src1_neg$src1_abs$src1$src1_abs$src1_rel, "
399                 "$literal $pred_sel$last"),
400           pattern,
401           itin>,
402     R600ALU_Word0,
403     R600ALU_Word1_OP2 <inst> {
404
405   let HasNativeOperands = 1;
406   let Op2 = 1;
407   let DisableEncoding = "$literal";
408
409   let Inst{31-0}  = Word0;
410   let Inst{63-32} = Word1;
411 }
412
413 class R600_2OP_Helper <bits<11> inst, string opName, SDPatternOperator node,
414                        InstrItinClass itim = AnyALU> :
415     R600_2OP <inst, opName,
416               [(set R600_Reg32:$dst, (node R600_Reg32:$src0,
417                                            R600_Reg32:$src1))]
418 >;
419
420 // If you add our change the operands for R600_3OP instructions, you must
421 // also update the R600Op3OperandIndex::ROI enum in R600Defines.h,
422 // R600InstrInfo::buildDefaultInstruction(), and
423 // R600InstrInfo::getOperandIdx().
424 class R600_3OP <bits<5> inst, string opName, list<dag> pattern,
425                 InstrItinClass itin = AnyALU> :
426   InstR600 <0,
427           (outs R600_Reg32:$dst),
428           (ins REL:$dst_rel, CLAMP:$clamp,
429                R600_Reg32:$src0, NEG:$src0_neg, REL:$src0_rel, SEL:$src0_sel,
430                R600_Reg32:$src1, NEG:$src1_neg, REL:$src1_rel, SEL:$src1_sel,
431                R600_Reg32:$src2, NEG:$src2_neg, REL:$src2_rel, SEL:$src2_sel,
432                LAST:$last, R600_Pred:$pred_sel, LITERAL:$literal),
433           !strconcat("  ", opName, "$clamp $dst$dst_rel, "
434                              "$src0_neg$src0$src0_rel, "
435                              "$src1_neg$src1$src1_rel, "
436                              "$src2_neg$src2$src2_rel, "
437                              "$literal $pred_sel$last"),
438           pattern,
439           itin>,
440     R600ALU_Word0,
441     R600ALU_Word1_OP3<inst>{
442
443   let HasNativeOperands = 1;
444   let DisableEncoding = "$literal";
445   let Op3 = 1;
446
447   let Inst{31-0}  = Word0;
448   let Inst{63-32} = Word1;
449 }
450
451 class R600_REDUCTION <bits<11> inst, dag ins, string asm, list<dag> pattern,
452                       InstrItinClass itin = VecALU> :
453   InstR600 <inst,
454           (outs R600_Reg32:$dst),
455           ins,
456           asm,
457           pattern,
458           itin>;
459
460 class R600_TEX <bits<11> inst, string opName, list<dag> pattern,
461                 InstrItinClass itin = AnyALU> :
462   InstR600 <inst,
463           (outs R600_Reg128:$DST_GPR),
464           (ins R600_Reg128:$SRC_GPR, i32imm:$RESOURCE_ID, i32imm:$SAMPLER_ID, i32imm:$textureTarget),
465           !strconcat(opName, "$DST_GPR, $SRC_GPR, $RESOURCE_ID, $SAMPLER_ID, $textureTarget"),
466           pattern,
467           itin>, TEX_WORD0, TEX_WORD1, TEX_WORD2 {
468     let Inst{31-0} = Word0;
469     let Inst{63-32} = Word1;
470
471     let TEX_INST = inst{4-0};
472     let SRC_REL = 0;
473     let DST_REL = 0;
474     let DST_SEL_X = 0;
475     let DST_SEL_Y = 1;
476     let DST_SEL_Z = 2;
477     let DST_SEL_W = 3;
478     let LOD_BIAS = 0;
479
480     let INST_MOD = 0;
481     let FETCH_WHOLE_QUAD = 0;
482     let ALT_CONST = 0;
483     let SAMPLER_INDEX_MODE = 0;
484
485     let COORD_TYPE_X = 0;
486     let COORD_TYPE_Y = 0;
487     let COORD_TYPE_Z = 0;
488     let COORD_TYPE_W = 0;
489   }
490
491 } // End mayLoad = 1, mayStore = 0, hasSideEffects = 0
492
493 def TEX_SHADOW : PatLeaf<
494   (imm),
495   [{uint32_t TType = (uint32_t)N->getZExtValue();
496     return (TType >= 6 && TType <= 8) || (TType >= 11 && TType <= 13);
497   }]
498 >;
499
500 def TEX_RECT : PatLeaf<
501   (imm),
502   [{uint32_t TType = (uint32_t)N->getZExtValue();
503     return TType == 5;
504   }]
505 >;
506
507 def TEX_ARRAY : PatLeaf<
508   (imm),
509   [{uint32_t TType = (uint32_t)N->getZExtValue();
510     return TType == 9 || TType == 10 || TType == 15 || TType == 16;
511   }]
512 >;
513
514 def TEX_SHADOW_ARRAY : PatLeaf<
515   (imm),
516   [{uint32_t TType = (uint32_t)N->getZExtValue();
517     return TType == 11 || TType == 12 || TType == 17;
518   }]
519 >;
520
521 class EG_CF_RAT <bits <8> cf_inst, bits <6> rat_inst, bits<4> rat_id, dag outs,
522                  dag ins, string asm, list<dag> pattern> :
523     InstR600ISA <outs, ins, asm, pattern> {
524   bits<7>  RW_GPR;
525   bits<7>  INDEX_GPR;
526
527   bits<2>  RIM;
528   bits<2>  TYPE;
529   bits<1>  RW_REL;
530   bits<2>  ELEM_SIZE;
531
532   bits<12> ARRAY_SIZE;
533   bits<4>  COMP_MASK;
534   bits<4>  BURST_COUNT;
535   bits<1>  VPM;
536   bits<1>  eop;
537   bits<1>  MARK;
538   bits<1>  BARRIER;
539
540   // CF_ALLOC_EXPORT_WORD0_RAT
541   let Inst{3-0}   = rat_id;
542   let Inst{9-4}   = rat_inst;
543   let Inst{10}    = 0; // Reserved
544   let Inst{12-11} = RIM;
545   let Inst{14-13} = TYPE;
546   let Inst{21-15} = RW_GPR;
547   let Inst{22}    = RW_REL;
548   let Inst{29-23} = INDEX_GPR;
549   let Inst{31-30} = ELEM_SIZE;
550
551   // CF_ALLOC_EXPORT_WORD1_BUF
552   let Inst{43-32} = ARRAY_SIZE;
553   let Inst{47-44} = COMP_MASK;
554   let Inst{51-48} = BURST_COUNT;
555   let Inst{52}    = VPM;
556   let Inst{53}    = eop;
557   let Inst{61-54} = cf_inst;
558   let Inst{62}    = MARK;
559   let Inst{63}    = BARRIER;
560 }
561
562 class LoadParamFrag <PatFrag load_type> : PatFrag <
563   (ops node:$ptr), (load_type node:$ptr),
564   [{ return isParamLoad(dyn_cast<LoadSDNode>(N)); }]
565 >;
566
567 def load_param : LoadParamFrag<load>;
568 def load_param_zexti8 : LoadParamFrag<zextloadi8>;
569 def load_param_zexti16 : LoadParamFrag<zextloadi16>;
570
571 def isR600 : Predicate<"Subtarget.device()"
572                             "->getGeneration() == AMDGPUDeviceInfo::HD4XXX">;
573 def isR700 : Predicate<"Subtarget.device()"
574                             "->getGeneration() == AMDGPUDeviceInfo::HD4XXX &&"
575                             "Subtarget.device()->getDeviceFlag()"
576                             ">= OCL_DEVICE_RV710">;
577 def isEG : Predicate<
578   "Subtarget.device()->getGeneration() >= AMDGPUDeviceInfo::HD5XXX && "
579   "Subtarget.device()->getGeneration() < AMDGPUDeviceInfo::HD7XXX && "
580   "Subtarget.device()->getDeviceFlag() != OCL_DEVICE_CAYMAN">;
581
582 def isCayman : Predicate<"Subtarget.device()"
583                             "->getDeviceFlag() == OCL_DEVICE_CAYMAN">;
584 def isEGorCayman : Predicate<"Subtarget.device()"
585                             "->getGeneration() == AMDGPUDeviceInfo::HD5XXX"
586                             "|| Subtarget.device()->getGeneration() =="
587                             "AMDGPUDeviceInfo::HD6XXX">;
588
589 def isR600toCayman : Predicate<
590                      "Subtarget.device()->getGeneration() <= AMDGPUDeviceInfo::HD6XXX">;
591
592 //===----------------------------------------------------------------------===//
593 // R600 SDNodes
594 //===----------------------------------------------------------------------===//
595
596 def INTERP_PAIR_XY :  AMDGPUShaderInst <
597   (outs R600_TReg32_X:$dst0, R600_TReg32_Y:$dst1),
598   (ins i32imm:$src0, R600_Reg32:$src1, R600_Reg32:$src2),
599   "INTERP_PAIR_XY $src0 $src1 $src2 : $dst0 dst1",
600   []>;
601
602 def INTERP_PAIR_ZW :  AMDGPUShaderInst <
603   (outs R600_TReg32_Z:$dst0, R600_TReg32_W:$dst1),
604   (ins i32imm:$src0, R600_Reg32:$src1, R600_Reg32:$src2),
605   "INTERP_PAIR_ZW $src0 $src1 $src2 : $dst0 dst1",
606   []>;
607
608 def CONST_ADDRESS: SDNode<"AMDGPUISD::CONST_ADDRESS",
609   SDTypeProfile<1, -1, [SDTCisInt<0>, SDTCisPtrTy<1>]>,
610   [SDNPVariadic]
611 >;
612
613 //===----------------------------------------------------------------------===//
614 // Interpolation Instructions
615 //===----------------------------------------------------------------------===//
616
617 def INTERP_VEC_LOAD :  AMDGPUShaderInst <
618   (outs R600_Reg128:$dst),
619   (ins i32imm:$src0),
620   "INTERP_LOAD $src0 : $dst",
621   []>;
622
623 def INTERP_XY : R600_2OP <0xD6, "INTERP_XY", []> {
624   let bank_swizzle = 5;
625 }
626
627 def INTERP_ZW : R600_2OP <0xD7, "INTERP_ZW", []> {
628   let bank_swizzle = 5;
629 }
630
631 def INTERP_LOAD_P0 : R600_1OP <0xE0, "INTERP_LOAD_P0", []>;
632
633 //===----------------------------------------------------------------------===//
634 // Export Instructions
635 //===----------------------------------------------------------------------===//
636
637 def ExportType : SDTypeProfile<0, 7, [SDTCisFP<0>, SDTCisInt<1>]>;
638
639 def EXPORT: SDNode<"AMDGPUISD::EXPORT", ExportType,
640   [SDNPHasChain, SDNPSideEffect]>;
641
642 class ExportWord0 {
643   field bits<32> Word0;
644
645   bits<13> arraybase;
646   bits<2> type;
647   bits<7> gpr;
648   bits<2> elem_size;
649
650   let Word0{12-0} = arraybase;
651   let Word0{14-13} = type;
652   let Word0{21-15} = gpr;
653   let Word0{22} = 0; // RW_REL
654   let Word0{29-23} = 0; // INDEX_GPR
655   let Word0{31-30} = elem_size;
656 }
657
658 class ExportSwzWord1 {
659   field bits<32> Word1;
660
661   bits<3> sw_x;
662   bits<3> sw_y;
663   bits<3> sw_z;
664   bits<3> sw_w;
665   bits<1> eop;
666   bits<8> inst;
667
668   let Word1{2-0} = sw_x;
669   let Word1{5-3} = sw_y;
670   let Word1{8-6} = sw_z;
671   let Word1{11-9} = sw_w;
672 }
673
674 class ExportBufWord1 {
675   field bits<32> Word1;
676
677   bits<12> arraySize;
678   bits<4> compMask;
679   bits<1> eop;
680   bits<8> inst;
681
682   let Word1{11-0} = arraySize;
683   let Word1{15-12} = compMask;
684 }
685
686 multiclass ExportPattern<Instruction ExportInst, bits<8> cf_inst> {
687   def : Pat<(int_R600_store_pixel_depth R600_Reg32:$reg),
688     (ExportInst
689         (INSERT_SUBREG (v4f32 (IMPLICIT_DEF)), R600_Reg32:$reg, sub0),
690         0, 61, 0, 7, 7, 7, cf_inst, 0)
691   >;
692
693   def : Pat<(int_R600_store_pixel_stencil R600_Reg32:$reg),
694     (ExportInst
695         (INSERT_SUBREG (v4f32 (IMPLICIT_DEF)), R600_Reg32:$reg, sub0),
696         0, 61, 7, 0, 7, 7, cf_inst, 0)
697   >;
698
699   def : Pat<(int_R600_store_dummy (i32 imm:$type)),
700     (ExportInst
701         (v4f32 (IMPLICIT_DEF)), imm:$type, 0, 7, 7, 7, 7, cf_inst, 0)
702   >;
703
704   def : Pat<(int_R600_store_dummy 1),
705     (ExportInst
706         (v4f32 (IMPLICIT_DEF)), 1, 60, 7, 7, 7, 7, cf_inst, 0)
707   >;
708
709   def : Pat<(EXPORT (v4f32 R600_Reg128:$src), (i32 imm:$base), (i32 imm:$type),
710     (i32 imm:$swz_x), (i32 imm:$swz_y), (i32 imm:$swz_z), (i32 imm:$swz_w)),
711         (ExportInst R600_Reg128:$src, imm:$type, imm:$base,
712         imm:$swz_x, imm:$swz_y, imm:$swz_z, imm:$swz_w, cf_inst, 0)
713   >;
714
715 }
716
717 multiclass SteamOutputExportPattern<Instruction ExportInst,
718     bits<8> buf0inst, bits<8> buf1inst, bits<8> buf2inst, bits<8> buf3inst> {
719 // Stream0
720   def : Pat<(int_R600_store_stream_output (v4f32 R600_Reg128:$src),
721       (i32 imm:$arraybase), (i32 0), (i32 imm:$mask)),
722       (ExportInst R600_Reg128:$src, 0, imm:$arraybase,
723       4095, imm:$mask, buf0inst, 0)>;
724 // Stream1
725   def : Pat<(int_R600_store_stream_output (v4f32 R600_Reg128:$src),
726       (i32 imm:$arraybase), (i32 1), (i32 imm:$mask)),
727       (ExportInst R600_Reg128:$src, 0, imm:$arraybase,
728       4095, imm:$mask, buf1inst, 0)>;
729 // Stream2
730   def : Pat<(int_R600_store_stream_output (v4f32 R600_Reg128:$src),
731       (i32 imm:$arraybase), (i32 2), (i32 imm:$mask)),
732       (ExportInst R600_Reg128:$src, 0, imm:$arraybase,
733       4095, imm:$mask, buf2inst, 0)>;
734 // Stream3
735   def : Pat<(int_R600_store_stream_output (v4f32 R600_Reg128:$src),
736       (i32 imm:$arraybase), (i32 3), (i32 imm:$mask)),
737       (ExportInst R600_Reg128:$src, 0, imm:$arraybase,
738       4095, imm:$mask, buf3inst, 0)>;
739 }
740
741 let usesCustomInserter = 1 in {
742
743 class ExportSwzInst : InstR600ISA<(
744     outs),
745     (ins R600_Reg128:$gpr, i32imm:$type, i32imm:$arraybase,
746     i32imm:$sw_x, i32imm:$sw_y, i32imm:$sw_z, i32imm:$sw_w, i32imm:$inst,
747     i32imm:$eop),
748     !strconcat("EXPORT", " $gpr"),
749     []>, ExportWord0, ExportSwzWord1 {
750   let elem_size = 3;
751   let Inst{31-0} = Word0;
752   let Inst{63-32} = Word1;
753 }
754
755 } // End usesCustomInserter = 1
756
757 class ExportBufInst : InstR600ISA<(
758     outs),
759     (ins R600_Reg128:$gpr, i32imm:$type, i32imm:$arraybase,
760     i32imm:$arraySize, i32imm:$compMask, i32imm:$inst, i32imm:$eop),
761     !strconcat("EXPORT", " $gpr"),
762     []>, ExportWord0, ExportBufWord1 {
763   let elem_size = 0;
764   let Inst{31-0} = Word0;
765   let Inst{63-32} = Word1;
766 }
767
768 //===----------------------------------------------------------------------===//
769 // Control Flow Instructions
770 //===----------------------------------------------------------------------===//
771
772 class CF_ALU_WORD0 {
773   field bits<32> Word0;
774
775   bits<22> ADDR;
776   bits<4> KCACHE_BANK0;
777   bits<4> KCACHE_BANK1;
778   bits<2> KCACHE_MODE0;
779
780   let Word0{21-0} = ADDR;
781   let Word0{25-22} = KCACHE_BANK0;
782   let Word0{29-26} = KCACHE_BANK1;
783   let Word0{31-30} = KCACHE_MODE0;
784 }
785
786 class CF_ALU_WORD1 {
787   field bits<32> Word1;
788
789   bits<2> KCACHE_MODE1;
790   bits<8> KCACHE_ADDR0;
791   bits<8> KCACHE_ADDR1;
792   bits<7> COUNT;
793   bits<1> ALT_CONST;
794   bits<4> CF_INST;
795   bits<1> WHOLE_QUAD_MODE;
796   bits<1> BARRIER;
797
798   let Word1{1-0} = KCACHE_MODE1;
799   let Word1{9-2} = KCACHE_ADDR0;
800   let Word1{17-10} = KCACHE_ADDR1;
801   let Word1{24-18} = COUNT;
802   let Word1{25} = ALT_CONST;
803   let Word1{29-26} = CF_INST;
804   let Word1{30} = WHOLE_QUAD_MODE;
805   let Word1{31} = BARRIER;
806 }
807
808 class ALU_CLAUSE<bits<4> inst, string OpName> : AMDGPUInst <(outs),
809 (ins i32imm:$ADDR, i32imm:$KCACHE_BANK0, i32imm:$KCACHE_BANK1, i32imm:$KCACHE_MODE0, i32imm:$KCACHE_MODE1,
810 i32imm:$KCACHE_ADDR0, i32imm:$KCACHE_ADDR1, i32imm:$COUNT),
811 !strconcat(OpName, " $COUNT, @$ADDR, "
812 "KC0[CB$KCACHE_BANK0:$KCACHE_ADDR0-$KCACHE_ADDR0+32]"
813 ", KC1[CB$KCACHE_BANK1:$KCACHE_ADDR1-$KCACHE_ADDR1+32]"),
814 [] >, CF_ALU_WORD0, CF_ALU_WORD1 {
815   field bits<64> Inst;
816
817   let CF_INST = inst;
818   let ALT_CONST = 0;
819   let WHOLE_QUAD_MODE = 0;
820   let BARRIER = 1;
821
822   let Inst{31-0} = Word0;
823   let Inst{63-32} = Word1;
824 }
825
826 class CF_WORD0_R600 {
827   field bits<32> Word0;
828
829   bits<32> ADDR;
830
831   let Word0 = ADDR;
832 }
833
834 class CF_WORD1_R600 {
835   field bits<32> Word1;
836
837   bits<3> POP_COUNT;
838   bits<5> CF_CONST;
839   bits<2> COND;
840   bits<3> COUNT;
841   bits<6> CALL_COUNT;
842   bits<1> COUNT_3;
843   bits<1> END_OF_PROGRAM;
844   bits<1> VALID_PIXEL_MODE;
845   bits<7> CF_INST;
846   bits<1> WHOLE_QUAD_MODE;
847   bits<1> BARRIER;
848
849   let Word1{2-0} = POP_COUNT;
850   let Word1{7-3} = CF_CONST;
851   let Word1{9-8} = COND;
852   let Word1{12-10} = COUNT;
853   let Word1{18-13} = CALL_COUNT;
854   let Word1{19} = COUNT_3;
855   let Word1{21} = END_OF_PROGRAM;
856   let Word1{22} = VALID_PIXEL_MODE;
857   let Word1{29-23} = CF_INST;
858   let Word1{30} = WHOLE_QUAD_MODE;
859   let Word1{31} = BARRIER;
860 }
861
862 class CF_CLAUSE_R600 <bits<7> inst, dag ins, string AsmPrint> : AMDGPUInst <(outs),
863 ins, AsmPrint, [] >, CF_WORD0_R600, CF_WORD1_R600 {
864   field bits<64> Inst;
865
866   let CF_INST = inst;
867   let BARRIER = 1;
868   let CF_CONST = 0;
869   let VALID_PIXEL_MODE = 0;
870   let COND = 0;
871   let CALL_COUNT = 0;
872   let COUNT_3 = 0;
873   let END_OF_PROGRAM = 0;
874   let WHOLE_QUAD_MODE = 0;
875
876   let Inst{31-0} = Word0;
877   let Inst{63-32} = Word1;
878 }
879
880 class CF_WORD0_EG {
881   field bits<32> Word0;
882
883   bits<24> ADDR;
884   bits<3> JUMPTABLE_SEL;
885
886   let Word0{23-0} = ADDR;
887   let Word0{26-24} = JUMPTABLE_SEL;
888 }
889
890 class CF_WORD1_EG {
891   field bits<32> Word1;
892
893   bits<3> POP_COUNT;
894   bits<5> CF_CONST;
895   bits<2> COND;
896   bits<6> COUNT;
897   bits<1> VALID_PIXEL_MODE;
898   bits<8> CF_INST;
899   bits<1> BARRIER;
900
901   let Word1{2-0} = POP_COUNT;
902   let Word1{7-3} = CF_CONST;
903   let Word1{9-8} = COND;
904   let Word1{15-10} = COUNT;
905   let Word1{20} = VALID_PIXEL_MODE;
906   let Word1{29-22} = CF_INST;
907   let Word1{31} = BARRIER;
908 }
909
910 class CF_CLAUSE_EG <bits<8> inst, dag ins, string AsmPrint> : AMDGPUInst <(outs),
911 ins, AsmPrint, [] >, CF_WORD0_EG, CF_WORD1_EG {
912   field bits<64> Inst;
913
914   let CF_INST = inst;
915   let BARRIER = 1;
916   let JUMPTABLE_SEL = 0;
917   let CF_CONST = 0;
918   let VALID_PIXEL_MODE = 0;
919   let COND = 0;
920
921   let Inst{31-0} = Word0;
922   let Inst{63-32} = Word1;
923 }
924
925 def CF_ALU : ALU_CLAUSE<8, "ALU">;
926 def CF_ALU_PUSH_BEFORE : ALU_CLAUSE<9, "ALU_PUSH_BEFORE">;
927
928 def STACK_SIZE : AMDGPUInst <(outs),
929 (ins i32imm:$num), "nstack $num", [] > {
930   field bits<8> Inst;
931   bits<8> num;
932   let Inst = num;
933 }
934
935 let Predicates = [isR600toCayman] in {
936
937 //===----------------------------------------------------------------------===//
938 // Common Instructions R600, R700, Evergreen, Cayman
939 //===----------------------------------------------------------------------===//
940
941 def ADD : R600_2OP_Helper <0x0, "ADD", fadd>;
942 // Non-IEEE MUL: 0 * anything = 0
943 def MUL : R600_2OP_Helper <0x1, "MUL NON-IEEE", int_AMDGPU_mul>;
944 def MUL_IEEE : R600_2OP_Helper <0x2, "MUL_IEEE", fmul>;
945 def MAX : R600_2OP_Helper <0x3, "MAX", AMDGPUfmax>;
946 def MIN : R600_2OP_Helper <0x4, "MIN", AMDGPUfmin>;
947
948 // For the SET* instructions there is a naming conflict in TargetSelectionDAG.td,
949 // so some of the instruction names don't match the asm string.
950 // XXX: Use the defs in TargetSelectionDAG.td instead of intrinsics.
951 def SETE : R600_2OP <
952   0x08, "SETE",
953   [(set R600_Reg32:$dst,
954    (selectcc (f32 R600_Reg32:$src0), R600_Reg32:$src1, FP_ONE, FP_ZERO,
955              COND_EQ))]
956 >;
957
958 def SGT : R600_2OP <
959   0x09, "SETGT",
960   [(set R600_Reg32:$dst,
961    (selectcc (f32 R600_Reg32:$src0), R600_Reg32:$src1, FP_ONE, FP_ZERO,
962               COND_GT))]
963 >;
964
965 def SGE : R600_2OP <
966   0xA, "SETGE",
967   [(set R600_Reg32:$dst,
968    (selectcc (f32 R600_Reg32:$src0), R600_Reg32:$src1, FP_ONE, FP_ZERO,
969               COND_GE))]
970 >;
971
972 def SNE : R600_2OP <
973   0xB, "SETNE",
974   [(set R600_Reg32:$dst,
975    (selectcc (f32 R600_Reg32:$src0), R600_Reg32:$src1, FP_ONE, FP_ZERO,
976     COND_NE))]
977 >;
978
979 def SETE_DX10 : R600_2OP <
980   0xC, "SETE_DX10",
981   [(set R600_Reg32:$dst,
982    (selectcc (f32 R600_Reg32:$src0), R600_Reg32:$src1, (i32 -1), (i32 0),
983     COND_EQ))]
984 >;
985
986 def SETGT_DX10 : R600_2OP <
987   0xD, "SETGT_DX10",
988   [(set R600_Reg32:$dst,
989    (selectcc (f32 R600_Reg32:$src0), R600_Reg32:$src1, (i32 -1), (i32 0),
990     COND_GT))]
991 >;
992
993 def SETGE_DX10 : R600_2OP <
994   0xE, "SETGE_DX10",
995   [(set R600_Reg32:$dst,
996    (selectcc (f32 R600_Reg32:$src0), R600_Reg32:$src1, (i32 -1), (i32 0),
997     COND_GE))]
998 >;
999
1000 def SETNE_DX10 : R600_2OP <
1001   0xF, "SETNE_DX10",
1002   [(set R600_Reg32:$dst,
1003     (selectcc (f32 R600_Reg32:$src0), R600_Reg32:$src1, (i32 -1), (i32 0),
1004      COND_NE))]
1005 >;
1006
1007 def FRACT : R600_1OP_Helper <0x10, "FRACT", AMDGPUfract>;
1008 def TRUNC : R600_1OP_Helper <0x11, "TRUNC", int_AMDGPU_trunc>;
1009 def CEIL : R600_1OP_Helper <0x12, "CEIL", fceil>;
1010 def RNDNE : R600_1OP_Helper <0x13, "RNDNE", frint>;
1011 def FLOOR : R600_1OP_Helper <0x14, "FLOOR", ffloor>;
1012
1013 def MOV : R600_1OP <0x19, "MOV", []>;
1014
1015 let isPseudo = 1, isCodeGenOnly = 1, usesCustomInserter = 1 in {
1016
1017 class MOV_IMM <ValueType vt, Operand immType> : AMDGPUInst <
1018   (outs R600_Reg32:$dst),
1019   (ins immType:$imm),
1020   "",
1021   []
1022 >;
1023
1024 } // end let isPseudo = 1, isCodeGenOnly = 1, usesCustomInserter = 1
1025
1026 def MOV_IMM_I32 : MOV_IMM<i32, i32imm>;
1027 def : Pat <
1028   (imm:$val),
1029   (MOV_IMM_I32 imm:$val)
1030 >;
1031
1032 def MOV_IMM_F32 : MOV_IMM<f32, f32imm>;
1033 def : Pat <
1034   (fpimm:$val),
1035   (MOV_IMM_F32  fpimm:$val)
1036 >;
1037
1038 def PRED_SETE : R600_2OP <0x20, "PRED_SETE", []>;
1039 def PRED_SETGT : R600_2OP <0x21, "PRED_SETGT", []>;
1040 def PRED_SETGE : R600_2OP <0x22, "PRED_SETGE", []>;
1041 def PRED_SETNE : R600_2OP <0x23, "PRED_SETNE", []>;
1042
1043 let hasSideEffects = 1 in {
1044
1045 def KILLGT : R600_2OP <0x2D, "KILLGT", []>;
1046
1047 } // end hasSideEffects
1048
1049 def AND_INT : R600_2OP_Helper <0x30, "AND_INT", and>;
1050 def OR_INT : R600_2OP_Helper <0x31, "OR_INT", or>;
1051 def XOR_INT : R600_2OP_Helper <0x32, "XOR_INT", xor>;
1052 def NOT_INT : R600_1OP_Helper <0x33, "NOT_INT", not>;
1053 def ADD_INT : R600_2OP_Helper <0x34, "ADD_INT", add>;
1054 def SUB_INT : R600_2OP_Helper <0x35, "SUB_INT", sub>;
1055 def MAX_INT : R600_2OP_Helper <0x36, "MAX_INT", AMDGPUsmax>;
1056 def MIN_INT : R600_2OP_Helper <0x37, "MIN_INT", AMDGPUsmin>;
1057 def MAX_UINT : R600_2OP_Helper <0x38, "MAX_UINT", AMDGPUumax>;
1058 def MIN_UINT : R600_2OP_Helper <0x39, "MIN_UINT", AMDGPUumin>;
1059
1060 def SETE_INT : R600_2OP <
1061   0x3A, "SETE_INT",
1062   [(set (i32 R600_Reg32:$dst),
1063    (selectcc (i32 R600_Reg32:$src0), R600_Reg32:$src1, -1, 0, SETEQ))]
1064 >;
1065
1066 def SETGT_INT : R600_2OP <
1067   0x3B, "SETGT_INT",
1068   [(set (i32 R600_Reg32:$dst),
1069    (selectcc (i32 R600_Reg32:$src0), R600_Reg32:$src1, -1, 0, SETGT))]
1070 >;
1071
1072 def SETGE_INT : R600_2OP <
1073   0x3C, "SETGE_INT",
1074   [(set (i32 R600_Reg32:$dst),
1075    (selectcc (i32 R600_Reg32:$src0), R600_Reg32:$src1, -1, 0, SETGE))]
1076 >;
1077
1078 def SETNE_INT : R600_2OP <
1079   0x3D, "SETNE_INT",
1080   [(set (i32 R600_Reg32:$dst),
1081    (selectcc (i32 R600_Reg32:$src0), R600_Reg32:$src1, -1, 0, SETNE))]
1082 >;
1083
1084 def SETGT_UINT : R600_2OP <
1085   0x3E, "SETGT_UINT",
1086   [(set (i32 R600_Reg32:$dst),
1087    (selectcc (i32 R600_Reg32:$src0), R600_Reg32:$src1, -1, 0, SETUGT))]
1088 >;
1089
1090 def SETGE_UINT : R600_2OP <
1091   0x3F, "SETGE_UINT",
1092   [(set (i32 R600_Reg32:$dst),
1093     (selectcc (i32 R600_Reg32:$src0), R600_Reg32:$src1, -1, 0, SETUGE))]
1094 >;
1095
1096 def PRED_SETE_INT : R600_2OP <0x42, "PRED_SETE_INT", []>;
1097 def PRED_SETGT_INT : R600_2OP <0x43, "PRED_SETGE_INT", []>;
1098 def PRED_SETGE_INT : R600_2OP <0x44, "PRED_SETGE_INT", []>;
1099 def PRED_SETNE_INT : R600_2OP <0x45, "PRED_SETNE_INT", []>;
1100
1101 def CNDE_INT : R600_3OP <
1102   0x1C, "CNDE_INT",
1103   [(set (i32 R600_Reg32:$dst),
1104    (selectcc (i32 R600_Reg32:$src0), 0,
1105        (i32 R600_Reg32:$src1), (i32 R600_Reg32:$src2),
1106        COND_EQ))]
1107 >;
1108
1109 def CNDGE_INT : R600_3OP <
1110   0x1E, "CNDGE_INT",
1111   [(set (i32 R600_Reg32:$dst),
1112    (selectcc (i32 R600_Reg32:$src0), 0,
1113        (i32 R600_Reg32:$src1), (i32 R600_Reg32:$src2),
1114        COND_GE))]
1115 >;
1116
1117 def CNDGT_INT : R600_3OP <
1118   0x1D, "CNDGT_INT",
1119   [(set (i32 R600_Reg32:$dst),
1120    (selectcc (i32 R600_Reg32:$src0), 0,
1121        (i32 R600_Reg32:$src1), (i32 R600_Reg32:$src2),
1122        COND_GT))]
1123 >;
1124
1125 //===----------------------------------------------------------------------===//
1126 // Texture instructions
1127 //===----------------------------------------------------------------------===//
1128
1129 def TEX_LD : R600_TEX <
1130   0x03, "TEX_LD",
1131   [(set R600_Reg128:$DST_GPR, (int_AMDGPU_txf R600_Reg128:$SRC_GPR,
1132       imm:$OFFSET_X, imm:$OFFSET_Y, imm:$OFFSET_Z, imm:$RESOURCE_ID,
1133       imm:$SAMPLER_ID, imm:$textureTarget))]
1134 > {
1135 let AsmString = "TEX_LD $DST_GPR, $SRC_GPR, $OFFSET_X, $OFFSET_Y, $OFFSET_Z,"
1136     "$RESOURCE_ID, $SAMPLER_ID, $textureTarget";
1137 let InOperandList = (ins R600_Reg128:$SRC_GPR, i32imm:$OFFSET_X,
1138     i32imm:$OFFSET_Y, i32imm:$OFFSET_Z, i32imm:$RESOURCE_ID, i32imm:$SAMPLER_ID,
1139     i32imm:$textureTarget);
1140 }
1141
1142 def TEX_GET_TEXTURE_RESINFO : R600_TEX <
1143   0x04, "TEX_GET_TEXTURE_RESINFO",
1144   [(set R600_Reg128:$DST_GPR, (int_AMDGPU_txq R600_Reg128:$SRC_GPR,
1145       imm:$RESOURCE_ID, imm:$SAMPLER_ID, imm:$textureTarget))]
1146 >;
1147
1148 def TEX_GET_GRADIENTS_H : R600_TEX <
1149   0x07, "TEX_GET_GRADIENTS_H",
1150   [(set R600_Reg128:$DST_GPR, (int_AMDGPU_ddx R600_Reg128:$SRC_GPR,
1151       imm:$RESOURCE_ID, imm:$SAMPLER_ID, imm:$textureTarget))]
1152 >;
1153
1154 def TEX_GET_GRADIENTS_V : R600_TEX <
1155   0x08, "TEX_GET_GRADIENTS_V",
1156   [(set R600_Reg128:$DST_GPR, (int_AMDGPU_ddy R600_Reg128:$SRC_GPR,
1157       imm:$RESOURCE_ID, imm:$SAMPLER_ID, imm:$textureTarget))]
1158 >;
1159
1160 def TEX_SET_GRADIENTS_H : R600_TEX <
1161   0x0B, "TEX_SET_GRADIENTS_H",
1162   []
1163 >;
1164
1165 def TEX_SET_GRADIENTS_V : R600_TEX <
1166   0x0C, "TEX_SET_GRADIENTS_V",
1167   []
1168 >;
1169
1170 def TEX_SAMPLE : R600_TEX <
1171   0x10, "TEX_SAMPLE",
1172   [(set R600_Reg128:$DST_GPR, (int_AMDGPU_tex R600_Reg128:$SRC_GPR,
1173       imm:$RESOURCE_ID, imm:$SAMPLER_ID, imm:$textureTarget))]
1174 >;
1175
1176 def TEX_SAMPLE_C : R600_TEX <
1177   0x18, "TEX_SAMPLE_C",
1178   [(set R600_Reg128:$DST_GPR, (int_AMDGPU_tex R600_Reg128:$SRC_GPR,
1179       imm:$RESOURCE_ID, imm:$SAMPLER_ID, TEX_SHADOW:$textureTarget))]
1180 >;
1181
1182 def TEX_SAMPLE_L : R600_TEX <
1183   0x11, "TEX_SAMPLE_L",
1184   [(set R600_Reg128:$DST_GPR, (int_AMDGPU_txl R600_Reg128:$SRC_GPR,
1185       imm:$RESOURCE_ID, imm:$SAMPLER_ID, imm:$textureTarget))]
1186 >;
1187
1188 def TEX_SAMPLE_C_L : R600_TEX <
1189   0x19, "TEX_SAMPLE_C_L",
1190   [(set R600_Reg128:$DST_GPR, (int_AMDGPU_txl R600_Reg128:$SRC_GPR,
1191       imm:$RESOURCE_ID, imm:$SAMPLER_ID, TEX_SHADOW:$textureTarget))]
1192 >;
1193
1194 def TEX_SAMPLE_LB : R600_TEX <
1195   0x12, "TEX_SAMPLE_LB",
1196   [(set R600_Reg128:$DST_GPR, (int_AMDGPU_txb R600_Reg128:$SRC_GPR,
1197       imm:$RESOURCE_ID, imm:$SAMPLER_ID, imm:$textureTarget))]
1198 >;
1199
1200 def TEX_SAMPLE_C_LB : R600_TEX <
1201   0x1A, "TEX_SAMPLE_C_LB",
1202   [(set R600_Reg128:$DST_GPR, (int_AMDGPU_txb R600_Reg128:$SRC_GPR,
1203       imm:$RESOURCE_ID, imm:$SAMPLER_ID, TEX_SHADOW:$textureTarget))]
1204 >;
1205
1206 def TEX_SAMPLE_G : R600_TEX <
1207   0x14, "TEX_SAMPLE_G",
1208   []
1209 >;
1210
1211 def TEX_SAMPLE_C_G : R600_TEX <
1212   0x1C, "TEX_SAMPLE_C_G",
1213   []
1214 >;
1215
1216 //===----------------------------------------------------------------------===//
1217 // Helper classes for common instructions
1218 //===----------------------------------------------------------------------===//
1219
1220 class MUL_LIT_Common <bits<5> inst> : R600_3OP <
1221   inst, "MUL_LIT",
1222   []
1223 >;
1224
1225 class MULADD_Common <bits<5> inst> : R600_3OP <
1226   inst, "MULADD",
1227   []
1228 >;
1229
1230 class MULADD_IEEE_Common <bits<5> inst> : R600_3OP <
1231   inst, "MULADD_IEEE",
1232   [(set (f32 R600_Reg32:$dst),
1233    (fadd (fmul R600_Reg32:$src0, R600_Reg32:$src1), R600_Reg32:$src2))]
1234 >;
1235
1236 class CNDE_Common <bits<5> inst> : R600_3OP <
1237   inst, "CNDE",
1238   [(set R600_Reg32:$dst,
1239    (selectcc (f32 R600_Reg32:$src0), FP_ZERO,
1240        (f32 R600_Reg32:$src1), (f32 R600_Reg32:$src2),
1241        COND_EQ))]
1242 >;
1243
1244 class CNDGT_Common <bits<5> inst> : R600_3OP <
1245   inst, "CNDGT",
1246   [(set R600_Reg32:$dst,
1247    (selectcc (f32 R600_Reg32:$src0), FP_ZERO,
1248        (f32 R600_Reg32:$src1), (f32 R600_Reg32:$src2),
1249        COND_GT))]
1250 >;
1251
1252 class CNDGE_Common <bits<5> inst> : R600_3OP <
1253   inst, "CNDGE",
1254   [(set R600_Reg32:$dst,
1255    (selectcc (f32 R600_Reg32:$src0), FP_ZERO,
1256        (f32 R600_Reg32:$src1), (f32 R600_Reg32:$src2),
1257        COND_GE))]
1258 >;
1259
1260 multiclass DOT4_Common <bits<11> inst> {
1261
1262   def _pseudo : R600_REDUCTION <inst,
1263     (ins R600_Reg128:$src0, R600_Reg128:$src1),
1264     "DOT4 $dst $src0, $src1",
1265     [(set R600_Reg32:$dst, (int_AMDGPU_dp4 R600_Reg128:$src0, R600_Reg128:$src1))]
1266   >;
1267
1268   def _real : R600_2OP <inst, "DOT4", []>;
1269 }
1270
1271 let mayLoad = 0, mayStore = 0, hasSideEffects = 0 in {
1272 multiclass CUBE_Common <bits<11> inst> {
1273
1274   def _pseudo : InstR600 <
1275     inst,
1276     (outs R600_Reg128:$dst),
1277     (ins R600_Reg128:$src),
1278     "CUBE $dst $src",
1279     [(set R600_Reg128:$dst, (int_AMDGPU_cube R600_Reg128:$src))],
1280     VecALU
1281   > {
1282     let isPseudo = 1;
1283   }
1284
1285   def _real : R600_2OP <inst, "CUBE", []>;
1286 }
1287 } // End mayLoad = 0, mayStore = 0, hasSideEffects = 0
1288
1289 class EXP_IEEE_Common <bits<11> inst> : R600_1OP_Helper <
1290   inst, "EXP_IEEE", fexp2
1291 >;
1292
1293 class FLT_TO_INT_Common <bits<11> inst> : R600_1OP_Helper <
1294   inst, "FLT_TO_INT", fp_to_sint
1295 >;
1296
1297 class INT_TO_FLT_Common <bits<11> inst> : R600_1OP_Helper <
1298   inst, "INT_TO_FLT", sint_to_fp
1299 >;
1300
1301 class FLT_TO_UINT_Common <bits<11> inst> : R600_1OP_Helper <
1302   inst, "FLT_TO_UINT", fp_to_uint
1303 >;
1304
1305 class UINT_TO_FLT_Common <bits<11> inst> : R600_1OP_Helper <
1306   inst, "UINT_TO_FLT", uint_to_fp
1307 >;
1308
1309 class LOG_CLAMPED_Common <bits<11> inst> : R600_1OP <
1310   inst, "LOG_CLAMPED", []
1311 >;
1312
1313 class LOG_IEEE_Common <bits<11> inst> : R600_1OP_Helper <
1314   inst, "LOG_IEEE", flog2
1315 >;
1316
1317 class LSHL_Common <bits<11> inst> : R600_2OP_Helper <inst, "LSHL", shl>;
1318 class LSHR_Common <bits<11> inst> : R600_2OP_Helper <inst, "LSHR", srl>;
1319 class ASHR_Common <bits<11> inst> : R600_2OP_Helper <inst, "ASHR", sra>;
1320 class MULHI_INT_Common <bits<11> inst> : R600_2OP_Helper <
1321   inst, "MULHI_INT", mulhs
1322 >;
1323 class MULHI_UINT_Common <bits<11> inst> : R600_2OP_Helper <
1324   inst, "MULHI", mulhu
1325 >;
1326 class MULLO_INT_Common <bits<11> inst> : R600_2OP_Helper <
1327   inst, "MULLO_INT", mul
1328 >;
1329 class MULLO_UINT_Common <bits<11> inst> : R600_2OP <inst, "MULLO_UINT", []>;
1330
1331 class RECIP_CLAMPED_Common <bits<11> inst> : R600_1OP <
1332   inst, "RECIP_CLAMPED", []
1333 >;
1334
1335 class RECIP_IEEE_Common <bits<11> inst> : R600_1OP <
1336   inst, "RECIP_IEEE", [(set R600_Reg32:$dst, (fdiv FP_ONE, R600_Reg32:$src0))]
1337 >;
1338
1339 class RECIP_UINT_Common <bits<11> inst> : R600_1OP_Helper <
1340   inst, "RECIP_UINT", AMDGPUurecip
1341 >;
1342
1343 class RECIPSQRT_CLAMPED_Common <bits<11> inst> : R600_1OP_Helper <
1344   inst, "RECIPSQRT_CLAMPED", int_AMDGPU_rsq
1345 >;
1346
1347 class RECIPSQRT_IEEE_Common <bits<11> inst> : R600_1OP <
1348   inst, "RECIPSQRT_IEEE", []
1349 >;
1350
1351 class SIN_Common <bits<11> inst> : R600_1OP <
1352   inst, "SIN", []>{
1353   let Trig = 1;
1354 }
1355
1356 class COS_Common <bits<11> inst> : R600_1OP <
1357   inst, "COS", []> {
1358   let Trig = 1;
1359 }
1360
1361 //===----------------------------------------------------------------------===//
1362 // Helper patterns for complex intrinsics
1363 //===----------------------------------------------------------------------===//
1364
1365 multiclass DIV_Common <InstR600 recip_ieee> {
1366 def : Pat<
1367   (int_AMDGPU_div R600_Reg32:$src0, R600_Reg32:$src1),
1368   (MUL_IEEE R600_Reg32:$src0, (recip_ieee R600_Reg32:$src1))
1369 >;
1370
1371 def : Pat<
1372   (fdiv R600_Reg32:$src0, R600_Reg32:$src1),
1373   (MUL_IEEE R600_Reg32:$src0, (recip_ieee R600_Reg32:$src1))
1374 >;
1375 }
1376
1377 class TGSI_LIT_Z_Common <InstR600 mul_lit, InstR600 log_clamped, InstR600 exp_ieee> : Pat <
1378   (int_TGSI_lit_z R600_Reg32:$src_x, R600_Reg32:$src_y, R600_Reg32:$src_w),
1379   (exp_ieee (mul_lit (log_clamped (MAX R600_Reg32:$src_y, (f32 ZERO))), R600_Reg32:$src_w, R600_Reg32:$src_x))
1380 >;
1381
1382 //===----------------------------------------------------------------------===//
1383 // R600 / R700 Instructions
1384 //===----------------------------------------------------------------------===//
1385
1386 let Predicates = [isR600] in {
1387
1388   def MUL_LIT_r600 : MUL_LIT_Common<0x0C>;
1389   def MULADD_r600 : MULADD_Common<0x10>;
1390   def MULADD_IEEE_r600 : MULADD_IEEE_Common<0x14>;
1391   def CNDE_r600 : CNDE_Common<0x18>;
1392   def CNDGT_r600 : CNDGT_Common<0x19>;
1393   def CNDGE_r600 : CNDGE_Common<0x1A>;
1394   defm DOT4_r600 : DOT4_Common<0x50>;
1395   defm CUBE_r600 : CUBE_Common<0x52>;
1396   def EXP_IEEE_r600 : EXP_IEEE_Common<0x61>;
1397   def LOG_CLAMPED_r600 : LOG_CLAMPED_Common<0x62>;
1398   def LOG_IEEE_r600 : LOG_IEEE_Common<0x63>;
1399   def RECIP_CLAMPED_r600 : RECIP_CLAMPED_Common<0x64>;
1400   def RECIP_IEEE_r600 : RECIP_IEEE_Common<0x66>;
1401   def RECIPSQRT_CLAMPED_r600 : RECIPSQRT_CLAMPED_Common<0x67>;
1402   def RECIPSQRT_IEEE_r600 : RECIPSQRT_IEEE_Common<0x69>;
1403   def FLT_TO_INT_r600 : FLT_TO_INT_Common<0x6b>;
1404   def INT_TO_FLT_r600 : INT_TO_FLT_Common<0x6c>;
1405   def FLT_TO_UINT_r600 : FLT_TO_UINT_Common<0x79>;
1406   def UINT_TO_FLT_r600 : UINT_TO_FLT_Common<0x6d>;
1407   def SIN_r600 : SIN_Common<0x6E>;
1408   def COS_r600 : COS_Common<0x6F>;
1409   def ASHR_r600 : ASHR_Common<0x70>;
1410   def LSHR_r600 : LSHR_Common<0x71>;
1411   def LSHL_r600 : LSHL_Common<0x72>;
1412   def MULLO_INT_r600 : MULLO_INT_Common<0x73>;
1413   def MULHI_INT_r600 : MULHI_INT_Common<0x74>;
1414   def MULLO_UINT_r600 : MULLO_UINT_Common<0x75>;
1415   def MULHI_UINT_r600 : MULHI_UINT_Common<0x76>;
1416   def RECIP_UINT_r600 : RECIP_UINT_Common <0x78>;
1417
1418   defm DIV_r600 : DIV_Common<RECIP_IEEE_r600>;
1419   def : POW_Common <LOG_IEEE_r600, EXP_IEEE_r600, MUL, R600_Reg32>;
1420   def TGSI_LIT_Z_r600 : TGSI_LIT_Z_Common<MUL_LIT_r600, LOG_CLAMPED_r600, EXP_IEEE_r600>;
1421
1422   def : Pat<(fsqrt R600_Reg32:$src),
1423     (MUL R600_Reg32:$src, (RECIPSQRT_CLAMPED_r600 R600_Reg32:$src))>;
1424
1425   def R600_ExportSwz : ExportSwzInst {
1426     let Word1{20-17} = 1; // BURST_COUNT
1427     let Word1{21} = eop;
1428     let Word1{22} = 1; // VALID_PIXEL_MODE
1429     let Word1{30-23} = inst;
1430     let Word1{31} = 1; // BARRIER
1431   }
1432   defm : ExportPattern<R600_ExportSwz, 39>;
1433
1434   def R600_ExportBuf : ExportBufInst {
1435     let Word1{20-17} = 1; // BURST_COUNT
1436     let Word1{21} = eop;
1437     let Word1{22} = 1; // VALID_PIXEL_MODE
1438     let Word1{30-23} = inst;
1439     let Word1{31} = 1; // BARRIER
1440   }
1441   defm : SteamOutputExportPattern<R600_ExportBuf, 0x20, 0x21, 0x22, 0x23>;
1442
1443   def CF_TC_R600 : CF_CLAUSE_R600<1, (ins i32imm:$ADDR, i32imm:$COUNT),
1444   "TEX $COUNT @$ADDR"> {
1445     let POP_COUNT = 0;
1446   }
1447   def CF_VC_R600 : CF_CLAUSE_R600<2, (ins i32imm:$ADDR, i32imm:$COUNT),
1448   "VTX $COUNT @$ADDR"> {
1449     let POP_COUNT = 0;
1450   }
1451   def WHILE_LOOP_R600 : CF_CLAUSE_R600<6, (ins i32imm:$ADDR),
1452   "LOOP_START_DX10 @$ADDR"> {
1453     let POP_COUNT = 0;
1454     let COUNT = 0;
1455   }
1456   def END_LOOP_R600 : CF_CLAUSE_R600<5, (ins i32imm:$ADDR), "END_LOOP @$ADDR"> {
1457     let POP_COUNT = 0;
1458     let COUNT = 0;
1459   }
1460   def LOOP_BREAK_R600 : CF_CLAUSE_R600<9, (ins i32imm:$ADDR),
1461   "LOOP_BREAK @$ADDR"> {
1462     let POP_COUNT = 0;
1463     let COUNT = 0;
1464   }
1465   def CF_CONTINUE_R600 : CF_CLAUSE_R600<8, (ins i32imm:$ADDR),
1466   "CONTINUE @$ADDR"> {
1467     let POP_COUNT = 0;
1468     let COUNT = 0;
1469   }
1470   def CF_JUMP_R600 : CF_CLAUSE_R600<10, (ins i32imm:$ADDR, i32imm:$POP_COUNT),
1471   "JUMP @$ADDR POP:$POP_COUNT"> {
1472     let COUNT = 0;
1473   }
1474   def CF_ELSE_R600 : CF_CLAUSE_R600<13, (ins i32imm:$ADDR, i32imm:$POP_COUNT),
1475   "ELSE @$ADDR POP:$POP_COUNT"> {
1476     let COUNT = 0;
1477   }
1478   def CF_CALL_FS_R600 : CF_CLAUSE_R600<19, (ins), "CALL_FS"> {
1479     let ADDR = 0;
1480     let COUNT = 0;
1481     let POP_COUNT = 0;
1482   }
1483   def POP_R600 : CF_CLAUSE_R600<14, (ins i32imm:$ADDR, i32imm:$POP_COUNT),
1484   "POP @$ADDR POP:$POP_COUNT"> {
1485     let COUNT = 0;
1486   }
1487
1488 }
1489
1490 // Helper pattern for normalizing inputs to triginomic instructions for R700+
1491 // cards.
1492 class COS_PAT <InstR600 trig> : Pat<
1493   (fcos R600_Reg32:$src),
1494   (trig (MUL_IEEE (MOV_IMM_I32 CONST.TWO_PI_INV), R600_Reg32:$src))
1495 >;
1496
1497 class SIN_PAT <InstR600 trig> : Pat<
1498   (fsin R600_Reg32:$src),
1499   (trig (MUL_IEEE (MOV_IMM_I32 CONST.TWO_PI_INV), R600_Reg32:$src))
1500 >;
1501
1502 //===----------------------------------------------------------------------===//
1503 // R700 Only instructions
1504 //===----------------------------------------------------------------------===//
1505
1506 let Predicates = [isR700] in {
1507   def SIN_r700 : SIN_Common<0x6E>;
1508   def COS_r700 : COS_Common<0x6F>;
1509
1510   // R700 normalizes inputs to SIN/COS the same as EG
1511   def : SIN_PAT <SIN_r700>;
1512   def : COS_PAT <COS_r700>;
1513 }
1514
1515 //===----------------------------------------------------------------------===//
1516 // Evergreen Only instructions
1517 //===----------------------------------------------------------------------===//
1518
1519 let Predicates = [isEG] in {
1520
1521 def RECIP_IEEE_eg : RECIP_IEEE_Common<0x86>;
1522 defm DIV_eg : DIV_Common<RECIP_IEEE_eg>;
1523
1524 def MULLO_INT_eg : MULLO_INT_Common<0x8F>;
1525 def MULHI_INT_eg : MULHI_INT_Common<0x90>;
1526 def MULLO_UINT_eg : MULLO_UINT_Common<0x91>;
1527 def MULHI_UINT_eg : MULHI_UINT_Common<0x92>;
1528 def RECIP_UINT_eg : RECIP_UINT_Common<0x94>;
1529 def RECIPSQRT_CLAMPED_eg : RECIPSQRT_CLAMPED_Common<0x87>;
1530 def EXP_IEEE_eg : EXP_IEEE_Common<0x81>;
1531 def LOG_IEEE_eg : LOG_IEEE_Common<0x83>;
1532 def RECIP_CLAMPED_eg : RECIP_CLAMPED_Common<0x84>;
1533 def RECIPSQRT_IEEE_eg : RECIPSQRT_IEEE_Common<0x89>;
1534 def SIN_eg : SIN_Common<0x8D>;
1535 def COS_eg : COS_Common<0x8E>;
1536
1537 def : POW_Common <LOG_IEEE_eg, EXP_IEEE_eg, MUL, R600_Reg32>;
1538 def : SIN_PAT <SIN_eg>;
1539 def : COS_PAT <COS_eg>;
1540 def : Pat<(fsqrt R600_Reg32:$src),
1541   (MUL R600_Reg32:$src, (RECIPSQRT_CLAMPED_eg R600_Reg32:$src))>;
1542 } // End Predicates = [isEG]
1543
1544 //===----------------------------------------------------------------------===//
1545 // Evergreen / Cayman Instructions
1546 //===----------------------------------------------------------------------===//
1547
1548 let Predicates = [isEGorCayman] in {
1549
1550   // BFE_UINT - bit_extract, an optimization for mask and shift
1551   // Src0 = Input
1552   // Src1 = Offset
1553   // Src2 = Width
1554   //
1555   // bit_extract = (Input << (32 - Offset - Width)) >> (32 - Width)
1556   //
1557   // Example Usage:
1558   // (Offset, Width)
1559   //
1560   // (0, 8)           = (Input << 24) >> 24  = (Input &  0xff)       >> 0
1561   // (8, 8)           = (Input << 16) >> 24  = (Input &  0xffff)     >> 8
1562   // (16,8)           = (Input <<  8) >> 24  = (Input &  0xffffff)   >> 16
1563   // (24,8)           = (Input <<  0) >> 24  = (Input &  0xffffffff) >> 24
1564   def BFE_UINT_eg : R600_3OP <0x4, "BFE_UINT",
1565     [(set R600_Reg32:$dst, (int_AMDIL_bit_extract_u32 R600_Reg32:$src0,
1566                                                       R600_Reg32:$src1,
1567                                                       R600_Reg32:$src2))],
1568     VecALU
1569   >;
1570
1571   def BIT_ALIGN_INT_eg : R600_3OP <0xC, "BIT_ALIGN_INT",
1572     [(set R600_Reg32:$dst, (AMDGPUbitalign R600_Reg32:$src0, R600_Reg32:$src1,
1573                                           R600_Reg32:$src2))],
1574     VecALU
1575   >;
1576
1577   def MULADD_eg : MULADD_Common<0x14>;
1578   def MULADD_IEEE_eg : MULADD_IEEE_Common<0x18>;
1579   def ASHR_eg : ASHR_Common<0x15>;
1580   def LSHR_eg : LSHR_Common<0x16>;
1581   def LSHL_eg : LSHL_Common<0x17>;
1582   def CNDE_eg : CNDE_Common<0x19>;
1583   def CNDGT_eg : CNDGT_Common<0x1A>;
1584   def CNDGE_eg : CNDGE_Common<0x1B>;
1585   def MUL_LIT_eg : MUL_LIT_Common<0x1F>;
1586   def LOG_CLAMPED_eg : LOG_CLAMPED_Common<0x82>;
1587   defm DOT4_eg : DOT4_Common<0xBE>;
1588   defm CUBE_eg : CUBE_Common<0xC0>;
1589
1590 let hasSideEffects = 1 in {
1591   def MOVA_INT_eg : R600_1OP <0xCC, "MOVA_INT", []>;
1592 }
1593
1594   def TGSI_LIT_Z_eg : TGSI_LIT_Z_Common<MUL_LIT_eg, LOG_CLAMPED_eg, EXP_IEEE_eg>;
1595
1596   def FLT_TO_INT_eg : FLT_TO_INT_Common<0x50> {
1597     let Pattern = [];
1598   }
1599
1600   def INT_TO_FLT_eg : INT_TO_FLT_Common<0x9B>;
1601
1602   def FLT_TO_UINT_eg : FLT_TO_UINT_Common<0x9A> {
1603     let Pattern = [];
1604   }
1605
1606   def UINT_TO_FLT_eg : UINT_TO_FLT_Common<0x9C>;
1607
1608   // TRUNC is used for the FLT_TO_INT instructions to work around a
1609   // perceived problem where the rounding modes are applied differently
1610   // depending on the instruction and the slot they are in.
1611   // See:
1612   // https://bugs.freedesktop.org/show_bug.cgi?id=50232
1613   // Mesa commit: a1a0974401c467cb86ef818f22df67c21774a38c
1614   //
1615   // XXX: Lowering SELECT_CC will sometimes generate fp_to_[su]int nodes,
1616   // which do not need to be truncated since the fp values are 0.0f or 1.0f.
1617   // We should look into handling these cases separately.
1618   def : Pat<(fp_to_sint R600_Reg32:$src0),
1619     (FLT_TO_INT_eg (TRUNC R600_Reg32:$src0))>;
1620
1621   def : Pat<(fp_to_uint R600_Reg32:$src0),
1622     (FLT_TO_UINT_eg (TRUNC R600_Reg32:$src0))>;
1623
1624   def EG_ExportSwz : ExportSwzInst {
1625     let Word1{19-16} = 1; // BURST_COUNT
1626     let Word1{20} = 1; // VALID_PIXEL_MODE
1627     let Word1{21} = eop;
1628     let Word1{29-22} = inst;
1629     let Word1{30} = 0; // MARK
1630     let Word1{31} = 1; // BARRIER
1631   }
1632   defm : ExportPattern<EG_ExportSwz, 83>;
1633
1634   def EG_ExportBuf : ExportBufInst {
1635     let Word1{19-16} = 1; // BURST_COUNT
1636     let Word1{20} = 1; // VALID_PIXEL_MODE
1637     let Word1{21} = eop;
1638     let Word1{29-22} = inst;
1639     let Word1{30} = 0; // MARK
1640     let Word1{31} = 1; // BARRIER
1641   }
1642   defm : SteamOutputExportPattern<EG_ExportBuf, 0x40, 0x41, 0x42, 0x43>;
1643
1644   def CF_TC_EG : CF_CLAUSE_EG<1, (ins i32imm:$ADDR, i32imm:$COUNT),
1645   "TEX $COUNT @$ADDR"> {
1646     let POP_COUNT = 0;
1647   }
1648   def CF_VC_EG : CF_CLAUSE_EG<2, (ins i32imm:$ADDR, i32imm:$COUNT),
1649   "VTX $COUNT @$ADDR"> {
1650     let POP_COUNT = 0;
1651   }
1652   def WHILE_LOOP_EG : CF_CLAUSE_EG<6, (ins i32imm:$ADDR),
1653   "LOOP_START_DX10 @$ADDR"> {
1654     let POP_COUNT = 0;
1655     let COUNT = 0;
1656   }
1657   def END_LOOP_EG : CF_CLAUSE_EG<5, (ins i32imm:$ADDR), "END_LOOP @$ADDR"> {
1658     let POP_COUNT = 0;
1659     let COUNT = 0;
1660   }
1661   def LOOP_BREAK_EG : CF_CLAUSE_EG<9, (ins i32imm:$ADDR),
1662   "LOOP_BREAK @$ADDR"> {
1663     let POP_COUNT = 0;
1664     let COUNT = 0;
1665   }
1666   def CF_CONTINUE_EG : CF_CLAUSE_EG<8, (ins i32imm:$ADDR),
1667   "CONTINUE @$ADDR"> {
1668     let POP_COUNT = 0;
1669     let COUNT = 0;
1670   }
1671   def CF_JUMP_EG : CF_CLAUSE_EG<10, (ins i32imm:$ADDR, i32imm:$POP_COUNT),
1672   "JUMP @$ADDR POP:$POP_COUNT"> {
1673     let COUNT = 0;
1674   }
1675   def CF_ELSE_EG : CF_CLAUSE_EG<13, (ins i32imm:$ADDR, i32imm:$POP_COUNT),
1676   "ELSE @$ADDR POP:$POP_COUNT"> {
1677     let COUNT = 0;
1678   }
1679   def CF_CALL_FS_EG : CF_CLAUSE_EG<19, (ins), "CALL_FS"> {
1680     let ADDR = 0;
1681     let COUNT = 0;
1682     let POP_COUNT = 0;
1683   }
1684   def POP_EG : CF_CLAUSE_EG<14, (ins i32imm:$ADDR, i32imm:$POP_COUNT),
1685   "POP @$ADDR POP:$POP_COUNT"> {
1686     let COUNT = 0;
1687   }
1688
1689
1690 //===----------------------------------------------------------------------===//
1691 // Memory read/write instructions
1692 //===----------------------------------------------------------------------===//
1693 let usesCustomInserter = 1 in {
1694
1695 class RAT_WRITE_CACHELESS_eg <dag ins, bits<4> comp_mask, string name,
1696                               list<dag> pattern>
1697     : EG_CF_RAT <0x57, 0x2, 0, (outs), ins,
1698                  !strconcat(name, " $rw_gpr, $index_gpr, $eop"), pattern> {
1699   let RIM         = 0;
1700   // XXX: Have a separate instruction for non-indexed writes.
1701   let TYPE        = 1;
1702   let RW_REL      = 0;
1703   let ELEM_SIZE   = 0;
1704
1705   let ARRAY_SIZE  = 0;
1706   let COMP_MASK   = comp_mask;
1707   let BURST_COUNT = 0;
1708   let VPM         = 0;
1709   let MARK        = 0;
1710   let BARRIER     = 1;
1711 }
1712
1713 } // End usesCustomInserter = 1
1714
1715 // 32-bit store
1716 def RAT_WRITE_CACHELESS_32_eg : RAT_WRITE_CACHELESS_eg <
1717   (ins R600_TReg32_X:$rw_gpr, R600_TReg32_X:$index_gpr, InstFlag:$eop),
1718   0x1, "RAT_WRITE_CACHELESS_32_eg",
1719   [(global_store (i32 R600_TReg32_X:$rw_gpr), R600_TReg32_X:$index_gpr)]
1720 >;
1721
1722 //128-bit store
1723 def RAT_WRITE_CACHELESS_128_eg : RAT_WRITE_CACHELESS_eg <
1724   (ins R600_Reg128:$rw_gpr, R600_TReg32_X:$index_gpr, InstFlag:$eop),
1725   0xf, "RAT_WRITE_CACHELESS_128",
1726   [(global_store (v4i32 R600_Reg128:$rw_gpr), R600_TReg32_X:$index_gpr)]
1727 >;
1728
1729 class VTX_READ_eg <string name, bits<8> buffer_id, dag outs, list<dag> pattern>
1730     : InstR600ISA <outs, (ins MEMxi:$ptr), name#" $dst, $ptr", pattern>,
1731       VTX_WORD1_GPR, VTX_WORD0 {
1732
1733   // Static fields
1734   let VC_INST = 0;
1735   let FETCH_TYPE = 2;
1736   let FETCH_WHOLE_QUAD = 0;
1737   let BUFFER_ID = buffer_id;
1738   let SRC_REL = 0;
1739   // XXX: We can infer this field based on the SRC_GPR.  This would allow us
1740   // to store vertex addresses in any channel, not just X.
1741   let SRC_SEL_X = 0;
1742   let DST_REL = 0;
1743   // The docs say that if this bit is set, then DATA_FORMAT, NUM_FORMAT_ALL,
1744   // FORMAT_COMP_ALL, SRF_MODE_ALL, and ENDIAN_SWAP fields will be ignored,
1745   // however, based on my testing if USE_CONST_FIELDS is set, then all
1746   // these fields need to be set to 0.
1747   let USE_CONST_FIELDS = 0;
1748   let NUM_FORMAT_ALL = 1;
1749   let FORMAT_COMP_ALL = 0;
1750   let SRF_MODE_ALL = 0;
1751
1752   let Inst{31-0} = Word0;
1753   let Inst{63-32} = Word1;
1754   // LLVM can only encode 64-bit instructions, so these fields are manually
1755   // encoded in R600CodeEmitter
1756   //
1757   // bits<16> OFFSET;
1758   // bits<2>  ENDIAN_SWAP = 0;
1759   // bits<1>  CONST_BUF_NO_STRIDE = 0;
1760   // bits<1>  MEGA_FETCH = 0;
1761   // bits<1>  ALT_CONST = 0;
1762   // bits<2>  BUFFER_INDEX_MODE = 0;
1763
1764
1765
1766   // VTX_WORD2 (LLVM can only encode 64-bit instructions, so WORD2 encoding
1767   // is done in R600CodeEmitter
1768   //
1769   // Inst{79-64} = OFFSET;
1770   // Inst{81-80} = ENDIAN_SWAP;
1771   // Inst{82}    = CONST_BUF_NO_STRIDE;
1772   // Inst{83}    = MEGA_FETCH;
1773   // Inst{84}    = ALT_CONST;
1774   // Inst{86-85} = BUFFER_INDEX_MODE;
1775   // Inst{95-86} = 0; Reserved
1776
1777   // VTX_WORD3 (Padding)
1778   //
1779   // Inst{127-96} = 0;
1780 }
1781
1782 class VTX_READ_8_eg <bits<8> buffer_id, list<dag> pattern>
1783     : VTX_READ_eg <"VTX_READ_8", buffer_id, (outs R600_TReg32_X:$dst),
1784                    pattern> {
1785
1786   let MEGA_FETCH_COUNT = 1;
1787   let DST_SEL_X = 0;
1788   let DST_SEL_Y = 7;   // Masked
1789   let DST_SEL_Z = 7;   // Masked
1790   let DST_SEL_W = 7;   // Masked
1791   let DATA_FORMAT = 1; // FMT_8
1792 }
1793
1794 class VTX_READ_16_eg <bits<8> buffer_id, list<dag> pattern>
1795     : VTX_READ_eg <"VTX_READ_16", buffer_id, (outs R600_TReg32_X:$dst),
1796                     pattern> {
1797   let MEGA_FETCH_COUNT = 2;
1798   let DST_SEL_X = 0;
1799   let DST_SEL_Y = 7;   // Masked
1800   let DST_SEL_Z = 7;   // Masked
1801   let DST_SEL_W = 7;   // Masked
1802   let DATA_FORMAT = 5; // FMT_16
1803
1804 }
1805
1806 class VTX_READ_32_eg <bits<8> buffer_id, list<dag> pattern>
1807     : VTX_READ_eg <"VTX_READ_32", buffer_id, (outs R600_TReg32_X:$dst),
1808                    pattern> {
1809
1810   let MEGA_FETCH_COUNT = 4;
1811   let DST_SEL_X        = 0;
1812   let DST_SEL_Y        = 7;   // Masked
1813   let DST_SEL_Z        = 7;   // Masked
1814   let DST_SEL_W        = 7;   // Masked
1815   let DATA_FORMAT      = 0xD; // COLOR_32
1816
1817   // This is not really necessary, but there were some GPU hangs that appeared
1818   // to be caused by ALU instructions in the next instruction group that wrote
1819   // to the $ptr registers of the VTX_READ.
1820   // e.g.
1821   // %T3_X<def> = VTX_READ_PARAM_32_eg %T2_X<kill>, 24
1822   // %T2_X<def> = MOV %ZERO
1823   //Adding this constraint prevents this from happening.
1824   let Constraints = "$ptr.ptr = $dst";
1825 }
1826
1827 class VTX_READ_128_eg <bits<8> buffer_id, list<dag> pattern>
1828     : VTX_READ_eg <"VTX_READ_128", buffer_id, (outs R600_Reg128:$dst),
1829                    pattern> {
1830
1831   let MEGA_FETCH_COUNT = 16;
1832   let DST_SEL_X        =  0;
1833   let DST_SEL_Y        =  1;
1834   let DST_SEL_Z        =  2;
1835   let DST_SEL_W        =  3;
1836   let DATA_FORMAT      =  0x22; // COLOR_32_32_32_32
1837
1838   // XXX: Need to force VTX_READ_128 instructions to write to the same register
1839   // that holds its buffer address to avoid potential hangs.  We can't use
1840   // the same constraint as VTX_READ_32_eg, because the $ptr.ptr and $dst
1841   // registers are different sizes.
1842 }
1843
1844 //===----------------------------------------------------------------------===//
1845 // VTX Read from parameter memory space
1846 //===----------------------------------------------------------------------===//
1847
1848 def VTX_READ_PARAM_8_eg : VTX_READ_8_eg <0,
1849   [(set (i32 R600_TReg32_X:$dst), (load_param_zexti8 ADDRVTX_READ:$ptr))]
1850 >;
1851
1852 def VTX_READ_PARAM_16_eg : VTX_READ_16_eg <0,
1853   [(set (i32 R600_TReg32_X:$dst), (load_param_zexti16 ADDRVTX_READ:$ptr))]
1854 >;
1855
1856 def VTX_READ_PARAM_32_eg : VTX_READ_32_eg <0,
1857   [(set (i32 R600_TReg32_X:$dst), (load_param ADDRVTX_READ:$ptr))]
1858 >;
1859
1860 def VTX_READ_PARAM_128_eg : VTX_READ_128_eg <0,
1861   [(set (v4i32 R600_Reg128:$dst), (load_param ADDRVTX_READ:$ptr))]
1862 >;
1863
1864 //===----------------------------------------------------------------------===//
1865 // VTX Read from global memory space
1866 //===----------------------------------------------------------------------===//
1867
1868 // 8-bit reads
1869 def VTX_READ_GLOBAL_8_eg : VTX_READ_8_eg <1,
1870   [(set (i32 R600_TReg32_X:$dst), (zextloadi8_global ADDRVTX_READ:$ptr))]
1871 >;
1872
1873 // 32-bit reads
1874 def VTX_READ_GLOBAL_32_eg : VTX_READ_32_eg <1,
1875   [(set (i32 R600_TReg32_X:$dst), (global_load ADDRVTX_READ:$ptr))]
1876 >;
1877
1878 // 128-bit reads
1879 def VTX_READ_GLOBAL_128_eg : VTX_READ_128_eg <1,
1880   [(set (v4i32 R600_Reg128:$dst), (global_load ADDRVTX_READ:$ptr))]
1881 >;
1882
1883 //===----------------------------------------------------------------------===//
1884 // Constant Loads
1885 // XXX: We are currently storing all constants in the global address space.
1886 //===----------------------------------------------------------------------===//
1887
1888 def CONSTANT_LOAD_eg : VTX_READ_32_eg <1,
1889   [(set (i32 R600_TReg32_X:$dst), (constant_load ADDRVTX_READ:$ptr))]
1890 >;
1891
1892 }
1893
1894 //===----------------------------------------------------------------------===//
1895 // Regist loads and stores - for indirect addressing
1896 //===----------------------------------------------------------------------===//
1897
1898 defm R600_ : RegisterLoadStore <R600_Reg32, FRAMEri, ADDRIndirect>;
1899
1900 let Predicates = [isCayman] in {
1901
1902 let isVector = 1 in {
1903
1904 def RECIP_IEEE_cm : RECIP_IEEE_Common<0x86>;
1905
1906 def MULLO_INT_cm : MULLO_INT_Common<0x8F>;
1907 def MULHI_INT_cm : MULHI_INT_Common<0x90>;
1908 def MULLO_UINT_cm : MULLO_UINT_Common<0x91>;
1909 def MULHI_UINT_cm : MULHI_UINT_Common<0x92>;
1910 def RECIPSQRT_CLAMPED_cm : RECIPSQRT_CLAMPED_Common<0x87>;
1911 def EXP_IEEE_cm : EXP_IEEE_Common<0x81>;
1912 def LOG_IEEE_cm : LOG_IEEE_Common<0x83>;
1913 def RECIP_CLAMPED_cm : RECIP_CLAMPED_Common<0x84>;
1914 def RECIPSQRT_IEEE_cm : RECIPSQRT_IEEE_Common<0x89>;
1915 def SIN_cm : SIN_Common<0x8D>;
1916 def COS_cm : COS_Common<0x8E>;
1917 } // End isVector = 1
1918
1919 def : POW_Common <LOG_IEEE_cm, EXP_IEEE_cm, MUL, R600_Reg32>;
1920 def : SIN_PAT <SIN_cm>;
1921 def : COS_PAT <COS_cm>;
1922
1923 defm DIV_cm : DIV_Common<RECIP_IEEE_cm>;
1924
1925 // RECIP_UINT emulation for Cayman
1926 // The multiplication scales from [0,1] to the unsigned integer range
1927 def : Pat <
1928   (AMDGPUurecip R600_Reg32:$src0),
1929   (FLT_TO_UINT_eg (MUL_IEEE (RECIP_IEEE_cm (UINT_TO_FLT_eg R600_Reg32:$src0)),
1930                             (MOV_IMM_I32 CONST.FP_UINT_MAX_PLUS_1)))
1931 >;
1932
1933
1934 def : Pat<(fsqrt R600_Reg32:$src),
1935   (MUL R600_Reg32:$src, (RECIPSQRT_CLAMPED_cm R600_Reg32:$src))>;
1936
1937 } // End isCayman
1938
1939 //===----------------------------------------------------------------------===//
1940 // Branch Instructions
1941 //===----------------------------------------------------------------------===//
1942
1943
1944 def IF_PREDICATE_SET  : ILFormat<(outs), (ins GPRI32:$src),
1945   "IF_PREDICATE_SET $src", []>;
1946
1947 def PREDICATED_BREAK : ILFormat<(outs), (ins GPRI32:$src),
1948   "PREDICATED_BREAK $src", []>;
1949
1950 //===----------------------------------------------------------------------===//
1951 // Pseudo instructions
1952 //===----------------------------------------------------------------------===//
1953
1954 let isPseudo = 1 in {
1955
1956 def PRED_X : InstR600 <
1957   0, (outs R600_Predicate_Bit:$dst),
1958   (ins R600_Reg32:$src0, i32imm:$src1, i32imm:$flags),
1959   "", [], NullALU> {
1960   let FlagOperandIdx = 3;
1961 }
1962
1963 let isTerminator = 1, isBranch = 1 in {
1964 def JUMP_COND : InstR600 <0x10,
1965           (outs),
1966           (ins brtarget:$target, R600_Predicate_Bit:$p),
1967           "JUMP $target ($p)",
1968           [], AnyALU
1969   >;
1970
1971 def JUMP : InstR600 <0x10,
1972           (outs),
1973           (ins brtarget:$target),
1974           "JUMP $target",
1975           [], AnyALU
1976   >
1977 {
1978   let isPredicable = 1;
1979   let isBarrier = 1;
1980 }
1981
1982 }  // End isTerminator = 1, isBranch = 1
1983
1984 let usesCustomInserter = 1 in {
1985
1986 let mayLoad = 0, mayStore = 0, hasSideEffects = 1 in {
1987
1988 def MASK_WRITE : AMDGPUShaderInst <
1989     (outs),
1990     (ins R600_Reg32:$src),
1991     "MASK_WRITE $src",
1992     []
1993 >;
1994
1995 } // End mayLoad = 0, mayStore = 0, hasSideEffects = 1
1996
1997
1998 def TXD: AMDGPUShaderInst <
1999   (outs R600_Reg128:$dst),
2000   (ins R600_Reg128:$src0, R600_Reg128:$src1, R600_Reg128:$src2, i32imm:$resourceId, i32imm:$samplerId, i32imm:$textureTarget),
2001   "TXD $dst, $src0, $src1, $src2, $resourceId, $samplerId, $textureTarget",
2002   [(set R600_Reg128:$dst, (int_AMDGPU_txd R600_Reg128:$src0, R600_Reg128:$src1, R600_Reg128:$src2, imm:$resourceId, imm:$samplerId, imm:$textureTarget))]
2003 >;
2004
2005 def TXD_SHADOW: AMDGPUShaderInst <
2006   (outs R600_Reg128:$dst),
2007   (ins R600_Reg128:$src0, R600_Reg128:$src1, R600_Reg128:$src2, i32imm:$resourceId, i32imm:$samplerId, i32imm:$textureTarget),
2008   "TXD_SHADOW $dst, $src0, $src1, $src2, $resourceId, $samplerId, $textureTarget",
2009   [(set R600_Reg128:$dst, (int_AMDGPU_txd R600_Reg128:$src0, R600_Reg128:$src1, R600_Reg128:$src2, imm:$resourceId, imm:$samplerId, TEX_SHADOW:$textureTarget))]
2010 >;
2011
2012 } // End isPseudo = 1
2013 } // End usesCustomInserter = 1
2014
2015 def CLAMP_R600 :  CLAMP <R600_Reg32>;
2016 def FABS_R600 : FABS<R600_Reg32>;
2017 def FNEG_R600 : FNEG<R600_Reg32>;
2018
2019 //===---------------------------------------------------------------------===//
2020 // Return instruction
2021 //===---------------------------------------------------------------------===//
2022 let isTerminator = 1, isReturn = 1, hasCtrlDep = 1,
2023     usesCustomInserter = 1 in {
2024   def RETURN          : ILFormat<(outs), (ins variable_ops),
2025       "RETURN", [(IL_retflag)]>;
2026 }
2027
2028
2029 //===----------------------------------------------------------------------===//
2030 // Constant Buffer Addressing Support
2031 //===----------------------------------------------------------------------===//
2032
2033 let usesCustomInserter = 1, isCodeGenOnly = 1, isPseudo = 1, Namespace = "AMDGPU"  in {
2034 def CONST_COPY : Instruction {
2035   let OutOperandList = (outs R600_Reg32:$dst);
2036   let InOperandList = (ins i32imm:$src);
2037   let Pattern =
2038       [(set R600_Reg32:$dst, (CONST_ADDRESS ADDRGA_CONST_OFFSET:$src))];
2039   let AsmString = "CONST_COPY";
2040   let neverHasSideEffects = 1;
2041   let isAsCheapAsAMove = 1;
2042   let Itinerary = NullALU;
2043 }
2044 } // end usesCustomInserter = 1, isCodeGenOnly = 1, isPseudo = 1, Namespace = "AMDGPU"
2045
2046 def TEX_VTX_CONSTBUF :
2047   InstR600ISA <(outs R600_Reg128:$dst), (ins MEMxi:$ptr, i32imm:$BUFFER_ID), "VTX_READ_eg $dst, $ptr",
2048       [(set R600_Reg128:$dst, (CONST_ADDRESS ADDRGA_VAR_OFFSET:$ptr, (i32 imm:$BUFFER_ID)))]>,
2049   VTX_WORD1_GPR, VTX_WORD0 {
2050
2051   let VC_INST = 0;
2052   let FETCH_TYPE = 2;
2053   let FETCH_WHOLE_QUAD = 0;
2054   let SRC_REL = 0;
2055   let SRC_SEL_X = 0;
2056   let DST_REL = 0;
2057   let USE_CONST_FIELDS = 0;
2058   let NUM_FORMAT_ALL = 2;
2059   let FORMAT_COMP_ALL = 1;
2060   let SRF_MODE_ALL = 1;
2061   let MEGA_FETCH_COUNT = 16;
2062   let DST_SEL_X        = 0;
2063   let DST_SEL_Y        = 1;
2064   let DST_SEL_Z        = 2;
2065   let DST_SEL_W        = 3;
2066   let DATA_FORMAT      = 35;
2067
2068   let Inst{31-0} = Word0;
2069   let Inst{63-32} = Word1;
2070
2071 // LLVM can only encode 64-bit instructions, so these fields are manually
2072 // encoded in R600CodeEmitter
2073 //
2074 // bits<16> OFFSET;
2075 // bits<2>  ENDIAN_SWAP = 0;
2076 // bits<1>  CONST_BUF_NO_STRIDE = 0;
2077 // bits<1>  MEGA_FETCH = 0;
2078 // bits<1>  ALT_CONST = 0;
2079 // bits<2>  BUFFER_INDEX_MODE = 0;
2080
2081
2082
2083 // VTX_WORD2 (LLVM can only encode 64-bit instructions, so WORD2 encoding
2084 // is done in R600CodeEmitter
2085 //
2086 // Inst{79-64} = OFFSET;
2087 // Inst{81-80} = ENDIAN_SWAP;
2088 // Inst{82}    = CONST_BUF_NO_STRIDE;
2089 // Inst{83}    = MEGA_FETCH;
2090 // Inst{84}    = ALT_CONST;
2091 // Inst{86-85} = BUFFER_INDEX_MODE;
2092 // Inst{95-86} = 0; Reserved
2093
2094 // VTX_WORD3 (Padding)
2095 //
2096 // Inst{127-96} = 0;
2097 }
2098
2099 def TEX_VTX_TEXBUF:
2100   InstR600ISA <(outs R600_Reg128:$dst), (ins MEMxi:$ptr, i32imm:$BUFFER_ID), "TEX_VTX_EXPLICIT_READ $dst, $ptr",
2101       [(set R600_Reg128:$dst, (int_R600_load_texbuf ADDRGA_VAR_OFFSET:$ptr, imm:$BUFFER_ID))]>,
2102 VTX_WORD1_GPR, VTX_WORD0 {
2103
2104 let VC_INST = 0;
2105 let FETCH_TYPE = 2;
2106 let FETCH_WHOLE_QUAD = 0;
2107 let SRC_REL = 0;
2108 let SRC_SEL_X = 0;
2109 let DST_REL = 0;
2110 let USE_CONST_FIELDS = 1;
2111 let NUM_FORMAT_ALL = 0;
2112 let FORMAT_COMP_ALL = 0;
2113 let SRF_MODE_ALL = 1;
2114 let MEGA_FETCH_COUNT = 16;
2115 let DST_SEL_X        = 0;
2116 let DST_SEL_Y        = 1;
2117 let DST_SEL_Z        = 2;
2118 let DST_SEL_W        = 3;
2119 let DATA_FORMAT      = 0;
2120
2121 let Inst{31-0} = Word0;
2122 let Inst{63-32} = Word1;
2123
2124 // LLVM can only encode 64-bit instructions, so these fields are manually
2125 // encoded in R600CodeEmitter
2126 //
2127 // bits<16> OFFSET;
2128 // bits<2>  ENDIAN_SWAP = 0;
2129 // bits<1>  CONST_BUF_NO_STRIDE = 0;
2130 // bits<1>  MEGA_FETCH = 0;
2131 // bits<1>  ALT_CONST = 0;
2132 // bits<2>  BUFFER_INDEX_MODE = 0;
2133
2134
2135
2136 // VTX_WORD2 (LLVM can only encode 64-bit instructions, so WORD2 encoding
2137 // is done in R600CodeEmitter
2138 //
2139 // Inst{79-64} = OFFSET;
2140 // Inst{81-80} = ENDIAN_SWAP;
2141 // Inst{82}    = CONST_BUF_NO_STRIDE;
2142 // Inst{83}    = MEGA_FETCH;
2143 // Inst{84}    = ALT_CONST;
2144 // Inst{86-85} = BUFFER_INDEX_MODE;
2145 // Inst{95-86} = 0; Reserved
2146
2147 // VTX_WORD3 (Padding)
2148 //
2149 // Inst{127-96} = 0;
2150 }
2151
2152
2153
2154 //===--------------------------------------------------------------------===//
2155 // Instructions support
2156 //===--------------------------------------------------------------------===//
2157 //===---------------------------------------------------------------------===//
2158 // Custom Inserter for Branches and returns, this eventually will be a
2159 // seperate pass
2160 //===---------------------------------------------------------------------===//
2161 let isTerminator = 1, usesCustomInserter = 1, isBranch = 1, isBarrier = 1 in {
2162   def BRANCH : ILFormat<(outs), (ins brtarget:$target),
2163       "; Pseudo unconditional branch instruction",
2164       [(br bb:$target)]>;
2165   defm BRANCH_COND : BranchConditional<IL_brcond>;
2166 }
2167
2168 //===---------------------------------------------------------------------===//
2169 // Flow and Program control Instructions
2170 //===---------------------------------------------------------------------===//
2171 let isTerminator=1 in {
2172   def SWITCH      : ILFormat< (outs), (ins GPRI32:$src),
2173   !strconcat("SWITCH", " $src"), []>;
2174   def CASE        : ILFormat< (outs), (ins GPRI32:$src),
2175       !strconcat("CASE", " $src"), []>;
2176   def BREAK       : ILFormat< (outs), (ins),
2177       "BREAK", []>;
2178   def CONTINUE    : ILFormat< (outs), (ins),
2179       "CONTINUE", []>;
2180   def DEFAULT     : ILFormat< (outs), (ins),
2181       "DEFAULT", []>;
2182   def ELSE        : ILFormat< (outs), (ins),
2183       "ELSE", []>;
2184   def ENDSWITCH   : ILFormat< (outs), (ins),
2185       "ENDSWITCH", []>;
2186   def ENDMAIN     : ILFormat< (outs), (ins),
2187       "ENDMAIN", []>;
2188   def END         : ILFormat< (outs), (ins),
2189       "END", []>;
2190   def ENDFUNC     : ILFormat< (outs), (ins),
2191       "ENDFUNC", []>;
2192   def ENDIF       : ILFormat< (outs), (ins),
2193       "ENDIF", []>;
2194   def WHILELOOP   : ILFormat< (outs), (ins),
2195       "WHILE", []>;
2196   def ENDLOOP     : ILFormat< (outs), (ins),
2197       "ENDLOOP", []>;
2198   def FUNC        : ILFormat< (outs), (ins),
2199       "FUNC", []>;
2200   def RETDYN      : ILFormat< (outs), (ins),
2201       "RET_DYN", []>;
2202   // This opcode has custom swizzle pattern encoded in Swizzle Encoder
2203   defm IF_LOGICALNZ  : BranchInstr<"IF_LOGICALNZ">;
2204   // This opcode has custom swizzle pattern encoded in Swizzle Encoder
2205   defm IF_LOGICALZ   : BranchInstr<"IF_LOGICALZ">;
2206   // This opcode has custom swizzle pattern encoded in Swizzle Encoder
2207   defm BREAK_LOGICALNZ : BranchInstr<"BREAK_LOGICALNZ">;
2208   // This opcode has custom swizzle pattern encoded in Swizzle Encoder
2209   defm BREAK_LOGICALZ : BranchInstr<"BREAK_LOGICALZ">;
2210   // This opcode has custom swizzle pattern encoded in Swizzle Encoder
2211   defm CONTINUE_LOGICALNZ : BranchInstr<"CONTINUE_LOGICALNZ">;
2212   // This opcode has custom swizzle pattern encoded in Swizzle Encoder
2213   defm CONTINUE_LOGICALZ : BranchInstr<"CONTINUE_LOGICALZ">;
2214   defm IFC         : BranchInstr2<"IFC">;
2215   defm BREAKC      : BranchInstr2<"BREAKC">;
2216   defm CONTINUEC   : BranchInstr2<"CONTINUEC">;
2217 }
2218
2219 //===----------------------------------------------------------------------===//
2220 // ISel Patterns
2221 //===----------------------------------------------------------------------===//
2222
2223 // CND*_INT Pattterns for f32 True / False values
2224
2225 class CND_INT_f32 <InstR600 cnd, CondCode cc> : Pat <
2226   (selectcc (i32 R600_Reg32:$src0), 0, (f32 R600_Reg32:$src1),
2227                                             R600_Reg32:$src2, cc),
2228   (cnd R600_Reg32:$src0, R600_Reg32:$src1, R600_Reg32:$src2)
2229 >;
2230
2231 def : CND_INT_f32 <CNDE_INT,  SETEQ>;
2232 def : CND_INT_f32 <CNDGT_INT, SETGT>;
2233 def : CND_INT_f32 <CNDGE_INT, SETGE>;
2234
2235 //CNDGE_INT extra pattern
2236 def : Pat <
2237   (selectcc (i32 R600_Reg32:$src0), -1, (i32 R600_Reg32:$src1),
2238                                         (i32 R600_Reg32:$src2), COND_GT),
2239   (CNDGE_INT R600_Reg32:$src0, R600_Reg32:$src1, R600_Reg32:$src2)
2240 >;
2241
2242 // KIL Patterns
2243 def KILP : Pat <
2244   (int_AMDGPU_kilp),
2245   (MASK_WRITE (KILLGT (f32 ONE), (f32 ZERO)))
2246 >;
2247
2248 def KIL : Pat <
2249   (int_AMDGPU_kill R600_Reg32:$src0),
2250   (MASK_WRITE (KILLGT (f32 ZERO), (f32 R600_Reg32:$src0)))
2251 >;
2252
2253 // SGT Reverse args
2254 def : Pat <
2255   (selectcc (f32 R600_Reg32:$src0), R600_Reg32:$src1, FP_ONE, FP_ZERO, COND_LT),
2256   (SGT R600_Reg32:$src1, R600_Reg32:$src0)
2257 >;
2258
2259 // SGE Reverse args
2260 def : Pat <
2261   (selectcc (f32 R600_Reg32:$src0), R600_Reg32:$src1, FP_ONE, FP_ZERO, COND_LE),
2262   (SGE R600_Reg32:$src1, R600_Reg32:$src0)
2263 >;
2264
2265 // SETGT_DX10 reverse args
2266 def : Pat <
2267   (selectcc (f32 R600_Reg32:$src0), R600_Reg32:$src1, -1, 0, COND_LT),
2268   (SETGT_DX10 R600_Reg32:$src1, R600_Reg32:$src0)
2269 >;
2270
2271 // SETGE_DX10 reverse args
2272 def : Pat <
2273   (selectcc (f32 R600_Reg32:$src0), R600_Reg32:$src1, -1, 0, COND_LE),
2274   (SETGE_DX10 R600_Reg32:$src1, R600_Reg32:$src0)
2275 >;
2276
2277 // SETGT_INT reverse args
2278 def : Pat <
2279   (selectcc (i32 R600_Reg32:$src0), R600_Reg32:$src1, -1, 0, SETLT),
2280   (SETGT_INT R600_Reg32:$src1, R600_Reg32:$src0)
2281 >;
2282
2283 // SETGE_INT reverse args
2284 def : Pat <
2285   (selectcc (i32 R600_Reg32:$src0), R600_Reg32:$src1, -1, 0, SETLE),
2286   (SETGE_INT R600_Reg32:$src1, R600_Reg32:$src0)
2287 >;
2288
2289 // SETGT_UINT reverse args
2290 def : Pat <
2291   (selectcc (i32 R600_Reg32:$src0), R600_Reg32:$src1, -1, 0, SETULT),
2292   (SETGT_UINT R600_Reg32:$src1, R600_Reg32:$src0)
2293 >;
2294
2295 // SETGE_UINT reverse args
2296 def : Pat <
2297   (selectcc (i32 R600_Reg32:$src0), R600_Reg32:$src1, -1, 0, SETULE),
2298   (SETGE_UINT R600_Reg32:$src1, R600_Reg32:$src0)
2299 >;
2300
2301 // The next two patterns are special cases for handling 'true if ordered' and
2302 // 'true if unordered' conditionals.  The assumption here is that the behavior of
2303 // SETE and SNE conforms to the Direct3D 10 rules for floating point values
2304 // described here:
2305 // http://msdn.microsoft.com/en-us/library/windows/desktop/cc308050.aspx#alpha_32_bit
2306 // We assume that  SETE returns false when one of the operands is NAN and
2307 // SNE returns true when on of the operands is NAN
2308
2309 //SETE - 'true if ordered'
2310 def : Pat <
2311   (selectcc (f32 R600_Reg32:$src0), R600_Reg32:$src1, FP_ONE, FP_ZERO, SETO),
2312   (SETE R600_Reg32:$src0, R600_Reg32:$src1)
2313 >;
2314
2315 //SETE_DX10 - 'true if ordered'
2316 def : Pat <
2317   (selectcc (f32 R600_Reg32:$src0), R600_Reg32:$src1, -1, 0, SETO),
2318   (SETE_DX10 R600_Reg32:$src0, R600_Reg32:$src1)
2319 >;
2320
2321 //SNE - 'true if unordered'
2322 def : Pat <
2323   (selectcc (f32 R600_Reg32:$src0), R600_Reg32:$src1, FP_ONE, FP_ZERO, SETUO),
2324   (SNE R600_Reg32:$src0, R600_Reg32:$src1)
2325 >;
2326
2327 //SETNE_DX10 - 'true if ordered'
2328 def : Pat <
2329   (selectcc (f32 R600_Reg32:$src0), R600_Reg32:$src1, -1, 0, SETUO),
2330   (SETNE_DX10 R600_Reg32:$src0, R600_Reg32:$src1)
2331 >;
2332
2333 def : Extract_Element <f32, v4f32, R600_Reg128, 0, sub0>;
2334 def : Extract_Element <f32, v4f32, R600_Reg128, 1, sub1>;
2335 def : Extract_Element <f32, v4f32, R600_Reg128, 2, sub2>;
2336 def : Extract_Element <f32, v4f32, R600_Reg128, 3, sub3>;
2337
2338 def : Insert_Element <f32, v4f32, R600_Reg32, R600_Reg128, 0, sub0>;
2339 def : Insert_Element <f32, v4f32, R600_Reg32, R600_Reg128, 1, sub1>;
2340 def : Insert_Element <f32, v4f32, R600_Reg32, R600_Reg128, 2, sub2>;
2341 def : Insert_Element <f32, v4f32, R600_Reg32, R600_Reg128, 3, sub3>;
2342
2343 def : Extract_Element <i32, v4i32, R600_Reg128, 0, sub0>;
2344 def : Extract_Element <i32, v4i32, R600_Reg128, 1, sub1>;
2345 def : Extract_Element <i32, v4i32, R600_Reg128, 2, sub2>;
2346 def : Extract_Element <i32, v4i32, R600_Reg128, 3, sub3>;
2347
2348 def : Insert_Element <i32, v4i32, R600_Reg32, R600_Reg128, 0, sub0>;
2349 def : Insert_Element <i32, v4i32, R600_Reg32, R600_Reg128, 1, sub1>;
2350 def : Insert_Element <i32, v4i32, R600_Reg32, R600_Reg128, 2, sub2>;
2351 def : Insert_Element <i32, v4i32, R600_Reg32, R600_Reg128, 3, sub3>;
2352
2353 def : Vector4_Build <v4f32, R600_Reg128, f32, R600_Reg32>;
2354 def : Vector4_Build <v4i32, R600_Reg128, i32, R600_Reg32>;
2355
2356 // bitconvert patterns
2357
2358 def : BitConvert <i32, f32, R600_Reg32>;
2359 def : BitConvert <f32, i32, R600_Reg32>;
2360 def : BitConvert <v4f32, v4i32, R600_Reg128>;
2361 def : BitConvert <v4i32, v4f32, R600_Reg128>;
2362
2363 // DWORDADDR pattern
2364 def : DwordAddrPat  <i32, R600_Reg32>;
2365
2366 } // End isR600toCayman Predicate