@@ -864,26 +864,50 @@ class XFALU32<BPFWidthModifer SizeOp, BPFArithOp Opc, string OpcodeStr,
864864
865865let Constraints = "$dst = $val" in {
866866 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 >;
871871 }
872872
873873 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 >;
875875 }
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)>;
879886}
880887
881888// atomic_load_sub can be represented as a neg followed
882889// 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),
884891 (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),
886893 (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)>;
887911
888912// Atomic Exchange
889913class XCHG<BPFWidthModifer SizeOp, string OpcodeStr, PatFrag OpNode>
0 commit comments