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 FeatureGFX11Insts : SubtargetFeature<"gfx11-insts",
329  "GFX11Insts",
330  "true",
331  "Additional instructions for GFX11+"
332>;
333
334def FeatureGFX10_3Insts : SubtargetFeature<"gfx10-3-insts",
335  "GFX10_3Insts",
336  "true",
337  "Additional instructions for GFX10.3"
338>;
339
340def FeatureGFX7GFX8GFX9Insts : SubtargetFeature<"gfx7-gfx8-gfx9-insts",
341  "GFX7GFX8GFX9Insts",
342  "true",
343  "Instructions shared in GFX7, GFX8, GFX9"
344>;
345
346def FeatureSMemRealTime : SubtargetFeature<"s-memrealtime",
347  "HasSMemRealTime",
348  "true",
349  "Has s_memrealtime instruction"
350>;
351
352def FeatureInv2PiInlineImm : SubtargetFeature<"inv-2pi-inline-imm",
353  "HasInv2PiInlineImm",
354  "true",
355  "Has 1 / (2 * pi) as inline immediate"
356>;
357
358def Feature16BitInsts : SubtargetFeature<"16-bit-insts",
359  "Has16BitInsts",
360  "true",
361  "Has i16/f16 instructions"
362>;
363
364def FeatureTrue16BitInsts : SubtargetFeature<"true16",
365  "HasTrue16BitInsts",
366  "true",
367  "True 16-bit operand instructions"
368>;
369
370def FeatureVOP3P : SubtargetFeature<"vop3p",
371  "HasVOP3PInsts",
372  "true",
373  "Has VOP3P packed instructions"
374>;
375
376def FeatureMovrel : SubtargetFeature<"movrel",
377  "HasMovrel",
378  "true",
379  "Has v_movrel*_b32 instructions"
380>;
381
382def FeatureVGPRIndexMode : SubtargetFeature<"vgpr-index-mode",
383  "HasVGPRIndexMode",
384  "true",
385  "Has VGPR mode register indexing"
386>;
387
388def FeatureScalarStores : SubtargetFeature<"scalar-stores",
389  "HasScalarStores",
390  "true",
391  "Has store scalar memory instructions"
392>;
393
394def FeatureScalarAtomics : SubtargetFeature<"scalar-atomics",
395  "HasScalarAtomics",
396  "true",
397  "Has atomic scalar memory instructions"
398>;
399
400def FeatureSDWA : SubtargetFeature<"sdwa",
401  "HasSDWA",
402  "true",
403  "Support SDWA (Sub-DWORD Addressing) extension"
404>;
405
406def FeatureSDWAOmod : SubtargetFeature<"sdwa-omod",
407  "HasSDWAOmod",
408  "true",
409  "Support OMod with SDWA (Sub-DWORD Addressing) extension"
410>;
411
412def FeatureSDWAScalar : SubtargetFeature<"sdwa-scalar",
413  "HasSDWAScalar",
414  "true",
415  "Support scalar register with SDWA (Sub-DWORD Addressing) extension"
416>;
417
418def FeatureSDWASdst : SubtargetFeature<"sdwa-sdst",
419  "HasSDWASdst",
420  "true",
421  "Support scalar dst for VOPC with SDWA (Sub-DWORD Addressing) extension"
422>;
423
424def FeatureSDWAMac : SubtargetFeature<"sdwa-mav",
425  "HasSDWAMac",
426  "true",
427  "Support v_mac_f32/f16 with SDWA (Sub-DWORD Addressing) extension"
428>;
429
430def FeatureSDWAOutModsVOPC : SubtargetFeature<"sdwa-out-mods-vopc",
431  "HasSDWAOutModsVOPC",
432  "true",
433  "Support clamp for VOPC with SDWA (Sub-DWORD Addressing) extension"
434>;
435
436def FeatureDPP : SubtargetFeature<"dpp",
437  "HasDPP",
438  "true",
439  "Support DPP (Data Parallel Primitives) extension"
440>;
441
442// DPP8 allows arbitrary cross-lane swizzling within groups of 8 lanes.
443def FeatureDPP8 : SubtargetFeature<"dpp8",
444  "HasDPP8",
445  "true",
446  "Support DPP8 (Data Parallel Primitives) extension"
447>;
448
449def Feature64BitDPP : SubtargetFeature<"dpp-64bit",
450  "Has64BitDPP",
451  "true",
452  "Support DPP (Data Parallel Primitives) extension"
453>;
454
455def FeaturePackedFP32Ops : SubtargetFeature<"packed-fp32-ops",
456  "HasPackedFP32Ops",
457  "true",
458  "Support packed fp32 instructions"
459>;
460
461def FeatureR128A16 : SubtargetFeature<"r128-a16",
462  "HasR128A16",
463  "true",
464  "Support gfx9-style A16 for 16-bit coordinates/gradients/lod/clamp/mip image operands, where a16 is aliased with r128"
465>;
466
467def FeatureGFX10A16 : SubtargetFeature<"a16",
468  "HasGFX10A16",
469  "true",
470  "Support gfx10-style A16 for 16-bit coordinates/gradients/lod/clamp/mip image operands"
471>;
472
473def FeatureG16 : SubtargetFeature<"g16",
474  "HasG16",
475  "true",
476  "Support G16 for 16-bit gradient image operands"
477>;
478
479def FeatureNSAEncoding : SubtargetFeature<"nsa-encoding",
480  "HasNSAEncoding",
481  "true",
482  "Support NSA encoding for image instructions"
483>;
484
485def FeatureImageInsts : SubtargetFeature<"image-insts",
486  "HasImageInsts",
487  "true",
488  "Support image instructions"
489>;
490
491def FeatureExtendedImageInsts : SubtargetFeature<"extended-image-insts",
492  "HasExtendedImageInsts",
493  "true",
494  "Support mips != 0, lod != 0, gather4, and get_lod"
495>;
496
497def FeatureGFX10_AEncoding : SubtargetFeature<"gfx10_a-encoding",
498  "GFX10_AEncoding",
499  "true",
500  "Has BVH ray tracing instructions"
501>;
502
503def FeatureGFX10_BEncoding : SubtargetFeature<"gfx10_b-encoding",
504  "GFX10_BEncoding",
505  "true",
506  "Encoding format GFX10_B"
507>;
508
509def FeatureIntClamp : SubtargetFeature<"int-clamp-insts",
510  "HasIntClamp",
511  "true",
512  "Support clamp for integer destination"
513>;
514
515def FeatureUnpackedD16VMem : SubtargetFeature<"unpacked-d16-vmem",
516  "HasUnpackedD16VMem",
517  "true",
518  "Has unpacked d16 vmem instructions"
519>;
520
521def FeatureDLInsts : SubtargetFeature<"dl-insts",
522  "HasDLInsts",
523  "true",
524  "Has v_fmac_f32 and v_xnor_b32 instructions"
525>;
526
527def FeatureDot1Insts : SubtargetFeature<"dot1-insts",
528  "HasDot1Insts",
529  "true",
530  "Has v_dot4_i32_i8 and v_dot8_i32_i4 instructions"
531>;
532
533def FeatureDot2Insts : SubtargetFeature<"dot2-insts",
534  "HasDot2Insts",
535  "true",
536  "Has v_dot2_i32_i16, v_dot2_u32_u16 instructions"
537>;
538
539def FeatureDot3Insts : SubtargetFeature<"dot3-insts",
540  "HasDot3Insts",
541  "true",
542  "Has v_dot8c_i32_i4 instruction"
543>;
544
545def FeatureDot4Insts : SubtargetFeature<"dot4-insts",
546  "HasDot4Insts",
547  "true",
548  "Has v_dot2c_i32_i16 instruction"
549>;
550
551def FeatureDot5Insts : SubtargetFeature<"dot5-insts",
552  "HasDot5Insts",
553  "true",
554  "Has v_dot2c_f32_f16 instruction"
555>;
556
557def FeatureDot6Insts : SubtargetFeature<"dot6-insts",
558  "HasDot6Insts",
559  "true",
560  "Has v_dot4c_i32_i8 instruction"
561>;
562
563def FeatureDot7Insts : SubtargetFeature<"dot7-insts",
564  "HasDot7Insts",
565  "true",
566  "Has v_dot2_f32_f16, v_dot4_u32_u8, v_dot8_u32_u4 instructions"
567>;
568
569def FeatureDot8Insts : SubtargetFeature<"dot8-insts",
570  "HasDot8Insts",
571  "true",
572  "Has v_dot2_f16_f16, v_dot2_bf16_bf16, v_dot2_f32_bf16, "
573  "v_dot4_i32_iu8, v_dot8_i32_iu4 instructions"
574>;
575
576def FeatureMAIInsts : SubtargetFeature<"mai-insts",
577  "HasMAIInsts",
578  "true",
579  "Has mAI instructions"
580>;
581
582def FeaturePkFmacF16Inst : SubtargetFeature<"pk-fmac-f16-inst",
583  "HasPkFmacF16Inst",
584  "true",
585  "Has v_pk_fmac_f16 instruction"
586>;
587
588def FeatureAtomicFaddRtnInsts : SubtargetFeature<"atomic-fadd-rtn-insts",
589  "HasAtomicFaddRtnInsts",
590  "true",
591  "Has buffer_atomic_add_f32 and global_atomic_add_f32 instructions that "
592  "return original value",
593  [FeatureFlatGlobalInsts]
594>;
595
596def FeatureAtomicFaddNoRtnInsts : SubtargetFeature<"atomic-fadd-no-rtn-insts",
597  "HasAtomicFaddNoRtnInsts",
598  "true",
599  "Has buffer_atomic_add_f32 and global_atomic_add_f32 instructions that "
600  "don't return original value",
601  [FeatureFlatGlobalInsts]
602>;
603
604def FeatureAtomicPkFaddNoRtnInsts
605  : SubtargetFeature<"atomic-pk-fadd-no-rtn-insts",
606  "HasAtomicPkFaddNoRtnInsts",
607  "true",
608  "Has buffer_atomic_pk_add_f16 and global_atomic_pk_add_f16 instructions that "
609  "don't return original value",
610  [FeatureFlatGlobalInsts]
611>;
612
613def FeatureSupportsSRAMECC : SubtargetFeature<"sramecc-support",
614  "SupportsSRAMECC",
615  "true",
616  "Hardware supports SRAMECC"
617>;
618
619def FeatureSRAMECC : SubtargetFeature<"sramecc",
620  "EnableSRAMECC",
621  "true",
622  "Enable SRAMECC"
623>;
624
625def FeatureNoSdstCMPX : SubtargetFeature<"no-sdst-cmpx",
626  "HasNoSdstCMPX",
627  "true",
628  "V_CMPX does not write VCC/SGPR in addition to EXEC"
629>;
630
631def FeatureVscnt : SubtargetFeature<"vscnt",
632  "HasVscnt",
633  "true",
634  "Has separate store vscnt counter"
635>;
636
637def FeatureGetWaveIdInst : SubtargetFeature<"get-wave-id-inst",
638  "HasGetWaveIdInst",
639  "true",
640  "Has s_get_waveid_in_workgroup instruction"
641>;
642
643def FeatureSMemTimeInst : SubtargetFeature<"s-memtime-inst",
644  "HasSMemTimeInst",
645  "true",
646  "Has s_memtime instruction"
647>;
648
649def FeatureShaderCyclesRegister : SubtargetFeature<"shader-cycles-register",
650  "HasShaderCyclesRegister",
651  "true",
652  "Has SHADER_CYCLES hardware register"
653>;
654
655def FeatureMadMacF32Insts : SubtargetFeature<"mad-mac-f32-insts",
656  "HasMadMacF32Insts",
657  "true",
658  "Has v_mad_f32/v_mac_f32/v_madak_f32/v_madmk_f32 instructions"
659>;
660
661def FeatureDsSrc2Insts : SubtargetFeature<"ds-src2-insts",
662  "HasDsSrc2Insts",
663  "true",
664  "Has ds_*_src2 instructions"
665>;
666
667def FeatureVOP3Literal : SubtargetFeature<"vop3-literal",
668  "HasVOP3Literal",
669  "true",
670  "Can use one literal in VOP3"
671>;
672
673def FeatureNoDataDepHazard : SubtargetFeature<"no-data-dep-hazard",
674  "HasNoDataDepHazard",
675  "true",
676  "Does not need SW waitstates"
677>;
678
679class SubtargetFeatureNSAMaxSize <int Value> : SubtargetFeature <
680  "nsa-max-size-"#Value,
681  "NSAMaxSize",
682  !cast<string>(Value),
683  "The maximum non-sequential address size in VGPRs."
684>;
685
686def FeatureNSAMaxSize5 : SubtargetFeatureNSAMaxSize<5>;
687def FeatureNSAMaxSize13 : SubtargetFeatureNSAMaxSize<13>;
688
689def FeatureVOPD : SubtargetFeature<"vopd",
690  "HasVOPDInsts",
691  "true",
692  "Has VOPD dual issue wave32 instructions"
693>;
694
695//===------------------------------------------------------------===//
696// Subtarget Features (options and debugging)
697//===------------------------------------------------------------===//
698
699class FeatureMaxPrivateElementSize<int size> : SubtargetFeature<
700  "max-private-element-size-"#size,
701  "MaxPrivateElementSize",
702  !cast<string>(size),
703  "Maximum private access size may be "#size
704>;
705
706def FeatureMaxPrivateElementSize4 : FeatureMaxPrivateElementSize<4>;
707def FeatureMaxPrivateElementSize8 : FeatureMaxPrivateElementSize<8>;
708def FeatureMaxPrivateElementSize16 : FeatureMaxPrivateElementSize<16>;
709
710def FeatureDumpCode : SubtargetFeature <"DumpCode",
711  "DumpCode",
712  "true",
713  "Dump MachineInstrs in the CodeEmitter"
714>;
715
716def FeatureDumpCodeLower : SubtargetFeature <"dumpcode",
717  "DumpCode",
718  "true",
719  "Dump MachineInstrs in the CodeEmitter"
720>;
721
722// XXX - This should probably be removed once enabled by default
723def FeatureEnableLoadStoreOpt : SubtargetFeature <"load-store-opt",
724  "EnableLoadStoreOpt",
725  "true",
726  "Enable SI load/store optimizer pass"
727>;
728
729// Performance debugging feature. Allow using DS instruction immediate
730// offsets even if the base pointer can't be proven to be base. On SI,
731// base pointer values that won't give the same result as a 16-bit add
732// are not safe to fold, but this will override the conservative test
733// for the base pointer.
734def FeatureEnableUnsafeDSOffsetFolding : SubtargetFeature <
735  "unsafe-ds-offset-folding",
736  "EnableUnsafeDSOffsetFolding",
737  "true",
738  "Force using DS instruction immediate offsets on SI"
739>;
740
741def FeatureEnableSIScheduler : SubtargetFeature<"si-scheduler",
742  "EnableSIScheduler",
743  "true",
744  "Enable SI Machine Scheduler"
745>;
746
747def FeatureEnableDS128 : SubtargetFeature<"enable-ds128",
748  "EnableDS128",
749  "true",
750  "Use ds_{read|write}_b128"
751>;
752
753// Sparse texture support requires that all result registers are zeroed when
754// PRTStrictNull is set to true. This feature is turned on for all architectures
755// but is enabled as a feature in case there are situations where PRTStrictNull
756// is disabled by the driver.
757def FeatureEnablePRTStrictNull : SubtargetFeature<"enable-prt-strict-null",
758  "EnablePRTStrictNull",
759  "true",
760  "Enable zeroing of result registers for sparse texture fetches"
761>;
762
763// Unless +-flat-for-global is specified, turn on FlatForGlobal for
764// all OS-es on VI and newer hardware to avoid assertion failures due
765// to missing ADDR64 variants of MUBUF instructions.
766// FIXME: moveToVALU should be able to handle converting addr64 MUBUF
767// instructions.
768
769def FeatureFlatForGlobal : SubtargetFeature<"flat-for-global",
770  "FlatForGlobal",
771  "true",
772  "Force to generate flat instruction for global"
773>;
774
775def FeatureAutoWaitcntBeforeBarrier : SubtargetFeature <
776  "auto-waitcnt-before-barrier",
777  "AutoWaitcntBeforeBarrier",
778  "true",
779  "Hardware automatically inserts waitcnt before barrier"
780>;
781
782def FeatureTrigReducedRange : SubtargetFeature<"trig-reduced-range",
783  "HasTrigReducedRange",
784  "true",
785  "Requires use of fract on arguments to trig instructions"
786>;
787
788// Alignment enforcement is controlled by a configuration register:
789// SH_MEM_CONFIG.alignment_mode
790def FeatureUnalignedAccessMode : SubtargetFeature<"unaligned-access-mode",
791  "UnalignedAccessMode",
792  "true",
793  "Enable unaligned global, local and region loads and stores if the hardware"
794  " supports it"
795>;
796
797def FeaturePackedTID : SubtargetFeature<"packed-tid",
798  "HasPackedTID",
799  "true",
800  "Workitem IDs are packed into v0 at kernel launch"
801>;
802
803def FeatureArchitectedFlatScratch : SubtargetFeature<"architected-flat-scratch",
804  "HasArchitectedFlatScratch",
805  "true",
806  "Flat Scratch register is a readonly SPI initialized architected register"
807>;
808
809// Dummy feature used to disable assembler instructions.
810def FeatureDisable : SubtargetFeature<"",
811  "FeatureDisable","true",
812  "Dummy feature to disable assembler instructions"
813>;
814
815class GCNSubtargetFeatureGeneration <string Value,
816                                     string FeatureName,
817                                     list<SubtargetFeature> Implies> :
818        SubtargetFeatureGeneration <Value, FeatureName, "GCNSubtarget", Implies>;
819
820def FeatureSouthernIslands : GCNSubtargetFeatureGeneration<"SOUTHERN_ISLANDS",
821    "southern-islands",
822  [FeatureFP64, FeatureLocalMemorySize32768, FeatureMIMG_R128,
823  FeatureWavefrontSize64, FeatureSMemTimeInst, FeatureMadMacF32Insts,
824  FeatureDsSrc2Insts, FeatureLDSBankCount32, FeatureMovrel,
825  FeatureTrigReducedRange, FeatureExtendedImageInsts, FeatureImageInsts
826  ]
827>;
828
829def FeatureSeaIslands : GCNSubtargetFeatureGeneration<"SEA_ISLANDS",
830    "sea-islands",
831  [FeatureFP64, FeatureLocalMemorySize65536, FeatureMIMG_R128,
832  FeatureWavefrontSize64, FeatureFlatAddressSpace,
833  FeatureCIInsts, FeatureMovrel, FeatureTrigReducedRange,
834  FeatureGFX7GFX8GFX9Insts, FeatureSMemTimeInst, FeatureMadMacF32Insts,
835  FeatureDsSrc2Insts, FeatureExtendedImageInsts, FeatureUnalignedBufferAccess,
836  FeatureImageInsts
837  ]
838>;
839
840def FeatureVolcanicIslands : GCNSubtargetFeatureGeneration<"VOLCANIC_ISLANDS",
841  "volcanic-islands",
842  [FeatureFP64, FeatureLocalMemorySize65536, FeatureMIMG_R128,
843   FeatureWavefrontSize64, FeatureFlatAddressSpace,
844   FeatureGCN3Encoding, FeatureCIInsts, Feature16BitInsts,
845   FeatureSMemRealTime, FeatureVGPRIndexMode, FeatureMovrel,
846   FeatureScalarStores, FeatureInv2PiInlineImm,
847   FeatureSDWA, FeatureSDWAOutModsVOPC, FeatureSDWAMac, FeatureDPP,
848   FeatureIntClamp, FeatureTrigReducedRange, FeatureGFX8Insts,
849   FeatureGFX7GFX8GFX9Insts, FeatureSMemTimeInst, FeatureMadMacF32Insts,
850   FeatureDsSrc2Insts, FeatureExtendedImageInsts, FeatureFastDenormalF32,
851   FeatureUnalignedBufferAccess, FeatureImageInsts
852  ]
853>;
854
855def FeatureGFX9 : GCNSubtargetFeatureGeneration<"GFX9",
856  "gfx9",
857  [FeatureFP64, FeatureLocalMemorySize65536,
858   FeatureWavefrontSize64, FeatureFlatAddressSpace,
859   FeatureGCN3Encoding, FeatureCIInsts, Feature16BitInsts,
860   FeatureSMemRealTime, FeatureScalarStores, FeatureInv2PiInlineImm,
861   FeatureApertureRegs, FeatureGFX9Insts, FeatureVOP3P, FeatureVGPRIndexMode,
862   FeatureFastFMAF32, FeatureDPP, FeatureIntClamp,
863   FeatureSDWA, FeatureSDWAOmod, FeatureSDWAScalar, FeatureSDWASdst,
864   FeatureFlatInstOffsets, FeatureFlatGlobalInsts, FeatureFlatScratchInsts,
865   FeatureAddNoCarryInsts, FeatureGFX8Insts, FeatureGFX7GFX8GFX9Insts,
866   FeatureScalarFlatScratchInsts, FeatureScalarAtomics, FeatureR128A16,
867   FeatureSMemTimeInst, FeatureFastDenormalF32, FeatureSupportsXNACK,
868   FeatureUnalignedBufferAccess, FeatureUnalignedDSAccess,
869   FeatureNegativeScratchOffsetBug
870  ]
871>;
872
873def FeatureGFX10 : GCNSubtargetFeatureGeneration<"GFX10",
874  "gfx10",
875  [FeatureFP64, FeatureLocalMemorySize65536, FeatureMIMG_R128,
876   FeatureFlatAddressSpace,
877   FeatureCIInsts, Feature16BitInsts,
878   FeatureSMemRealTime, FeatureInv2PiInlineImm,
879   FeatureApertureRegs, FeatureGFX9Insts, FeatureGFX10Insts, FeatureVOP3P,
880   FeatureMovrel, FeatureFastFMAF32, FeatureDPP, FeatureIntClamp,
881   FeatureSDWA, FeatureSDWAOmod, FeatureSDWAScalar, FeatureSDWASdst,
882   FeatureFlatInstOffsets, FeatureFlatGlobalInsts, FeatureFlatScratchInsts,
883   FeatureAddNoCarryInsts, FeatureFmaMixInsts, FeatureGFX8Insts,
884   FeatureNoSdstCMPX, FeatureVscnt,
885   FeatureVOP3Literal, FeatureDPP8, FeatureExtendedImageInsts,
886   FeatureNoDataDepHazard, FeaturePkFmacF16Inst,
887   FeatureGFX10A16, FeatureSMemTimeInst, FeatureFastDenormalF32, FeatureG16,
888   FeatureUnalignedBufferAccess, FeatureUnalignedDSAccess, FeatureImageInsts
889  ]
890>;
891
892def FeatureGFX11 : GCNSubtargetFeatureGeneration<"GFX11",
893  "gfx11",
894  [FeatureFP64, FeatureLocalMemorySize65536, FeatureMIMG_R128,
895   FeatureFlatAddressSpace, Feature16BitInsts,
896   FeatureInv2PiInlineImm, FeatureApertureRegs,
897   FeatureCIInsts, FeatureGFX8Insts, FeatureGFX9Insts, FeatureGFX10Insts,
898   FeatureGFX10_AEncoding, FeatureGFX10_BEncoding, FeatureGFX10_3Insts,
899   FeatureGFX11Insts, FeatureVOP3P, FeatureVOPD, FeatureTrue16BitInsts,
900   FeatureMovrel, FeatureFastFMAF32, FeatureDPP, FeatureIntClamp,
901   FeatureFlatInstOffsets, FeatureFlatGlobalInsts, FeatureFlatScratchInsts,
902   FeatureAddNoCarryInsts, FeatureFmaMixInsts,
903   FeatureNoSdstCMPX, FeatureVscnt,
904   FeatureVOP3Literal, FeatureDPP8, FeatureExtendedImageInsts,
905   FeatureNoDataDepHazard, FeaturePkFmacF16Inst,
906   FeatureGFX10A16, FeatureFastDenormalF32, FeatureG16,
907   FeatureUnalignedBufferAccess, FeatureUnalignedDSAccess
908  ]
909>;
910
911class FeatureSet<list<SubtargetFeature> Features_> {
912  list<SubtargetFeature> Features = Features_;
913}
914
915def FeatureISAVersion6_0_0 : FeatureSet<[FeatureSouthernIslands,
916   FeatureFastFMAF32,
917   HalfRate64Ops,
918   FeatureLDSBankCount32]>;
919
920def FeatureISAVersion6_0_1 : FeatureSet<
921  [FeatureSouthernIslands,
922   FeatureLDSBankCount32]>;
923
924def FeatureISAVersion6_0_2 : FeatureSet<
925  [FeatureSouthernIslands,
926   FeatureLDSBankCount32]>;
927
928def FeatureISAVersion7_0_0 : FeatureSet<
929  [FeatureSeaIslands,
930   FeatureLDSBankCount32]>;
931
932def FeatureISAVersion7_0_1 : FeatureSet<
933  [FeatureSeaIslands,
934   HalfRate64Ops,
935   FeatureLDSBankCount32,
936   FeatureFastFMAF32]>;
937
938def FeatureISAVersion7_0_2 : FeatureSet<
939  [FeatureSeaIslands,
940   FeatureLDSBankCount16,
941   FeatureFastFMAF32]>;
942
943def FeatureISAVersion7_0_3 : FeatureSet<
944  [FeatureSeaIslands,
945   FeatureLDSBankCount16]>;
946
947def FeatureISAVersion7_0_4 : FeatureSet<
948  [FeatureSeaIslands,
949   FeatureLDSBankCount32]>;
950
951def FeatureISAVersion7_0_5 : FeatureSet<
952  [FeatureSeaIslands,
953   FeatureLDSBankCount16]>;
954
955def FeatureISAVersion8_0_1 : FeatureSet<
956  [FeatureVolcanicIslands,
957   FeatureFastFMAF32,
958   HalfRate64Ops,
959   FeatureLDSBankCount32,
960   FeatureSupportsXNACK,
961   FeatureUnpackedD16VMem]>;
962
963def FeatureISAVersion8_0_2 : FeatureSet<
964  [FeatureVolcanicIslands,
965   FeatureLDSBankCount32,
966   FeatureSGPRInitBug,
967   FeatureUnpackedD16VMem]>;
968
969def FeatureISAVersion8_0_3 : FeatureSet<
970  [FeatureVolcanicIslands,
971   FeatureLDSBankCount32,
972   FeatureUnpackedD16VMem]>;
973
974def FeatureISAVersion8_0_5 : FeatureSet<
975  [FeatureVolcanicIslands,
976   FeatureLDSBankCount32,
977   FeatureSGPRInitBug,
978   FeatureUnpackedD16VMem]>;
979
980def FeatureISAVersion8_1_0 : FeatureSet<
981  [FeatureVolcanicIslands,
982   FeatureLDSBankCount16,
983   FeatureSupportsXNACK,
984   FeatureImageStoreD16Bug,
985   FeatureImageGather4D16Bug]>;
986
987def FeatureISAVersion9_0_0 : FeatureSet<
988  [FeatureGFX9,
989   FeatureMadMixInsts,
990   FeatureLDSBankCount32,
991   FeatureDsSrc2Insts,
992   FeatureExtendedImageInsts,
993   FeatureImageInsts,
994   FeatureMadMacF32Insts,
995   FeatureImageGather4D16Bug]>;
996
997def FeatureISAVersion9_0_2 : FeatureSet<
998  [FeatureGFX9,
999   FeatureMadMixInsts,
1000   FeatureLDSBankCount32,
1001   FeatureDsSrc2Insts,
1002   FeatureExtendedImageInsts,
1003   FeatureImageInsts,
1004   FeatureMadMacF32Insts,
1005   FeatureImageGather4D16Bug]>;
1006
1007def FeatureISAVersion9_0_4 : FeatureSet<
1008  [FeatureGFX9,
1009   FeatureLDSBankCount32,
1010   FeatureDsSrc2Insts,
1011   FeatureExtendedImageInsts,
1012   FeatureImageInsts,
1013   FeatureMadMacF32Insts,
1014   FeatureFmaMixInsts,
1015   FeatureImageGather4D16Bug]>;
1016
1017def FeatureISAVersion9_0_6 : FeatureSet<
1018  [FeatureGFX9,
1019   HalfRate64Ops,
1020   FeatureFmaMixInsts,
1021   FeatureLDSBankCount32,
1022   FeatureDsSrc2Insts,
1023   FeatureExtendedImageInsts,
1024   FeatureImageInsts,
1025   FeatureMadMacF32Insts,
1026   FeatureDLInsts,
1027   FeatureDot1Insts,
1028   FeatureDot2Insts,
1029   FeatureDot7Insts,
1030   FeatureSupportsSRAMECC,
1031   FeatureImageGather4D16Bug]>;
1032
1033def FeatureISAVersion9_0_8 : FeatureSet<
1034  [FeatureGFX9,
1035   HalfRate64Ops,
1036   FeatureFmaMixInsts,
1037   FeatureLDSBankCount32,
1038   FeatureDsSrc2Insts,
1039   FeatureExtendedImageInsts,
1040   FeatureImageInsts,
1041   FeatureMadMacF32Insts,
1042   FeatureDLInsts,
1043   FeatureDot1Insts,
1044   FeatureDot2Insts,
1045   FeatureDot3Insts,
1046   FeatureDot4Insts,
1047   FeatureDot5Insts,
1048   FeatureDot6Insts,
1049   FeatureDot7Insts,
1050   FeatureMAIInsts,
1051   FeaturePkFmacF16Inst,
1052   FeatureAtomicFaddNoRtnInsts,
1053   FeatureAtomicPkFaddNoRtnInsts,
1054   FeatureSupportsSRAMECC,
1055   FeatureMFMAInlineLiteralBug,
1056   FeatureImageGather4D16Bug]>;
1057
1058def FeatureISAVersion9_0_9 : FeatureSet<
1059  [FeatureGFX9,
1060   FeatureMadMixInsts,
1061   FeatureLDSBankCount32,
1062   FeatureDsSrc2Insts,
1063   FeatureExtendedImageInsts,
1064   FeatureImageInsts,
1065   FeatureMadMacF32Insts,
1066   FeatureImageGather4D16Bug]>;
1067
1068def FeatureISAVersion9_0_A : FeatureSet<
1069  [FeatureGFX9,
1070   FeatureGFX90AInsts,
1071   FeatureFmaMixInsts,
1072   FeatureLDSBankCount32,
1073   FeatureDLInsts,
1074   FeatureDot1Insts,
1075   FeatureDot2Insts,
1076   FeatureDot3Insts,
1077   FeatureDot4Insts,
1078   FeatureDot5Insts,
1079   FeatureDot6Insts,
1080   FeatureDot7Insts,
1081   Feature64BitDPP,
1082   FeaturePackedFP32Ops,
1083   FeatureMAIInsts,
1084   FeaturePkFmacF16Inst,
1085   FeatureAtomicFaddRtnInsts,
1086   FeatureAtomicFaddNoRtnInsts,
1087   FeatureAtomicPkFaddNoRtnInsts,
1088   FeatureImageInsts,
1089   FeatureMadMacF32Insts,
1090   FeatureSupportsSRAMECC,
1091   FeaturePackedTID,
1092   FullRate64Ops]>;
1093
1094def FeatureISAVersion9_0_C : FeatureSet<
1095  [FeatureGFX9,
1096   FeatureMadMixInsts,
1097   FeatureLDSBankCount32,
1098   FeatureDsSrc2Insts,
1099   FeatureExtendedImageInsts,
1100   FeatureImageInsts,
1101   FeatureMadMacF32Insts,
1102   FeatureImageGather4D16Bug]>;
1103
1104def FeatureISAVersion9_4_0 : FeatureSet<
1105  [FeatureGFX9,
1106   FeatureGFX90AInsts,
1107   FeatureGFX940Insts,
1108   FeatureFmaMixInsts,
1109   FeatureLDSBankCount32,
1110   FeatureDLInsts,
1111   FeatureDot1Insts,
1112   FeatureDot2Insts,
1113   FeatureDot3Insts,
1114   FeatureDot4Insts,
1115   FeatureDot5Insts,
1116   FeatureDot6Insts,
1117   FeatureDot7Insts,
1118   Feature64BitDPP,
1119   FeaturePackedFP32Ops,
1120   FeatureMAIInsts,
1121   FeaturePkFmacF16Inst,
1122   FeatureAtomicFaddRtnInsts,
1123   FeatureAtomicFaddNoRtnInsts,
1124   FeatureAtomicPkFaddNoRtnInsts,
1125   FeatureSupportsSRAMECC,
1126   FeaturePackedTID,
1127   FeatureArchitectedFlatScratch,
1128   FullRate64Ops]>;
1129
1130// TODO: Organize more features into groups.
1131def FeatureGroup {
1132  // Bugs present on gfx10.1.
1133  list<SubtargetFeature> GFX10_1_Bugs = [
1134    FeatureVcmpxPermlaneHazard,
1135    FeatureVMEMtoScalarWriteHazard,
1136    FeatureSMEMtoVectorWriteHazard,
1137    FeatureInstFwdPrefetchBug,
1138    FeatureVcmpxExecWARHazard,
1139    FeatureLdsBranchVmemWARHazard,
1140    FeatureNSAtoVMEMBug,
1141    FeatureNSAClauseBug,
1142    FeatureOffset3fBug,
1143    FeatureFlatSegmentOffsetBug,
1144    FeatureNegativeUnalignedScratchOffsetBug
1145   ];
1146}
1147
1148def FeatureISAVersion10_1_0 : FeatureSet<
1149  !listconcat(FeatureGroup.GFX10_1_Bugs,
1150    [FeatureGFX10,
1151     FeatureLDSBankCount32,
1152     FeatureDLInsts,
1153     FeatureNSAEncoding,
1154     FeatureNSAMaxSize5,
1155     FeatureWavefrontSize32,
1156     FeatureScalarStores,
1157     FeatureScalarAtomics,
1158     FeatureScalarFlatScratchInsts,
1159     FeatureGetWaveIdInst,
1160     FeatureMadMacF32Insts,
1161     FeatureDsSrc2Insts,
1162     FeatureLdsMisalignedBug,
1163     FeatureSupportsXNACK])>;
1164
1165def FeatureISAVersion10_1_1 : FeatureSet<
1166  !listconcat(FeatureGroup.GFX10_1_Bugs,
1167    [FeatureGFX10,
1168     FeatureLDSBankCount32,
1169     FeatureDLInsts,
1170     FeatureDot1Insts,
1171     FeatureDot2Insts,
1172     FeatureDot5Insts,
1173     FeatureDot6Insts,
1174     FeatureDot7Insts,
1175     FeatureNSAEncoding,
1176     FeatureNSAMaxSize5,
1177     FeatureWavefrontSize32,
1178     FeatureScalarStores,
1179     FeatureScalarAtomics,
1180     FeatureScalarFlatScratchInsts,
1181     FeatureGetWaveIdInst,
1182     FeatureMadMacF32Insts,
1183     FeatureDsSrc2Insts,
1184     FeatureLdsMisalignedBug,
1185     FeatureSupportsXNACK])>;
1186
1187def FeatureISAVersion10_1_2 : FeatureSet<
1188  !listconcat(FeatureGroup.GFX10_1_Bugs,
1189    [FeatureGFX10,
1190     FeatureLDSBankCount32,
1191     FeatureDLInsts,
1192     FeatureDot1Insts,
1193     FeatureDot2Insts,
1194     FeatureDot5Insts,
1195     FeatureDot6Insts,
1196     FeatureDot7Insts,
1197     FeatureNSAEncoding,
1198     FeatureNSAMaxSize5,
1199     FeatureWavefrontSize32,
1200     FeatureScalarStores,
1201     FeatureScalarAtomics,
1202     FeatureScalarFlatScratchInsts,
1203     FeatureGetWaveIdInst,
1204     FeatureMadMacF32Insts,
1205     FeatureDsSrc2Insts,
1206     FeatureLdsMisalignedBug,
1207     FeatureSupportsXNACK])>;
1208
1209def FeatureISAVersion10_1_3 : FeatureSet<
1210  !listconcat(FeatureGroup.GFX10_1_Bugs,
1211    [FeatureGFX10,
1212     FeatureGFX10_AEncoding,
1213     FeatureLDSBankCount32,
1214     FeatureDLInsts,
1215     FeatureNSAEncoding,
1216     FeatureNSAMaxSize5,
1217     FeatureWavefrontSize32,
1218     FeatureScalarStores,
1219     FeatureScalarAtomics,
1220     FeatureScalarFlatScratchInsts,
1221     FeatureGetWaveIdInst,
1222     FeatureMadMacF32Insts,
1223     FeatureDsSrc2Insts,
1224     FeatureLdsMisalignedBug,
1225     FeatureSupportsXNACK])>;
1226
1227def FeatureISAVersion10_3_0 : FeatureSet<
1228  [FeatureGFX10,
1229   FeatureGFX10_AEncoding,
1230   FeatureGFX10_BEncoding,
1231   FeatureGFX10_3Insts,
1232   FeatureLDSBankCount32,
1233   FeatureDLInsts,
1234   FeatureDot1Insts,
1235   FeatureDot2Insts,
1236   FeatureDot5Insts,
1237   FeatureDot6Insts,
1238   FeatureDot7Insts,
1239   FeatureNSAEncoding,
1240   FeatureNSAMaxSize13,
1241   FeatureWavefrontSize32,
1242   FeatureShaderCyclesRegister]>;
1243
1244def FeatureISAVersion11_Common : FeatureSet<
1245  [FeatureGFX11,
1246   FeatureLDSBankCount32,
1247   FeatureDLInsts,
1248   FeatureDot5Insts,
1249   FeatureDot7Insts,
1250   FeatureDot8Insts,
1251   FeatureNSAEncoding,
1252   FeatureNSAMaxSize5,
1253   FeatureWavefrontSize32,
1254   FeatureShaderCyclesRegister,
1255   FeatureArchitectedFlatScratch,
1256   FeatureAtomicFaddRtnInsts,
1257   FeatureAtomicFaddNoRtnInsts,
1258   FeatureImageInsts,
1259   FeaturePackedTID,
1260   FeatureVcmpxPermlaneHazard]>;
1261
1262// Features for GFX 11.0.0 and 11.0.1
1263def FeatureISAVersion11_0 : FeatureSet<
1264  !listconcat(FeatureISAVersion11_Common.Features,
1265    [])>;
1266
1267def FeatureISAVersion11_0_2 : FeatureSet<
1268  !listconcat(FeatureISAVersion11_Common.Features,
1269    [])>;
1270
1271//===----------------------------------------------------------------------===//
1272
1273def AMDGPUInstrInfo : InstrInfo {
1274  let guessInstructionProperties = 1;
1275  let noNamedPositionallyEncodedOperands = 1;
1276}
1277
1278def AMDGPUAsmParser : AsmParser {
1279  // Some of the R600 registers have the same name, so this crashes.
1280  // For example T0_XYZW and T0_XY both have the asm name T0.
1281  let ShouldEmitMatchRegisterName = 0;
1282}
1283
1284def AMDGPUAsmWriter : AsmWriter {
1285  int PassSubtarget = 1;
1286}
1287
1288def AMDGPUAsmVariants {
1289  string Default = "Default";
1290  int Default_ID = 0;
1291  string VOP3 = "VOP3";
1292  int VOP3_ID = 1;
1293  string SDWA = "SDWA";
1294  int SDWA_ID = 2;
1295  string SDWA9 = "SDWA9";
1296  int SDWA9_ID = 3;
1297  string DPP = "DPP";
1298  int DPP_ID = 4;
1299  string VOP3_DPP = "VOP3_DPP";
1300  int VOP3_DPP_ID = 5;
1301  string Disable = "Disable";
1302  int Disable_ID = 6;
1303}
1304
1305def DefaultAMDGPUAsmParserVariant : AsmParserVariant {
1306  let Variant = AMDGPUAsmVariants.Default_ID;
1307  let Name = AMDGPUAsmVariants.Default;
1308}
1309
1310def VOP3AsmParserVariant : AsmParserVariant {
1311  let Variant = AMDGPUAsmVariants.VOP3_ID;
1312  let Name = AMDGPUAsmVariants.VOP3;
1313}
1314
1315def SDWAAsmParserVariant : AsmParserVariant {
1316  let Variant = AMDGPUAsmVariants.SDWA_ID;
1317  let Name = AMDGPUAsmVariants.SDWA;
1318}
1319
1320def SDWA9AsmParserVariant : AsmParserVariant {
1321  let Variant = AMDGPUAsmVariants.SDWA9_ID;
1322  let Name = AMDGPUAsmVariants.SDWA9;
1323}
1324
1325def DPPAsmParserVariant : AsmParserVariant {
1326  let Variant = AMDGPUAsmVariants.DPP_ID;
1327  let Name = AMDGPUAsmVariants.DPP;
1328}
1329
1330def VOP3_DPPAsmParserVariant : AsmParserVariant {
1331  let Variant = AMDGPUAsmVariants.VOP3_DPP_ID;
1332  let Name = AMDGPUAsmVariants.VOP3_DPP;
1333}
1334
1335def AMDGPU : Target {
1336  // Pull in Instruction Info:
1337  let InstructionSet = AMDGPUInstrInfo;
1338  let AssemblyParsers = [AMDGPUAsmParser];
1339  let AssemblyParserVariants = [DefaultAMDGPUAsmParserVariant,
1340                                VOP3AsmParserVariant,
1341                                SDWAAsmParserVariant,
1342                                SDWA9AsmParserVariant,
1343                                DPPAsmParserVariant,
1344                                VOP3_DPPAsmParserVariant];
1345  let AssemblyWriters = [AMDGPUAsmWriter];
1346  let AllowRegisterRenaming = 1;
1347}
1348
1349// Dummy Instruction itineraries for pseudo instructions
1350def ALU_NULL : FuncUnit;
1351def NullALU : InstrItinClass;
1352
1353//===----------------------------------------------------------------------===//
1354// Predicate helper class
1355//===----------------------------------------------------------------------===//
1356
1357def isGFX6 :
1358  Predicate<"Subtarget->getGeneration() == AMDGPUSubtarget::SOUTHERN_ISLANDS">,
1359  AssemblerPredicate<(all_of FeatureSouthernIslands)>;
1360
1361def isGFX6GFX7 :
1362  Predicate<"Subtarget->getGeneration() == AMDGPUSubtarget::SOUTHERN_ISLANDS ||"
1363            "Subtarget->getGeneration() == AMDGPUSubtarget::SEA_ISLANDS">,
1364  AssemblerPredicate<(all_of (not FeatureGCN3Encoding), (not FeatureGFX10Insts))>;
1365
1366def isGFX6GFX7GFX10 :
1367  Predicate<"Subtarget->getGeneration() == AMDGPUSubtarget::SOUTHERN_ISLANDS ||"
1368            "Subtarget->getGeneration() == AMDGPUSubtarget::SEA_ISLANDS ||"
1369            "Subtarget->getGeneration() == AMDGPUSubtarget::GFX10">,
1370  AssemblerPredicate<(all_of (not FeatureGCN3Encoding), (not FeatureGFX11Insts))>;
1371
1372def isGFX6GFX7GFX10Plus :
1373  Predicate<"Subtarget->getGeneration() == AMDGPUSubtarget::SOUTHERN_ISLANDS ||"
1374            "Subtarget->getGeneration() == AMDGPUSubtarget::SEA_ISLANDS ||"
1375            "Subtarget->getGeneration() >= AMDGPUSubtarget::GFX10">,
1376  AssemblerPredicate<(all_of (not FeatureGCN3Encoding))>;
1377
1378def isGFX7Only :
1379  Predicate<"Subtarget->getGeneration() == AMDGPUSubtarget::SEA_ISLANDS">,
1380  AssemblerPredicate<(all_of (not FeatureGCN3Encoding), FeatureCIInsts, (not FeatureGFX10Insts))>;
1381
1382def isGFX7GFX10 :
1383  Predicate<"Subtarget->getGeneration() == AMDGPUSubtarget::SEA_ISLANDS ||"
1384            "Subtarget->getGeneration() == AMDGPUSubtarget::GFX10">,
1385  AssemblerPredicate<(all_of (not FeatureGCN3Encoding), FeatureCIInsts, (not FeatureGFX11Insts))>;
1386
1387def isGFX7GFX10GFX11 :
1388  Predicate<"Subtarget->getGeneration() == AMDGPUSubtarget::SEA_ISLANDS ||"
1389            "Subtarget->getGeneration() == AMDGPUSubtarget::GFX10 ||"
1390            "Subtarget->getGeneration() == AMDGPUSubtarget::GFX11">,
1391  AssemblerPredicate<(all_of (not FeatureGCN3Encoding), FeatureCIInsts)>;
1392
1393def isGFX7GFX8GFX9 :
1394  Predicate<"Subtarget->getGeneration() == AMDGPUSubtarget::SEA_ISLANDS ||"
1395            "Subtarget->getGeneration() == AMDGPUSubtarget::VOLCANIC_ISLANDS ||"
1396            "Subtarget->getGeneration() == AMDGPUSubtarget::GFX9">,
1397  AssemblerPredicate<(all_of FeatureGFX7GFX8GFX9Insts)>;
1398
1399def isGFX6GFX7GFX8GFX9 :
1400  Predicate<"Subtarget->getGeneration() == AMDGPUSubtarget::SOUTHERN_ISLANDS ||"
1401            "Subtarget->getGeneration() == AMDGPUSubtarget::SEA_ISLANDS ||"
1402            "Subtarget->getGeneration() == AMDGPUSubtarget::VOLCANIC_ISLANDS ||"
1403            "Subtarget->getGeneration() == AMDGPUSubtarget::GFX9">,
1404  AssemblerPredicate<(all_of (not FeatureGFX10Insts))>;
1405
1406def isGFX6GFX7GFX8GFX9NotGFX90A :
1407  Predicate<"!Subtarget->hasGFX90AInsts() &&"
1408            "(Subtarget->getGeneration() == AMDGPUSubtarget::SOUTHERN_ISLANDS ||"
1409            " Subtarget->getGeneration() == AMDGPUSubtarget::SEA_ISLANDS ||"
1410            " Subtarget->getGeneration() == AMDGPUSubtarget::VOLCANIC_ISLANDS ||"
1411            " Subtarget->getGeneration() == AMDGPUSubtarget::GFX9)">,
1412  AssemblerPredicate<(all_of (not FeatureGFX10Insts), (not FeatureGFX90AInsts))>;
1413
1414def isGFX6GFX7GFX8GFX9GFX10 :
1415  Predicate<"Subtarget->getGeneration() == AMDGPUSubtarget::SOUTHERN_ISLANDS ||"
1416            "Subtarget->getGeneration() == AMDGPUSubtarget::SEA_ISLANDS ||"
1417            "Subtarget->getGeneration() == AMDGPUSubtarget::VOLCANIC_ISLANDS ||"
1418            "Subtarget->getGeneration() == AMDGPUSubtarget::GFX9 ||"
1419            "Subtarget->getGeneration() == AMDGPUSubtarget::GFX10">,
1420  AssemblerPredicate<(all_of (not FeatureGFX11Insts))>;
1421
1422def isGFX7GFX8GFX9GFX10 :
1423  Predicate<"Subtarget->getGeneration() == AMDGPUSubtarget::SEA_ISLANDS ||"
1424            "Subtarget->getGeneration() == AMDGPUSubtarget::VOLCANIC_ISLANDS ||"
1425            "Subtarget->getGeneration() == AMDGPUSubtarget::GFX9 ||"
1426            "Subtarget->getGeneration() == AMDGPUSubtarget::GFX10">,
1427  AssemblerPredicate<(all_of FeatureCIInsts, (not FeatureGFX11Insts))>;
1428
1429def isGFX7Plus :
1430  Predicate<"Subtarget->getGeneration() >= AMDGPUSubtarget::SEA_ISLANDS">,
1431  AssemblerPredicate<(all_of FeatureCIInsts)>;
1432
1433def isGFX8Plus :
1434  Predicate<"Subtarget->getGeneration() >= AMDGPUSubtarget::VOLCANIC_ISLANDS">,
1435  AssemblerPredicate<(all_of FeatureGFX8Insts)>;
1436
1437def isGFX8Only : Predicate<"Subtarget->getGeneration() =="
1438                           "AMDGPUSubtarget::VOLCANIC_ISLANDS">,
1439  AssemblerPredicate <(all_of FeatureVolcanicIslands)>;
1440
1441def isGFX9Plus :
1442  Predicate<"Subtarget->getGeneration() >= AMDGPUSubtarget::GFX9">,
1443  AssemblerPredicate<(all_of FeatureGFX9Insts)>;
1444
1445def isGFX9Only : Predicate <
1446  "Subtarget->getGeneration() == AMDGPUSubtarget::GFX9">,
1447  AssemblerPredicate<(all_of FeatureGCN3Encoding, FeatureGFX9Insts)>;
1448
1449def isGCN3ExcludingGFX90A :
1450  Predicate<"Subtarget->isGCN3Encoding() && !Subtarget->hasGFX90AInsts()">,
1451  AssemblerPredicate<(all_of FeatureGCN3Encoding, (not FeatureGFX90AInsts))>;
1452
1453def isGFX90APlus :
1454  Predicate<"Subtarget->hasGFX90AInsts()">,
1455  AssemblerPredicate<(all_of FeatureGFX90AInsts)>;
1456
1457def isNotGFX90APlus :
1458  Predicate<"!Subtarget->hasGFX90AInsts()">,
1459  AssemblerPredicate<(all_of (not FeatureGFX90AInsts))>;
1460
1461def isGFX8GFX9NotGFX90A :
1462  Predicate<"!Subtarget->hasGFX90AInsts() &&"
1463            "(Subtarget->getGeneration() == AMDGPUSubtarget::VOLCANIC_ISLANDS ||"
1464            " Subtarget->getGeneration() == AMDGPUSubtarget::GFX9)">,
1465  AssemblerPredicate<(all_of FeatureGFX8Insts, FeatureGCN3Encoding, (not FeatureGFX90AInsts))>;
1466
1467def isGFX90AOnly :
1468  Predicate<"Subtarget->hasGFX90AInsts() && !Subtarget->hasGFX940Insts()">,
1469  AssemblerPredicate<(all_of FeatureGFX90AInsts, (not FeatureGFX940Insts))>;
1470
1471def isGFX908orGFX90A :
1472  Predicate<"Subtarget->hasMAIInsts() && !Subtarget->hasGFX940Insts()">,
1473  AssemblerPredicate<(all_of FeatureMAIInsts, (not FeatureGFX940Insts))>;
1474
1475def isGFX940Plus :
1476  Predicate<"Subtarget->hasGFX940Insts()">,
1477  AssemblerPredicate<(all_of FeatureGFX940Insts)>;
1478
1479def isGFX940GFX11Plus :
1480  Predicate<"Subtarget->hasGFX940Insts() ||"
1481            "Subtarget->getGeneration() >= AMDGPUSubtarget::GFX11">,
1482  AssemblerPredicate<(any_of FeatureGFX940Insts, FeatureGFX11Insts)>;
1483
1484def isGFX8GFX9NotGFX940 :
1485  Predicate<"!Subtarget->hasGFX940Insts() &&"
1486            "(Subtarget->getGeneration() == AMDGPUSubtarget::VOLCANIC_ISLANDS ||"
1487            " Subtarget->getGeneration() == AMDGPUSubtarget::GFX9)">,
1488  AssemblerPredicate<(all_of FeatureGFX8Insts, FeatureGCN3Encoding, (not FeatureGFX940Insts))>;
1489
1490def isGFX8GFX9 :
1491  Predicate<"Subtarget->getGeneration() == AMDGPUSubtarget::VOLCANIC_ISLANDS ||"
1492            "Subtarget->getGeneration() == AMDGPUSubtarget::GFX9">,
1493  AssemblerPredicate<(all_of FeatureGFX8Insts, FeatureGCN3Encoding)>;
1494
1495def isGFX10Only :
1496  Predicate<"Subtarget->getGeneration() == AMDGPUSubtarget::GFX10">,
1497  AssemblerPredicate<(all_of FeatureGFX10Insts, (not FeatureGFX11Insts))>;
1498
1499def isGFX10Plus :
1500  Predicate<"Subtarget->getGeneration() >= AMDGPUSubtarget::GFX10">,
1501  AssemblerPredicate<(all_of FeatureGFX10Insts)>;
1502
1503def isGFX10Before1030 :
1504  Predicate<"Subtarget->getGeneration() == AMDGPUSubtarget::GFX10 &&"
1505            "!Subtarget->hasGFX10_3Insts()">,
1506  AssemblerPredicate<(all_of FeatureGFX10Insts,(not FeatureGFX10_3Insts))>;
1507
1508def isGFX9GFX10 :
1509  Predicate<"Subtarget->getGeneration() == AMDGPUSubtarget::GFX9 ||"
1510            "Subtarget->getGeneration() == AMDGPUSubtarget::GFX10">,
1511  AssemblerPredicate<(all_of FeatureGFX9Insts, (not FeatureGFX11Insts))>;
1512
1513def isGFX8GFX9GFX10 :
1514  Predicate<"Subtarget->getGeneration() == AMDGPUSubtarget::VOLCANIC_ISLANDS ||"
1515            "Subtarget->getGeneration() == AMDGPUSubtarget::GFX9 ||"
1516            "Subtarget->getGeneration() == AMDGPUSubtarget::GFX10">,
1517  AssemblerPredicate<(all_of FeatureGFX8Insts, (not FeatureGFX11Insts))>;
1518
1519def isGFX11Only :
1520  Predicate<"Subtarget->getGeneration() == AMDGPUSubtarget::GFX11">,
1521  AssemblerPredicate<(all_of FeatureGFX11Insts)>;
1522
1523def isGFX11Plus :
1524  Predicate<"Subtarget->getGeneration() >= AMDGPUSubtarget::GFX11">,
1525  AssemblerPredicate<(all_of FeatureGFX11Insts)>;
1526
1527def HasFlatAddressSpace : Predicate<"Subtarget->hasFlatAddressSpace()">,
1528  AssemblerPredicate<(all_of FeatureFlatAddressSpace)>;
1529
1530def HasFlatGlobalInsts : Predicate<"Subtarget->hasFlatGlobalInsts()">,
1531  AssemblerPredicate<(all_of FeatureFlatGlobalInsts)>;
1532def HasFlatScratchInsts : Predicate<"Subtarget->hasFlatScratchInsts()">,
1533  AssemblerPredicate<(all_of FeatureFlatScratchInsts)>;
1534def HasScalarFlatScratchInsts : Predicate<"Subtarget->hasScalarFlatScratchInsts()">,
1535  AssemblerPredicate<(all_of FeatureScalarFlatScratchInsts)>;
1536def HasD16LoadStore : Predicate<"Subtarget->hasD16LoadStore()">,
1537  AssemblerPredicate<(all_of FeatureGFX9Insts)>;
1538
1539def HasFlatScratchSTMode : Predicate<"Subtarget->hasFlatScratchSTMode()">,
1540  AssemblerPredicate<(any_of FeatureGFX10_3Insts, FeatureGFX940Insts)>;
1541def HasFlatScratchSVSMode : Predicate<"Subtarget->hasFlatScratchSVSMode()">,
1542  AssemblerPredicate<(any_of FeatureGFX940Insts, FeatureGFX11Insts)>;
1543
1544def HasGFX10_AEncoding : Predicate<"Subtarget->hasGFX10_AEncoding()">,
1545  AssemblerPredicate<(all_of FeatureGFX10_AEncoding)>;
1546
1547def HasGFX10_BEncoding : Predicate<"Subtarget->hasGFX10_BEncoding()">,
1548  AssemblerPredicate<(all_of FeatureGFX10_BEncoding)>;
1549
1550def HasUnpackedD16VMem : Predicate<"Subtarget->hasUnpackedD16VMem()">,
1551  AssemblerPredicate<(all_of FeatureUnpackedD16VMem)>;
1552def HasPackedD16VMem : Predicate<"!Subtarget->hasUnpackedD16VMem()">,
1553  AssemblerPredicate<(all_of (not FeatureUnpackedD16VMem))>;
1554
1555def D16PreservesUnusedBits :
1556  Predicate<"Subtarget->d16PreservesUnusedBits()">,
1557  AssemblerPredicate<(all_of FeatureGFX9Insts, (not FeatureSRAMECC))>;
1558
1559def LDSRequiresM0Init : Predicate<"Subtarget->ldsRequiresM0Init()">;
1560def NotLDSRequiresM0Init : Predicate<"!Subtarget->ldsRequiresM0Init()">;
1561
1562def HasDSAddTid : Predicate<"Subtarget->getGeneration() >= AMDGPUSubtarget::GFX9">,
1563  AssemblerPredicate<(all_of FeatureGFX9Insts)>;
1564
1565def HasLDSFPAtomicAdd : Predicate<"Subtarget->hasLDSFPAtomicAdd()">,
1566  AssemblerPredicate<(all_of FeatureGFX8Insts)>;
1567
1568def HasAddNoCarryInsts : Predicate<"Subtarget->hasAddNoCarry()">,
1569  AssemblerPredicate<(all_of FeatureAddNoCarryInsts)>;
1570
1571def NotHasAddNoCarryInsts : Predicate<"!Subtarget->hasAddNoCarry()">;
1572
1573def Has16BitInsts : Predicate<"Subtarget->has16BitInsts()">,
1574  AssemblerPredicate<(all_of Feature16BitInsts)>;
1575
1576def HasTrue16BitInsts : Predicate<"Subtarget->hasTrue16BitInsts()">,
1577  AssemblerPredicate<(all_of FeatureTrue16BitInsts)>;
1578def NotHasTrue16BitInsts : Predicate<"!Subtarget->hasTrue16BitInsts()">;
1579
1580def HasVOP3PInsts : Predicate<"Subtarget->hasVOP3PInsts()">,
1581  AssemblerPredicate<(all_of FeatureVOP3P)>;
1582
1583def HasMinMaxDenormModes : Predicate<"Subtarget->supportsMinMaxDenormModes()">;
1584def NotHasMinMaxDenormModes : Predicate<"!Subtarget->supportsMinMaxDenormModes()">;
1585
1586def HasSDWA : Predicate<"Subtarget->hasSDWA()">,
1587  AssemblerPredicate<(all_of FeatureSDWA, FeatureVolcanicIslands)>;
1588
1589def HasSDWA9 :
1590  Predicate<"Subtarget->hasSDWA()">,
1591  AssemblerPredicate<(all_of FeatureGCN3Encoding, FeatureGFX9Insts,FeatureSDWA)>;
1592
1593def HasSDWA10 :
1594  Predicate<"Subtarget->hasSDWA()">,
1595  AssemblerPredicate<(all_of (not FeatureGCN3Encoding), FeatureGFX10Insts, FeatureSDWA)>;
1596
1597def HasDPP : Predicate<"Subtarget->hasDPP()">,
1598  AssemblerPredicate<(all_of FeatureGCN3Encoding, FeatureDPP)>;
1599
1600def HasDPP8 : Predicate<"Subtarget->hasDPP8()">,
1601  AssemblerPredicate<(all_of (not FeatureGCN3Encoding), FeatureGFX10Insts, FeatureDPP8)>;
1602
1603def Has64BitDPP : Predicate<"Subtarget->has64BitDPP()">,
1604  AssemblerPredicate<(all_of Feature64BitDPP)>;
1605
1606def HasPackedFP32Ops : Predicate<"Subtarget->hasPackedFP32Ops()">,
1607  AssemblerPredicate<(all_of FeaturePackedFP32Ops)>;
1608
1609def HasFmaakFmamkF32Insts :
1610  Predicate<"Subtarget->hasFmaakFmamkF32Insts()">,
1611  AssemblerPredicate<(any_of FeatureGFX10Insts, FeatureGFX940Insts)>;
1612
1613def HasImageInsts : Predicate<"Subtarget->hasImageInsts()">,
1614  AssemblerPredicate<(all_of FeatureImageInsts)>;
1615
1616def HasExtendedImageInsts : Predicate<"Subtarget->hasExtendedImageInsts()">,
1617  AssemblerPredicate<(all_of FeatureExtendedImageInsts)>;
1618
1619def HasR128A16 : Predicate<"Subtarget->hasR128A16()">,
1620  AssemblerPredicate<(all_of FeatureR128A16)>;
1621
1622def HasGFX10A16 : Predicate<"Subtarget->hasGFX10A16()">,
1623  AssemblerPredicate<(all_of FeatureGFX10A16)>;
1624
1625def HasG16 : Predicate<"Subtarget->hasG16()">,
1626  AssemblerPredicate<(all_of FeatureG16)>;
1627
1628def HasDPP16 : Predicate<"Subtarget->hasDPP()">,
1629  AssemblerPredicate<(all_of (not FeatureGCN3Encoding), FeatureGFX10Insts, FeatureDPP)>;
1630
1631def HasIntClamp : Predicate<"Subtarget->hasIntClamp()">,
1632  AssemblerPredicate<(all_of FeatureIntClamp)>;
1633
1634def HasMadMixInsts : Predicate<"Subtarget->hasMadMixInsts()">,
1635  AssemblerPredicate<(all_of FeatureMadMixInsts)>;
1636
1637def HasScalarStores : Predicate<"Subtarget->hasScalarStores()">,
1638  AssemblerPredicate<(all_of FeatureScalarStores)>;
1639
1640def HasScalarAtomics : Predicate<"Subtarget->hasScalarAtomics()">,
1641  AssemblerPredicate<(all_of FeatureScalarAtomics)>;
1642
1643def HasNoSdstCMPX : Predicate<"Subtarget->hasNoSdstCMPX()">,
1644  AssemblerPredicate<(all_of FeatureNoSdstCMPX)>;
1645
1646def HasSdstCMPX : Predicate<"!Subtarget->hasNoSdstCMPX()">,
1647  AssemblerPredicate<(all_of (not FeatureNoSdstCMPX))>;
1648
1649def has16BankLDS : Predicate<"Subtarget->getLDSBankCount() == 16">;
1650def has32BankLDS : Predicate<"Subtarget->getLDSBankCount() == 32">;
1651def HasVGPRIndexMode : Predicate<"Subtarget->hasVGPRIndexMode()">,
1652                      AssemblerPredicate<(all_of FeatureVGPRIndexMode)>;
1653def HasMovrel : Predicate<"Subtarget->hasMovrel()">,
1654                AssemblerPredicate<(all_of FeatureMovrel)>;
1655
1656def HasFmaMixInsts : Predicate<"Subtarget->hasFmaMixInsts()">,
1657  AssemblerPredicate<(all_of FeatureFmaMixInsts)>;
1658
1659def HasDLInsts : Predicate<"Subtarget->hasDLInsts()">,
1660  AssemblerPredicate<(all_of FeatureDLInsts)>;
1661
1662def HasDot1Insts : Predicate<"Subtarget->hasDot1Insts()">,
1663  AssemblerPredicate<(all_of FeatureDot1Insts)>;
1664
1665def HasDot2Insts : Predicate<"Subtarget->hasDot2Insts()">,
1666  AssemblerPredicate<(all_of FeatureDot2Insts)>;
1667
1668def HasDot3Insts : Predicate<"Subtarget->hasDot3Insts()">,
1669  AssemblerPredicate<(all_of FeatureDot3Insts)>;
1670
1671def HasDot4Insts : Predicate<"Subtarget->hasDot4Insts()">,
1672  AssemblerPredicate<(all_of FeatureDot4Insts)>;
1673
1674def HasDot5Insts : Predicate<"Subtarget->hasDot5Insts()">,
1675  AssemblerPredicate<(all_of FeatureDot5Insts)>;
1676
1677def HasDot6Insts : Predicate<"Subtarget->hasDot6Insts()">,
1678  AssemblerPredicate<(all_of FeatureDot6Insts)>;
1679
1680def HasDot7Insts : Predicate<"Subtarget->hasDot7Insts()">,
1681  AssemblerPredicate<(all_of FeatureDot7Insts)>;
1682
1683def HasDot8Insts : Predicate<"Subtarget->hasDot8Insts()">,
1684  AssemblerPredicate<(all_of FeatureDot8Insts)>;
1685
1686def HasGetWaveIdInst : Predicate<"Subtarget->hasGetWaveIdInst()">,
1687  AssemblerPredicate<(all_of FeatureGetWaveIdInst)>;
1688
1689def HasMAIInsts : Predicate<"Subtarget->hasMAIInsts()">,
1690  AssemblerPredicate<(all_of FeatureMAIInsts)>;
1691
1692def HasSMemRealTime : Predicate<"Subtarget->hasSMemRealTime()">,
1693  AssemblerPredicate<(all_of FeatureSMemRealTime)>;
1694
1695def HasSMemTimeInst : Predicate<"Subtarget->hasSMemTimeInst()">,
1696  AssemblerPredicate<(all_of FeatureSMemTimeInst)>;
1697
1698def HasShaderCyclesRegister : Predicate<"Subtarget->hasShaderCyclesRegister()">,
1699  AssemblerPredicate<(all_of FeatureShaderCyclesRegister)>;
1700
1701def HasPkFmacF16Inst : Predicate<"Subtarget->hasPkFmacF16Inst()">,
1702  AssemblerPredicate<(all_of FeaturePkFmacF16Inst)>;
1703
1704def HasMadMacF32Insts : Predicate<"Subtarget->hasMadMacF32Insts()">,
1705  AssemblerPredicate<(all_of FeatureMadMacF32Insts)>;
1706
1707def HasFmaLegacy32 : Predicate<"Subtarget->hasGFX10_3Insts()">,
1708  AssemblerPredicate<(any_of FeatureGFX10_3Insts)>;
1709
1710def HasAtomicFaddRtnInsts : Predicate<"Subtarget->hasAtomicFaddRtnInsts()">,
1711  AssemblerPredicate<(all_of FeatureAtomicFaddRtnInsts)>;
1712def HasAtomicFaddNoRtnInsts : Predicate<"Subtarget->hasAtomicFaddNoRtnInsts()">,
1713  AssemblerPredicate<(all_of FeatureAtomicFaddNoRtnInsts)>;
1714def HasAtomicPkFaddNoRtnInsts
1715  : Predicate<"Subtarget->hasAtomicPkFaddNoRtnInsts()">,
1716  AssemblerPredicate<(all_of FeatureAtomicPkFaddNoRtnInsts)>;
1717
1718def HasDsSrc2Insts : Predicate<"!Subtarget->hasDsSrc2Insts()">,
1719  AssemblerPredicate<(all_of FeatureDsSrc2Insts)>;
1720
1721def EnableLateCFGStructurize : Predicate<
1722  "EnableLateStructurizeCFG">;
1723
1724def EnableFlatScratch : Predicate<"Subtarget->enableFlatScratch()">;
1725
1726def DisableFlatScratch : Predicate<"!Subtarget->enableFlatScratch()">;
1727
1728def HasUnalignedAccessMode : Predicate<"Subtarget->hasUnalignedAccessMode()">,
1729  AssemblerPredicate<(all_of FeatureUnalignedAccessMode)>;
1730
1731// Include AMDGPU TD files
1732include "SISchedule.td"
1733include "GCNProcessors.td"
1734include "AMDGPUInstrInfo.td"
1735include "SIRegisterInfo.td"
1736include "AMDGPURegisterBanks.td"
1737include "AMDGPUInstructions.td"
1738include "SIInstrInfo.td"
1739include "AMDGPUCallingConv.td"
1740include "AMDGPUSearchableTables.td"
1741