@@ -4942,39 +4942,42 @@ def : Pat<(post_truncsti8 GPR64:$Rt, GPR64sp:$addr, simm9:$off),
49424942def : Pat<(post_store (bf16 FPR16:$Rt), GPR64sp:$addr, simm9:$off),
49434943 (STRHpost FPR16:$Rt, GPR64sp:$addr, simm9:$off)>;
49444944
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+ }
49784981
49794982//===----------------------------------------------------------------------===//
49804983// Load/store exclusive instructions.
@@ -8925,6 +8928,21 @@ def : St1Pat<v4i16, ST1Onev4h>;
89258928def : St1Pat<v2i32, ST1Onev2s>;
89268929def : St1Pat<v1i64, ST1Onev1d>;
89278930
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+
89288946//---
89298947// Single-element
89308948//---
0 commit comments