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