@@ -4942,39 +4942,42 @@ def : Pat<(post_truncsti8 GPR64:$Rt, GPR64sp:$addr, simm9:$off),
4942
4942
def : Pat<(post_store (bf16 FPR16:$Rt), GPR64sp:$addr, simm9:$off),
4943
4943
(STRHpost FPR16:$Rt, GPR64sp:$addr, simm9:$off)>;
4944
4944
4945
- def : Pat<(post_store (v8i8 FPR64:$Rt), GPR64sp:$addr, simm9:$off),
4946
- (STRDpost FPR64:$Rt, GPR64sp:$addr, simm9:$off)>;
4947
- def : Pat<(post_store (v4i16 FPR64:$Rt), GPR64sp:$addr, simm9:$off),
4948
- (STRDpost FPR64:$Rt, GPR64sp:$addr, simm9:$off)>;
4949
- def : Pat<(post_store (v2i32 FPR64:$Rt), GPR64sp:$addr, simm9:$off),
4950
- (STRDpost FPR64:$Rt, GPR64sp:$addr, simm9:$off)>;
4951
- def : Pat<(post_store (v2f32 FPR64:$Rt), GPR64sp:$addr, simm9:$off),
4952
- (STRDpost FPR64:$Rt, GPR64sp:$addr, simm9:$off)>;
4953
- def : Pat<(post_store (v1i64 FPR64:$Rt), GPR64sp:$addr, simm9:$off),
4954
- (STRDpost FPR64:$Rt, GPR64sp:$addr, simm9:$off)>;
4955
- def : Pat<(post_store (v1f64 FPR64:$Rt), GPR64sp:$addr, simm9:$off),
4956
- (STRDpost FPR64:$Rt, GPR64sp:$addr, simm9:$off)>;
4957
- def : Pat<(post_store (v4f16 FPR64:$Rt), GPR64sp:$addr, simm9:$off),
4958
- (STRDpost FPR64:$Rt, GPR64sp:$addr, simm9:$off)>;
4959
- def : Pat<(post_store (v4bf16 FPR64:$Rt), GPR64sp:$addr, simm9:$off),
4960
- (STRDpost FPR64:$Rt, GPR64sp:$addr, simm9:$off)>;
4961
-
4962
- def : Pat<(post_store (v16i8 FPR128:$Rt), GPR64sp:$addr, simm9:$off),
4963
- (STRQpost FPR128:$Rt, GPR64sp:$addr, simm9:$off)>;
4964
- def : Pat<(post_store (v8i16 FPR128:$Rt), GPR64sp:$addr, simm9:$off),
4965
- (STRQpost FPR128:$Rt, GPR64sp:$addr, simm9:$off)>;
4966
- def : Pat<(post_store (v4i32 FPR128:$Rt), GPR64sp:$addr, simm9:$off),
4967
- (STRQpost FPR128:$Rt, GPR64sp:$addr, simm9:$off)>;
4968
- def : Pat<(post_store (v4f32 FPR128:$Rt), GPR64sp:$addr, simm9:$off),
4969
- (STRQpost FPR128:$Rt, GPR64sp:$addr, simm9:$off)>;
4970
- def : Pat<(post_store (v2i64 FPR128:$Rt), GPR64sp:$addr, simm9:$off),
4971
- (STRQpost FPR128:$Rt, GPR64sp:$addr, simm9:$off)>;
4972
- def : Pat<(post_store (v2f64 FPR128:$Rt), GPR64sp:$addr, simm9:$off),
4973
- (STRQpost FPR128:$Rt, GPR64sp:$addr, simm9:$off)>;
4974
- def : Pat<(post_store (v8f16 FPR128:$Rt), GPR64sp:$addr, simm9:$off),
4975
- (STRQpost FPR128:$Rt, GPR64sp:$addr, simm9:$off)>;
4976
- def : Pat<(post_store (v8bf16 FPR128:$Rt), GPR64sp:$addr, simm9:$off),
4977
- (STRQpost FPR128:$Rt, GPR64sp:$addr, simm9:$off)>;
4945
+ let Predicates = [IsLE] in {
4946
+ // We must use ST1 to store vectors in big-endian.
4947
+ def : Pat<(post_store(v8i8 FPR64:$Rt), GPR64sp:$addr, simm9:$off),
4948
+ (STRDpost FPR64:$Rt, GPR64sp:$addr, simm9:$off)>;
4949
+ def : Pat<(post_store(v4i16 FPR64:$Rt), GPR64sp:$addr, simm9:$off),
4950
+ (STRDpost FPR64:$Rt, GPR64sp:$addr, simm9:$off)>;
4951
+ def : Pat<(post_store(v2i32 FPR64:$Rt), GPR64sp:$addr, simm9:$off),
4952
+ (STRDpost FPR64:$Rt, GPR64sp:$addr, simm9:$off)>;
4953
+ def : Pat<(post_store(v2f32 FPR64:$Rt), GPR64sp:$addr, simm9:$off),
4954
+ (STRDpost FPR64:$Rt, GPR64sp:$addr, simm9:$off)>;
4955
+ def : Pat<(post_store(v1i64 FPR64:$Rt), GPR64sp:$addr, simm9:$off),
4956
+ (STRDpost FPR64:$Rt, GPR64sp:$addr, simm9:$off)>;
4957
+ def : Pat<(post_store(v1f64 FPR64:$Rt), GPR64sp:$addr, simm9:$off),
4958
+ (STRDpost FPR64:$Rt, GPR64sp:$addr, simm9:$off)>;
4959
+ def : Pat<(post_store(v4f16 FPR64:$Rt), GPR64sp:$addr, simm9:$off),
4960
+ (STRDpost FPR64:$Rt, GPR64sp:$addr, simm9:$off)>;
4961
+ def : Pat<(post_store(v4bf16 FPR64:$Rt), GPR64sp:$addr, simm9:$off),
4962
+ (STRDpost FPR64:$Rt, GPR64sp:$addr, simm9:$off)>;
4963
+
4964
+ def : Pat<(post_store(v16i8 FPR128:$Rt), GPR64sp:$addr, simm9:$off),
4965
+ (STRQpost FPR128:$Rt, GPR64sp:$addr, simm9:$off)>;
4966
+ def : Pat<(post_store(v8i16 FPR128:$Rt), GPR64sp:$addr, simm9:$off),
4967
+ (STRQpost FPR128:$Rt, GPR64sp:$addr, simm9:$off)>;
4968
+ def : Pat<(post_store(v4i32 FPR128:$Rt), GPR64sp:$addr, simm9:$off),
4969
+ (STRQpost FPR128:$Rt, GPR64sp:$addr, simm9:$off)>;
4970
+ def : Pat<(post_store(v4f32 FPR128:$Rt), GPR64sp:$addr, simm9:$off),
4971
+ (STRQpost FPR128:$Rt, GPR64sp:$addr, simm9:$off)>;
4972
+ def : Pat<(post_store(v2i64 FPR128:$Rt), GPR64sp:$addr, simm9:$off),
4973
+ (STRQpost FPR128:$Rt, GPR64sp:$addr, simm9:$off)>;
4974
+ def : Pat<(post_store(v2f64 FPR128:$Rt), GPR64sp:$addr, simm9:$off),
4975
+ (STRQpost FPR128:$Rt, GPR64sp:$addr, simm9:$off)>;
4976
+ def : Pat<(post_store(v8f16 FPR128:$Rt), GPR64sp:$addr, simm9:$off),
4977
+ (STRQpost FPR128:$Rt, GPR64sp:$addr, simm9:$off)>;
4978
+ def : Pat<(post_store(v8bf16 FPR128:$Rt), GPR64sp:$addr, simm9:$off),
4979
+ (STRQpost FPR128:$Rt, GPR64sp:$addr, simm9:$off)>;
4980
+ }
4978
4981
4979
4982
//===----------------------------------------------------------------------===//
4980
4983
// Load/store exclusive instructions.
@@ -8925,6 +8928,21 @@ def : St1Pat<v4i16, ST1Onev4h>;
8925
8928
def : St1Pat<v2i32, ST1Onev2s>;
8926
8929
def : St1Pat<v1i64, ST1Onev1d>;
8927
8930
8931
+ class St1PostPat<ValueType ty, Instruction INST, int off>
8932
+ : Pat<(post_store ty:$Vt, GPR64sp:$Rn, (i64 off)),
8933
+ (INST ty:$Vt, GPR64sp:$Rn, XZR)>;
8934
+
8935
+ let Predicates = [IsBE] in {
8936
+ def : St1PostPat<v16i8, ST1Onev16b_POST, 16>;
8937
+ def : St1PostPat<v8i16, ST1Onev8h_POST, 16>;
8938
+ def : St1PostPat<v4i32, ST1Onev4s_POST, 16>;
8939
+ def : St1PostPat<v2i64, ST1Onev2d_POST, 16>;
8940
+ def : St1PostPat<v8i8, ST1Onev8b_POST, 8>;
8941
+ def : St1PostPat<v4i16, ST1Onev4h_POST, 8>;
8942
+ def : St1PostPat<v2i32, ST1Onev2s_POST, 8>;
8943
+ def : St1PostPat<v1i64, ST1Onev1d_POST, 8>;
8944
+ }
8945
+
8928
8946
//---
8929
8947
// Single-element
8930
8948
//---
0 commit comments