@@ -864,26 +864,119 @@ 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_i32_acquire ADDRri:$addr, GPR32:$val),
885+ (XFADDW32 ADDRri:$addr, GPR32:$val)>;
886+ def : Pat<(atomic_load_add_i32_release ADDRri:$addr, GPR32:$val),
887+ (XFADDW32 ADDRri:$addr, GPR32:$val)>;
888+ def : Pat<(atomic_load_add_i32_acq_rel ADDRri:$addr, GPR32:$val),
889+ (XFADDW32 ADDRri:$addr, GPR32:$val)>;
890+
891+ def : Pat<(atomic_load_add_i64_monotonic ADDRri:$addr, GPR:$val),
892+ (XADDD ADDRri:$addr, GPR:$val)>;
893+ def : Pat<(atomic_load_add_i64_acquire ADDRri:$addr, GPR:$val),
894+ (XFADDD ADDRri:$addr, GPR:$val)>;
895+ def : Pat<(atomic_load_add_i64_release ADDRri:$addr, GPR:$val),
896+ (XFADDD ADDRri:$addr, GPR:$val)>;
897+ def : Pat<(atomic_load_add_i64_acq_rel ADDRri:$addr, GPR:$val),
898+ (XFADDD ADDRri:$addr, GPR:$val)>;
879899}
880900
881901// atomic_load_sub can be represented as a neg followed
882902// by an atomic_load_add.
883- def : Pat<(atomic_load_sub_i32 ADDRri:$addr, GPR32:$val),
903+ // FIXME: the below can probably be simplified.
904+ def : Pat<(atomic_load_sub_i32_monotonic ADDRri:$addr, GPR32:$val),
905+ (XADDW32 ADDRri:$addr, (NEG_32 GPR32:$val))>;
906+ def : Pat<(atomic_load_sub_i32_acquire ADDRri:$addr, GPR32:$val),
907+ (XFADDW32 ADDRri:$addr, (NEG_32 GPR32:$val))>;
908+ def : Pat<(atomic_load_sub_i32_release ADDRri:$addr, GPR32:$val),
909+ (XFADDW32 ADDRri:$addr, (NEG_32 GPR32:$val))>;
910+ def : Pat<(atomic_load_sub_i32_acq_rel ADDRri:$addr, GPR32:$val),
911+ (XFADDW32 ADDRri:$addr, (NEG_32 GPR32:$val))>;
912+ def : Pat<(atomic_load_sub_i32_seq_cst ADDRri:$addr, GPR32:$val),
884913 (XFADDW32 ADDRri:$addr, (NEG_32 GPR32:$val))>;
885- def : Pat<(atomic_load_sub_i64 ADDRri:$addr, GPR:$val),
914+
915+ def : Pat<(atomic_load_sub_i64_monotonic ADDRri:$addr, GPR:$val),
916+ (XADDD ADDRri:$addr, (NEG_64 GPR:$val))>;
917+ def : Pat<(atomic_load_sub_i64_acquire ADDRri:$addr, GPR:$val),
918+ (XFADDD ADDRri:$addr, (NEG_64 GPR:$val))>;
919+ def : Pat<(atomic_load_sub_i64_release ADDRri:$addr, GPR:$val),
920+ (XFADDD ADDRri:$addr, (NEG_64 GPR:$val))>;
921+ def : Pat<(atomic_load_sub_i64_acq_rel ADDRri:$addr, GPR:$val),
886922 (XFADDD ADDRri:$addr, (NEG_64 GPR:$val))>;
923+ def : Pat<(atomic_load_sub_i64_seq_cst ADDRri:$addr, GPR:$val),
924+ (XFADDD ADDRri:$addr, (NEG_64 GPR:$val))>;
925+
926+ def : Pat<(atomic_load_and_i32_monotonic ADDRri:$addr, GPR32:$val),
927+ (XANDW32 ADDRri:$addr, GPR32:$val)>;
928+ def : Pat<(atomic_load_and_i32_acquire ADDRri:$addr, GPR32:$val),
929+ (XFANDW32 ADDRri:$addr, GPR32:$val)>;
930+ def : Pat<(atomic_load_and_i32_release ADDRri:$addr, GPR32:$val),
931+ (XFANDW32 ADDRri:$addr, GPR32:$val)>;
932+ def : Pat<(atomic_load_and_i32_acq_rel ADDRri:$addr, GPR32:$val),
933+ (XFANDW32 ADDRri:$addr, GPR32:$val)>;
934+
935+
936+ def : Pat<(atomic_load_and_i64_monotonic ADDRri:$addr, GPR:$val),
937+ (XANDD ADDRri:$addr, GPR:$val)>;
938+ def : Pat<(atomic_load_and_i64_acquire ADDRri:$addr, GPR:$val),
939+ (XFANDD ADDRri:$addr, GPR:$val)>;
940+ def : Pat<(atomic_load_and_i64_release ADDRri:$addr, GPR:$val),
941+ (XFANDD ADDRri:$addr, GPR:$val)>;
942+ def : Pat<(atomic_load_and_i64_acq_rel ADDRri:$addr, GPR:$val),
943+ (XFANDD ADDRri:$addr, GPR:$val)>;
944+
945+ def : Pat<(atomic_load_or_i32_monotonic ADDRri:$addr, GPR32:$val),
946+ (XORW32 ADDRri:$addr, GPR32:$val)>;
947+ def : Pat<(atomic_load_or_i32_acquire ADDRri:$addr, GPR32:$val),
948+ (XFORW32 ADDRri:$addr, GPR32:$val)>;
949+ def : Pat<(atomic_load_or_i32_release ADDRri:$addr, GPR32:$val),
950+ (XFORW32 ADDRri:$addr, GPR32:$val)>;
951+ def : Pat<(atomic_load_or_i32_acq_rel ADDRri:$addr, GPR32:$val),
952+ (XFORW32 ADDRri:$addr, GPR32:$val)>;
953+
954+ def : Pat<(atomic_load_or_i64_monotonic ADDRri:$addr, GPR:$val),
955+ (XORD ADDRri:$addr, GPR:$val)>;
956+ def : Pat<(atomic_load_or_i64_acquire ADDRri:$addr, GPR:$val),
957+ (XFORD ADDRri:$addr, GPR:$val)>;
958+ def : Pat<(atomic_load_or_i64_release ADDRri:$addr, GPR:$val),
959+ (XFORD ADDRri:$addr, GPR:$val)>;
960+ def : Pat<(atomic_load_or_i64_acq_rel ADDRri:$addr, GPR:$val),
961+ (XFORD ADDRri:$addr, GPR:$val)>;
962+
963+ def : Pat<(atomic_load_xor_i32_monotonic ADDRri:$addr, GPR32:$val),
964+ (XXORW32 ADDRri:$addr, GPR32:$val)>;
965+ def : Pat<(atomic_load_xor_i32_acquire ADDRri:$addr, GPR32:$val),
966+ (XFXORW32 ADDRri:$addr, GPR32:$val)>;
967+ def : Pat<(atomic_load_xor_i32_release ADDRri:$addr, GPR32:$val),
968+ (XFXORW32 ADDRri:$addr, GPR32:$val)>;
969+ def : Pat<(atomic_load_xor_i32_acq_rel ADDRri:$addr, GPR32:$val),
970+ (XFXORW32 ADDRri:$addr, GPR32:$val)>;
971+
972+ def : Pat<(atomic_load_xor_i64_monotonic ADDRri:$addr, GPR:$val),
973+ (XXORD ADDRri:$addr, GPR:$val)>;
974+ def : Pat<(atomic_load_xor_i64_acquire ADDRri:$addr, GPR:$val),
975+ (XFXORD ADDRri:$addr, GPR:$val)>;
976+ def : Pat<(atomic_load_xor_i64_release ADDRri:$addr, GPR:$val),
977+ (XFXORD ADDRri:$addr, GPR:$val)>;
978+ def : Pat<(atomic_load_xor_i64_acq_rel ADDRri:$addr, GPR:$val),
979+ (XFXORD ADDRri:$addr, GPR:$val)>;
887980
888981// Atomic Exchange
889982class XCHG<BPFWidthModifer SizeOp, string OpcodeStr, PatFrag OpNode>
0 commit comments