@@ -205,13 +205,13 @@ class GlobalSaddrTable <bit is_saddr, string Name = ""> {
205
205
class FLAT_Load_Pseudo <string opName, RegisterClass regClass,
206
206
bit HasTiedOutput = 0,
207
207
bit HasSaddr = 0, bit EnableSaddr = 0,
208
+ RegisterClass VaddrRC = !if(EnableSaddr, VGPR_32, VReg_64),
208
209
RegisterOperand vdata_op = getLdStRegisterOperand<regClass>.ret> : FLAT_Pseudo<
209
210
opName,
210
211
(outs vdata_op:$vdst),
211
212
!con(
212
213
!if(EnableSaddr,
213
- (ins SReg_64_XEXEC_XNULL:$saddr, VGPR_32:$vaddr),
214
- (ins VReg_64:$vaddr)),
214
+ (ins SReg_64_XEXEC_XNULL:$saddr), (ins)), (ins VaddrRC:$vaddr),
215
215
(ins flat_offset:$offset),
216
216
// FIXME: Operands with default values do not work with following non-optional operands.
217
217
!if(HasTiedOutput, (ins CPol:$cpol, vdata_op:$vdst_in),
@@ -227,14 +227,13 @@ class FLAT_Load_Pseudo <string opName, RegisterClass regClass,
227
227
}
228
228
229
229
class FLAT_Store_Pseudo <string opName, RegisterClass vdataClass,
230
- bit HasSaddr = 0, bit EnableSaddr = 0> : FLAT_Pseudo<
230
+ bit HasSaddr = 0, bit EnableSaddr = 0,
231
+ RegisterClass VaddrRC = !if(EnableSaddr, VGPR_32, VReg_64),
232
+ RegisterOperand vdata_op = getLdStRegisterOperand<vdataClass>.ret> : FLAT_Pseudo<
231
233
opName,
232
234
(outs),
233
- !con(
234
- !if(EnableSaddr,
235
- (ins VGPR_32:$vaddr, getLdStRegisterOperand<vdataClass>.ret:$vdata, SReg_64_XEXEC_XNULL:$saddr),
236
- (ins VReg_64:$vaddr, getLdStRegisterOperand<vdataClass>.ret:$vdata)),
237
- (ins flat_offset:$offset, CPol_0:$cpol)),
235
+ !con((ins VaddrRC:$vaddr, vdata_op:$vdata), !if(EnableSaddr, (ins SReg_64_XEXEC_XNULL:$saddr), (ins)),
236
+ (ins flat_offset:$offset, CPol_0:$cpol)),
238
237
" $vaddr, $vdata"#!if(HasSaddr, !if(EnableSaddr, ", $saddr", ", off"), "")#"$offset$cpol"> {
239
238
let mayLoad = 0;
240
239
let mayStore = 1;
@@ -569,65 +568,65 @@ multiclass FLAT_Atomic_Pseudo<
569
568
defm "" : FLAT_Atomic_Pseudo_RTN<opName, vdst_rc, vt, data_vt, data_rc, data_op>;
570
569
}
571
570
572
- multiclass FLAT_Global_Atomic_Pseudo_NO_RTN<
571
+ class FLAT_Global_Atomic_Pseudo_NO_RTN<
573
572
string opName,
574
573
RegisterClass vdst_rc,
575
574
ValueType vt,
576
575
ValueType data_vt = vt,
577
576
RegisterClass data_rc = vdst_rc,
578
- RegisterOperand data_op = getLdStRegisterOperand<data_rc>.ret> {
579
-
580
- let is_flat_global = 1 in {
581
- def "" : FLAT_AtomicNoRet_Pseudo <opName,
577
+ bit EnableSaddr = 0,
578
+ RegisterClass VaddrRC = !if(EnableSaddr, VGPR_32, VReg_64),
579
+ RegisterOperand data_op = getLdStRegisterOperand<data_rc>.ret> :
580
+ FLAT_AtomicNoRet_Pseudo <opName,
582
581
(outs),
583
- (ins VReg_64:$vaddr, data_op:$vdata, flat_offset:$offset, CPol_0:$cpol),
584
- " $vaddr, $vdata, off$offset$cpol">,
582
+ !con((ins VaddrRC:$vaddr, data_op:$vdata), !if(EnableSaddr, (ins SReg_64_XEXEC_XNULL:$saddr), (ins)),
583
+ (ins flat_offset:$offset, CPol_0:$cpol)),
584
+ " $vaddr, $vdata, "#!if(EnableSaddr, "$saddr", "off")#"$offset$cpol">,
585
585
GlobalSaddrTable<0, opName> {
586
- let has_saddr = 1;
587
- let FPAtomic = data_vt.isFP;
588
- }
586
+ let has_saddr = 1;
587
+ let enabled_saddr = EnableSaddr;
588
+ let FPAtomic = data_vt.isFP;
589
+ let is_flat_global = 1;
590
+ }
589
591
590
- def _SADDR : FLAT_AtomicNoRet_Pseudo <opName,
591
- (outs),
592
- (ins VGPR_32:$vaddr, data_op:$vdata, SReg_64_XEXEC_XNULL:$saddr, flat_offset:$offset, CPol_0:$cpol),
593
- " $vaddr, $vdata, $saddr$offset$cpol">,
594
- GlobalSaddrTable<1, opName> {
595
- let has_saddr = 1;
596
- let enabled_saddr = 1;
597
- let FPAtomic = data_vt.isFP;
598
- }
599
- }
592
+ multiclass FLAT_Global_Atomic_Pseudo_Helper_NO_RTN<string opName,
593
+ RegisterClass vdst_rc,
594
+ ValueType vt,
595
+ ValueType data_vt = vt,
596
+ RegisterClass data_rc = vdst_rc> {
597
+ def "" : FLAT_Global_Atomic_Pseudo_NO_RTN<opName, vdst_rc, vt, data_vt, data_rc, 0>;
598
+ def _SADDR : FLAT_Global_Atomic_Pseudo_NO_RTN<opName, vdst_rc, vt, data_vt, data_rc, 1>;
600
599
}
601
600
602
- multiclass FLAT_Global_Atomic_Pseudo_RTN<
601
+ class FLAT_Global_Atomic_Pseudo_RTN<
603
602
string opName,
604
603
RegisterClass vdst_rc,
605
604
ValueType vt,
606
605
ValueType data_vt = vt,
607
606
RegisterClass data_rc = vdst_rc,
607
+ bit EnableSaddr = 0,
608
+ RegisterClass VaddrRC = !if(EnableSaddr, VGPR_32, VReg_64),
608
609
RegisterOperand data_op = getLdStRegisterOperand<data_rc>.ret,
609
- RegisterOperand vdst_op = getLdStRegisterOperand<vdst_rc>.ret> {
610
-
611
- let is_flat_global = 1 in {
612
- def _RTN : FLAT_AtomicRet_Pseudo <opName,
610
+ RegisterOperand vdst_op = getLdStRegisterOperand<vdst_rc>.ret> :
611
+ FLAT_AtomicRet_Pseudo <opName,
613
612
(outs vdst_op:$vdst),
614
- (ins VReg_64:$vaddr, data_op:$vdata, flat_offset:$offset, CPol_GLC1:$cpol),
615
- " $vdst, $vaddr, $vdata, off$offset$cpol">,
613
+ !con((ins VaddrRC:$vaddr, data_op:$vdata), !if(EnableSaddr, (ins SReg_64_XEXEC_XNULL:$saddr), (ins)),
614
+ (ins flat_offset:$offset, CPol_GLC1:$cpol)),
615
+ " $vdst, $vaddr, $vdata, "#!if(EnableSaddr, "$saddr", "off")#"$offset$cpol">,
616
616
GlobalSaddrTable<0, opName#"_rtn"> {
617
- let has_saddr = 1;
618
- let FPAtomic = data_vt.isFP;
619
- }
617
+ let has_saddr = 1;
618
+ let enabled_saddr = EnableSaddr;
619
+ let FPAtomic = data_vt.isFP;
620
+ let is_flat_global = 1;
621
+ }
620
622
621
- def _SADDR_RTN : FLAT_AtomicRet_Pseudo <opName,
622
- (outs vdst_op:$vdst),
623
- (ins VGPR_32:$vaddr, data_op:$vdata, SReg_64_XEXEC_XNULL:$saddr, flat_offset:$offset, CPol_GLC1:$cpol),
624
- " $vdst, $vaddr, $vdata, $saddr$offset$cpol">,
625
- GlobalSaddrTable<1, opName#"_rtn"> {
626
- let has_saddr = 1;
627
- let enabled_saddr = 1;
628
- let FPAtomic = data_vt.isFP;
629
- }
630
- }
623
+ multiclass FLAT_Global_Atomic_Pseudo_Helper_RTN<string opName,
624
+ RegisterClass vdst_rc,
625
+ ValueType vt,
626
+ ValueType data_vt = vt,
627
+ RegisterClass data_rc = vdst_rc> {
628
+ def _RTN : FLAT_Global_Atomic_Pseudo_RTN<opName, vdst_rc, vt, data_vt, data_rc, 0>;
629
+ def _SADDR_RTN : FLAT_Global_Atomic_Pseudo_RTN<opName, vdst_rc, vt, data_vt, data_rc, 1>;
631
630
}
632
631
633
632
multiclass FLAT_Global_Atomic_Pseudo<
@@ -636,8 +635,8 @@ multiclass FLAT_Global_Atomic_Pseudo<
636
635
ValueType vt,
637
636
ValueType data_vt = vt,
638
637
RegisterClass data_rc = vdst_rc> {
639
- defm "" : FLAT_Global_Atomic_Pseudo_NO_RTN <opName, vdst_rc, vt, data_vt, data_rc>;
640
- defm "" : FLAT_Global_Atomic_Pseudo_RTN <opName, vdst_rc, vt, data_vt, data_rc>;
638
+ defm "" : FLAT_Global_Atomic_Pseudo_Helper_NO_RTN <opName, vdst_rc, vt, data_vt, data_rc>;
639
+ defm "" : FLAT_Global_Atomic_Pseudo_Helper_RTN <opName, vdst_rc, vt, data_vt, data_rc>;
641
640
}
642
641
643
642
//===----------------------------------------------------------------------===//
@@ -1018,19 +1017,19 @@ let SubtargetPredicate = isGFX10Plus in {
1018
1017
} // End SubtargetPredicate = isGFX10Plus
1019
1018
1020
1019
let OtherPredicates = [HasAtomicFaddNoRtnInsts] in
1021
- defm GLOBAL_ATOMIC_ADD_F32 : FLAT_Global_Atomic_Pseudo_NO_RTN <
1020
+ defm GLOBAL_ATOMIC_ADD_F32 : FLAT_Global_Atomic_Pseudo_Helper_NO_RTN <
1022
1021
"global_atomic_add_f32", VGPR_32, f32
1023
1022
>;
1024
1023
let OtherPredicates = [HasAtomicBufferGlobalPkAddF16NoRtnInsts] in
1025
- defm GLOBAL_ATOMIC_PK_ADD_F16 : FLAT_Global_Atomic_Pseudo_NO_RTN <
1024
+ defm GLOBAL_ATOMIC_PK_ADD_F16 : FLAT_Global_Atomic_Pseudo_Helper_NO_RTN <
1026
1025
"global_atomic_pk_add_f16", VGPR_32, v2f16
1027
1026
>;
1028
1027
let OtherPredicates = [HasAtomicFaddRtnInsts] in
1029
- defm GLOBAL_ATOMIC_ADD_F32 : FLAT_Global_Atomic_Pseudo_RTN <
1028
+ defm GLOBAL_ATOMIC_ADD_F32 : FLAT_Global_Atomic_Pseudo_Helper_RTN <
1030
1029
"global_atomic_add_f32", VGPR_32, f32
1031
1030
>;
1032
1031
let OtherPredicates = [HasAtomicBufferGlobalPkAddF16Insts] in
1033
- defm GLOBAL_ATOMIC_PK_ADD_F16 : FLAT_Global_Atomic_Pseudo_RTN <
1032
+ defm GLOBAL_ATOMIC_PK_ADD_F16 : FLAT_Global_Atomic_Pseudo_Helper_RTN <
1034
1033
"global_atomic_pk_add_f16", VGPR_32, v2f16
1035
1034
>;
1036
1035
0 commit comments