@@ -1163,12 +1163,6 @@ let SubtargetPredicate = isGFX6GFX7GFX10 in {
1163
1163
defm BUFFER_ATOMIC_FCMPSWAP_X2 : MUBUF_Pseudo_Atomics <
1164
1164
"buffer_atomic_fcmpswap_x2", VReg_128, v2f64, null_frag
1165
1165
>;
1166
- defm BUFFER_ATOMIC_FMIN_X2 : MUBUF_Pseudo_Atomics <
1167
- "buffer_atomic_fmin_x2", VReg_64, f64, null_frag
1168
- >;
1169
- defm BUFFER_ATOMIC_FMAX_X2 : MUBUF_Pseudo_Atomics <
1170
- "buffer_atomic_fmax_x2", VReg_64, f64, null_frag
1171
- >;
1172
1166
1173
1167
}
1174
1168
@@ -1318,6 +1312,9 @@ let SubtargetPredicate = isGFX90APlus in {
1318
1312
1319
1313
let SubtargetPredicate = HasBufferFlatGlobalAtomicsF64 in {
1320
1314
defm BUFFER_ATOMIC_ADD_F64 : MUBUF_Pseudo_Atomics<"buffer_atomic_add_f64", VReg_64, f64>;
1315
+
1316
+ // Note the names can be buffer_atomic_fmin_x2/buffer_atomic_fmax_x2
1317
+ // depending on some subtargets.
1321
1318
defm BUFFER_ATOMIC_MIN_F64 : MUBUF_Pseudo_Atomics<"buffer_atomic_min_f64", VReg_64, f64>;
1322
1319
defm BUFFER_ATOMIC_MAX_F64 : MUBUF_Pseudo_Atomics<"buffer_atomic_max_f64", VReg_64, f64>;
1323
1320
} // End SubtargetPredicate = HasBufferFlatGlobalAtomicsF64
@@ -1763,8 +1760,8 @@ let OtherPredicates = [isGFX6GFX7GFX10Plus] in {
1763
1760
defm : SIBufferAtomicPat<"SIbuffer_atomic_fmax", f32, "BUFFER_ATOMIC_FMAX">;
1764
1761
}
1765
1762
let SubtargetPredicate = isGFX6GFX7GFX10 in {
1766
- defm : SIBufferAtomicPat<"SIbuffer_atomic_fmin", f64, "BUFFER_ATOMIC_FMIN_X2 ">;
1767
- defm : SIBufferAtomicPat<"SIbuffer_atomic_fmax", f64, "BUFFER_ATOMIC_FMAX_X2 ">;
1763
+ defm : SIBufferAtomicPat<"SIbuffer_atomic_fmin", f64, "BUFFER_ATOMIC_MIN_F64 ">;
1764
+ defm : SIBufferAtomicPat<"SIbuffer_atomic_fmax", f64, "BUFFER_ATOMIC_MAX_F64 ">;
1768
1765
}
1769
1766
1770
1767
class NoUseBufferAtomic<SDPatternOperator Op, ValueType vt> : PatFrag <
@@ -2315,6 +2312,12 @@ let OtherPredicates = [HasPackedD16VMem] in {
2315
2312
// Target-specific instruction encodings.
2316
2313
//===----------------------------------------------------------------------===//
2317
2314
2315
+ // Shortcut to default Mnemonic from BUF_Pseudo. Hides the cast to the
2316
+ // specific pseudo (bothen in this case) since any of them will work.
2317
+ class get_BUF_ps<string name> {
2318
+ string Mnemonic = !cast<BUF_Pseudo>(name # "_OFFSET").Mnemonic;
2319
+ }
2320
+
2318
2321
//===----------------------------------------------------------------------===//
2319
2322
// Base ENC_MUBUF for GFX6, GFX7, GFX10, GFX11.
2320
2323
//===----------------------------------------------------------------------===//
@@ -2346,8 +2349,8 @@ multiclass MUBUF_Real_gfx11<bits<8> op, string real_name = !cast<MUBUF_Pseudo>(N
2346
2349
}
2347
2350
}
2348
2351
2349
- class Base_MUBUF_Real_gfx6_gfx7_gfx10<bits<7> op, MUBUF_Pseudo ps, int ef> :
2350
- Base_MUBUF_Real_gfx6_gfx7_gfx10_gfx11<ps, ef> {
2352
+ class Base_MUBUF_Real_gfx6_gfx7_gfx10<bits<7> op, MUBUF_Pseudo ps, int ef, string asmName > :
2353
+ Base_MUBUF_Real_gfx6_gfx7_gfx10_gfx11<ps, ef, asmName > {
2351
2354
let Inst{12} = ps.offen;
2352
2355
let Inst{13} = ps.idxen;
2353
2356
let Inst{14} = !if(ps.has_glc, cpol{CPolBit.GLC}, ps.glc_value);
@@ -2357,19 +2360,21 @@ class Base_MUBUF_Real_gfx6_gfx7_gfx10<bits<7> op, MUBUF_Pseudo ps, int ef> :
2357
2360
let Inst{55} = ps.tfe;
2358
2361
}
2359
2362
2360
- multiclass MUBUF_Real_gfx10<bits<8> op> {
2361
- defvar ps = !cast<MUBUF_Pseudo>(NAME);
2362
- def _gfx10 : Base_MUBUF_Real_gfx6_gfx7_gfx10<op{6-0}, ps, SIEncodingFamily.GFX10> {
2363
+ multiclass MUBUF_Real_gfx10<bits<8> op, string psName = NAME,
2364
+ string asmName = !cast<MUBUF_Pseudo>(psName).Mnemonic> {
2365
+ defvar ps = !cast<MUBUF_Pseudo>(psName);
2366
+ def _gfx10 : Base_MUBUF_Real_gfx6_gfx7_gfx10<op{6-0}, ps, SIEncodingFamily.GFX10, asmName> {
2363
2367
let Inst{15} = !if(ps.has_dlc, cpol{CPolBit.DLC}, ps.dlc_value);
2364
2368
let Inst{25} = op{7};
2365
2369
let AssemblerPredicate = isGFX10Only;
2366
2370
let DecoderNamespace = "GFX10";
2367
2371
}
2368
2372
}
2369
2373
2370
- multiclass MUBUF_Real_gfx6_gfx7<bits<8> op> {
2371
- defvar ps = !cast<MUBUF_Pseudo>(NAME);
2372
- def _gfx6_gfx7 : Base_MUBUF_Real_gfx6_gfx7_gfx10<op{6-0}, ps, SIEncodingFamily.SI> {
2374
+ multiclass MUBUF_Real_gfx6_gfx7<bits<8> op, string psName = NAME,
2375
+ string asmName = !cast<MUBUF_Pseudo>(psName).Mnemonic> {
2376
+ defvar ps = !cast<MUBUF_Pseudo>(psName);
2377
+ def _gfx6_gfx7 : Base_MUBUF_Real_gfx6_gfx7_gfx10<op{6-0}, ps, SIEncodingFamily.SI, asmName> {
2373
2378
let Inst{15} = ps.addr64;
2374
2379
let AssemblerPredicate = isGFX6GFX7;
2375
2380
let DecoderNamespace = "GFX6GFX7";
@@ -2378,7 +2383,7 @@ multiclass MUBUF_Real_gfx6_gfx7<bits<8> op> {
2378
2383
2379
2384
multiclass MUBUF_Real_gfx6<bits<8> op> {
2380
2385
defvar ps = !cast<MUBUF_Pseudo>(NAME);
2381
- def _gfx6 : Base_MUBUF_Real_gfx6_gfx7_gfx10<op{6-0}, ps, SIEncodingFamily.SI> {
2386
+ def _gfx6 : Base_MUBUF_Real_gfx6_gfx7_gfx10<op{6-0}, ps, SIEncodingFamily.SI, ps.Mnemonic > {
2382
2387
let Inst{15} = ps.addr64;
2383
2388
let AssemblerPredicate = isGFX6;
2384
2389
let DecoderNamespace = "GFX6";
@@ -2387,7 +2392,7 @@ multiclass MUBUF_Real_gfx6<bits<8> op> {
2387
2392
2388
2393
multiclass MUBUF_Real_gfx7<bits<8> op> {
2389
2394
defvar ps = !cast<MUBUF_Pseudo>(NAME);
2390
- def _gfx7 : Base_MUBUF_Real_gfx6_gfx7_gfx10<op{6-0}, ps, SIEncodingFamily.SI> {
2395
+ def _gfx7 : Base_MUBUF_Real_gfx6_gfx7_gfx10<op{6-0}, ps, SIEncodingFamily.SI, ps.Mnemonic > {
2391
2396
let Inst{15} = ps.addr64;
2392
2397
let AssemblerPredicate = isGFX7Only;
2393
2398
let DecoderNamespace = "GFX7";
@@ -2488,12 +2493,6 @@ multiclass VBUFFER_MTBUF_Real_gfx12<bits<4> op, string real_name> {
2488
2493
// MUBUF - GFX11, GFX12.
2489
2494
//===----------------------------------------------------------------------===//
2490
2495
2491
- // Shortcut to default Mnemonic from BUF_Pseudo. Hides the cast to the
2492
- // specific pseudo (bothen in this case) since any of them will work.
2493
- class get_BUF_ps<string name> {
2494
- string Mnemonic = !cast<BUF_Pseudo>(name # "_BOTHEN").Mnemonic;
2495
- }
2496
-
2497
2496
// gfx11 instruction that accept both old and new assembler name.
2498
2497
class Mnem_gfx11_gfx12 <string mnemonic, string real_name> :
2499
2498
AMDGPUMnemonicAlias<mnemonic, real_name> {
@@ -2715,18 +2714,20 @@ multiclass MUBUF_Real_AllAddr_Lds_gfx10<bits<8> op, bit isTFE = 0> {
2715
2714
defm _LDS_BOTHEN : MUBUF_Real_gfx10<op>;
2716
2715
}
2717
2716
}
2718
- multiclass MUBUF_Real_Atomics_RTN_gfx10<bits<8> op> {
2719
- defm _BOTHEN_RTN : MUBUF_Real_gfx10<op>;
2720
- defm _IDXEN_RTN : MUBUF_Real_gfx10<op>;
2721
- defm _OFFEN_RTN : MUBUF_Real_gfx10<op>;
2722
- defm _OFFSET_RTN : MUBUF_Real_gfx10<op>;
2717
+ multiclass MUBUF_Real_Atomics_RTN_gfx10<bits<8> op, string psName = NAME,
2718
+ string asmName = !cast<MUBUF_Pseudo>(psName).Mnemonic> {
2719
+ defm _BOTHEN_RTN : MUBUF_Real_gfx10<op, psName#"_BOTHEN_RTN", asmName>;
2720
+ defm _IDXEN_RTN : MUBUF_Real_gfx10<op, psName#"_IDXEN_RTN", asmName>;
2721
+ defm _OFFEN_RTN : MUBUF_Real_gfx10<op, psName#"_OFFEN_RTN", asmName>;
2722
+ defm _OFFSET_RTN : MUBUF_Real_gfx10<op, psName#"_OFFSET_RTN", asmName>;
2723
2723
}
2724
- multiclass MUBUF_Real_Atomics_gfx10<bits<8> op> :
2725
- MUBUF_Real_Atomics_RTN_gfx10<op> {
2726
- defm _BOTHEN : MUBUF_Real_gfx10<op>;
2727
- defm _IDXEN : MUBUF_Real_gfx10<op>;
2728
- defm _OFFEN : MUBUF_Real_gfx10<op>;
2729
- defm _OFFSET : MUBUF_Real_gfx10<op>;
2724
+ multiclass MUBUF_Real_Atomics_gfx10<bits<8> op, string psName = NAME,
2725
+ string asmName = get_BUF_ps<psName>.Mnemonic> :
2726
+ MUBUF_Real_Atomics_RTN_gfx10<op, psName, asmName> {
2727
+ defm _BOTHEN : MUBUF_Real_gfx10<op, psName#"_BOTHEN", asmName>;
2728
+ defm _IDXEN : MUBUF_Real_gfx10<op, psName#"_IDXEN", asmName>;
2729
+ defm _OFFEN : MUBUF_Real_gfx10<op, psName#"_OFFEN", asmName>;
2730
+ defm _OFFSET : MUBUF_Real_gfx10<op, psName#"_OFFSET", asmName>;
2730
2731
}
2731
2732
2732
2733
defm BUFFER_STORE_BYTE_D16_HI : MUBUF_Real_AllAddr_gfx10<0x019>;
@@ -2781,18 +2782,18 @@ multiclass MUBUF_Real_AllAddr_Lds_gfx6_gfx7<bits<8> op, bit isTFE = 0> {
2781
2782
defm _LDS_BOTHEN : MUBUF_Real_gfx6_gfx7<op>;
2782
2783
}
2783
2784
}
2784
- multiclass MUBUF_Real_Atomics_gfx6_gfx7<bits<8> op> {
2785
- defm _ADDR64 : MUBUF_Real_gfx6_gfx7<op>;
2786
- defm _BOTHEN : MUBUF_Real_gfx6_gfx7<op>;
2787
- defm _IDXEN : MUBUF_Real_gfx6_gfx7<op>;
2788
- defm _OFFEN : MUBUF_Real_gfx6_gfx7<op>;
2789
- defm _OFFSET : MUBUF_Real_gfx6_gfx7<op>;
2785
+ multiclass MUBUF_Real_Atomics_gfx6_gfx7<bits<8> op, string psName, string asmName > {
2786
+ defm _ADDR64 : MUBUF_Real_gfx6_gfx7<op, psName#"_ADDR64", asmName >;
2787
+ defm _BOTHEN : MUBUF_Real_gfx6_gfx7<op, psName#"_BOTHEN", asmName >;
2788
+ defm _IDXEN : MUBUF_Real_gfx6_gfx7<op, psName#"_IDXEN", asmName >;
2789
+ defm _OFFEN : MUBUF_Real_gfx6_gfx7<op, psName#"_OFFEN", asmName >;
2790
+ defm _OFFSET : MUBUF_Real_gfx6_gfx7<op, psName#"_OFFSET", asmName >;
2790
2791
2791
- defm _ADDR64_RTN : MUBUF_Real_gfx6_gfx7<op>;
2792
- defm _BOTHEN_RTN : MUBUF_Real_gfx6_gfx7<op>;
2793
- defm _IDXEN_RTN : MUBUF_Real_gfx6_gfx7<op>;
2794
- defm _OFFEN_RTN : MUBUF_Real_gfx6_gfx7<op>;
2795
- defm _OFFSET_RTN : MUBUF_Real_gfx6_gfx7<op>;
2792
+ defm _ADDR64_RTN : MUBUF_Real_gfx6_gfx7<op, psName#"_ADDR64_RTN", asmName >;
2793
+ defm _BOTHEN_RTN : MUBUF_Real_gfx6_gfx7<op, psName#"_BOTHEN_RTN", asmName >;
2794
+ defm _IDXEN_RTN : MUBUF_Real_gfx6_gfx7<op, psName#"_IDXEN_RTN", asmName >;
2795
+ defm _OFFEN_RTN : MUBUF_Real_gfx6_gfx7<op, psName#"_OFFEN_RTN", asmName >;
2796
+ defm _OFFSET_RTN : MUBUF_Real_gfx6_gfx7<op, psName#"_OFFSET_RTN", asmName >;
2796
2797
}
2797
2798
2798
2799
multiclass MUBUF_Real_AllAddr_gfx6_gfx7_gfx10<bits<8> op> :
@@ -2807,8 +2808,10 @@ multiclass MUBUF_Real_AllAddr_Lds_gfx6_gfx7_gfx10<bits<8> op> {
2807
2808
defm _TFE : MUBUF_Real_AllAddr_Lds_Helper_gfx6_gfx7_gfx10<op, 1>;
2808
2809
}
2809
2810
2810
- multiclass MUBUF_Real_Atomics_gfx6_gfx7_gfx10<bits<8> op> :
2811
- MUBUF_Real_Atomics_gfx6_gfx7<op>, MUBUF_Real_Atomics_gfx10<op>;
2811
+ multiclass MUBUF_Real_Atomics_gfx6_gfx7_gfx10<bits<8> op, string psName = NAME,
2812
+ string asmName = get_BUF_ps<psName>.Mnemonic> :
2813
+ MUBUF_Real_Atomics_gfx6_gfx7<op, psName, asmName>,
2814
+ MUBUF_Real_Atomics_gfx10<op, psName, asmName>;
2812
2815
2813
2816
// FIXME-GFX6: Following instructions are available only on GFX6.
2814
2817
//defm BUFFER_ATOMIC_RSUB : MUBUF_Real_Atomics_gfx6 <0x034>;
@@ -2868,8 +2871,8 @@ defm BUFFER_ATOMIC_INC_X2 : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x05c>;
2868
2871
defm BUFFER_ATOMIC_DEC_X2 : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x05d>;
2869
2872
// FIXME-GFX7: Need to handle hazard for BUFFER_ATOMIC_FCMPSWAP_X2 on GFX7.
2870
2873
defm BUFFER_ATOMIC_FCMPSWAP_X2 : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x05e>;
2871
- defm BUFFER_ATOMIC_FMIN_X2 : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x05f>;
2872
- defm BUFFER_ATOMIC_FMAX_X2 : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x060>;
2874
+ defm BUFFER_ATOMIC_FMIN_X2 : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x05f, "BUFFER_ATOMIC_MIN_F64", "buffer_atomic_fmin_x2" >;
2875
+ defm BUFFER_ATOMIC_FMAX_X2 : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x060, "BUFFER_ATOMIC_MAX_F64", "buffer_atomic_fmax_x2" >;
2873
2876
2874
2877
defm BUFFER_ATOMIC_CSUB : MUBUF_Real_Atomics_gfx10<0x034>;
2875
2878
0 commit comments