1//===-- AMDGPU.td - AMDGPU Tablegen files --------*- tablegen -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===------------------------------------------------------------===//
8
9include "llvm/TableGen/SearchableTable.td"
10include "llvm/Target/Target.td"
11include "AMDGPUFeatures.td"
12
13def p0 : PtrValueType<i64, 0>;
14def p1 : PtrValueType<i64, 1>;
15def p2 : PtrValueType<i32, 2>;
16def p3 : PtrValueType<i32, 3>;
17def p4 : PtrValueType<i64, 4>;
18def p5 : PtrValueType<i32, 5>;
19def p6 : PtrValueType<i32, 6>;
20
21class BoolToList<bit Value> {
22  list<int> ret = !if(Value, [1]<int>, []<int>);
23}
24
25//===------------------------------------------------------------===//
26// Subtarget Features (device properties)
27//===------------------------------------------------------------===//
28
29def FeatureFastFMAF32 : SubtargetFeature<"fast-fmaf",
30  "FastFMAF32",
31  "true",
32  "Assuming f32 fma is at least as fast as mul + add"
33>;
34
35def FeatureFastDenormalF32 : SubtargetFeature<"fast-denormal-f32",
36  "FastDenormalF32",
37  "true",
38  "Enabling denormals does not cause f32 instructions to run at f64 rates"
39>;
40
41def FeatureMIMG_R128 : SubtargetFeature<"mimg-r128",
42  "MIMG_R128",
43  "true",
44  "Support 128-bit texture resources"
45>;
46
47def HalfRate64Ops : SubtargetFeature<"half-rate-64-ops",
48  "HalfRate64Ops",
49  "true",
50  "Most fp64 instructions are half rate instead of quarter"
51>;
52
53def FullRate64Ops : SubtargetFeature<"full-rate-64-ops",
54  "FullRate64Ops",
55  "true",
56  "Most fp64 instructions are full rate"
57>;
58
59def FeatureFlatAddressSpace : SubtargetFeature<"flat-address-space",
60  "FlatAddressSpace",
61  "true",
62  "Support flat address space"
63>;
64
65def FeatureFlatInstOffsets : SubtargetFeature<"flat-inst-offsets",
66  "FlatInstOffsets",
67  "true",
68  "Flat instructions have immediate offset addressing mode"
69>;
70
71def FeatureFlatGlobalInsts : SubtargetFeature<"flat-global-insts",
72  "FlatGlobalInsts",
73  "true",
74  "Have global_* flat memory instructions"
75>;
76
77def FeatureFlatScratchInsts : SubtargetFeature<"flat-scratch-insts",
78  "FlatScratchInsts",
79  "true",
80  "Have scratch_* flat memory instructions"
81>;
82
83def FeatureScalarFlatScratchInsts : SubtargetFeature<"scalar-flat-scratch-insts",
84  "ScalarFlatScratchInsts",
85  "true",
86  "Have s_scratch_* flat memory instructions"
87>;
88
89def FeatureEnableFlatScratch : SubtargetFeature<"enable-flat-scratch",
90  "EnableFlatScratch",
91  "true",
92  "Use scratch_* flat memory instructions to access scratch"
93>;
94
95def FeatureAddNoCarryInsts : SubtargetFeature<"add-no-carry-insts",
96  "AddNoCarryInsts",
97  "true",
98  "Have VALU add/sub instructions without carry out"
99>;
100
101def FeatureUnalignedBufferAccess : SubtargetFeature<"unaligned-buffer-access",
102  "UnalignedBufferAccess",
103  "true",
104  "Hardware supports unaligned global loads and stores"
105>;
106
107def FeatureTrapHandler: SubtargetFeature<"trap-handler",
108  "TrapHandler",
109  "true",
110  "Trap handler support"
111>;
112
113def FeatureUnalignedScratchAccess : SubtargetFeature<"unaligned-scratch-access",
114  "UnalignedScratchAccess",
115  "true",
116  "Support unaligned scratch loads and stores"
117>;
118
119def FeatureUnalignedDSAccess : SubtargetFeature<"unaligned-ds-access",
120  "UnalignedDSAccess",
121  "true",
122  "Hardware supports unaligned local and region loads and stores"
123>;
124
125def FeatureApertureRegs : SubtargetFeature<"aperture-regs",
126  "HasApertureRegs",
127  "true",
128  "Has Memory Aperture Base and Size Registers"
129>;
130
131def FeatureMadMixInsts : SubtargetFeature<"mad-mix-insts",
132  "HasMadMixInsts",
133  "true",
134  "Has v_mad_mix_f32, v_mad_mixlo_f16, v_mad_mixhi_f16 instructions"
135>;
136
137def FeatureFmaMixInsts : SubtargetFeature<"fma-mix-insts",
138  "HasFmaMixInsts",
139  "true",
140  "Has v_fma_mix_f32, v_fma_mixlo_f16, v_fma_mixhi_f16 instructions"
141>;
142
143def FeatureSupportsXNACK : SubtargetFeature<"xnack-support",
144  "SupportsXNACK",
145  "true",
146  "Hardware supports XNACK"
147>;
148
149// XNACK is disabled if SH_MEM_CONFIG.ADDRESS_MODE = GPUVM on chips that support
150// XNACK. The current default kernel driver setting is:
151// - graphics ring: XNACK disabled
152// - compute ring: XNACK enabled
153//
154// If XNACK is enabled, the VMEM latency can be worse.
155// If XNACK is disabled, the 2 SGPRs can be used for general purposes.
156def FeatureXNACK : SubtargetFeature<"xnack",
157  "EnableXNACK",
158  "true",
159  "Enable XNACK support"
160>;
161
162def FeatureTgSplit : SubtargetFeature<"tgsplit",
163  "EnableTgSplit",
164  "true",
165  "Enable threadgroup split execution"
166>;
167
168def FeatureCuMode : SubtargetFeature<"cumode",
169  "EnableCuMode",
170  "true",
171  "Enable CU wavefront execution mode"
172>;
173
174def FeatureSGPRInitBug : SubtargetFeature<"sgpr-init-bug",
175  "SGPRInitBug",
176  "true",
177  "VI SGPR initialization bug requiring a fixed SGPR allocation size"
178>;
179
180def FeatureLdsMisalignedBug : SubtargetFeature<"lds-misaligned-bug",
181  "LDSMisalignedBug",
182  "true",
183  "Some GFX10 bug with multi-dword LDS and flat access that is not naturally aligned in WGP mode"
184>;
185
186def FeatureMFMAInlineLiteralBug : SubtargetFeature<"mfma-inline-literal-bug",
187  "HasMFMAInlineLiteralBug",
188  "true",
189  "MFMA cannot use inline literal as SrcC"
190>;
191
192def FeatureVcmpxPermlaneHazard : SubtargetFeature<"vcmpx-permlane-hazard",
193  "HasVcmpxPermlaneHazard",
194  "true",
195  "TODO: describe me"
196>;
197
198def FeatureVMEMtoScalarWriteHazard : SubtargetFeature<"vmem-to-scalar-write-hazard",
199  "HasVMEMtoScalarWriteHazard",
200  "true",
201  "VMEM instruction followed by scalar writing to EXEC mask, M0 or SGPR leads to incorrect execution."
202>;
203
204def FeatureSMEMtoVectorWriteHazard : SubtargetFeature<"smem-to-vector-write-hazard",
205  "HasSMEMtoVectorWriteHazard",
206  "true",
207  "s_load_dword followed by v_cmp page faults"
208>;
209
210def FeatureInstFwdPrefetchBug : SubtargetFeature<"inst-fwd-prefetch-bug",
211  "HasInstFwdPrefetchBug",
212  "true",
213  "S_INST_PREFETCH instruction causes shader to hang"
214>;
215
216def FeatureVcmpxExecWARHazard : SubtargetFeature<"vcmpx-exec-war-hazard",
217  "HasVcmpxExecWARHazard",
218  "true",
219  "V_CMPX WAR hazard on EXEC (V_CMPX issue ONLY)"
220>;
221
222def FeatureLdsBranchVmemWARHazard : SubtargetFeature<"lds-branch-vmem-war-hazard",
223  "HasLdsBranchVmemWARHazard",
224  "true",
225  "Switching between LDS and VMEM-tex not waiting VM_VSRC=0"
226>;
227
228def FeatureNSAtoVMEMBug : SubtargetFeature<"nsa-to-vmem-bug",
229  "HasNSAtoVMEMBug",
230  "true",
231  "MIMG-NSA followed by VMEM fail if EXEC_LO or EXEC_HI equals zero"
232>;
233
234def FeatureNSAClauseBug : SubtargetFeature<"nsa-clause-bug",
235  "HasNSAClauseBug",
236  "true",
237  "MIMG-NSA in a hard clause has unpredictable results on GFX10.1"
238>;
239
240def FeatureFlatSegmentOffsetBug : SubtargetFeature<"flat-segment-offset-bug",
241  "HasFlatSegmentOffsetBug",
242  "true",
243  "GFX10 bug where inst_offset is ignored when flat instructions access global memory"
244>;
245
246def FeatureNegativeScratchOffsetBug : SubtargetFeature<"negative-scratch-offset-bug",
247  "NegativeScratchOffsetBug",
248  "true",
249  "Negative immediate offsets in scratch instructions with an SGPR offset page fault on GFX9"
250>;
251
252def FeatureNegativeUnalignedScratchOffsetBug : SubtargetFeature<"negative-unaligned-scratch-offset-bug",
253  "NegativeUnalignedScratchOffsetBug",
254  "true",
255  "Scratch instructions with a VGPR offset and a negative immediate offset that is not a multiple of 4 read wrong memory on GFX10"
256>;
257
258def FeatureOffset3fBug : SubtargetFeature<"offset-3f-bug",
259  "HasOffset3fBug",
260  "true",
261  "Branch offset of 3f hardware bug"
262>;
263
264def FeatureImageStoreD16Bug : SubtargetFeature<"image-store-d16-bug",
265  "HasImageStoreD16Bug",
266  "true",
267  "Image Store D16 hardware bug"
268>;
269
270def FeatureImageGather4D16Bug : SubtargetFeature<"image-gather4-d16-bug",
271  "HasImageGather4D16Bug",
272  "true",
273  "Image Gather4 D16 hardware bug"
274>;
275
276class SubtargetFeatureLDSBankCount <int Value> : SubtargetFeature <
277  "ldsbankcount"#Value,
278  "LDSBankCount",
279  !cast<string>(Value),
280  "The number of LDS banks per compute unit."
281>;
282
283def FeatureLDSBankCount16 : SubtargetFeatureLDSBankCount<16>;
284def FeatureLDSBankCount32 : SubtargetFeatureLDSBankCount<32>;
285
286def FeatureGCN3Encoding : SubtargetFeature<"gcn3-encoding",
287  "GCN3Encoding",
288  "true",
289  "Encoding format for VI"
290>;
291
292def FeatureCIInsts : SubtargetFeature<"ci-insts",
293  "CIInsts",
294  "true",
295  "Additional instructions for CI+"
296>;
297
298def FeatureGFX8Insts : SubtargetFeature<"gfx8-insts",
299  "GFX8Insts",
300  "true",
301  "Additional instructions for GFX8+"
302>;
303
304def FeatureGFX9Insts : SubtargetFeature<"gfx9-insts",
305  "GFX9Insts",
306  "true",
307  "Additional instructions for GFX9+"
308>;
309
310def FeatureGFX90AInsts : SubtargetFeature<"gfx90a-insts",
311  "GFX90AInsts",
312  "true",
313  "Additional instructions for GFX90A+"
314>;
315
316def FeatureGFX940Insts : SubtargetFeature<"gfx940-insts",
317  "GFX940Insts",
318  "true",
319  "Additional instructions for GFX940+"
320>;
321
322def FeatureGFX10Insts : SubtargetFeature<"gfx10-insts",
323  "GFX10Insts",
324  "true",
325  "Additional instructions for GFX10+"
326>;
327
328def FeatureGFX10_3Insts : SubtargetFeature<"gfx10-3-insts",
329  "GFX10_3Insts",
330  "true",
331  "Additional instructions for GFX10.3"
332>;
333
334def FeatureGFX7GFX8GFX9Insts : SubtargetFeature<"gfx7-gfx8-gfx9-insts",
335  "GFX7GFX8GFX9Insts",
336  "true",
337  "Instructions shared in GFX7, GFX8, GFX9"
338>;
339
340def FeatureSMemRealTime : SubtargetFeature<"s-memrealtime",
341  "HasSMemRealTime",
342  "true",
343  "Has s_memrealtime instruction"
344>;
345
346def FeatureInv2PiInlineImm : SubtargetFeature<"inv-2pi-inline-imm",
347  "HasInv2PiInlineImm",
348  "true",
349  "Has 1 / (2 * pi) as inline immediate"
350>;
351
352def Feature16BitInsts : SubtargetFeature<"16-bit-insts",
353  "Has16BitInsts",
354  "true",
355  "Has i16/f16 instructions"
356>;
357
358def FeatureVOP3P : SubtargetFeature<"vop3p",
359  "HasVOP3PInsts",
360  "true",
361  "Has VOP3P packed instructions"
362>;
363
364def FeatureMovrel : SubtargetFeature<"movrel",
365  "HasMovrel",
366  "true",
367  "Has v_movrel*_b32 instructions"
368>;
369
370def FeatureVGPRIndexMode : SubtargetFeature<"vgpr-index-mode",
371  "HasVGPRIndexMode",
372  "true",
373  "Has VGPR mode register indexing"
374>;
375
376def FeatureScalarStores : SubtargetFeature<"scalar-stores",
377  "HasScalarStores",
378  "true",
379  "Has store scalar memory instructions"
380>;
381
382def FeatureScalarAtomics : SubtargetFeature<"scalar-atomics",
383  "HasScalarAtomics",
384  "true",
385  "Has atomic scalar memory instructions"
386>;
387
388def FeatureSDWA : SubtargetFeature<"sdwa",
389  "HasSDWA",
390  "true",
391  "Support SDWA (Sub-DWORD Addressing) extension"
392>;
393
394def FeatureSDWAOmod : SubtargetFeature<"sdwa-omod",
395  "HasSDWAOmod",
396  "true",
397  "Support OMod with SDWA (Sub-DWORD Addressing) extension"
398>;
399
400def FeatureSDWAScalar : SubtargetFeature<"sdwa-scalar",
401  "HasSDWAScalar",
402  "true",
403  "Support scalar register with SDWA (Sub-DWORD Addressing) extension"
404>;
405
406def FeatureSDWASdst : SubtargetFeature<"sdwa-sdst",
407  "HasSDWASdst",
408  "true",
409  "Support scalar dst for VOPC with SDWA (Sub-DWORD Addressing) extension"
410>;
411
412def FeatureSDWAMac : SubtargetFeature<"sdwa-mav",
413  "HasSDWAMac",
414  "true",
415  "Support v_mac_f32/f16 with SDWA (Sub-DWORD Addressing) extension"
416>;
417
418def FeatureSDWAOutModsVOPC : SubtargetFeature<"sdwa-out-mods-vopc",
419  "HasSDWAOutModsVOPC",
420  "true",
421  "Support clamp for VOPC with SDWA (Sub-DWORD Addressing) extension"
422>;
423
424def FeatureDPP : SubtargetFeature<"dpp",
425  "HasDPP",
426  "true",
427  "Support DPP (Data Parallel Primitives) extension"
428>;
429
430// DPP8 allows arbitrary cross-lane swizzling within groups of 8 lanes.
431def FeatureDPP8 : SubtargetFeature<"dpp8",
432  "HasDPP8",
433  "true",
434  "Support DPP8 (Data Parallel Primitives) extension"
435>;
436
437def Feature64BitDPP : SubtargetFeature<"dpp-64bit",
438  "Has64BitDPP",
439  "true",
440  "Support DPP (Data Parallel Primitives) extension"
441>;
442
443def FeaturePackedFP32Ops : SubtargetFeature<"packed-fp32-ops",
444  "HasPackedFP32Ops",
445  "true",
446  "Support packed fp32 instructions"
447>;
448
449def FeatureR128A16 : SubtargetFeature<"r128-a16",
450  "HasR128A16",
451  "true",
452  "Support gfx9-style A16 for 16-bit coordinates/gradients/lod/clamp/mip image operands, where a16 is aliased with r128"
453>;
454
455def FeatureGFX10A16 : SubtargetFeature<"a16",
456  "HasGFX10A16",
457  "true",
458  "Support gfx10-style A16 for 16-bit coordinates/gradients/lod/clamp/mip image operands"
459>;
460
461def FeatureG16 : SubtargetFeature<"g16",
462  "HasG16",
463  "true",
464  "Support G16 for 16-bit gradient image operands"
465>;
466
467def FeatureNSAEncoding : SubtargetFeature<"nsa-encoding",
468  "HasNSAEncoding",
469  "true",
470  "Support NSA encoding for image instructions"
471>;
472
473def FeatureImageInsts : SubtargetFeature<"image-insts",
474  "HasImageInsts",
475  "true",
476  "Support image instructions"
477>;
478
479def FeatureExtendedImageInsts : SubtargetFeature<"extended-image-insts",
480  "HasExtendedImageInsts",
481  "true",
482  "Support mips != 0, lod != 0, gather4, and get_lod"
483>;
484
485def FeatureGFX10_AEncoding : SubtargetFeature<"gfx10_a-encoding",
486  "GFX10_AEncoding",
487  "true",
488  "Has BVH ray tracing instructions"
489>;
490
491def FeatureGFX10_BEncoding : SubtargetFeature<"gfx10_b-encoding",
492  "GFX10_BEncoding",
493  "true",
494  "Encoding format GFX10_B"
495>;
496
497def FeatureIntClamp : SubtargetFeature<"int-clamp-insts",
498  "HasIntClamp",
499  "true",
500  "Support clamp for integer destination"
501>;
502
503def FeatureUnpackedD16VMem : SubtargetFeature<"unpacked-d16-vmem",
504  "HasUnpackedD16VMem",
505  "true",
506  "Has unpacked d16 vmem instructions"
507>;
508
509def FeatureDLInsts : SubtargetFeature<"dl-insts",
510  "HasDLInsts",
511  "true",
512  "Has v_fmac_f32 and v_xnor_b32 instructions"
513>;
514
515def FeatureDot1Insts : SubtargetFeature<"dot1-insts",
516  "HasDot1Insts",
517  "true",
518  "Has v_dot4_i32_i8 and v_dot8_i32_i4 instructions"
519>;
520
521def FeatureDot2Insts : SubtargetFeature<"dot2-insts",
522  "HasDot2Insts",
523  "true",
524  "Has v_dot2_i32_i16, v_dot2_u32_u16 instructions"
525>;
526
527def FeatureDot3Insts : SubtargetFeature<"dot3-insts",
528  "HasDot3Insts",
529  "true",
530  "Has v_dot8c_i32_i4 instruction"
531>;
532
533def FeatureDot4Insts : SubtargetFeature<"dot4-insts",
534  "HasDot4Insts",
535  "true",
536  "Has v_dot2c_i32_i16 instruction"
537>;
538
539def FeatureDot5Insts : SubtargetFeature<"dot5-insts",
540  "HasDot5Insts",
541  "true",
542  "Has v_dot2c_f32_f16 instruction"
543>;
544
545def FeatureDot6Insts : SubtargetFeature<"dot6-insts",
546  "HasDot6Insts",
547  "true",
548  "Has v_dot4c_i32_i8 instruction"
549>;
550
551def FeatureDot7Insts : SubtargetFeature<"dot7-insts",
552  "HasDot7Insts",
553  "true",
554  "Has v_dot2_f32_f16, v_dot4_u32_u8, v_dot8_u32_u4 instructions"
555>;
556
557def FeatureMAIInsts : SubtargetFeature<"mai-insts",
558  "HasMAIInsts",
559  "true",
560  "Has mAI instructions"
561>;
562
563def FeaturePkFmacF16Inst : SubtargetFeature<"pk-fmac-f16-inst",
564  "HasPkFmacF16Inst",
565  "true",
566  "Has v_pk_fmac_f16 instruction"
567>;
568
569def FeatureAtomicFaddInsts : SubtargetFeature<"atomic-fadd-insts",
570  "HasAtomicFaddInsts",
571  "true",
572  "Has buffer_atomic_add_f32, buffer_atomic_pk_add_f16, global_atomic_add_f32, "
573  "global_atomic_pk_add_f16 instructions",
574  [FeatureFlatGlobalInsts]
575>;
576
577def FeatureSupportsSRAMECC : SubtargetFeature<"sramecc-support",
578  "SupportsSRAMECC",
579  "true",
580  "Hardware supports SRAMECC"
581>;
582
583def FeatureSRAMECC : SubtargetFeature<"sramecc",
584  "EnableSRAMECC",
585  "true",
586  "Enable SRAMECC"
587>;
588
589def FeatureNoSdstCMPX : SubtargetFeature<"no-sdst-cmpx",
590  "HasNoSdstCMPX",
591  "true",
592  "V_CMPX does not write VCC/SGPR in addition to EXEC"
593>;
594
595def FeatureVscnt : SubtargetFeature<"vscnt",
596  "HasVscnt",
597  "true",
598  "Has separate store vscnt counter"
599>;
600
601def FeatureGetWaveIdInst : SubtargetFeature<"get-wave-id-inst",
602  "HasGetWaveIdInst",
603  "true",
604  "Has s_get_waveid_in_workgroup instruction"
605>;
606
607def FeatureSMemTimeInst : SubtargetFeature<"s-memtime-inst",
608  "HasSMemTimeInst",
609  "true",
610  "Has s_memtime instruction"
611>;
612
613def FeatureShaderCyclesRegister : SubtargetFeature<"shader-cycles-register",
614  "HasShaderCyclesRegister",
615  "true",
616  "Has SHADER_CYCLES hardware register"
617>;
618
619def FeatureMadMacF32Insts : SubtargetFeature<"mad-mac-f32-insts",
620  "HasMadMacF32Insts",
621  "true",
622  "Has v_mad_f32/v_mac_f32/v_madak_f32/v_madmk_f32 instructions"
623>;
624
625def FeatureDsSrc2Insts : SubtargetFeature<"ds-src2-insts",
626  "HasDsSrc2Insts",
627  "true",
628  "Has ds_*_src2 instructions"
629>;
630
631def FeatureVOP3Literal : SubtargetFeature<"vop3-literal",
632  "HasVOP3Literal",
633  "true",
634  "Can use one literal in VOP3"
635>;
636
637def FeatureNoDataDepHazard : SubtargetFeature<"no-data-dep-hazard",
638  "HasNoDataDepHazard",
639  "true",
640  "Does not need SW waitstates"
641>;
642
643class SubtargetFeatureNSAMaxSize <int Value> : SubtargetFeature <
644  "nsa-max-size-"#Value,
645  "NSAMaxSize",
646  !cast<string>(Value),
647  "The maximum non-sequential address size in VGPRs."
648>;
649
650def FeatureNSAMaxSize5 : SubtargetFeatureNSAMaxSize<5>;
651def FeatureNSAMaxSize13 : SubtargetFeatureNSAMaxSize<13>;
652
653//===------------------------------------------------------------===//
654// Subtarget Features (options and debugging)
655//===------------------------------------------------------------===//
656
657class FeatureMaxPrivateElementSize<int size> : SubtargetFeature<
658  "max-private-element-size-"#size,
659  "MaxPrivateElementSize",
660  !cast<string>(size),
661  "Maximum private access size may be "#size
662>;
663
664def FeatureMaxPrivateElementSize4 : FeatureMaxPrivateElementSize<4>;
665def FeatureMaxPrivateElementSize8 : FeatureMaxPrivateElementSize<8>;
666def FeatureMaxPrivateElementSize16 : FeatureMaxPrivateElementSize<16>;
667
668def FeatureDumpCode : SubtargetFeature <"DumpCode",
669  "DumpCode",
670  "true",
671  "Dump MachineInstrs in the CodeEmitter"
672>;
673
674def FeatureDumpCodeLower : SubtargetFeature <"dumpcode",
675  "DumpCode",
676  "true",
677  "Dump MachineInstrs in the CodeEmitter"
678>;
679
680// XXX - This should probably be removed once enabled by default
681def FeatureEnableLoadStoreOpt : SubtargetFeature <"load-store-opt",
682  "EnableLoadStoreOpt",
683  "true",
684  "Enable SI load/store optimizer pass"
685>;
686
687// Performance debugging feature. Allow using DS instruction immediate
688// offsets even if the base pointer can't be proven to be base. On SI,
689// base pointer values that won't give the same result as a 16-bit add
690// are not safe to fold, but this will override the conservative test
691// for the base pointer.
692def FeatureEnableUnsafeDSOffsetFolding : SubtargetFeature <
693  "unsafe-ds-offset-folding",
694  "EnableUnsafeDSOffsetFolding",
695  "true",
696  "Force using DS instruction immediate offsets on SI"
697>;
698
699def FeatureEnableSIScheduler : SubtargetFeature<"si-scheduler",
700  "EnableSIScheduler",
701  "true",
702  "Enable SI Machine Scheduler"
703>;
704
705def FeatureEnableDS128 : SubtargetFeature<"enable-ds128",
706  "EnableDS128",
707  "true",
708  "Use ds_{read|write}_b128"
709>;
710
711// Sparse texture support requires that all result registers are zeroed when
712// PRTStrictNull is set to true. This feature is turned on for all architectures
713// but is enabled as a feature in case there are situations where PRTStrictNull
714// is disabled by the driver.
715def FeatureEnablePRTStrictNull : SubtargetFeature<"enable-prt-strict-null",
716  "EnablePRTStrictNull",
717  "true",
718  "Enable zeroing of result registers for sparse texture fetches"
719>;
720
721// Unless +-flat-for-global is specified, turn on FlatForGlobal for
722// all OS-es on VI and newer hardware to avoid assertion failures due
723// to missing ADDR64 variants of MUBUF instructions.
724// FIXME: moveToVALU should be able to handle converting addr64 MUBUF
725// instructions.
726
727def FeatureFlatForGlobal : SubtargetFeature<"flat-for-global",
728  "FlatForGlobal",
729  "true",
730  "Force to generate flat instruction for global"
731>;
732
733def FeatureAutoWaitcntBeforeBarrier : SubtargetFeature <
734  "auto-waitcnt-before-barrier",
735  "AutoWaitcntBeforeBarrier",
736  "true",
737  "Hardware automatically inserts waitcnt before barrier"
738>;
739
740def FeatureTrigReducedRange : SubtargetFeature<"trig-reduced-range",
741  "HasTrigReducedRange",
742  "true",
743  "Requires use of fract on arguments to trig instructions"
744>;
745
746// Alignment enforcement is controlled by a configuration register:
747// SH_MEM_CONFIG.alignment_mode
748def FeatureUnalignedAccessMode : SubtargetFeature<"unaligned-access-mode",
749  "UnalignedAccessMode",
750  "true",
751  "Enable unaligned global, local and region loads and stores if the hardware"
752  " supports it"
753>;
754
755def FeaturePackedTID : SubtargetFeature<"packed-tid",
756  "HasPackedTID",
757  "true",
758  "Workitem IDs are packed into v0 at kernel launch"
759>;
760
761def FeatureArchitectedFlatScratch : SubtargetFeature<"architected-flat-scratch",
762  "HasArchitectedFlatScratch",
763  "true",
764  "Flat Scratch register is a readonly SPI initialized architected register"
765>;
766
767// Dummy feature used to disable assembler instructions.
768def FeatureDisable : SubtargetFeature<"",
769  "FeatureDisable","true",
770  "Dummy feature to disable assembler instructions"
771>;
772
773class GCNSubtargetFeatureGeneration <string Value,
774                                     string FeatureName,
775                                     list<SubtargetFeature> Implies> :
776        SubtargetFeatureGeneration <Value, FeatureName, "GCNSubtarget", Implies>;
777
778def FeatureSouthernIslands : GCNSubtargetFeatureGeneration<"SOUTHERN_ISLANDS",
779    "southern-islands",
780  [FeatureFP64, FeatureLocalMemorySize32768, FeatureMIMG_R128,
781  FeatureWavefrontSize64, FeatureSMemTimeInst, FeatureMadMacF32Insts,
782  FeatureDsSrc2Insts, FeatureLDSBankCount32, FeatureMovrel,
783  FeatureTrigReducedRange, FeatureExtendedImageInsts, FeatureImageInsts
784  ]
785>;
786
787def FeatureSeaIslands : GCNSubtargetFeatureGeneration<"SEA_ISLANDS",
788    "sea-islands",
789  [FeatureFP64, FeatureLocalMemorySize65536, FeatureMIMG_R128,
790  FeatureWavefrontSize64, FeatureFlatAddressSpace,
791  FeatureCIInsts, FeatureMovrel, FeatureTrigReducedRange,
792  FeatureGFX7GFX8GFX9Insts, FeatureSMemTimeInst, FeatureMadMacF32Insts,
793  FeatureDsSrc2Insts, FeatureExtendedImageInsts, FeatureUnalignedBufferAccess,
794  FeatureImageInsts
795  ]
796>;
797
798def FeatureVolcanicIslands : GCNSubtargetFeatureGeneration<"VOLCANIC_ISLANDS",
799  "volcanic-islands",
800  [FeatureFP64, FeatureLocalMemorySize65536, FeatureMIMG_R128,
801   FeatureWavefrontSize64, FeatureFlatAddressSpace,
802   FeatureGCN3Encoding, FeatureCIInsts, Feature16BitInsts,
803   FeatureSMemRealTime, FeatureVGPRIndexMode, FeatureMovrel,
804   FeatureScalarStores, FeatureInv2PiInlineImm,
805   FeatureSDWA, FeatureSDWAOutModsVOPC, FeatureSDWAMac, FeatureDPP,
806   FeatureIntClamp, FeatureTrigReducedRange, FeatureGFX8Insts,
807   FeatureGFX7GFX8GFX9Insts, FeatureSMemTimeInst, FeatureMadMacF32Insts,
808   FeatureDsSrc2Insts, FeatureExtendedImageInsts, FeatureFastDenormalF32,
809   FeatureUnalignedBufferAccess, FeatureImageInsts
810  ]
811>;
812
813def FeatureGFX9 : GCNSubtargetFeatureGeneration<"GFX9",
814  "gfx9",
815  [FeatureFP64, FeatureLocalMemorySize65536,
816   FeatureWavefrontSize64, FeatureFlatAddressSpace,
817   FeatureGCN3Encoding, FeatureCIInsts, Feature16BitInsts,
818   FeatureSMemRealTime, FeatureScalarStores, FeatureInv2PiInlineImm,
819   FeatureApertureRegs, FeatureGFX9Insts, FeatureVOP3P, FeatureVGPRIndexMode,
820   FeatureFastFMAF32, FeatureDPP, FeatureIntClamp,
821   FeatureSDWA, FeatureSDWAOmod, FeatureSDWAScalar, FeatureSDWASdst,
822   FeatureFlatInstOffsets, FeatureFlatGlobalInsts, FeatureFlatScratchInsts,
823   FeatureAddNoCarryInsts, FeatureGFX8Insts, FeatureGFX7GFX8GFX9Insts,
824   FeatureScalarFlatScratchInsts, FeatureScalarAtomics, FeatureR128A16,
825   FeatureSMemTimeInst, FeatureFastDenormalF32, FeatureSupportsXNACK,
826   FeatureUnalignedBufferAccess, FeatureUnalignedDSAccess,
827   FeatureNegativeScratchOffsetBug
828  ]
829>;
830
831def FeatureGFX10 : GCNSubtargetFeatureGeneration<"GFX10",
832  "gfx10",
833  [FeatureFP64, FeatureLocalMemorySize65536, FeatureMIMG_R128,
834   FeatureFlatAddressSpace,
835   FeatureCIInsts, Feature16BitInsts,
836   FeatureSMemRealTime, FeatureInv2PiInlineImm,
837   FeatureApertureRegs, FeatureGFX9Insts, FeatureGFX10Insts, FeatureVOP3P,
838   FeatureMovrel, FeatureFastFMAF32, FeatureDPP, FeatureIntClamp,
839   FeatureSDWA, FeatureSDWAOmod, FeatureSDWAScalar, FeatureSDWASdst,
840   FeatureFlatInstOffsets, FeatureFlatGlobalInsts, FeatureFlatScratchInsts,
841   FeatureAddNoCarryInsts, FeatureFmaMixInsts, FeatureGFX8Insts,
842   FeatureNoSdstCMPX, FeatureVscnt,
843   FeatureVOP3Literal, FeatureDPP8, FeatureExtendedImageInsts,
844   FeatureNoDataDepHazard, FeaturePkFmacF16Inst,
845   FeatureGFX10A16, FeatureSMemTimeInst, FeatureFastDenormalF32, FeatureG16,
846   FeatureUnalignedBufferAccess, FeatureUnalignedDSAccess, FeatureImageInsts
847  ]
848>;
849
850class FeatureSet<list<SubtargetFeature> Features_> {
851  list<SubtargetFeature> Features = Features_;
852}
853
854def FeatureISAVersion6_0_0 : FeatureSet<[FeatureSouthernIslands,
855   FeatureFastFMAF32,
856   HalfRate64Ops,
857   FeatureLDSBankCount32]>;
858
859def FeatureISAVersion6_0_1 : FeatureSet<
860  [FeatureSouthernIslands,
861   FeatureLDSBankCount32]>;
862
863def FeatureISAVersion6_0_2 : FeatureSet<
864  [FeatureSouthernIslands,
865   FeatureLDSBankCount32]>;
866
867def FeatureISAVersion7_0_0 : FeatureSet<
868  [FeatureSeaIslands,
869   FeatureLDSBankCount32]>;
870
871def FeatureISAVersion7_0_1 : FeatureSet<
872  [FeatureSeaIslands,
873   HalfRate64Ops,
874   FeatureLDSBankCount32,
875   FeatureFastFMAF32]>;
876
877def FeatureISAVersion7_0_2 : FeatureSet<
878  [FeatureSeaIslands,
879   FeatureLDSBankCount16,
880   FeatureFastFMAF32]>;
881
882def FeatureISAVersion7_0_3 : FeatureSet<
883  [FeatureSeaIslands,
884   FeatureLDSBankCount16]>;
885
886def FeatureISAVersion7_0_4 : FeatureSet<
887  [FeatureSeaIslands,
888   FeatureLDSBankCount32]>;
889
890def FeatureISAVersion7_0_5 : FeatureSet<
891  [FeatureSeaIslands,
892   FeatureLDSBankCount16]>;
893
894def FeatureISAVersion8_0_1 : FeatureSet<
895  [FeatureVolcanicIslands,
896   FeatureFastFMAF32,
897   HalfRate64Ops,
898   FeatureLDSBankCount32,
899   FeatureSupportsXNACK,
900   FeatureUnpackedD16VMem]>;
901
902def FeatureISAVersion8_0_2 : FeatureSet<
903  [FeatureVolcanicIslands,
904   FeatureLDSBankCount32,
905   FeatureSGPRInitBug,
906   FeatureUnpackedD16VMem]>;
907
908def FeatureISAVersion8_0_3 : FeatureSet<
909  [FeatureVolcanicIslands,
910   FeatureLDSBankCount32,
911   FeatureUnpackedD16VMem]>;
912
913def FeatureISAVersion8_0_5 : FeatureSet<
914  [FeatureVolcanicIslands,
915   FeatureLDSBankCount32,
916   FeatureSGPRInitBug,
917   FeatureUnpackedD16VMem]>;
918
919def FeatureISAVersion8_1_0 : FeatureSet<
920  [FeatureVolcanicIslands,
921   FeatureLDSBankCount16,
922   FeatureSupportsXNACK,
923   FeatureImageStoreD16Bug,
924   FeatureImageGather4D16Bug]>;
925
926def FeatureISAVersion9_0_0 : FeatureSet<
927  [FeatureGFX9,
928   FeatureMadMixInsts,
929   FeatureLDSBankCount32,
930   FeatureDsSrc2Insts,
931   FeatureExtendedImageInsts,
932   FeatureImageInsts,
933   FeatureMadMacF32Insts,
934   FeatureImageGather4D16Bug]>;
935
936def FeatureISAVersion9_0_2 : FeatureSet<
937  [FeatureGFX9,
938   FeatureMadMixInsts,
939   FeatureLDSBankCount32,
940   FeatureDsSrc2Insts,
941   FeatureExtendedImageInsts,
942   FeatureImageInsts,
943   FeatureMadMacF32Insts,
944   FeatureImageGather4D16Bug]>;
945
946def FeatureISAVersion9_0_4 : FeatureSet<
947  [FeatureGFX9,
948   FeatureLDSBankCount32,
949   FeatureDsSrc2Insts,
950   FeatureExtendedImageInsts,
951   FeatureImageInsts,
952   FeatureMadMacF32Insts,
953   FeatureFmaMixInsts,
954   FeatureImageGather4D16Bug]>;
955
956def FeatureISAVersion9_0_6 : FeatureSet<
957  [FeatureGFX9,
958   HalfRate64Ops,
959   FeatureFmaMixInsts,
960   FeatureLDSBankCount32,
961   FeatureDsSrc2Insts,
962   FeatureExtendedImageInsts,
963   FeatureImageInsts,
964   FeatureMadMacF32Insts,
965   FeatureDLInsts,
966   FeatureDot1Insts,
967   FeatureDot2Insts,
968   FeatureDot7Insts,
969   FeatureSupportsSRAMECC,
970   FeatureImageGather4D16Bug]>;
971
972def FeatureISAVersion9_0_8 : FeatureSet<
973  [FeatureGFX9,
974   HalfRate64Ops,
975   FeatureFmaMixInsts,
976   FeatureLDSBankCount32,
977   FeatureDsSrc2Insts,
978   FeatureExtendedImageInsts,
979   FeatureImageInsts,
980   FeatureMadMacF32Insts,
981   FeatureDLInsts,
982   FeatureDot1Insts,
983   FeatureDot2Insts,
984   FeatureDot3Insts,
985   FeatureDot4Insts,
986   FeatureDot5Insts,
987   FeatureDot6Insts,
988   FeatureDot7Insts,
989   FeatureMAIInsts,
990   FeaturePkFmacF16Inst,
991   FeatureAtomicFaddInsts,
992   FeatureSupportsSRAMECC,
993   FeatureMFMAInlineLiteralBug,
994   FeatureImageGather4D16Bug]>;
995
996def FeatureISAVersion9_0_9 : FeatureSet<
997  [FeatureGFX9,
998   FeatureMadMixInsts,
999   FeatureLDSBankCount32,
1000   FeatureDsSrc2Insts,
1001   FeatureExtendedImageInsts,
1002   FeatureImageInsts,
1003   FeatureMadMacF32Insts,
1004   FeatureImageGather4D16Bug]>;
1005
1006def FeatureISAVersion9_0_A : FeatureSet<
1007  [FeatureGFX9,
1008   FeatureGFX90AInsts,
1009   FeatureFmaMixInsts,
1010   FeatureLDSBankCount32,
1011   FeatureDLInsts,
1012   FeatureDot1Insts,
1013   FeatureDot2Insts,
1014   FeatureDot3Insts,
1015   FeatureDot4Insts,
1016   FeatureDot5Insts,
1017   FeatureDot6Insts,
1018   FeatureDot7Insts,
1019   Feature64BitDPP,
1020   FeaturePackedFP32Ops,
1021   FeatureMAIInsts,
1022   FeaturePkFmacF16Inst,
1023   FeatureAtomicFaddInsts,
1024   FeatureImageInsts,
1025   FeatureMadMacF32Insts,
1026   FeatureSupportsSRAMECC,
1027   FeaturePackedTID,
1028   FullRate64Ops]>;
1029
1030def FeatureISAVersion9_0_C : FeatureSet<
1031  [FeatureGFX9,
1032   FeatureMadMixInsts,
1033   FeatureLDSBankCount32,
1034   FeatureDsSrc2Insts,
1035   FeatureExtendedImageInsts,
1036   FeatureImageInsts,
1037   FeatureMadMacF32Insts,
1038   FeatureImageGather4D16Bug]>;
1039
1040def FeatureISAVersion9_4_0 : FeatureSet<
1041  [FeatureGFX9,
1042   FeatureGFX90AInsts,
1043   FeatureGFX940Insts,
1044   FeatureFmaMixInsts,
1045   FeatureLDSBankCount32,
1046   FeatureDLInsts,
1047   FeatureDot1Insts,
1048   FeatureDot2Insts,
1049   FeatureDot3Insts,
1050   FeatureDot4Insts,
1051   FeatureDot5Insts,
1052   FeatureDot6Insts,
1053   FeatureDot7Insts,
1054   Feature64BitDPP,
1055   FeaturePackedFP32Ops,
1056   FeatureMAIInsts,
1057   FeaturePkFmacF16Inst,
1058   FeatureAtomicFaddInsts,
1059   FeatureSupportsSRAMECC,
1060   FeaturePackedTID,
1061   FeatureArchitectedFlatScratch,
1062   FullRate64Ops]>;
1063
1064// TODO: Organize more features into groups.
1065def FeatureGroup {
1066  // Bugs present on gfx10.1.
1067  list<SubtargetFeature> GFX10_1_Bugs = [
1068    FeatureVcmpxPermlaneHazard,
1069    FeatureVMEMtoScalarWriteHazard,
1070    FeatureSMEMtoVectorWriteHazard,
1071    FeatureInstFwdPrefetchBug,
1072    FeatureVcmpxExecWARHazard,
1073    FeatureLdsBranchVmemWARHazard,
1074    FeatureNSAtoVMEMBug,
1075    FeatureNSAClauseBug,
1076    FeatureOffset3fBug,
1077    FeatureFlatSegmentOffsetBug,
1078    FeatureNegativeUnalignedScratchOffsetBug
1079   ];
1080}
1081
1082def FeatureISAVersion10_1_0 : FeatureSet<
1083  !listconcat(FeatureGroup.GFX10_1_Bugs,
1084    [FeatureGFX10,
1085     FeatureLDSBankCount32,
1086     FeatureDLInsts,
1087     FeatureNSAEncoding,
1088     FeatureNSAMaxSize5,
1089     FeatureWavefrontSize32,
1090     FeatureScalarStores,
1091     FeatureScalarAtomics,
1092     FeatureScalarFlatScratchInsts,
1093     FeatureGetWaveIdInst,
1094     FeatureMadMacF32Insts,
1095     FeatureDsSrc2Insts,
1096     FeatureLdsMisalignedBug,
1097     FeatureSupportsXNACK])>;
1098
1099def FeatureISAVersion10_1_1 : FeatureSet<
1100  !listconcat(FeatureGroup.GFX10_1_Bugs,
1101    [FeatureGFX10,
1102     FeatureLDSBankCount32,
1103     FeatureDLInsts,
1104     FeatureDot1Insts,
1105     FeatureDot2Insts,
1106     FeatureDot5Insts,
1107     FeatureDot6Insts,
1108     FeatureDot7Insts,
1109     FeatureNSAEncoding,
1110     FeatureNSAMaxSize5,
1111     FeatureWavefrontSize32,
1112     FeatureScalarStores,
1113     FeatureScalarAtomics,
1114     FeatureScalarFlatScratchInsts,
1115     FeatureGetWaveIdInst,
1116     FeatureMadMacF32Insts,
1117     FeatureDsSrc2Insts,
1118     FeatureLdsMisalignedBug,
1119     FeatureSupportsXNACK])>;
1120
1121def FeatureISAVersion10_1_2 : FeatureSet<
1122  !listconcat(FeatureGroup.GFX10_1_Bugs,
1123    [FeatureGFX10,
1124     FeatureLDSBankCount32,
1125     FeatureDLInsts,
1126     FeatureDot1Insts,
1127     FeatureDot2Insts,
1128     FeatureDot5Insts,
1129     FeatureDot6Insts,
1130     FeatureDot7Insts,
1131     FeatureNSAEncoding,
1132     FeatureNSAMaxSize5,
1133     FeatureWavefrontSize32,
1134     FeatureScalarStores,
1135     FeatureScalarAtomics,
1136     FeatureScalarFlatScratchInsts,
1137     FeatureGetWaveIdInst,
1138     FeatureMadMacF32Insts,
1139     FeatureDsSrc2Insts,
1140     FeatureLdsMisalignedBug,
1141     FeatureSupportsXNACK])>;
1142
1143def FeatureISAVersion10_1_3 : FeatureSet<
1144  !listconcat(FeatureGroup.GFX10_1_Bugs,
1145    [FeatureGFX10,
1146     FeatureGFX10_AEncoding,
1147     FeatureLDSBankCount32,
1148     FeatureDLInsts,
1149     FeatureNSAEncoding,
1150     FeatureNSAMaxSize5,
1151     FeatureWavefrontSize32,
1152     FeatureScalarStores,
1153     FeatureScalarAtomics,
1154     FeatureScalarFlatScratchInsts,
1155     FeatureGetWaveIdInst,
1156     FeatureMadMacF32Insts,
1157     FeatureDsSrc2Insts,
1158     FeatureLdsMisalignedBug,
1159     FeatureSupportsXNACK])>;
1160
1161def FeatureISAVersion10_3_0 : FeatureSet<
1162  [FeatureGFX10,
1163   FeatureGFX10_AEncoding,
1164   FeatureGFX10_BEncoding,
1165   FeatureGFX10_3Insts,
1166   FeatureLDSBankCount32,
1167   FeatureDLInsts,
1168   FeatureDot1Insts,
1169   FeatureDot2Insts,
1170   FeatureDot5Insts,
1171   FeatureDot6Insts,
1172   FeatureDot7Insts,
1173   FeatureNSAEncoding,
1174   FeatureNSAMaxSize13,
1175   FeatureWavefrontSize32,
1176   FeatureShaderCyclesRegister]>;
1177
1178//===----------------------------------------------------------------------===//
1179
1180def AMDGPUInstrInfo : InstrInfo {
1181  let guessInstructionProperties = 1;
1182  let noNamedPositionallyEncodedOperands = 1;
1183}
1184
1185def AMDGPUAsmParser : AsmParser {
1186  // Some of the R600 registers have the same name, so this crashes.
1187  // For example T0_XYZW and T0_XY both have the asm name T0.
1188  let ShouldEmitMatchRegisterName = 0;
1189}
1190
1191def AMDGPUAsmWriter : AsmWriter {
1192  int PassSubtarget = 1;
1193}
1194
1195def AMDGPUAsmVariants {
1196  string Default = "Default";
1197  int Default_ID = 0;
1198  string VOP3 = "VOP3";
1199  int VOP3_ID = 1;
1200  string SDWA = "SDWA";
1201  int SDWA_ID = 2;
1202  string SDWA9 = "SDWA9";
1203  int SDWA9_ID = 3;
1204  string DPP = "DPP";
1205  int DPP_ID = 4;
1206  string Disable = "Disable";
1207  int Disable_ID = 5;
1208}
1209
1210def DefaultAMDGPUAsmParserVariant : AsmParserVariant {
1211  let Variant = AMDGPUAsmVariants.Default_ID;
1212  let Name = AMDGPUAsmVariants.Default;
1213}
1214
1215def VOP3AsmParserVariant : AsmParserVariant {
1216  let Variant = AMDGPUAsmVariants.VOP3_ID;
1217  let Name = AMDGPUAsmVariants.VOP3;
1218}
1219
1220def SDWAAsmParserVariant : AsmParserVariant {
1221  let Variant = AMDGPUAsmVariants.SDWA_ID;
1222  let Name = AMDGPUAsmVariants.SDWA;
1223}
1224
1225def SDWA9AsmParserVariant : AsmParserVariant {
1226  let Variant = AMDGPUAsmVariants.SDWA9_ID;
1227  let Name = AMDGPUAsmVariants.SDWA9;
1228}
1229
1230
1231def DPPAsmParserVariant : AsmParserVariant {
1232  let Variant = AMDGPUAsmVariants.DPP_ID;
1233  let Name = AMDGPUAsmVariants.DPP;
1234}
1235
1236def AMDGPU : Target {
1237  // Pull in Instruction Info:
1238  let InstructionSet = AMDGPUInstrInfo;
1239  let AssemblyParsers = [AMDGPUAsmParser];
1240  let AssemblyParserVariants = [DefaultAMDGPUAsmParserVariant,
1241                                VOP3AsmParserVariant,
1242                                SDWAAsmParserVariant,
1243                                SDWA9AsmParserVariant,
1244                                DPPAsmParserVariant];
1245  let AssemblyWriters = [AMDGPUAsmWriter];
1246  let AllowRegisterRenaming = 1;
1247}
1248
1249// Dummy Instruction itineraries for pseudo instructions
1250def ALU_NULL : FuncUnit;
1251def NullALU : InstrItinClass;
1252
1253//===----------------------------------------------------------------------===//
1254// Predicate helper class
1255//===----------------------------------------------------------------------===//
1256
1257def isGFX6 :
1258  Predicate<"Subtarget->getGeneration() == AMDGPUSubtarget::SOUTHERN_ISLANDS">,
1259  AssemblerPredicate<(all_of FeatureSouthernIslands)>;
1260
1261def isGFX6GFX7 :
1262  Predicate<"Subtarget->getGeneration() == AMDGPUSubtarget::SOUTHERN_ISLANDS ||"
1263            "Subtarget->getGeneration() == AMDGPUSubtarget::SEA_ISLANDS">,
1264  AssemblerPredicate<(all_of (not FeatureGCN3Encoding), (not FeatureGFX10Insts))>;
1265
1266def isGFX6GFX7GFX10 :
1267  Predicate<"Subtarget->getGeneration() == AMDGPUSubtarget::SOUTHERN_ISLANDS ||"
1268            "Subtarget->getGeneration() == AMDGPUSubtarget::SEA_ISLANDS ||"
1269            "Subtarget->getGeneration() == AMDGPUSubtarget::GFX10">,
1270  AssemblerPredicate<(all_of (not FeatureGCN3Encoding))>;
1271
1272def isGFX7Only :
1273  Predicate<"Subtarget->getGeneration() == AMDGPUSubtarget::SEA_ISLANDS">,
1274  AssemblerPredicate<(all_of (not FeatureGCN3Encoding), FeatureCIInsts, (not FeatureGFX10Insts))>;
1275
1276def isGFX7GFX10 :
1277  Predicate<"Subtarget->getGeneration() == AMDGPUSubtarget::SEA_ISLANDS ||"
1278            "Subtarget->getGeneration() == AMDGPUSubtarget::GFX10">,
1279  AssemblerPredicate<(all_of (not FeatureGCN3Encoding), FeatureCIInsts)>;
1280
1281def isGFX7GFX8GFX9 :
1282  Predicate<"Subtarget->getGeneration() == AMDGPUSubtarget::SEA_ISLANDS ||"
1283            "Subtarget->getGeneration() == AMDGPUSubtarget::VOLCANIC_ISLANDS ||"
1284            "Subtarget->getGeneration() == AMDGPUSubtarget::GFX9">,
1285  AssemblerPredicate<(all_of FeatureGFX7GFX8GFX9Insts)>;
1286
1287def isGFX6GFX7GFX8GFX9 :
1288  Predicate<"Subtarget->getGeneration() == AMDGPUSubtarget::SOUTHERN_ISLANDS ||"
1289            "Subtarget->getGeneration() == AMDGPUSubtarget::SEA_ISLANDS ||"
1290            "Subtarget->getGeneration() == AMDGPUSubtarget::VOLCANIC_ISLANDS ||"
1291            "Subtarget->getGeneration() == AMDGPUSubtarget::GFX9">,
1292  AssemblerPredicate<(all_of (not FeatureGFX10Insts))>;
1293
1294def isGFX6GFX7GFX8GFX9NotGFX90A :
1295  Predicate<"!Subtarget->hasGFX90AInsts() &&"
1296            "(Subtarget->getGeneration() == AMDGPUSubtarget::SOUTHERN_ISLANDS ||"
1297            " Subtarget->getGeneration() == AMDGPUSubtarget::SEA_ISLANDS ||"
1298            " Subtarget->getGeneration() == AMDGPUSubtarget::VOLCANIC_ISLANDS ||"
1299            " Subtarget->getGeneration() == AMDGPUSubtarget::GFX9)">,
1300  AssemblerPredicate<(all_of (not FeatureGFX10Insts), (not FeatureGFX90AInsts))>;
1301
1302def isGFX7Plus :
1303  Predicate<"Subtarget->getGeneration() >= AMDGPUSubtarget::SEA_ISLANDS">,
1304  AssemblerPredicate<(all_of FeatureCIInsts)>;
1305
1306def isGFX8Plus :
1307  Predicate<"Subtarget->getGeneration() >= AMDGPUSubtarget::VOLCANIC_ISLANDS">,
1308  AssemblerPredicate<(all_of FeatureGFX8Insts)>;
1309
1310def isGFX8Only : Predicate<"Subtarget->getGeneration() =="
1311                           "AMDGPUSubtarget::VOLCANIC_ISLANDS">,
1312  AssemblerPredicate <(all_of FeatureVolcanicIslands)>;
1313
1314def isGFX9Plus :
1315  Predicate<"Subtarget->getGeneration() >= AMDGPUSubtarget::GFX9">,
1316  AssemblerPredicate<(all_of FeatureGFX9Insts)>;
1317
1318def isGFX9Only : Predicate <
1319  "Subtarget->getGeneration() == AMDGPUSubtarget::GFX9">,
1320  AssemblerPredicate<(all_of FeatureGCN3Encoding, FeatureGFX9Insts)>;
1321
1322def isGCN3ExcludingGFX90A :
1323  Predicate<"Subtarget->isGCN3Encoding() && !Subtarget->hasGFX90AInsts()">,
1324  AssemblerPredicate<(all_of FeatureGCN3Encoding, (not FeatureGFX90AInsts))>;
1325
1326def isGFX90APlus :
1327  Predicate<"Subtarget->hasGFX90AInsts()">,
1328  AssemblerPredicate<(all_of FeatureGFX90AInsts)>;
1329
1330def isNotGFX90APlus :
1331  Predicate<"!Subtarget->hasGFX90AInsts()">,
1332  AssemblerPredicate<(all_of (not FeatureGFX90AInsts))>;
1333
1334def isGFX8GFX9NotGFX90A :
1335  Predicate<"!Subtarget->hasGFX90AInsts() &&"
1336            "(Subtarget->getGeneration() == AMDGPUSubtarget::VOLCANIC_ISLANDS ||"
1337            " Subtarget->getGeneration() == AMDGPUSubtarget::GFX9)">,
1338  AssemblerPredicate<(all_of FeatureGFX8Insts, FeatureGCN3Encoding, (not FeatureGFX90AInsts))>;
1339
1340def isGFX90AOnly :
1341  Predicate<"Subtarget->hasGFX90AInsts() && !Subtarget->hasGFX940Insts()">,
1342  AssemblerPredicate<(all_of FeatureGFX90AInsts, (not FeatureGFX940Insts))>;
1343
1344def isGFX908orGFX90A :
1345  Predicate<"Subtarget->hasMAIInsts() && !Subtarget->hasGFX940Insts()">,
1346  AssemblerPredicate<(all_of FeatureMAIInsts, (not FeatureGFX940Insts))>;
1347
1348def isGFX940Plus :
1349  Predicate<"Subtarget->hasGFX940Insts()">,
1350  AssemblerPredicate<(all_of FeatureGFX940Insts)>;
1351
1352def isGFX8GFX9NotGFX940 :
1353  Predicate<"!Subtarget->hasGFX940Insts() &&"
1354            "(Subtarget->getGeneration() == AMDGPUSubtarget::VOLCANIC_ISLANDS ||"
1355            " Subtarget->getGeneration() == AMDGPUSubtarget::GFX9)">,
1356  AssemblerPredicate<(all_of FeatureGFX8Insts, FeatureGCN3Encoding, (not FeatureGFX940Insts))>;
1357
1358def isGFX8GFX9 :
1359  Predicate<"Subtarget->getGeneration() == AMDGPUSubtarget::VOLCANIC_ISLANDS ||"
1360            "Subtarget->getGeneration() == AMDGPUSubtarget::GFX9">,
1361  AssemblerPredicate<(all_of FeatureGFX8Insts, FeatureGCN3Encoding)>;
1362
1363def isGFX10Plus :
1364  Predicate<"Subtarget->getGeneration() >= AMDGPUSubtarget::GFX10">,
1365  AssemblerPredicate<(all_of FeatureGFX10Insts)>;
1366
1367def isGFX10Before1030 :
1368  Predicate<"Subtarget->getGeneration() == AMDGPUSubtarget::GFX10 &&"
1369            "!Subtarget->hasGFX10_3Insts()">,
1370  AssemblerPredicate<(all_of FeatureGFX10Insts,(not FeatureGFX10_3Insts))>;
1371
1372def HasFlatAddressSpace : Predicate<"Subtarget->hasFlatAddressSpace()">,
1373  AssemblerPredicate<(all_of FeatureFlatAddressSpace)>;
1374
1375def HasFlatGlobalInsts : Predicate<"Subtarget->hasFlatGlobalInsts()">,
1376  AssemblerPredicate<(all_of FeatureFlatGlobalInsts)>;
1377def HasFlatScratchInsts : Predicate<"Subtarget->hasFlatScratchInsts()">,
1378  AssemblerPredicate<(all_of FeatureFlatScratchInsts)>;
1379def HasScalarFlatScratchInsts : Predicate<"Subtarget->hasScalarFlatScratchInsts()">,
1380  AssemblerPredicate<(all_of FeatureScalarFlatScratchInsts)>;
1381def HasD16LoadStore : Predicate<"Subtarget->hasD16LoadStore()">,
1382  AssemblerPredicate<(all_of FeatureGFX9Insts)>;
1383
1384def HasFlatScratchSTMode : Predicate<"Subtarget->hasFlatScratchSTMode()">,
1385  AssemblerPredicate<(any_of FeatureGFX10_3Insts, FeatureGFX940Insts)>;
1386
1387def HasGFX10_AEncoding : Predicate<"Subtarget->hasGFX10_AEncoding()">,
1388  AssemblerPredicate<(all_of FeatureGFX10_AEncoding)>;
1389
1390def HasGFX10_BEncoding : Predicate<"Subtarget->hasGFX10_BEncoding()">,
1391  AssemblerPredicate<(all_of FeatureGFX10_BEncoding)>;
1392
1393def HasUnpackedD16VMem : Predicate<"Subtarget->hasUnpackedD16VMem()">,
1394  AssemblerPredicate<(all_of FeatureUnpackedD16VMem)>;
1395def HasPackedD16VMem : Predicate<"!Subtarget->hasUnpackedD16VMem()">,
1396  AssemblerPredicate<(all_of (not FeatureUnpackedD16VMem))>;
1397
1398def D16PreservesUnusedBits :
1399  Predicate<"Subtarget->d16PreservesUnusedBits()">,
1400  AssemblerPredicate<(all_of FeatureGFX9Insts, (not FeatureSRAMECC))>;
1401
1402def LDSRequiresM0Init : Predicate<"Subtarget->ldsRequiresM0Init()">;
1403def NotLDSRequiresM0Init : Predicate<"!Subtarget->ldsRequiresM0Init()">;
1404
1405def HasDSAddTid : Predicate<"Subtarget->getGeneration() >= AMDGPUSubtarget::GFX9">,
1406  AssemblerPredicate<(all_of FeatureGFX9Insts)>;
1407
1408def HasLDSFPAtomicAdd : Predicate<"Subtarget->hasLDSFPAtomicAdd()">,
1409  AssemblerPredicate<(all_of FeatureGFX8Insts)>;
1410
1411def HasAddNoCarryInsts : Predicate<"Subtarget->hasAddNoCarry()">,
1412  AssemblerPredicate<(all_of FeatureAddNoCarryInsts)>;
1413
1414def NotHasAddNoCarryInsts : Predicate<"!Subtarget->hasAddNoCarry()">;
1415
1416def Has16BitInsts : Predicate<"Subtarget->has16BitInsts()">,
1417  AssemblerPredicate<(all_of Feature16BitInsts)>;
1418def HasVOP3PInsts : Predicate<"Subtarget->hasVOP3PInsts()">,
1419  AssemblerPredicate<(all_of FeatureVOP3P)>;
1420
1421def HasMinMaxDenormModes : Predicate<"Subtarget->supportsMinMaxDenormModes()">;
1422def NotHasMinMaxDenormModes : Predicate<"!Subtarget->supportsMinMaxDenormModes()">;
1423
1424def HasSDWA : Predicate<"Subtarget->hasSDWA()">,
1425  AssemblerPredicate<(all_of FeatureSDWA, FeatureVolcanicIslands)>;
1426
1427def HasSDWA9 :
1428  Predicate<"Subtarget->hasSDWA()">,
1429  AssemblerPredicate<(all_of FeatureGCN3Encoding, FeatureGFX9Insts,FeatureSDWA)>;
1430
1431def HasSDWA10 :
1432  Predicate<"Subtarget->hasSDWA()">,
1433  AssemblerPredicate<(all_of (not FeatureGCN3Encoding), FeatureGFX10Insts, FeatureSDWA)>;
1434
1435def HasDPP : Predicate<"Subtarget->hasDPP()">,
1436  AssemblerPredicate<(all_of FeatureGCN3Encoding, FeatureDPP)>;
1437
1438def HasDPP8 : Predicate<"Subtarget->hasDPP8()">,
1439  AssemblerPredicate<(all_of (not FeatureGCN3Encoding), FeatureGFX10Insts, FeatureDPP8)>;
1440
1441def Has64BitDPP : Predicate<"Subtarget->has64BitDPP()">,
1442  AssemblerPredicate<(all_of Feature64BitDPP)>;
1443
1444def HasPackedFP32Ops : Predicate<"Subtarget->hasPackedFP32Ops()">,
1445  AssemblerPredicate<(all_of FeaturePackedFP32Ops)>;
1446
1447def HasFmaakFmamkF32Insts :
1448  Predicate<"Subtarget->hasFmaakFmamkF32Insts()">,
1449  AssemblerPredicate<(any_of FeatureGFX10Insts)>;
1450
1451def HasImageInsts : Predicate<"Subtarget->hasImageInsts()">,
1452  AssemblerPredicate<(all_of FeatureImageInsts)>;
1453
1454def HasExtendedImageInsts : Predicate<"Subtarget->hasExtendedImageInsts()">,
1455  AssemblerPredicate<(all_of FeatureExtendedImageInsts)>;
1456
1457def HasR128A16 : Predicate<"Subtarget->hasR128A16()">,
1458  AssemblerPredicate<(all_of FeatureR128A16)>;
1459
1460def HasGFX10A16 : Predicate<"Subtarget->hasGFX10A16()">,
1461  AssemblerPredicate<(all_of FeatureGFX10A16)>;
1462
1463def HasG16 : Predicate<"Subtarget->hasG16()">,
1464  AssemblerPredicate<(all_of FeatureG16)>;
1465
1466def HasDPP16 : Predicate<"Subtarget->hasDPP()">,
1467  AssemblerPredicate<(all_of (not FeatureGCN3Encoding), FeatureGFX10Insts, FeatureDPP)>;
1468
1469def HasIntClamp : Predicate<"Subtarget->hasIntClamp()">,
1470  AssemblerPredicate<(all_of FeatureIntClamp)>;
1471
1472def HasMadMixInsts : Predicate<"Subtarget->hasMadMixInsts()">,
1473  AssemblerPredicate<(all_of FeatureMadMixInsts)>;
1474
1475def HasScalarStores : Predicate<"Subtarget->hasScalarStores()">,
1476  AssemblerPredicate<(all_of FeatureScalarStores)>;
1477
1478def HasScalarAtomics : Predicate<"Subtarget->hasScalarAtomics()">,
1479  AssemblerPredicate<(all_of FeatureScalarAtomics)>;
1480
1481def HasNoSdstCMPX : Predicate<"Subtarget->hasNoSdstCMPX()">,
1482  AssemblerPredicate<(all_of FeatureNoSdstCMPX)>;
1483
1484def HasSdstCMPX : Predicate<"!Subtarget->hasNoSdstCMPX()">,
1485  AssemblerPredicate<(all_of (not FeatureNoSdstCMPX))>;
1486
1487def has16BankLDS : Predicate<"Subtarget->getLDSBankCount() == 16">;
1488def has32BankLDS : Predicate<"Subtarget->getLDSBankCount() == 32">;
1489def HasVGPRIndexMode : Predicate<"Subtarget->hasVGPRIndexMode()">,
1490                      AssemblerPredicate<(all_of FeatureVGPRIndexMode)>;
1491def HasMovrel : Predicate<"Subtarget->hasMovrel()">,
1492                AssemblerPredicate<(all_of FeatureMovrel)>;
1493
1494def HasFmaMixInsts : Predicate<"Subtarget->hasFmaMixInsts()">,
1495  AssemblerPredicate<(all_of FeatureFmaMixInsts)>;
1496
1497def HasDLInsts : Predicate<"Subtarget->hasDLInsts()">,
1498  AssemblerPredicate<(all_of FeatureDLInsts)>;
1499
1500def HasDot1Insts : Predicate<"Subtarget->hasDot1Insts()">,
1501  AssemblerPredicate<(all_of FeatureDot1Insts)>;
1502
1503def HasDot2Insts : Predicate<"Subtarget->hasDot2Insts()">,
1504  AssemblerPredicate<(all_of FeatureDot2Insts)>;
1505
1506def HasDot3Insts : Predicate<"Subtarget->hasDot3Insts()">,
1507  AssemblerPredicate<(all_of FeatureDot3Insts)>;
1508
1509def HasDot4Insts : Predicate<"Subtarget->hasDot4Insts()">,
1510  AssemblerPredicate<(all_of FeatureDot4Insts)>;
1511
1512def HasDot5Insts : Predicate<"Subtarget->hasDot5Insts()">,
1513  AssemblerPredicate<(all_of FeatureDot5Insts)>;
1514
1515def HasDot6Insts : Predicate<"Subtarget->hasDot6Insts()">,
1516  AssemblerPredicate<(all_of FeatureDot6Insts)>;
1517
1518def HasDot7Insts : Predicate<"Subtarget->hasDot7Insts()">,
1519  AssemblerPredicate<(all_of FeatureDot7Insts)>;
1520
1521def HasGetWaveIdInst : Predicate<"Subtarget->hasGetWaveIdInst()">,
1522  AssemblerPredicate<(all_of FeatureGetWaveIdInst)>;
1523
1524def HasMAIInsts : Predicate<"Subtarget->hasMAIInsts()">,
1525  AssemblerPredicate<(all_of FeatureMAIInsts)>;
1526
1527def HasSMemRealTime : Predicate<"Subtarget->hasSMemRealTime()">,
1528  AssemblerPredicate<(all_of FeatureSMemRealTime)>;
1529
1530def HasSMemTimeInst : Predicate<"Subtarget->hasSMemTimeInst()">,
1531  AssemblerPredicate<(all_of FeatureSMemTimeInst)>;
1532
1533def HasShaderCyclesRegister : Predicate<"Subtarget->hasShaderCyclesRegister()">,
1534  AssemblerPredicate<(all_of FeatureShaderCyclesRegister)>;
1535
1536def HasPkFmacF16Inst : Predicate<"Subtarget->hasPkFmacF16Inst()">,
1537  AssemblerPredicate<(all_of FeaturePkFmacF16Inst)>;
1538
1539def HasMadMacF32Insts : Predicate<"Subtarget->hasMadMacF32Insts()">,
1540  AssemblerPredicate<(all_of FeatureMadMacF32Insts)>;
1541
1542def HasFmaLegacy32 : Predicate<"Subtarget->hasGFX10_3Insts()">,
1543  AssemblerPredicate<(any_of FeatureGFX10_3Insts)>;
1544
1545def HasAtomicFaddInsts : Predicate<"Subtarget->hasAtomicFaddInsts()">,
1546  AssemblerPredicate<(all_of FeatureAtomicFaddInsts)>;
1547
1548def HasDsSrc2Insts : Predicate<"!Subtarget->hasDsSrc2Insts()">,
1549  AssemblerPredicate<(all_of FeatureDsSrc2Insts)>;
1550
1551def EnableLateCFGStructurize : Predicate<
1552  "EnableLateStructurizeCFG">;
1553
1554def EnableFlatScratch : Predicate<"Subtarget->enableFlatScratch()">;
1555
1556def DisableFlatScratch : Predicate<"!Subtarget->enableFlatScratch()">;
1557
1558def HasUnalignedAccessMode : Predicate<"Subtarget->hasUnalignedAccessMode()">,
1559  AssemblerPredicate<(all_of FeatureUnalignedAccessMode)>;
1560
1561// Include AMDGPU TD files
1562include "SISchedule.td"
1563include "GCNProcessors.td"
1564include "AMDGPUInstrInfo.td"
1565include "SIRegisterInfo.td"
1566include "AMDGPURegisterBanks.td"
1567include "AMDGPUInstructions.td"
1568include "SIInstrInfo.td"
1569include "AMDGPUCallingConv.td"
1570include "AMDGPUSearchableTables.td"
1571