@@ -864,26 +864,119 @@ 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_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)>;
879
899
}
880
900
881
901
// atomic_load_sub can be represented as a neg followed
882
902
// 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),
884
913
(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),
886
922
(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)>;
887
980
888
981
// Atomic Exchange
889
982
class XCHG<BPFWidthModifer SizeOp, string OpcodeStr, PatFrag OpNode>
0 commit comments