~ubuntu-branches/ubuntu/quantal/mesa/quantal-proposed

« back to all changes in this revision

Viewing changes to src/gallium/drivers/radeon/R600Instructions.td

  • Committer: Package Import Robot
  • Author(s): Timo Aaltonen
  • Date: 2012-09-17 13:24:35 UTC
  • mfrom: (1.7.9)
  • Revision ID: package-import@ubuntu.com-20120917132435-fqt9q6beebhc8t9r
Tags: 9.0~git20120917.7cfd42ce-0ubuntu1
Merge from unreleased debian git. (LP: #1047306)

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
  field bits<32> Inst;
21
21
  bit Trig = 0;
22
22
  bit Op3 = 0;
23
 
  bit isVector = 0; 
 
23
  bit isVector = 0;
 
24
  bits<2> FlagOperandIdx = 0;
24
25
 
25
26
  let Inst = inst;
26
27
  let Namespace = "AMDGPU";
36
37
  // Vector instructions are instructions that must fill all slots in an
37
38
  // instruction group
38
39
  let TSFlags{6} = isVector;
 
40
  let TSFlags{8-7} = FlagOperandIdx;
39
41
}
40
42
 
41
43
class InstR600ISA <dag outs, dag ins, string asm, list<dag> pattern> :
107
109
 
108
110
 
109
111
 
110
 
def PRED_X : AMDGPUInst <(outs R600_Predicate_Bit:$dst),
111
 
           (ins R600_Reg32:$src0, i32imm:$src1),
 
112
def PRED_X : InstR600 <0, (outs R600_Predicate_Bit:$dst),
 
113
           (ins R600_Reg32:$src0, i32imm:$src1, i32imm:$flags),
112
114
           "PRED $dst, $src0, $src1",
113
 
           []>
 
115
           [], NullALU>
114
116
{
115
117
  let DisableEncoding = "$src0";
116
118
  field bits<32> Inst;
117
119
  bits<32> src1;
118
120
 
119
121
  let Inst = src1;
 
122
  let FlagOperandIdx = 3;
120
123
}
121
124
 
122
 
 
123
 
 
124
 
let isTerminator = 1, isBranch = 1 in {
 
125
let isTerminator = 1, isBranch = 1, isPseudo = 1 in {
125
126
def JUMP : InstR600 <0x10,
126
127
          (outs),
127
128
          (ins brtarget:$target, R600_Pred:$p),
174
175
  bits<4>  COMP_MASK;
175
176
  bits<4>  BURST_COUNT;
176
177
  bits<1>  VPM;
177
 
  bits<1>  EOP;
 
178
  bits<1>  eop;
178
179
  bits<1>  MARK;
179
180
  bits<1>  BARRIER;
180
181
 
181
 
  /* CF_ALLOC_EXPORT_WORD0_RAT */
 
182
  // CF_ALLOC_EXPORT_WORD0_RAT
182
183
  let Inst{3-0}   = rat_id;
183
184
  let Inst{9-4}   = rat_inst;
184
 
  let Inst{10}    = 0; /* Reserved */
 
185
  let Inst{10}    = 0; // Reserved
185
186
  let Inst{12-11} = RIM;
186
187
  let Inst{14-13} = TYPE;
187
188
  let Inst{21-15} = RW_GPR;
189
190
  let Inst{29-23} = INDEX_GPR;
190
191
  let Inst{31-30} = ELEM_SIZE;
191
192
 
192
 
  /* CF_ALLOC_EXPORT_WORD1_BUF */
 
193
  // CF_ALLOC_EXPORT_WORD1_BUF
193
194
  let Inst{43-32} = ARRAY_SIZE;
194
195
  let Inst{47-44} = COMP_MASK;
195
196
  let Inst{51-48} = BURST_COUNT;
196
197
  let Inst{52}    = VPM;
197
 
  let Inst{53}    = EOP;
 
198
  let Inst{53}    = eop;
198
199
  let Inst{61-54} = cf_inst;
199
200
  let Inst{62}    = MARK;
200
201
  let Inst{63}    = BARRIER;
201
202
}
202
203
 
203
 
/*
204
 
def store_global : PatFrag<(ops node:$value, node:$ptr),
205
 
                           (store node:$value, node:$ptr),
206
 
                           [{
207
 
                            const Value *Src;
208
 
                            const PointerType *Type;
209
 
                            if ((src = cast<StoreSDNode>(N)->getSrcValue() &&
210
 
                                 PT = dyn_cast<PointerType>(Src->getType()))) {
211
 
                              return PT->getAddressSpace() == 1;
212
 
                            }
213
 
                            return false;
214
 
                           }]>;
215
 
 
216
 
*/
217
 
 
218
204
def load_param : PatFrag<(ops node:$ptr),
219
205
                         (load node:$ptr),
220
206
                          [{
226
212
                           return false;
227
213
                          }]>;
228
214
 
229
 
//class EG_CF <bits<32> inst, string asm> :
230
 
//    InstR600 <inst, (outs), (ins), asm, []>;
231
 
 
232
 
/* XXX: We will use this when we emit the real ISA.
233
 
  bits<24> ADDR = 0;
234
 
  bits<3> JTS = 0;
235
 
 
236
 
  bits<3> PC = 0;
237
 
  bits<5> CF_CONS = 0;
238
 
  bits<2> COND = 0;
239
 
  bits<6> COUNT = 0;
240
 
  bits<1> VPM = 0;
241
 
  bits<1> EOP = 0;
242
 
  bits<8> CF_INST = 0;
243
 
  bits<1> WQM = 0;
244
 
  bits<1> B = 0;
245
 
 
246
 
  let Inst{23-0} = ADDR;
247
 
  let Inst{26-24} = JTS;
248
 
  let Inst{34-32} = PC;
249
 
  let Inst{39-35} = CF_CONST;
250
 
  let Inst{41-40} = COND;
251
 
  let Inst{47-42} = COUNT;
252
 
  let Inst{52} = VPM;
253
 
  let Inst{53} = EOP;
254
 
  let Inst{61-54} = CF_INST;
255
 
  let Inst{62} = WQM;
256
 
  let Inst{63} = B;
257
 
//}
258
 
*/
259
215
def isR600 : Predicate<"Subtarget.device()"
260
216
                            "->getGeneration() == AMDGPUDeviceInfo::HD4XXX">;
261
217
def isR700 : Predicate<"Subtarget.device()"
278
234
 
279
235
let Predicates = [isR600toCayman] in { 
280
236
 
281
 
/* ------------------------------------------- */
282
 
/* Common Instructions R600, R700, Evergreen, Cayman */
283
 
/* ------------------------------------------- */
 
237
//===----------------------------------------------------------------------===//
 
238
// Common Instructions R600, R700, Evergreen, Cayman
 
239
//===----------------------------------------------------------------------===//
 
240
 
284
241
def ADD : R600_2OP <
285
242
  0x0, "ADD",
286
243
  [(set R600_Reg32:$dst, (fadd R600_Reg32:$src0, R600_Reg32:$src1))]
307
264
  [(set R600_Reg32:$dst, (AMDGPUfmin R600_Reg32:$src0, R600_Reg32:$src1))]
308
265
>;
309
266
 
310
 
/* For the SET* instructions there is a naming conflict in TargetSelectionDAG.td,
311
 
 * so some of the instruction names don't match the asm string.
312
 
 * XXX: Use the defs in TargetSelectionDAG.td instead of intrinsics.
313
 
 */
 
267
// For the SET* instructions there is a naming conflict in TargetSelectionDAG.td,
 
268
// so some of the instruction names don't match the asm string.
 
269
// XXX: Use the defs in TargetSelectionDAG.td instead of intrinsics.
314
270
 
315
271
def SETE : R600_2OP <
316
272
  0x08, "SETE",
365
321
  [(set R600_Reg32:$dst, (int_AMDGPU_floor R600_Reg32:$src))]
366
322
>;
367
323
 
368
 
def MOV : R600_1OP <0x19, "MOV", []>;
 
324
def MOV : InstR600 <0x19, (outs R600_Reg32:$dst),
 
325
                          (ins R600_Reg32:$src0, i32imm:$flags,
 
326
                               R600_Pred:$p),
 
327
                          "MOV $dst, $src0", [], AnyALU> {
 
328
  let FlagOperandIdx = 2;
 
329
}
369
330
 
370
331
class MOV_IMM <ValueType vt, Operand immType> : InstR600 <0x19,
371
332
  (outs R600_Reg32:$dst),
386
347
  (MOV_IMM_F32 (i32 ALU_LITERAL_X), fpimm:$val)
387
348
>;
388
349
 
389
 
def KILLGT : R600_2OP <
390
 
  0x2D, "KILLGT",
391
 
  []
392
 
>;
 
350
def KILLGT : InstR600 <0x2D,
 
351
          (outs R600_Reg32:$dst),
 
352
          (ins R600_Reg32:$src0, R600_Reg32:$src1, i32imm:$flags, R600_Pred:$p,
 
353
               variable_ops),
 
354
          "KILLGT $dst, $src0, $src1, $flags ($p)",
 
355
          [],
 
356
          NullALU>{
 
357
  let FlagOperandIdx = 3;
 
358
}
393
359
 
394
360
def AND_INT : R600_2OP <
395
361
  0x30, "AND_INT",
481
447
   (select R600_Reg32:$src0, R600_Reg32:$src2, R600_Reg32:$src1))]
482
448
>;
483
449
 
484
 
/* Texture instructions */
485
 
 
 
450
//===----------------------------------------------------------------------===//
 
451
// Texture instructions
 
452
//===----------------------------------------------------------------------===//
486
453
 
487
454
def TEX_LD : R600_TEX <
488
455
  0x03, "TEX_LD",
557
524
  []
558
525
>;
559
526
 
560
 
/* Helper classes for common instructions */
 
527
//===----------------------------------------------------------------------===//
 
528
// Helper classes for common instructions
 
529
//===----------------------------------------------------------------------===//
561
530
 
562
531
class MUL_LIT_Common <bits<32> inst> : R600_3OP <
563
532
  inst, "MUL_LIT",
588
557
 
589
558
class DOT4_Common <bits<32> inst> : R600_REDUCTION <
590
559
  inst,
591
 
  (ins R600_Reg128:$src0, R600_Reg128:$src1),
 
560
  (ins R600_Reg128:$src0, R600_Reg128:$src1, i32imm:$flags),
592
561
  "DOT4 $dst $src0, $src1",
593
 
  [(set R600_Reg32:$dst, (int_AMDGPU_dp4 R600_Reg128:$src0, R600_Reg128:$src1))]
594
 
>;
595
 
 
596
 
class CUBE_Common <bits<32> inst> : InstR600 <
597
 
  inst,
598
 
  (outs R600_Reg128:$dst),
599
 
  (ins R600_Reg128:$src),
600
 
  "CUBE $dst $src",
601
 
  [(set R600_Reg128:$dst, (int_AMDGPU_cube R600_Reg128:$src))],
602
 
  VecALU
603
 
>;
 
562
  []
 
563
  > {
 
564
  let FlagOperandIdx = 3;
 
565
}
 
566
 
 
567
class DOT4_Pat <Instruction dot4> : Pat <
 
568
  (int_AMDGPU_dp4 R600_Reg128:$src0, R600_Reg128:$src1),
 
569
  (dot4 R600_Reg128:$src0, R600_Reg128:$src1, 0)
 
570
>;
 
571
 
 
572
multiclass CUBE_Common <bits<32> inst> {
 
573
 
 
574
  def _pseudo : InstR600 <
 
575
    inst,
 
576
    (outs R600_Reg128:$dst),
 
577
    (ins R600_Reg128:$src),
 
578
    "CUBE $dst $src",
 
579
    [(set R600_Reg128:$dst, (int_AMDGPU_cube R600_Reg128:$src))],
 
580
    VecALU
 
581
  >;
 
582
 
 
583
  def _real : InstR600 <
 
584
    inst,
 
585
    (outs R600_Reg32:$dst),
 
586
    (ins R600_Reg32:$src0, R600_Reg32:$src1, i32imm:$flags),
 
587
    "CUBE $dst, $src0, $src1",
 
588
    [], VecALU
 
589
  >{
 
590
    let FlagOperandIdx = 3;
 
591
  }
 
592
}
604
593
 
605
594
class EXP_IEEE_Common <bits<32> inst> : R600_1OP <
606
595
  inst, "EXP_IEEE",
707
696
  let Trig = 1;
708
697
}
709
698
 
710
 
/* Helper patterns for complex intrinsics */
711
 
/* -------------------------------------- */
 
699
//===----------------------------------------------------------------------===//
 
700
// Helper patterns for complex intrinsics
 
701
//===----------------------------------------------------------------------===//
712
702
 
713
703
class DIV_Common <InstR600 recip_ieee> : Pat<
714
704
  (int_AMDGPU_div R600_Reg32:$src0, R600_Reg32:$src1),
725
715
  (exp_ieee (mul_lit (log_clamped (MAX R600_Reg32:$src_y, (f32 ZERO))), R600_Reg32:$src_w, R600_Reg32:$src_x))
726
716
>;
727
717
 
728
 
/* ---------------------- */
729
 
/* R600 / R700 Only Instructions */
730
 
/* ---------------------- */
 
718
//===----------------------------------------------------------------------===//
 
719
// R600 / R700 Instructions
 
720
//===----------------------------------------------------------------------===//
731
721
 
732
722
let Predicates = [isR600] in {
733
723
 
737
727
  def CNDGT_r600 : CNDGT_Common<0x19>;
738
728
  def CNDGE_r600 : CNDGE_Common<0x1A>;
739
729
  def DOT4_r600 : DOT4_Common<0x50>;
740
 
  def CUBE_r600 : CUBE_Common<0x52>;
 
730
  def : DOT4_Pat <DOT4_r600>;
 
731
  defm CUBE_r600 : CUBE_Common<0x52>;
741
732
  def EXP_IEEE_r600 : EXP_IEEE_Common<0x61>;
742
733
  def LOG_CLAMPED_r600 : LOG_CLAMPED_Common<0x62>;
743
734
  def LOG_IEEE_r600 : LOG_IEEE_Common<0x63>;
803
794
 
804
795
} // End Predicates = [isEG]
805
796
 
806
 
/* ------------------------------- */
807
 
/* Evergreen / Cayman Instructions */
808
 
/* ------------------------------- */
 
797
//===----------------------------------------------------------------------===//
 
798
// Evergreen / Cayman Instructions
 
799
//===----------------------------------------------------------------------===//
809
800
 
810
801
let Predicates = [isEGorCayman] in {
811
802
 
853
844
  def SIN_eg : SIN_Common<0x8D>;
854
845
  def COS_eg : COS_Common<0x8E>;
855
846
  def DOT4_eg : DOT4_Common<0xBE>;
856
 
  def CUBE_eg : CUBE_Common<0xC0>;
 
847
  def : DOT4_Pat <DOT4_eg>;
 
848
  defm CUBE_eg : CUBE_Common<0xC0>;
857
849
 
858
850
  def DIV_eg : DIV_Common<RECIP_IEEE_eg>;
859
851
  def POW_eg : POW_Common<LOG_IEEE_eg, EXP_IEEE_eg, MUL, GPRF32>;
888
880
let usesCustomInserter = 1 in {
889
881
 
890
882
def RAT_WRITE_CACHELESS_eg : EG_CF_RAT <0x57, 0x2, 0, (outs),
891
 
  (ins R600_TReg32_X:$rw_gpr, R600_TReg32_X:$index_gpr),
892
 
  "RAT_WRITE_CACHELESS_eg $rw_gpr, $index_gpr",
893
 
  [(global_store (i32 R600_TReg32_X:$rw_gpr), R600_TReg32_X:$index_gpr)]>
 
883
  (ins R600_TReg32_X:$rw_gpr, R600_TReg32_X:$index_gpr, i32imm:$eop),
 
884
  "RAT_WRITE_CACHELESS_eg $rw_gpr, $index_gpr, $eop",
 
885
  []>
894
886
{
895
887
  let RIM         = 0;
896
 
  /* XXX: Have a separate instruction for non-indexed writes. */
 
888
  // XXX: Have a separate instruction for non-indexed writes.
897
889
  let TYPE        = 1;
898
890
  let RW_REL      = 0;
899
891
  let ELEM_SIZE   = 0;
902
894
  let COMP_MASK   = 1;
903
895
  let BURST_COUNT = 0;
904
896
  let VPM         = 0;
905
 
  let EOP         = 0;
906
897
  let MARK        = 0;
907
898
  let BARRIER     = 1;
908
899
}
909
900
 
910
901
} // End usesCustomInserter = 1
911
902
 
 
903
// i32 global_store
 
904
def : Pat <
 
905
  (global_store (i32 R600_TReg32_X:$val), R600_TReg32_X:$ptr),
 
906
  (RAT_WRITE_CACHELESS_eg R600_TReg32_X:$val, R600_TReg32_X:$ptr, 0)
 
907
>;
 
908
 
912
909
// Floating point global_store
913
910
def : Pat <
914
911
  (global_store (f32 R600_TReg32_X:$val), R600_TReg32_X:$ptr),
915
 
  (RAT_WRITE_CACHELESS_eg R600_TReg32_X:$val, R600_TReg32_X:$ptr)
 
912
  (RAT_WRITE_CACHELESS_eg R600_TReg32_X:$val, R600_TReg32_X:$ptr, 0)
916
913
>;
917
914
 
918
915
class VTX_READ_eg <bits<8> buffer_id, dag outs, list<dag> pattern>
1091
1088
 
1092
1089
} // End isCayman
1093
1090
 
1094
 
/* Other Instructions */
1095
 
 
1096
1091
let isCodeGenOnly = 1 in {
1097
 
/*
1098
 
  def SWIZZLE : AMDGPUShaderInst <
1099
 
    (outs GPRV4F32:$dst),
1100
 
    (ins GPRV4F32:$src0, i32imm:$src1),
1101
 
    "SWIZZLE $dst, $src0, $src1",
1102
 
    [(set GPRV4F32:$dst, (int_AMDGPU_swizzle GPRV4F32:$src0, imm:$src1))]
1103
 
  >;
1104
 
*/
1105
 
 
1106
 
  def LAST : AMDGPUShaderInst <
1107
 
    (outs),
1108
 
    (ins),
1109
 
    "LAST",
1110
 
    []
1111
 
  >;
1112
 
 
1113
 
  def GET_CHAN : AMDGPUShaderInst <
1114
 
    (outs R600_Reg32:$dst),
1115
 
    (ins R600_Reg128:$src0, i32imm:$src1),
1116
 
    "GET_CHAN $dst, $src0, $src1",
1117
 
    []
1118
 
  >;
1119
1092
 
1120
1093
  def MULLIT : AMDGPUShaderInst <
1121
1094
    (outs R600_Reg128:$dst),
1180
1153
 
1181
1154
} // End usesCustomInserter = 1
1182
1155
 
 
1156
//===---------------------------------------------------------------------===//
 
1157
// Return instruction
 
1158
//===---------------------------------------------------------------------===//
 
1159
let isTerminator = 1, isReturn = 1, isBarrier = 1, hasCtrlDep = 1 in {
 
1160
  def RETURN          : ILFormat<(outs), (ins variable_ops),
 
1161
      "RETURN", [(IL_retflag)]>;
 
1162
}
 
1163
 
1183
1164
//===----------------------------------------------------------------------===//
1184
1165
// ISel Patterns
1185
1166
//===----------------------------------------------------------------------===//
1187
1168
// KIL Patterns
1188
1169
def KILP : Pat <
1189
1170
  (int_AMDGPU_kilp),
1190
 
  (MASK_WRITE (KILLGT (f32 ONE), (f32 ZERO)))
 
1171
  (MASK_WRITE (KILLGT (f32 ONE), (f32 ZERO), 0))
1191
1172
>;
1192
1173
 
1193
1174
def KIL : Pat <
1194
1175
  (int_AMDGPU_kill R600_Reg32:$src0),
1195
 
  (MASK_WRITE (KILLGT (f32 ZERO), (f32 R600_Reg32:$src0)))
 
1176
  (MASK_WRITE (KILLGT (f32 ZERO), (f32 R600_Reg32:$src0), 0))
1196
1177
>;
1197
1178
 
1198
1179
// SGT Reverse args