@@ -864,26 +864,50 @@ class XFALU32<BPFWidthModifer SizeOp, BPFArithOp Opc, string OpcodeStr,
864
864
865
865
let Constraints = "$dst = $val" in {
866
866
let Predicates = [BPFHasALU32], DecoderNamespace = "BPFALU32" in {
867
- def XFADDW32 : XFALU32<BPF_W, BPF_ADD, "u32", "add", atomic_load_add_i32 >;
868
- def XFANDW32 : XFALU32<BPF_W, BPF_AND, "u32", "and", atomic_load_and_i32 >;
869
- def XFORW32 : XFALU32<BPF_W, BPF_OR, "u32", "or", atomic_load_or_i32 >;
870
- def XFXORW32 : XFALU32<BPF_W, BPF_XOR, "u32", "xor", atomic_load_xor_i32 >;
867
+ def XFADDW32 : XFALU32<BPF_W, BPF_ADD, "u32", "add", atomic_load_add_i32_seq_cst >;
868
+ def XFANDW32 : XFALU32<BPF_W, BPF_AND, "u32", "and", atomic_load_and_i32_seq_cst >;
869
+ def XFORW32 : XFALU32<BPF_W, BPF_OR, "u32", "or", atomic_load_or_i32_seq_cst >;
870
+ def XFXORW32 : XFALU32<BPF_W, BPF_XOR, "u32", "xor", atomic_load_xor_i32_seq_cst >;
871
871
}
872
872
873
873
let Predicates = [BPFHasALU32] in {
874
- def XFADDD : XFALU64<BPF_DW, BPF_ADD, "u64", "add", atomic_load_add_i64 >;
874
+ def XFADDD : XFALU64<BPF_DW, BPF_ADD, "u64", "add", atomic_load_add_i64_seq_cst >;
875
875
}
876
- def XFANDD : XFALU64<BPF_DW, BPF_AND, "u64", "and", atomic_load_and_i64>;
877
- def XFORD : XFALU64<BPF_DW, BPF_OR, "u64", "or", atomic_load_or_i64>;
878
- def XFXORD : XFALU64<BPF_DW, BPF_XOR, "u64", "xor", atomic_load_xor_i64>;
876
+ def XFANDD : XFALU64<BPF_DW, BPF_AND, "u64", "and", atomic_load_and_i64_seq_cst>;
877
+ def XFORD : XFALU64<BPF_DW, BPF_OR, "u64", "or", atomic_load_or_i64_seq_cst>;
878
+ def XFXORD : XFALU64<BPF_DW, BPF_XOR, "u64", "xor", atomic_load_xor_i64_seq_cst>;
879
+ }
880
+
881
+ let Predicates = [BPFHasALU32] in {
882
+ def : Pat<(atomic_load_add_i32_monotonic ADDRri:$addr, GPR32:$val),
883
+ (XADDW32 ADDRri:$addr, GPR32:$val)>;
884
+ def : Pat<(atomic_load_add_i64_monotonic ADDRri:$addr, GPR:$val),
885
+ (XADDD ADDRri:$addr, GPR:$val)>;
879
886
}
880
887
881
888
// atomic_load_sub can be represented as a neg followed
882
889
// by an atomic_load_add.
883
- def : Pat<(atomic_load_sub_i32 ADDRri:$addr, GPR32:$val),
890
+ def : Pat<(atomic_load_sub_i32_seq_cst ADDRri:$addr, GPR32:$val),
884
891
(XFADDW32 ADDRri:$addr, (NEG_32 GPR32:$val))>;
885
- def : Pat<(atomic_load_sub_i64 ADDRri:$addr, GPR:$val),
892
+ def : Pat<(atomic_load_sub_i64_seq_cst ADDRri:$addr, GPR:$val),
886
893
(XFADDD ADDRri:$addr, (NEG_64 GPR:$val))>;
894
+ def : Pat<(atomic_load_sub_i32_monotonic ADDRri:$addr, GPR32:$val),
895
+ (XADDW32 ADDRri:$addr, (NEG_32 GPR32:$val))>;
896
+ def : Pat<(atomic_load_sub_i64_monotonic ADDRri:$addr, GPR:$val),
897
+ (XADDD ADDRri:$addr, (NEG_64 GPR:$val))>;
898
+
899
+ def : Pat<(atomic_load_and_i32_monotonic ADDRri:$addr, GPR32:$val),
900
+ (XANDW32 ADDRri:$addr, GPR32:$val)>;
901
+ def : Pat<(atomic_load_and_i64_monotonic ADDRri:$addr, GPR:$val),
902
+ (XANDD ADDRri:$addr, GPR:$val)>;
903
+ def : Pat<(atomic_load_or_i32_monotonic ADDRri:$addr, GPR32:$val),
904
+ (XORW32 ADDRri:$addr, GPR32:$val)>;
905
+ def : Pat<(atomic_load_or_i64_monotonic ADDRri:$addr, GPR:$val),
906
+ (XORD ADDRri:$addr, GPR:$val)>;
907
+ def : Pat<(atomic_load_xor_i32_monotonic ADDRri:$addr, GPR32:$val),
908
+ (XXORW32 ADDRri:$addr, GPR32:$val)>;
909
+ def : Pat<(atomic_load_xor_i64_monotonic ADDRri:$addr, GPR:$val),
910
+ (XXORD ADDRri:$addr, GPR:$val)>;
887
911
888
912
// Atomic Exchange
889
913
class XCHG<BPFWidthModifer SizeOp, string OpcodeStr, PatFrag OpNode>
0 commit comments