@@ -786,52 +786,13 @@ let Predicates = [BPFNoALU32] in {
786
786
def : Pat<(i64 (extloadi32 ADDRri:$src)), (i64 (LDW ADDRri:$src))>;
787
787
}
788
788
789
- // Atomic XADD for BPFNoALU32
790
- class XADD<BPFWidthModifer SizeOp, string OpcodeStr, PatFrag OpNode>
791
- : TYPE_LD_ST<BPF_ATOMIC.Value, SizeOp.Value,
792
- (outs GPR:$dst),
793
- (ins MEMri:$addr, GPR:$val),
794
- "lock *("#OpcodeStr#" *)($addr) += $val",
795
- [(set GPR:$dst, (OpNode ADDRri:$addr, GPR:$val))]> {
796
- bits<4> dst;
797
- bits<20> addr;
798
-
799
- let Inst{51-48} = addr{19-16}; // base reg
800
- let Inst{55-52} = dst;
801
- let Inst{47-32} = addr{15-0}; // offset
802
- let Inst{7-4} = BPF_ADD.Value;
803
- let BPFClass = BPF_STX;
804
- }
805
-
806
- let Constraints = "$dst = $val" in {
807
- let Predicates = [BPFNoALU32] in {
808
- def XADDW : XADD<BPF_W, "u32", atomic_load_add_i32>;
809
- def XADDD : XADD<BPF_DW, "u64", atomic_load_add_i64>;
810
- }
811
- }
812
-
813
789
// Atomic add, and, or, xor
814
- class ATOMIC_NOFETCH<BPFArithOp Opc, string Opstr>
815
- : TYPE_LD_ST<BPF_ATOMIC.Value, BPF_DW.Value,
790
+ class ATOMIC_NOFETCH<BPFWidthModifer SizeOp, string OpType, RegisterClass RegTp,
791
+ BPFArithOp Opc, string Opstr>
792
+ : TYPE_LD_ST<BPF_ATOMIC.Value, SizeOp.Value,
816
793
(outs GPR:$dst),
817
- (ins MEMri:$addr, GPR:$val),
818
- "lock *(u64 *)($addr) " #Opstr# "= $val",
819
- []> {
820
- bits<4> dst;
821
- bits<20> addr;
822
-
823
- let Inst{51-48} = addr{19-16}; // base reg
824
- let Inst{55-52} = dst;
825
- let Inst{47-32} = addr{15-0}; // offset
826
- let Inst{7-4} = Opc.Value;
827
- let BPFClass = BPF_STX;
828
- }
829
-
830
- class ATOMIC32_NOFETCH<BPFArithOp Opc, string Opstr>
831
- : TYPE_LD_ST<BPF_ATOMIC.Value, BPF_W.Value,
832
- (outs GPR32:$dst),
833
- (ins MEMri:$addr, GPR32:$val),
834
- "lock *(u32 *)($addr) " #Opstr# "= $val",
794
+ (ins MEMri:$addr, RegTp:$val),
795
+ "lock *(" #OpType# " *)($addr) " #Opstr# "= $val",
835
796
[]> {
836
797
bits<4> dst;
837
798
bits<20> addr;
@@ -845,14 +806,23 @@ class ATOMIC32_NOFETCH<BPFArithOp Opc, string Opstr>
845
806
846
807
let Constraints = "$dst = $val" in {
847
808
let Predicates = [BPFHasALU32], DecoderNamespace = "BPFALU32" in {
848
- def XADDW32 : ATOMIC32_NOFETCH< BPF_ADD, "+">;
849
- def XANDW32 : ATOMIC32_NOFETCH< BPF_AND, "&">;
850
- def XORW32 : ATOMIC32_NOFETCH< BPF_OR, "|">;
851
- def XXORW32 : ATOMIC32_NOFETCH< BPF_XOR, "^">;
809
+ def XADDW32 : ATOMIC_NOFETCH<BPF_W, "u32", GPR32, BPF_ADD, "+">;
810
+ def XANDW32 : ATOMIC_NOFETCH<BPF_W, "u32", GPR32, BPF_AND, "&">;
811
+ def XORW32 : ATOMIC_NOFETCH<BPF_W, "u32", GPR32, BPF_OR, "|">;
812
+ def XXORW32 : ATOMIC_NOFETCH<BPF_W, "u32", GPR32, BPF_XOR, "^">;
852
813
}
853
- def XANDD : ATOMIC_NOFETCH<BPF_AND, "&">;
854
- def XORD : ATOMIC_NOFETCH<BPF_OR, "|">;
855
- def XXORD : ATOMIC_NOFETCH<BPF_XOR, "^">;
814
+ def XADDW : ATOMIC_NOFETCH<BPF_W, "u32", GPR, BPF_ADD, "+">;
815
+ def XADDD : ATOMIC_NOFETCH<BPF_DW, "u64", GPR, BPF_ADD, "+">;
816
+ def XANDD : ATOMIC_NOFETCH<BPF_DW, "u64", GPR, BPF_AND, "&">;
817
+ def XORD : ATOMIC_NOFETCH<BPF_DW, "u64", GPR, BPF_OR, "|">;
818
+ def XXORD : ATOMIC_NOFETCH<BPF_DW, "u64", GPR, BPF_XOR, "^">;
819
+ }
820
+
821
+ let Predicates = [BPFNoALU32] in {
822
+ def : Pat<(atomic_load_add_i32 ADDRri:$addr, GPR:$val),
823
+ (XADDW ADDRri:$addr, GPR:$val)>;
824
+ def : Pat<(atomic_load_add_i64 ADDRri:$addr, GPR:$val),
825
+ (XADDD ADDRri:$addr, GPR:$val)>;
856
826
}
857
827
858
828
// Atomic Fetch-and-<add, and, or, xor> operations
0 commit comments