@@ -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
@@ -1751,8 +1748,8 @@ let OtherPredicates = [isGFX6GFX7GFX10Plus] in {
1751
1748
defm : SIBufferAtomicPat<"SIbuffer_atomic_fmax", f32, "BUFFER_ATOMIC_FMAX">;
1752
1749
}
1753
1750
let SubtargetPredicate = isGFX6GFX7GFX10 in {
1754
- defm : SIBufferAtomicPat<"SIbuffer_atomic_fmin", f64, "BUFFER_ATOMIC_FMIN_X2 ">;
1755
- defm : SIBufferAtomicPat<"SIbuffer_atomic_fmax", f64, "BUFFER_ATOMIC_FMAX_X2 ">;
1751
+ defm : SIBufferAtomicPat<"SIbuffer_atomic_fmin", f64, "BUFFER_ATOMIC_MIN_F64 ">;
1752
+ defm : SIBufferAtomicPat<"SIbuffer_atomic_fmax", f64, "BUFFER_ATOMIC_MAX_F64 ">;
1756
1753
}
1757
1754
1758
1755
class NoUseBufferAtomic<SDPatternOperator Op, ValueType vt> : PatFrag <
@@ -2303,6 +2300,12 @@ let OtherPredicates = [HasPackedD16VMem] in {
2303
2300
// Target-specific instruction encodings.
2304
2301
//===----------------------------------------------------------------------===//
2305
2302
2303
+ // Shortcut to default Mnemonic from BUF_Pseudo. Hides the cast to the
2304
+ // specific pseudo (bothen in this case) since any of them will work.
2305
+ class get_BUF_ps<string name> {
2306
+ string Mnemonic = !cast<BUF_Pseudo>(name # "_OFFSET").Mnemonic;
2307
+ }
2308
+
2306
2309
//===----------------------------------------------------------------------===//
2307
2310
// Base ENC_MUBUF for GFX6, GFX7, GFX10, GFX11.
2308
2311
//===----------------------------------------------------------------------===//
@@ -2334,8 +2337,8 @@ multiclass MUBUF_Real_gfx11<bits<8> op, string real_name = !cast<MUBUF_Pseudo>(N
2334
2337
}
2335
2338
}
2336
2339
2337
- class Base_MUBUF_Real_gfx6_gfx7_gfx10<bits<7> op, MUBUF_Pseudo ps, int ef> :
2338
- Base_MUBUF_Real_gfx6_gfx7_gfx10_gfx11<ps, ef> {
2340
+ class Base_MUBUF_Real_gfx6_gfx7_gfx10<bits<7> op, MUBUF_Pseudo ps, int ef, string asmName > :
2341
+ Base_MUBUF_Real_gfx6_gfx7_gfx10_gfx11<ps, ef, asmName > {
2339
2342
let Inst{12} = ps.offen;
2340
2343
let Inst{13} = ps.idxen;
2341
2344
let Inst{14} = !if(ps.has_glc, cpol{CPolBit.GLC}, ps.glc_value);
@@ -2345,19 +2348,21 @@ class Base_MUBUF_Real_gfx6_gfx7_gfx10<bits<7> op, MUBUF_Pseudo ps, int ef> :
2345
2348
let Inst{55} = ps.tfe;
2346
2349
}
2347
2350
2348
- multiclass MUBUF_Real_gfx10<bits<8> op> {
2349
- defvar ps = !cast<MUBUF_Pseudo>(NAME);
2350
- def _gfx10 : Base_MUBUF_Real_gfx6_gfx7_gfx10<op{6-0}, ps, SIEncodingFamily.GFX10> {
2351
+ multiclass MUBUF_Real_gfx10<bits<8> op, string psName = NAME,
2352
+ string asmName = !cast<MUBUF_Pseudo>(psName).Mnemonic> {
2353
+ defvar ps = !cast<MUBUF_Pseudo>(psName);
2354
+ def _gfx10 : Base_MUBUF_Real_gfx6_gfx7_gfx10<op{6-0}, ps, SIEncodingFamily.GFX10, asmName> {
2351
2355
let Inst{15} = !if(ps.has_dlc, cpol{CPolBit.DLC}, ps.dlc_value);
2352
2356
let Inst{25} = op{7};
2353
2357
let AssemblerPredicate = isGFX10Only;
2354
2358
let DecoderNamespace = "GFX10";
2355
2359
}
2356
2360
}
2357
2361
2358
- multiclass MUBUF_Real_gfx6_gfx7<bits<8> op> {
2359
- defvar ps = !cast<MUBUF_Pseudo>(NAME);
2360
- def _gfx6_gfx7 : Base_MUBUF_Real_gfx6_gfx7_gfx10<op{6-0}, ps, SIEncodingFamily.SI> {
2362
+ multiclass MUBUF_Real_gfx6_gfx7<bits<8> op, string psName = NAME,
2363
+ string asmName = !cast<MUBUF_Pseudo>(psName).Mnemonic> {
2364
+ defvar ps = !cast<MUBUF_Pseudo>(psName);
2365
+ def _gfx6_gfx7 : Base_MUBUF_Real_gfx6_gfx7_gfx10<op{6-0}, ps, SIEncodingFamily.SI, asmName> {
2361
2366
let Inst{15} = ps.addr64;
2362
2367
let AssemblerPredicate = isGFX6GFX7;
2363
2368
let DecoderNamespace = "GFX6GFX7";
@@ -2366,7 +2371,7 @@ multiclass MUBUF_Real_gfx6_gfx7<bits<8> op> {
2366
2371
2367
2372
multiclass MUBUF_Real_gfx6<bits<8> op> {
2368
2373
defvar ps = !cast<MUBUF_Pseudo>(NAME);
2369
- def _gfx6 : Base_MUBUF_Real_gfx6_gfx7_gfx10<op{6-0}, ps, SIEncodingFamily.SI> {
2374
+ def _gfx6 : Base_MUBUF_Real_gfx6_gfx7_gfx10<op{6-0}, ps, SIEncodingFamily.SI, ps.Mnemonic > {
2370
2375
let Inst{15} = ps.addr64;
2371
2376
let AssemblerPredicate = isGFX6;
2372
2377
let DecoderNamespace = "GFX6";
@@ -2375,7 +2380,7 @@ multiclass MUBUF_Real_gfx6<bits<8> op> {
2375
2380
2376
2381
multiclass MUBUF_Real_gfx7<bits<8> op> {
2377
2382
defvar ps = !cast<MUBUF_Pseudo>(NAME);
2378
- def _gfx7 : Base_MUBUF_Real_gfx6_gfx7_gfx10<op{6-0}, ps, SIEncodingFamily.SI> {
2383
+ def _gfx7 : Base_MUBUF_Real_gfx6_gfx7_gfx10<op{6-0}, ps, SIEncodingFamily.SI, ps.Mnemonic > {
2379
2384
let Inst{15} = ps.addr64;
2380
2385
let AssemblerPredicate = isGFX7Only;
2381
2386
let DecoderNamespace = "GFX7";
@@ -2476,12 +2481,6 @@ multiclass VBUFFER_MTBUF_Real_gfx12<bits<4> op, string real_name> {
2476
2481
// MUBUF - GFX11, GFX12.
2477
2482
//===----------------------------------------------------------------------===//
2478
2483
2479
- // Shortcut to default Mnemonic from BUF_Pseudo. Hides the cast to the
2480
- // specific pseudo (bothen in this case) since any of them will work.
2481
- class get_BUF_ps<string name> {
2482
- string Mnemonic = !cast<BUF_Pseudo>(name # "_BOTHEN").Mnemonic;
2483
- }
2484
-
2485
2484
// gfx11 instruction that accept both old and new assembler name.
2486
2485
class Mnem_gfx11_gfx12 <string mnemonic, string real_name> :
2487
2486
AMDGPUMnemonicAlias<mnemonic, real_name> {
@@ -2703,18 +2702,20 @@ multiclass MUBUF_Real_AllAddr_Lds_gfx10<bits<8> op, bit isTFE = 0> {
2703
2702
defm _LDS_BOTHEN : MUBUF_Real_gfx10<op>;
2704
2703
}
2705
2704
}
2706
- multiclass MUBUF_Real_Atomics_RTN_gfx10<bits<8> op> {
2707
- defm _BOTHEN_RTN : MUBUF_Real_gfx10<op>;
2708
- defm _IDXEN_RTN : MUBUF_Real_gfx10<op>;
2709
- defm _OFFEN_RTN : MUBUF_Real_gfx10<op>;
2710
- defm _OFFSET_RTN : MUBUF_Real_gfx10<op>;
2705
+ multiclass MUBUF_Real_Atomics_RTN_gfx10<bits<8> op, string psName = NAME,
2706
+ string asmName = !cast<MUBUF_Pseudo>(psName).Mnemonic> {
2707
+ defm _BOTHEN_RTN : MUBUF_Real_gfx10<op, psName#"_BOTHEN_RTN", asmName>;
2708
+ defm _IDXEN_RTN : MUBUF_Real_gfx10<op, psName#"_IDXEN_RTN", asmName>;
2709
+ defm _OFFEN_RTN : MUBUF_Real_gfx10<op, psName#"_OFFEN_RTN", asmName>;
2710
+ defm _OFFSET_RTN : MUBUF_Real_gfx10<op, psName#"_OFFSET_RTN", asmName>;
2711
2711
}
2712
- multiclass MUBUF_Real_Atomics_gfx10<bits<8> op> :
2713
- MUBUF_Real_Atomics_RTN_gfx10<op> {
2714
- defm _BOTHEN : MUBUF_Real_gfx10<op>;
2715
- defm _IDXEN : MUBUF_Real_gfx10<op>;
2716
- defm _OFFEN : MUBUF_Real_gfx10<op>;
2717
- defm _OFFSET : MUBUF_Real_gfx10<op>;
2712
+ multiclass MUBUF_Real_Atomics_gfx10<bits<8> op, string psName = NAME,
2713
+ string asmName = get_BUF_ps<psName>.Mnemonic> :
2714
+ MUBUF_Real_Atomics_RTN_gfx10<op, psName, asmName> {
2715
+ defm _BOTHEN : MUBUF_Real_gfx10<op, psName#"_BOTHEN", asmName>;
2716
+ defm _IDXEN : MUBUF_Real_gfx10<op, psName#"_IDXEN", asmName>;
2717
+ defm _OFFEN : MUBUF_Real_gfx10<op, psName#"_OFFEN", asmName>;
2718
+ defm _OFFSET : MUBUF_Real_gfx10<op, psName#"_OFFSET", asmName>;
2718
2719
}
2719
2720
2720
2721
defm BUFFER_STORE_BYTE_D16_HI : MUBUF_Real_AllAddr_gfx10<0x019>;
@@ -2769,18 +2770,18 @@ multiclass MUBUF_Real_AllAddr_Lds_gfx6_gfx7<bits<8> op, bit isTFE = 0> {
2769
2770
defm _LDS_BOTHEN : MUBUF_Real_gfx6_gfx7<op>;
2770
2771
}
2771
2772
}
2772
- multiclass MUBUF_Real_Atomics_gfx6_gfx7<bits<8> op> {
2773
- defm _ADDR64 : MUBUF_Real_gfx6_gfx7<op>;
2774
- defm _BOTHEN : MUBUF_Real_gfx6_gfx7<op>;
2775
- defm _IDXEN : MUBUF_Real_gfx6_gfx7<op>;
2776
- defm _OFFEN : MUBUF_Real_gfx6_gfx7<op>;
2777
- defm _OFFSET : MUBUF_Real_gfx6_gfx7<op>;
2773
+ multiclass MUBUF_Real_Atomics_gfx6_gfx7<bits<8> op, string psName, string asmName > {
2774
+ defm _ADDR64 : MUBUF_Real_gfx6_gfx7<op, psName#"_ADDR64", asmName >;
2775
+ defm _BOTHEN : MUBUF_Real_gfx6_gfx7<op, psName#"_BOTHEN", asmName >;
2776
+ defm _IDXEN : MUBUF_Real_gfx6_gfx7<op, psName#"_IDXEN", asmName >;
2777
+ defm _OFFEN : MUBUF_Real_gfx6_gfx7<op, psName#"_OFFEN", asmName >;
2778
+ defm _OFFSET : MUBUF_Real_gfx6_gfx7<op, psName#"_OFFSET", asmName >;
2778
2779
2779
- defm _ADDR64_RTN : MUBUF_Real_gfx6_gfx7<op>;
2780
- defm _BOTHEN_RTN : MUBUF_Real_gfx6_gfx7<op>;
2781
- defm _IDXEN_RTN : MUBUF_Real_gfx6_gfx7<op>;
2782
- defm _OFFEN_RTN : MUBUF_Real_gfx6_gfx7<op>;
2783
- defm _OFFSET_RTN : MUBUF_Real_gfx6_gfx7<op>;
2780
+ defm _ADDR64_RTN : MUBUF_Real_gfx6_gfx7<op, psName#"_ADDR64_RTN", asmName >;
2781
+ defm _BOTHEN_RTN : MUBUF_Real_gfx6_gfx7<op, psName#"_BOTHEN_RTN", asmName >;
2782
+ defm _IDXEN_RTN : MUBUF_Real_gfx6_gfx7<op, psName#"_IDXEN_RTN", asmName >;
2783
+ defm _OFFEN_RTN : MUBUF_Real_gfx6_gfx7<op, psName#"_OFFEN_RTN", asmName >;
2784
+ defm _OFFSET_RTN : MUBUF_Real_gfx6_gfx7<op, psName#"_OFFSET_RTN", asmName >;
2784
2785
}
2785
2786
2786
2787
multiclass MUBUF_Real_AllAddr_gfx6_gfx7_gfx10<bits<8> op> :
@@ -2795,8 +2796,10 @@ multiclass MUBUF_Real_AllAddr_Lds_gfx6_gfx7_gfx10<bits<8> op> {
2795
2796
defm _TFE : MUBUF_Real_AllAddr_Lds_Helper_gfx6_gfx7_gfx10<op, 1>;
2796
2797
}
2797
2798
2798
- multiclass MUBUF_Real_Atomics_gfx6_gfx7_gfx10<bits<8> op> :
2799
- MUBUF_Real_Atomics_gfx6_gfx7<op>, MUBUF_Real_Atomics_gfx10<op>;
2799
+ multiclass MUBUF_Real_Atomics_gfx6_gfx7_gfx10<bits<8> op, string psName = NAME,
2800
+ string asmName = get_BUF_ps<psName>.Mnemonic> :
2801
+ MUBUF_Real_Atomics_gfx6_gfx7<op, psName, asmName>,
2802
+ MUBUF_Real_Atomics_gfx10<op, psName, asmName>;
2800
2803
2801
2804
// FIXME-GFX6: Following instructions are available only on GFX6.
2802
2805
//defm BUFFER_ATOMIC_RSUB : MUBUF_Real_Atomics_gfx6 <0x034>;
@@ -2856,8 +2859,8 @@ defm BUFFER_ATOMIC_INC_X2 : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x05c>;
2856
2859
defm BUFFER_ATOMIC_DEC_X2 : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x05d>;
2857
2860
// FIXME-GFX7: Need to handle hazard for BUFFER_ATOMIC_FCMPSWAP_X2 on GFX7.
2858
2861
defm BUFFER_ATOMIC_FCMPSWAP_X2 : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x05e>;
2859
- defm BUFFER_ATOMIC_FMIN_X2 : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x05f>;
2860
- defm BUFFER_ATOMIC_FMAX_X2 : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x060>;
2862
+ defm BUFFER_ATOMIC_FMIN_X2 : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x05f, "BUFFER_ATOMIC_MIN_F64", "buffer_atomic_fmin_x2" >;
2863
+ defm BUFFER_ATOMIC_FMAX_X2 : MUBUF_Real_Atomics_gfx6_gfx7_gfx10<0x060, "BUFFER_ATOMIC_MAX_F64", "buffer_atomic_fmax_x2" >;
2861
2864
2862
2865
defm BUFFER_ATOMIC_CSUB : MUBUF_Real_Atomics_gfx10<0x034>;
2863
2866
0 commit comments