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