@@ -786,45 +786,13 @@ let Predicates = [BPFNoALU32] in {
786786 def : Pat<(i64 (extloadi32 ADDRri:$src)), (i64 (LDW ADDRri:$src))>;
787787}
788788
789- // Atomic XADD for BPFNoALU32
790- class XADD<BPFWidthModifer SizeOp, string OpcodeStr>
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- []> {
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-
806789// Atomic add, and, or, xor
807- class ATOMIC_NOFETCH<BPFArithOp Opc, string Opstr>
808- : 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,
809793 (outs GPR:$dst),
810- (ins MEMri:$addr, GPR:$val),
811- "lock *(u64 *)($addr) " #Opstr# "= $val",
812- []> {
813- bits<4> dst;
814- bits<20> addr;
815-
816- let Inst{51-48} = addr{19-16}; // base reg
817- let Inst{55-52} = dst;
818- let Inst{47-32} = addr{15-0}; // offset
819- let Inst{7-4} = Opc.Value;
820- let BPFClass = BPF_STX;
821- }
822-
823- class ATOMIC32_NOFETCH<BPFArithOp Opc, string Opstr>
824- : TYPE_LD_ST<BPF_ATOMIC.Value, BPF_W.Value,
825- (outs GPR32:$dst),
826- (ins MEMri:$addr, GPR32:$val),
827- "lock *(u32 *)($addr) " #Opstr# "= $val",
794+ (ins MEMri:$addr, RegTp:$val),
795+ "lock *(" #OpType# " *)($addr) " #Opstr# "= $val",
828796 []> {
829797 bits<4> dst;
830798 bits<20> addr;
@@ -838,16 +806,23 @@ class ATOMIC32_NOFETCH<BPFArithOp Opc, string Opstr>
838806
839807let Constraints = "$dst = $val" in {
840808 let Predicates = [BPFHasALU32], DecoderNamespace = "BPFALU32" in {
841- def XADDW32 : ATOMIC32_NOFETCH< BPF_ADD, "+">;
842- def XANDW32 : ATOMIC32_NOFETCH< BPF_AND, "&">;
843- def XORW32 : ATOMIC32_NOFETCH< BPF_OR, "|">;
844- 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, "^">;
845813 }
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+ }
846820
847- def XADDD : ATOMIC_NOFETCH<BPF_ADD, "+">;
848- def XANDD : ATOMIC_NOFETCH<BPF_AND, "&">;
849- def XORD : ATOMIC_NOFETCH<BPF_OR, "|">;
850- def XXORD : ATOMIC_NOFETCH<BPF_XOR, "^">;
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)>;
851826}
852827
853828// Atomic Fetch-and-<add, and, or, xor> operations
@@ -887,13 +862,6 @@ class XFALU32<BPFWidthModifer SizeOp, BPFArithOp Opc, string OpcodeStr,
887862 let BPFClass = BPF_STX;
888863}
889864
890- let Constraints = "$dst = $val" in {
891- let Predicates = [BPFNoALU32] in {
892- def XADDW : XADD<BPF_W, "u32">;
893- def XFADDW : XFALU64<BPF_W, BPF_ADD, "u32", "add", atomic_load_add_i32>;
894- }
895- }
896-
897865let Constraints = "$dst = $val" in {
898866 let Predicates = [BPFHasALU32], DecoderNamespace = "BPFALU32" in {
899867 def XFADDW32 : XFALU32<BPF_W, BPF_ADD, "u32", "add", atomic_load_add_i32>;
@@ -902,7 +870,9 @@ let Constraints = "$dst = $val" in {
902870 def XFXORW32 : XFALU32<BPF_W, BPF_XOR, "u32", "xor", atomic_load_xor_i32>;
903871 }
904872
905- def XFADDD : XFALU64<BPF_DW, BPF_ADD, "u64", "add", atomic_load_add_i64>;
873+ let Predicates = [BPFHasALU32] in {
874+ def XFADDD : XFALU64<BPF_DW, BPF_ADD, "u64", "add", atomic_load_add_i64>;
875+ }
906876 def XFANDD : XFALU64<BPF_DW, BPF_AND, "u64", "and", atomic_load_and_i64>;
907877 def XFORD : XFALU64<BPF_DW, BPF_OR, "u64", "or", atomic_load_or_i64>;
908878 def XFXORD : XFALU64<BPF_DW, BPF_XOR, "u64", "xor", atomic_load_xor_i64>;
0 commit comments