[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / CodeGen / AArch64 / arm64-indexed-vector-ldst.ll
blob0d7620d1c883d6885c6ceb12ce39f4f60ced9cb4
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=arm64-apple-ios7.0 -o - %s | FileCheck %s --check-prefixes=CHECK,SDAG
3 ; RUN: llc -global-isel=1 -global-isel-abort=2 -mtriple=arm64-apple-ios7.0 -o - %s 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GISEL
5 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_pre_load
6 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_load
7 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_pre_store
8 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_store
9 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_pre_load
10 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_load
11 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_pre_store
12 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_store
13 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_pre_load
14 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_load
15 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_pre_store
16 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_store
17 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_pre_load
18 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_load
19 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_pre_store
20 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_store
21 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_pre_load
22 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_load
23 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_pre_store
24 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_store
25 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_pre_load
26 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_load
27 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_pre_store
28 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_store
29 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_pre_load
30 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_load
31 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_pre_store
32 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_store
33 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_pre_load
34 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_load
35 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_pre_store
36 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_store
37 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_pre_load
38 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_load
39 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_pre_store
40 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_store
41 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_pre_load
42 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_load
43 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_pre_store
44 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_store
45 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_pre_load
46 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_load
47 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_pre_store
48 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_store
49 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_imm_st1_lane
50 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_reg_st1_lane
51 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_imm_st1_lane
52 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_reg_st1_lane
53 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_imm_st1_lane
54 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_reg_st1_lane
55 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_imm_st1_lane
56 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_reg_st1_lane
57 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_imm_st1_lane
58 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_reg_st1_lane
59 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_imm_st1_lane
60 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_reg_st1_lane
61 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_imm_st1_lane
62 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_reg_st1_lane
63 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_imm_st1_lane
64 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_reg_st1_lane
65 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_imm_st1_lane
66 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_reg_st1_lane
67 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_imm_st1_lane
68 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_reg_st1_lane
69 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_imm_ld2
70 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_reg_ld2
71 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_imm_ld2
72 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_reg_ld2
73 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_imm_ld2
74 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_reg_ld2
75 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_imm_ld2
76 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_reg_ld2
77 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_imm_ld2
78 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_reg_ld2
79 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_imm_ld2
80 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_reg_ld2
81 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_imm_ld2
82 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_reg_ld2
83 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_imm_ld2
84 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_reg_ld2
85 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_imm_ld2
86 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_reg_ld2
87 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_imm_ld2
88 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_reg_ld2
89 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_imm_ld2
90 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_reg_ld2
91 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_imm_ld2
92 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_reg_ld2
93 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_imm_ld3
94 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_reg_ld3
95 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_imm_ld3
96 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_reg_ld3
97 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_imm_ld3
98 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_reg_ld3
99 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_imm_ld3
100 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_reg_ld3
101 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_imm_ld3
102 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_reg_ld3
103 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_imm_ld3
104 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_reg_ld3
105 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_imm_ld3
106 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_reg_ld3
107 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_imm_ld3
108 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_reg_ld3
109 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_imm_ld3
110 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_reg_ld3
111 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_imm_ld3
112 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_reg_ld3
113 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_imm_ld3
114 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_reg_ld3
115 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_imm_ld3
116 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_reg_ld3
117 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_imm_ld4
118 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_reg_ld4
119 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_imm_ld4
120 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_reg_ld4
121 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_imm_ld4
122 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_reg_ld4
123 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_imm_ld4
124 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_reg_ld4
125 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_imm_ld4
126 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_reg_ld4
127 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_imm_ld4
128 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_reg_ld4
129 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_imm_ld4
130 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_reg_ld4
131 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_imm_ld4
132 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_reg_ld4
133 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_imm_ld4
134 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_reg_ld4
135 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_imm_ld4
136 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_reg_ld4
137 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_imm_ld4
138 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_reg_ld4
139 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_imm_ld4
140 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_reg_ld4
141 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_imm_ld1x2
142 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_reg_ld1x2
143 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_imm_ld1x2
144 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_reg_ld1x2
145 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_imm_ld1x2
146 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_reg_ld1x2
147 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_imm_ld1x2
148 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_reg_ld1x2
149 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_imm_ld1x2
150 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_reg_ld1x2
151 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_imm_ld1x2
152 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_reg_ld1x2
153 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_imm_ld1x2
154 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_reg_ld1x2
155 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_imm_ld1x2
156 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_reg_ld1x2
157 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_imm_ld1x2
158 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_reg_ld1x2
159 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_imm_ld1x2
160 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_reg_ld1x2
161 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_imm_ld1x2
162 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_reg_ld1x2
163 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_imm_ld1x2
164 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_reg_ld1x2
165 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_imm_ld1x3
166 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_reg_ld1x3
167 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_imm_ld1x3
168 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_reg_ld1x3
169 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_imm_ld1x3
170 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_reg_ld1x3
171 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_imm_ld1x3
172 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_reg_ld1x3
173 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_imm_ld1x3
174 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_reg_ld1x3
175 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_imm_ld1x3
176 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_reg_ld1x3
177 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_imm_ld1x3
178 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_reg_ld1x3
179 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_imm_ld1x3
180 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_reg_ld1x3
181 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_imm_ld1x3
182 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_reg_ld1x3
183 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_imm_ld1x3
184 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_reg_ld1x3
185 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_imm_ld1x3
186 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_reg_ld1x3
187 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_imm_ld1x3
188 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_reg_ld1x3
189 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_imm_ld1x4
190 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_reg_ld1x4
191 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_imm_ld1x4
192 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_reg_ld1x4
193 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_imm_ld1x4
194 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_reg_ld1x4
195 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_imm_ld1x4
196 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_reg_ld1x4
197 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_imm_ld1x4
198 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_reg_ld1x4
199 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_imm_ld1x4
200 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_reg_ld1x4
201 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_imm_ld1x4
202 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_reg_ld1x4
203 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_imm_ld1x4
204 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_reg_ld1x4
205 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_imm_ld1x4
206 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_reg_ld1x4
207 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_imm_ld1x4
208 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_reg_ld1x4
209 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_imm_ld1x4
210 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_reg_ld1x4
211 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_imm_ld1x4
212 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_reg_ld1x4
213 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_imm_ld2r
214 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_reg_ld2r
215 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_imm_ld2r
216 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_reg_ld2r
217 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_imm_ld2r
218 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_reg_ld2r
219 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_imm_ld2r
220 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_reg_ld2r
221 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_imm_ld2r
222 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_reg_ld2r
223 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_imm_ld2r
224 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_reg_ld2r
225 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_imm_ld2r
226 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_reg_ld2r
227 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_imm_ld2r
228 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_reg_ld2r
229 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_imm_ld2r
230 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_reg_ld2r
231 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_imm_ld2r
232 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_reg_ld2r
233 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_imm_ld2r
234 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_reg_ld2r
235 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_imm_ld2r
236 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_reg_ld2r
237 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_imm_ld3r
238 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_reg_ld3r
239 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_imm_ld3r
240 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_reg_ld3r
241 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_imm_ld3r
242 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_reg_ld3r
243 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_imm_ld3r
244 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_reg_ld3r
245 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_imm_ld3r
246 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_reg_ld3r
247 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_imm_ld3r
248 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_reg_ld3r
249 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_imm_ld3r
250 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_reg_ld3r
251 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_imm_ld3r
252 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_reg_ld3r
253 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_imm_ld3r
254 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_reg_ld3r
255 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_imm_ld3r
256 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_reg_ld3r
257 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_imm_ld3r
258 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_reg_ld3r
259 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_imm_ld3r
260 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_reg_ld3r
261 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_imm_ld4r
262 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_reg_ld4r
263 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_imm_ld4r
264 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_reg_ld4r
265 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_imm_ld4r
266 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_reg_ld4r
267 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_imm_ld4r
268 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_reg_ld4r
269 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_imm_ld4r
270 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_reg_ld4r
271 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_imm_ld4r
272 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_reg_ld4r
273 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_imm_ld4r
274 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_reg_ld4r
275 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_imm_ld4r
276 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_reg_ld4r
277 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_imm_ld4r
278 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_reg_ld4r
279 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_imm_ld4r
280 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_reg_ld4r
281 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_imm_ld4r
282 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_reg_ld4r
283 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_imm_ld4r
284 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_reg_ld4r
285 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_imm_ld2lane
286 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_reg_ld2lane
287 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_imm_ld2lane
288 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_reg_ld2lane
289 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_imm_ld2lane
290 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_reg_ld2lane
291 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_imm_ld2lane
292 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_reg_ld2lane
293 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_imm_ld2lane
294 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_reg_ld2lane
295 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_imm_ld2lane
296 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_reg_ld2lane
297 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_imm_ld2lane
298 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_reg_ld2lane
299 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_imm_ld2lane
300 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_reg_ld2lane
301 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_imm_ld2lane
302 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_reg_ld2lane
303 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_imm_ld2lane
304 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_reg_ld2lane
305 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_imm_ld2lane
306 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_reg_ld2lane
307 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_imm_ld2lane
308 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_reg_ld2lane
309 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_imm_ld3lane
310 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_reg_ld3lane
311 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_imm_ld3lane
312 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_reg_ld3lane
313 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_imm_ld3lane
314 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_reg_ld3lane
315 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_imm_ld3lane
316 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_reg_ld3lane
317 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_imm_ld3lane
318 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_reg_ld3lane
319 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_imm_ld3lane
320 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_reg_ld3lane
321 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_imm_ld3lane
322 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_reg_ld3lane
323 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_imm_ld3lane
324 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_reg_ld3lane
325 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_imm_ld3lane
326 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_reg_ld3lane
327 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_imm_ld3lane
328 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_reg_ld3lane
329 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_imm_ld3lane
330 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_reg_ld3lane
331 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_imm_ld3lane
332 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_reg_ld3lane
333 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_imm_ld4lane
334 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_reg_ld4lane
335 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_imm_ld4lane
336 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_reg_ld4lane
337 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_imm_ld4lane
338 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_reg_ld4lane
339 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_imm_ld4lane
340 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_reg_ld4lane
341 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_imm_ld4lane
342 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_reg_ld4lane
343 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_imm_ld4lane
344 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_reg_ld4lane
345 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_imm_ld4lane
346 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_reg_ld4lane
347 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_imm_ld4lane
348 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_reg_ld4lane
349 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_imm_ld4lane
350 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_reg_ld4lane
351 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_imm_ld4lane
352 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_reg_ld4lane
353 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_imm_ld4lane
354 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_reg_ld4lane
355 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_imm_ld4lane
356 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_reg_ld4lane
357 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_imm_st2
358 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_reg_st2
359 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_imm_st2
360 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_reg_st2
361 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_imm_st2
362 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_reg_st2
363 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_imm_st2
364 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_reg_st2
365 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_imm_st2
366 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_reg_st2
367 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_imm_st2
368 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_reg_st2
369 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_imm_st2
370 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_reg_st2
371 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_imm_st2
372 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_reg_st2
373 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_imm_st2
374 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_reg_st2
375 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_imm_st2
376 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_reg_st2
377 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_imm_st2
378 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_reg_st2
379 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_imm_st2
380 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_reg_st2
381 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_imm_st3
382 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_reg_st3
383 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_imm_st3
384 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_reg_st3
385 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_imm_st3
386 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_reg_st3
387 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_imm_st3
388 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_reg_st3
389 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_imm_st3
390 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_reg_st3
391 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_imm_st3
392 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_reg_st3
393 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_imm_st3
394 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_reg_st3
395 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_imm_st3
396 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_reg_st3
397 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_imm_st3
398 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_reg_st3
399 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_imm_st3
400 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_reg_st3
401 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_imm_st3
402 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_reg_st3
403 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_imm_st3
404 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_reg_st3
405 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_imm_st4
406 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_reg_st4
407 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_imm_st4
408 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_reg_st4
409 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_imm_st4
410 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_reg_st4
411 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_imm_st4
412 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_reg_st4
413 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_imm_st4
414 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_reg_st4
415 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_imm_st4
416 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_reg_st4
417 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_imm_st4
418 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_reg_st4
419 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_imm_st4
420 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_reg_st4
421 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_imm_st4
422 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_reg_st4
423 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_imm_st4
424 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_reg_st4
425 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_imm_st4
426 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_reg_st4
427 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_imm_st4
428 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_reg_st4
429 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_imm_st1x2
430 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_reg_st1x2
431 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_imm_st1x2
432 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_reg_st1x2
433 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_imm_st1x2
434 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_reg_st1x2
435 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_imm_st1x2
436 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_reg_st1x2
437 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_imm_st1x2
438 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_reg_st1x2
439 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_imm_st1x2
440 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_reg_st1x2
441 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_imm_st1x2
442 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_reg_st1x2
443 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_imm_st1x2
444 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_reg_st1x2
445 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_imm_st1x2
446 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_reg_st1x2
447 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_imm_st1x2
448 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_reg_st1x2
449 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_imm_st1x2
450 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_reg_st1x2
451 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_imm_st1x2
452 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_reg_st1x2
453 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_imm_st1x3
454 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_reg_st1x3
455 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_imm_st1x3
456 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_reg_st1x3
457 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_imm_st1x3
458 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_reg_st1x3
459 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_imm_st1x3
460 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_reg_st1x3
461 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_imm_st1x3
462 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_reg_st1x3
463 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_imm_st1x3
464 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_reg_st1x3
465 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_imm_st1x3
466 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_reg_st1x3
467 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_imm_st1x3
468 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_reg_st1x3
469 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_imm_st1x3
470 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_reg_st1x3
471 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_imm_st1x3
472 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_reg_st1x3
473 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_imm_st1x3
474 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_reg_st1x3
475 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_imm_st1x3
476 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_reg_st1x3
477 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_imm_st1x4
478 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_reg_st1x4
479 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_imm_st1x4
480 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_reg_st1x4
481 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_imm_st1x4
482 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_reg_st1x4
483 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_imm_st1x4
484 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_reg_st1x4
485 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_imm_st1x4
486 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_reg_st1x4
487 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_imm_st1x4
488 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_reg_st1x4
489 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_imm_st1x4
490 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_reg_st1x4
491 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_imm_st1x4
492 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_reg_st1x4
493 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_imm_st1x4
494 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_reg_st1x4
495 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_imm_st1x4
496 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_reg_st1x4
497 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_imm_st1x4
498 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_reg_st1x4
499 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_imm_st1x4
500 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_reg_st1x4
501 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_imm_st2lane
502 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_reg_st2lane
503 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_imm_st2lane
504 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_reg_st2lane
505 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_imm_st2lane
506 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_reg_st2lane
507 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_imm_st2lane
508 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_reg_st2lane
509 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_imm_st2lane
510 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_reg_st2lane
511 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_imm_st2lane
512 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_reg_st2lane
513 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_imm_st2lane
514 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_reg_st2lane
515 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_imm_st2lane
516 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_reg_st2lane
517 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_imm_st2lane
518 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_reg_st2lane
519 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_imm_st2lane
520 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_reg_st2lane
521 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_imm_st2lane
522 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_reg_st2lane
523 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_imm_st2lane
524 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_reg_st2lane
525 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_imm_st3lane
526 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_reg_st3lane
527 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_imm_st3lane
528 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_reg_st3lane
529 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_imm_st3lane
530 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_reg_st3lane
531 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_imm_st3lane
532 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_reg_st3lane
533 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_imm_st3lane
534 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_reg_st3lane
535 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_imm_st3lane
536 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_reg_st3lane
537 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_imm_st3lane
538 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_reg_st3lane
539 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_imm_st3lane
540 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_reg_st3lane
541 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_imm_st3lane
542 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_reg_st3lane
543 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_imm_st3lane
544 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_reg_st3lane
545 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_imm_st3lane
546 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_reg_st3lane
547 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_imm_st3lane
548 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_reg_st3lane
549 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_imm_st4lane
550 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_reg_st4lane
551 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_imm_st4lane
552 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_reg_st4lane
553 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_imm_st4lane
554 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_reg_st4lane
555 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_imm_st4lane
556 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_reg_st4lane
557 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_imm_st4lane
558 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_reg_st4lane
559 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_imm_st4lane
560 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_reg_st4lane
561 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_imm_st4lane
562 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_reg_st4lane
563 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_imm_st4lane
564 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1i64_post_reg_st4lane
565 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_imm_st4lane
566 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_reg_st4lane
567 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_imm_st4lane
568 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_reg_st4lane
569 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_imm_st4lane
570 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_reg_st4lane
571 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_imm_st4lane
572 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v1f64_post_reg_st4lane
573 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_imm_ld1r
574 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_reg_ld1r
575 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_imm_ld1r
576 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_reg_ld1r
577 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_imm_ld1r
578 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_reg_ld1r
579 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_imm_ld1r
580 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_reg_ld1r
581 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_imm_ld1r
582 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_reg_ld1r
583 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_imm_ld1r
584 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_reg_ld1r
585 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_imm_ld1r
586 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_reg_ld1r
587 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_imm_ld1r
588 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_reg_ld1r
589 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_imm_ld1r
590 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_reg_ld1r
591 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_imm_ld1r
592 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_reg_ld1r
593 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_imm_ld1lane
594 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v16i8_post_reg_ld1lane
595 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_imm_ld1lane
596 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i8_post_reg_ld1lane
597 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_imm_ld1lane
598 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v8i16_post_reg_ld1lane
599 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_imm_ld1lane
600 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_reg_ld1lane
601 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_imm_ld1lane
602 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i32_post_reg_ld1lane
603 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_imm_ld1lane
604 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i32_post_reg_ld1lane
605 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_imm_ld1lane
606 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2i64_post_reg_ld1lane
607 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_imm_ld1lane
608 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_reg_ld1lane
609 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_imm_ld1lane
610 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f32_post_reg_ld1lane
611 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_imm_ld1lane
612 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v2f64_post_reg_ld1lane
613 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4f32_post_reg_ld1lane_dep_vec_on_load
614 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_v4i16_post_reg_ld1lane_forced_narrow
615 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_ld1lane_build
616 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_ld1lane_build_i16
617 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_ld1lane_build_half
618 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_ld1lane_build_i8
619 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for test_inc_cycle
620 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for load_single_extract_variable_index_i8
621 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for load_single_extract_variable_index_i16
622 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for load_single_extract_variable_index_i32
623 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for load_single_extract_variable_index_masked_i32
624 ; CHECK-GISEL-NOT: warning: Instruction selection used fallback path for load_single_extract_variable_index_masked2_i32
626 @ptr = global ptr null
628 define <8 x i8> @test_v8i8_pre_load(ptr %addr) {
629 ; CHECK-LABEL: test_v8i8_pre_load:
630 ; CHECK:       ; %bb.0:
631 ; CHECK-NEXT:    ldr d0, [x0, #40]!
632 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
633 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
634 ; CHECK-NEXT:    ret
635   %newaddr = getelementptr <8 x i8>, ptr %addr, i32 5
636   %val = load <8 x i8>, ptr %newaddr, align 8
637   store ptr %newaddr, ptr @ptr
638   ret <8 x i8> %val
641 define <8 x i8> @test_v8i8_post_load(ptr %addr) {
642 ; CHECK-LABEL: test_v8i8_post_load:
643 ; CHECK:       ; %bb.0:
644 ; CHECK-NEXT:    ldr d0, [x0], #40
645 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
646 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
647 ; CHECK-NEXT:    ret
648   %newaddr = getelementptr <8 x i8>, ptr %addr, i32 5
649   %val = load <8 x i8>, ptr %addr, align 8
650   store ptr %newaddr, ptr @ptr
651   ret <8 x i8> %val
654 define void @test_v8i8_pre_store(<8 x i8> %in, ptr %addr) {
655 ; CHECK-LABEL: test_v8i8_pre_store:
656 ; CHECK:       ; %bb.0:
657 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
658 ; CHECK-NEXT:    str d0, [x0, #40]!
659 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
660 ; CHECK-NEXT:    ret
661   %newaddr = getelementptr <8 x i8>, ptr %addr, i32 5
662   store <8 x i8> %in, ptr %newaddr, align 8
663   store ptr %newaddr, ptr @ptr
664   ret void
667 define void @test_v8i8_post_store(<8 x i8> %in, ptr %addr) {
668 ; CHECK-LABEL: test_v8i8_post_store:
669 ; CHECK:       ; %bb.0:
670 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
671 ; CHECK-NEXT:    str d0, [x0], #40
672 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
673 ; CHECK-NEXT:    ret
674   %newaddr = getelementptr <8 x i8>, ptr %addr, i32 5
675   store <8 x i8> %in, ptr %addr, align 8
676   store ptr %newaddr, ptr @ptr
677   ret void
680 define <4 x i16> @test_v4i16_pre_load(ptr %addr) {
681 ; CHECK-LABEL: test_v4i16_pre_load:
682 ; CHECK:       ; %bb.0:
683 ; CHECK-NEXT:    ldr d0, [x0, #40]!
684 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
685 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
686 ; CHECK-NEXT:    ret
687   %newaddr = getelementptr <4 x i16>, ptr %addr, i32 5
688   %val = load <4 x i16>, ptr %newaddr, align 8
689   store ptr %newaddr, ptr @ptr
690   ret <4 x i16> %val
693 define <4 x i16> @test_v4i16_post_load(ptr %addr) {
694 ; CHECK-LABEL: test_v4i16_post_load:
695 ; CHECK:       ; %bb.0:
696 ; CHECK-NEXT:    ldr d0, [x0], #40
697 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
698 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
699 ; CHECK-NEXT:    ret
700   %newaddr = getelementptr <4 x i16>, ptr %addr, i32 5
701   %val = load <4 x i16>, ptr %addr, align 8
702   store ptr %newaddr, ptr @ptr
703   ret <4 x i16> %val
706 define void @test_v4i16_pre_store(<4 x i16> %in, ptr %addr) {
707 ; CHECK-LABEL: test_v4i16_pre_store:
708 ; CHECK:       ; %bb.0:
709 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
710 ; CHECK-NEXT:    str d0, [x0, #40]!
711 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
712 ; CHECK-NEXT:    ret
713   %newaddr = getelementptr <4 x i16>, ptr %addr, i32 5
714   store <4 x i16> %in, ptr %newaddr, align 8
715   store ptr %newaddr, ptr @ptr
716   ret void
719 define void @test_v4i16_post_store(<4 x i16> %in, ptr %addr) {
720 ; CHECK-LABEL: test_v4i16_post_store:
721 ; CHECK:       ; %bb.0:
722 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
723 ; CHECK-NEXT:    str d0, [x0], #40
724 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
725 ; CHECK-NEXT:    ret
726   %newaddr = getelementptr <4 x i16>, ptr %addr, i32 5
727   store <4 x i16> %in, ptr %addr, align 8
728   store ptr %newaddr, ptr @ptr
729   ret void
732 define <2 x i32> @test_v2i32_pre_load(ptr %addr) {
733 ; CHECK-LABEL: test_v2i32_pre_load:
734 ; CHECK:       ; %bb.0:
735 ; CHECK-NEXT:    ldr d0, [x0, #40]!
736 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
737 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
738 ; CHECK-NEXT:    ret
739   %newaddr = getelementptr <2 x i32>, ptr %addr, i32 5
740   %val = load <2 x i32>, ptr %newaddr, align 8
741   store ptr %newaddr, ptr @ptr
742   ret <2 x i32> %val
745 define <2 x i32> @test_v2i32_post_load(ptr %addr) {
746 ; CHECK-LABEL: test_v2i32_post_load:
747 ; CHECK:       ; %bb.0:
748 ; CHECK-NEXT:    ldr d0, [x0], #40
749 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
750 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
751 ; CHECK-NEXT:    ret
752   %newaddr = getelementptr <2 x i32>, ptr %addr, i32 5
753   %val = load <2 x i32>, ptr %addr, align 8
754   store ptr %newaddr, ptr @ptr
755   ret <2 x i32> %val
758 define void @test_v2i32_pre_store(<2 x i32> %in, ptr %addr) {
759 ; CHECK-LABEL: test_v2i32_pre_store:
760 ; CHECK:       ; %bb.0:
761 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
762 ; CHECK-NEXT:    str d0, [x0, #40]!
763 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
764 ; CHECK-NEXT:    ret
765   %newaddr = getelementptr <2 x i32>, ptr %addr, i32 5
766   store <2 x i32> %in, ptr %newaddr, align 8
767   store ptr %newaddr, ptr @ptr
768   ret void
771 define void @test_v2i32_post_store(<2 x i32> %in, ptr %addr) {
772 ; CHECK-LABEL: test_v2i32_post_store:
773 ; CHECK:       ; %bb.0:
774 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
775 ; CHECK-NEXT:    str d0, [x0], #40
776 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
777 ; CHECK-NEXT:    ret
778   %newaddr = getelementptr <2 x i32>, ptr %addr, i32 5
779   store <2 x i32> %in, ptr %addr, align 8
780   store ptr %newaddr, ptr @ptr
781   ret void
784 define <2 x float> @test_v2f32_pre_load(ptr %addr) {
785 ; CHECK-LABEL: test_v2f32_pre_load:
786 ; CHECK:       ; %bb.0:
787 ; CHECK-NEXT:    ldr d0, [x0, #40]!
788 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
789 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
790 ; CHECK-NEXT:    ret
791   %newaddr = getelementptr <2 x float>, ptr %addr, i32 5
792   %val = load <2 x float>, ptr %newaddr, align 8
793   store ptr %newaddr, ptr @ptr
794   ret <2 x float> %val
797 define <2 x float> @test_v2f32_post_load(ptr %addr) {
798 ; CHECK-LABEL: test_v2f32_post_load:
799 ; CHECK:       ; %bb.0:
800 ; CHECK-NEXT:    ldr d0, [x0], #40
801 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
802 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
803 ; CHECK-NEXT:    ret
804   %newaddr = getelementptr <2 x float>, ptr %addr, i32 5
805   %val = load <2 x float>, ptr %addr, align 8
806   store ptr %newaddr, ptr @ptr
807   ret <2 x float> %val
810 define void @test_v2f32_pre_store(<2 x float> %in, ptr %addr) {
811 ; CHECK-LABEL: test_v2f32_pre_store:
812 ; CHECK:       ; %bb.0:
813 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
814 ; CHECK-NEXT:    str d0, [x0, #40]!
815 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
816 ; CHECK-NEXT:    ret
817   %newaddr = getelementptr <2 x float>, ptr %addr, i32 5
818   store <2 x float> %in, ptr %newaddr, align 8
819   store ptr %newaddr, ptr @ptr
820   ret void
823 define void @test_v2f32_post_store(<2 x float> %in, ptr %addr) {
824 ; CHECK-LABEL: test_v2f32_post_store:
825 ; CHECK:       ; %bb.0:
826 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
827 ; CHECK-NEXT:    str d0, [x0], #40
828 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
829 ; CHECK-NEXT:    ret
830   %newaddr = getelementptr <2 x float>, ptr %addr, i32 5
831   store <2 x float> %in, ptr %addr, align 8
832   store ptr %newaddr, ptr @ptr
833   ret void
836 define <1 x i64> @test_v1i64_pre_load(ptr %addr) {
837 ; SDAG-LABEL: test_v1i64_pre_load:
838 ; SDAG:       ; %bb.0:
839 ; SDAG-NEXT:    ldr d0, [x0, #40]!
840 ; SDAG-NEXT:    adrp x8, _ptr@PAGE
841 ; SDAG-NEXT:    str x0, [x8, _ptr@PAGEOFF]
842 ; SDAG-NEXT:    ret
844 ; CHECK-GISEL-LABEL: test_v1i64_pre_load:
845 ; CHECK-GISEL:       ; %bb.0:
846 ; CHECK-GISEL-NEXT:    ldr x8, [x0, #40]!
847 ; CHECK-GISEL-NEXT:    adrp x9, _ptr@PAGE
848 ; CHECK-GISEL-NEXT:    str x0, [x9, _ptr@PAGEOFF]
849 ; CHECK-GISEL-NEXT:    fmov d0, x8
850 ; CHECK-GISEL-NEXT:    ret
851   %newaddr = getelementptr <1 x i64>, ptr %addr, i32 5
852   %val = load <1 x i64>, ptr %newaddr, align 8
853   store ptr %newaddr, ptr @ptr
854   ret <1 x i64> %val
857 define <1 x i64> @test_v1i64_post_load(ptr %addr) {
858 ; SDAG-LABEL: test_v1i64_post_load:
859 ; SDAG:       ; %bb.0:
860 ; SDAG-NEXT:    ldr d0, [x0], #40
861 ; SDAG-NEXT:    adrp x8, _ptr@PAGE
862 ; SDAG-NEXT:    str x0, [x8, _ptr@PAGEOFF]
863 ; SDAG-NEXT:    ret
865 ; CHECK-GISEL-LABEL: test_v1i64_post_load:
866 ; CHECK-GISEL:       ; %bb.0:
867 ; CHECK-GISEL-NEXT:    ldr x8, [x0], #40
868 ; CHECK-GISEL-NEXT:    adrp x9, _ptr@PAGE
869 ; CHECK-GISEL-NEXT:    str x0, [x9, _ptr@PAGEOFF]
870 ; CHECK-GISEL-NEXT:    fmov d0, x8
871 ; CHECK-GISEL-NEXT:    ret
872   %newaddr = getelementptr <1 x i64>, ptr %addr, i32 5
873   %val = load <1 x i64>, ptr %addr, align 8
874   store ptr %newaddr, ptr @ptr
875   ret <1 x i64> %val
878 define void @test_v1i64_pre_store(<1 x i64> %in, ptr %addr) {
879 ; CHECK-LABEL: test_v1i64_pre_store:
880 ; CHECK:       ; %bb.0:
881 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
882 ; CHECK-NEXT:    str d0, [x0, #40]!
883 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
884 ; CHECK-NEXT:    ret
885   %newaddr = getelementptr <1 x i64>, ptr %addr, i32 5
886   store <1 x i64> %in, ptr %newaddr, align 8
887   store ptr %newaddr, ptr @ptr
888   ret void
891 define void @test_v1i64_post_store(<1 x i64> %in, ptr %addr) {
892 ; CHECK-LABEL: test_v1i64_post_store:
893 ; CHECK:       ; %bb.0:
894 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
895 ; CHECK-NEXT:    str d0, [x0], #40
896 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
897 ; CHECK-NEXT:    ret
898   %newaddr = getelementptr <1 x i64>, ptr %addr, i32 5
899   store <1 x i64> %in, ptr %addr, align 8
900   store ptr %newaddr, ptr @ptr
901   ret void
904 define <16 x i8> @test_v16i8_pre_load(ptr %addr) {
905 ; CHECK-LABEL: test_v16i8_pre_load:
906 ; CHECK:       ; %bb.0:
907 ; CHECK-NEXT:    ldr q0, [x0, #80]!
908 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
909 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
910 ; CHECK-NEXT:    ret
911   %newaddr = getelementptr <16 x i8>, ptr %addr, i32 5
912   %val = load <16 x i8>, ptr %newaddr, align 8
913   store ptr %newaddr, ptr @ptr
914   ret <16 x i8> %val
917 define <16 x i8> @test_v16i8_post_load(ptr %addr) {
918 ; CHECK-LABEL: test_v16i8_post_load:
919 ; CHECK:       ; %bb.0:
920 ; CHECK-NEXT:    ldr q0, [x0], #80
921 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
922 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
923 ; CHECK-NEXT:    ret
924   %newaddr = getelementptr <16 x i8>, ptr %addr, i32 5
925   %val = load <16 x i8>, ptr %addr, align 8
926   store ptr %newaddr, ptr @ptr
927   ret <16 x i8> %val
930 define void @test_v16i8_pre_store(<16 x i8> %in, ptr %addr) {
931 ; CHECK-LABEL: test_v16i8_pre_store:
932 ; CHECK:       ; %bb.0:
933 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
934 ; CHECK-NEXT:    str q0, [x0, #80]!
935 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
936 ; CHECK-NEXT:    ret
937   %newaddr = getelementptr <16 x i8>, ptr %addr, i32 5
938   store <16 x i8> %in, ptr %newaddr, align 8
939   store ptr %newaddr, ptr @ptr
940   ret void
943 define void @test_v16i8_post_store(<16 x i8> %in, ptr %addr) {
944 ; CHECK-LABEL: test_v16i8_post_store:
945 ; CHECK:       ; %bb.0:
946 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
947 ; CHECK-NEXT:    str q0, [x0], #80
948 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
949 ; CHECK-NEXT:    ret
950   %newaddr = getelementptr <16 x i8>, ptr %addr, i32 5
951   store <16 x i8> %in, ptr %addr, align 8
952   store ptr %newaddr, ptr @ptr
953   ret void
956 define <8 x i16> @test_v8i16_pre_load(ptr %addr) {
957 ; CHECK-LABEL: test_v8i16_pre_load:
958 ; CHECK:       ; %bb.0:
959 ; CHECK-NEXT:    ldr q0, [x0, #80]!
960 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
961 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
962 ; CHECK-NEXT:    ret
963   %newaddr = getelementptr <8 x i16>, ptr %addr, i32 5
964   %val = load <8 x i16>, ptr %newaddr, align 8
965   store ptr %newaddr, ptr @ptr
966   ret <8 x i16> %val
969 define <8 x i16> @test_v8i16_post_load(ptr %addr) {
970 ; CHECK-LABEL: test_v8i16_post_load:
971 ; CHECK:       ; %bb.0:
972 ; CHECK-NEXT:    ldr q0, [x0], #80
973 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
974 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
975 ; CHECK-NEXT:    ret
976   %newaddr = getelementptr <8 x i16>, ptr %addr, i32 5
977   %val = load <8 x i16>, ptr %addr, align 8
978   store ptr %newaddr, ptr @ptr
979   ret <8 x i16> %val
982 define void @test_v8i16_pre_store(<8 x i16> %in, ptr %addr) {
983 ; CHECK-LABEL: test_v8i16_pre_store:
984 ; CHECK:       ; %bb.0:
985 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
986 ; CHECK-NEXT:    str q0, [x0, #80]!
987 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
988 ; CHECK-NEXT:    ret
989   %newaddr = getelementptr <8 x i16>, ptr %addr, i32 5
990   store <8 x i16> %in, ptr %newaddr, align 8
991   store ptr %newaddr, ptr @ptr
992   ret void
995 define void @test_v8i16_post_store(<8 x i16> %in, ptr %addr) {
996 ; CHECK-LABEL: test_v8i16_post_store:
997 ; CHECK:       ; %bb.0:
998 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
999 ; CHECK-NEXT:    str q0, [x0], #80
1000 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
1001 ; CHECK-NEXT:    ret
1002   %newaddr = getelementptr <8 x i16>, ptr %addr, i32 5
1003   store <8 x i16> %in, ptr %addr, align 8
1004   store ptr %newaddr, ptr @ptr
1005   ret void
1008 define <4 x i32> @test_v4i32_pre_load(ptr %addr) {
1009 ; CHECK-LABEL: test_v4i32_pre_load:
1010 ; CHECK:       ; %bb.0:
1011 ; CHECK-NEXT:    ldr q0, [x0, #80]!
1012 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
1013 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
1014 ; CHECK-NEXT:    ret
1015   %newaddr = getelementptr <4 x i32>, ptr %addr, i32 5
1016   %val = load <4 x i32>, ptr %newaddr, align 8
1017   store ptr %newaddr, ptr @ptr
1018   ret <4 x i32> %val
1021 define <4 x i32> @test_v4i32_post_load(ptr %addr) {
1022 ; CHECK-LABEL: test_v4i32_post_load:
1023 ; CHECK:       ; %bb.0:
1024 ; CHECK-NEXT:    ldr q0, [x0], #80
1025 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
1026 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
1027 ; CHECK-NEXT:    ret
1028   %newaddr = getelementptr <4 x i32>, ptr %addr, i32 5
1029   %val = load <4 x i32>, ptr %addr, align 8
1030   store ptr %newaddr, ptr @ptr
1031   ret <4 x i32> %val
1034 define void @test_v4i32_pre_store(<4 x i32> %in, ptr %addr) {
1035 ; CHECK-LABEL: test_v4i32_pre_store:
1036 ; CHECK:       ; %bb.0:
1037 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
1038 ; CHECK-NEXT:    str q0, [x0, #80]!
1039 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
1040 ; CHECK-NEXT:    ret
1041   %newaddr = getelementptr <4 x i32>, ptr %addr, i32 5
1042   store <4 x i32> %in, ptr %newaddr, align 8
1043   store ptr %newaddr, ptr @ptr
1044   ret void
1047 define void @test_v4i32_post_store(<4 x i32> %in, ptr %addr) {
1048 ; CHECK-LABEL: test_v4i32_post_store:
1049 ; CHECK:       ; %bb.0:
1050 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
1051 ; CHECK-NEXT:    str q0, [x0], #80
1052 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
1053 ; CHECK-NEXT:    ret
1054   %newaddr = getelementptr <4 x i32>, ptr %addr, i32 5
1055   store <4 x i32> %in, ptr %addr, align 8
1056   store ptr %newaddr, ptr @ptr
1057   ret void
1061 define <4 x float> @test_v4f32_pre_load(ptr %addr) {
1062 ; CHECK-LABEL: test_v4f32_pre_load:
1063 ; CHECK:       ; %bb.0:
1064 ; CHECK-NEXT:    ldr q0, [x0, #80]!
1065 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
1066 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
1067 ; CHECK-NEXT:    ret
1068   %newaddr = getelementptr <4 x float>, ptr %addr, i32 5
1069   %val = load <4 x float>, ptr %newaddr, align 8
1070   store ptr %newaddr, ptr @ptr
1071   ret <4 x float> %val
1074 define <4 x float> @test_v4f32_post_load(ptr %addr) {
1075 ; CHECK-LABEL: test_v4f32_post_load:
1076 ; CHECK:       ; %bb.0:
1077 ; CHECK-NEXT:    ldr q0, [x0], #80
1078 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
1079 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
1080 ; CHECK-NEXT:    ret
1081   %newaddr = getelementptr <4 x float>, ptr %addr, i32 5
1082   %val = load <4 x float>, ptr %addr, align 8
1083   store ptr %newaddr, ptr @ptr
1084   ret <4 x float> %val
1087 define void @test_v4f32_pre_store(<4 x float> %in, ptr %addr) {
1088 ; CHECK-LABEL: test_v4f32_pre_store:
1089 ; CHECK:       ; %bb.0:
1090 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
1091 ; CHECK-NEXT:    str q0, [x0, #80]!
1092 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
1093 ; CHECK-NEXT:    ret
1094   %newaddr = getelementptr <4 x float>, ptr %addr, i32 5
1095   store <4 x float> %in, ptr %newaddr, align 8
1096   store ptr %newaddr, ptr @ptr
1097   ret void
1100 define void @test_v4f32_post_store(<4 x float> %in, ptr %addr) {
1101 ; CHECK-LABEL: test_v4f32_post_store:
1102 ; CHECK:       ; %bb.0:
1103 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
1104 ; CHECK-NEXT:    str q0, [x0], #80
1105 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
1106 ; CHECK-NEXT:    ret
1107   %newaddr = getelementptr <4 x float>, ptr %addr, i32 5
1108   store <4 x float> %in, ptr %addr, align 8
1109   store ptr %newaddr, ptr @ptr
1110   ret void
1114 define <2 x i64> @test_v2i64_pre_load(ptr %addr) {
1115 ; CHECK-LABEL: test_v2i64_pre_load:
1116 ; CHECK:       ; %bb.0:
1117 ; CHECK-NEXT:    ldr q0, [x0, #80]!
1118 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
1119 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
1120 ; CHECK-NEXT:    ret
1121   %newaddr = getelementptr <2 x i64>, ptr %addr, i32 5
1122   %val = load <2 x i64>, ptr %newaddr, align 8
1123   store ptr %newaddr, ptr @ptr
1124   ret <2 x i64> %val
1127 define <2 x i64> @test_v2i64_post_load(ptr %addr) {
1128 ; CHECK-LABEL: test_v2i64_post_load:
1129 ; CHECK:       ; %bb.0:
1130 ; CHECK-NEXT:    ldr q0, [x0], #80
1131 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
1132 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
1133 ; CHECK-NEXT:    ret
1134   %newaddr = getelementptr <2 x i64>, ptr %addr, i32 5
1135   %val = load <2 x i64>, ptr %addr, align 8
1136   store ptr %newaddr, ptr @ptr
1137   ret <2 x i64> %val
1140 define void @test_v2i64_pre_store(<2 x i64> %in, ptr %addr) {
1141 ; CHECK-LABEL: test_v2i64_pre_store:
1142 ; CHECK:       ; %bb.0:
1143 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
1144 ; CHECK-NEXT:    str q0, [x0, #80]!
1145 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
1146 ; CHECK-NEXT:    ret
1147   %newaddr = getelementptr <2 x i64>, ptr %addr, i32 5
1148   store <2 x i64> %in, ptr %newaddr, align 8
1149   store ptr %newaddr, ptr @ptr
1150   ret void
1153 define void @test_v2i64_post_store(<2 x i64> %in, ptr %addr) {
1154 ; CHECK-LABEL: test_v2i64_post_store:
1155 ; CHECK:       ; %bb.0:
1156 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
1157 ; CHECK-NEXT:    str q0, [x0], #80
1158 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
1159 ; CHECK-NEXT:    ret
1160   %newaddr = getelementptr <2 x i64>, ptr %addr, i32 5
1161   store <2 x i64> %in, ptr %addr, align 8
1162   store ptr %newaddr, ptr @ptr
1163   ret void
1167 define <2 x double> @test_v2f64_pre_load(ptr %addr) {
1168 ; CHECK-LABEL: test_v2f64_pre_load:
1169 ; CHECK:       ; %bb.0:
1170 ; CHECK-NEXT:    ldr q0, [x0, #80]!
1171 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
1172 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
1173 ; CHECK-NEXT:    ret
1174   %newaddr = getelementptr <2 x double>, ptr %addr, i32 5
1175   %val = load <2 x double>, ptr %newaddr, align 8
1176   store ptr %newaddr, ptr @ptr
1177   ret <2 x double> %val
1180 define <2 x double> @test_v2f64_post_load(ptr %addr) {
1181 ; CHECK-LABEL: test_v2f64_post_load:
1182 ; CHECK:       ; %bb.0:
1183 ; CHECK-NEXT:    ldr q0, [x0], #80
1184 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
1185 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
1186 ; CHECK-NEXT:    ret
1187   %newaddr = getelementptr <2 x double>, ptr %addr, i32 5
1188   %val = load <2 x double>, ptr %addr, align 8
1189   store ptr %newaddr, ptr @ptr
1190   ret <2 x double> %val
1193 define void @test_v2f64_pre_store(<2 x double> %in, ptr %addr) {
1194 ; CHECK-LABEL: test_v2f64_pre_store:
1195 ; CHECK:       ; %bb.0:
1196 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
1197 ; CHECK-NEXT:    str q0, [x0, #80]!
1198 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
1199 ; CHECK-NEXT:    ret
1200   %newaddr = getelementptr <2 x double>, ptr %addr, i32 5
1201   store <2 x double> %in, ptr %newaddr, align 8
1202   store ptr %newaddr, ptr @ptr
1203   ret void
1206 define void @test_v2f64_post_store(<2 x double> %in, ptr %addr) {
1207 ; CHECK-LABEL: test_v2f64_post_store:
1208 ; CHECK:       ; %bb.0:
1209 ; CHECK-NEXT:    adrp x8, _ptr@PAGE
1210 ; CHECK-NEXT:    str q0, [x0], #80
1211 ; CHECK-NEXT:    str x0, [x8, _ptr@PAGEOFF]
1212 ; CHECK-NEXT:    ret
1213   %newaddr = getelementptr <2 x double>, ptr %addr, i32 5
1214   store <2 x double> %in, ptr %addr, align 8
1215   store ptr %newaddr, ptr @ptr
1216   ret void
1219 define ptr @test_v16i8_post_imm_st1_lane(<16 x i8> %in, ptr %addr) {
1220 ; SDAG-LABEL: test_v16i8_post_imm_st1_lane:
1221 ; SDAG:       ; %bb.0:
1222 ; SDAG-NEXT:    st1.b { v0 }[3], [x0], #1
1223 ; SDAG-NEXT:    ret
1225 ; CHECK-GISEL-LABEL: test_v16i8_post_imm_st1_lane:
1226 ; CHECK-GISEL:       ; %bb.0:
1227 ; CHECK-GISEL-NEXT:    mov b0, v0[3]
1228 ; CHECK-GISEL-NEXT:    str b0, [x0], #1
1229 ; CHECK-GISEL-NEXT:    ret
1230   %elt = extractelement <16 x i8> %in, i32 3
1231   store i8 %elt, ptr %addr
1233   %newaddr = getelementptr i8, ptr %addr, i32 1
1234   ret ptr %newaddr
1237 define ptr @test_v16i8_post_reg_st1_lane(<16 x i8> %in, ptr %addr) {
1238 ; SDAG-LABEL: test_v16i8_post_reg_st1_lane:
1239 ; SDAG:       ; %bb.0:
1240 ; SDAG-NEXT:    mov w8, #2 ; =0x2
1241 ; SDAG-NEXT:    st1.b { v0 }[3], [x0], x8
1242 ; SDAG-NEXT:    ret
1244 ; CHECK-GISEL-LABEL: test_v16i8_post_reg_st1_lane:
1245 ; CHECK-GISEL:       ; %bb.0:
1246 ; CHECK-GISEL-NEXT:    mov b0, v0[3]
1247 ; CHECK-GISEL-NEXT:    str b0, [x0], #2
1248 ; CHECK-GISEL-NEXT:    ret
1249   %elt = extractelement <16 x i8> %in, i32 3
1250   store i8 %elt, ptr %addr
1252   %newaddr = getelementptr i8, ptr %addr, i32 2
1253   ret ptr %newaddr
1257 define ptr @test_v8i16_post_imm_st1_lane(<8 x i16> %in, ptr %addr) {
1258 ; SDAG-LABEL: test_v8i16_post_imm_st1_lane:
1259 ; SDAG:       ; %bb.0:
1260 ; SDAG-NEXT:    st1.h { v0 }[3], [x0], #2
1261 ; SDAG-NEXT:    ret
1263 ; CHECK-GISEL-LABEL: test_v8i16_post_imm_st1_lane:
1264 ; CHECK-GISEL:       ; %bb.0:
1265 ; CHECK-GISEL-NEXT:    mov h0, v0[3]
1266 ; CHECK-GISEL-NEXT:    str h0, [x0], #2
1267 ; CHECK-GISEL-NEXT:    ret
1268   %elt = extractelement <8 x i16> %in, i32 3
1269   store i16 %elt, ptr %addr
1271   %newaddr = getelementptr i16, ptr %addr, i32 1
1272   ret ptr %newaddr
1275 define ptr @test_v8i16_post_reg_st1_lane(<8 x i16> %in, ptr %addr) {
1276 ; SDAG-LABEL: test_v8i16_post_reg_st1_lane:
1277 ; SDAG:       ; %bb.0:
1278 ; SDAG-NEXT:    mov w8, #4 ; =0x4
1279 ; SDAG-NEXT:    st1.h { v0 }[3], [x0], x8
1280 ; SDAG-NEXT:    ret
1282 ; CHECK-GISEL-LABEL: test_v8i16_post_reg_st1_lane:
1283 ; CHECK-GISEL:       ; %bb.0:
1284 ; CHECK-GISEL-NEXT:    mov h0, v0[3]
1285 ; CHECK-GISEL-NEXT:    str h0, [x0], #4
1286 ; CHECK-GISEL-NEXT:    ret
1287   %elt = extractelement <8 x i16> %in, i32 3
1288   store i16 %elt, ptr %addr
1290   %newaddr = getelementptr i16, ptr %addr, i32 2
1291   ret ptr %newaddr
1294 define ptr @test_v4i32_post_imm_st1_lane(<4 x i32> %in, ptr %addr) {
1295 ; SDAG-LABEL: test_v4i32_post_imm_st1_lane:
1296 ; SDAG:       ; %bb.0:
1297 ; SDAG-NEXT:    st1.s { v0 }[3], [x0], #4
1298 ; SDAG-NEXT:    ret
1300 ; CHECK-GISEL-LABEL: test_v4i32_post_imm_st1_lane:
1301 ; CHECK-GISEL:       ; %bb.0:
1302 ; CHECK-GISEL-NEXT:    mov s0, v0[3]
1303 ; CHECK-GISEL-NEXT:    str s0, [x0], #4
1304 ; CHECK-GISEL-NEXT:    ret
1305   %elt = extractelement <4 x i32> %in, i32 3
1306   store i32 %elt, ptr %addr
1308   %newaddr = getelementptr i32, ptr %addr, i32 1
1309   ret ptr %newaddr
1312 define ptr @test_v4i32_post_reg_st1_lane(<4 x i32> %in, ptr %addr) {
1313 ; SDAG-LABEL: test_v4i32_post_reg_st1_lane:
1314 ; SDAG:       ; %bb.0:
1315 ; SDAG-NEXT:    mov w8, #8 ; =0x8
1316 ; SDAG-NEXT:    st1.s { v0 }[3], [x0], x8
1317 ; SDAG-NEXT:    ret
1319 ; CHECK-GISEL-LABEL: test_v4i32_post_reg_st1_lane:
1320 ; CHECK-GISEL:       ; %bb.0:
1321 ; CHECK-GISEL-NEXT:    mov s0, v0[3]
1322 ; CHECK-GISEL-NEXT:    str s0, [x0], #8
1323 ; CHECK-GISEL-NEXT:    ret
1324   %elt = extractelement <4 x i32> %in, i32 3
1325   store i32 %elt, ptr %addr
1327   %newaddr = getelementptr i32, ptr %addr, i32 2
1328   ret ptr %newaddr
1331 define ptr @test_v4f32_post_imm_st1_lane(<4 x float> %in, ptr %addr) {
1332 ; SDAG-LABEL: test_v4f32_post_imm_st1_lane:
1333 ; SDAG:       ; %bb.0:
1334 ; SDAG-NEXT:    st1.s { v0 }[3], [x0], #4
1335 ; SDAG-NEXT:    ret
1337 ; CHECK-GISEL-LABEL: test_v4f32_post_imm_st1_lane:
1338 ; CHECK-GISEL:       ; %bb.0:
1339 ; CHECK-GISEL-NEXT:    mov s0, v0[3]
1340 ; CHECK-GISEL-NEXT:    str s0, [x0], #4
1341 ; CHECK-GISEL-NEXT:    ret
1342   %elt = extractelement <4 x float> %in, i32 3
1343   store float %elt, ptr %addr
1345   %newaddr = getelementptr float, ptr %addr, i32 1
1346   ret ptr %newaddr
1349 define ptr @test_v4f32_post_reg_st1_lane(<4 x float> %in, ptr %addr) {
1350 ; SDAG-LABEL: test_v4f32_post_reg_st1_lane:
1351 ; SDAG:       ; %bb.0:
1352 ; SDAG-NEXT:    mov w8, #8 ; =0x8
1353 ; SDAG-NEXT:    st1.s { v0 }[3], [x0], x8
1354 ; SDAG-NEXT:    ret
1356 ; CHECK-GISEL-LABEL: test_v4f32_post_reg_st1_lane:
1357 ; CHECK-GISEL:       ; %bb.0:
1358 ; CHECK-GISEL-NEXT:    mov s0, v0[3]
1359 ; CHECK-GISEL-NEXT:    str s0, [x0], #8
1360 ; CHECK-GISEL-NEXT:    ret
1361   %elt = extractelement <4 x float> %in, i32 3
1362   store float %elt, ptr %addr
1364   %newaddr = getelementptr float, ptr %addr, i32 2
1365   ret ptr %newaddr
1368 define ptr @test_v2i64_post_imm_st1_lane(<2 x i64> %in, ptr %addr) {
1369 ; SDAG-LABEL: test_v2i64_post_imm_st1_lane:
1370 ; SDAG:       ; %bb.0:
1371 ; SDAG-NEXT:    st1.d { v0 }[1], [x0], #8
1372 ; SDAG-NEXT:    ret
1374 ; CHECK-GISEL-LABEL: test_v2i64_post_imm_st1_lane:
1375 ; CHECK-GISEL:       ; %bb.0:
1376 ; CHECK-GISEL-NEXT:    mov d0, v0[1]
1377 ; CHECK-GISEL-NEXT:    str d0, [x0], #8
1378 ; CHECK-GISEL-NEXT:    ret
1379   %elt = extractelement <2 x i64> %in, i64 1
1380   store i64 %elt, ptr %addr
1382   %newaddr = getelementptr i64, ptr %addr, i64 1
1383   ret ptr %newaddr
1386 define ptr @test_v2i64_post_reg_st1_lane(<2 x i64> %in, ptr %addr) {
1387 ; SDAG-LABEL: test_v2i64_post_reg_st1_lane:
1388 ; SDAG:       ; %bb.0:
1389 ; SDAG-NEXT:    mov w8, #16 ; =0x10
1390 ; SDAG-NEXT:    st1.d { v0 }[1], [x0], x8
1391 ; SDAG-NEXT:    ret
1393 ; CHECK-GISEL-LABEL: test_v2i64_post_reg_st1_lane:
1394 ; CHECK-GISEL:       ; %bb.0:
1395 ; CHECK-GISEL-NEXT:    mov d0, v0[1]
1396 ; CHECK-GISEL-NEXT:    str d0, [x0], #16
1397 ; CHECK-GISEL-NEXT:    ret
1398   %elt = extractelement <2 x i64> %in, i64 1
1399   store i64 %elt, ptr %addr
1401   %newaddr = getelementptr i64, ptr %addr, i64 2
1402   ret ptr %newaddr
1405 define ptr @test_v2f64_post_imm_st1_lane(<2 x double> %in, ptr %addr) {
1406 ; SDAG-LABEL: test_v2f64_post_imm_st1_lane:
1407 ; SDAG:       ; %bb.0:
1408 ; SDAG-NEXT:    st1.d { v0 }[1], [x0], #8
1409 ; SDAG-NEXT:    ret
1411 ; CHECK-GISEL-LABEL: test_v2f64_post_imm_st1_lane:
1412 ; CHECK-GISEL:       ; %bb.0:
1413 ; CHECK-GISEL-NEXT:    mov d0, v0[1]
1414 ; CHECK-GISEL-NEXT:    str d0, [x0], #8
1415 ; CHECK-GISEL-NEXT:    ret
1416   %elt = extractelement <2 x double> %in, i32 1
1417   store double %elt, ptr %addr
1419   %newaddr = getelementptr double, ptr %addr, i32 1
1420   ret ptr %newaddr
1423 define ptr @test_v2f64_post_reg_st1_lane(<2 x double> %in, ptr %addr) {
1424 ; SDAG-LABEL: test_v2f64_post_reg_st1_lane:
1425 ; SDAG:       ; %bb.0:
1426 ; SDAG-NEXT:    mov w8, #16 ; =0x10
1427 ; SDAG-NEXT:    st1.d { v0 }[1], [x0], x8
1428 ; SDAG-NEXT:    ret
1430 ; CHECK-GISEL-LABEL: test_v2f64_post_reg_st1_lane:
1431 ; CHECK-GISEL:       ; %bb.0:
1432 ; CHECK-GISEL-NEXT:    mov d0, v0[1]
1433 ; CHECK-GISEL-NEXT:    str d0, [x0], #16
1434 ; CHECK-GISEL-NEXT:    ret
1435   %elt = extractelement <2 x double> %in, i32 1
1436   store double %elt, ptr %addr
1438   %newaddr = getelementptr double, ptr %addr, i32 2
1439   ret ptr %newaddr
1442 define ptr @test_v8i8_post_imm_st1_lane(<8 x i8> %in, ptr %addr) {
1443 ; SDAG-LABEL: test_v8i8_post_imm_st1_lane:
1444 ; SDAG:       ; %bb.0:
1445 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 def $q0
1446 ; SDAG-NEXT:    st1.b { v0 }[3], [x0], #1
1447 ; SDAG-NEXT:    ret
1449 ; CHECK-GISEL-LABEL: test_v8i8_post_imm_st1_lane:
1450 ; CHECK-GISEL:       ; %bb.0:
1451 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 def $q0
1452 ; CHECK-GISEL-NEXT:    mov b0, v0[3]
1453 ; CHECK-GISEL-NEXT:    str b0, [x0], #1
1454 ; CHECK-GISEL-NEXT:    ret
1455   %elt = extractelement <8 x i8> %in, i32 3
1456   store i8 %elt, ptr %addr
1458   %newaddr = getelementptr i8, ptr %addr, i32 1
1459   ret ptr %newaddr
1462 define ptr @test_v8i8_post_reg_st1_lane(<8 x i8> %in, ptr %addr) {
1463 ; SDAG-LABEL: test_v8i8_post_reg_st1_lane:
1464 ; SDAG:       ; %bb.0:
1465 ; SDAG-NEXT:    mov w8, #2 ; =0x2
1466 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 def $q0
1467 ; SDAG-NEXT:    st1.b { v0 }[3], [x0], x8
1468 ; SDAG-NEXT:    ret
1470 ; CHECK-GISEL-LABEL: test_v8i8_post_reg_st1_lane:
1471 ; CHECK-GISEL:       ; %bb.0:
1472 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 def $q0
1473 ; CHECK-GISEL-NEXT:    mov b0, v0[3]
1474 ; CHECK-GISEL-NEXT:    str b0, [x0], #2
1475 ; CHECK-GISEL-NEXT:    ret
1476   %elt = extractelement <8 x i8> %in, i32 3
1477   store i8 %elt, ptr %addr
1479   %newaddr = getelementptr i8, ptr %addr, i32 2
1480   ret ptr %newaddr
1483 define ptr @test_v4i16_post_imm_st1_lane(<4 x i16> %in, ptr %addr) {
1484 ; SDAG-LABEL: test_v4i16_post_imm_st1_lane:
1485 ; SDAG:       ; %bb.0:
1486 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 def $q0
1487 ; SDAG-NEXT:    st1.h { v0 }[3], [x0], #2
1488 ; SDAG-NEXT:    ret
1490 ; CHECK-GISEL-LABEL: test_v4i16_post_imm_st1_lane:
1491 ; CHECK-GISEL:       ; %bb.0:
1492 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 def $q0
1493 ; CHECK-GISEL-NEXT:    mov h0, v0[3]
1494 ; CHECK-GISEL-NEXT:    str h0, [x0], #2
1495 ; CHECK-GISEL-NEXT:    ret
1496   %elt = extractelement <4 x i16> %in, i32 3
1497   store i16 %elt, ptr %addr
1499   %newaddr = getelementptr i16, ptr %addr, i32 1
1500   ret ptr %newaddr
1503 define ptr @test_v4i16_post_reg_st1_lane(<4 x i16> %in, ptr %addr) {
1504 ; SDAG-LABEL: test_v4i16_post_reg_st1_lane:
1505 ; SDAG:       ; %bb.0:
1506 ; SDAG-NEXT:    mov w8, #4 ; =0x4
1507 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 def $q0
1508 ; SDAG-NEXT:    st1.h { v0 }[3], [x0], x8
1509 ; SDAG-NEXT:    ret
1511 ; CHECK-GISEL-LABEL: test_v4i16_post_reg_st1_lane:
1512 ; CHECK-GISEL:       ; %bb.0:
1513 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 def $q0
1514 ; CHECK-GISEL-NEXT:    mov h0, v0[3]
1515 ; CHECK-GISEL-NEXT:    str h0, [x0], #4
1516 ; CHECK-GISEL-NEXT:    ret
1517   %elt = extractelement <4 x i16> %in, i32 3
1518   store i16 %elt, ptr %addr
1520   %newaddr = getelementptr i16, ptr %addr, i32 2
1521   ret ptr %newaddr
1524 define ptr @test_v2i32_post_imm_st1_lane(<2 x i32> %in, ptr %addr) {
1525 ; SDAG-LABEL: test_v2i32_post_imm_st1_lane:
1526 ; SDAG:       ; %bb.0:
1527 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 def $q0
1528 ; SDAG-NEXT:    st1.s { v0 }[1], [x0], #4
1529 ; SDAG-NEXT:    ret
1531 ; CHECK-GISEL-LABEL: test_v2i32_post_imm_st1_lane:
1532 ; CHECK-GISEL:       ; %bb.0:
1533 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 def $q0
1534 ; CHECK-GISEL-NEXT:    mov s0, v0[1]
1535 ; CHECK-GISEL-NEXT:    str s0, [x0], #4
1536 ; CHECK-GISEL-NEXT:    ret
1537   %elt = extractelement <2 x i32> %in, i32 1
1538   store i32 %elt, ptr %addr
1540   %newaddr = getelementptr i32, ptr %addr, i32 1
1541   ret ptr %newaddr
1544 define ptr @test_v2i32_post_reg_st1_lane(<2 x i32> %in, ptr %addr) {
1545 ; SDAG-LABEL: test_v2i32_post_reg_st1_lane:
1546 ; SDAG:       ; %bb.0:
1547 ; SDAG-NEXT:    mov w8, #8 ; =0x8
1548 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 def $q0
1549 ; SDAG-NEXT:    st1.s { v0 }[1], [x0], x8
1550 ; SDAG-NEXT:    ret
1552 ; CHECK-GISEL-LABEL: test_v2i32_post_reg_st1_lane:
1553 ; CHECK-GISEL:       ; %bb.0:
1554 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 def $q0
1555 ; CHECK-GISEL-NEXT:    mov s0, v0[1]
1556 ; CHECK-GISEL-NEXT:    str s0, [x0], #8
1557 ; CHECK-GISEL-NEXT:    ret
1558   %elt = extractelement <2 x i32> %in, i32 1
1559   store i32 %elt, ptr %addr
1561   %newaddr = getelementptr i32, ptr %addr, i32 2
1562   ret ptr %newaddr
1565 define ptr @test_v2f32_post_imm_st1_lane(<2 x float> %in, ptr %addr) {
1566 ; SDAG-LABEL: test_v2f32_post_imm_st1_lane:
1567 ; SDAG:       ; %bb.0:
1568 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 def $q0
1569 ; SDAG-NEXT:    st1.s { v0 }[1], [x0], #4
1570 ; SDAG-NEXT:    ret
1572 ; CHECK-GISEL-LABEL: test_v2f32_post_imm_st1_lane:
1573 ; CHECK-GISEL:       ; %bb.0:
1574 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 def $q0
1575 ; CHECK-GISEL-NEXT:    mov s0, v0[1]
1576 ; CHECK-GISEL-NEXT:    str s0, [x0], #4
1577 ; CHECK-GISEL-NEXT:    ret
1578   %elt = extractelement <2 x float> %in, i32 1
1579   store float %elt, ptr %addr
1581   %newaddr = getelementptr float, ptr %addr, i32 1
1582   ret ptr %newaddr
1585 define ptr @test_v2f32_post_reg_st1_lane(<2 x float> %in, ptr %addr) {
1586 ; SDAG-LABEL: test_v2f32_post_reg_st1_lane:
1587 ; SDAG:       ; %bb.0:
1588 ; SDAG-NEXT:    mov w8, #8 ; =0x8
1589 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 def $q0
1590 ; SDAG-NEXT:    st1.s { v0 }[1], [x0], x8
1591 ; SDAG-NEXT:    ret
1593 ; CHECK-GISEL-LABEL: test_v2f32_post_reg_st1_lane:
1594 ; CHECK-GISEL:       ; %bb.0:
1595 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 def $q0
1596 ; CHECK-GISEL-NEXT:    mov s0, v0[1]
1597 ; CHECK-GISEL-NEXT:    str s0, [x0], #8
1598 ; CHECK-GISEL-NEXT:    ret
1599   %elt = extractelement <2 x float> %in, i32 1
1600   store float %elt, ptr %addr
1602   %newaddr = getelementptr float, ptr %addr, i32 2
1603   ret ptr %newaddr
1606 define { <16 x i8>, <16 x i8> } @test_v16i8_post_imm_ld2(ptr %A, ptr %ptr) {
1607 ; SDAG-LABEL: test_v16i8_post_imm_ld2:
1608 ; SDAG:       ; %bb.0:
1609 ; SDAG-NEXT:    ld2.16b { v0, v1 }, [x0], #32
1610 ; SDAG-NEXT:    str x0, [x1]
1611 ; SDAG-NEXT:    ret
1613 ; CHECK-GISEL-LABEL: test_v16i8_post_imm_ld2:
1614 ; CHECK-GISEL:       ; %bb.0:
1615 ; CHECK-GISEL-NEXT:    ld2.16b { v0, v1 }, [x0]
1616 ; CHECK-GISEL-NEXT:    add x8, x0, #32
1617 ; CHECK-GISEL-NEXT:    str x8, [x1]
1618 ; CHECK-GISEL-NEXT:    ret
1619   %ld2 = tail call { <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld2.v16i8.p0(ptr %A)
1620   %tmp = getelementptr i8, ptr %A, i32 32
1621   store ptr %tmp, ptr %ptr
1622   ret { <16 x i8>, <16 x i8> } %ld2
1625 define { <16 x i8>, <16 x i8> } @test_v16i8_post_reg_ld2(ptr %A, ptr %ptr, i64 %inc) {
1626 ; SDAG-LABEL: test_v16i8_post_reg_ld2:
1627 ; SDAG:       ; %bb.0:
1628 ; SDAG-NEXT:    ld2.16b { v0, v1 }, [x0], x2
1629 ; SDAG-NEXT:    str x0, [x1]
1630 ; SDAG-NEXT:    ret
1632 ; CHECK-GISEL-LABEL: test_v16i8_post_reg_ld2:
1633 ; CHECK-GISEL:       ; %bb.0:
1634 ; CHECK-GISEL-NEXT:    ld2.16b { v0, v1 }, [x0]
1635 ; CHECK-GISEL-NEXT:    add x8, x0, x2
1636 ; CHECK-GISEL-NEXT:    str x8, [x1]
1637 ; CHECK-GISEL-NEXT:    ret
1638   %ld2 = tail call { <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld2.v16i8.p0(ptr %A)
1639   %tmp = getelementptr i8, ptr %A, i64 %inc
1640   store ptr %tmp, ptr %ptr
1641   ret { <16 x i8>, <16 x i8> } %ld2
1644 declare { <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld2.v16i8.p0(ptr)
1647 define { <8 x i8>, <8 x i8> } @test_v8i8_post_imm_ld2(ptr %A, ptr %ptr) {
1648 ; SDAG-LABEL: test_v8i8_post_imm_ld2:
1649 ; SDAG:       ; %bb.0:
1650 ; SDAG-NEXT:    ld2.8b { v0, v1 }, [x0], #16
1651 ; SDAG-NEXT:    str x0, [x1]
1652 ; SDAG-NEXT:    ret
1654 ; CHECK-GISEL-LABEL: test_v8i8_post_imm_ld2:
1655 ; CHECK-GISEL:       ; %bb.0:
1656 ; CHECK-GISEL-NEXT:    ld2.8b { v0, v1 }, [x0]
1657 ; CHECK-GISEL-NEXT:    add x8, x0, #16
1658 ; CHECK-GISEL-NEXT:    str x8, [x1]
1659 ; CHECK-GISEL-NEXT:    ret
1660   %ld2 = tail call { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld2.v8i8.p0(ptr %A)
1661   %tmp = getelementptr i8, ptr %A, i32 16
1662   store ptr %tmp, ptr %ptr
1663   ret { <8 x i8>, <8 x i8> } %ld2
1666 define { <8 x i8>, <8 x i8> } @test_v8i8_post_reg_ld2(ptr %A, ptr %ptr, i64 %inc) {
1667 ; SDAG-LABEL: test_v8i8_post_reg_ld2:
1668 ; SDAG:       ; %bb.0:
1669 ; SDAG-NEXT:    ld2.8b { v0, v1 }, [x0], x2
1670 ; SDAG-NEXT:    str x0, [x1]
1671 ; SDAG-NEXT:    ret
1673 ; CHECK-GISEL-LABEL: test_v8i8_post_reg_ld2:
1674 ; CHECK-GISEL:       ; %bb.0:
1675 ; CHECK-GISEL-NEXT:    ld2.8b { v0, v1 }, [x0]
1676 ; CHECK-GISEL-NEXT:    add x8, x0, x2
1677 ; CHECK-GISEL-NEXT:    str x8, [x1]
1678 ; CHECK-GISEL-NEXT:    ret
1679   %ld2 = tail call { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld2.v8i8.p0(ptr %A)
1680   %tmp = getelementptr i8, ptr %A, i64 %inc
1681   store ptr %tmp, ptr %ptr
1682   ret { <8 x i8>, <8 x i8> } %ld2
1685 declare { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld2.v8i8.p0(ptr)
1688 define { <8 x i16>, <8 x i16> } @test_v8i16_post_imm_ld2(ptr %A, ptr %ptr) {
1689 ; SDAG-LABEL: test_v8i16_post_imm_ld2:
1690 ; SDAG:       ; %bb.0:
1691 ; SDAG-NEXT:    ld2.8h { v0, v1 }, [x0], #32
1692 ; SDAG-NEXT:    str x0, [x1]
1693 ; SDAG-NEXT:    ret
1695 ; CHECK-GISEL-LABEL: test_v8i16_post_imm_ld2:
1696 ; CHECK-GISEL:       ; %bb.0:
1697 ; CHECK-GISEL-NEXT:    ld2.8h { v0, v1 }, [x0]
1698 ; CHECK-GISEL-NEXT:    add x8, x0, #32
1699 ; CHECK-GISEL-NEXT:    str x8, [x1]
1700 ; CHECK-GISEL-NEXT:    ret
1701   %ld2 = tail call { <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld2.v8i16.p0(ptr %A)
1702   %tmp = getelementptr i16, ptr %A, i32 16
1703   store ptr %tmp, ptr %ptr
1704   ret { <8 x i16>, <8 x i16> } %ld2
1707 define { <8 x i16>, <8 x i16> } @test_v8i16_post_reg_ld2(ptr %A, ptr %ptr, i64 %inc) {
1708 ; SDAG-LABEL: test_v8i16_post_reg_ld2:
1709 ; SDAG:       ; %bb.0:
1710 ; SDAG-NEXT:    lsl x8, x2, #1
1711 ; SDAG-NEXT:    ld2.8h { v0, v1 }, [x0], x8
1712 ; SDAG-NEXT:    str x0, [x1]
1713 ; SDAG-NEXT:    ret
1715 ; CHECK-GISEL-LABEL: test_v8i16_post_reg_ld2:
1716 ; CHECK-GISEL:       ; %bb.0:
1717 ; CHECK-GISEL-NEXT:    ld2.8h { v0, v1 }, [x0]
1718 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #1
1719 ; CHECK-GISEL-NEXT:    str x8, [x1]
1720 ; CHECK-GISEL-NEXT:    ret
1721   %ld2 = tail call { <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld2.v8i16.p0(ptr %A)
1722   %tmp = getelementptr i16, ptr %A, i64 %inc
1723   store ptr %tmp, ptr %ptr
1724   ret { <8 x i16>, <8 x i16> } %ld2
1727 declare { <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld2.v8i16.p0(ptr)
1730 define { <4 x i16>, <4 x i16> } @test_v4i16_post_imm_ld2(ptr %A, ptr %ptr) {
1731 ; SDAG-LABEL: test_v4i16_post_imm_ld2:
1732 ; SDAG:       ; %bb.0:
1733 ; SDAG-NEXT:    ld2.4h { v0, v1 }, [x0], #16
1734 ; SDAG-NEXT:    str x0, [x1]
1735 ; SDAG-NEXT:    ret
1737 ; CHECK-GISEL-LABEL: test_v4i16_post_imm_ld2:
1738 ; CHECK-GISEL:       ; %bb.0:
1739 ; CHECK-GISEL-NEXT:    ld2.4h { v0, v1 }, [x0]
1740 ; CHECK-GISEL-NEXT:    add x8, x0, #16
1741 ; CHECK-GISEL-NEXT:    str x8, [x1]
1742 ; CHECK-GISEL-NEXT:    ret
1743   %ld2 = tail call { <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld2.v4i16.p0(ptr %A)
1744   %tmp = getelementptr i16, ptr %A, i32 8
1745   store ptr %tmp, ptr %ptr
1746   ret { <4 x i16>, <4 x i16> } %ld2
1749 define { <4 x i16>, <4 x i16> } @test_v4i16_post_reg_ld2(ptr %A, ptr %ptr, i64 %inc) {
1750 ; SDAG-LABEL: test_v4i16_post_reg_ld2:
1751 ; SDAG:       ; %bb.0:
1752 ; SDAG-NEXT:    lsl x8, x2, #1
1753 ; SDAG-NEXT:    ld2.4h { v0, v1 }, [x0], x8
1754 ; SDAG-NEXT:    str x0, [x1]
1755 ; SDAG-NEXT:    ret
1757 ; CHECK-GISEL-LABEL: test_v4i16_post_reg_ld2:
1758 ; CHECK-GISEL:       ; %bb.0:
1759 ; CHECK-GISEL-NEXT:    ld2.4h { v0, v1 }, [x0]
1760 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #1
1761 ; CHECK-GISEL-NEXT:    str x8, [x1]
1762 ; CHECK-GISEL-NEXT:    ret
1763   %ld2 = tail call { <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld2.v4i16.p0(ptr %A)
1764   %tmp = getelementptr i16, ptr %A, i64 %inc
1765   store ptr %tmp, ptr %ptr
1766   ret { <4 x i16>, <4 x i16> } %ld2
1769 declare { <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld2.v4i16.p0(ptr)
1772 define { <4 x i32>, <4 x i32> } @test_v4i32_post_imm_ld2(ptr %A, ptr %ptr) {
1773 ; SDAG-LABEL: test_v4i32_post_imm_ld2:
1774 ; SDAG:       ; %bb.0:
1775 ; SDAG-NEXT:    ld2.4s { v0, v1 }, [x0], #32
1776 ; SDAG-NEXT:    str x0, [x1]
1777 ; SDAG-NEXT:    ret
1779 ; CHECK-GISEL-LABEL: test_v4i32_post_imm_ld2:
1780 ; CHECK-GISEL:       ; %bb.0:
1781 ; CHECK-GISEL-NEXT:    ld2.4s { v0, v1 }, [x0]
1782 ; CHECK-GISEL-NEXT:    add x8, x0, #32
1783 ; CHECK-GISEL-NEXT:    str x8, [x1]
1784 ; CHECK-GISEL-NEXT:    ret
1785   %ld2 = tail call { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld2.v4i32.p0(ptr %A)
1786   %tmp = getelementptr i32, ptr %A, i32 8
1787   store ptr %tmp, ptr %ptr
1788   ret { <4 x i32>, <4 x i32> } %ld2
1791 define { <4 x i32>, <4 x i32> } @test_v4i32_post_reg_ld2(ptr %A, ptr %ptr, i64 %inc) {
1792 ; SDAG-LABEL: test_v4i32_post_reg_ld2:
1793 ; SDAG:       ; %bb.0:
1794 ; SDAG-NEXT:    lsl x8, x2, #2
1795 ; SDAG-NEXT:    ld2.4s { v0, v1 }, [x0], x8
1796 ; SDAG-NEXT:    str x0, [x1]
1797 ; SDAG-NEXT:    ret
1799 ; CHECK-GISEL-LABEL: test_v4i32_post_reg_ld2:
1800 ; CHECK-GISEL:       ; %bb.0:
1801 ; CHECK-GISEL-NEXT:    ld2.4s { v0, v1 }, [x0]
1802 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
1803 ; CHECK-GISEL-NEXT:    str x8, [x1]
1804 ; CHECK-GISEL-NEXT:    ret
1805   %ld2 = tail call { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld2.v4i32.p0(ptr %A)
1806   %tmp = getelementptr i32, ptr %A, i64 %inc
1807   store ptr %tmp, ptr %ptr
1808   ret { <4 x i32>, <4 x i32> } %ld2
1811 declare { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld2.v4i32.p0(ptr)
1814 define { <2 x i32>, <2 x i32> } @test_v2i32_post_imm_ld2(ptr %A, ptr %ptr) {
1815 ; SDAG-LABEL: test_v2i32_post_imm_ld2:
1816 ; SDAG:       ; %bb.0:
1817 ; SDAG-NEXT:    ld2.2s { v0, v1 }, [x0], #16
1818 ; SDAG-NEXT:    str x0, [x1]
1819 ; SDAG-NEXT:    ret
1821 ; CHECK-GISEL-LABEL: test_v2i32_post_imm_ld2:
1822 ; CHECK-GISEL:       ; %bb.0:
1823 ; CHECK-GISEL-NEXT:    ld2.2s { v0, v1 }, [x0]
1824 ; CHECK-GISEL-NEXT:    add x8, x0, #16
1825 ; CHECK-GISEL-NEXT:    str x8, [x1]
1826 ; CHECK-GISEL-NEXT:    ret
1827   %ld2 = tail call { <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld2.v2i32.p0(ptr %A)
1828   %tmp = getelementptr i32, ptr %A, i32 4
1829   store ptr %tmp, ptr %ptr
1830   ret { <2 x i32>, <2 x i32> } %ld2
1833 define { <2 x i32>, <2 x i32> } @test_v2i32_post_reg_ld2(ptr %A, ptr %ptr, i64 %inc) {
1834 ; SDAG-LABEL: test_v2i32_post_reg_ld2:
1835 ; SDAG:       ; %bb.0:
1836 ; SDAG-NEXT:    lsl x8, x2, #2
1837 ; SDAG-NEXT:    ld2.2s { v0, v1 }, [x0], x8
1838 ; SDAG-NEXT:    str x0, [x1]
1839 ; SDAG-NEXT:    ret
1841 ; CHECK-GISEL-LABEL: test_v2i32_post_reg_ld2:
1842 ; CHECK-GISEL:       ; %bb.0:
1843 ; CHECK-GISEL-NEXT:    ld2.2s { v0, v1 }, [x0]
1844 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
1845 ; CHECK-GISEL-NEXT:    str x8, [x1]
1846 ; CHECK-GISEL-NEXT:    ret
1847   %ld2 = tail call { <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld2.v2i32.p0(ptr %A)
1848   %tmp = getelementptr i32, ptr %A, i64 %inc
1849   store ptr %tmp, ptr %ptr
1850   ret { <2 x i32>, <2 x i32> } %ld2
1853 declare { <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld2.v2i32.p0(ptr)
1856 define { <2 x i64>, <2 x i64> } @test_v2i64_post_imm_ld2(ptr %A, ptr %ptr) {
1857 ; SDAG-LABEL: test_v2i64_post_imm_ld2:
1858 ; SDAG:       ; %bb.0:
1859 ; SDAG-NEXT:    ld2.2d { v0, v1 }, [x0], #32
1860 ; SDAG-NEXT:    str x0, [x1]
1861 ; SDAG-NEXT:    ret
1863 ; CHECK-GISEL-LABEL: test_v2i64_post_imm_ld2:
1864 ; CHECK-GISEL:       ; %bb.0:
1865 ; CHECK-GISEL-NEXT:    ld2.2d { v0, v1 }, [x0]
1866 ; CHECK-GISEL-NEXT:    add x8, x0, #32
1867 ; CHECK-GISEL-NEXT:    str x8, [x1]
1868 ; CHECK-GISEL-NEXT:    ret
1869   %ld2 = tail call { <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld2.v2i64.p0(ptr %A)
1870   %tmp = getelementptr i64, ptr %A, i32 4
1871   store ptr %tmp, ptr %ptr
1872   ret { <2 x i64>, <2 x i64> } %ld2
1875 define { <2 x i64>, <2 x i64> } @test_v2i64_post_reg_ld2(ptr %A, ptr %ptr, i64 %inc) {
1876 ; SDAG-LABEL: test_v2i64_post_reg_ld2:
1877 ; SDAG:       ; %bb.0:
1878 ; SDAG-NEXT:    lsl x8, x2, #3
1879 ; SDAG-NEXT:    ld2.2d { v0, v1 }, [x0], x8
1880 ; SDAG-NEXT:    str x0, [x1]
1881 ; SDAG-NEXT:    ret
1883 ; CHECK-GISEL-LABEL: test_v2i64_post_reg_ld2:
1884 ; CHECK-GISEL:       ; %bb.0:
1885 ; CHECK-GISEL-NEXT:    ld2.2d { v0, v1 }, [x0]
1886 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
1887 ; CHECK-GISEL-NEXT:    str x8, [x1]
1888 ; CHECK-GISEL-NEXT:    ret
1889   %ld2 = tail call { <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld2.v2i64.p0(ptr %A)
1890   %tmp = getelementptr i64, ptr %A, i64 %inc
1891   store ptr %tmp, ptr %ptr
1892   ret { <2 x i64>, <2 x i64> } %ld2
1895 declare { <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld2.v2i64.p0(ptr)
1898 define { <1 x i64>, <1 x i64> } @test_v1i64_post_imm_ld2(ptr %A, ptr %ptr) {
1899 ; SDAG-LABEL: test_v1i64_post_imm_ld2:
1900 ; SDAG:       ; %bb.0:
1901 ; SDAG-NEXT:    ld1.1d { v0, v1 }, [x0], #16
1902 ; SDAG-NEXT:    str x0, [x1]
1903 ; SDAG-NEXT:    ret
1905 ; CHECK-GISEL-LABEL: test_v1i64_post_imm_ld2:
1906 ; CHECK-GISEL:       ; %bb.0:
1907 ; CHECK-GISEL-NEXT:    ld1.1d { v0, v1 }, [x0]
1908 ; CHECK-GISEL-NEXT:    add x8, x0, #16
1909 ; CHECK-GISEL-NEXT:    str x8, [x1]
1910 ; CHECK-GISEL-NEXT:    ret
1911   %ld2 = tail call { <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld2.v1i64.p0(ptr %A)
1912   %tmp = getelementptr i64, ptr %A, i32 2
1913   store ptr %tmp, ptr %ptr
1914   ret { <1 x i64>, <1 x i64> } %ld2
1917 define { <1 x i64>, <1 x i64> } @test_v1i64_post_reg_ld2(ptr %A, ptr %ptr, i64 %inc) {
1918 ; SDAG-LABEL: test_v1i64_post_reg_ld2:
1919 ; SDAG:       ; %bb.0:
1920 ; SDAG-NEXT:    lsl x8, x2, #3
1921 ; SDAG-NEXT:    ld1.1d { v0, v1 }, [x0], x8
1922 ; SDAG-NEXT:    str x0, [x1]
1923 ; SDAG-NEXT:    ret
1925 ; CHECK-GISEL-LABEL: test_v1i64_post_reg_ld2:
1926 ; CHECK-GISEL:       ; %bb.0:
1927 ; CHECK-GISEL-NEXT:    ld1.1d { v0, v1 }, [x0]
1928 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
1929 ; CHECK-GISEL-NEXT:    str x8, [x1]
1930 ; CHECK-GISEL-NEXT:    ret
1931   %ld2 = tail call { <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld2.v1i64.p0(ptr %A)
1932   %tmp = getelementptr i64, ptr %A, i64 %inc
1933   store ptr %tmp, ptr %ptr
1934   ret { <1 x i64>, <1 x i64> } %ld2
1937 declare { <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld2.v1i64.p0(ptr)
1940 define { <4 x float>, <4 x float> } @test_v4f32_post_imm_ld2(ptr %A, ptr %ptr) {
1941 ; SDAG-LABEL: test_v4f32_post_imm_ld2:
1942 ; SDAG:       ; %bb.0:
1943 ; SDAG-NEXT:    ld2.4s { v0, v1 }, [x0], #32
1944 ; SDAG-NEXT:    str x0, [x1]
1945 ; SDAG-NEXT:    ret
1947 ; CHECK-GISEL-LABEL: test_v4f32_post_imm_ld2:
1948 ; CHECK-GISEL:       ; %bb.0:
1949 ; CHECK-GISEL-NEXT:    ld2.4s { v0, v1 }, [x0]
1950 ; CHECK-GISEL-NEXT:    add x8, x0, #32
1951 ; CHECK-GISEL-NEXT:    str x8, [x1]
1952 ; CHECK-GISEL-NEXT:    ret
1953   %ld2 = tail call { <4 x float>, <4 x float> } @llvm.aarch64.neon.ld2.v4f32.p0(ptr %A)
1954   %tmp = getelementptr float, ptr %A, i32 8
1955   store ptr %tmp, ptr %ptr
1956   ret { <4 x float>, <4 x float> } %ld2
1959 define { <4 x float>, <4 x float> } @test_v4f32_post_reg_ld2(ptr %A, ptr %ptr, i64 %inc) {
1960 ; SDAG-LABEL: test_v4f32_post_reg_ld2:
1961 ; SDAG:       ; %bb.0:
1962 ; SDAG-NEXT:    lsl x8, x2, #2
1963 ; SDAG-NEXT:    ld2.4s { v0, v1 }, [x0], x8
1964 ; SDAG-NEXT:    str x0, [x1]
1965 ; SDAG-NEXT:    ret
1967 ; CHECK-GISEL-LABEL: test_v4f32_post_reg_ld2:
1968 ; CHECK-GISEL:       ; %bb.0:
1969 ; CHECK-GISEL-NEXT:    ld2.4s { v0, v1 }, [x0]
1970 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
1971 ; CHECK-GISEL-NEXT:    str x8, [x1]
1972 ; CHECK-GISEL-NEXT:    ret
1973   %ld2 = tail call { <4 x float>, <4 x float> } @llvm.aarch64.neon.ld2.v4f32.p0(ptr %A)
1974   %tmp = getelementptr float, ptr %A, i64 %inc
1975   store ptr %tmp, ptr %ptr
1976   ret { <4 x float>, <4 x float> } %ld2
1979 declare { <4 x float>, <4 x float> } @llvm.aarch64.neon.ld2.v4f32.p0(ptr)
1982 define { <2 x float>, <2 x float> } @test_v2f32_post_imm_ld2(ptr %A, ptr %ptr) {
1983 ; SDAG-LABEL: test_v2f32_post_imm_ld2:
1984 ; SDAG:       ; %bb.0:
1985 ; SDAG-NEXT:    ld2.2s { v0, v1 }, [x0], #16
1986 ; SDAG-NEXT:    str x0, [x1]
1987 ; SDAG-NEXT:    ret
1989 ; CHECK-GISEL-LABEL: test_v2f32_post_imm_ld2:
1990 ; CHECK-GISEL:       ; %bb.0:
1991 ; CHECK-GISEL-NEXT:    ld2.2s { v0, v1 }, [x0]
1992 ; CHECK-GISEL-NEXT:    add x8, x0, #16
1993 ; CHECK-GISEL-NEXT:    str x8, [x1]
1994 ; CHECK-GISEL-NEXT:    ret
1995   %ld2 = tail call { <2 x float>, <2 x float> } @llvm.aarch64.neon.ld2.v2f32.p0(ptr %A)
1996   %tmp = getelementptr float, ptr %A, i32 4
1997   store ptr %tmp, ptr %ptr
1998   ret { <2 x float>, <2 x float> } %ld2
2001 define { <2 x float>, <2 x float> } @test_v2f32_post_reg_ld2(ptr %A, ptr %ptr, i64 %inc) {
2002 ; SDAG-LABEL: test_v2f32_post_reg_ld2:
2003 ; SDAG:       ; %bb.0:
2004 ; SDAG-NEXT:    lsl x8, x2, #2
2005 ; SDAG-NEXT:    ld2.2s { v0, v1 }, [x0], x8
2006 ; SDAG-NEXT:    str x0, [x1]
2007 ; SDAG-NEXT:    ret
2009 ; CHECK-GISEL-LABEL: test_v2f32_post_reg_ld2:
2010 ; CHECK-GISEL:       ; %bb.0:
2011 ; CHECK-GISEL-NEXT:    ld2.2s { v0, v1 }, [x0]
2012 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
2013 ; CHECK-GISEL-NEXT:    str x8, [x1]
2014 ; CHECK-GISEL-NEXT:    ret
2015   %ld2 = tail call { <2 x float>, <2 x float> } @llvm.aarch64.neon.ld2.v2f32.p0(ptr %A)
2016   %tmp = getelementptr float, ptr %A, i64 %inc
2017   store ptr %tmp, ptr %ptr
2018   ret { <2 x float>, <2 x float> } %ld2
2021 declare { <2 x float>, <2 x float> } @llvm.aarch64.neon.ld2.v2f32.p0(ptr)
2024 define { <2 x double>, <2 x double> } @test_v2f64_post_imm_ld2(ptr %A, ptr %ptr) {
2025 ; SDAG-LABEL: test_v2f64_post_imm_ld2:
2026 ; SDAG:       ; %bb.0:
2027 ; SDAG-NEXT:    ld2.2d { v0, v1 }, [x0], #32
2028 ; SDAG-NEXT:    str x0, [x1]
2029 ; SDAG-NEXT:    ret
2031 ; CHECK-GISEL-LABEL: test_v2f64_post_imm_ld2:
2032 ; CHECK-GISEL:       ; %bb.0:
2033 ; CHECK-GISEL-NEXT:    ld2.2d { v0, v1 }, [x0]
2034 ; CHECK-GISEL-NEXT:    add x8, x0, #32
2035 ; CHECK-GISEL-NEXT:    str x8, [x1]
2036 ; CHECK-GISEL-NEXT:    ret
2037   %ld2 = tail call { <2 x double>, <2 x double> } @llvm.aarch64.neon.ld2.v2f64.p0(ptr %A)
2038   %tmp = getelementptr double, ptr %A, i32 4
2039   store ptr %tmp, ptr %ptr
2040   ret { <2 x double>, <2 x double> } %ld2
2043 define { <2 x double>, <2 x double> } @test_v2f64_post_reg_ld2(ptr %A, ptr %ptr, i64 %inc) {
2044 ; SDAG-LABEL: test_v2f64_post_reg_ld2:
2045 ; SDAG:       ; %bb.0:
2046 ; SDAG-NEXT:    lsl x8, x2, #3
2047 ; SDAG-NEXT:    ld2.2d { v0, v1 }, [x0], x8
2048 ; SDAG-NEXT:    str x0, [x1]
2049 ; SDAG-NEXT:    ret
2051 ; CHECK-GISEL-LABEL: test_v2f64_post_reg_ld2:
2052 ; CHECK-GISEL:       ; %bb.0:
2053 ; CHECK-GISEL-NEXT:    ld2.2d { v0, v1 }, [x0]
2054 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
2055 ; CHECK-GISEL-NEXT:    str x8, [x1]
2056 ; CHECK-GISEL-NEXT:    ret
2057   %ld2 = tail call { <2 x double>, <2 x double> } @llvm.aarch64.neon.ld2.v2f64.p0(ptr %A)
2058   %tmp = getelementptr double, ptr %A, i64 %inc
2059   store ptr %tmp, ptr %ptr
2060   ret { <2 x double>, <2 x double> } %ld2
2063 declare { <2 x double>, <2 x double> } @llvm.aarch64.neon.ld2.v2f64.p0(ptr)
2066 define { <1 x double>, <1 x double> } @test_v1f64_post_imm_ld2(ptr %A, ptr %ptr) {
2067 ; SDAG-LABEL: test_v1f64_post_imm_ld2:
2068 ; SDAG:       ; %bb.0:
2069 ; SDAG-NEXT:    ld1.1d { v0, v1 }, [x0], #16
2070 ; SDAG-NEXT:    str x0, [x1]
2071 ; SDAG-NEXT:    ret
2073 ; CHECK-GISEL-LABEL: test_v1f64_post_imm_ld2:
2074 ; CHECK-GISEL:       ; %bb.0:
2075 ; CHECK-GISEL-NEXT:    ld1.1d { v0, v1 }, [x0]
2076 ; CHECK-GISEL-NEXT:    add x8, x0, #16
2077 ; CHECK-GISEL-NEXT:    str x8, [x1]
2078 ; CHECK-GISEL-NEXT:    ret
2079   %ld2 = tail call { <1 x double>, <1 x double> } @llvm.aarch64.neon.ld2.v1f64.p0(ptr %A)
2080   %tmp = getelementptr double, ptr %A, i32 2
2081   store ptr %tmp, ptr %ptr
2082   ret { <1 x double>, <1 x double> } %ld2
2085 define { <1 x double>, <1 x double> } @test_v1f64_post_reg_ld2(ptr %A, ptr %ptr, i64 %inc) {
2086 ; SDAG-LABEL: test_v1f64_post_reg_ld2:
2087 ; SDAG:       ; %bb.0:
2088 ; SDAG-NEXT:    lsl x8, x2, #3
2089 ; SDAG-NEXT:    ld1.1d { v0, v1 }, [x0], x8
2090 ; SDAG-NEXT:    str x0, [x1]
2091 ; SDAG-NEXT:    ret
2093 ; CHECK-GISEL-LABEL: test_v1f64_post_reg_ld2:
2094 ; CHECK-GISEL:       ; %bb.0:
2095 ; CHECK-GISEL-NEXT:    ld1.1d { v0, v1 }, [x0]
2096 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
2097 ; CHECK-GISEL-NEXT:    str x8, [x1]
2098 ; CHECK-GISEL-NEXT:    ret
2099   %ld2 = tail call { <1 x double>, <1 x double> } @llvm.aarch64.neon.ld2.v1f64.p0(ptr %A)
2100   %tmp = getelementptr double, ptr %A, i64 %inc
2101   store ptr %tmp, ptr %ptr
2102   ret { <1 x double>, <1 x double> } %ld2
2105 declare { <1 x double>, <1 x double> } @llvm.aarch64.neon.ld2.v1f64.p0(ptr)
2108 define { <16 x i8>, <16 x i8>, <16 x i8> } @test_v16i8_post_imm_ld3(ptr %A, ptr %ptr) {
2109 ; SDAG-LABEL: test_v16i8_post_imm_ld3:
2110 ; SDAG:       ; %bb.0:
2111 ; SDAG-NEXT:    ld3.16b { v0, v1, v2 }, [x0], #48
2112 ; SDAG-NEXT:    str x0, [x1]
2113 ; SDAG-NEXT:    ret
2115 ; CHECK-GISEL-LABEL: test_v16i8_post_imm_ld3:
2116 ; CHECK-GISEL:       ; %bb.0:
2117 ; CHECK-GISEL-NEXT:    ld3.16b { v0, v1, v2 }, [x0]
2118 ; CHECK-GISEL-NEXT:    add x8, x0, #48
2119 ; CHECK-GISEL-NEXT:    str x8, [x1]
2120 ; CHECK-GISEL-NEXT:    ret
2121   %ld3 = tail call { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld3.v16i8.p0(ptr %A)
2122   %tmp = getelementptr i8, ptr %A, i32 48
2123   store ptr %tmp, ptr %ptr
2124   ret { <16 x i8>, <16 x i8>, <16 x i8> } %ld3
2127 define { <16 x i8>, <16 x i8>, <16 x i8> } @test_v16i8_post_reg_ld3(ptr %A, ptr %ptr, i64 %inc) {
2128 ; SDAG-LABEL: test_v16i8_post_reg_ld3:
2129 ; SDAG:       ; %bb.0:
2130 ; SDAG-NEXT:    ld3.16b { v0, v1, v2 }, [x0], x2
2131 ; SDAG-NEXT:    str x0, [x1]
2132 ; SDAG-NEXT:    ret
2134 ; CHECK-GISEL-LABEL: test_v16i8_post_reg_ld3:
2135 ; CHECK-GISEL:       ; %bb.0:
2136 ; CHECK-GISEL-NEXT:    ld3.16b { v0, v1, v2 }, [x0]
2137 ; CHECK-GISEL-NEXT:    add x8, x0, x2
2138 ; CHECK-GISEL-NEXT:    str x8, [x1]
2139 ; CHECK-GISEL-NEXT:    ret
2140   %ld3 = tail call { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld3.v16i8.p0(ptr %A)
2141   %tmp = getelementptr i8, ptr %A, i64 %inc
2142   store ptr %tmp, ptr %ptr
2143   ret { <16 x i8>, <16 x i8>, <16 x i8> } %ld3
2146 declare { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld3.v16i8.p0(ptr)
2149 define { <8 x i8>, <8 x i8>, <8 x i8> } @test_v8i8_post_imm_ld3(ptr %A, ptr %ptr) {
2150 ; SDAG-LABEL: test_v8i8_post_imm_ld3:
2151 ; SDAG:       ; %bb.0:
2152 ; SDAG-NEXT:    ld3.8b { v0, v1, v2 }, [x0], #24
2153 ; SDAG-NEXT:    str x0, [x1]
2154 ; SDAG-NEXT:    ret
2156 ; CHECK-GISEL-LABEL: test_v8i8_post_imm_ld3:
2157 ; CHECK-GISEL:       ; %bb.0:
2158 ; CHECK-GISEL-NEXT:    ld3.8b { v0, v1, v2 }, [x0]
2159 ; CHECK-GISEL-NEXT:    add x8, x0, #24
2160 ; CHECK-GISEL-NEXT:    str x8, [x1]
2161 ; CHECK-GISEL-NEXT:    ret
2162   %ld3 = tail call { <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld3.v8i8.p0(ptr %A)
2163   %tmp = getelementptr i8, ptr %A, i32 24
2164   store ptr %tmp, ptr %ptr
2165   ret { <8 x i8>, <8 x i8>, <8 x i8> } %ld3
2168 define { <8 x i8>, <8 x i8>, <8 x i8> } @test_v8i8_post_reg_ld3(ptr %A, ptr %ptr, i64 %inc) {
2169 ; SDAG-LABEL: test_v8i8_post_reg_ld3:
2170 ; SDAG:       ; %bb.0:
2171 ; SDAG-NEXT:    ld3.8b { v0, v1, v2 }, [x0], x2
2172 ; SDAG-NEXT:    str x0, [x1]
2173 ; SDAG-NEXT:    ret
2175 ; CHECK-GISEL-LABEL: test_v8i8_post_reg_ld3:
2176 ; CHECK-GISEL:       ; %bb.0:
2177 ; CHECK-GISEL-NEXT:    ld3.8b { v0, v1, v2 }, [x0]
2178 ; CHECK-GISEL-NEXT:    add x8, x0, x2
2179 ; CHECK-GISEL-NEXT:    str x8, [x1]
2180 ; CHECK-GISEL-NEXT:    ret
2181   %ld3 = tail call { <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld3.v8i8.p0(ptr %A)
2182   %tmp = getelementptr i8, ptr %A, i64 %inc
2183   store ptr %tmp, ptr %ptr
2184   ret { <8 x i8>, <8 x i8>, <8 x i8> } %ld3
2187 declare { <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld3.v8i8.p0(ptr)
2190 define { <8 x i16>, <8 x i16>, <8 x i16> } @test_v8i16_post_imm_ld3(ptr %A, ptr %ptr) {
2191 ; SDAG-LABEL: test_v8i16_post_imm_ld3:
2192 ; SDAG:       ; %bb.0:
2193 ; SDAG-NEXT:    ld3.8h { v0, v1, v2 }, [x0], #48
2194 ; SDAG-NEXT:    str x0, [x1]
2195 ; SDAG-NEXT:    ret
2197 ; CHECK-GISEL-LABEL: test_v8i16_post_imm_ld3:
2198 ; CHECK-GISEL:       ; %bb.0:
2199 ; CHECK-GISEL-NEXT:    ld3.8h { v0, v1, v2 }, [x0]
2200 ; CHECK-GISEL-NEXT:    add x8, x0, #48
2201 ; CHECK-GISEL-NEXT:    str x8, [x1]
2202 ; CHECK-GISEL-NEXT:    ret
2203   %ld3 = tail call { <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld3.v8i16.p0(ptr %A)
2204   %tmp = getelementptr i16, ptr %A, i32 24
2205   store ptr %tmp, ptr %ptr
2206   ret { <8 x i16>, <8 x i16>, <8 x i16> } %ld3
2209 define { <8 x i16>, <8 x i16>, <8 x i16> } @test_v8i16_post_reg_ld3(ptr %A, ptr %ptr, i64 %inc) {
2210 ; SDAG-LABEL: test_v8i16_post_reg_ld3:
2211 ; SDAG:       ; %bb.0:
2212 ; SDAG-NEXT:    lsl x8, x2, #1
2213 ; SDAG-NEXT:    ld3.8h { v0, v1, v2 }, [x0], x8
2214 ; SDAG-NEXT:    str x0, [x1]
2215 ; SDAG-NEXT:    ret
2217 ; CHECK-GISEL-LABEL: test_v8i16_post_reg_ld3:
2218 ; CHECK-GISEL:       ; %bb.0:
2219 ; CHECK-GISEL-NEXT:    ld3.8h { v0, v1, v2 }, [x0]
2220 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #1
2221 ; CHECK-GISEL-NEXT:    str x8, [x1]
2222 ; CHECK-GISEL-NEXT:    ret
2223   %ld3 = tail call { <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld3.v8i16.p0(ptr %A)
2224   %tmp = getelementptr i16, ptr %A, i64 %inc
2225   store ptr %tmp, ptr %ptr
2226   ret { <8 x i16>, <8 x i16>, <8 x i16> } %ld3
2229 declare { <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld3.v8i16.p0(ptr)
2232 define { <4 x i16>, <4 x i16>, <4 x i16> } @test_v4i16_post_imm_ld3(ptr %A, ptr %ptr) {
2233 ; SDAG-LABEL: test_v4i16_post_imm_ld3:
2234 ; SDAG:       ; %bb.0:
2235 ; SDAG-NEXT:    ld3.4h { v0, v1, v2 }, [x0], #24
2236 ; SDAG-NEXT:    str x0, [x1]
2237 ; SDAG-NEXT:    ret
2239 ; CHECK-GISEL-LABEL: test_v4i16_post_imm_ld3:
2240 ; CHECK-GISEL:       ; %bb.0:
2241 ; CHECK-GISEL-NEXT:    ld3.4h { v0, v1, v2 }, [x0]
2242 ; CHECK-GISEL-NEXT:    add x8, x0, #24
2243 ; CHECK-GISEL-NEXT:    str x8, [x1]
2244 ; CHECK-GISEL-NEXT:    ret
2245   %ld3 = tail call { <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld3.v4i16.p0(ptr %A)
2246   %tmp = getelementptr i16, ptr %A, i32 12
2247   store ptr %tmp, ptr %ptr
2248   ret { <4 x i16>, <4 x i16>, <4 x i16> } %ld3
2251 define { <4 x i16>, <4 x i16>, <4 x i16> } @test_v4i16_post_reg_ld3(ptr %A, ptr %ptr, i64 %inc) {
2252 ; SDAG-LABEL: test_v4i16_post_reg_ld3:
2253 ; SDAG:       ; %bb.0:
2254 ; SDAG-NEXT:    lsl x8, x2, #1
2255 ; SDAG-NEXT:    ld3.4h { v0, v1, v2 }, [x0], x8
2256 ; SDAG-NEXT:    str x0, [x1]
2257 ; SDAG-NEXT:    ret
2259 ; CHECK-GISEL-LABEL: test_v4i16_post_reg_ld3:
2260 ; CHECK-GISEL:       ; %bb.0:
2261 ; CHECK-GISEL-NEXT:    ld3.4h { v0, v1, v2 }, [x0]
2262 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #1
2263 ; CHECK-GISEL-NEXT:    str x8, [x1]
2264 ; CHECK-GISEL-NEXT:    ret
2265   %ld3 = tail call { <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld3.v4i16.p0(ptr %A)
2266   %tmp = getelementptr i16, ptr %A, i64 %inc
2267   store ptr %tmp, ptr %ptr
2268   ret { <4 x i16>, <4 x i16>, <4 x i16> } %ld3
2271 declare { <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld3.v4i16.p0(ptr)
2274 define { <4 x i32>, <4 x i32>, <4 x i32> } @test_v4i32_post_imm_ld3(ptr %A, ptr %ptr) {
2275 ; SDAG-LABEL: test_v4i32_post_imm_ld3:
2276 ; SDAG:       ; %bb.0:
2277 ; SDAG-NEXT:    ld3.4s { v0, v1, v2 }, [x0], #48
2278 ; SDAG-NEXT:    str x0, [x1]
2279 ; SDAG-NEXT:    ret
2281 ; CHECK-GISEL-LABEL: test_v4i32_post_imm_ld3:
2282 ; CHECK-GISEL:       ; %bb.0:
2283 ; CHECK-GISEL-NEXT:    ld3.4s { v0, v1, v2 }, [x0]
2284 ; CHECK-GISEL-NEXT:    add x8, x0, #48
2285 ; CHECK-GISEL-NEXT:    str x8, [x1]
2286 ; CHECK-GISEL-NEXT:    ret
2287   %ld3 = tail call { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld3.v4i32.p0(ptr %A)
2288   %tmp = getelementptr i32, ptr %A, i32 12
2289   store ptr %tmp, ptr %ptr
2290   ret { <4 x i32>, <4 x i32>, <4 x i32> } %ld3
2293 define { <4 x i32>, <4 x i32>, <4 x i32> } @test_v4i32_post_reg_ld3(ptr %A, ptr %ptr, i64 %inc) {
2294 ; SDAG-LABEL: test_v4i32_post_reg_ld3:
2295 ; SDAG:       ; %bb.0:
2296 ; SDAG-NEXT:    lsl x8, x2, #2
2297 ; SDAG-NEXT:    ld3.4s { v0, v1, v2 }, [x0], x8
2298 ; SDAG-NEXT:    str x0, [x1]
2299 ; SDAG-NEXT:    ret
2301 ; CHECK-GISEL-LABEL: test_v4i32_post_reg_ld3:
2302 ; CHECK-GISEL:       ; %bb.0:
2303 ; CHECK-GISEL-NEXT:    ld3.4s { v0, v1, v2 }, [x0]
2304 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
2305 ; CHECK-GISEL-NEXT:    str x8, [x1]
2306 ; CHECK-GISEL-NEXT:    ret
2307   %ld3 = tail call { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld3.v4i32.p0(ptr %A)
2308   %tmp = getelementptr i32, ptr %A, i64 %inc
2309   store ptr %tmp, ptr %ptr
2310   ret { <4 x i32>, <4 x i32>, <4 x i32> } %ld3
2313 declare { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld3.v4i32.p0(ptr)
2316 define { <2 x i32>, <2 x i32>, <2 x i32> } @test_v2i32_post_imm_ld3(ptr %A, ptr %ptr) {
2317 ; SDAG-LABEL: test_v2i32_post_imm_ld3:
2318 ; SDAG:       ; %bb.0:
2319 ; SDAG-NEXT:    ld3.2s { v0, v1, v2 }, [x0], #24
2320 ; SDAG-NEXT:    str x0, [x1]
2321 ; SDAG-NEXT:    ret
2323 ; CHECK-GISEL-LABEL: test_v2i32_post_imm_ld3:
2324 ; CHECK-GISEL:       ; %bb.0:
2325 ; CHECK-GISEL-NEXT:    ld3.2s { v0, v1, v2 }, [x0]
2326 ; CHECK-GISEL-NEXT:    add x8, x0, #24
2327 ; CHECK-GISEL-NEXT:    str x8, [x1]
2328 ; CHECK-GISEL-NEXT:    ret
2329   %ld3 = tail call { <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld3.v2i32.p0(ptr %A)
2330   %tmp = getelementptr i32, ptr %A, i32 6
2331   store ptr %tmp, ptr %ptr
2332   ret { <2 x i32>, <2 x i32>, <2 x i32> } %ld3
2335 define { <2 x i32>, <2 x i32>, <2 x i32> } @test_v2i32_post_reg_ld3(ptr %A, ptr %ptr, i64 %inc) {
2336 ; SDAG-LABEL: test_v2i32_post_reg_ld3:
2337 ; SDAG:       ; %bb.0:
2338 ; SDAG-NEXT:    lsl x8, x2, #2
2339 ; SDAG-NEXT:    ld3.2s { v0, v1, v2 }, [x0], x8
2340 ; SDAG-NEXT:    str x0, [x1]
2341 ; SDAG-NEXT:    ret
2343 ; CHECK-GISEL-LABEL: test_v2i32_post_reg_ld3:
2344 ; CHECK-GISEL:       ; %bb.0:
2345 ; CHECK-GISEL-NEXT:    ld3.2s { v0, v1, v2 }, [x0]
2346 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
2347 ; CHECK-GISEL-NEXT:    str x8, [x1]
2348 ; CHECK-GISEL-NEXT:    ret
2349   %ld3 = tail call { <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld3.v2i32.p0(ptr %A)
2350   %tmp = getelementptr i32, ptr %A, i64 %inc
2351   store ptr %tmp, ptr %ptr
2352   ret { <2 x i32>, <2 x i32>, <2 x i32> } %ld3
2355 declare { <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld3.v2i32.p0(ptr)
2358 define { <2 x i64>, <2 x i64>, <2 x i64> } @test_v2i64_post_imm_ld3(ptr %A, ptr %ptr) {
2359 ; SDAG-LABEL: test_v2i64_post_imm_ld3:
2360 ; SDAG:       ; %bb.0:
2361 ; SDAG-NEXT:    ld3.2d { v0, v1, v2 }, [x0], #48
2362 ; SDAG-NEXT:    str x0, [x1]
2363 ; SDAG-NEXT:    ret
2365 ; CHECK-GISEL-LABEL: test_v2i64_post_imm_ld3:
2366 ; CHECK-GISEL:       ; %bb.0:
2367 ; CHECK-GISEL-NEXT:    ld3.2d { v0, v1, v2 }, [x0]
2368 ; CHECK-GISEL-NEXT:    add x8, x0, #48
2369 ; CHECK-GISEL-NEXT:    str x8, [x1]
2370 ; CHECK-GISEL-NEXT:    ret
2371   %ld3 = tail call { <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld3.v2i64.p0(ptr %A)
2372   %tmp = getelementptr i64, ptr %A, i32 6
2373   store ptr %tmp, ptr %ptr
2374   ret { <2 x i64>, <2 x i64>, <2 x i64> } %ld3
2377 define { <2 x i64>, <2 x i64>, <2 x i64> } @test_v2i64_post_reg_ld3(ptr %A, ptr %ptr, i64 %inc) {
2378 ; SDAG-LABEL: test_v2i64_post_reg_ld3:
2379 ; SDAG:       ; %bb.0:
2380 ; SDAG-NEXT:    lsl x8, x2, #3
2381 ; SDAG-NEXT:    ld3.2d { v0, v1, v2 }, [x0], x8
2382 ; SDAG-NEXT:    str x0, [x1]
2383 ; SDAG-NEXT:    ret
2385 ; CHECK-GISEL-LABEL: test_v2i64_post_reg_ld3:
2386 ; CHECK-GISEL:       ; %bb.0:
2387 ; CHECK-GISEL-NEXT:    ld3.2d { v0, v1, v2 }, [x0]
2388 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
2389 ; CHECK-GISEL-NEXT:    str x8, [x1]
2390 ; CHECK-GISEL-NEXT:    ret
2391   %ld3 = tail call { <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld3.v2i64.p0(ptr %A)
2392   %tmp = getelementptr i64, ptr %A, i64 %inc
2393   store ptr %tmp, ptr %ptr
2394   ret { <2 x i64>, <2 x i64>, <2 x i64> } %ld3
2397 declare { <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld3.v2i64.p0(ptr)
2400 define { <1 x i64>, <1 x i64>, <1 x i64> } @test_v1i64_post_imm_ld3(ptr %A, ptr %ptr) {
2401 ; SDAG-LABEL: test_v1i64_post_imm_ld3:
2402 ; SDAG:       ; %bb.0:
2403 ; SDAG-NEXT:    ld1.1d { v0, v1, v2 }, [x0], #24
2404 ; SDAG-NEXT:    str x0, [x1]
2405 ; SDAG-NEXT:    ret
2407 ; CHECK-GISEL-LABEL: test_v1i64_post_imm_ld3:
2408 ; CHECK-GISEL:       ; %bb.0:
2409 ; CHECK-GISEL-NEXT:    ld1.1d { v0, v1, v2 }, [x0]
2410 ; CHECK-GISEL-NEXT:    add x8, x0, #24
2411 ; CHECK-GISEL-NEXT:    str x8, [x1]
2412 ; CHECK-GISEL-NEXT:    ret
2413   %ld3 = tail call { <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld3.v1i64.p0(ptr %A)
2414   %tmp = getelementptr i64, ptr %A, i32 3
2415   store ptr %tmp, ptr %ptr
2416   ret { <1 x i64>, <1 x i64>, <1 x i64> } %ld3
2419 define { <1 x i64>, <1 x i64>, <1 x i64> } @test_v1i64_post_reg_ld3(ptr %A, ptr %ptr, i64 %inc) {
2420 ; SDAG-LABEL: test_v1i64_post_reg_ld3:
2421 ; SDAG:       ; %bb.0:
2422 ; SDAG-NEXT:    lsl x8, x2, #3
2423 ; SDAG-NEXT:    ld1.1d { v0, v1, v2 }, [x0], x8
2424 ; SDAG-NEXT:    str x0, [x1]
2425 ; SDAG-NEXT:    ret
2427 ; CHECK-GISEL-LABEL: test_v1i64_post_reg_ld3:
2428 ; CHECK-GISEL:       ; %bb.0:
2429 ; CHECK-GISEL-NEXT:    ld1.1d { v0, v1, v2 }, [x0]
2430 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
2431 ; CHECK-GISEL-NEXT:    str x8, [x1]
2432 ; CHECK-GISEL-NEXT:    ret
2433   %ld3 = tail call { <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld3.v1i64.p0(ptr %A)
2434   %tmp = getelementptr i64, ptr %A, i64 %inc
2435   store ptr %tmp, ptr %ptr
2436   ret { <1 x i64>, <1 x i64>, <1 x i64> } %ld3
2439 declare { <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld3.v1i64.p0(ptr)
2442 define { <4 x float>, <4 x float>, <4 x float> } @test_v4f32_post_imm_ld3(ptr %A, ptr %ptr) {
2443 ; SDAG-LABEL: test_v4f32_post_imm_ld3:
2444 ; SDAG:       ; %bb.0:
2445 ; SDAG-NEXT:    ld3.4s { v0, v1, v2 }, [x0], #48
2446 ; SDAG-NEXT:    str x0, [x1]
2447 ; SDAG-NEXT:    ret
2449 ; CHECK-GISEL-LABEL: test_v4f32_post_imm_ld3:
2450 ; CHECK-GISEL:       ; %bb.0:
2451 ; CHECK-GISEL-NEXT:    ld3.4s { v0, v1, v2 }, [x0]
2452 ; CHECK-GISEL-NEXT:    add x8, x0, #48
2453 ; CHECK-GISEL-NEXT:    str x8, [x1]
2454 ; CHECK-GISEL-NEXT:    ret
2455   %ld3 = tail call { <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld3.v4f32.p0(ptr %A)
2456   %tmp = getelementptr float, ptr %A, i32 12
2457   store ptr %tmp, ptr %ptr
2458   ret { <4 x float>, <4 x float>, <4 x float> } %ld3
2461 define { <4 x float>, <4 x float>, <4 x float> } @test_v4f32_post_reg_ld3(ptr %A, ptr %ptr, i64 %inc) {
2462 ; SDAG-LABEL: test_v4f32_post_reg_ld3:
2463 ; SDAG:       ; %bb.0:
2464 ; SDAG-NEXT:    lsl x8, x2, #2
2465 ; SDAG-NEXT:    ld3.4s { v0, v1, v2 }, [x0], x8
2466 ; SDAG-NEXT:    str x0, [x1]
2467 ; SDAG-NEXT:    ret
2469 ; CHECK-GISEL-LABEL: test_v4f32_post_reg_ld3:
2470 ; CHECK-GISEL:       ; %bb.0:
2471 ; CHECK-GISEL-NEXT:    ld3.4s { v0, v1, v2 }, [x0]
2472 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
2473 ; CHECK-GISEL-NEXT:    str x8, [x1]
2474 ; CHECK-GISEL-NEXT:    ret
2475   %ld3 = tail call { <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld3.v4f32.p0(ptr %A)
2476   %tmp = getelementptr float, ptr %A, i64 %inc
2477   store ptr %tmp, ptr %ptr
2478   ret { <4 x float>, <4 x float>, <4 x float> } %ld3
2481 declare { <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld3.v4f32.p0(ptr)
2484 define { <2 x float>, <2 x float>, <2 x float> } @test_v2f32_post_imm_ld3(ptr %A, ptr %ptr) {
2485 ; SDAG-LABEL: test_v2f32_post_imm_ld3:
2486 ; SDAG:       ; %bb.0:
2487 ; SDAG-NEXT:    ld3.2s { v0, v1, v2 }, [x0], #24
2488 ; SDAG-NEXT:    str x0, [x1]
2489 ; SDAG-NEXT:    ret
2491 ; CHECK-GISEL-LABEL: test_v2f32_post_imm_ld3:
2492 ; CHECK-GISEL:       ; %bb.0:
2493 ; CHECK-GISEL-NEXT:    ld3.2s { v0, v1, v2 }, [x0]
2494 ; CHECK-GISEL-NEXT:    add x8, x0, #24
2495 ; CHECK-GISEL-NEXT:    str x8, [x1]
2496 ; CHECK-GISEL-NEXT:    ret
2497   %ld3 = tail call { <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld3.v2f32.p0(ptr %A)
2498   %tmp = getelementptr float, ptr %A, i32 6
2499   store ptr %tmp, ptr %ptr
2500   ret { <2 x float>, <2 x float>, <2 x float> } %ld3
2503 define { <2 x float>, <2 x float>, <2 x float> } @test_v2f32_post_reg_ld3(ptr %A, ptr %ptr, i64 %inc) {
2504 ; SDAG-LABEL: test_v2f32_post_reg_ld3:
2505 ; SDAG:       ; %bb.0:
2506 ; SDAG-NEXT:    lsl x8, x2, #2
2507 ; SDAG-NEXT:    ld3.2s { v0, v1, v2 }, [x0], x8
2508 ; SDAG-NEXT:    str x0, [x1]
2509 ; SDAG-NEXT:    ret
2511 ; CHECK-GISEL-LABEL: test_v2f32_post_reg_ld3:
2512 ; CHECK-GISEL:       ; %bb.0:
2513 ; CHECK-GISEL-NEXT:    ld3.2s { v0, v1, v2 }, [x0]
2514 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
2515 ; CHECK-GISEL-NEXT:    str x8, [x1]
2516 ; CHECK-GISEL-NEXT:    ret
2517   %ld3 = tail call { <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld3.v2f32.p0(ptr %A)
2518   %tmp = getelementptr float, ptr %A, i64 %inc
2519   store ptr %tmp, ptr %ptr
2520   ret { <2 x float>, <2 x float>, <2 x float> } %ld3
2523 declare { <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld3.v2f32.p0(ptr)
2526 define { <2 x double>, <2 x double>, <2 x double> } @test_v2f64_post_imm_ld3(ptr %A, ptr %ptr) {
2527 ; SDAG-LABEL: test_v2f64_post_imm_ld3:
2528 ; SDAG:       ; %bb.0:
2529 ; SDAG-NEXT:    ld3.2d { v0, v1, v2 }, [x0], #48
2530 ; SDAG-NEXT:    str x0, [x1]
2531 ; SDAG-NEXT:    ret
2533 ; CHECK-GISEL-LABEL: test_v2f64_post_imm_ld3:
2534 ; CHECK-GISEL:       ; %bb.0:
2535 ; CHECK-GISEL-NEXT:    ld3.2d { v0, v1, v2 }, [x0]
2536 ; CHECK-GISEL-NEXT:    add x8, x0, #48
2537 ; CHECK-GISEL-NEXT:    str x8, [x1]
2538 ; CHECK-GISEL-NEXT:    ret
2539   %ld3 = tail call { <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld3.v2f64.p0(ptr %A)
2540   %tmp = getelementptr double, ptr %A, i32 6
2541   store ptr %tmp, ptr %ptr
2542   ret { <2 x double>, <2 x double>, <2 x double> } %ld3
2545 define { <2 x double>, <2 x double>, <2 x double> } @test_v2f64_post_reg_ld3(ptr %A, ptr %ptr, i64 %inc) {
2546 ; SDAG-LABEL: test_v2f64_post_reg_ld3:
2547 ; SDAG:       ; %bb.0:
2548 ; SDAG-NEXT:    lsl x8, x2, #3
2549 ; SDAG-NEXT:    ld3.2d { v0, v1, v2 }, [x0], x8
2550 ; SDAG-NEXT:    str x0, [x1]
2551 ; SDAG-NEXT:    ret
2553 ; CHECK-GISEL-LABEL: test_v2f64_post_reg_ld3:
2554 ; CHECK-GISEL:       ; %bb.0:
2555 ; CHECK-GISEL-NEXT:    ld3.2d { v0, v1, v2 }, [x0]
2556 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
2557 ; CHECK-GISEL-NEXT:    str x8, [x1]
2558 ; CHECK-GISEL-NEXT:    ret
2559   %ld3 = tail call { <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld3.v2f64.p0(ptr %A)
2560   %tmp = getelementptr double, ptr %A, i64 %inc
2561   store ptr %tmp, ptr %ptr
2562   ret { <2 x double>, <2 x double>, <2 x double> } %ld3
2565 declare { <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld3.v2f64.p0(ptr)
2568 define { <1 x double>, <1 x double>, <1 x double> } @test_v1f64_post_imm_ld3(ptr %A, ptr %ptr) {
2569 ; SDAG-LABEL: test_v1f64_post_imm_ld3:
2570 ; SDAG:       ; %bb.0:
2571 ; SDAG-NEXT:    ld1.1d { v0, v1, v2 }, [x0], #24
2572 ; SDAG-NEXT:    str x0, [x1]
2573 ; SDAG-NEXT:    ret
2575 ; CHECK-GISEL-LABEL: test_v1f64_post_imm_ld3:
2576 ; CHECK-GISEL:       ; %bb.0:
2577 ; CHECK-GISEL-NEXT:    ld1.1d { v0, v1, v2 }, [x0]
2578 ; CHECK-GISEL-NEXT:    add x8, x0, #24
2579 ; CHECK-GISEL-NEXT:    str x8, [x1]
2580 ; CHECK-GISEL-NEXT:    ret
2581   %ld3 = tail call { <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld3.v1f64.p0(ptr %A)
2582   %tmp = getelementptr double, ptr %A, i32 3
2583   store ptr %tmp, ptr %ptr
2584   ret { <1 x double>, <1 x double>, <1 x double> } %ld3
2587 define { <1 x double>, <1 x double>, <1 x double> } @test_v1f64_post_reg_ld3(ptr %A, ptr %ptr, i64 %inc) {
2588 ; SDAG-LABEL: test_v1f64_post_reg_ld3:
2589 ; SDAG:       ; %bb.0:
2590 ; SDAG-NEXT:    lsl x8, x2, #3
2591 ; SDAG-NEXT:    ld1.1d { v0, v1, v2 }, [x0], x8
2592 ; SDAG-NEXT:    str x0, [x1]
2593 ; SDAG-NEXT:    ret
2595 ; CHECK-GISEL-LABEL: test_v1f64_post_reg_ld3:
2596 ; CHECK-GISEL:       ; %bb.0:
2597 ; CHECK-GISEL-NEXT:    ld1.1d { v0, v1, v2 }, [x0]
2598 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
2599 ; CHECK-GISEL-NEXT:    str x8, [x1]
2600 ; CHECK-GISEL-NEXT:    ret
2601   %ld3 = tail call { <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld3.v1f64.p0(ptr %A)
2602   %tmp = getelementptr double, ptr %A, i64 %inc
2603   store ptr %tmp, ptr %ptr
2604   ret { <1 x double>, <1 x double>, <1 x double> } %ld3
2607 declare { <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld3.v1f64.p0(ptr)
2610 define { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @test_v16i8_post_imm_ld4(ptr %A, ptr %ptr) {
2611 ; SDAG-LABEL: test_v16i8_post_imm_ld4:
2612 ; SDAG:       ; %bb.0:
2613 ; SDAG-NEXT:    ld4.16b { v0, v1, v2, v3 }, [x0], #64
2614 ; SDAG-NEXT:    str x0, [x1]
2615 ; SDAG-NEXT:    ret
2617 ; CHECK-GISEL-LABEL: test_v16i8_post_imm_ld4:
2618 ; CHECK-GISEL:       ; %bb.0:
2619 ; CHECK-GISEL-NEXT:    ld4.16b { v0, v1, v2, v3 }, [x0]
2620 ; CHECK-GISEL-NEXT:    add x8, x0, #64
2621 ; CHECK-GISEL-NEXT:    str x8, [x1]
2622 ; CHECK-GISEL-NEXT:    ret
2623   %ld4 = tail call { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld4.v16i8.p0(ptr %A)
2624   %tmp = getelementptr i8, ptr %A, i32 64
2625   store ptr %tmp, ptr %ptr
2626   ret { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %ld4
2629 define { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @test_v16i8_post_reg_ld4(ptr %A, ptr %ptr, i64 %inc) {
2630 ; SDAG-LABEL: test_v16i8_post_reg_ld4:
2631 ; SDAG:       ; %bb.0:
2632 ; SDAG-NEXT:    ld4.16b { v0, v1, v2, v3 }, [x0], x2
2633 ; SDAG-NEXT:    str x0, [x1]
2634 ; SDAG-NEXT:    ret
2636 ; CHECK-GISEL-LABEL: test_v16i8_post_reg_ld4:
2637 ; CHECK-GISEL:       ; %bb.0:
2638 ; CHECK-GISEL-NEXT:    ld4.16b { v0, v1, v2, v3 }, [x0]
2639 ; CHECK-GISEL-NEXT:    add x8, x0, x2
2640 ; CHECK-GISEL-NEXT:    str x8, [x1]
2641 ; CHECK-GISEL-NEXT:    ret
2642   %ld4 = tail call { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld4.v16i8.p0(ptr %A)
2643   %tmp = getelementptr i8, ptr %A, i64 %inc
2644   store ptr %tmp, ptr %ptr
2645   ret { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %ld4
2648 declare { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld4.v16i8.p0(ptr)
2651 define { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @test_v8i8_post_imm_ld4(ptr %A, ptr %ptr) {
2652 ; SDAG-LABEL: test_v8i8_post_imm_ld4:
2653 ; SDAG:       ; %bb.0:
2654 ; SDAG-NEXT:    ld4.8b { v0, v1, v2, v3 }, [x0], #32
2655 ; SDAG-NEXT:    str x0, [x1]
2656 ; SDAG-NEXT:    ret
2658 ; CHECK-GISEL-LABEL: test_v8i8_post_imm_ld4:
2659 ; CHECK-GISEL:       ; %bb.0:
2660 ; CHECK-GISEL-NEXT:    ld4.8b { v0, v1, v2, v3 }, [x0]
2661 ; CHECK-GISEL-NEXT:    add x8, x0, #32
2662 ; CHECK-GISEL-NEXT:    str x8, [x1]
2663 ; CHECK-GISEL-NEXT:    ret
2664   %ld4 = tail call { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld4.v8i8.p0(ptr %A)
2665   %tmp = getelementptr i8, ptr %A, i32 32
2666   store ptr %tmp, ptr %ptr
2667   ret { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %ld4
2670 define { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @test_v8i8_post_reg_ld4(ptr %A, ptr %ptr, i64 %inc) {
2671 ; SDAG-LABEL: test_v8i8_post_reg_ld4:
2672 ; SDAG:       ; %bb.0:
2673 ; SDAG-NEXT:    ld4.8b { v0, v1, v2, v3 }, [x0], x2
2674 ; SDAG-NEXT:    str x0, [x1]
2675 ; SDAG-NEXT:    ret
2677 ; CHECK-GISEL-LABEL: test_v8i8_post_reg_ld4:
2678 ; CHECK-GISEL:       ; %bb.0:
2679 ; CHECK-GISEL-NEXT:    ld4.8b { v0, v1, v2, v3 }, [x0]
2680 ; CHECK-GISEL-NEXT:    add x8, x0, x2
2681 ; CHECK-GISEL-NEXT:    str x8, [x1]
2682 ; CHECK-GISEL-NEXT:    ret
2683   %ld4 = tail call { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld4.v8i8.p0(ptr %A)
2684   %tmp = getelementptr i8, ptr %A, i64 %inc
2685   store ptr %tmp, ptr %ptr
2686   ret { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %ld4
2689 declare { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld4.v8i8.p0(ptr)
2692 define { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @test_v8i16_post_imm_ld4(ptr %A, ptr %ptr) {
2693 ; SDAG-LABEL: test_v8i16_post_imm_ld4:
2694 ; SDAG:       ; %bb.0:
2695 ; SDAG-NEXT:    ld4.8h { v0, v1, v2, v3 }, [x0], #64
2696 ; SDAG-NEXT:    str x0, [x1]
2697 ; SDAG-NEXT:    ret
2699 ; CHECK-GISEL-LABEL: test_v8i16_post_imm_ld4:
2700 ; CHECK-GISEL:       ; %bb.0:
2701 ; CHECK-GISEL-NEXT:    ld4.8h { v0, v1, v2, v3 }, [x0]
2702 ; CHECK-GISEL-NEXT:    add x8, x0, #64
2703 ; CHECK-GISEL-NEXT:    str x8, [x1]
2704 ; CHECK-GISEL-NEXT:    ret
2705   %ld4 = tail call { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld4.v8i16.p0(ptr %A)
2706   %tmp = getelementptr i16, ptr %A, i32 32
2707   store ptr %tmp, ptr %ptr
2708   ret { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %ld4
2711 define { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @test_v8i16_post_reg_ld4(ptr %A, ptr %ptr, i64 %inc) {
2712 ; SDAG-LABEL: test_v8i16_post_reg_ld4:
2713 ; SDAG:       ; %bb.0:
2714 ; SDAG-NEXT:    lsl x8, x2, #1
2715 ; SDAG-NEXT:    ld4.8h { v0, v1, v2, v3 }, [x0], x8
2716 ; SDAG-NEXT:    str x0, [x1]
2717 ; SDAG-NEXT:    ret
2719 ; CHECK-GISEL-LABEL: test_v8i16_post_reg_ld4:
2720 ; CHECK-GISEL:       ; %bb.0:
2721 ; CHECK-GISEL-NEXT:    ld4.8h { v0, v1, v2, v3 }, [x0]
2722 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #1
2723 ; CHECK-GISEL-NEXT:    str x8, [x1]
2724 ; CHECK-GISEL-NEXT:    ret
2725   %ld4 = tail call { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld4.v8i16.p0(ptr %A)
2726   %tmp = getelementptr i16, ptr %A, i64 %inc
2727   store ptr %tmp, ptr %ptr
2728   ret { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %ld4
2731 declare { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld4.v8i16.p0(ptr)
2734 define { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @test_v4i16_post_imm_ld4(ptr %A, ptr %ptr) {
2735 ; SDAG-LABEL: test_v4i16_post_imm_ld4:
2736 ; SDAG:       ; %bb.0:
2737 ; SDAG-NEXT:    ld4.4h { v0, v1, v2, v3 }, [x0], #32
2738 ; SDAG-NEXT:    str x0, [x1]
2739 ; SDAG-NEXT:    ret
2741 ; CHECK-GISEL-LABEL: test_v4i16_post_imm_ld4:
2742 ; CHECK-GISEL:       ; %bb.0:
2743 ; CHECK-GISEL-NEXT:    ld4.4h { v0, v1, v2, v3 }, [x0]
2744 ; CHECK-GISEL-NEXT:    add x8, x0, #32
2745 ; CHECK-GISEL-NEXT:    str x8, [x1]
2746 ; CHECK-GISEL-NEXT:    ret
2747   %ld4 = tail call { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld4.v4i16.p0(ptr %A)
2748   %tmp = getelementptr i16, ptr %A, i32 16
2749   store ptr %tmp, ptr %ptr
2750   ret { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %ld4
2753 define { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @test_v4i16_post_reg_ld4(ptr %A, ptr %ptr, i64 %inc) {
2754 ; SDAG-LABEL: test_v4i16_post_reg_ld4:
2755 ; SDAG:       ; %bb.0:
2756 ; SDAG-NEXT:    lsl x8, x2, #1
2757 ; SDAG-NEXT:    ld4.4h { v0, v1, v2, v3 }, [x0], x8
2758 ; SDAG-NEXT:    str x0, [x1]
2759 ; SDAG-NEXT:    ret
2761 ; CHECK-GISEL-LABEL: test_v4i16_post_reg_ld4:
2762 ; CHECK-GISEL:       ; %bb.0:
2763 ; CHECK-GISEL-NEXT:    ld4.4h { v0, v1, v2, v3 }, [x0]
2764 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #1
2765 ; CHECK-GISEL-NEXT:    str x8, [x1]
2766 ; CHECK-GISEL-NEXT:    ret
2767   %ld4 = tail call { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld4.v4i16.p0(ptr %A)
2768   %tmp = getelementptr i16, ptr %A, i64 %inc
2769   store ptr %tmp, ptr %ptr
2770   ret { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %ld4
2773 declare { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld4.v4i16.p0(ptr)
2776 define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @test_v4i32_post_imm_ld4(ptr %A, ptr %ptr) {
2777 ; SDAG-LABEL: test_v4i32_post_imm_ld4:
2778 ; SDAG:       ; %bb.0:
2779 ; SDAG-NEXT:    ld4.4s { v0, v1, v2, v3 }, [x0], #64
2780 ; SDAG-NEXT:    str x0, [x1]
2781 ; SDAG-NEXT:    ret
2783 ; CHECK-GISEL-LABEL: test_v4i32_post_imm_ld4:
2784 ; CHECK-GISEL:       ; %bb.0:
2785 ; CHECK-GISEL-NEXT:    ld4.4s { v0, v1, v2, v3 }, [x0]
2786 ; CHECK-GISEL-NEXT:    add x8, x0, #64
2787 ; CHECK-GISEL-NEXT:    str x8, [x1]
2788 ; CHECK-GISEL-NEXT:    ret
2789   %ld4 = tail call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld4.v4i32.p0(ptr %A)
2790   %tmp = getelementptr i32, ptr %A, i32 16
2791   store ptr %tmp, ptr %ptr
2792   ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %ld4
2795 define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @test_v4i32_post_reg_ld4(ptr %A, ptr %ptr, i64 %inc) {
2796 ; SDAG-LABEL: test_v4i32_post_reg_ld4:
2797 ; SDAG:       ; %bb.0:
2798 ; SDAG-NEXT:    lsl x8, x2, #2
2799 ; SDAG-NEXT:    ld4.4s { v0, v1, v2, v3 }, [x0], x8
2800 ; SDAG-NEXT:    str x0, [x1]
2801 ; SDAG-NEXT:    ret
2803 ; CHECK-GISEL-LABEL: test_v4i32_post_reg_ld4:
2804 ; CHECK-GISEL:       ; %bb.0:
2805 ; CHECK-GISEL-NEXT:    ld4.4s { v0, v1, v2, v3 }, [x0]
2806 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
2807 ; CHECK-GISEL-NEXT:    str x8, [x1]
2808 ; CHECK-GISEL-NEXT:    ret
2809   %ld4 = tail call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld4.v4i32.p0(ptr %A)
2810   %tmp = getelementptr i32, ptr %A, i64 %inc
2811   store ptr %tmp, ptr %ptr
2812   ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %ld4
2815 declare { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld4.v4i32.p0(ptr)
2818 define { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @test_v2i32_post_imm_ld4(ptr %A, ptr %ptr) {
2819 ; SDAG-LABEL: test_v2i32_post_imm_ld4:
2820 ; SDAG:       ; %bb.0:
2821 ; SDAG-NEXT:    ld4.2s { v0, v1, v2, v3 }, [x0], #32
2822 ; SDAG-NEXT:    str x0, [x1]
2823 ; SDAG-NEXT:    ret
2825 ; CHECK-GISEL-LABEL: test_v2i32_post_imm_ld4:
2826 ; CHECK-GISEL:       ; %bb.0:
2827 ; CHECK-GISEL-NEXT:    ld4.2s { v0, v1, v2, v3 }, [x0]
2828 ; CHECK-GISEL-NEXT:    add x8, x0, #32
2829 ; CHECK-GISEL-NEXT:    str x8, [x1]
2830 ; CHECK-GISEL-NEXT:    ret
2831   %ld4 = tail call { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld4.v2i32.p0(ptr %A)
2832   %tmp = getelementptr i32, ptr %A, i32 8
2833   store ptr %tmp, ptr %ptr
2834   ret { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %ld4
2837 define { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @test_v2i32_post_reg_ld4(ptr %A, ptr %ptr, i64 %inc) {
2838 ; SDAG-LABEL: test_v2i32_post_reg_ld4:
2839 ; SDAG:       ; %bb.0:
2840 ; SDAG-NEXT:    lsl x8, x2, #2
2841 ; SDAG-NEXT:    ld4.2s { v0, v1, v2, v3 }, [x0], x8
2842 ; SDAG-NEXT:    str x0, [x1]
2843 ; SDAG-NEXT:    ret
2845 ; CHECK-GISEL-LABEL: test_v2i32_post_reg_ld4:
2846 ; CHECK-GISEL:       ; %bb.0:
2847 ; CHECK-GISEL-NEXT:    ld4.2s { v0, v1, v2, v3 }, [x0]
2848 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
2849 ; CHECK-GISEL-NEXT:    str x8, [x1]
2850 ; CHECK-GISEL-NEXT:    ret
2851   %ld4 = tail call { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld4.v2i32.p0(ptr %A)
2852   %tmp = getelementptr i32, ptr %A, i64 %inc
2853   store ptr %tmp, ptr %ptr
2854   ret { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %ld4
2857 declare { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld4.v2i32.p0(ptr)
2860 define { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @test_v2i64_post_imm_ld4(ptr %A, ptr %ptr) {
2861 ; SDAG-LABEL: test_v2i64_post_imm_ld4:
2862 ; SDAG:       ; %bb.0:
2863 ; SDAG-NEXT:    ld4.2d { v0, v1, v2, v3 }, [x0], #64
2864 ; SDAG-NEXT:    str x0, [x1]
2865 ; SDAG-NEXT:    ret
2867 ; CHECK-GISEL-LABEL: test_v2i64_post_imm_ld4:
2868 ; CHECK-GISEL:       ; %bb.0:
2869 ; CHECK-GISEL-NEXT:    ld4.2d { v0, v1, v2, v3 }, [x0]
2870 ; CHECK-GISEL-NEXT:    add x8, x0, #64
2871 ; CHECK-GISEL-NEXT:    str x8, [x1]
2872 ; CHECK-GISEL-NEXT:    ret
2873   %ld4 = tail call { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld4.v2i64.p0(ptr %A)
2874   %tmp = getelementptr i64, ptr %A, i32 8
2875   store ptr %tmp, ptr %ptr
2876   ret { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %ld4
2879 define { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @test_v2i64_post_reg_ld4(ptr %A, ptr %ptr, i64 %inc) {
2880 ; SDAG-LABEL: test_v2i64_post_reg_ld4:
2881 ; SDAG:       ; %bb.0:
2882 ; SDAG-NEXT:    lsl x8, x2, #3
2883 ; SDAG-NEXT:    ld4.2d { v0, v1, v2, v3 }, [x0], x8
2884 ; SDAG-NEXT:    str x0, [x1]
2885 ; SDAG-NEXT:    ret
2887 ; CHECK-GISEL-LABEL: test_v2i64_post_reg_ld4:
2888 ; CHECK-GISEL:       ; %bb.0:
2889 ; CHECK-GISEL-NEXT:    ld4.2d { v0, v1, v2, v3 }, [x0]
2890 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
2891 ; CHECK-GISEL-NEXT:    str x8, [x1]
2892 ; CHECK-GISEL-NEXT:    ret
2893   %ld4 = tail call { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld4.v2i64.p0(ptr %A)
2894   %tmp = getelementptr i64, ptr %A, i64 %inc
2895   store ptr %tmp, ptr %ptr
2896   ret { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %ld4
2899 declare { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld4.v2i64.p0(ptr)
2902 define { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @test_v1i64_post_imm_ld4(ptr %A, ptr %ptr) {
2903 ; SDAG-LABEL: test_v1i64_post_imm_ld4:
2904 ; SDAG:       ; %bb.0:
2905 ; SDAG-NEXT:    ld1.1d { v0, v1, v2, v3 }, [x0], #32
2906 ; SDAG-NEXT:    str x0, [x1]
2907 ; SDAG-NEXT:    ret
2909 ; CHECK-GISEL-LABEL: test_v1i64_post_imm_ld4:
2910 ; CHECK-GISEL:       ; %bb.0:
2911 ; CHECK-GISEL-NEXT:    ld1.1d { v0, v1, v2, v3 }, [x0]
2912 ; CHECK-GISEL-NEXT:    add x8, x0, #32
2913 ; CHECK-GISEL-NEXT:    str x8, [x1]
2914 ; CHECK-GISEL-NEXT:    ret
2915   %ld4 = tail call { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld4.v1i64.p0(ptr %A)
2916   %tmp = getelementptr i64, ptr %A, i32 4
2917   store ptr %tmp, ptr %ptr
2918   ret { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } %ld4
2921 define { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @test_v1i64_post_reg_ld4(ptr %A, ptr %ptr, i64 %inc) {
2922 ; SDAG-LABEL: test_v1i64_post_reg_ld4:
2923 ; SDAG:       ; %bb.0:
2924 ; SDAG-NEXT:    lsl x8, x2, #3
2925 ; SDAG-NEXT:    ld1.1d { v0, v1, v2, v3 }, [x0], x8
2926 ; SDAG-NEXT:    str x0, [x1]
2927 ; SDAG-NEXT:    ret
2929 ; CHECK-GISEL-LABEL: test_v1i64_post_reg_ld4:
2930 ; CHECK-GISEL:       ; %bb.0:
2931 ; CHECK-GISEL-NEXT:    ld1.1d { v0, v1, v2, v3 }, [x0]
2932 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
2933 ; CHECK-GISEL-NEXT:    str x8, [x1]
2934 ; CHECK-GISEL-NEXT:    ret
2935   %ld4 = tail call { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld4.v1i64.p0(ptr %A)
2936   %tmp = getelementptr i64, ptr %A, i64 %inc
2937   store ptr %tmp, ptr %ptr
2938   ret { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } %ld4
2941 declare { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld4.v1i64.p0(ptr)
2944 define { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @test_v4f32_post_imm_ld4(ptr %A, ptr %ptr) {
2945 ; SDAG-LABEL: test_v4f32_post_imm_ld4:
2946 ; SDAG:       ; %bb.0:
2947 ; SDAG-NEXT:    ld4.4s { v0, v1, v2, v3 }, [x0], #64
2948 ; SDAG-NEXT:    str x0, [x1]
2949 ; SDAG-NEXT:    ret
2951 ; CHECK-GISEL-LABEL: test_v4f32_post_imm_ld4:
2952 ; CHECK-GISEL:       ; %bb.0:
2953 ; CHECK-GISEL-NEXT:    ld4.4s { v0, v1, v2, v3 }, [x0]
2954 ; CHECK-GISEL-NEXT:    add x8, x0, #64
2955 ; CHECK-GISEL-NEXT:    str x8, [x1]
2956 ; CHECK-GISEL-NEXT:    ret
2957   %ld4 = tail call { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld4.v4f32.p0(ptr %A)
2958   %tmp = getelementptr float, ptr %A, i32 16
2959   store ptr %tmp, ptr %ptr
2960   ret { <4 x float>, <4 x float>, <4 x float>, <4 x float> } %ld4
2963 define { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @test_v4f32_post_reg_ld4(ptr %A, ptr %ptr, i64 %inc) {
2964 ; SDAG-LABEL: test_v4f32_post_reg_ld4:
2965 ; SDAG:       ; %bb.0:
2966 ; SDAG-NEXT:    lsl x8, x2, #2
2967 ; SDAG-NEXT:    ld4.4s { v0, v1, v2, v3 }, [x0], x8
2968 ; SDAG-NEXT:    str x0, [x1]
2969 ; SDAG-NEXT:    ret
2971 ; CHECK-GISEL-LABEL: test_v4f32_post_reg_ld4:
2972 ; CHECK-GISEL:       ; %bb.0:
2973 ; CHECK-GISEL-NEXT:    ld4.4s { v0, v1, v2, v3 }, [x0]
2974 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
2975 ; CHECK-GISEL-NEXT:    str x8, [x1]
2976 ; CHECK-GISEL-NEXT:    ret
2977   %ld4 = tail call { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld4.v4f32.p0(ptr %A)
2978   %tmp = getelementptr float, ptr %A, i64 %inc
2979   store ptr %tmp, ptr %ptr
2980   ret { <4 x float>, <4 x float>, <4 x float>, <4 x float> } %ld4
2983 declare { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld4.v4f32.p0(ptr)
2986 define { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @test_v2f32_post_imm_ld4(ptr %A, ptr %ptr) {
2987 ; SDAG-LABEL: test_v2f32_post_imm_ld4:
2988 ; SDAG:       ; %bb.0:
2989 ; SDAG-NEXT:    ld4.2s { v0, v1, v2, v3 }, [x0], #32
2990 ; SDAG-NEXT:    str x0, [x1]
2991 ; SDAG-NEXT:    ret
2993 ; CHECK-GISEL-LABEL: test_v2f32_post_imm_ld4:
2994 ; CHECK-GISEL:       ; %bb.0:
2995 ; CHECK-GISEL-NEXT:    ld4.2s { v0, v1, v2, v3 }, [x0]
2996 ; CHECK-GISEL-NEXT:    add x8, x0, #32
2997 ; CHECK-GISEL-NEXT:    str x8, [x1]
2998 ; CHECK-GISEL-NEXT:    ret
2999   %ld4 = tail call { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld4.v2f32.p0(ptr %A)
3000   %tmp = getelementptr float, ptr %A, i32 8
3001   store ptr %tmp, ptr %ptr
3002   ret { <2 x float>, <2 x float>, <2 x float>, <2 x float> } %ld4
3005 define { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @test_v2f32_post_reg_ld4(ptr %A, ptr %ptr, i64 %inc) {
3006 ; SDAG-LABEL: test_v2f32_post_reg_ld4:
3007 ; SDAG:       ; %bb.0:
3008 ; SDAG-NEXT:    lsl x8, x2, #2
3009 ; SDAG-NEXT:    ld4.2s { v0, v1, v2, v3 }, [x0], x8
3010 ; SDAG-NEXT:    str x0, [x1]
3011 ; SDAG-NEXT:    ret
3013 ; CHECK-GISEL-LABEL: test_v2f32_post_reg_ld4:
3014 ; CHECK-GISEL:       ; %bb.0:
3015 ; CHECK-GISEL-NEXT:    ld4.2s { v0, v1, v2, v3 }, [x0]
3016 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
3017 ; CHECK-GISEL-NEXT:    str x8, [x1]
3018 ; CHECK-GISEL-NEXT:    ret
3019   %ld4 = tail call { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld4.v2f32.p0(ptr %A)
3020   %tmp = getelementptr float, ptr %A, i64 %inc
3021   store ptr %tmp, ptr %ptr
3022   ret { <2 x float>, <2 x float>, <2 x float>, <2 x float> } %ld4
3025 declare { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld4.v2f32.p0(ptr)
3028 define { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @test_v2f64_post_imm_ld4(ptr %A, ptr %ptr) {
3029 ; SDAG-LABEL: test_v2f64_post_imm_ld4:
3030 ; SDAG:       ; %bb.0:
3031 ; SDAG-NEXT:    ld4.2d { v0, v1, v2, v3 }, [x0], #64
3032 ; SDAG-NEXT:    str x0, [x1]
3033 ; SDAG-NEXT:    ret
3035 ; CHECK-GISEL-LABEL: test_v2f64_post_imm_ld4:
3036 ; CHECK-GISEL:       ; %bb.0:
3037 ; CHECK-GISEL-NEXT:    ld4.2d { v0, v1, v2, v3 }, [x0]
3038 ; CHECK-GISEL-NEXT:    add x8, x0, #64
3039 ; CHECK-GISEL-NEXT:    str x8, [x1]
3040 ; CHECK-GISEL-NEXT:    ret
3041   %ld4 = tail call { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld4.v2f64.p0(ptr %A)
3042   %tmp = getelementptr double, ptr %A, i32 8
3043   store ptr %tmp, ptr %ptr
3044   ret { <2 x double>, <2 x double>, <2 x double>, <2 x double> } %ld4
3047 define { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @test_v2f64_post_reg_ld4(ptr %A, ptr %ptr, i64 %inc) {
3048 ; SDAG-LABEL: test_v2f64_post_reg_ld4:
3049 ; SDAG:       ; %bb.0:
3050 ; SDAG-NEXT:    lsl x8, x2, #3
3051 ; SDAG-NEXT:    ld4.2d { v0, v1, v2, v3 }, [x0], x8
3052 ; SDAG-NEXT:    str x0, [x1]
3053 ; SDAG-NEXT:    ret
3055 ; CHECK-GISEL-LABEL: test_v2f64_post_reg_ld4:
3056 ; CHECK-GISEL:       ; %bb.0:
3057 ; CHECK-GISEL-NEXT:    ld4.2d { v0, v1, v2, v3 }, [x0]
3058 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
3059 ; CHECK-GISEL-NEXT:    str x8, [x1]
3060 ; CHECK-GISEL-NEXT:    ret
3061   %ld4 = tail call { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld4.v2f64.p0(ptr %A)
3062   %tmp = getelementptr double, ptr %A, i64 %inc
3063   store ptr %tmp, ptr %ptr
3064   ret { <2 x double>, <2 x double>, <2 x double>, <2 x double> } %ld4
3067 declare { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld4.v2f64.p0(ptr)
3070 define { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @test_v1f64_post_imm_ld4(ptr %A, ptr %ptr) {
3071 ; SDAG-LABEL: test_v1f64_post_imm_ld4:
3072 ; SDAG:       ; %bb.0:
3073 ; SDAG-NEXT:    ld1.1d { v0, v1, v2, v3 }, [x0], #32
3074 ; SDAG-NEXT:    str x0, [x1]
3075 ; SDAG-NEXT:    ret
3077 ; CHECK-GISEL-LABEL: test_v1f64_post_imm_ld4:
3078 ; CHECK-GISEL:       ; %bb.0:
3079 ; CHECK-GISEL-NEXT:    ld1.1d { v0, v1, v2, v3 }, [x0]
3080 ; CHECK-GISEL-NEXT:    add x8, x0, #32
3081 ; CHECK-GISEL-NEXT:    str x8, [x1]
3082 ; CHECK-GISEL-NEXT:    ret
3083   %ld4 = tail call { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld4.v1f64.p0(ptr %A)
3084   %tmp = getelementptr double, ptr %A, i32 4
3085   store ptr %tmp, ptr %ptr
3086   ret { <1 x double>, <1 x double>, <1 x double>, <1 x double> } %ld4
3089 define { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @test_v1f64_post_reg_ld4(ptr %A, ptr %ptr, i64 %inc) {
3090 ; SDAG-LABEL: test_v1f64_post_reg_ld4:
3091 ; SDAG:       ; %bb.0:
3092 ; SDAG-NEXT:    lsl x8, x2, #3
3093 ; SDAG-NEXT:    ld1.1d { v0, v1, v2, v3 }, [x0], x8
3094 ; SDAG-NEXT:    str x0, [x1]
3095 ; SDAG-NEXT:    ret
3097 ; CHECK-GISEL-LABEL: test_v1f64_post_reg_ld4:
3098 ; CHECK-GISEL:       ; %bb.0:
3099 ; CHECK-GISEL-NEXT:    ld1.1d { v0, v1, v2, v3 }, [x0]
3100 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
3101 ; CHECK-GISEL-NEXT:    str x8, [x1]
3102 ; CHECK-GISEL-NEXT:    ret
3103   %ld4 = tail call { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld4.v1f64.p0(ptr %A)
3104   %tmp = getelementptr double, ptr %A, i64 %inc
3105   store ptr %tmp, ptr %ptr
3106   ret { <1 x double>, <1 x double>, <1 x double>, <1 x double> } %ld4
3109 declare { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld4.v1f64.p0(ptr)
3111 define { <16 x i8>, <16 x i8> } @test_v16i8_post_imm_ld1x2(ptr %A, ptr %ptr) {
3112 ; SDAG-LABEL: test_v16i8_post_imm_ld1x2:
3113 ; SDAG:       ; %bb.0:
3114 ; SDAG-NEXT:    ld1.16b { v0, v1 }, [x0], #32
3115 ; SDAG-NEXT:    str x0, [x1]
3116 ; SDAG-NEXT:    ret
3118 ; CHECK-GISEL-LABEL: test_v16i8_post_imm_ld1x2:
3119 ; CHECK-GISEL:       ; %bb.0:
3120 ; CHECK-GISEL-NEXT:    ld1.16b { v0, v1 }, [x0]
3121 ; CHECK-GISEL-NEXT:    add x8, x0, #32
3122 ; CHECK-GISEL-NEXT:    str x8, [x1]
3123 ; CHECK-GISEL-NEXT:    ret
3124   %ld1x2 = tail call { <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld1x2.v16i8.p0(ptr %A)
3125   %tmp = getelementptr i8, ptr %A, i32 32
3126   store ptr %tmp, ptr %ptr
3127   ret { <16 x i8>, <16 x i8> } %ld1x2
3130 define { <16 x i8>, <16 x i8> } @test_v16i8_post_reg_ld1x2(ptr %A, ptr %ptr, i64 %inc) {
3131 ; SDAG-LABEL: test_v16i8_post_reg_ld1x2:
3132 ; SDAG:       ; %bb.0:
3133 ; SDAG-NEXT:    ld1.16b { v0, v1 }, [x0], x2
3134 ; SDAG-NEXT:    str x0, [x1]
3135 ; SDAG-NEXT:    ret
3137 ; CHECK-GISEL-LABEL: test_v16i8_post_reg_ld1x2:
3138 ; CHECK-GISEL:       ; %bb.0:
3139 ; CHECK-GISEL-NEXT:    ld1.16b { v0, v1 }, [x0]
3140 ; CHECK-GISEL-NEXT:    add x8, x0, x2
3141 ; CHECK-GISEL-NEXT:    str x8, [x1]
3142 ; CHECK-GISEL-NEXT:    ret
3143   %ld1x2 = tail call { <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld1x2.v16i8.p0(ptr %A)
3144   %tmp = getelementptr i8, ptr %A, i64 %inc
3145   store ptr %tmp, ptr %ptr
3146   ret { <16 x i8>, <16 x i8> } %ld1x2
3149 declare { <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld1x2.v16i8.p0(ptr)
3152 define { <8 x i8>, <8 x i8> } @test_v8i8_post_imm_ld1x2(ptr %A, ptr %ptr) {
3153 ; SDAG-LABEL: test_v8i8_post_imm_ld1x2:
3154 ; SDAG:       ; %bb.0:
3155 ; SDAG-NEXT:    ld1.8b { v0, v1 }, [x0], #16
3156 ; SDAG-NEXT:    str x0, [x1]
3157 ; SDAG-NEXT:    ret
3159 ; CHECK-GISEL-LABEL: test_v8i8_post_imm_ld1x2:
3160 ; CHECK-GISEL:       ; %bb.0:
3161 ; CHECK-GISEL-NEXT:    ld1.8b { v0, v1 }, [x0]
3162 ; CHECK-GISEL-NEXT:    add x8, x0, #16
3163 ; CHECK-GISEL-NEXT:    str x8, [x1]
3164 ; CHECK-GISEL-NEXT:    ret
3165   %ld1x2 = tail call { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld1x2.v8i8.p0(ptr %A)
3166   %tmp = getelementptr i8, ptr %A, i32 16
3167   store ptr %tmp, ptr %ptr
3168   ret { <8 x i8>, <8 x i8> } %ld1x2
3171 define { <8 x i8>, <8 x i8> } @test_v8i8_post_reg_ld1x2(ptr %A, ptr %ptr, i64 %inc) {
3172 ; SDAG-LABEL: test_v8i8_post_reg_ld1x2:
3173 ; SDAG:       ; %bb.0:
3174 ; SDAG-NEXT:    ld1.8b { v0, v1 }, [x0], x2
3175 ; SDAG-NEXT:    str x0, [x1]
3176 ; SDAG-NEXT:    ret
3178 ; CHECK-GISEL-LABEL: test_v8i8_post_reg_ld1x2:
3179 ; CHECK-GISEL:       ; %bb.0:
3180 ; CHECK-GISEL-NEXT:    ld1.8b { v0, v1 }, [x0]
3181 ; CHECK-GISEL-NEXT:    add x8, x0, x2
3182 ; CHECK-GISEL-NEXT:    str x8, [x1]
3183 ; CHECK-GISEL-NEXT:    ret
3184   %ld1x2 = tail call { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld1x2.v8i8.p0(ptr %A)
3185   %tmp = getelementptr i8, ptr %A, i64 %inc
3186   store ptr %tmp, ptr %ptr
3187   ret { <8 x i8>, <8 x i8> } %ld1x2
3190 declare { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld1x2.v8i8.p0(ptr)
3193 define { <8 x i16>, <8 x i16> } @test_v8i16_post_imm_ld1x2(ptr %A, ptr %ptr) {
3194 ; SDAG-LABEL: test_v8i16_post_imm_ld1x2:
3195 ; SDAG:       ; %bb.0:
3196 ; SDAG-NEXT:    ld1.8h { v0, v1 }, [x0], #32
3197 ; SDAG-NEXT:    str x0, [x1]
3198 ; SDAG-NEXT:    ret
3200 ; CHECK-GISEL-LABEL: test_v8i16_post_imm_ld1x2:
3201 ; CHECK-GISEL:       ; %bb.0:
3202 ; CHECK-GISEL-NEXT:    ld1.8h { v0, v1 }, [x0]
3203 ; CHECK-GISEL-NEXT:    add x8, x0, #32
3204 ; CHECK-GISEL-NEXT:    str x8, [x1]
3205 ; CHECK-GISEL-NEXT:    ret
3206   %ld1x2 = tail call { <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld1x2.v8i16.p0(ptr %A)
3207   %tmp = getelementptr i16, ptr %A, i32 16
3208   store ptr %tmp, ptr %ptr
3209   ret { <8 x i16>, <8 x i16> } %ld1x2
3212 define { <8 x i16>, <8 x i16> } @test_v8i16_post_reg_ld1x2(ptr %A, ptr %ptr, i64 %inc) {
3213 ; SDAG-LABEL: test_v8i16_post_reg_ld1x2:
3214 ; SDAG:       ; %bb.0:
3215 ; SDAG-NEXT:    lsl x8, x2, #1
3216 ; SDAG-NEXT:    ld1.8h { v0, v1 }, [x0], x8
3217 ; SDAG-NEXT:    str x0, [x1]
3218 ; SDAG-NEXT:    ret
3220 ; CHECK-GISEL-LABEL: test_v8i16_post_reg_ld1x2:
3221 ; CHECK-GISEL:       ; %bb.0:
3222 ; CHECK-GISEL-NEXT:    ld1.8h { v0, v1 }, [x0]
3223 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #1
3224 ; CHECK-GISEL-NEXT:    str x8, [x1]
3225 ; CHECK-GISEL-NEXT:    ret
3226   %ld1x2 = tail call { <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld1x2.v8i16.p0(ptr %A)
3227   %tmp = getelementptr i16, ptr %A, i64 %inc
3228   store ptr %tmp, ptr %ptr
3229   ret { <8 x i16>, <8 x i16> } %ld1x2
3232 declare { <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld1x2.v8i16.p0(ptr)
3235 define { <4 x i16>, <4 x i16> } @test_v4i16_post_imm_ld1x2(ptr %A, ptr %ptr) {
3236 ; SDAG-LABEL: test_v4i16_post_imm_ld1x2:
3237 ; SDAG:       ; %bb.0:
3238 ; SDAG-NEXT:    ld1.4h { v0, v1 }, [x0], #16
3239 ; SDAG-NEXT:    str x0, [x1]
3240 ; SDAG-NEXT:    ret
3242 ; CHECK-GISEL-LABEL: test_v4i16_post_imm_ld1x2:
3243 ; CHECK-GISEL:       ; %bb.0:
3244 ; CHECK-GISEL-NEXT:    ld1.4h { v0, v1 }, [x0]
3245 ; CHECK-GISEL-NEXT:    add x8, x0, #16
3246 ; CHECK-GISEL-NEXT:    str x8, [x1]
3247 ; CHECK-GISEL-NEXT:    ret
3248   %ld1x2 = tail call { <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld1x2.v4i16.p0(ptr %A)
3249   %tmp = getelementptr i16, ptr %A, i32 8
3250   store ptr %tmp, ptr %ptr
3251   ret { <4 x i16>, <4 x i16> } %ld1x2
3254 define { <4 x i16>, <4 x i16> } @test_v4i16_post_reg_ld1x2(ptr %A, ptr %ptr, i64 %inc) {
3255 ; SDAG-LABEL: test_v4i16_post_reg_ld1x2:
3256 ; SDAG:       ; %bb.0:
3257 ; SDAG-NEXT:    lsl x8, x2, #1
3258 ; SDAG-NEXT:    ld1.4h { v0, v1 }, [x0], x8
3259 ; SDAG-NEXT:    str x0, [x1]
3260 ; SDAG-NEXT:    ret
3262 ; CHECK-GISEL-LABEL: test_v4i16_post_reg_ld1x2:
3263 ; CHECK-GISEL:       ; %bb.0:
3264 ; CHECK-GISEL-NEXT:    ld1.4h { v0, v1 }, [x0]
3265 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #1
3266 ; CHECK-GISEL-NEXT:    str x8, [x1]
3267 ; CHECK-GISEL-NEXT:    ret
3268   %ld1x2 = tail call { <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld1x2.v4i16.p0(ptr %A)
3269   %tmp = getelementptr i16, ptr %A, i64 %inc
3270   store ptr %tmp, ptr %ptr
3271   ret { <4 x i16>, <4 x i16> } %ld1x2
3274 declare { <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld1x2.v4i16.p0(ptr)
3277 define { <4 x i32>, <4 x i32> } @test_v4i32_post_imm_ld1x2(ptr %A, ptr %ptr) {
3278 ; SDAG-LABEL: test_v4i32_post_imm_ld1x2:
3279 ; SDAG:       ; %bb.0:
3280 ; SDAG-NEXT:    ld1.4s { v0, v1 }, [x0], #32
3281 ; SDAG-NEXT:    str x0, [x1]
3282 ; SDAG-NEXT:    ret
3284 ; CHECK-GISEL-LABEL: test_v4i32_post_imm_ld1x2:
3285 ; CHECK-GISEL:       ; %bb.0:
3286 ; CHECK-GISEL-NEXT:    ld1.4s { v0, v1 }, [x0]
3287 ; CHECK-GISEL-NEXT:    add x8, x0, #32
3288 ; CHECK-GISEL-NEXT:    str x8, [x1]
3289 ; CHECK-GISEL-NEXT:    ret
3290   %ld1x2 = tail call { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld1x2.v4i32.p0(ptr %A)
3291   %tmp = getelementptr i32, ptr %A, i32 8
3292   store ptr %tmp, ptr %ptr
3293   ret { <4 x i32>, <4 x i32> } %ld1x2
3296 define { <4 x i32>, <4 x i32> } @test_v4i32_post_reg_ld1x2(ptr %A, ptr %ptr, i64 %inc) {
3297 ; SDAG-LABEL: test_v4i32_post_reg_ld1x2:
3298 ; SDAG:       ; %bb.0:
3299 ; SDAG-NEXT:    lsl x8, x2, #2
3300 ; SDAG-NEXT:    ld1.4s { v0, v1 }, [x0], x8
3301 ; SDAG-NEXT:    str x0, [x1]
3302 ; SDAG-NEXT:    ret
3304 ; CHECK-GISEL-LABEL: test_v4i32_post_reg_ld1x2:
3305 ; CHECK-GISEL:       ; %bb.0:
3306 ; CHECK-GISEL-NEXT:    ld1.4s { v0, v1 }, [x0]
3307 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
3308 ; CHECK-GISEL-NEXT:    str x8, [x1]
3309 ; CHECK-GISEL-NEXT:    ret
3310   %ld1x2 = tail call { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld1x2.v4i32.p0(ptr %A)
3311   %tmp = getelementptr i32, ptr %A, i64 %inc
3312   store ptr %tmp, ptr %ptr
3313   ret { <4 x i32>, <4 x i32> } %ld1x2
3316 declare { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld1x2.v4i32.p0(ptr)
3319 define { <2 x i32>, <2 x i32> } @test_v2i32_post_imm_ld1x2(ptr %A, ptr %ptr) {
3320 ; SDAG-LABEL: test_v2i32_post_imm_ld1x2:
3321 ; SDAG:       ; %bb.0:
3322 ; SDAG-NEXT:    ld1.2s { v0, v1 }, [x0], #16
3323 ; SDAG-NEXT:    str x0, [x1]
3324 ; SDAG-NEXT:    ret
3326 ; CHECK-GISEL-LABEL: test_v2i32_post_imm_ld1x2:
3327 ; CHECK-GISEL:       ; %bb.0:
3328 ; CHECK-GISEL-NEXT:    ld1.2s { v0, v1 }, [x0]
3329 ; CHECK-GISEL-NEXT:    add x8, x0, #16
3330 ; CHECK-GISEL-NEXT:    str x8, [x1]
3331 ; CHECK-GISEL-NEXT:    ret
3332   %ld1x2 = tail call { <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld1x2.v2i32.p0(ptr %A)
3333   %tmp = getelementptr i32, ptr %A, i32 4
3334   store ptr %tmp, ptr %ptr
3335   ret { <2 x i32>, <2 x i32> } %ld1x2
3338 define { <2 x i32>, <2 x i32> } @test_v2i32_post_reg_ld1x2(ptr %A, ptr %ptr, i64 %inc) {
3339 ; SDAG-LABEL: test_v2i32_post_reg_ld1x2:
3340 ; SDAG:       ; %bb.0:
3341 ; SDAG-NEXT:    lsl x8, x2, #2
3342 ; SDAG-NEXT:    ld1.2s { v0, v1 }, [x0], x8
3343 ; SDAG-NEXT:    str x0, [x1]
3344 ; SDAG-NEXT:    ret
3346 ; CHECK-GISEL-LABEL: test_v2i32_post_reg_ld1x2:
3347 ; CHECK-GISEL:       ; %bb.0:
3348 ; CHECK-GISEL-NEXT:    ld1.2s { v0, v1 }, [x0]
3349 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
3350 ; CHECK-GISEL-NEXT:    str x8, [x1]
3351 ; CHECK-GISEL-NEXT:    ret
3352   %ld1x2 = tail call { <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld1x2.v2i32.p0(ptr %A)
3353   %tmp = getelementptr i32, ptr %A, i64 %inc
3354   store ptr %tmp, ptr %ptr
3355   ret { <2 x i32>, <2 x i32> } %ld1x2
3358 declare { <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld1x2.v2i32.p0(ptr)
3361 define { <2 x i64>, <2 x i64> } @test_v2i64_post_imm_ld1x2(ptr %A, ptr %ptr) {
3362 ; SDAG-LABEL: test_v2i64_post_imm_ld1x2:
3363 ; SDAG:       ; %bb.0:
3364 ; SDAG-NEXT:    ld1.2d { v0, v1 }, [x0], #32
3365 ; SDAG-NEXT:    str x0, [x1]
3366 ; SDAG-NEXT:    ret
3368 ; CHECK-GISEL-LABEL: test_v2i64_post_imm_ld1x2:
3369 ; CHECK-GISEL:       ; %bb.0:
3370 ; CHECK-GISEL-NEXT:    ld1.2d { v0, v1 }, [x0]
3371 ; CHECK-GISEL-NEXT:    add x8, x0, #32
3372 ; CHECK-GISEL-NEXT:    str x8, [x1]
3373 ; CHECK-GISEL-NEXT:    ret
3374   %ld1x2 = tail call { <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld1x2.v2i64.p0(ptr %A)
3375   %tmp = getelementptr i64, ptr %A, i32 4
3376   store ptr %tmp, ptr %ptr
3377   ret { <2 x i64>, <2 x i64> } %ld1x2
3380 define { <2 x i64>, <2 x i64> } @test_v2i64_post_reg_ld1x2(ptr %A, ptr %ptr, i64 %inc) {
3381 ; SDAG-LABEL: test_v2i64_post_reg_ld1x2:
3382 ; SDAG:       ; %bb.0:
3383 ; SDAG-NEXT:    lsl x8, x2, #3
3384 ; SDAG-NEXT:    ld1.2d { v0, v1 }, [x0], x8
3385 ; SDAG-NEXT:    str x0, [x1]
3386 ; SDAG-NEXT:    ret
3388 ; CHECK-GISEL-LABEL: test_v2i64_post_reg_ld1x2:
3389 ; CHECK-GISEL:       ; %bb.0:
3390 ; CHECK-GISEL-NEXT:    ld1.2d { v0, v1 }, [x0]
3391 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
3392 ; CHECK-GISEL-NEXT:    str x8, [x1]
3393 ; CHECK-GISEL-NEXT:    ret
3394   %ld1x2 = tail call { <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld1x2.v2i64.p0(ptr %A)
3395   %tmp = getelementptr i64, ptr %A, i64 %inc
3396   store ptr %tmp, ptr %ptr
3397   ret { <2 x i64>, <2 x i64> } %ld1x2
3400 declare { <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld1x2.v2i64.p0(ptr)
3403 define { <1 x i64>, <1 x i64> } @test_v1i64_post_imm_ld1x2(ptr %A, ptr %ptr) {
3404 ; SDAG-LABEL: test_v1i64_post_imm_ld1x2:
3405 ; SDAG:       ; %bb.0:
3406 ; SDAG-NEXT:    ld1.1d { v0, v1 }, [x0], #16
3407 ; SDAG-NEXT:    str x0, [x1]
3408 ; SDAG-NEXT:    ret
3410 ; CHECK-GISEL-LABEL: test_v1i64_post_imm_ld1x2:
3411 ; CHECK-GISEL:       ; %bb.0:
3412 ; CHECK-GISEL-NEXT:    ld1.1d { v0, v1 }, [x0]
3413 ; CHECK-GISEL-NEXT:    add x8, x0, #16
3414 ; CHECK-GISEL-NEXT:    str x8, [x1]
3415 ; CHECK-GISEL-NEXT:    ret
3416   %ld1x2 = tail call { <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld1x2.v1i64.p0(ptr %A)
3417   %tmp = getelementptr i64, ptr %A, i32 2
3418   store ptr %tmp, ptr %ptr
3419   ret { <1 x i64>, <1 x i64> } %ld1x2
3422 define { <1 x i64>, <1 x i64> } @test_v1i64_post_reg_ld1x2(ptr %A, ptr %ptr, i64 %inc) {
3423 ; SDAG-LABEL: test_v1i64_post_reg_ld1x2:
3424 ; SDAG:       ; %bb.0:
3425 ; SDAG-NEXT:    lsl x8, x2, #3
3426 ; SDAG-NEXT:    ld1.1d { v0, v1 }, [x0], x8
3427 ; SDAG-NEXT:    str x0, [x1]
3428 ; SDAG-NEXT:    ret
3430 ; CHECK-GISEL-LABEL: test_v1i64_post_reg_ld1x2:
3431 ; CHECK-GISEL:       ; %bb.0:
3432 ; CHECK-GISEL-NEXT:    ld1.1d { v0, v1 }, [x0]
3433 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
3434 ; CHECK-GISEL-NEXT:    str x8, [x1]
3435 ; CHECK-GISEL-NEXT:    ret
3436   %ld1x2 = tail call { <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld1x2.v1i64.p0(ptr %A)
3437   %tmp = getelementptr i64, ptr %A, i64 %inc
3438   store ptr %tmp, ptr %ptr
3439   ret { <1 x i64>, <1 x i64> } %ld1x2
3442 declare { <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld1x2.v1i64.p0(ptr)
3445 define { <4 x float>, <4 x float> } @test_v4f32_post_imm_ld1x2(ptr %A, ptr %ptr) {
3446 ; SDAG-LABEL: test_v4f32_post_imm_ld1x2:
3447 ; SDAG:       ; %bb.0:
3448 ; SDAG-NEXT:    ld1.4s { v0, v1 }, [x0], #32
3449 ; SDAG-NEXT:    str x0, [x1]
3450 ; SDAG-NEXT:    ret
3452 ; CHECK-GISEL-LABEL: test_v4f32_post_imm_ld1x2:
3453 ; CHECK-GISEL:       ; %bb.0:
3454 ; CHECK-GISEL-NEXT:    ld1.4s { v0, v1 }, [x0]
3455 ; CHECK-GISEL-NEXT:    add x8, x0, #32
3456 ; CHECK-GISEL-NEXT:    str x8, [x1]
3457 ; CHECK-GISEL-NEXT:    ret
3458   %ld1x2 = tail call { <4 x float>, <4 x float> } @llvm.aarch64.neon.ld1x2.v4f32.p0(ptr %A)
3459   %tmp = getelementptr float, ptr %A, i32 8
3460   store ptr %tmp, ptr %ptr
3461   ret { <4 x float>, <4 x float> } %ld1x2
3464 define { <4 x float>, <4 x float> } @test_v4f32_post_reg_ld1x2(ptr %A, ptr %ptr, i64 %inc) {
3465 ; SDAG-LABEL: test_v4f32_post_reg_ld1x2:
3466 ; SDAG:       ; %bb.0:
3467 ; SDAG-NEXT:    lsl x8, x2, #2
3468 ; SDAG-NEXT:    ld1.4s { v0, v1 }, [x0], x8
3469 ; SDAG-NEXT:    str x0, [x1]
3470 ; SDAG-NEXT:    ret
3472 ; CHECK-GISEL-LABEL: test_v4f32_post_reg_ld1x2:
3473 ; CHECK-GISEL:       ; %bb.0:
3474 ; CHECK-GISEL-NEXT:    ld1.4s { v0, v1 }, [x0]
3475 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
3476 ; CHECK-GISEL-NEXT:    str x8, [x1]
3477 ; CHECK-GISEL-NEXT:    ret
3478   %ld1x2 = tail call { <4 x float>, <4 x float> } @llvm.aarch64.neon.ld1x2.v4f32.p0(ptr %A)
3479   %tmp = getelementptr float, ptr %A, i64 %inc
3480   store ptr %tmp, ptr %ptr
3481   ret { <4 x float>, <4 x float> } %ld1x2
3484 declare { <4 x float>, <4 x float> } @llvm.aarch64.neon.ld1x2.v4f32.p0(ptr)
3487 define { <2 x float>, <2 x float> } @test_v2f32_post_imm_ld1x2(ptr %A, ptr %ptr) {
3488 ; SDAG-LABEL: test_v2f32_post_imm_ld1x2:
3489 ; SDAG:       ; %bb.0:
3490 ; SDAG-NEXT:    ld1.2s { v0, v1 }, [x0], #16
3491 ; SDAG-NEXT:    str x0, [x1]
3492 ; SDAG-NEXT:    ret
3494 ; CHECK-GISEL-LABEL: test_v2f32_post_imm_ld1x2:
3495 ; CHECK-GISEL:       ; %bb.0:
3496 ; CHECK-GISEL-NEXT:    ld1.2s { v0, v1 }, [x0]
3497 ; CHECK-GISEL-NEXT:    add x8, x0, #16
3498 ; CHECK-GISEL-NEXT:    str x8, [x1]
3499 ; CHECK-GISEL-NEXT:    ret
3500   %ld1x2 = tail call { <2 x float>, <2 x float> } @llvm.aarch64.neon.ld1x2.v2f32.p0(ptr %A)
3501   %tmp = getelementptr float, ptr %A, i32 4
3502   store ptr %tmp, ptr %ptr
3503   ret { <2 x float>, <2 x float> } %ld1x2
3506 define { <2 x float>, <2 x float> } @test_v2f32_post_reg_ld1x2(ptr %A, ptr %ptr, i64 %inc) {
3507 ; SDAG-LABEL: test_v2f32_post_reg_ld1x2:
3508 ; SDAG:       ; %bb.0:
3509 ; SDAG-NEXT:    lsl x8, x2, #2
3510 ; SDAG-NEXT:    ld1.2s { v0, v1 }, [x0], x8
3511 ; SDAG-NEXT:    str x0, [x1]
3512 ; SDAG-NEXT:    ret
3514 ; CHECK-GISEL-LABEL: test_v2f32_post_reg_ld1x2:
3515 ; CHECK-GISEL:       ; %bb.0:
3516 ; CHECK-GISEL-NEXT:    ld1.2s { v0, v1 }, [x0]
3517 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
3518 ; CHECK-GISEL-NEXT:    str x8, [x1]
3519 ; CHECK-GISEL-NEXT:    ret
3520   %ld1x2 = tail call { <2 x float>, <2 x float> } @llvm.aarch64.neon.ld1x2.v2f32.p0(ptr %A)
3521   %tmp = getelementptr float, ptr %A, i64 %inc
3522   store ptr %tmp, ptr %ptr
3523   ret { <2 x float>, <2 x float> } %ld1x2
3526 declare { <2 x float>, <2 x float> } @llvm.aarch64.neon.ld1x2.v2f32.p0(ptr)
3529 define { <2 x double>, <2 x double> } @test_v2f64_post_imm_ld1x2(ptr %A, ptr %ptr) {
3530 ; SDAG-LABEL: test_v2f64_post_imm_ld1x2:
3531 ; SDAG:       ; %bb.0:
3532 ; SDAG-NEXT:    ld1.2d { v0, v1 }, [x0], #32
3533 ; SDAG-NEXT:    str x0, [x1]
3534 ; SDAG-NEXT:    ret
3536 ; CHECK-GISEL-LABEL: test_v2f64_post_imm_ld1x2:
3537 ; CHECK-GISEL:       ; %bb.0:
3538 ; CHECK-GISEL-NEXT:    ld1.2d { v0, v1 }, [x0]
3539 ; CHECK-GISEL-NEXT:    add x8, x0, #32
3540 ; CHECK-GISEL-NEXT:    str x8, [x1]
3541 ; CHECK-GISEL-NEXT:    ret
3542   %ld1x2 = tail call { <2 x double>, <2 x double> } @llvm.aarch64.neon.ld1x2.v2f64.p0(ptr %A)
3543   %tmp = getelementptr double, ptr %A, i32 4
3544   store ptr %tmp, ptr %ptr
3545   ret { <2 x double>, <2 x double> } %ld1x2
3548 define { <2 x double>, <2 x double> } @test_v2f64_post_reg_ld1x2(ptr %A, ptr %ptr, i64 %inc) {
3549 ; SDAG-LABEL: test_v2f64_post_reg_ld1x2:
3550 ; SDAG:       ; %bb.0:
3551 ; SDAG-NEXT:    lsl x8, x2, #3
3552 ; SDAG-NEXT:    ld1.2d { v0, v1 }, [x0], x8
3553 ; SDAG-NEXT:    str x0, [x1]
3554 ; SDAG-NEXT:    ret
3556 ; CHECK-GISEL-LABEL: test_v2f64_post_reg_ld1x2:
3557 ; CHECK-GISEL:       ; %bb.0:
3558 ; CHECK-GISEL-NEXT:    ld1.2d { v0, v1 }, [x0]
3559 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
3560 ; CHECK-GISEL-NEXT:    str x8, [x1]
3561 ; CHECK-GISEL-NEXT:    ret
3562   %ld1x2 = tail call { <2 x double>, <2 x double> } @llvm.aarch64.neon.ld1x2.v2f64.p0(ptr %A)
3563   %tmp = getelementptr double, ptr %A, i64 %inc
3564   store ptr %tmp, ptr %ptr
3565   ret { <2 x double>, <2 x double> } %ld1x2
3568 declare { <2 x double>, <2 x double> } @llvm.aarch64.neon.ld1x2.v2f64.p0(ptr)
3571 define { <1 x double>, <1 x double> } @test_v1f64_post_imm_ld1x2(ptr %A, ptr %ptr) {
3572 ; SDAG-LABEL: test_v1f64_post_imm_ld1x2:
3573 ; SDAG:       ; %bb.0:
3574 ; SDAG-NEXT:    ld1.1d { v0, v1 }, [x0], #16
3575 ; SDAG-NEXT:    str x0, [x1]
3576 ; SDAG-NEXT:    ret
3578 ; CHECK-GISEL-LABEL: test_v1f64_post_imm_ld1x2:
3579 ; CHECK-GISEL:       ; %bb.0:
3580 ; CHECK-GISEL-NEXT:    ld1.1d { v0, v1 }, [x0]
3581 ; CHECK-GISEL-NEXT:    add x8, x0, #16
3582 ; CHECK-GISEL-NEXT:    str x8, [x1]
3583 ; CHECK-GISEL-NEXT:    ret
3584   %ld1x2 = tail call { <1 x double>, <1 x double> } @llvm.aarch64.neon.ld1x2.v1f64.p0(ptr %A)
3585   %tmp = getelementptr double, ptr %A, i32 2
3586   store ptr %tmp, ptr %ptr
3587   ret { <1 x double>, <1 x double> } %ld1x2
3590 define { <1 x double>, <1 x double> } @test_v1f64_post_reg_ld1x2(ptr %A, ptr %ptr, i64 %inc) {
3591 ; SDAG-LABEL: test_v1f64_post_reg_ld1x2:
3592 ; SDAG:       ; %bb.0:
3593 ; SDAG-NEXT:    lsl x8, x2, #3
3594 ; SDAG-NEXT:    ld1.1d { v0, v1 }, [x0], x8
3595 ; SDAG-NEXT:    str x0, [x1]
3596 ; SDAG-NEXT:    ret
3598 ; CHECK-GISEL-LABEL: test_v1f64_post_reg_ld1x2:
3599 ; CHECK-GISEL:       ; %bb.0:
3600 ; CHECK-GISEL-NEXT:    ld1.1d { v0, v1 }, [x0]
3601 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
3602 ; CHECK-GISEL-NEXT:    str x8, [x1]
3603 ; CHECK-GISEL-NEXT:    ret
3604   %ld1x2 = tail call { <1 x double>, <1 x double> } @llvm.aarch64.neon.ld1x2.v1f64.p0(ptr %A)
3605   %tmp = getelementptr double, ptr %A, i64 %inc
3606   store ptr %tmp, ptr %ptr
3607   ret { <1 x double>, <1 x double> } %ld1x2
3610 declare { <1 x double>, <1 x double> } @llvm.aarch64.neon.ld1x2.v1f64.p0(ptr)
3613 define { <16 x i8>, <16 x i8>, <16 x i8> } @test_v16i8_post_imm_ld1x3(ptr %A, ptr %ptr) {
3614 ; SDAG-LABEL: test_v16i8_post_imm_ld1x3:
3615 ; SDAG:       ; %bb.0:
3616 ; SDAG-NEXT:    ld1.16b { v0, v1, v2 }, [x0], #48
3617 ; SDAG-NEXT:    str x0, [x1]
3618 ; SDAG-NEXT:    ret
3620 ; CHECK-GISEL-LABEL: test_v16i8_post_imm_ld1x3:
3621 ; CHECK-GISEL:       ; %bb.0:
3622 ; CHECK-GISEL-NEXT:    ld1.16b { v0, v1, v2 }, [x0]
3623 ; CHECK-GISEL-NEXT:    add x8, x0, #48
3624 ; CHECK-GISEL-NEXT:    str x8, [x1]
3625 ; CHECK-GISEL-NEXT:    ret
3626   %ld1x3 = tail call { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld1x3.v16i8.p0(ptr %A)
3627   %tmp = getelementptr i8, ptr %A, i32 48
3628   store ptr %tmp, ptr %ptr
3629   ret { <16 x i8>, <16 x i8>, <16 x i8> } %ld1x3
3632 define { <16 x i8>, <16 x i8>, <16 x i8> } @test_v16i8_post_reg_ld1x3(ptr %A, ptr %ptr, i64 %inc) {
3633 ; SDAG-LABEL: test_v16i8_post_reg_ld1x3:
3634 ; SDAG:       ; %bb.0:
3635 ; SDAG-NEXT:    ld1.16b { v0, v1, v2 }, [x0], x2
3636 ; SDAG-NEXT:    str x0, [x1]
3637 ; SDAG-NEXT:    ret
3639 ; CHECK-GISEL-LABEL: test_v16i8_post_reg_ld1x3:
3640 ; CHECK-GISEL:       ; %bb.0:
3641 ; CHECK-GISEL-NEXT:    ld1.16b { v0, v1, v2 }, [x0]
3642 ; CHECK-GISEL-NEXT:    add x8, x0, x2
3643 ; CHECK-GISEL-NEXT:    str x8, [x1]
3644 ; CHECK-GISEL-NEXT:    ret
3645   %ld1x3 = tail call { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld1x3.v16i8.p0(ptr %A)
3646   %tmp = getelementptr i8, ptr %A, i64 %inc
3647   store ptr %tmp, ptr %ptr
3648   ret { <16 x i8>, <16 x i8>, <16 x i8> } %ld1x3
3651 declare { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld1x3.v16i8.p0(ptr)
3654 define { <8 x i8>, <8 x i8>, <8 x i8> } @test_v8i8_post_imm_ld1x3(ptr %A, ptr %ptr) {
3655 ; SDAG-LABEL: test_v8i8_post_imm_ld1x3:
3656 ; SDAG:       ; %bb.0:
3657 ; SDAG-NEXT:    ld1.8b { v0, v1, v2 }, [x0], #24
3658 ; SDAG-NEXT:    str x0, [x1]
3659 ; SDAG-NEXT:    ret
3661 ; CHECK-GISEL-LABEL: test_v8i8_post_imm_ld1x3:
3662 ; CHECK-GISEL:       ; %bb.0:
3663 ; CHECK-GISEL-NEXT:    ld1.8b { v0, v1, v2 }, [x0]
3664 ; CHECK-GISEL-NEXT:    add x8, x0, #24
3665 ; CHECK-GISEL-NEXT:    str x8, [x1]
3666 ; CHECK-GISEL-NEXT:    ret
3667   %ld1x3 = tail call { <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld1x3.v8i8.p0(ptr %A)
3668   %tmp = getelementptr i8, ptr %A, i32 24
3669   store ptr %tmp, ptr %ptr
3670   ret { <8 x i8>, <8 x i8>, <8 x i8> } %ld1x3
3673 define { <8 x i8>, <8 x i8>, <8 x i8> } @test_v8i8_post_reg_ld1x3(ptr %A, ptr %ptr, i64 %inc) {
3674 ; SDAG-LABEL: test_v8i8_post_reg_ld1x3:
3675 ; SDAG:       ; %bb.0:
3676 ; SDAG-NEXT:    ld1.8b { v0, v1, v2 }, [x0], x2
3677 ; SDAG-NEXT:    str x0, [x1]
3678 ; SDAG-NEXT:    ret
3680 ; CHECK-GISEL-LABEL: test_v8i8_post_reg_ld1x3:
3681 ; CHECK-GISEL:       ; %bb.0:
3682 ; CHECK-GISEL-NEXT:    ld1.8b { v0, v1, v2 }, [x0]
3683 ; CHECK-GISEL-NEXT:    add x8, x0, x2
3684 ; CHECK-GISEL-NEXT:    str x8, [x1]
3685 ; CHECK-GISEL-NEXT:    ret
3686   %ld1x3 = tail call { <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld1x3.v8i8.p0(ptr %A)
3687   %tmp = getelementptr i8, ptr %A, i64 %inc
3688   store ptr %tmp, ptr %ptr
3689   ret { <8 x i8>, <8 x i8>, <8 x i8> } %ld1x3
3692 declare { <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld1x3.v8i8.p0(ptr)
3695 define { <8 x i16>, <8 x i16>, <8 x i16> } @test_v8i16_post_imm_ld1x3(ptr %A, ptr %ptr) {
3696 ; SDAG-LABEL: test_v8i16_post_imm_ld1x3:
3697 ; SDAG:       ; %bb.0:
3698 ; SDAG-NEXT:    ld1.8h { v0, v1, v2 }, [x0], #48
3699 ; SDAG-NEXT:    str x0, [x1]
3700 ; SDAG-NEXT:    ret
3702 ; CHECK-GISEL-LABEL: test_v8i16_post_imm_ld1x3:
3703 ; CHECK-GISEL:       ; %bb.0:
3704 ; CHECK-GISEL-NEXT:    ld1.8h { v0, v1, v2 }, [x0]
3705 ; CHECK-GISEL-NEXT:    add x8, x0, #48
3706 ; CHECK-GISEL-NEXT:    str x8, [x1]
3707 ; CHECK-GISEL-NEXT:    ret
3708   %ld1x3 = tail call { <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld1x3.v8i16.p0(ptr %A)
3709   %tmp = getelementptr i16, ptr %A, i32 24
3710   store ptr %tmp, ptr %ptr
3711   ret { <8 x i16>, <8 x i16>, <8 x i16> } %ld1x3
3714 define { <8 x i16>, <8 x i16>, <8 x i16> } @test_v8i16_post_reg_ld1x3(ptr %A, ptr %ptr, i64 %inc) {
3715 ; SDAG-LABEL: test_v8i16_post_reg_ld1x3:
3716 ; SDAG:       ; %bb.0:
3717 ; SDAG-NEXT:    lsl x8, x2, #1
3718 ; SDAG-NEXT:    ld1.8h { v0, v1, v2 }, [x0], x8
3719 ; SDAG-NEXT:    str x0, [x1]
3720 ; SDAG-NEXT:    ret
3722 ; CHECK-GISEL-LABEL: test_v8i16_post_reg_ld1x3:
3723 ; CHECK-GISEL:       ; %bb.0:
3724 ; CHECK-GISEL-NEXT:    ld1.8h { v0, v1, v2 }, [x0]
3725 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #1
3726 ; CHECK-GISEL-NEXT:    str x8, [x1]
3727 ; CHECK-GISEL-NEXT:    ret
3728   %ld1x3 = tail call { <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld1x3.v8i16.p0(ptr %A)
3729   %tmp = getelementptr i16, ptr %A, i64 %inc
3730   store ptr %tmp, ptr %ptr
3731   ret { <8 x i16>, <8 x i16>, <8 x i16> } %ld1x3
3734 declare { <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld1x3.v8i16.p0(ptr)
3737 define { <4 x i16>, <4 x i16>, <4 x i16> } @test_v4i16_post_imm_ld1x3(ptr %A, ptr %ptr) {
3738 ; SDAG-LABEL: test_v4i16_post_imm_ld1x3:
3739 ; SDAG:       ; %bb.0:
3740 ; SDAG-NEXT:    ld1.4h { v0, v1, v2 }, [x0], #24
3741 ; SDAG-NEXT:    str x0, [x1]
3742 ; SDAG-NEXT:    ret
3744 ; CHECK-GISEL-LABEL: test_v4i16_post_imm_ld1x3:
3745 ; CHECK-GISEL:       ; %bb.0:
3746 ; CHECK-GISEL-NEXT:    ld1.4h { v0, v1, v2 }, [x0]
3747 ; CHECK-GISEL-NEXT:    add x8, x0, #24
3748 ; CHECK-GISEL-NEXT:    str x8, [x1]
3749 ; CHECK-GISEL-NEXT:    ret
3750   %ld1x3 = tail call { <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld1x3.v4i16.p0(ptr %A)
3751   %tmp = getelementptr i16, ptr %A, i32 12
3752   store ptr %tmp, ptr %ptr
3753   ret { <4 x i16>, <4 x i16>, <4 x i16> } %ld1x3
3756 define { <4 x i16>, <4 x i16>, <4 x i16> } @test_v4i16_post_reg_ld1x3(ptr %A, ptr %ptr, i64 %inc) {
3757 ; SDAG-LABEL: test_v4i16_post_reg_ld1x3:
3758 ; SDAG:       ; %bb.0:
3759 ; SDAG-NEXT:    lsl x8, x2, #1
3760 ; SDAG-NEXT:    ld1.4h { v0, v1, v2 }, [x0], x8
3761 ; SDAG-NEXT:    str x0, [x1]
3762 ; SDAG-NEXT:    ret
3764 ; CHECK-GISEL-LABEL: test_v4i16_post_reg_ld1x3:
3765 ; CHECK-GISEL:       ; %bb.0:
3766 ; CHECK-GISEL-NEXT:    ld1.4h { v0, v1, v2 }, [x0]
3767 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #1
3768 ; CHECK-GISEL-NEXT:    str x8, [x1]
3769 ; CHECK-GISEL-NEXT:    ret
3770   %ld1x3 = tail call { <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld1x3.v4i16.p0(ptr %A)
3771   %tmp = getelementptr i16, ptr %A, i64 %inc
3772   store ptr %tmp, ptr %ptr
3773   ret { <4 x i16>, <4 x i16>, <4 x i16> } %ld1x3
3776 declare { <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld1x3.v4i16.p0(ptr)
3779 define { <4 x i32>, <4 x i32>, <4 x i32> } @test_v4i32_post_imm_ld1x3(ptr %A, ptr %ptr) {
3780 ; SDAG-LABEL: test_v4i32_post_imm_ld1x3:
3781 ; SDAG:       ; %bb.0:
3782 ; SDAG-NEXT:    ld1.4s { v0, v1, v2 }, [x0], #48
3783 ; SDAG-NEXT:    str x0, [x1]
3784 ; SDAG-NEXT:    ret
3786 ; CHECK-GISEL-LABEL: test_v4i32_post_imm_ld1x3:
3787 ; CHECK-GISEL:       ; %bb.0:
3788 ; CHECK-GISEL-NEXT:    ld1.4s { v0, v1, v2 }, [x0]
3789 ; CHECK-GISEL-NEXT:    add x8, x0, #48
3790 ; CHECK-GISEL-NEXT:    str x8, [x1]
3791 ; CHECK-GISEL-NEXT:    ret
3792   %ld1x3 = tail call { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld1x3.v4i32.p0(ptr %A)
3793   %tmp = getelementptr i32, ptr %A, i32 12
3794   store ptr %tmp, ptr %ptr
3795   ret { <4 x i32>, <4 x i32>, <4 x i32> } %ld1x3
3798 define { <4 x i32>, <4 x i32>, <4 x i32> } @test_v4i32_post_reg_ld1x3(ptr %A, ptr %ptr, i64 %inc) {
3799 ; SDAG-LABEL: test_v4i32_post_reg_ld1x3:
3800 ; SDAG:       ; %bb.0:
3801 ; SDAG-NEXT:    lsl x8, x2, #2
3802 ; SDAG-NEXT:    ld1.4s { v0, v1, v2 }, [x0], x8
3803 ; SDAG-NEXT:    str x0, [x1]
3804 ; SDAG-NEXT:    ret
3806 ; CHECK-GISEL-LABEL: test_v4i32_post_reg_ld1x3:
3807 ; CHECK-GISEL:       ; %bb.0:
3808 ; CHECK-GISEL-NEXT:    ld1.4s { v0, v1, v2 }, [x0]
3809 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
3810 ; CHECK-GISEL-NEXT:    str x8, [x1]
3811 ; CHECK-GISEL-NEXT:    ret
3812   %ld1x3 = tail call { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld1x3.v4i32.p0(ptr %A)
3813   %tmp = getelementptr i32, ptr %A, i64 %inc
3814   store ptr %tmp, ptr %ptr
3815   ret { <4 x i32>, <4 x i32>, <4 x i32> } %ld1x3
3818 declare { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld1x3.v4i32.p0(ptr)
3821 define { <2 x i32>, <2 x i32>, <2 x i32> } @test_v2i32_post_imm_ld1x3(ptr %A, ptr %ptr) {
3822 ; SDAG-LABEL: test_v2i32_post_imm_ld1x3:
3823 ; SDAG:       ; %bb.0:
3824 ; SDAG-NEXT:    ld1.2s { v0, v1, v2 }, [x0], #24
3825 ; SDAG-NEXT:    str x0, [x1]
3826 ; SDAG-NEXT:    ret
3828 ; CHECK-GISEL-LABEL: test_v2i32_post_imm_ld1x3:
3829 ; CHECK-GISEL:       ; %bb.0:
3830 ; CHECK-GISEL-NEXT:    ld1.2s { v0, v1, v2 }, [x0]
3831 ; CHECK-GISEL-NEXT:    add x8, x0, #24
3832 ; CHECK-GISEL-NEXT:    str x8, [x1]
3833 ; CHECK-GISEL-NEXT:    ret
3834   %ld1x3 = tail call { <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld1x3.v2i32.p0(ptr %A)
3835   %tmp = getelementptr i32, ptr %A, i32 6
3836   store ptr %tmp, ptr %ptr
3837   ret { <2 x i32>, <2 x i32>, <2 x i32> } %ld1x3
3840 define { <2 x i32>, <2 x i32>, <2 x i32> } @test_v2i32_post_reg_ld1x3(ptr %A, ptr %ptr, i64 %inc) {
3841 ; SDAG-LABEL: test_v2i32_post_reg_ld1x3:
3842 ; SDAG:       ; %bb.0:
3843 ; SDAG-NEXT:    lsl x8, x2, #2
3844 ; SDAG-NEXT:    ld1.2s { v0, v1, v2 }, [x0], x8
3845 ; SDAG-NEXT:    str x0, [x1]
3846 ; SDAG-NEXT:    ret
3848 ; CHECK-GISEL-LABEL: test_v2i32_post_reg_ld1x3:
3849 ; CHECK-GISEL:       ; %bb.0:
3850 ; CHECK-GISEL-NEXT:    ld1.2s { v0, v1, v2 }, [x0]
3851 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
3852 ; CHECK-GISEL-NEXT:    str x8, [x1]
3853 ; CHECK-GISEL-NEXT:    ret
3854   %ld1x3 = tail call { <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld1x3.v2i32.p0(ptr %A)
3855   %tmp = getelementptr i32, ptr %A, i64 %inc
3856   store ptr %tmp, ptr %ptr
3857   ret { <2 x i32>, <2 x i32>, <2 x i32> } %ld1x3
3860 declare { <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld1x3.v2i32.p0(ptr)
3863 define { <2 x i64>, <2 x i64>, <2 x i64> } @test_v2i64_post_imm_ld1x3(ptr %A, ptr %ptr) {
3864 ; SDAG-LABEL: test_v2i64_post_imm_ld1x3:
3865 ; SDAG:       ; %bb.0:
3866 ; SDAG-NEXT:    ld1.2d { v0, v1, v2 }, [x0], #48
3867 ; SDAG-NEXT:    str x0, [x1]
3868 ; SDAG-NEXT:    ret
3870 ; CHECK-GISEL-LABEL: test_v2i64_post_imm_ld1x3:
3871 ; CHECK-GISEL:       ; %bb.0:
3872 ; CHECK-GISEL-NEXT:    ld1.2d { v0, v1, v2 }, [x0]
3873 ; CHECK-GISEL-NEXT:    add x8, x0, #48
3874 ; CHECK-GISEL-NEXT:    str x8, [x1]
3875 ; CHECK-GISEL-NEXT:    ret
3876   %ld1x3 = tail call { <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld1x3.v2i64.p0(ptr %A)
3877   %tmp = getelementptr i64, ptr %A, i32 6
3878   store ptr %tmp, ptr %ptr
3879   ret { <2 x i64>, <2 x i64>, <2 x i64> } %ld1x3
3882 define { <2 x i64>, <2 x i64>, <2 x i64> } @test_v2i64_post_reg_ld1x3(ptr %A, ptr %ptr, i64 %inc) {
3883 ; SDAG-LABEL: test_v2i64_post_reg_ld1x3:
3884 ; SDAG:       ; %bb.0:
3885 ; SDAG-NEXT:    lsl x8, x2, #3
3886 ; SDAG-NEXT:    ld1.2d { v0, v1, v2 }, [x0], x8
3887 ; SDAG-NEXT:    str x0, [x1]
3888 ; SDAG-NEXT:    ret
3890 ; CHECK-GISEL-LABEL: test_v2i64_post_reg_ld1x3:
3891 ; CHECK-GISEL:       ; %bb.0:
3892 ; CHECK-GISEL-NEXT:    ld1.2d { v0, v1, v2 }, [x0]
3893 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
3894 ; CHECK-GISEL-NEXT:    str x8, [x1]
3895 ; CHECK-GISEL-NEXT:    ret
3896   %ld1x3 = tail call { <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld1x3.v2i64.p0(ptr %A)
3897   %tmp = getelementptr i64, ptr %A, i64 %inc
3898   store ptr %tmp, ptr %ptr
3899   ret { <2 x i64>, <2 x i64>, <2 x i64> } %ld1x3
3902 declare { <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld1x3.v2i64.p0(ptr)
3905 define { <1 x i64>, <1 x i64>, <1 x i64> } @test_v1i64_post_imm_ld1x3(ptr %A, ptr %ptr) {
3906 ; SDAG-LABEL: test_v1i64_post_imm_ld1x3:
3907 ; SDAG:       ; %bb.0:
3908 ; SDAG-NEXT:    ld1.1d { v0, v1, v2 }, [x0], #24
3909 ; SDAG-NEXT:    str x0, [x1]
3910 ; SDAG-NEXT:    ret
3912 ; CHECK-GISEL-LABEL: test_v1i64_post_imm_ld1x3:
3913 ; CHECK-GISEL:       ; %bb.0:
3914 ; CHECK-GISEL-NEXT:    ld1.1d { v0, v1, v2 }, [x0]
3915 ; CHECK-GISEL-NEXT:    add x8, x0, #24
3916 ; CHECK-GISEL-NEXT:    str x8, [x1]
3917 ; CHECK-GISEL-NEXT:    ret
3918   %ld1x3 = tail call { <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld1x3.v1i64.p0(ptr %A)
3919   %tmp = getelementptr i64, ptr %A, i32 3
3920   store ptr %tmp, ptr %ptr
3921   ret { <1 x i64>, <1 x i64>, <1 x i64> } %ld1x3
3924 define { <1 x i64>, <1 x i64>, <1 x i64> } @test_v1i64_post_reg_ld1x3(ptr %A, ptr %ptr, i64 %inc) {
3925 ; SDAG-LABEL: test_v1i64_post_reg_ld1x3:
3926 ; SDAG:       ; %bb.0:
3927 ; SDAG-NEXT:    lsl x8, x2, #3
3928 ; SDAG-NEXT:    ld1.1d { v0, v1, v2 }, [x0], x8
3929 ; SDAG-NEXT:    str x0, [x1]
3930 ; SDAG-NEXT:    ret
3932 ; CHECK-GISEL-LABEL: test_v1i64_post_reg_ld1x3:
3933 ; CHECK-GISEL:       ; %bb.0:
3934 ; CHECK-GISEL-NEXT:    ld1.1d { v0, v1, v2 }, [x0]
3935 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
3936 ; CHECK-GISEL-NEXT:    str x8, [x1]
3937 ; CHECK-GISEL-NEXT:    ret
3938   %ld1x3 = tail call { <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld1x3.v1i64.p0(ptr %A)
3939   %tmp = getelementptr i64, ptr %A, i64 %inc
3940   store ptr %tmp, ptr %ptr
3941   ret { <1 x i64>, <1 x i64>, <1 x i64> } %ld1x3
3944 declare { <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld1x3.v1i64.p0(ptr)
3947 define { <4 x float>, <4 x float>, <4 x float> } @test_v4f32_post_imm_ld1x3(ptr %A, ptr %ptr) {
3948 ; SDAG-LABEL: test_v4f32_post_imm_ld1x3:
3949 ; SDAG:       ; %bb.0:
3950 ; SDAG-NEXT:    ld1.4s { v0, v1, v2 }, [x0], #48
3951 ; SDAG-NEXT:    str x0, [x1]
3952 ; SDAG-NEXT:    ret
3954 ; CHECK-GISEL-LABEL: test_v4f32_post_imm_ld1x3:
3955 ; CHECK-GISEL:       ; %bb.0:
3956 ; CHECK-GISEL-NEXT:    ld1.4s { v0, v1, v2 }, [x0]
3957 ; CHECK-GISEL-NEXT:    add x8, x0, #48
3958 ; CHECK-GISEL-NEXT:    str x8, [x1]
3959 ; CHECK-GISEL-NEXT:    ret
3960   %ld1x3 = tail call { <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld1x3.v4f32.p0(ptr %A)
3961   %tmp = getelementptr float, ptr %A, i32 12
3962   store ptr %tmp, ptr %ptr
3963   ret { <4 x float>, <4 x float>, <4 x float> } %ld1x3
3966 define { <4 x float>, <4 x float>, <4 x float> } @test_v4f32_post_reg_ld1x3(ptr %A, ptr %ptr, i64 %inc) {
3967 ; SDAG-LABEL: test_v4f32_post_reg_ld1x3:
3968 ; SDAG:       ; %bb.0:
3969 ; SDAG-NEXT:    lsl x8, x2, #2
3970 ; SDAG-NEXT:    ld1.4s { v0, v1, v2 }, [x0], x8
3971 ; SDAG-NEXT:    str x0, [x1]
3972 ; SDAG-NEXT:    ret
3974 ; CHECK-GISEL-LABEL: test_v4f32_post_reg_ld1x3:
3975 ; CHECK-GISEL:       ; %bb.0:
3976 ; CHECK-GISEL-NEXT:    ld1.4s { v0, v1, v2 }, [x0]
3977 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
3978 ; CHECK-GISEL-NEXT:    str x8, [x1]
3979 ; CHECK-GISEL-NEXT:    ret
3980   %ld1x3 = tail call { <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld1x3.v4f32.p0(ptr %A)
3981   %tmp = getelementptr float, ptr %A, i64 %inc
3982   store ptr %tmp, ptr %ptr
3983   ret { <4 x float>, <4 x float>, <4 x float> } %ld1x3
3986 declare { <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld1x3.v4f32.p0(ptr)
3989 define { <2 x float>, <2 x float>, <2 x float> } @test_v2f32_post_imm_ld1x3(ptr %A, ptr %ptr) {
3990 ; SDAG-LABEL: test_v2f32_post_imm_ld1x3:
3991 ; SDAG:       ; %bb.0:
3992 ; SDAG-NEXT:    ld1.2s { v0, v1, v2 }, [x0], #24
3993 ; SDAG-NEXT:    str x0, [x1]
3994 ; SDAG-NEXT:    ret
3996 ; CHECK-GISEL-LABEL: test_v2f32_post_imm_ld1x3:
3997 ; CHECK-GISEL:       ; %bb.0:
3998 ; CHECK-GISEL-NEXT:    ld1.2s { v0, v1, v2 }, [x0]
3999 ; CHECK-GISEL-NEXT:    add x8, x0, #24
4000 ; CHECK-GISEL-NEXT:    str x8, [x1]
4001 ; CHECK-GISEL-NEXT:    ret
4002   %ld1x3 = tail call { <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld1x3.v2f32.p0(ptr %A)
4003   %tmp = getelementptr float, ptr %A, i32 6
4004   store ptr %tmp, ptr %ptr
4005   ret { <2 x float>, <2 x float>, <2 x float> } %ld1x3
4008 define { <2 x float>, <2 x float>, <2 x float> } @test_v2f32_post_reg_ld1x3(ptr %A, ptr %ptr, i64 %inc) {
4009 ; SDAG-LABEL: test_v2f32_post_reg_ld1x3:
4010 ; SDAG:       ; %bb.0:
4011 ; SDAG-NEXT:    lsl x8, x2, #2
4012 ; SDAG-NEXT:    ld1.2s { v0, v1, v2 }, [x0], x8
4013 ; SDAG-NEXT:    str x0, [x1]
4014 ; SDAG-NEXT:    ret
4016 ; CHECK-GISEL-LABEL: test_v2f32_post_reg_ld1x3:
4017 ; CHECK-GISEL:       ; %bb.0:
4018 ; CHECK-GISEL-NEXT:    ld1.2s { v0, v1, v2 }, [x0]
4019 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
4020 ; CHECK-GISEL-NEXT:    str x8, [x1]
4021 ; CHECK-GISEL-NEXT:    ret
4022   %ld1x3 = tail call { <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld1x3.v2f32.p0(ptr %A)
4023   %tmp = getelementptr float, ptr %A, i64 %inc
4024   store ptr %tmp, ptr %ptr
4025   ret { <2 x float>, <2 x float>, <2 x float> } %ld1x3
4028 declare { <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld1x3.v2f32.p0(ptr)
4031 define { <2 x double>, <2 x double>, <2 x double> } @test_v2f64_post_imm_ld1x3(ptr %A, ptr %ptr) {
4032 ; SDAG-LABEL: test_v2f64_post_imm_ld1x3:
4033 ; SDAG:       ; %bb.0:
4034 ; SDAG-NEXT:    ld1.2d { v0, v1, v2 }, [x0], #48
4035 ; SDAG-NEXT:    str x0, [x1]
4036 ; SDAG-NEXT:    ret
4038 ; CHECK-GISEL-LABEL: test_v2f64_post_imm_ld1x3:
4039 ; CHECK-GISEL:       ; %bb.0:
4040 ; CHECK-GISEL-NEXT:    ld1.2d { v0, v1, v2 }, [x0]
4041 ; CHECK-GISEL-NEXT:    add x8, x0, #48
4042 ; CHECK-GISEL-NEXT:    str x8, [x1]
4043 ; CHECK-GISEL-NEXT:    ret
4044   %ld1x3 = tail call { <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld1x3.v2f64.p0(ptr %A)
4045   %tmp = getelementptr double, ptr %A, i32 6
4046   store ptr %tmp, ptr %ptr
4047   ret { <2 x double>, <2 x double>, <2 x double> } %ld1x3
4050 define { <2 x double>, <2 x double>, <2 x double> } @test_v2f64_post_reg_ld1x3(ptr %A, ptr %ptr, i64 %inc) {
4051 ; SDAG-LABEL: test_v2f64_post_reg_ld1x3:
4052 ; SDAG:       ; %bb.0:
4053 ; SDAG-NEXT:    lsl x8, x2, #3
4054 ; SDAG-NEXT:    ld1.2d { v0, v1, v2 }, [x0], x8
4055 ; SDAG-NEXT:    str x0, [x1]
4056 ; SDAG-NEXT:    ret
4058 ; CHECK-GISEL-LABEL: test_v2f64_post_reg_ld1x3:
4059 ; CHECK-GISEL:       ; %bb.0:
4060 ; CHECK-GISEL-NEXT:    ld1.2d { v0, v1, v2 }, [x0]
4061 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
4062 ; CHECK-GISEL-NEXT:    str x8, [x1]
4063 ; CHECK-GISEL-NEXT:    ret
4064   %ld1x3 = tail call { <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld1x3.v2f64.p0(ptr %A)
4065   %tmp = getelementptr double, ptr %A, i64 %inc
4066   store ptr %tmp, ptr %ptr
4067   ret { <2 x double>, <2 x double>, <2 x double> } %ld1x3
4070 declare { <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld1x3.v2f64.p0(ptr)
4073 define { <1 x double>, <1 x double>, <1 x double> } @test_v1f64_post_imm_ld1x3(ptr %A, ptr %ptr) {
4074 ; SDAG-LABEL: test_v1f64_post_imm_ld1x3:
4075 ; SDAG:       ; %bb.0:
4076 ; SDAG-NEXT:    ld1.1d { v0, v1, v2 }, [x0], #24
4077 ; SDAG-NEXT:    str x0, [x1]
4078 ; SDAG-NEXT:    ret
4080 ; CHECK-GISEL-LABEL: test_v1f64_post_imm_ld1x3:
4081 ; CHECK-GISEL:       ; %bb.0:
4082 ; CHECK-GISEL-NEXT:    ld1.1d { v0, v1, v2 }, [x0]
4083 ; CHECK-GISEL-NEXT:    add x8, x0, #24
4084 ; CHECK-GISEL-NEXT:    str x8, [x1]
4085 ; CHECK-GISEL-NEXT:    ret
4086   %ld1x3 = tail call { <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld1x3.v1f64.p0(ptr %A)
4087   %tmp = getelementptr double, ptr %A, i32 3
4088   store ptr %tmp, ptr %ptr
4089   ret { <1 x double>, <1 x double>, <1 x double> } %ld1x3
4092 define { <1 x double>, <1 x double>, <1 x double> } @test_v1f64_post_reg_ld1x3(ptr %A, ptr %ptr, i64 %inc) {
4093 ; SDAG-LABEL: test_v1f64_post_reg_ld1x3:
4094 ; SDAG:       ; %bb.0:
4095 ; SDAG-NEXT:    lsl x8, x2, #3
4096 ; SDAG-NEXT:    ld1.1d { v0, v1, v2 }, [x0], x8
4097 ; SDAG-NEXT:    str x0, [x1]
4098 ; SDAG-NEXT:    ret
4100 ; CHECK-GISEL-LABEL: test_v1f64_post_reg_ld1x3:
4101 ; CHECK-GISEL:       ; %bb.0:
4102 ; CHECK-GISEL-NEXT:    ld1.1d { v0, v1, v2 }, [x0]
4103 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
4104 ; CHECK-GISEL-NEXT:    str x8, [x1]
4105 ; CHECK-GISEL-NEXT:    ret
4106   %ld1x3 = tail call { <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld1x3.v1f64.p0(ptr %A)
4107   %tmp = getelementptr double, ptr %A, i64 %inc
4108   store ptr %tmp, ptr %ptr
4109   ret { <1 x double>, <1 x double>, <1 x double> } %ld1x3
4112 declare { <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld1x3.v1f64.p0(ptr)
4115 define { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @test_v16i8_post_imm_ld1x4(ptr %A, ptr %ptr) {
4116 ; SDAG-LABEL: test_v16i8_post_imm_ld1x4:
4117 ; SDAG:       ; %bb.0:
4118 ; SDAG-NEXT:    ld1.16b { v0, v1, v2, v3 }, [x0], #64
4119 ; SDAG-NEXT:    str x0, [x1]
4120 ; SDAG-NEXT:    ret
4122 ; CHECK-GISEL-LABEL: test_v16i8_post_imm_ld1x4:
4123 ; CHECK-GISEL:       ; %bb.0:
4124 ; CHECK-GISEL-NEXT:    ld1.16b { v0, v1, v2, v3 }, [x0]
4125 ; CHECK-GISEL-NEXT:    add x8, x0, #64
4126 ; CHECK-GISEL-NEXT:    str x8, [x1]
4127 ; CHECK-GISEL-NEXT:    ret
4128   %ld1x4 = tail call { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld1x4.v16i8.p0(ptr %A)
4129   %tmp = getelementptr i8, ptr %A, i32 64
4130   store ptr %tmp, ptr %ptr
4131   ret { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %ld1x4
4134 define { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @test_v16i8_post_reg_ld1x4(ptr %A, ptr %ptr, i64 %inc) {
4135 ; SDAG-LABEL: test_v16i8_post_reg_ld1x4:
4136 ; SDAG:       ; %bb.0:
4137 ; SDAG-NEXT:    ld1.16b { v0, v1, v2, v3 }, [x0], x2
4138 ; SDAG-NEXT:    str x0, [x1]
4139 ; SDAG-NEXT:    ret
4141 ; CHECK-GISEL-LABEL: test_v16i8_post_reg_ld1x4:
4142 ; CHECK-GISEL:       ; %bb.0:
4143 ; CHECK-GISEL-NEXT:    ld1.16b { v0, v1, v2, v3 }, [x0]
4144 ; CHECK-GISEL-NEXT:    add x8, x0, x2
4145 ; CHECK-GISEL-NEXT:    str x8, [x1]
4146 ; CHECK-GISEL-NEXT:    ret
4147   %ld1x4 = tail call { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld1x4.v16i8.p0(ptr %A)
4148   %tmp = getelementptr i8, ptr %A, i64 %inc
4149   store ptr %tmp, ptr %ptr
4150   ret { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %ld1x4
4153 declare { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld1x4.v16i8.p0(ptr)
4156 define { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @test_v8i8_post_imm_ld1x4(ptr %A, ptr %ptr) {
4157 ; SDAG-LABEL: test_v8i8_post_imm_ld1x4:
4158 ; SDAG:       ; %bb.0:
4159 ; SDAG-NEXT:    ld1.8b { v0, v1, v2, v3 }, [x0], #32
4160 ; SDAG-NEXT:    str x0, [x1]
4161 ; SDAG-NEXT:    ret
4163 ; CHECK-GISEL-LABEL: test_v8i8_post_imm_ld1x4:
4164 ; CHECK-GISEL:       ; %bb.0:
4165 ; CHECK-GISEL-NEXT:    ld1.8b { v0, v1, v2, v3 }, [x0]
4166 ; CHECK-GISEL-NEXT:    add x8, x0, #32
4167 ; CHECK-GISEL-NEXT:    str x8, [x1]
4168 ; CHECK-GISEL-NEXT:    ret
4169   %ld1x4 = tail call { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld1x4.v8i8.p0(ptr %A)
4170   %tmp = getelementptr i8, ptr %A, i32 32
4171   store ptr %tmp, ptr %ptr
4172   ret { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %ld1x4
4175 define { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @test_v8i8_post_reg_ld1x4(ptr %A, ptr %ptr, i64 %inc) {
4176 ; SDAG-LABEL: test_v8i8_post_reg_ld1x4:
4177 ; SDAG:       ; %bb.0:
4178 ; SDAG-NEXT:    ld1.8b { v0, v1, v2, v3 }, [x0], x2
4179 ; SDAG-NEXT:    str x0, [x1]
4180 ; SDAG-NEXT:    ret
4182 ; CHECK-GISEL-LABEL: test_v8i8_post_reg_ld1x4:
4183 ; CHECK-GISEL:       ; %bb.0:
4184 ; CHECK-GISEL-NEXT:    ld1.8b { v0, v1, v2, v3 }, [x0]
4185 ; CHECK-GISEL-NEXT:    add x8, x0, x2
4186 ; CHECK-GISEL-NEXT:    str x8, [x1]
4187 ; CHECK-GISEL-NEXT:    ret
4188   %ld1x4 = tail call { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld1x4.v8i8.p0(ptr %A)
4189   %tmp = getelementptr i8, ptr %A, i64 %inc
4190   store ptr %tmp, ptr %ptr
4191   ret { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %ld1x4
4194 declare { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld1x4.v8i8.p0(ptr)
4197 define { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @test_v8i16_post_imm_ld1x4(ptr %A, ptr %ptr) {
4198 ; SDAG-LABEL: test_v8i16_post_imm_ld1x4:
4199 ; SDAG:       ; %bb.0:
4200 ; SDAG-NEXT:    ld1.8h { v0, v1, v2, v3 }, [x0], #64
4201 ; SDAG-NEXT:    str x0, [x1]
4202 ; SDAG-NEXT:    ret
4204 ; CHECK-GISEL-LABEL: test_v8i16_post_imm_ld1x4:
4205 ; CHECK-GISEL:       ; %bb.0:
4206 ; CHECK-GISEL-NEXT:    ld1.8h { v0, v1, v2, v3 }, [x0]
4207 ; CHECK-GISEL-NEXT:    add x8, x0, #64
4208 ; CHECK-GISEL-NEXT:    str x8, [x1]
4209 ; CHECK-GISEL-NEXT:    ret
4210   %ld1x4 = tail call { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld1x4.v8i16.p0(ptr %A)
4211   %tmp = getelementptr i16, ptr %A, i32 32
4212   store ptr %tmp, ptr %ptr
4213   ret { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %ld1x4
4216 define { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @test_v8i16_post_reg_ld1x4(ptr %A, ptr %ptr, i64 %inc) {
4217 ; SDAG-LABEL: test_v8i16_post_reg_ld1x4:
4218 ; SDAG:       ; %bb.0:
4219 ; SDAG-NEXT:    lsl x8, x2, #1
4220 ; SDAG-NEXT:    ld1.8h { v0, v1, v2, v3 }, [x0], x8
4221 ; SDAG-NEXT:    str x0, [x1]
4222 ; SDAG-NEXT:    ret
4224 ; CHECK-GISEL-LABEL: test_v8i16_post_reg_ld1x4:
4225 ; CHECK-GISEL:       ; %bb.0:
4226 ; CHECK-GISEL-NEXT:    ld1.8h { v0, v1, v2, v3 }, [x0]
4227 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #1
4228 ; CHECK-GISEL-NEXT:    str x8, [x1]
4229 ; CHECK-GISEL-NEXT:    ret
4230   %ld1x4 = tail call { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld1x4.v8i16.p0(ptr %A)
4231   %tmp = getelementptr i16, ptr %A, i64 %inc
4232   store ptr %tmp, ptr %ptr
4233   ret { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %ld1x4
4236 declare { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld1x4.v8i16.p0(ptr)
4239 define { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @test_v4i16_post_imm_ld1x4(ptr %A, ptr %ptr) {
4240 ; SDAG-LABEL: test_v4i16_post_imm_ld1x4:
4241 ; SDAG:       ; %bb.0:
4242 ; SDAG-NEXT:    ld1.4h { v0, v1, v2, v3 }, [x0], #32
4243 ; SDAG-NEXT:    str x0, [x1]
4244 ; SDAG-NEXT:    ret
4246 ; CHECK-GISEL-LABEL: test_v4i16_post_imm_ld1x4:
4247 ; CHECK-GISEL:       ; %bb.0:
4248 ; CHECK-GISEL-NEXT:    ld1.4h { v0, v1, v2, v3 }, [x0]
4249 ; CHECK-GISEL-NEXT:    add x8, x0, #32
4250 ; CHECK-GISEL-NEXT:    str x8, [x1]
4251 ; CHECK-GISEL-NEXT:    ret
4252   %ld1x4 = tail call { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld1x4.v4i16.p0(ptr %A)
4253   %tmp = getelementptr i16, ptr %A, i32 16
4254   store ptr %tmp, ptr %ptr
4255   ret { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %ld1x4
4258 define { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @test_v4i16_post_reg_ld1x4(ptr %A, ptr %ptr, i64 %inc) {
4259 ; SDAG-LABEL: test_v4i16_post_reg_ld1x4:
4260 ; SDAG:       ; %bb.0:
4261 ; SDAG-NEXT:    lsl x8, x2, #1
4262 ; SDAG-NEXT:    ld1.4h { v0, v1, v2, v3 }, [x0], x8
4263 ; SDAG-NEXT:    str x0, [x1]
4264 ; SDAG-NEXT:    ret
4266 ; CHECK-GISEL-LABEL: test_v4i16_post_reg_ld1x4:
4267 ; CHECK-GISEL:       ; %bb.0:
4268 ; CHECK-GISEL-NEXT:    ld1.4h { v0, v1, v2, v3 }, [x0]
4269 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #1
4270 ; CHECK-GISEL-NEXT:    str x8, [x1]
4271 ; CHECK-GISEL-NEXT:    ret
4272   %ld1x4 = tail call { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld1x4.v4i16.p0(ptr %A)
4273   %tmp = getelementptr i16, ptr %A, i64 %inc
4274   store ptr %tmp, ptr %ptr
4275   ret { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %ld1x4
4278 declare { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld1x4.v4i16.p0(ptr)
4281 define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @test_v4i32_post_imm_ld1x4(ptr %A, ptr %ptr) {
4282 ; SDAG-LABEL: test_v4i32_post_imm_ld1x4:
4283 ; SDAG:       ; %bb.0:
4284 ; SDAG-NEXT:    ld1.4s { v0, v1, v2, v3 }, [x0], #64
4285 ; SDAG-NEXT:    str x0, [x1]
4286 ; SDAG-NEXT:    ret
4288 ; CHECK-GISEL-LABEL: test_v4i32_post_imm_ld1x4:
4289 ; CHECK-GISEL:       ; %bb.0:
4290 ; CHECK-GISEL-NEXT:    ld1.4s { v0, v1, v2, v3 }, [x0]
4291 ; CHECK-GISEL-NEXT:    add x8, x0, #64
4292 ; CHECK-GISEL-NEXT:    str x8, [x1]
4293 ; CHECK-GISEL-NEXT:    ret
4294   %ld1x4 = tail call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld1x4.v4i32.p0(ptr %A)
4295   %tmp = getelementptr i32, ptr %A, i32 16
4296   store ptr %tmp, ptr %ptr
4297   ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %ld1x4
4300 define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @test_v4i32_post_reg_ld1x4(ptr %A, ptr %ptr, i64 %inc) {
4301 ; SDAG-LABEL: test_v4i32_post_reg_ld1x4:
4302 ; SDAG:       ; %bb.0:
4303 ; SDAG-NEXT:    lsl x8, x2, #2
4304 ; SDAG-NEXT:    ld1.4s { v0, v1, v2, v3 }, [x0], x8
4305 ; SDAG-NEXT:    str x0, [x1]
4306 ; SDAG-NEXT:    ret
4308 ; CHECK-GISEL-LABEL: test_v4i32_post_reg_ld1x4:
4309 ; CHECK-GISEL:       ; %bb.0:
4310 ; CHECK-GISEL-NEXT:    ld1.4s { v0, v1, v2, v3 }, [x0]
4311 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
4312 ; CHECK-GISEL-NEXT:    str x8, [x1]
4313 ; CHECK-GISEL-NEXT:    ret
4314   %ld1x4 = tail call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld1x4.v4i32.p0(ptr %A)
4315   %tmp = getelementptr i32, ptr %A, i64 %inc
4316   store ptr %tmp, ptr %ptr
4317   ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %ld1x4
4320 declare { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld1x4.v4i32.p0(ptr)
4323 define { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @test_v2i32_post_imm_ld1x4(ptr %A, ptr %ptr) {
4324 ; SDAG-LABEL: test_v2i32_post_imm_ld1x4:
4325 ; SDAG:       ; %bb.0:
4326 ; SDAG-NEXT:    ld1.2s { v0, v1, v2, v3 }, [x0], #32
4327 ; SDAG-NEXT:    str x0, [x1]
4328 ; SDAG-NEXT:    ret
4330 ; CHECK-GISEL-LABEL: test_v2i32_post_imm_ld1x4:
4331 ; CHECK-GISEL:       ; %bb.0:
4332 ; CHECK-GISEL-NEXT:    ld1.2s { v0, v1, v2, v3 }, [x0]
4333 ; CHECK-GISEL-NEXT:    add x8, x0, #32
4334 ; CHECK-GISEL-NEXT:    str x8, [x1]
4335 ; CHECK-GISEL-NEXT:    ret
4336   %ld1x4 = tail call { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld1x4.v2i32.p0(ptr %A)
4337   %tmp = getelementptr i32, ptr %A, i32 8
4338   store ptr %tmp, ptr %ptr
4339   ret { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %ld1x4
4342 define { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @test_v2i32_post_reg_ld1x4(ptr %A, ptr %ptr, i64 %inc) {
4343 ; SDAG-LABEL: test_v2i32_post_reg_ld1x4:
4344 ; SDAG:       ; %bb.0:
4345 ; SDAG-NEXT:    lsl x8, x2, #2
4346 ; SDAG-NEXT:    ld1.2s { v0, v1, v2, v3 }, [x0], x8
4347 ; SDAG-NEXT:    str x0, [x1]
4348 ; SDAG-NEXT:    ret
4350 ; CHECK-GISEL-LABEL: test_v2i32_post_reg_ld1x4:
4351 ; CHECK-GISEL:       ; %bb.0:
4352 ; CHECK-GISEL-NEXT:    ld1.2s { v0, v1, v2, v3 }, [x0]
4353 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
4354 ; CHECK-GISEL-NEXT:    str x8, [x1]
4355 ; CHECK-GISEL-NEXT:    ret
4356   %ld1x4 = tail call { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld1x4.v2i32.p0(ptr %A)
4357   %tmp = getelementptr i32, ptr %A, i64 %inc
4358   store ptr %tmp, ptr %ptr
4359   ret { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %ld1x4
4362 declare { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld1x4.v2i32.p0(ptr)
4365 define { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @test_v2i64_post_imm_ld1x4(ptr %A, ptr %ptr) {
4366 ; SDAG-LABEL: test_v2i64_post_imm_ld1x4:
4367 ; SDAG:       ; %bb.0:
4368 ; SDAG-NEXT:    ld1.2d { v0, v1, v2, v3 }, [x0], #64
4369 ; SDAG-NEXT:    str x0, [x1]
4370 ; SDAG-NEXT:    ret
4372 ; CHECK-GISEL-LABEL: test_v2i64_post_imm_ld1x4:
4373 ; CHECK-GISEL:       ; %bb.0:
4374 ; CHECK-GISEL-NEXT:    ld1.2d { v0, v1, v2, v3 }, [x0]
4375 ; CHECK-GISEL-NEXT:    add x8, x0, #64
4376 ; CHECK-GISEL-NEXT:    str x8, [x1]
4377 ; CHECK-GISEL-NEXT:    ret
4378   %ld1x4 = tail call { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld1x4.v2i64.p0(ptr %A)
4379   %tmp = getelementptr i64, ptr %A, i32 8
4380   store ptr %tmp, ptr %ptr
4381   ret { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %ld1x4
4384 define { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @test_v2i64_post_reg_ld1x4(ptr %A, ptr %ptr, i64 %inc) {
4385 ; SDAG-LABEL: test_v2i64_post_reg_ld1x4:
4386 ; SDAG:       ; %bb.0:
4387 ; SDAG-NEXT:    lsl x8, x2, #3
4388 ; SDAG-NEXT:    ld1.2d { v0, v1, v2, v3 }, [x0], x8
4389 ; SDAG-NEXT:    str x0, [x1]
4390 ; SDAG-NEXT:    ret
4392 ; CHECK-GISEL-LABEL: test_v2i64_post_reg_ld1x4:
4393 ; CHECK-GISEL:       ; %bb.0:
4394 ; CHECK-GISEL-NEXT:    ld1.2d { v0, v1, v2, v3 }, [x0]
4395 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
4396 ; CHECK-GISEL-NEXT:    str x8, [x1]
4397 ; CHECK-GISEL-NEXT:    ret
4398   %ld1x4 = tail call { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld1x4.v2i64.p0(ptr %A)
4399   %tmp = getelementptr i64, ptr %A, i64 %inc
4400   store ptr %tmp, ptr %ptr
4401   ret { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %ld1x4
4404 declare { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld1x4.v2i64.p0(ptr)
4407 define { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @test_v1i64_post_imm_ld1x4(ptr %A, ptr %ptr) {
4408 ; SDAG-LABEL: test_v1i64_post_imm_ld1x4:
4409 ; SDAG:       ; %bb.0:
4410 ; SDAG-NEXT:    ld1.1d { v0, v1, v2, v3 }, [x0], #32
4411 ; SDAG-NEXT:    str x0, [x1]
4412 ; SDAG-NEXT:    ret
4414 ; CHECK-GISEL-LABEL: test_v1i64_post_imm_ld1x4:
4415 ; CHECK-GISEL:       ; %bb.0:
4416 ; CHECK-GISEL-NEXT:    ld1.1d { v0, v1, v2, v3 }, [x0]
4417 ; CHECK-GISEL-NEXT:    add x8, x0, #32
4418 ; CHECK-GISEL-NEXT:    str x8, [x1]
4419 ; CHECK-GISEL-NEXT:    ret
4420   %ld1x4 = tail call { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld1x4.v1i64.p0(ptr %A)
4421   %tmp = getelementptr i64, ptr %A, i32 4
4422   store ptr %tmp, ptr %ptr
4423   ret { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } %ld1x4
4426 define { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @test_v1i64_post_reg_ld1x4(ptr %A, ptr %ptr, i64 %inc) {
4427 ; SDAG-LABEL: test_v1i64_post_reg_ld1x4:
4428 ; SDAG:       ; %bb.0:
4429 ; SDAG-NEXT:    lsl x8, x2, #3
4430 ; SDAG-NEXT:    ld1.1d { v0, v1, v2, v3 }, [x0], x8
4431 ; SDAG-NEXT:    str x0, [x1]
4432 ; SDAG-NEXT:    ret
4434 ; CHECK-GISEL-LABEL: test_v1i64_post_reg_ld1x4:
4435 ; CHECK-GISEL:       ; %bb.0:
4436 ; CHECK-GISEL-NEXT:    ld1.1d { v0, v1, v2, v3 }, [x0]
4437 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
4438 ; CHECK-GISEL-NEXT:    str x8, [x1]
4439 ; CHECK-GISEL-NEXT:    ret
4440   %ld1x4 = tail call { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld1x4.v1i64.p0(ptr %A)
4441   %tmp = getelementptr i64, ptr %A, i64 %inc
4442   store ptr %tmp, ptr %ptr
4443   ret { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } %ld1x4
4446 declare { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld1x4.v1i64.p0(ptr)
4449 define { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @test_v4f32_post_imm_ld1x4(ptr %A, ptr %ptr) {
4450 ; SDAG-LABEL: test_v4f32_post_imm_ld1x4:
4451 ; SDAG:       ; %bb.0:
4452 ; SDAG-NEXT:    ld1.4s { v0, v1, v2, v3 }, [x0], #64
4453 ; SDAG-NEXT:    str x0, [x1]
4454 ; SDAG-NEXT:    ret
4456 ; CHECK-GISEL-LABEL: test_v4f32_post_imm_ld1x4:
4457 ; CHECK-GISEL:       ; %bb.0:
4458 ; CHECK-GISEL-NEXT:    ld1.4s { v0, v1, v2, v3 }, [x0]
4459 ; CHECK-GISEL-NEXT:    add x8, x0, #64
4460 ; CHECK-GISEL-NEXT:    str x8, [x1]
4461 ; CHECK-GISEL-NEXT:    ret
4462   %ld1x4 = tail call { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld1x4.v4f32.p0(ptr %A)
4463   %tmp = getelementptr float, ptr %A, i32 16
4464   store ptr %tmp, ptr %ptr
4465   ret { <4 x float>, <4 x float>, <4 x float>, <4 x float> } %ld1x4
4468 define { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @test_v4f32_post_reg_ld1x4(ptr %A, ptr %ptr, i64 %inc) {
4469 ; SDAG-LABEL: test_v4f32_post_reg_ld1x4:
4470 ; SDAG:       ; %bb.0:
4471 ; SDAG-NEXT:    lsl x8, x2, #2
4472 ; SDAG-NEXT:    ld1.4s { v0, v1, v2, v3 }, [x0], x8
4473 ; SDAG-NEXT:    str x0, [x1]
4474 ; SDAG-NEXT:    ret
4476 ; CHECK-GISEL-LABEL: test_v4f32_post_reg_ld1x4:
4477 ; CHECK-GISEL:       ; %bb.0:
4478 ; CHECK-GISEL-NEXT:    ld1.4s { v0, v1, v2, v3 }, [x0]
4479 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
4480 ; CHECK-GISEL-NEXT:    str x8, [x1]
4481 ; CHECK-GISEL-NEXT:    ret
4482   %ld1x4 = tail call { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld1x4.v4f32.p0(ptr %A)
4483   %tmp = getelementptr float, ptr %A, i64 %inc
4484   store ptr %tmp, ptr %ptr
4485   ret { <4 x float>, <4 x float>, <4 x float>, <4 x float> } %ld1x4
4488 declare { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld1x4.v4f32.p0(ptr)
4491 define { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @test_v2f32_post_imm_ld1x4(ptr %A, ptr %ptr) {
4492 ; SDAG-LABEL: test_v2f32_post_imm_ld1x4:
4493 ; SDAG:       ; %bb.0:
4494 ; SDAG-NEXT:    ld1.2s { v0, v1, v2, v3 }, [x0], #32
4495 ; SDAG-NEXT:    str x0, [x1]
4496 ; SDAG-NEXT:    ret
4498 ; CHECK-GISEL-LABEL: test_v2f32_post_imm_ld1x4:
4499 ; CHECK-GISEL:       ; %bb.0:
4500 ; CHECK-GISEL-NEXT:    ld1.2s { v0, v1, v2, v3 }, [x0]
4501 ; CHECK-GISEL-NEXT:    add x8, x0, #32
4502 ; CHECK-GISEL-NEXT:    str x8, [x1]
4503 ; CHECK-GISEL-NEXT:    ret
4504   %ld1x4 = tail call { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld1x4.v2f32.p0(ptr %A)
4505   %tmp = getelementptr float, ptr %A, i32 8
4506   store ptr %tmp, ptr %ptr
4507   ret { <2 x float>, <2 x float>, <2 x float>, <2 x float> } %ld1x4
4510 define { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @test_v2f32_post_reg_ld1x4(ptr %A, ptr %ptr, i64 %inc) {
4511 ; SDAG-LABEL: test_v2f32_post_reg_ld1x4:
4512 ; SDAG:       ; %bb.0:
4513 ; SDAG-NEXT:    lsl x8, x2, #2
4514 ; SDAG-NEXT:    ld1.2s { v0, v1, v2, v3 }, [x0], x8
4515 ; SDAG-NEXT:    str x0, [x1]
4516 ; SDAG-NEXT:    ret
4518 ; CHECK-GISEL-LABEL: test_v2f32_post_reg_ld1x4:
4519 ; CHECK-GISEL:       ; %bb.0:
4520 ; CHECK-GISEL-NEXT:    ld1.2s { v0, v1, v2, v3 }, [x0]
4521 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
4522 ; CHECK-GISEL-NEXT:    str x8, [x1]
4523 ; CHECK-GISEL-NEXT:    ret
4524   %ld1x4 = tail call { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld1x4.v2f32.p0(ptr %A)
4525   %tmp = getelementptr float, ptr %A, i64 %inc
4526   store ptr %tmp, ptr %ptr
4527   ret { <2 x float>, <2 x float>, <2 x float>, <2 x float> } %ld1x4
4530 declare { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld1x4.v2f32.p0(ptr)
4533 define { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @test_v2f64_post_imm_ld1x4(ptr %A, ptr %ptr) {
4534 ; SDAG-LABEL: test_v2f64_post_imm_ld1x4:
4535 ; SDAG:       ; %bb.0:
4536 ; SDAG-NEXT:    ld1.2d { v0, v1, v2, v3 }, [x0], #64
4537 ; SDAG-NEXT:    str x0, [x1]
4538 ; SDAG-NEXT:    ret
4540 ; CHECK-GISEL-LABEL: test_v2f64_post_imm_ld1x4:
4541 ; CHECK-GISEL:       ; %bb.0:
4542 ; CHECK-GISEL-NEXT:    ld1.2d { v0, v1, v2, v3 }, [x0]
4543 ; CHECK-GISEL-NEXT:    add x8, x0, #64
4544 ; CHECK-GISEL-NEXT:    str x8, [x1]
4545 ; CHECK-GISEL-NEXT:    ret
4546   %ld1x4 = tail call { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld1x4.v2f64.p0(ptr %A)
4547   %tmp = getelementptr double, ptr %A, i32 8
4548   store ptr %tmp, ptr %ptr
4549   ret { <2 x double>, <2 x double>, <2 x double>, <2 x double> } %ld1x4
4552 define { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @test_v2f64_post_reg_ld1x4(ptr %A, ptr %ptr, i64 %inc) {
4553 ; SDAG-LABEL: test_v2f64_post_reg_ld1x4:
4554 ; SDAG:       ; %bb.0:
4555 ; SDAG-NEXT:    lsl x8, x2, #3
4556 ; SDAG-NEXT:    ld1.2d { v0, v1, v2, v3 }, [x0], x8
4557 ; SDAG-NEXT:    str x0, [x1]
4558 ; SDAG-NEXT:    ret
4560 ; CHECK-GISEL-LABEL: test_v2f64_post_reg_ld1x4:
4561 ; CHECK-GISEL:       ; %bb.0:
4562 ; CHECK-GISEL-NEXT:    ld1.2d { v0, v1, v2, v3 }, [x0]
4563 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
4564 ; CHECK-GISEL-NEXT:    str x8, [x1]
4565 ; CHECK-GISEL-NEXT:    ret
4566   %ld1x4 = tail call { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld1x4.v2f64.p0(ptr %A)
4567   %tmp = getelementptr double, ptr %A, i64 %inc
4568   store ptr %tmp, ptr %ptr
4569   ret { <2 x double>, <2 x double>, <2 x double>, <2 x double> } %ld1x4
4572 declare { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld1x4.v2f64.p0(ptr)
4575 define { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @test_v1f64_post_imm_ld1x4(ptr %A, ptr %ptr) {
4576 ; SDAG-LABEL: test_v1f64_post_imm_ld1x4:
4577 ; SDAG:       ; %bb.0:
4578 ; SDAG-NEXT:    ld1.1d { v0, v1, v2, v3 }, [x0], #32
4579 ; SDAG-NEXT:    str x0, [x1]
4580 ; SDAG-NEXT:    ret
4582 ; CHECK-GISEL-LABEL: test_v1f64_post_imm_ld1x4:
4583 ; CHECK-GISEL:       ; %bb.0:
4584 ; CHECK-GISEL-NEXT:    ld1.1d { v0, v1, v2, v3 }, [x0]
4585 ; CHECK-GISEL-NEXT:    add x8, x0, #32
4586 ; CHECK-GISEL-NEXT:    str x8, [x1]
4587 ; CHECK-GISEL-NEXT:    ret
4588   %ld1x4 = tail call { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld1x4.v1f64.p0(ptr %A)
4589   %tmp = getelementptr double, ptr %A, i32 4
4590   store ptr %tmp, ptr %ptr
4591   ret { <1 x double>, <1 x double>, <1 x double>, <1 x double> } %ld1x4
4594 define { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @test_v1f64_post_reg_ld1x4(ptr %A, ptr %ptr, i64 %inc) {
4595 ; SDAG-LABEL: test_v1f64_post_reg_ld1x4:
4596 ; SDAG:       ; %bb.0:
4597 ; SDAG-NEXT:    lsl x8, x2, #3
4598 ; SDAG-NEXT:    ld1.1d { v0, v1, v2, v3 }, [x0], x8
4599 ; SDAG-NEXT:    str x0, [x1]
4600 ; SDAG-NEXT:    ret
4602 ; CHECK-GISEL-LABEL: test_v1f64_post_reg_ld1x4:
4603 ; CHECK-GISEL:       ; %bb.0:
4604 ; CHECK-GISEL-NEXT:    ld1.1d { v0, v1, v2, v3 }, [x0]
4605 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
4606 ; CHECK-GISEL-NEXT:    str x8, [x1]
4607 ; CHECK-GISEL-NEXT:    ret
4608   %ld1x4 = tail call { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld1x4.v1f64.p0(ptr %A)
4609   %tmp = getelementptr double, ptr %A, i64 %inc
4610   store ptr %tmp, ptr %ptr
4611   ret { <1 x double>, <1 x double>, <1 x double>, <1 x double> } %ld1x4
4614 declare { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld1x4.v1f64.p0(ptr)
4617 define { <16 x i8>, <16 x i8> } @test_v16i8_post_imm_ld2r(ptr %A, ptr %ptr) nounwind {
4618 ; SDAG-LABEL: test_v16i8_post_imm_ld2r:
4619 ; SDAG:       ; %bb.0:
4620 ; SDAG-NEXT:    ld2r.16b { v0, v1 }, [x0], #2
4621 ; SDAG-NEXT:    str x0, [x1]
4622 ; SDAG-NEXT:    ret
4624 ; CHECK-GISEL-LABEL: test_v16i8_post_imm_ld2r:
4625 ; CHECK-GISEL:       ; %bb.0:
4626 ; CHECK-GISEL-NEXT:    ld2r.16b { v0, v1 }, [x0]
4627 ; CHECK-GISEL-NEXT:    add x8, x0, #2
4628 ; CHECK-GISEL-NEXT:    str x8, [x1]
4629 ; CHECK-GISEL-NEXT:    ret
4630   %ld2 = call { <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld2r.v16i8.p0(ptr %A)
4631   %tmp = getelementptr i8, ptr %A, i32 2
4632   store ptr %tmp, ptr %ptr
4633   ret { <16 x i8>, <16 x i8> } %ld2
4636 define { <16 x i8>, <16 x i8> } @test_v16i8_post_reg_ld2r(ptr %A, ptr %ptr, i64 %inc) nounwind {
4637 ; SDAG-LABEL: test_v16i8_post_reg_ld2r:
4638 ; SDAG:       ; %bb.0:
4639 ; SDAG-NEXT:    ld2r.16b { v0, v1 }, [x0], x2
4640 ; SDAG-NEXT:    str x0, [x1]
4641 ; SDAG-NEXT:    ret
4643 ; CHECK-GISEL-LABEL: test_v16i8_post_reg_ld2r:
4644 ; CHECK-GISEL:       ; %bb.0:
4645 ; CHECK-GISEL-NEXT:    ld2r.16b { v0, v1 }, [x0]
4646 ; CHECK-GISEL-NEXT:    add x8, x0, x2
4647 ; CHECK-GISEL-NEXT:    str x8, [x1]
4648 ; CHECK-GISEL-NEXT:    ret
4649   %ld2 = call { <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld2r.v16i8.p0(ptr %A)
4650   %tmp = getelementptr i8, ptr %A, i64 %inc
4651   store ptr %tmp, ptr %ptr
4652   ret { <16 x i8>, <16 x i8> } %ld2
4655 declare { <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld2r.v16i8.p0(ptr) nounwind readonly
4658 define { <8 x i8>, <8 x i8> } @test_v8i8_post_imm_ld2r(ptr %A, ptr %ptr) nounwind {
4659 ; SDAG-LABEL: test_v8i8_post_imm_ld2r:
4660 ; SDAG:       ; %bb.0:
4661 ; SDAG-NEXT:    ld2r.8b { v0, v1 }, [x0], #2
4662 ; SDAG-NEXT:    str x0, [x1]
4663 ; SDAG-NEXT:    ret
4665 ; CHECK-GISEL-LABEL: test_v8i8_post_imm_ld2r:
4666 ; CHECK-GISEL:       ; %bb.0:
4667 ; CHECK-GISEL-NEXT:    ld2r.8b { v0, v1 }, [x0]
4668 ; CHECK-GISEL-NEXT:    add x8, x0, #2
4669 ; CHECK-GISEL-NEXT:    str x8, [x1]
4670 ; CHECK-GISEL-NEXT:    ret
4671   %ld2 = call { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld2r.v8i8.p0(ptr %A)
4672   %tmp = getelementptr i8, ptr %A, i32 2
4673   store ptr %tmp, ptr %ptr
4674   ret { <8 x i8>, <8 x i8> } %ld2
4677 define { <8 x i8>, <8 x i8> } @test_v8i8_post_reg_ld2r(ptr %A, ptr %ptr, i64 %inc) nounwind {
4678 ; SDAG-LABEL: test_v8i8_post_reg_ld2r:
4679 ; SDAG:       ; %bb.0:
4680 ; SDAG-NEXT:    ld2r.8b { v0, v1 }, [x0], x2
4681 ; SDAG-NEXT:    str x0, [x1]
4682 ; SDAG-NEXT:    ret
4684 ; CHECK-GISEL-LABEL: test_v8i8_post_reg_ld2r:
4685 ; CHECK-GISEL:       ; %bb.0:
4686 ; CHECK-GISEL-NEXT:    ld2r.8b { v0, v1 }, [x0]
4687 ; CHECK-GISEL-NEXT:    add x8, x0, x2
4688 ; CHECK-GISEL-NEXT:    str x8, [x1]
4689 ; CHECK-GISEL-NEXT:    ret
4690   %ld2 = call { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld2r.v8i8.p0(ptr %A)
4691   %tmp = getelementptr i8, ptr %A, i64 %inc
4692   store ptr %tmp, ptr %ptr
4693   ret { <8 x i8>, <8 x i8> } %ld2
4696 declare { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld2r.v8i8.p0(ptr) nounwind readonly
4699 define { <8 x i16>, <8 x i16> } @test_v8i16_post_imm_ld2r(ptr %A, ptr %ptr) nounwind {
4700 ; SDAG-LABEL: test_v8i16_post_imm_ld2r:
4701 ; SDAG:       ; %bb.0:
4702 ; SDAG-NEXT:    ld2r.8h { v0, v1 }, [x0], #4
4703 ; SDAG-NEXT:    str x0, [x1]
4704 ; SDAG-NEXT:    ret
4706 ; CHECK-GISEL-LABEL: test_v8i16_post_imm_ld2r:
4707 ; CHECK-GISEL:       ; %bb.0:
4708 ; CHECK-GISEL-NEXT:    ld2r.8h { v0, v1 }, [x0]
4709 ; CHECK-GISEL-NEXT:    add x8, x0, #4
4710 ; CHECK-GISEL-NEXT:    str x8, [x1]
4711 ; CHECK-GISEL-NEXT:    ret
4712   %ld2 = call { <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld2r.v8i16.p0(ptr %A)
4713   %tmp = getelementptr i16, ptr %A, i32 2
4714   store ptr %tmp, ptr %ptr
4715   ret { <8 x i16>, <8 x i16> } %ld2
4718 define { <8 x i16>, <8 x i16> } @test_v8i16_post_reg_ld2r(ptr %A, ptr %ptr, i64 %inc) nounwind {
4719 ; SDAG-LABEL: test_v8i16_post_reg_ld2r:
4720 ; SDAG:       ; %bb.0:
4721 ; SDAG-NEXT:    lsl x8, x2, #1
4722 ; SDAG-NEXT:    ld2r.8h { v0, v1 }, [x0], x8
4723 ; SDAG-NEXT:    str x0, [x1]
4724 ; SDAG-NEXT:    ret
4726 ; CHECK-GISEL-LABEL: test_v8i16_post_reg_ld2r:
4727 ; CHECK-GISEL:       ; %bb.0:
4728 ; CHECK-GISEL-NEXT:    ld2r.8h { v0, v1 }, [x0]
4729 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #1
4730 ; CHECK-GISEL-NEXT:    str x8, [x1]
4731 ; CHECK-GISEL-NEXT:    ret
4732   %ld2 = call { <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld2r.v8i16.p0(ptr %A)
4733   %tmp = getelementptr i16, ptr %A, i64 %inc
4734   store ptr %tmp, ptr %ptr
4735   ret { <8 x i16>, <8 x i16> } %ld2
4738 declare { <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld2r.v8i16.p0(ptr) nounwind readonly
4741 define { <4 x i16>, <4 x i16> } @test_v4i16_post_imm_ld2r(ptr %A, ptr %ptr) nounwind {
4742 ; SDAG-LABEL: test_v4i16_post_imm_ld2r:
4743 ; SDAG:       ; %bb.0:
4744 ; SDAG-NEXT:    ld2r.4h { v0, v1 }, [x0], #4
4745 ; SDAG-NEXT:    str x0, [x1]
4746 ; SDAG-NEXT:    ret
4748 ; CHECK-GISEL-LABEL: test_v4i16_post_imm_ld2r:
4749 ; CHECK-GISEL:       ; %bb.0:
4750 ; CHECK-GISEL-NEXT:    ld2r.4h { v0, v1 }, [x0]
4751 ; CHECK-GISEL-NEXT:    add x8, x0, #4
4752 ; CHECK-GISEL-NEXT:    str x8, [x1]
4753 ; CHECK-GISEL-NEXT:    ret
4754   %ld2 = call { <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld2r.v4i16.p0(ptr %A)
4755   %tmp = getelementptr i16, ptr %A, i32 2
4756   store ptr %tmp, ptr %ptr
4757   ret { <4 x i16>, <4 x i16> } %ld2
4760 define { <4 x i16>, <4 x i16> } @test_v4i16_post_reg_ld2r(ptr %A, ptr %ptr, i64 %inc) nounwind {
4761 ; SDAG-LABEL: test_v4i16_post_reg_ld2r:
4762 ; SDAG:       ; %bb.0:
4763 ; SDAG-NEXT:    lsl x8, x2, #1
4764 ; SDAG-NEXT:    ld2r.4h { v0, v1 }, [x0], x8
4765 ; SDAG-NEXT:    str x0, [x1]
4766 ; SDAG-NEXT:    ret
4768 ; CHECK-GISEL-LABEL: test_v4i16_post_reg_ld2r:
4769 ; CHECK-GISEL:       ; %bb.0:
4770 ; CHECK-GISEL-NEXT:    ld2r.4h { v0, v1 }, [x0]
4771 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #1
4772 ; CHECK-GISEL-NEXT:    str x8, [x1]
4773 ; CHECK-GISEL-NEXT:    ret
4774   %ld2 = call { <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld2r.v4i16.p0(ptr %A)
4775   %tmp = getelementptr i16, ptr %A, i64 %inc
4776   store ptr %tmp, ptr %ptr
4777   ret { <4 x i16>, <4 x i16> } %ld2
4780 declare { <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld2r.v4i16.p0(ptr) nounwind readonly
4783 define { <4 x i32>, <4 x i32> } @test_v4i32_post_imm_ld2r(ptr %A, ptr %ptr) nounwind {
4784 ; SDAG-LABEL: test_v4i32_post_imm_ld2r:
4785 ; SDAG:       ; %bb.0:
4786 ; SDAG-NEXT:    ld2r.4s { v0, v1 }, [x0], #8
4787 ; SDAG-NEXT:    str x0, [x1]
4788 ; SDAG-NEXT:    ret
4790 ; CHECK-GISEL-LABEL: test_v4i32_post_imm_ld2r:
4791 ; CHECK-GISEL:       ; %bb.0:
4792 ; CHECK-GISEL-NEXT:    ld2r.4s { v0, v1 }, [x0]
4793 ; CHECK-GISEL-NEXT:    add x8, x0, #8
4794 ; CHECK-GISEL-NEXT:    str x8, [x1]
4795 ; CHECK-GISEL-NEXT:    ret
4796   %ld2 = call { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld2r.v4i32.p0(ptr %A)
4797   %tmp = getelementptr i32, ptr %A, i32 2
4798   store ptr %tmp, ptr %ptr
4799   ret { <4 x i32>, <4 x i32> } %ld2
4802 define { <4 x i32>, <4 x i32> } @test_v4i32_post_reg_ld2r(ptr %A, ptr %ptr, i64 %inc) nounwind {
4803 ; SDAG-LABEL: test_v4i32_post_reg_ld2r:
4804 ; SDAG:       ; %bb.0:
4805 ; SDAG-NEXT:    lsl x8, x2, #2
4806 ; SDAG-NEXT:    ld2r.4s { v0, v1 }, [x0], x8
4807 ; SDAG-NEXT:    str x0, [x1]
4808 ; SDAG-NEXT:    ret
4810 ; CHECK-GISEL-LABEL: test_v4i32_post_reg_ld2r:
4811 ; CHECK-GISEL:       ; %bb.0:
4812 ; CHECK-GISEL-NEXT:    ld2r.4s { v0, v1 }, [x0]
4813 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
4814 ; CHECK-GISEL-NEXT:    str x8, [x1]
4815 ; CHECK-GISEL-NEXT:    ret
4816   %ld2 = call { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld2r.v4i32.p0(ptr %A)
4817   %tmp = getelementptr i32, ptr %A, i64 %inc
4818   store ptr %tmp, ptr %ptr
4819   ret { <4 x i32>, <4 x i32> } %ld2
4822 declare { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld2r.v4i32.p0(ptr) nounwind readonly
4824 define { <2 x i32>, <2 x i32> } @test_v2i32_post_imm_ld2r(ptr %A, ptr %ptr) nounwind {
4825 ; SDAG-LABEL: test_v2i32_post_imm_ld2r:
4826 ; SDAG:       ; %bb.0:
4827 ; SDAG-NEXT:    ld2r.2s { v0, v1 }, [x0], #8
4828 ; SDAG-NEXT:    str x0, [x1]
4829 ; SDAG-NEXT:    ret
4831 ; CHECK-GISEL-LABEL: test_v2i32_post_imm_ld2r:
4832 ; CHECK-GISEL:       ; %bb.0:
4833 ; CHECK-GISEL-NEXT:    ld2r.2s { v0, v1 }, [x0]
4834 ; CHECK-GISEL-NEXT:    add x8, x0, #8
4835 ; CHECK-GISEL-NEXT:    str x8, [x1]
4836 ; CHECK-GISEL-NEXT:    ret
4837   %ld2 = call { <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld2r.v2i32.p0(ptr %A)
4838   %tmp = getelementptr i32, ptr %A, i32 2
4839   store ptr %tmp, ptr %ptr
4840   ret { <2 x i32>, <2 x i32> } %ld2
4843 define { <2 x i32>, <2 x i32> } @test_v2i32_post_reg_ld2r(ptr %A, ptr %ptr, i64 %inc) nounwind {
4844 ; SDAG-LABEL: test_v2i32_post_reg_ld2r:
4845 ; SDAG:       ; %bb.0:
4846 ; SDAG-NEXT:    lsl x8, x2, #2
4847 ; SDAG-NEXT:    ld2r.2s { v0, v1 }, [x0], x8
4848 ; SDAG-NEXT:    str x0, [x1]
4849 ; SDAG-NEXT:    ret
4851 ; CHECK-GISEL-LABEL: test_v2i32_post_reg_ld2r:
4852 ; CHECK-GISEL:       ; %bb.0:
4853 ; CHECK-GISEL-NEXT:    ld2r.2s { v0, v1 }, [x0]
4854 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
4855 ; CHECK-GISEL-NEXT:    str x8, [x1]
4856 ; CHECK-GISEL-NEXT:    ret
4857   %ld2 = call { <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld2r.v2i32.p0(ptr %A)
4858   %tmp = getelementptr i32, ptr %A, i64 %inc
4859   store ptr %tmp, ptr %ptr
4860   ret { <2 x i32>, <2 x i32> } %ld2
4863 declare { <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld2r.v2i32.p0(ptr) nounwind readonly
4866 define { <2 x i64>, <2 x i64> } @test_v2i64_post_imm_ld2r(ptr %A, ptr %ptr) nounwind {
4867 ; SDAG-LABEL: test_v2i64_post_imm_ld2r:
4868 ; SDAG:       ; %bb.0:
4869 ; SDAG-NEXT:    ld2r.2d { v0, v1 }, [x0], #16
4870 ; SDAG-NEXT:    str x0, [x1]
4871 ; SDAG-NEXT:    ret
4873 ; CHECK-GISEL-LABEL: test_v2i64_post_imm_ld2r:
4874 ; CHECK-GISEL:       ; %bb.0:
4875 ; CHECK-GISEL-NEXT:    ld2r.2d { v0, v1 }, [x0]
4876 ; CHECK-GISEL-NEXT:    add x8, x0, #16
4877 ; CHECK-GISEL-NEXT:    str x8, [x1]
4878 ; CHECK-GISEL-NEXT:    ret
4879   %ld2 = call { <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld2r.v2i64.p0(ptr %A)
4880   %tmp = getelementptr i64, ptr %A, i32 2
4881   store ptr %tmp, ptr %ptr
4882   ret { <2 x i64>, <2 x i64> } %ld2
4885 define { <2 x i64>, <2 x i64> } @test_v2i64_post_reg_ld2r(ptr %A, ptr %ptr, i64 %inc) nounwind {
4886 ; SDAG-LABEL: test_v2i64_post_reg_ld2r:
4887 ; SDAG:       ; %bb.0:
4888 ; SDAG-NEXT:    lsl x8, x2, #3
4889 ; SDAG-NEXT:    ld2r.2d { v0, v1 }, [x0], x8
4890 ; SDAG-NEXT:    str x0, [x1]
4891 ; SDAG-NEXT:    ret
4893 ; CHECK-GISEL-LABEL: test_v2i64_post_reg_ld2r:
4894 ; CHECK-GISEL:       ; %bb.0:
4895 ; CHECK-GISEL-NEXT:    ld2r.2d { v0, v1 }, [x0]
4896 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
4897 ; CHECK-GISEL-NEXT:    str x8, [x1]
4898 ; CHECK-GISEL-NEXT:    ret
4899   %ld2 = call { <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld2r.v2i64.p0(ptr %A)
4900   %tmp = getelementptr i64, ptr %A, i64 %inc
4901   store ptr %tmp, ptr %ptr
4902   ret { <2 x i64>, <2 x i64> } %ld2
4905 declare { <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld2r.v2i64.p0(ptr) nounwind readonly
4907 define { <1 x i64>, <1 x i64> } @test_v1i64_post_imm_ld2r(ptr %A, ptr %ptr) nounwind {
4908 ; SDAG-LABEL: test_v1i64_post_imm_ld2r:
4909 ; SDAG:       ; %bb.0:
4910 ; SDAG-NEXT:    ld2r.1d { v0, v1 }, [x0], #16
4911 ; SDAG-NEXT:    str x0, [x1]
4912 ; SDAG-NEXT:    ret
4914 ; CHECK-GISEL-LABEL: test_v1i64_post_imm_ld2r:
4915 ; CHECK-GISEL:       ; %bb.0:
4916 ; CHECK-GISEL-NEXT:    ld2r.1d { v0, v1 }, [x0]
4917 ; CHECK-GISEL-NEXT:    add x8, x0, #16
4918 ; CHECK-GISEL-NEXT:    str x8, [x1]
4919 ; CHECK-GISEL-NEXT:    ret
4920   %ld2 = call { <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld2r.v1i64.p0(ptr %A)
4921   %tmp = getelementptr i64, ptr %A, i32 2
4922   store ptr %tmp, ptr %ptr
4923   ret { <1 x i64>, <1 x i64> } %ld2
4926 define { <1 x i64>, <1 x i64> } @test_v1i64_post_reg_ld2r(ptr %A, ptr %ptr, i64 %inc) nounwind {
4927 ; SDAG-LABEL: test_v1i64_post_reg_ld2r:
4928 ; SDAG:       ; %bb.0:
4929 ; SDAG-NEXT:    lsl x8, x2, #3
4930 ; SDAG-NEXT:    ld2r.1d { v0, v1 }, [x0], x8
4931 ; SDAG-NEXT:    str x0, [x1]
4932 ; SDAG-NEXT:    ret
4934 ; CHECK-GISEL-LABEL: test_v1i64_post_reg_ld2r:
4935 ; CHECK-GISEL:       ; %bb.0:
4936 ; CHECK-GISEL-NEXT:    ld2r.1d { v0, v1 }, [x0]
4937 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
4938 ; CHECK-GISEL-NEXT:    str x8, [x1]
4939 ; CHECK-GISEL-NEXT:    ret
4940   %ld2 = call { <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld2r.v1i64.p0(ptr %A)
4941   %tmp = getelementptr i64, ptr %A, i64 %inc
4942   store ptr %tmp, ptr %ptr
4943   ret { <1 x i64>, <1 x i64> } %ld2
4946 declare { <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld2r.v1i64.p0(ptr) nounwind readonly
4949 define { <4 x float>, <4 x float> } @test_v4f32_post_imm_ld2r(ptr %A, ptr %ptr) nounwind {
4950 ; SDAG-LABEL: test_v4f32_post_imm_ld2r:
4951 ; SDAG:       ; %bb.0:
4952 ; SDAG-NEXT:    ld2r.4s { v0, v1 }, [x0], #8
4953 ; SDAG-NEXT:    str x0, [x1]
4954 ; SDAG-NEXT:    ret
4956 ; CHECK-GISEL-LABEL: test_v4f32_post_imm_ld2r:
4957 ; CHECK-GISEL:       ; %bb.0:
4958 ; CHECK-GISEL-NEXT:    ld2r.4s { v0, v1 }, [x0]
4959 ; CHECK-GISEL-NEXT:    add x8, x0, #8
4960 ; CHECK-GISEL-NEXT:    str x8, [x1]
4961 ; CHECK-GISEL-NEXT:    ret
4962   %ld2 = call { <4 x float>, <4 x float> } @llvm.aarch64.neon.ld2r.v4f32.p0(ptr %A)
4963   %tmp = getelementptr float, ptr %A, i32 2
4964   store ptr %tmp, ptr %ptr
4965   ret { <4 x float>, <4 x float> } %ld2
4968 define { <4 x float>, <4 x float> } @test_v4f32_post_reg_ld2r(ptr %A, ptr %ptr, i64 %inc) nounwind {
4969 ; SDAG-LABEL: test_v4f32_post_reg_ld2r:
4970 ; SDAG:       ; %bb.0:
4971 ; SDAG-NEXT:    lsl x8, x2, #2
4972 ; SDAG-NEXT:    ld2r.4s { v0, v1 }, [x0], x8
4973 ; SDAG-NEXT:    str x0, [x1]
4974 ; SDAG-NEXT:    ret
4976 ; CHECK-GISEL-LABEL: test_v4f32_post_reg_ld2r:
4977 ; CHECK-GISEL:       ; %bb.0:
4978 ; CHECK-GISEL-NEXT:    ld2r.4s { v0, v1 }, [x0]
4979 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
4980 ; CHECK-GISEL-NEXT:    str x8, [x1]
4981 ; CHECK-GISEL-NEXT:    ret
4982   %ld2 = call { <4 x float>, <4 x float> } @llvm.aarch64.neon.ld2r.v4f32.p0(ptr %A)
4983   %tmp = getelementptr float, ptr %A, i64 %inc
4984   store ptr %tmp, ptr %ptr
4985   ret { <4 x float>, <4 x float> } %ld2
4988 declare { <4 x float>, <4 x float> } @llvm.aarch64.neon.ld2r.v4f32.p0(ptr) nounwind readonly
4990 define { <2 x float>, <2 x float> } @test_v2f32_post_imm_ld2r(ptr %A, ptr %ptr) nounwind {
4991 ; SDAG-LABEL: test_v2f32_post_imm_ld2r:
4992 ; SDAG:       ; %bb.0:
4993 ; SDAG-NEXT:    ld2r.2s { v0, v1 }, [x0], #8
4994 ; SDAG-NEXT:    str x0, [x1]
4995 ; SDAG-NEXT:    ret
4997 ; CHECK-GISEL-LABEL: test_v2f32_post_imm_ld2r:
4998 ; CHECK-GISEL:       ; %bb.0:
4999 ; CHECK-GISEL-NEXT:    ld2r.2s { v0, v1 }, [x0]
5000 ; CHECK-GISEL-NEXT:    add x8, x0, #8
5001 ; CHECK-GISEL-NEXT:    str x8, [x1]
5002 ; CHECK-GISEL-NEXT:    ret
5003   %ld2 = call { <2 x float>, <2 x float> } @llvm.aarch64.neon.ld2r.v2f32.p0(ptr %A)
5004   %tmp = getelementptr float, ptr %A, i32 2
5005   store ptr %tmp, ptr %ptr
5006   ret { <2 x float>, <2 x float> } %ld2
5009 define { <2 x float>, <2 x float> } @test_v2f32_post_reg_ld2r(ptr %A, ptr %ptr, i64 %inc) nounwind {
5010 ; SDAG-LABEL: test_v2f32_post_reg_ld2r:
5011 ; SDAG:       ; %bb.0:
5012 ; SDAG-NEXT:    lsl x8, x2, #2
5013 ; SDAG-NEXT:    ld2r.2s { v0, v1 }, [x0], x8
5014 ; SDAG-NEXT:    str x0, [x1]
5015 ; SDAG-NEXT:    ret
5017 ; CHECK-GISEL-LABEL: test_v2f32_post_reg_ld2r:
5018 ; CHECK-GISEL:       ; %bb.0:
5019 ; CHECK-GISEL-NEXT:    ld2r.2s { v0, v1 }, [x0]
5020 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
5021 ; CHECK-GISEL-NEXT:    str x8, [x1]
5022 ; CHECK-GISEL-NEXT:    ret
5023   %ld2 = call { <2 x float>, <2 x float> } @llvm.aarch64.neon.ld2r.v2f32.p0(ptr %A)
5024   %tmp = getelementptr float, ptr %A, i64 %inc
5025   store ptr %tmp, ptr %ptr
5026   ret { <2 x float>, <2 x float> } %ld2
5029 declare { <2 x float>, <2 x float> } @llvm.aarch64.neon.ld2r.v2f32.p0(ptr) nounwind readonly
5032 define { <2 x double>, <2 x double> } @test_v2f64_post_imm_ld2r(ptr %A, ptr %ptr) nounwind {
5033 ; SDAG-LABEL: test_v2f64_post_imm_ld2r:
5034 ; SDAG:       ; %bb.0:
5035 ; SDAG-NEXT:    ld2r.2d { v0, v1 }, [x0], #16
5036 ; SDAG-NEXT:    str x0, [x1]
5037 ; SDAG-NEXT:    ret
5039 ; CHECK-GISEL-LABEL: test_v2f64_post_imm_ld2r:
5040 ; CHECK-GISEL:       ; %bb.0:
5041 ; CHECK-GISEL-NEXT:    ld2r.2d { v0, v1 }, [x0]
5042 ; CHECK-GISEL-NEXT:    add x8, x0, #16
5043 ; CHECK-GISEL-NEXT:    str x8, [x1]
5044 ; CHECK-GISEL-NEXT:    ret
5045   %ld2 = call { <2 x double>, <2 x double> } @llvm.aarch64.neon.ld2r.v2f64.p0(ptr %A)
5046   %tmp = getelementptr double, ptr %A, i32 2
5047   store ptr %tmp, ptr %ptr
5048   ret { <2 x double>, <2 x double> } %ld2
5051 define { <2 x double>, <2 x double> } @test_v2f64_post_reg_ld2r(ptr %A, ptr %ptr, i64 %inc) nounwind {
5052 ; SDAG-LABEL: test_v2f64_post_reg_ld2r:
5053 ; SDAG:       ; %bb.0:
5054 ; SDAG-NEXT:    lsl x8, x2, #3
5055 ; SDAG-NEXT:    ld2r.2d { v0, v1 }, [x0], x8
5056 ; SDAG-NEXT:    str x0, [x1]
5057 ; SDAG-NEXT:    ret
5059 ; CHECK-GISEL-LABEL: test_v2f64_post_reg_ld2r:
5060 ; CHECK-GISEL:       ; %bb.0:
5061 ; CHECK-GISEL-NEXT:    ld2r.2d { v0, v1 }, [x0]
5062 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
5063 ; CHECK-GISEL-NEXT:    str x8, [x1]
5064 ; CHECK-GISEL-NEXT:    ret
5065   %ld2 = call { <2 x double>, <2 x double> } @llvm.aarch64.neon.ld2r.v2f64.p0(ptr %A)
5066   %tmp = getelementptr double, ptr %A, i64 %inc
5067   store ptr %tmp, ptr %ptr
5068   ret { <2 x double>, <2 x double> } %ld2
5071 declare { <2 x double>, <2 x double> } @llvm.aarch64.neon.ld2r.v2f64.p0(ptr) nounwind readonly
5073 define { <1 x double>, <1 x double> } @test_v1f64_post_imm_ld2r(ptr %A, ptr %ptr) nounwind {
5074 ; SDAG-LABEL: test_v1f64_post_imm_ld2r:
5075 ; SDAG:       ; %bb.0:
5076 ; SDAG-NEXT:    ld2r.1d { v0, v1 }, [x0], #16
5077 ; SDAG-NEXT:    str x0, [x1]
5078 ; SDAG-NEXT:    ret
5080 ; CHECK-GISEL-LABEL: test_v1f64_post_imm_ld2r:
5081 ; CHECK-GISEL:       ; %bb.0:
5082 ; CHECK-GISEL-NEXT:    ld2r.1d { v0, v1 }, [x0]
5083 ; CHECK-GISEL-NEXT:    add x8, x0, #16
5084 ; CHECK-GISEL-NEXT:    str x8, [x1]
5085 ; CHECK-GISEL-NEXT:    ret
5086   %ld2 = call { <1 x double>, <1 x double> } @llvm.aarch64.neon.ld2r.v1f64.p0(ptr %A)
5087   %tmp = getelementptr double, ptr %A, i32 2
5088   store ptr %tmp, ptr %ptr
5089   ret { <1 x double>, <1 x double> } %ld2
5092 define { <1 x double>, <1 x double> } @test_v1f64_post_reg_ld2r(ptr %A, ptr %ptr, i64 %inc) nounwind {
5093 ; SDAG-LABEL: test_v1f64_post_reg_ld2r:
5094 ; SDAG:       ; %bb.0:
5095 ; SDAG-NEXT:    lsl x8, x2, #3
5096 ; SDAG-NEXT:    ld2r.1d { v0, v1 }, [x0], x8
5097 ; SDAG-NEXT:    str x0, [x1]
5098 ; SDAG-NEXT:    ret
5100 ; CHECK-GISEL-LABEL: test_v1f64_post_reg_ld2r:
5101 ; CHECK-GISEL:       ; %bb.0:
5102 ; CHECK-GISEL-NEXT:    ld2r.1d { v0, v1 }, [x0]
5103 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
5104 ; CHECK-GISEL-NEXT:    str x8, [x1]
5105 ; CHECK-GISEL-NEXT:    ret
5106   %ld2 = call { <1 x double>, <1 x double> } @llvm.aarch64.neon.ld2r.v1f64.p0(ptr %A)
5107   %tmp = getelementptr double, ptr %A, i64 %inc
5108   store ptr %tmp, ptr %ptr
5109   ret { <1 x double>, <1 x double> } %ld2
5112 declare { <1 x double>, <1 x double> } @llvm.aarch64.neon.ld2r.v1f64.p0(ptr) nounwind readonly
5115 define { <16 x i8>, <16 x i8>, <16 x i8> } @test_v16i8_post_imm_ld3r(ptr %A, ptr %ptr) nounwind {
5116 ; SDAG-LABEL: test_v16i8_post_imm_ld3r:
5117 ; SDAG:       ; %bb.0:
5118 ; SDAG-NEXT:    ld3r.16b { v0, v1, v2 }, [x0], #3
5119 ; SDAG-NEXT:    str x0, [x1]
5120 ; SDAG-NEXT:    ret
5122 ; CHECK-GISEL-LABEL: test_v16i8_post_imm_ld3r:
5123 ; CHECK-GISEL:       ; %bb.0:
5124 ; CHECK-GISEL-NEXT:    ld3r.16b { v0, v1, v2 }, [x0]
5125 ; CHECK-GISEL-NEXT:    add x8, x0, #3
5126 ; CHECK-GISEL-NEXT:    str x8, [x1]
5127 ; CHECK-GISEL-NEXT:    ret
5128   %ld3 = call { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld3r.v16i8.p0(ptr %A)
5129   %tmp = getelementptr i8, ptr %A, i32 3
5130   store ptr %tmp, ptr %ptr
5131   ret { <16 x i8>, <16 x i8>, <16 x i8> } %ld3
5134 define { <16 x i8>, <16 x i8>, <16 x i8> } @test_v16i8_post_reg_ld3r(ptr %A, ptr %ptr, i64 %inc) nounwind {
5135 ; SDAG-LABEL: test_v16i8_post_reg_ld3r:
5136 ; SDAG:       ; %bb.0:
5137 ; SDAG-NEXT:    ld3r.16b { v0, v1, v2 }, [x0], x2
5138 ; SDAG-NEXT:    str x0, [x1]
5139 ; SDAG-NEXT:    ret
5141 ; CHECK-GISEL-LABEL: test_v16i8_post_reg_ld3r:
5142 ; CHECK-GISEL:       ; %bb.0:
5143 ; CHECK-GISEL-NEXT:    ld3r.16b { v0, v1, v2 }, [x0]
5144 ; CHECK-GISEL-NEXT:    add x8, x0, x2
5145 ; CHECK-GISEL-NEXT:    str x8, [x1]
5146 ; CHECK-GISEL-NEXT:    ret
5147   %ld3 = call { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld3r.v16i8.p0(ptr %A)
5148   %tmp = getelementptr i8, ptr %A, i64 %inc
5149   store ptr %tmp, ptr %ptr
5150   ret { <16 x i8>, <16 x i8>, <16 x i8> } %ld3
5153 declare { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld3r.v16i8.p0(ptr) nounwind readonly
5156 define { <8 x i8>, <8 x i8>, <8 x i8> } @test_v8i8_post_imm_ld3r(ptr %A, ptr %ptr) nounwind {
5157 ; SDAG-LABEL: test_v8i8_post_imm_ld3r:
5158 ; SDAG:       ; %bb.0:
5159 ; SDAG-NEXT:    ld3r.8b { v0, v1, v2 }, [x0], #3
5160 ; SDAG-NEXT:    str x0, [x1]
5161 ; SDAG-NEXT:    ret
5163 ; CHECK-GISEL-LABEL: test_v8i8_post_imm_ld3r:
5164 ; CHECK-GISEL:       ; %bb.0:
5165 ; CHECK-GISEL-NEXT:    ld3r.8b { v0, v1, v2 }, [x0]
5166 ; CHECK-GISEL-NEXT:    add x8, x0, #3
5167 ; CHECK-GISEL-NEXT:    str x8, [x1]
5168 ; CHECK-GISEL-NEXT:    ret
5169   %ld3 = call { <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld3r.v8i8.p0(ptr %A)
5170   %tmp = getelementptr i8, ptr %A, i32 3
5171   store ptr %tmp, ptr %ptr
5172   ret { <8 x i8>, <8 x i8>, <8 x i8> } %ld3
5175 define { <8 x i8>, <8 x i8>, <8 x i8> } @test_v8i8_post_reg_ld3r(ptr %A, ptr %ptr, i64 %inc) nounwind {
5176 ; SDAG-LABEL: test_v8i8_post_reg_ld3r:
5177 ; SDAG:       ; %bb.0:
5178 ; SDAG-NEXT:    ld3r.8b { v0, v1, v2 }, [x0], x2
5179 ; SDAG-NEXT:    str x0, [x1]
5180 ; SDAG-NEXT:    ret
5182 ; CHECK-GISEL-LABEL: test_v8i8_post_reg_ld3r:
5183 ; CHECK-GISEL:       ; %bb.0:
5184 ; CHECK-GISEL-NEXT:    ld3r.8b { v0, v1, v2 }, [x0]
5185 ; CHECK-GISEL-NEXT:    add x8, x0, x2
5186 ; CHECK-GISEL-NEXT:    str x8, [x1]
5187 ; CHECK-GISEL-NEXT:    ret
5188   %ld3 = call { <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld3r.v8i8.p0(ptr %A)
5189   %tmp = getelementptr i8, ptr %A, i64 %inc
5190   store ptr %tmp, ptr %ptr
5191   ret { <8 x i8>, <8 x i8>, <8 x i8> } %ld3
5194 declare { <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld3r.v8i8.p0(ptr) nounwind readonly
5197 define { <8 x i16>, <8 x i16>, <8 x i16> } @test_v8i16_post_imm_ld3r(ptr %A, ptr %ptr) nounwind {
5198 ; SDAG-LABEL: test_v8i16_post_imm_ld3r:
5199 ; SDAG:       ; %bb.0:
5200 ; SDAG-NEXT:    ld3r.8h { v0, v1, v2 }, [x0], #6
5201 ; SDAG-NEXT:    str x0, [x1]
5202 ; SDAG-NEXT:    ret
5204 ; CHECK-GISEL-LABEL: test_v8i16_post_imm_ld3r:
5205 ; CHECK-GISEL:       ; %bb.0:
5206 ; CHECK-GISEL-NEXT:    ld3r.8h { v0, v1, v2 }, [x0]
5207 ; CHECK-GISEL-NEXT:    add x8, x0, #6
5208 ; CHECK-GISEL-NEXT:    str x8, [x1]
5209 ; CHECK-GISEL-NEXT:    ret
5210   %ld3 = call { <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld3r.v8i16.p0(ptr %A)
5211   %tmp = getelementptr i16, ptr %A, i32 3
5212   store ptr %tmp, ptr %ptr
5213   ret { <8 x i16>, <8 x i16>, <8 x i16> } %ld3
5216 define { <8 x i16>, <8 x i16>, <8 x i16> } @test_v8i16_post_reg_ld3r(ptr %A, ptr %ptr, i64 %inc) nounwind {
5217 ; SDAG-LABEL: test_v8i16_post_reg_ld3r:
5218 ; SDAG:       ; %bb.0:
5219 ; SDAG-NEXT:    lsl x8, x2, #1
5220 ; SDAG-NEXT:    ld3r.8h { v0, v1, v2 }, [x0], x8
5221 ; SDAG-NEXT:    str x0, [x1]
5222 ; SDAG-NEXT:    ret
5224 ; CHECK-GISEL-LABEL: test_v8i16_post_reg_ld3r:
5225 ; CHECK-GISEL:       ; %bb.0:
5226 ; CHECK-GISEL-NEXT:    ld3r.8h { v0, v1, v2 }, [x0]
5227 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #1
5228 ; CHECK-GISEL-NEXT:    str x8, [x1]
5229 ; CHECK-GISEL-NEXT:    ret
5230   %ld3 = call { <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld3r.v8i16.p0(ptr %A)
5231   %tmp = getelementptr i16, ptr %A, i64 %inc
5232   store ptr %tmp, ptr %ptr
5233   ret { <8 x i16>, <8 x i16>, <8 x i16> } %ld3
5236 declare { <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld3r.v8i16.p0(ptr) nounwind readonly
5239 define { <4 x i16>, <4 x i16>, <4 x i16> } @test_v4i16_post_imm_ld3r(ptr %A, ptr %ptr) nounwind {
5240 ; SDAG-LABEL: test_v4i16_post_imm_ld3r:
5241 ; SDAG:       ; %bb.0:
5242 ; SDAG-NEXT:    ld3r.4h { v0, v1, v2 }, [x0], #6
5243 ; SDAG-NEXT:    str x0, [x1]
5244 ; SDAG-NEXT:    ret
5246 ; CHECK-GISEL-LABEL: test_v4i16_post_imm_ld3r:
5247 ; CHECK-GISEL:       ; %bb.0:
5248 ; CHECK-GISEL-NEXT:    ld3r.4h { v0, v1, v2 }, [x0]
5249 ; CHECK-GISEL-NEXT:    add x8, x0, #6
5250 ; CHECK-GISEL-NEXT:    str x8, [x1]
5251 ; CHECK-GISEL-NEXT:    ret
5252   %ld3 = call { <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld3r.v4i16.p0(ptr %A)
5253   %tmp = getelementptr i16, ptr %A, i32 3
5254   store ptr %tmp, ptr %ptr
5255   ret { <4 x i16>, <4 x i16>, <4 x i16> } %ld3
5258 define { <4 x i16>, <4 x i16>, <4 x i16> } @test_v4i16_post_reg_ld3r(ptr %A, ptr %ptr, i64 %inc) nounwind {
5259 ; SDAG-LABEL: test_v4i16_post_reg_ld3r:
5260 ; SDAG:       ; %bb.0:
5261 ; SDAG-NEXT:    lsl x8, x2, #1
5262 ; SDAG-NEXT:    ld3r.4h { v0, v1, v2 }, [x0], x8
5263 ; SDAG-NEXT:    str x0, [x1]
5264 ; SDAG-NEXT:    ret
5266 ; CHECK-GISEL-LABEL: test_v4i16_post_reg_ld3r:
5267 ; CHECK-GISEL:       ; %bb.0:
5268 ; CHECK-GISEL-NEXT:    ld3r.4h { v0, v1, v2 }, [x0]
5269 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #1
5270 ; CHECK-GISEL-NEXT:    str x8, [x1]
5271 ; CHECK-GISEL-NEXT:    ret
5272   %ld3 = call { <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld3r.v4i16.p0(ptr %A)
5273   %tmp = getelementptr i16, ptr %A, i64 %inc
5274   store ptr %tmp, ptr %ptr
5275   ret { <4 x i16>, <4 x i16>, <4 x i16> } %ld3
5278 declare { <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld3r.v4i16.p0(ptr) nounwind readonly
5281 define { <4 x i32>, <4 x i32>, <4 x i32> } @test_v4i32_post_imm_ld3r(ptr %A, ptr %ptr) nounwind {
5282 ; SDAG-LABEL: test_v4i32_post_imm_ld3r:
5283 ; SDAG:       ; %bb.0:
5284 ; SDAG-NEXT:    ld3r.4s { v0, v1, v2 }, [x0], #12
5285 ; SDAG-NEXT:    str x0, [x1]
5286 ; SDAG-NEXT:    ret
5288 ; CHECK-GISEL-LABEL: test_v4i32_post_imm_ld3r:
5289 ; CHECK-GISEL:       ; %bb.0:
5290 ; CHECK-GISEL-NEXT:    ld3r.4s { v0, v1, v2 }, [x0]
5291 ; CHECK-GISEL-NEXT:    add x8, x0, #12
5292 ; CHECK-GISEL-NEXT:    str x8, [x1]
5293 ; CHECK-GISEL-NEXT:    ret
5294   %ld3 = call { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld3r.v4i32.p0(ptr %A)
5295   %tmp = getelementptr i32, ptr %A, i32 3
5296   store ptr %tmp, ptr %ptr
5297   ret { <4 x i32>, <4 x i32>, <4 x i32> } %ld3
5300 define { <4 x i32>, <4 x i32>, <4 x i32> } @test_v4i32_post_reg_ld3r(ptr %A, ptr %ptr, i64 %inc) nounwind {
5301 ; SDAG-LABEL: test_v4i32_post_reg_ld3r:
5302 ; SDAG:       ; %bb.0:
5303 ; SDAG-NEXT:    lsl x8, x2, #2
5304 ; SDAG-NEXT:    ld3r.4s { v0, v1, v2 }, [x0], x8
5305 ; SDAG-NEXT:    str x0, [x1]
5306 ; SDAG-NEXT:    ret
5308 ; CHECK-GISEL-LABEL: test_v4i32_post_reg_ld3r:
5309 ; CHECK-GISEL:       ; %bb.0:
5310 ; CHECK-GISEL-NEXT:    ld3r.4s { v0, v1, v2 }, [x0]
5311 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
5312 ; CHECK-GISEL-NEXT:    str x8, [x1]
5313 ; CHECK-GISEL-NEXT:    ret
5314   %ld3 = call { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld3r.v4i32.p0(ptr %A)
5315   %tmp = getelementptr i32, ptr %A, i64 %inc
5316   store ptr %tmp, ptr %ptr
5317   ret { <4 x i32>, <4 x i32>, <4 x i32> } %ld3
5320 declare { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld3r.v4i32.p0(ptr) nounwind readonly
5322 define { <2 x i32>, <2 x i32>, <2 x i32> } @test_v2i32_post_imm_ld3r(ptr %A, ptr %ptr) nounwind {
5323 ; SDAG-LABEL: test_v2i32_post_imm_ld3r:
5324 ; SDAG:       ; %bb.0:
5325 ; SDAG-NEXT:    ld3r.2s { v0, v1, v2 }, [x0], #12
5326 ; SDAG-NEXT:    str x0, [x1]
5327 ; SDAG-NEXT:    ret
5329 ; CHECK-GISEL-LABEL: test_v2i32_post_imm_ld3r:
5330 ; CHECK-GISEL:       ; %bb.0:
5331 ; CHECK-GISEL-NEXT:    ld3r.2s { v0, v1, v2 }, [x0]
5332 ; CHECK-GISEL-NEXT:    add x8, x0, #12
5333 ; CHECK-GISEL-NEXT:    str x8, [x1]
5334 ; CHECK-GISEL-NEXT:    ret
5335   %ld3 = call { <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld3r.v2i32.p0(ptr %A)
5336   %tmp = getelementptr i32, ptr %A, i32 3
5337   store ptr %tmp, ptr %ptr
5338   ret { <2 x i32>, <2 x i32>, <2 x i32> } %ld3
5341 define { <2 x i32>, <2 x i32>, <2 x i32> } @test_v2i32_post_reg_ld3r(ptr %A, ptr %ptr, i64 %inc) nounwind {
5342 ; SDAG-LABEL: test_v2i32_post_reg_ld3r:
5343 ; SDAG:       ; %bb.0:
5344 ; SDAG-NEXT:    lsl x8, x2, #2
5345 ; SDAG-NEXT:    ld3r.2s { v0, v1, v2 }, [x0], x8
5346 ; SDAG-NEXT:    str x0, [x1]
5347 ; SDAG-NEXT:    ret
5349 ; CHECK-GISEL-LABEL: test_v2i32_post_reg_ld3r:
5350 ; CHECK-GISEL:       ; %bb.0:
5351 ; CHECK-GISEL-NEXT:    ld3r.2s { v0, v1, v2 }, [x0]
5352 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
5353 ; CHECK-GISEL-NEXT:    str x8, [x1]
5354 ; CHECK-GISEL-NEXT:    ret
5355   %ld3 = call { <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld3r.v2i32.p0(ptr %A)
5356   %tmp = getelementptr i32, ptr %A, i64 %inc
5357   store ptr %tmp, ptr %ptr
5358   ret { <2 x i32>, <2 x i32>, <2 x i32> } %ld3
5361 declare { <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld3r.v2i32.p0(ptr) nounwind readonly
5364 define { <2 x i64>, <2 x i64>, <2 x i64> } @test_v2i64_post_imm_ld3r(ptr %A, ptr %ptr) nounwind {
5365 ; SDAG-LABEL: test_v2i64_post_imm_ld3r:
5366 ; SDAG:       ; %bb.0:
5367 ; SDAG-NEXT:    ld3r.2d { v0, v1, v2 }, [x0], #24
5368 ; SDAG-NEXT:    str x0, [x1]
5369 ; SDAG-NEXT:    ret
5371 ; CHECK-GISEL-LABEL: test_v2i64_post_imm_ld3r:
5372 ; CHECK-GISEL:       ; %bb.0:
5373 ; CHECK-GISEL-NEXT:    ld3r.2d { v0, v1, v2 }, [x0]
5374 ; CHECK-GISEL-NEXT:    add x8, x0, #24
5375 ; CHECK-GISEL-NEXT:    str x8, [x1]
5376 ; CHECK-GISEL-NEXT:    ret
5377   %ld3 = call { <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld3r.v2i64.p0(ptr %A)
5378   %tmp = getelementptr i64, ptr %A, i32 3
5379   store ptr %tmp, ptr %ptr
5380   ret { <2 x i64>, <2 x i64>, <2 x i64> } %ld3
5383 define { <2 x i64>, <2 x i64>, <2 x i64> } @test_v2i64_post_reg_ld3r(ptr %A, ptr %ptr, i64 %inc) nounwind {
5384 ; SDAG-LABEL: test_v2i64_post_reg_ld3r:
5385 ; SDAG:       ; %bb.0:
5386 ; SDAG-NEXT:    lsl x8, x2, #3
5387 ; SDAG-NEXT:    ld3r.2d { v0, v1, v2 }, [x0], x8
5388 ; SDAG-NEXT:    str x0, [x1]
5389 ; SDAG-NEXT:    ret
5391 ; CHECK-GISEL-LABEL: test_v2i64_post_reg_ld3r:
5392 ; CHECK-GISEL:       ; %bb.0:
5393 ; CHECK-GISEL-NEXT:    ld3r.2d { v0, v1, v2 }, [x0]
5394 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
5395 ; CHECK-GISEL-NEXT:    str x8, [x1]
5396 ; CHECK-GISEL-NEXT:    ret
5397   %ld3 = call { <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld3r.v2i64.p0(ptr %A)
5398   %tmp = getelementptr i64, ptr %A, i64 %inc
5399   store ptr %tmp, ptr %ptr
5400   ret { <2 x i64>, <2 x i64>, <2 x i64> } %ld3
5403 declare { <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld3r.v2i64.p0(ptr) nounwind readonly
5405 define { <1 x i64>, <1 x i64>, <1 x i64> } @test_v1i64_post_imm_ld3r(ptr %A, ptr %ptr) nounwind {
5406 ; SDAG-LABEL: test_v1i64_post_imm_ld3r:
5407 ; SDAG:       ; %bb.0:
5408 ; SDAG-NEXT:    ld3r.1d { v0, v1, v2 }, [x0], #24
5409 ; SDAG-NEXT:    str x0, [x1]
5410 ; SDAG-NEXT:    ret
5412 ; CHECK-GISEL-LABEL: test_v1i64_post_imm_ld3r:
5413 ; CHECK-GISEL:       ; %bb.0:
5414 ; CHECK-GISEL-NEXT:    ld3r.1d { v0, v1, v2 }, [x0]
5415 ; CHECK-GISEL-NEXT:    add x8, x0, #24
5416 ; CHECK-GISEL-NEXT:    str x8, [x1]
5417 ; CHECK-GISEL-NEXT:    ret
5418   %ld3 = call { <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld3r.v1i64.p0(ptr %A)
5419   %tmp = getelementptr i64, ptr %A, i32 3
5420   store ptr %tmp, ptr %ptr
5421   ret { <1 x i64>, <1 x i64>, <1 x i64> } %ld3
5424 define { <1 x i64>, <1 x i64>, <1 x i64> } @test_v1i64_post_reg_ld3r(ptr %A, ptr %ptr, i64 %inc) nounwind {
5425 ; SDAG-LABEL: test_v1i64_post_reg_ld3r:
5426 ; SDAG:       ; %bb.0:
5427 ; SDAG-NEXT:    lsl x8, x2, #3
5428 ; SDAG-NEXT:    ld3r.1d { v0, v1, v2 }, [x0], x8
5429 ; SDAG-NEXT:    str x0, [x1]
5430 ; SDAG-NEXT:    ret
5432 ; CHECK-GISEL-LABEL: test_v1i64_post_reg_ld3r:
5433 ; CHECK-GISEL:       ; %bb.0:
5434 ; CHECK-GISEL-NEXT:    ld3r.1d { v0, v1, v2 }, [x0]
5435 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
5436 ; CHECK-GISEL-NEXT:    str x8, [x1]
5437 ; CHECK-GISEL-NEXT:    ret
5438   %ld3 = call { <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld3r.v1i64.p0(ptr %A)
5439   %tmp = getelementptr i64, ptr %A, i64 %inc
5440   store ptr %tmp, ptr %ptr
5441   ret { <1 x i64>, <1 x i64>, <1 x i64> } %ld3
5444 declare { <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld3r.v1i64.p0(ptr) nounwind readonly
5447 define { <4 x float>, <4 x float>, <4 x float> } @test_v4f32_post_imm_ld3r(ptr %A, ptr %ptr) nounwind {
5448 ; SDAG-LABEL: test_v4f32_post_imm_ld3r:
5449 ; SDAG:       ; %bb.0:
5450 ; SDAG-NEXT:    ld3r.4s { v0, v1, v2 }, [x0], #12
5451 ; SDAG-NEXT:    str x0, [x1]
5452 ; SDAG-NEXT:    ret
5454 ; CHECK-GISEL-LABEL: test_v4f32_post_imm_ld3r:
5455 ; CHECK-GISEL:       ; %bb.0:
5456 ; CHECK-GISEL-NEXT:    ld3r.4s { v0, v1, v2 }, [x0]
5457 ; CHECK-GISEL-NEXT:    add x8, x0, #12
5458 ; CHECK-GISEL-NEXT:    str x8, [x1]
5459 ; CHECK-GISEL-NEXT:    ret
5460   %ld3 = call { <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld3r.v4f32.p0(ptr %A)
5461   %tmp = getelementptr float, ptr %A, i32 3
5462   store ptr %tmp, ptr %ptr
5463   ret { <4 x float>, <4 x float>, <4 x float> } %ld3
5466 define { <4 x float>, <4 x float>, <4 x float> } @test_v4f32_post_reg_ld3r(ptr %A, ptr %ptr, i64 %inc) nounwind {
5467 ; SDAG-LABEL: test_v4f32_post_reg_ld3r:
5468 ; SDAG:       ; %bb.0:
5469 ; SDAG-NEXT:    lsl x8, x2, #2
5470 ; SDAG-NEXT:    ld3r.4s { v0, v1, v2 }, [x0], x8
5471 ; SDAG-NEXT:    str x0, [x1]
5472 ; SDAG-NEXT:    ret
5474 ; CHECK-GISEL-LABEL: test_v4f32_post_reg_ld3r:
5475 ; CHECK-GISEL:       ; %bb.0:
5476 ; CHECK-GISEL-NEXT:    ld3r.4s { v0, v1, v2 }, [x0]
5477 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
5478 ; CHECK-GISEL-NEXT:    str x8, [x1]
5479 ; CHECK-GISEL-NEXT:    ret
5480   %ld3 = call { <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld3r.v4f32.p0(ptr %A)
5481   %tmp = getelementptr float, ptr %A, i64 %inc
5482   store ptr %tmp, ptr %ptr
5483   ret { <4 x float>, <4 x float>, <4 x float> } %ld3
5486 declare { <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld3r.v4f32.p0(ptr) nounwind readonly
5488 define { <2 x float>, <2 x float>, <2 x float> } @test_v2f32_post_imm_ld3r(ptr %A, ptr %ptr) nounwind {
5489 ; SDAG-LABEL: test_v2f32_post_imm_ld3r:
5490 ; SDAG:       ; %bb.0:
5491 ; SDAG-NEXT:    ld3r.2s { v0, v1, v2 }, [x0], #12
5492 ; SDAG-NEXT:    str x0, [x1]
5493 ; SDAG-NEXT:    ret
5495 ; CHECK-GISEL-LABEL: test_v2f32_post_imm_ld3r:
5496 ; CHECK-GISEL:       ; %bb.0:
5497 ; CHECK-GISEL-NEXT:    ld3r.2s { v0, v1, v2 }, [x0]
5498 ; CHECK-GISEL-NEXT:    add x8, x0, #12
5499 ; CHECK-GISEL-NEXT:    str x8, [x1]
5500 ; CHECK-GISEL-NEXT:    ret
5501   %ld3 = call { <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld3r.v2f32.p0(ptr %A)
5502   %tmp = getelementptr float, ptr %A, i32 3
5503   store ptr %tmp, ptr %ptr
5504   ret { <2 x float>, <2 x float>, <2 x float> } %ld3
5507 define { <2 x float>, <2 x float>, <2 x float> } @test_v2f32_post_reg_ld3r(ptr %A, ptr %ptr, i64 %inc) nounwind {
5508 ; SDAG-LABEL: test_v2f32_post_reg_ld3r:
5509 ; SDAG:       ; %bb.0:
5510 ; SDAG-NEXT:    lsl x8, x2, #2
5511 ; SDAG-NEXT:    ld3r.2s { v0, v1, v2 }, [x0], x8
5512 ; SDAG-NEXT:    str x0, [x1]
5513 ; SDAG-NEXT:    ret
5515 ; CHECK-GISEL-LABEL: test_v2f32_post_reg_ld3r:
5516 ; CHECK-GISEL:       ; %bb.0:
5517 ; CHECK-GISEL-NEXT:    ld3r.2s { v0, v1, v2 }, [x0]
5518 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
5519 ; CHECK-GISEL-NEXT:    str x8, [x1]
5520 ; CHECK-GISEL-NEXT:    ret
5521   %ld3 = call { <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld3r.v2f32.p0(ptr %A)
5522   %tmp = getelementptr float, ptr %A, i64 %inc
5523   store ptr %tmp, ptr %ptr
5524   ret { <2 x float>, <2 x float>, <2 x float> } %ld3
5527 declare { <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld3r.v2f32.p0(ptr) nounwind readonly
5530 define { <2 x double>, <2 x double>, <2 x double> } @test_v2f64_post_imm_ld3r(ptr %A, ptr %ptr) nounwind {
5531 ; SDAG-LABEL: test_v2f64_post_imm_ld3r:
5532 ; SDAG:       ; %bb.0:
5533 ; SDAG-NEXT:    ld3r.2d { v0, v1, v2 }, [x0], #24
5534 ; SDAG-NEXT:    str x0, [x1]
5535 ; SDAG-NEXT:    ret
5537 ; CHECK-GISEL-LABEL: test_v2f64_post_imm_ld3r:
5538 ; CHECK-GISEL:       ; %bb.0:
5539 ; CHECK-GISEL-NEXT:    ld3r.2d { v0, v1, v2 }, [x0]
5540 ; CHECK-GISEL-NEXT:    add x8, x0, #24
5541 ; CHECK-GISEL-NEXT:    str x8, [x1]
5542 ; CHECK-GISEL-NEXT:    ret
5543   %ld3 = call { <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld3r.v2f64.p0(ptr %A)
5544   %tmp = getelementptr double, ptr %A, i32 3
5545   store ptr %tmp, ptr %ptr
5546   ret { <2 x double>, <2 x double>, <2 x double> } %ld3
5549 define { <2 x double>, <2 x double>, <2 x double> } @test_v2f64_post_reg_ld3r(ptr %A, ptr %ptr, i64 %inc) nounwind {
5550 ; SDAG-LABEL: test_v2f64_post_reg_ld3r:
5551 ; SDAG:       ; %bb.0:
5552 ; SDAG-NEXT:    lsl x8, x2, #3
5553 ; SDAG-NEXT:    ld3r.2d { v0, v1, v2 }, [x0], x8
5554 ; SDAG-NEXT:    str x0, [x1]
5555 ; SDAG-NEXT:    ret
5557 ; CHECK-GISEL-LABEL: test_v2f64_post_reg_ld3r:
5558 ; CHECK-GISEL:       ; %bb.0:
5559 ; CHECK-GISEL-NEXT:    ld3r.2d { v0, v1, v2 }, [x0]
5560 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
5561 ; CHECK-GISEL-NEXT:    str x8, [x1]
5562 ; CHECK-GISEL-NEXT:    ret
5563   %ld3 = call { <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld3r.v2f64.p0(ptr %A)
5564   %tmp = getelementptr double, ptr %A, i64 %inc
5565   store ptr %tmp, ptr %ptr
5566   ret { <2 x double>, <2 x double>, <2 x double> } %ld3
5569 declare { <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld3r.v2f64.p0(ptr) nounwind readonly
5571 define { <1 x double>, <1 x double>, <1 x double> } @test_v1f64_post_imm_ld3r(ptr %A, ptr %ptr) nounwind {
5572 ; SDAG-LABEL: test_v1f64_post_imm_ld3r:
5573 ; SDAG:       ; %bb.0:
5574 ; SDAG-NEXT:    ld3r.1d { v0, v1, v2 }, [x0], #24
5575 ; SDAG-NEXT:    str x0, [x1]
5576 ; SDAG-NEXT:    ret
5578 ; CHECK-GISEL-LABEL: test_v1f64_post_imm_ld3r:
5579 ; CHECK-GISEL:       ; %bb.0:
5580 ; CHECK-GISEL-NEXT:    ld3r.1d { v0, v1, v2 }, [x0]
5581 ; CHECK-GISEL-NEXT:    add x8, x0, #24
5582 ; CHECK-GISEL-NEXT:    str x8, [x1]
5583 ; CHECK-GISEL-NEXT:    ret
5584   %ld3 = call { <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld3r.v1f64.p0(ptr %A)
5585   %tmp = getelementptr double, ptr %A, i32 3
5586   store ptr %tmp, ptr %ptr
5587   ret { <1 x double>, <1 x double>, <1 x double> } %ld3
5590 define { <1 x double>, <1 x double>, <1 x double> } @test_v1f64_post_reg_ld3r(ptr %A, ptr %ptr, i64 %inc) nounwind {
5591 ; SDAG-LABEL: test_v1f64_post_reg_ld3r:
5592 ; SDAG:       ; %bb.0:
5593 ; SDAG-NEXT:    lsl x8, x2, #3
5594 ; SDAG-NEXT:    ld3r.1d { v0, v1, v2 }, [x0], x8
5595 ; SDAG-NEXT:    str x0, [x1]
5596 ; SDAG-NEXT:    ret
5598 ; CHECK-GISEL-LABEL: test_v1f64_post_reg_ld3r:
5599 ; CHECK-GISEL:       ; %bb.0:
5600 ; CHECK-GISEL-NEXT:    ld3r.1d { v0, v1, v2 }, [x0]
5601 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
5602 ; CHECK-GISEL-NEXT:    str x8, [x1]
5603 ; CHECK-GISEL-NEXT:    ret
5604   %ld3 = call { <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld3r.v1f64.p0(ptr %A)
5605   %tmp = getelementptr double, ptr %A, i64 %inc
5606   store ptr %tmp, ptr %ptr
5607   ret { <1 x double>, <1 x double>, <1 x double> } %ld3
5610 declare { <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld3r.v1f64.p0(ptr) nounwind readonly
5613 define { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @test_v16i8_post_imm_ld4r(ptr %A, ptr %ptr) nounwind {
5614 ; SDAG-LABEL: test_v16i8_post_imm_ld4r:
5615 ; SDAG:       ; %bb.0:
5616 ; SDAG-NEXT:    ld4r.16b { v0, v1, v2, v3 }, [x0], #4
5617 ; SDAG-NEXT:    str x0, [x1]
5618 ; SDAG-NEXT:    ret
5620 ; CHECK-GISEL-LABEL: test_v16i8_post_imm_ld4r:
5621 ; CHECK-GISEL:       ; %bb.0:
5622 ; CHECK-GISEL-NEXT:    ld4r.16b { v0, v1, v2, v3 }, [x0]
5623 ; CHECK-GISEL-NEXT:    add x8, x0, #4
5624 ; CHECK-GISEL-NEXT:    str x8, [x1]
5625 ; CHECK-GISEL-NEXT:    ret
5626   %ld4 = call { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld4r.v16i8.p0(ptr %A)
5627   %tmp = getelementptr i8, ptr %A, i32 4
5628   store ptr %tmp, ptr %ptr
5629   ret { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %ld4
5632 define { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @test_v16i8_post_reg_ld4r(ptr %A, ptr %ptr, i64 %inc) nounwind {
5633 ; SDAG-LABEL: test_v16i8_post_reg_ld4r:
5634 ; SDAG:       ; %bb.0:
5635 ; SDAG-NEXT:    ld4r.16b { v0, v1, v2, v3 }, [x0], x2
5636 ; SDAG-NEXT:    str x0, [x1]
5637 ; SDAG-NEXT:    ret
5639 ; CHECK-GISEL-LABEL: test_v16i8_post_reg_ld4r:
5640 ; CHECK-GISEL:       ; %bb.0:
5641 ; CHECK-GISEL-NEXT:    ld4r.16b { v0, v1, v2, v3 }, [x0]
5642 ; CHECK-GISEL-NEXT:    add x8, x0, x2
5643 ; CHECK-GISEL-NEXT:    str x8, [x1]
5644 ; CHECK-GISEL-NEXT:    ret
5645   %ld4 = call { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld4r.v16i8.p0(ptr %A)
5646   %tmp = getelementptr i8, ptr %A, i64 %inc
5647   store ptr %tmp, ptr %ptr
5648   ret { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %ld4
5651 declare { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld4r.v16i8.p0(ptr) nounwind readonly
5654 define { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @test_v8i8_post_imm_ld4r(ptr %A, ptr %ptr) nounwind {
5655 ; SDAG-LABEL: test_v8i8_post_imm_ld4r:
5656 ; SDAG:       ; %bb.0:
5657 ; SDAG-NEXT:    ld4r.8b { v0, v1, v2, v3 }, [x0], #4
5658 ; SDAG-NEXT:    str x0, [x1]
5659 ; SDAG-NEXT:    ret
5661 ; CHECK-GISEL-LABEL: test_v8i8_post_imm_ld4r:
5662 ; CHECK-GISEL:       ; %bb.0:
5663 ; CHECK-GISEL-NEXT:    ld4r.8b { v0, v1, v2, v3 }, [x0]
5664 ; CHECK-GISEL-NEXT:    add x8, x0, #4
5665 ; CHECK-GISEL-NEXT:    str x8, [x1]
5666 ; CHECK-GISEL-NEXT:    ret
5667   %ld4 = call { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld4r.v8i8.p0(ptr %A)
5668   %tmp = getelementptr i8, ptr %A, i32 4
5669   store ptr %tmp, ptr %ptr
5670   ret { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %ld4
5673 define { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @test_v8i8_post_reg_ld4r(ptr %A, ptr %ptr, i64 %inc) nounwind {
5674 ; SDAG-LABEL: test_v8i8_post_reg_ld4r:
5675 ; SDAG:       ; %bb.0:
5676 ; SDAG-NEXT:    ld4r.8b { v0, v1, v2, v3 }, [x0], x2
5677 ; SDAG-NEXT:    str x0, [x1]
5678 ; SDAG-NEXT:    ret
5680 ; CHECK-GISEL-LABEL: test_v8i8_post_reg_ld4r:
5681 ; CHECK-GISEL:       ; %bb.0:
5682 ; CHECK-GISEL-NEXT:    ld4r.8b { v0, v1, v2, v3 }, [x0]
5683 ; CHECK-GISEL-NEXT:    add x8, x0, x2
5684 ; CHECK-GISEL-NEXT:    str x8, [x1]
5685 ; CHECK-GISEL-NEXT:    ret
5686   %ld4 = call { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld4r.v8i8.p0(ptr %A)
5687   %tmp = getelementptr i8, ptr %A, i64 %inc
5688   store ptr %tmp, ptr %ptr
5689   ret { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %ld4
5692 declare { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld4r.v8i8.p0(ptr) nounwind readonly
5695 define { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @test_v8i16_post_imm_ld4r(ptr %A, ptr %ptr) nounwind {
5696 ; SDAG-LABEL: test_v8i16_post_imm_ld4r:
5697 ; SDAG:       ; %bb.0:
5698 ; SDAG-NEXT:    ld4r.8h { v0, v1, v2, v3 }, [x0], #8
5699 ; SDAG-NEXT:    str x0, [x1]
5700 ; SDAG-NEXT:    ret
5702 ; CHECK-GISEL-LABEL: test_v8i16_post_imm_ld4r:
5703 ; CHECK-GISEL:       ; %bb.0:
5704 ; CHECK-GISEL-NEXT:    ld4r.8h { v0, v1, v2, v3 }, [x0]
5705 ; CHECK-GISEL-NEXT:    add x8, x0, #8
5706 ; CHECK-GISEL-NEXT:    str x8, [x1]
5707 ; CHECK-GISEL-NEXT:    ret
5708   %ld4 = call { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld4r.v8i16.p0(ptr %A)
5709   %tmp = getelementptr i16, ptr %A, i32 4
5710   store ptr %tmp, ptr %ptr
5711   ret { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %ld4
5714 define { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @test_v8i16_post_reg_ld4r(ptr %A, ptr %ptr, i64 %inc) nounwind {
5715 ; SDAG-LABEL: test_v8i16_post_reg_ld4r:
5716 ; SDAG:       ; %bb.0:
5717 ; SDAG-NEXT:    lsl x8, x2, #1
5718 ; SDAG-NEXT:    ld4r.8h { v0, v1, v2, v3 }, [x0], x8
5719 ; SDAG-NEXT:    str x0, [x1]
5720 ; SDAG-NEXT:    ret
5722 ; CHECK-GISEL-LABEL: test_v8i16_post_reg_ld4r:
5723 ; CHECK-GISEL:       ; %bb.0:
5724 ; CHECK-GISEL-NEXT:    ld4r.8h { v0, v1, v2, v3 }, [x0]
5725 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #1
5726 ; CHECK-GISEL-NEXT:    str x8, [x1]
5727 ; CHECK-GISEL-NEXT:    ret
5728   %ld4 = call { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld4r.v8i16.p0(ptr %A)
5729   %tmp = getelementptr i16, ptr %A, i64 %inc
5730   store ptr %tmp, ptr %ptr
5731   ret { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %ld4
5734 declare { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld4r.v8i16.p0(ptr) nounwind readonly
5737 define { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @test_v4i16_post_imm_ld4r(ptr %A, ptr %ptr) nounwind {
5738 ; SDAG-LABEL: test_v4i16_post_imm_ld4r:
5739 ; SDAG:       ; %bb.0:
5740 ; SDAG-NEXT:    ld4r.4h { v0, v1, v2, v3 }, [x0], #8
5741 ; SDAG-NEXT:    str x0, [x1]
5742 ; SDAG-NEXT:    ret
5744 ; CHECK-GISEL-LABEL: test_v4i16_post_imm_ld4r:
5745 ; CHECK-GISEL:       ; %bb.0:
5746 ; CHECK-GISEL-NEXT:    ld4r.4h { v0, v1, v2, v3 }, [x0]
5747 ; CHECK-GISEL-NEXT:    add x8, x0, #8
5748 ; CHECK-GISEL-NEXT:    str x8, [x1]
5749 ; CHECK-GISEL-NEXT:    ret
5750   %ld4 = call { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld4r.v4i16.p0(ptr %A)
5751   %tmp = getelementptr i16, ptr %A, i32 4
5752   store ptr %tmp, ptr %ptr
5753   ret { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %ld4
5756 define { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @test_v4i16_post_reg_ld4r(ptr %A, ptr %ptr, i64 %inc) nounwind {
5757 ; SDAG-LABEL: test_v4i16_post_reg_ld4r:
5758 ; SDAG:       ; %bb.0:
5759 ; SDAG-NEXT:    lsl x8, x2, #1
5760 ; SDAG-NEXT:    ld4r.4h { v0, v1, v2, v3 }, [x0], x8
5761 ; SDAG-NEXT:    str x0, [x1]
5762 ; SDAG-NEXT:    ret
5764 ; CHECK-GISEL-LABEL: test_v4i16_post_reg_ld4r:
5765 ; CHECK-GISEL:       ; %bb.0:
5766 ; CHECK-GISEL-NEXT:    ld4r.4h { v0, v1, v2, v3 }, [x0]
5767 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #1
5768 ; CHECK-GISEL-NEXT:    str x8, [x1]
5769 ; CHECK-GISEL-NEXT:    ret
5770   %ld4 = call { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld4r.v4i16.p0(ptr %A)
5771   %tmp = getelementptr i16, ptr %A, i64 %inc
5772   store ptr %tmp, ptr %ptr
5773   ret { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %ld4
5776 declare { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld4r.v4i16.p0(ptr) nounwind readonly
5779 define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @test_v4i32_post_imm_ld4r(ptr %A, ptr %ptr) nounwind {
5780 ; SDAG-LABEL: test_v4i32_post_imm_ld4r:
5781 ; SDAG:       ; %bb.0:
5782 ; SDAG-NEXT:    ld4r.4s { v0, v1, v2, v3 }, [x0], #16
5783 ; SDAG-NEXT:    str x0, [x1]
5784 ; SDAG-NEXT:    ret
5786 ; CHECK-GISEL-LABEL: test_v4i32_post_imm_ld4r:
5787 ; CHECK-GISEL:       ; %bb.0:
5788 ; CHECK-GISEL-NEXT:    ld4r.4s { v0, v1, v2, v3 }, [x0]
5789 ; CHECK-GISEL-NEXT:    add x8, x0, #16
5790 ; CHECK-GISEL-NEXT:    str x8, [x1]
5791 ; CHECK-GISEL-NEXT:    ret
5792   %ld4 = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld4r.v4i32.p0(ptr %A)
5793   %tmp = getelementptr i32, ptr %A, i32 4
5794   store ptr %tmp, ptr %ptr
5795   ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %ld4
5798 define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @test_v4i32_post_reg_ld4r(ptr %A, ptr %ptr, i64 %inc) nounwind {
5799 ; SDAG-LABEL: test_v4i32_post_reg_ld4r:
5800 ; SDAG:       ; %bb.0:
5801 ; SDAG-NEXT:    lsl x8, x2, #2
5802 ; SDAG-NEXT:    ld4r.4s { v0, v1, v2, v3 }, [x0], x8
5803 ; SDAG-NEXT:    str x0, [x1]
5804 ; SDAG-NEXT:    ret
5806 ; CHECK-GISEL-LABEL: test_v4i32_post_reg_ld4r:
5807 ; CHECK-GISEL:       ; %bb.0:
5808 ; CHECK-GISEL-NEXT:    ld4r.4s { v0, v1, v2, v3 }, [x0]
5809 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
5810 ; CHECK-GISEL-NEXT:    str x8, [x1]
5811 ; CHECK-GISEL-NEXT:    ret
5812   %ld4 = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld4r.v4i32.p0(ptr %A)
5813   %tmp = getelementptr i32, ptr %A, i64 %inc
5814   store ptr %tmp, ptr %ptr
5815   ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %ld4
5818 declare { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld4r.v4i32.p0(ptr) nounwind readonly
5820 define { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @test_v2i32_post_imm_ld4r(ptr %A, ptr %ptr) nounwind {
5821 ; SDAG-LABEL: test_v2i32_post_imm_ld4r:
5822 ; SDAG:       ; %bb.0:
5823 ; SDAG-NEXT:    ld4r.2s { v0, v1, v2, v3 }, [x0], #16
5824 ; SDAG-NEXT:    str x0, [x1]
5825 ; SDAG-NEXT:    ret
5827 ; CHECK-GISEL-LABEL: test_v2i32_post_imm_ld4r:
5828 ; CHECK-GISEL:       ; %bb.0:
5829 ; CHECK-GISEL-NEXT:    ld4r.2s { v0, v1, v2, v3 }, [x0]
5830 ; CHECK-GISEL-NEXT:    add x8, x0, #16
5831 ; CHECK-GISEL-NEXT:    str x8, [x1]
5832 ; CHECK-GISEL-NEXT:    ret
5833   %ld4 = call { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld4r.v2i32.p0(ptr %A)
5834   %tmp = getelementptr i32, ptr %A, i32 4
5835   store ptr %tmp, ptr %ptr
5836   ret { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %ld4
5839 define { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @test_v2i32_post_reg_ld4r(ptr %A, ptr %ptr, i64 %inc) nounwind {
5840 ; SDAG-LABEL: test_v2i32_post_reg_ld4r:
5841 ; SDAG:       ; %bb.0:
5842 ; SDAG-NEXT:    lsl x8, x2, #2
5843 ; SDAG-NEXT:    ld4r.2s { v0, v1, v2, v3 }, [x0], x8
5844 ; SDAG-NEXT:    str x0, [x1]
5845 ; SDAG-NEXT:    ret
5847 ; CHECK-GISEL-LABEL: test_v2i32_post_reg_ld4r:
5848 ; CHECK-GISEL:       ; %bb.0:
5849 ; CHECK-GISEL-NEXT:    ld4r.2s { v0, v1, v2, v3 }, [x0]
5850 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
5851 ; CHECK-GISEL-NEXT:    str x8, [x1]
5852 ; CHECK-GISEL-NEXT:    ret
5853   %ld4 = call { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld4r.v2i32.p0(ptr %A)
5854   %tmp = getelementptr i32, ptr %A, i64 %inc
5855   store ptr %tmp, ptr %ptr
5856   ret { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %ld4
5859 declare { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld4r.v2i32.p0(ptr) nounwind readonly
5862 define { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @test_v2i64_post_imm_ld4r(ptr %A, ptr %ptr) nounwind {
5863 ; SDAG-LABEL: test_v2i64_post_imm_ld4r:
5864 ; SDAG:       ; %bb.0:
5865 ; SDAG-NEXT:    ld4r.2d { v0, v1, v2, v3 }, [x0], #32
5866 ; SDAG-NEXT:    str x0, [x1]
5867 ; SDAG-NEXT:    ret
5869 ; CHECK-GISEL-LABEL: test_v2i64_post_imm_ld4r:
5870 ; CHECK-GISEL:       ; %bb.0:
5871 ; CHECK-GISEL-NEXT:    ld4r.2d { v0, v1, v2, v3 }, [x0]
5872 ; CHECK-GISEL-NEXT:    add x8, x0, #32
5873 ; CHECK-GISEL-NEXT:    str x8, [x1]
5874 ; CHECK-GISEL-NEXT:    ret
5875   %ld4 = call { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld4r.v2i64.p0(ptr %A)
5876   %tmp = getelementptr i64, ptr %A, i32 4
5877   store ptr %tmp, ptr %ptr
5878   ret { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %ld4
5881 define { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @test_v2i64_post_reg_ld4r(ptr %A, ptr %ptr, i64 %inc) nounwind {
5882 ; SDAG-LABEL: test_v2i64_post_reg_ld4r:
5883 ; SDAG:       ; %bb.0:
5884 ; SDAG-NEXT:    lsl x8, x2, #3
5885 ; SDAG-NEXT:    ld4r.2d { v0, v1, v2, v3 }, [x0], x8
5886 ; SDAG-NEXT:    str x0, [x1]
5887 ; SDAG-NEXT:    ret
5889 ; CHECK-GISEL-LABEL: test_v2i64_post_reg_ld4r:
5890 ; CHECK-GISEL:       ; %bb.0:
5891 ; CHECK-GISEL-NEXT:    ld4r.2d { v0, v1, v2, v3 }, [x0]
5892 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
5893 ; CHECK-GISEL-NEXT:    str x8, [x1]
5894 ; CHECK-GISEL-NEXT:    ret
5895   %ld4 = call { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld4r.v2i64.p0(ptr %A)
5896   %tmp = getelementptr i64, ptr %A, i64 %inc
5897   store ptr %tmp, ptr %ptr
5898   ret { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %ld4
5901 declare { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld4r.v2i64.p0(ptr) nounwind readonly
5903 define { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @test_v1i64_post_imm_ld4r(ptr %A, ptr %ptr) nounwind {
5904 ; SDAG-LABEL: test_v1i64_post_imm_ld4r:
5905 ; SDAG:       ; %bb.0:
5906 ; SDAG-NEXT:    ld4r.1d { v0, v1, v2, v3 }, [x0], #32
5907 ; SDAG-NEXT:    str x0, [x1]
5908 ; SDAG-NEXT:    ret
5910 ; CHECK-GISEL-LABEL: test_v1i64_post_imm_ld4r:
5911 ; CHECK-GISEL:       ; %bb.0:
5912 ; CHECK-GISEL-NEXT:    ld4r.1d { v0, v1, v2, v3 }, [x0]
5913 ; CHECK-GISEL-NEXT:    add x8, x0, #32
5914 ; CHECK-GISEL-NEXT:    str x8, [x1]
5915 ; CHECK-GISEL-NEXT:    ret
5916   %ld4 = call { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld4r.v1i64.p0(ptr %A)
5917   %tmp = getelementptr i64, ptr %A, i32 4
5918   store ptr %tmp, ptr %ptr
5919   ret { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } %ld4
5922 define { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @test_v1i64_post_reg_ld4r(ptr %A, ptr %ptr, i64 %inc) nounwind {
5923 ; SDAG-LABEL: test_v1i64_post_reg_ld4r:
5924 ; SDAG:       ; %bb.0:
5925 ; SDAG-NEXT:    lsl x8, x2, #3
5926 ; SDAG-NEXT:    ld4r.1d { v0, v1, v2, v3 }, [x0], x8
5927 ; SDAG-NEXT:    str x0, [x1]
5928 ; SDAG-NEXT:    ret
5930 ; CHECK-GISEL-LABEL: test_v1i64_post_reg_ld4r:
5931 ; CHECK-GISEL:       ; %bb.0:
5932 ; CHECK-GISEL-NEXT:    ld4r.1d { v0, v1, v2, v3 }, [x0]
5933 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
5934 ; CHECK-GISEL-NEXT:    str x8, [x1]
5935 ; CHECK-GISEL-NEXT:    ret
5936   %ld4 = call { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld4r.v1i64.p0(ptr %A)
5937   %tmp = getelementptr i64, ptr %A, i64 %inc
5938   store ptr %tmp, ptr %ptr
5939   ret { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } %ld4
5942 declare { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld4r.v1i64.p0(ptr) nounwind readonly
5945 define { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @test_v4f32_post_imm_ld4r(ptr %A, ptr %ptr) nounwind {
5946 ; SDAG-LABEL: test_v4f32_post_imm_ld4r:
5947 ; SDAG:       ; %bb.0:
5948 ; SDAG-NEXT:    ld4r.4s { v0, v1, v2, v3 }, [x0], #16
5949 ; SDAG-NEXT:    str x0, [x1]
5950 ; SDAG-NEXT:    ret
5952 ; CHECK-GISEL-LABEL: test_v4f32_post_imm_ld4r:
5953 ; CHECK-GISEL:       ; %bb.0:
5954 ; CHECK-GISEL-NEXT:    ld4r.4s { v0, v1, v2, v3 }, [x0]
5955 ; CHECK-GISEL-NEXT:    add x8, x0, #16
5956 ; CHECK-GISEL-NEXT:    str x8, [x1]
5957 ; CHECK-GISEL-NEXT:    ret
5958   %ld4 = call { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld4r.v4f32.p0(ptr %A)
5959   %tmp = getelementptr float, ptr %A, i32 4
5960   store ptr %tmp, ptr %ptr
5961   ret { <4 x float>, <4 x float>, <4 x float>, <4 x float> } %ld4
5964 define { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @test_v4f32_post_reg_ld4r(ptr %A, ptr %ptr, i64 %inc) nounwind {
5965 ; SDAG-LABEL: test_v4f32_post_reg_ld4r:
5966 ; SDAG:       ; %bb.0:
5967 ; SDAG-NEXT:    lsl x8, x2, #2
5968 ; SDAG-NEXT:    ld4r.4s { v0, v1, v2, v3 }, [x0], x8
5969 ; SDAG-NEXT:    str x0, [x1]
5970 ; SDAG-NEXT:    ret
5972 ; CHECK-GISEL-LABEL: test_v4f32_post_reg_ld4r:
5973 ; CHECK-GISEL:       ; %bb.0:
5974 ; CHECK-GISEL-NEXT:    ld4r.4s { v0, v1, v2, v3 }, [x0]
5975 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
5976 ; CHECK-GISEL-NEXT:    str x8, [x1]
5977 ; CHECK-GISEL-NEXT:    ret
5978   %ld4 = call { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld4r.v4f32.p0(ptr %A)
5979   %tmp = getelementptr float, ptr %A, i64 %inc
5980   store ptr %tmp, ptr %ptr
5981   ret { <4 x float>, <4 x float>, <4 x float>, <4 x float> } %ld4
5984 declare { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld4r.v4f32.p0(ptr) nounwind readonly
5986 define { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @test_v2f32_post_imm_ld4r(ptr %A, ptr %ptr) nounwind {
5987 ; SDAG-LABEL: test_v2f32_post_imm_ld4r:
5988 ; SDAG:       ; %bb.0:
5989 ; SDAG-NEXT:    ld4r.2s { v0, v1, v2, v3 }, [x0], #16
5990 ; SDAG-NEXT:    str x0, [x1]
5991 ; SDAG-NEXT:    ret
5993 ; CHECK-GISEL-LABEL: test_v2f32_post_imm_ld4r:
5994 ; CHECK-GISEL:       ; %bb.0:
5995 ; CHECK-GISEL-NEXT:    ld4r.2s { v0, v1, v2, v3 }, [x0]
5996 ; CHECK-GISEL-NEXT:    add x8, x0, #16
5997 ; CHECK-GISEL-NEXT:    str x8, [x1]
5998 ; CHECK-GISEL-NEXT:    ret
5999   %ld4 = call { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld4r.v2f32.p0(ptr %A)
6000   %tmp = getelementptr float, ptr %A, i32 4
6001   store ptr %tmp, ptr %ptr
6002   ret { <2 x float>, <2 x float>, <2 x float>, <2 x float> } %ld4
6005 define { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @test_v2f32_post_reg_ld4r(ptr %A, ptr %ptr, i64 %inc) nounwind {
6006 ; SDAG-LABEL: test_v2f32_post_reg_ld4r:
6007 ; SDAG:       ; %bb.0:
6008 ; SDAG-NEXT:    lsl x8, x2, #2
6009 ; SDAG-NEXT:    ld4r.2s { v0, v1, v2, v3 }, [x0], x8
6010 ; SDAG-NEXT:    str x0, [x1]
6011 ; SDAG-NEXT:    ret
6013 ; CHECK-GISEL-LABEL: test_v2f32_post_reg_ld4r:
6014 ; CHECK-GISEL:       ; %bb.0:
6015 ; CHECK-GISEL-NEXT:    ld4r.2s { v0, v1, v2, v3 }, [x0]
6016 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
6017 ; CHECK-GISEL-NEXT:    str x8, [x1]
6018 ; CHECK-GISEL-NEXT:    ret
6019   %ld4 = call { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld4r.v2f32.p0(ptr %A)
6020   %tmp = getelementptr float, ptr %A, i64 %inc
6021   store ptr %tmp, ptr %ptr
6022   ret { <2 x float>, <2 x float>, <2 x float>, <2 x float> } %ld4
6025 declare { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld4r.v2f32.p0(ptr) nounwind readonly
6028 define { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @test_v2f64_post_imm_ld4r(ptr %A, ptr %ptr) nounwind {
6029 ; SDAG-LABEL: test_v2f64_post_imm_ld4r:
6030 ; SDAG:       ; %bb.0:
6031 ; SDAG-NEXT:    ld4r.2d { v0, v1, v2, v3 }, [x0], #32
6032 ; SDAG-NEXT:    str x0, [x1]
6033 ; SDAG-NEXT:    ret
6035 ; CHECK-GISEL-LABEL: test_v2f64_post_imm_ld4r:
6036 ; CHECK-GISEL:       ; %bb.0:
6037 ; CHECK-GISEL-NEXT:    ld4r.2d { v0, v1, v2, v3 }, [x0]
6038 ; CHECK-GISEL-NEXT:    add x8, x0, #32
6039 ; CHECK-GISEL-NEXT:    str x8, [x1]
6040 ; CHECK-GISEL-NEXT:    ret
6041   %ld4 = call { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld4r.v2f64.p0(ptr %A)
6042   %tmp = getelementptr double, ptr %A, i32 4
6043   store ptr %tmp, ptr %ptr
6044   ret { <2 x double>, <2 x double>, <2 x double>, <2 x double> } %ld4
6047 define { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @test_v2f64_post_reg_ld4r(ptr %A, ptr %ptr, i64 %inc) nounwind {
6048 ; SDAG-LABEL: test_v2f64_post_reg_ld4r:
6049 ; SDAG:       ; %bb.0:
6050 ; SDAG-NEXT:    lsl x8, x2, #3
6051 ; SDAG-NEXT:    ld4r.2d { v0, v1, v2, v3 }, [x0], x8
6052 ; SDAG-NEXT:    str x0, [x1]
6053 ; SDAG-NEXT:    ret
6055 ; CHECK-GISEL-LABEL: test_v2f64_post_reg_ld4r:
6056 ; CHECK-GISEL:       ; %bb.0:
6057 ; CHECK-GISEL-NEXT:    ld4r.2d { v0, v1, v2, v3 }, [x0]
6058 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
6059 ; CHECK-GISEL-NEXT:    str x8, [x1]
6060 ; CHECK-GISEL-NEXT:    ret
6061   %ld4 = call { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld4r.v2f64.p0(ptr %A)
6062   %tmp = getelementptr double, ptr %A, i64 %inc
6063   store ptr %tmp, ptr %ptr
6064   ret { <2 x double>, <2 x double>, <2 x double>, <2 x double> } %ld4
6067 declare { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld4r.v2f64.p0(ptr) nounwind readonly
6069 define { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @test_v1f64_post_imm_ld4r(ptr %A, ptr %ptr) nounwind {
6070 ; SDAG-LABEL: test_v1f64_post_imm_ld4r:
6071 ; SDAG:       ; %bb.0:
6072 ; SDAG-NEXT:    ld4r.1d { v0, v1, v2, v3 }, [x0], #32
6073 ; SDAG-NEXT:    str x0, [x1]
6074 ; SDAG-NEXT:    ret
6076 ; CHECK-GISEL-LABEL: test_v1f64_post_imm_ld4r:
6077 ; CHECK-GISEL:       ; %bb.0:
6078 ; CHECK-GISEL-NEXT:    ld4r.1d { v0, v1, v2, v3 }, [x0]
6079 ; CHECK-GISEL-NEXT:    add x8, x0, #32
6080 ; CHECK-GISEL-NEXT:    str x8, [x1]
6081 ; CHECK-GISEL-NEXT:    ret
6082   %ld4 = call { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld4r.v1f64.p0(ptr %A)
6083   %tmp = getelementptr double, ptr %A, i32 4
6084   store ptr %tmp, ptr %ptr
6085   ret { <1 x double>, <1 x double>, <1 x double>, <1 x double> } %ld4
6088 define { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @test_v1f64_post_reg_ld4r(ptr %A, ptr %ptr, i64 %inc) nounwind {
6089 ; SDAG-LABEL: test_v1f64_post_reg_ld4r:
6090 ; SDAG:       ; %bb.0:
6091 ; SDAG-NEXT:    lsl x8, x2, #3
6092 ; SDAG-NEXT:    ld4r.1d { v0, v1, v2, v3 }, [x0], x8
6093 ; SDAG-NEXT:    str x0, [x1]
6094 ; SDAG-NEXT:    ret
6096 ; CHECK-GISEL-LABEL: test_v1f64_post_reg_ld4r:
6097 ; CHECK-GISEL:       ; %bb.0:
6098 ; CHECK-GISEL-NEXT:    ld4r.1d { v0, v1, v2, v3 }, [x0]
6099 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
6100 ; CHECK-GISEL-NEXT:    str x8, [x1]
6101 ; CHECK-GISEL-NEXT:    ret
6102   %ld4 = call { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld4r.v1f64.p0(ptr %A)
6103   %tmp = getelementptr double, ptr %A, i64 %inc
6104   store ptr %tmp, ptr %ptr
6105   ret { <1 x double>, <1 x double>, <1 x double>, <1 x double> } %ld4
6108 declare { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld4r.v1f64.p0(ptr) nounwind readonly
6111 define { <16 x i8>, <16 x i8> } @test_v16i8_post_imm_ld2lane(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C) nounwind {
6112 ; SDAG-LABEL: test_v16i8_post_imm_ld2lane:
6113 ; SDAG:       ; %bb.0:
6114 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6115 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6116 ; SDAG-NEXT:    ld2.b { v0, v1 }[0], [x0], #2
6117 ; SDAG-NEXT:    str x0, [x1]
6118 ; SDAG-NEXT:    ret
6120 ; CHECK-GISEL-LABEL: test_v16i8_post_imm_ld2lane:
6121 ; CHECK-GISEL:       ; %bb.0:
6122 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6123 ; CHECK-GISEL-NEXT:    add x8, x0, #2
6124 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6125 ; CHECK-GISEL-NEXT:    ld2.b { v0, v1 }[0], [x0]
6126 ; CHECK-GISEL-NEXT:    str x8, [x1]
6127 ; CHECK-GISEL-NEXT:    ret
6128   %ld2 = call { <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld2lane.v16i8.p0(<16 x i8> %B, <16 x i8> %C, i64 0, ptr %A)
6129   %tmp = getelementptr i8, ptr %A, i32 2
6130   store ptr %tmp, ptr %ptr
6131   ret { <16 x i8>, <16 x i8> } %ld2
6134 define { <16 x i8>, <16 x i8> } @test_v16i8_post_reg_ld2lane(ptr %A, ptr %ptr, i64 %inc, <16 x i8> %B, <16 x i8> %C) nounwind {
6135 ; SDAG-LABEL: test_v16i8_post_reg_ld2lane:
6136 ; SDAG:       ; %bb.0:
6137 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6138 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6139 ; SDAG-NEXT:    ld2.b { v0, v1 }[0], [x0], x2
6140 ; SDAG-NEXT:    str x0, [x1]
6141 ; SDAG-NEXT:    ret
6143 ; CHECK-GISEL-LABEL: test_v16i8_post_reg_ld2lane:
6144 ; CHECK-GISEL:       ; %bb.0:
6145 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6146 ; CHECK-GISEL-NEXT:    add x8, x0, x2
6147 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6148 ; CHECK-GISEL-NEXT:    ld2.b { v0, v1 }[0], [x0]
6149 ; CHECK-GISEL-NEXT:    str x8, [x1]
6150 ; CHECK-GISEL-NEXT:    ret
6151   %ld2 = call { <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld2lane.v16i8.p0(<16 x i8> %B, <16 x i8> %C, i64 0, ptr %A)
6152   %tmp = getelementptr i8, ptr %A, i64 %inc
6153   store ptr %tmp, ptr %ptr
6154   ret { <16 x i8>, <16 x i8> } %ld2
6157 declare { <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld2lane.v16i8.p0(<16 x i8>, <16 x i8>, i64, ptr) nounwind readonly
6160 define { <8 x i8>, <8 x i8> } @test_v8i8_post_imm_ld2lane(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C) nounwind {
6161 ; SDAG-LABEL: test_v8i8_post_imm_ld2lane:
6162 ; SDAG:       ; %bb.0:
6163 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
6164 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
6165 ; SDAG-NEXT:    ld2.b { v0, v1 }[0], [x0], #2
6166 ; SDAG-NEXT:    str x0, [x1]
6167 ; SDAG-NEXT:    ret
6169 ; CHECK-GISEL-LABEL: test_v8i8_post_imm_ld2lane:
6170 ; CHECK-GISEL:       ; %bb.0:
6171 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
6172 ; CHECK-GISEL-NEXT:    add x8, x0, #2
6173 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
6174 ; CHECK-GISEL-NEXT:    ld2.b { v0, v1 }[0], [x0]
6175 ; CHECK-GISEL-NEXT:    str x8, [x1]
6176 ; CHECK-GISEL-NEXT:    ret
6177   %ld2 = call { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld2lane.v8i8.p0(<8 x i8> %B, <8 x i8> %C, i64 0, ptr %A)
6178   %tmp = getelementptr i8, ptr %A, i32 2
6179   store ptr %tmp, ptr %ptr
6180   ret { <8 x i8>, <8 x i8> } %ld2
6183 define { <8 x i8>, <8 x i8> } @test_v8i8_post_reg_ld2lane(ptr %A, ptr %ptr, i64 %inc, <8 x i8> %B, <8 x i8> %C) nounwind {
6184 ; SDAG-LABEL: test_v8i8_post_reg_ld2lane:
6185 ; SDAG:       ; %bb.0:
6186 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
6187 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
6188 ; SDAG-NEXT:    ld2.b { v0, v1 }[0], [x0], x2
6189 ; SDAG-NEXT:    str x0, [x1]
6190 ; SDAG-NEXT:    ret
6192 ; CHECK-GISEL-LABEL: test_v8i8_post_reg_ld2lane:
6193 ; CHECK-GISEL:       ; %bb.0:
6194 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
6195 ; CHECK-GISEL-NEXT:    add x8, x0, x2
6196 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
6197 ; CHECK-GISEL-NEXT:    ld2.b { v0, v1 }[0], [x0]
6198 ; CHECK-GISEL-NEXT:    str x8, [x1]
6199 ; CHECK-GISEL-NEXT:    ret
6200   %ld2 = call { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld2lane.v8i8.p0(<8 x i8> %B, <8 x i8> %C, i64 0, ptr %A)
6201   %tmp = getelementptr i8, ptr %A, i64 %inc
6202   store ptr %tmp, ptr %ptr
6203   ret { <8 x i8>, <8 x i8> } %ld2
6206 declare { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld2lane.v8i8.p0(<8 x i8>, <8 x i8>, i64, ptr) nounwind readonly
6209 define { <8 x i16>, <8 x i16> } @test_v8i16_post_imm_ld2lane(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C) nounwind {
6210 ; SDAG-LABEL: test_v8i16_post_imm_ld2lane:
6211 ; SDAG:       ; %bb.0:
6212 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6213 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6214 ; SDAG-NEXT:    ld2.h { v0, v1 }[0], [x0], #4
6215 ; SDAG-NEXT:    str x0, [x1]
6216 ; SDAG-NEXT:    ret
6218 ; CHECK-GISEL-LABEL: test_v8i16_post_imm_ld2lane:
6219 ; CHECK-GISEL:       ; %bb.0:
6220 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6221 ; CHECK-GISEL-NEXT:    add x8, x0, #4
6222 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6223 ; CHECK-GISEL-NEXT:    ld2.h { v0, v1 }[0], [x0]
6224 ; CHECK-GISEL-NEXT:    str x8, [x1]
6225 ; CHECK-GISEL-NEXT:    ret
6226   %ld2 = call { <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld2lane.v8i16.p0(<8 x i16> %B, <8 x i16> %C, i64 0, ptr %A)
6227   %tmp = getelementptr i16, ptr %A, i32 2
6228   store ptr %tmp, ptr %ptr
6229   ret { <8 x i16>, <8 x i16> } %ld2
6232 define { <8 x i16>, <8 x i16> } @test_v8i16_post_reg_ld2lane(ptr %A, ptr %ptr, i64 %inc, <8 x i16> %B, <8 x i16> %C) nounwind {
6233 ; SDAG-LABEL: test_v8i16_post_reg_ld2lane:
6234 ; SDAG:       ; %bb.0:
6235 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6236 ; SDAG-NEXT:    lsl x8, x2, #1
6237 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6238 ; SDAG-NEXT:    ld2.h { v0, v1 }[0], [x0], x8
6239 ; SDAG-NEXT:    str x0, [x1]
6240 ; SDAG-NEXT:    ret
6242 ; CHECK-GISEL-LABEL: test_v8i16_post_reg_ld2lane:
6243 ; CHECK-GISEL:       ; %bb.0:
6244 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6245 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #1
6246 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6247 ; CHECK-GISEL-NEXT:    ld2.h { v0, v1 }[0], [x0]
6248 ; CHECK-GISEL-NEXT:    str x8, [x1]
6249 ; CHECK-GISEL-NEXT:    ret
6250   %ld2 = call { <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld2lane.v8i16.p0(<8 x i16> %B, <8 x i16> %C, i64 0, ptr %A)
6251   %tmp = getelementptr i16, ptr %A, i64 %inc
6252   store ptr %tmp, ptr %ptr
6253   ret { <8 x i16>, <8 x i16> } %ld2
6256 declare { <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld2lane.v8i16.p0(<8 x i16>, <8 x i16>, i64, ptr) nounwind readonly
6259 define { <4 x i16>, <4 x i16> } @test_v4i16_post_imm_ld2lane(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C) nounwind {
6260 ; SDAG-LABEL: test_v4i16_post_imm_ld2lane:
6261 ; SDAG:       ; %bb.0:
6262 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
6263 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
6264 ; SDAG-NEXT:    ld2.h { v0, v1 }[0], [x0], #4
6265 ; SDAG-NEXT:    str x0, [x1]
6266 ; SDAG-NEXT:    ret
6268 ; CHECK-GISEL-LABEL: test_v4i16_post_imm_ld2lane:
6269 ; CHECK-GISEL:       ; %bb.0:
6270 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
6271 ; CHECK-GISEL-NEXT:    add x8, x0, #4
6272 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
6273 ; CHECK-GISEL-NEXT:    ld2.h { v0, v1 }[0], [x0]
6274 ; CHECK-GISEL-NEXT:    str x8, [x1]
6275 ; CHECK-GISEL-NEXT:    ret
6276   %ld2 = call { <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld2lane.v4i16.p0(<4 x i16> %B, <4 x i16> %C, i64 0, ptr %A)
6277   %tmp = getelementptr i16, ptr %A, i32 2
6278   store ptr %tmp, ptr %ptr
6279   ret { <4 x i16>, <4 x i16> } %ld2
6282 define { <4 x i16>, <4 x i16> } @test_v4i16_post_reg_ld2lane(ptr %A, ptr %ptr, i64 %inc, <4 x i16> %B, <4 x i16> %C) nounwind {
6283 ; SDAG-LABEL: test_v4i16_post_reg_ld2lane:
6284 ; SDAG:       ; %bb.0:
6285 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
6286 ; SDAG-NEXT:    lsl x8, x2, #1
6287 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
6288 ; SDAG-NEXT:    ld2.h { v0, v1 }[0], [x0], x8
6289 ; SDAG-NEXT:    str x0, [x1]
6290 ; SDAG-NEXT:    ret
6292 ; CHECK-GISEL-LABEL: test_v4i16_post_reg_ld2lane:
6293 ; CHECK-GISEL:       ; %bb.0:
6294 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
6295 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #1
6296 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
6297 ; CHECK-GISEL-NEXT:    ld2.h { v0, v1 }[0], [x0]
6298 ; CHECK-GISEL-NEXT:    str x8, [x1]
6299 ; CHECK-GISEL-NEXT:    ret
6300   %ld2 = call { <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld2lane.v4i16.p0(<4 x i16> %B, <4 x i16> %C, i64 0, ptr %A)
6301   %tmp = getelementptr i16, ptr %A, i64 %inc
6302   store ptr %tmp, ptr %ptr
6303   ret { <4 x i16>, <4 x i16> } %ld2
6306 declare { <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld2lane.v4i16.p0(<4 x i16>, <4 x i16>, i64, ptr) nounwind readonly
6309 define { <4 x i32>, <4 x i32> } @test_v4i32_post_imm_ld2lane(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C) nounwind {
6310 ; SDAG-LABEL: test_v4i32_post_imm_ld2lane:
6311 ; SDAG:       ; %bb.0:
6312 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6313 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6314 ; SDAG-NEXT:    ld2.s { v0, v1 }[0], [x0], #8
6315 ; SDAG-NEXT:    str x0, [x1]
6316 ; SDAG-NEXT:    ret
6318 ; CHECK-GISEL-LABEL: test_v4i32_post_imm_ld2lane:
6319 ; CHECK-GISEL:       ; %bb.0:
6320 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6321 ; CHECK-GISEL-NEXT:    add x8, x0, #8
6322 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6323 ; CHECK-GISEL-NEXT:    ld2.s { v0, v1 }[0], [x0]
6324 ; CHECK-GISEL-NEXT:    str x8, [x1]
6325 ; CHECK-GISEL-NEXT:    ret
6326   %ld2 = call { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld2lane.v4i32.p0(<4 x i32> %B, <4 x i32> %C, i64 0, ptr %A)
6327   %tmp = getelementptr i32, ptr %A, i32 2
6328   store ptr %tmp, ptr %ptr
6329   ret { <4 x i32>, <4 x i32> } %ld2
6332 define { <4 x i32>, <4 x i32> } @test_v4i32_post_reg_ld2lane(ptr %A, ptr %ptr, i64 %inc, <4 x i32> %B, <4 x i32> %C) nounwind {
6333 ; SDAG-LABEL: test_v4i32_post_reg_ld2lane:
6334 ; SDAG:       ; %bb.0:
6335 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6336 ; SDAG-NEXT:    lsl x8, x2, #2
6337 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6338 ; SDAG-NEXT:    ld2.s { v0, v1 }[0], [x0], x8
6339 ; SDAG-NEXT:    str x0, [x1]
6340 ; SDAG-NEXT:    ret
6342 ; CHECK-GISEL-LABEL: test_v4i32_post_reg_ld2lane:
6343 ; CHECK-GISEL:       ; %bb.0:
6344 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6345 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
6346 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6347 ; CHECK-GISEL-NEXT:    ld2.s { v0, v1 }[0], [x0]
6348 ; CHECK-GISEL-NEXT:    str x8, [x1]
6349 ; CHECK-GISEL-NEXT:    ret
6350   %ld2 = call { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld2lane.v4i32.p0(<4 x i32> %B, <4 x i32> %C, i64 0, ptr %A)
6351   %tmp = getelementptr i32, ptr %A, i64 %inc
6352   store ptr %tmp, ptr %ptr
6353   ret { <4 x i32>, <4 x i32> } %ld2
6356 declare { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld2lane.v4i32.p0(<4 x i32>, <4 x i32>, i64, ptr) nounwind readonly
6359 define { <2 x i32>, <2 x i32> } @test_v2i32_post_imm_ld2lane(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C) nounwind {
6360 ; SDAG-LABEL: test_v2i32_post_imm_ld2lane:
6361 ; SDAG:       ; %bb.0:
6362 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
6363 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
6364 ; SDAG-NEXT:    ld2.s { v0, v1 }[0], [x0], #8
6365 ; SDAG-NEXT:    str x0, [x1]
6366 ; SDAG-NEXT:    ret
6368 ; CHECK-GISEL-LABEL: test_v2i32_post_imm_ld2lane:
6369 ; CHECK-GISEL:       ; %bb.0:
6370 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
6371 ; CHECK-GISEL-NEXT:    add x8, x0, #8
6372 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
6373 ; CHECK-GISEL-NEXT:    ld2.s { v0, v1 }[0], [x0]
6374 ; CHECK-GISEL-NEXT:    str x8, [x1]
6375 ; CHECK-GISEL-NEXT:    ret
6376   %ld2 = call { <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld2lane.v2i32.p0(<2 x i32> %B, <2 x i32> %C, i64 0, ptr %A)
6377   %tmp = getelementptr i32, ptr %A, i32 2
6378   store ptr %tmp, ptr %ptr
6379   ret { <2 x i32>, <2 x i32> } %ld2
6382 define { <2 x i32>, <2 x i32> } @test_v2i32_post_reg_ld2lane(ptr %A, ptr %ptr, i64 %inc, <2 x i32> %B, <2 x i32> %C) nounwind {
6383 ; SDAG-LABEL: test_v2i32_post_reg_ld2lane:
6384 ; SDAG:       ; %bb.0:
6385 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
6386 ; SDAG-NEXT:    lsl x8, x2, #2
6387 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
6388 ; SDAG-NEXT:    ld2.s { v0, v1 }[0], [x0], x8
6389 ; SDAG-NEXT:    str x0, [x1]
6390 ; SDAG-NEXT:    ret
6392 ; CHECK-GISEL-LABEL: test_v2i32_post_reg_ld2lane:
6393 ; CHECK-GISEL:       ; %bb.0:
6394 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
6395 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
6396 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
6397 ; CHECK-GISEL-NEXT:    ld2.s { v0, v1 }[0], [x0]
6398 ; CHECK-GISEL-NEXT:    str x8, [x1]
6399 ; CHECK-GISEL-NEXT:    ret
6400   %ld2 = call { <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld2lane.v2i32.p0(<2 x i32> %B, <2 x i32> %C, i64 0, ptr %A)
6401   %tmp = getelementptr i32, ptr %A, i64 %inc
6402   store ptr %tmp, ptr %ptr
6403   ret { <2 x i32>, <2 x i32> } %ld2
6406 declare { <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld2lane.v2i32.p0(<2 x i32>, <2 x i32>, i64, ptr) nounwind readonly
6409 define { <2 x i64>, <2 x i64> } @test_v2i64_post_imm_ld2lane(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C) nounwind {
6410 ; SDAG-LABEL: test_v2i64_post_imm_ld2lane:
6411 ; SDAG:       ; %bb.0:
6412 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6413 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6414 ; SDAG-NEXT:    ld2.d { v0, v1 }[0], [x0], #16
6415 ; SDAG-NEXT:    str x0, [x1]
6416 ; SDAG-NEXT:    ret
6418 ; CHECK-GISEL-LABEL: test_v2i64_post_imm_ld2lane:
6419 ; CHECK-GISEL:       ; %bb.0:
6420 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6421 ; CHECK-GISEL-NEXT:    add x8, x0, #16
6422 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6423 ; CHECK-GISEL-NEXT:    ld2.d { v0, v1 }[0], [x0]
6424 ; CHECK-GISEL-NEXT:    str x8, [x1]
6425 ; CHECK-GISEL-NEXT:    ret
6426   %ld2 = call { <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld2lane.v2i64.p0(<2 x i64> %B, <2 x i64> %C, i64 0, ptr %A)
6427   %tmp = getelementptr i64, ptr %A, i32 2
6428   store ptr %tmp, ptr %ptr
6429   ret { <2 x i64>, <2 x i64> } %ld2
6432 define { <2 x i64>, <2 x i64> } @test_v2i64_post_reg_ld2lane(ptr %A, ptr %ptr, i64 %inc, <2 x i64> %B, <2 x i64> %C) nounwind {
6433 ; SDAG-LABEL: test_v2i64_post_reg_ld2lane:
6434 ; SDAG:       ; %bb.0:
6435 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6436 ; SDAG-NEXT:    lsl x8, x2, #3
6437 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6438 ; SDAG-NEXT:    ld2.d { v0, v1 }[0], [x0], x8
6439 ; SDAG-NEXT:    str x0, [x1]
6440 ; SDAG-NEXT:    ret
6442 ; CHECK-GISEL-LABEL: test_v2i64_post_reg_ld2lane:
6443 ; CHECK-GISEL:       ; %bb.0:
6444 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6445 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
6446 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6447 ; CHECK-GISEL-NEXT:    ld2.d { v0, v1 }[0], [x0]
6448 ; CHECK-GISEL-NEXT:    str x8, [x1]
6449 ; CHECK-GISEL-NEXT:    ret
6450   %ld2 = call { <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld2lane.v2i64.p0(<2 x i64> %B, <2 x i64> %C, i64 0, ptr %A)
6451   %tmp = getelementptr i64, ptr %A, i64 %inc
6452   store ptr %tmp, ptr %ptr
6453   ret { <2 x i64>, <2 x i64> } %ld2
6456 declare { <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld2lane.v2i64.p0(<2 x i64>, <2 x i64>, i64, ptr) nounwind readonly
6459 define { <1 x i64>, <1 x i64> } @test_v1i64_post_imm_ld2lane(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C) nounwind {
6460 ; SDAG-LABEL: test_v1i64_post_imm_ld2lane:
6461 ; SDAG:       ; %bb.0:
6462 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
6463 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
6464 ; SDAG-NEXT:    ld2.d { v0, v1 }[0], [x0], #16
6465 ; SDAG-NEXT:    str x0, [x1]
6466 ; SDAG-NEXT:    ret
6468 ; CHECK-GISEL-LABEL: test_v1i64_post_imm_ld2lane:
6469 ; CHECK-GISEL:       ; %bb.0:
6470 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
6471 ; CHECK-GISEL-NEXT:    add x8, x0, #16
6472 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
6473 ; CHECK-GISEL-NEXT:    ld2.d { v0, v1 }[0], [x0]
6474 ; CHECK-GISEL-NEXT:    str x8, [x1]
6475 ; CHECK-GISEL-NEXT:    ret
6476   %ld2 = call { <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld2lane.v1i64.p0(<1 x i64> %B, <1 x i64> %C, i64 0, ptr %A)
6477   %tmp = getelementptr i64, ptr %A, i32 2
6478   store ptr %tmp, ptr %ptr
6479   ret { <1 x i64>, <1 x i64> } %ld2
6482 define { <1 x i64>, <1 x i64> } @test_v1i64_post_reg_ld2lane(ptr %A, ptr %ptr, i64 %inc, <1 x i64> %B, <1 x i64> %C) nounwind {
6483 ; SDAG-LABEL: test_v1i64_post_reg_ld2lane:
6484 ; SDAG:       ; %bb.0:
6485 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
6486 ; SDAG-NEXT:    lsl x8, x2, #3
6487 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
6488 ; SDAG-NEXT:    ld2.d { v0, v1 }[0], [x0], x8
6489 ; SDAG-NEXT:    str x0, [x1]
6490 ; SDAG-NEXT:    ret
6492 ; CHECK-GISEL-LABEL: test_v1i64_post_reg_ld2lane:
6493 ; CHECK-GISEL:       ; %bb.0:
6494 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
6495 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
6496 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
6497 ; CHECK-GISEL-NEXT:    ld2.d { v0, v1 }[0], [x0]
6498 ; CHECK-GISEL-NEXT:    str x8, [x1]
6499 ; CHECK-GISEL-NEXT:    ret
6500   %ld2 = call { <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld2lane.v1i64.p0(<1 x i64> %B, <1 x i64> %C, i64 0, ptr %A)
6501   %tmp = getelementptr i64, ptr %A, i64 %inc
6502   store ptr %tmp, ptr %ptr
6503   ret { <1 x i64>, <1 x i64> } %ld2
6506 declare { <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld2lane.v1i64.p0(<1 x i64>, <1 x i64>, i64, ptr) nounwind readonly
6509 define { <4 x float>, <4 x float> } @test_v4f32_post_imm_ld2lane(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C) nounwind {
6510 ; SDAG-LABEL: test_v4f32_post_imm_ld2lane:
6511 ; SDAG:       ; %bb.0:
6512 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6513 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6514 ; SDAG-NEXT:    ld2.s { v0, v1 }[0], [x0], #8
6515 ; SDAG-NEXT:    str x0, [x1]
6516 ; SDAG-NEXT:    ret
6518 ; CHECK-GISEL-LABEL: test_v4f32_post_imm_ld2lane:
6519 ; CHECK-GISEL:       ; %bb.0:
6520 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6521 ; CHECK-GISEL-NEXT:    add x8, x0, #8
6522 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6523 ; CHECK-GISEL-NEXT:    ld2.s { v0, v1 }[0], [x0]
6524 ; CHECK-GISEL-NEXT:    str x8, [x1]
6525 ; CHECK-GISEL-NEXT:    ret
6526   %ld2 = call { <4 x float>, <4 x float> } @llvm.aarch64.neon.ld2lane.v4f32.p0(<4 x float> %B, <4 x float> %C, i64 0, ptr %A)
6527   %tmp = getelementptr float, ptr %A, i32 2
6528   store ptr %tmp, ptr %ptr
6529   ret { <4 x float>, <4 x float> } %ld2
6532 define { <4 x float>, <4 x float> } @test_v4f32_post_reg_ld2lane(ptr %A, ptr %ptr, i64 %inc, <4 x float> %B, <4 x float> %C) nounwind {
6533 ; SDAG-LABEL: test_v4f32_post_reg_ld2lane:
6534 ; SDAG:       ; %bb.0:
6535 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6536 ; SDAG-NEXT:    lsl x8, x2, #2
6537 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6538 ; SDAG-NEXT:    ld2.s { v0, v1 }[0], [x0], x8
6539 ; SDAG-NEXT:    str x0, [x1]
6540 ; SDAG-NEXT:    ret
6542 ; CHECK-GISEL-LABEL: test_v4f32_post_reg_ld2lane:
6543 ; CHECK-GISEL:       ; %bb.0:
6544 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6545 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
6546 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6547 ; CHECK-GISEL-NEXT:    ld2.s { v0, v1 }[0], [x0]
6548 ; CHECK-GISEL-NEXT:    str x8, [x1]
6549 ; CHECK-GISEL-NEXT:    ret
6550   %ld2 = call { <4 x float>, <4 x float> } @llvm.aarch64.neon.ld2lane.v4f32.p0(<4 x float> %B, <4 x float> %C, i64 0, ptr %A)
6551   %tmp = getelementptr float, ptr %A, i64 %inc
6552   store ptr %tmp, ptr %ptr
6553   ret { <4 x float>, <4 x float> } %ld2
6556 declare { <4 x float>, <4 x float> } @llvm.aarch64.neon.ld2lane.v4f32.p0(<4 x float>, <4 x float>, i64, ptr) nounwind readonly
6559 define { <2 x float>, <2 x float> } @test_v2f32_post_imm_ld2lane(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C) nounwind {
6560 ; SDAG-LABEL: test_v2f32_post_imm_ld2lane:
6561 ; SDAG:       ; %bb.0:
6562 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
6563 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
6564 ; SDAG-NEXT:    ld2.s { v0, v1 }[0], [x0], #8
6565 ; SDAG-NEXT:    str x0, [x1]
6566 ; SDAG-NEXT:    ret
6568 ; CHECK-GISEL-LABEL: test_v2f32_post_imm_ld2lane:
6569 ; CHECK-GISEL:       ; %bb.0:
6570 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
6571 ; CHECK-GISEL-NEXT:    add x8, x0, #8
6572 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
6573 ; CHECK-GISEL-NEXT:    ld2.s { v0, v1 }[0], [x0]
6574 ; CHECK-GISEL-NEXT:    str x8, [x1]
6575 ; CHECK-GISEL-NEXT:    ret
6576   %ld2 = call { <2 x float>, <2 x float> } @llvm.aarch64.neon.ld2lane.v2f32.p0(<2 x float> %B, <2 x float> %C, i64 0, ptr %A)
6577   %tmp = getelementptr float, ptr %A, i32 2
6578   store ptr %tmp, ptr %ptr
6579   ret { <2 x float>, <2 x float> } %ld2
6582 define { <2 x float>, <2 x float> } @test_v2f32_post_reg_ld2lane(ptr %A, ptr %ptr, i64 %inc, <2 x float> %B, <2 x float> %C) nounwind {
6583 ; SDAG-LABEL: test_v2f32_post_reg_ld2lane:
6584 ; SDAG:       ; %bb.0:
6585 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
6586 ; SDAG-NEXT:    lsl x8, x2, #2
6587 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
6588 ; SDAG-NEXT:    ld2.s { v0, v1 }[0], [x0], x8
6589 ; SDAG-NEXT:    str x0, [x1]
6590 ; SDAG-NEXT:    ret
6592 ; CHECK-GISEL-LABEL: test_v2f32_post_reg_ld2lane:
6593 ; CHECK-GISEL:       ; %bb.0:
6594 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
6595 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
6596 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
6597 ; CHECK-GISEL-NEXT:    ld2.s { v0, v1 }[0], [x0]
6598 ; CHECK-GISEL-NEXT:    str x8, [x1]
6599 ; CHECK-GISEL-NEXT:    ret
6600   %ld2 = call { <2 x float>, <2 x float> } @llvm.aarch64.neon.ld2lane.v2f32.p0(<2 x float> %B, <2 x float> %C, i64 0, ptr %A)
6601   %tmp = getelementptr float, ptr %A, i64 %inc
6602   store ptr %tmp, ptr %ptr
6603   ret { <2 x float>, <2 x float> } %ld2
6606 declare { <2 x float>, <2 x float> } @llvm.aarch64.neon.ld2lane.v2f32.p0(<2 x float>, <2 x float>, i64, ptr) nounwind readonly
6609 define { <2 x double>, <2 x double> } @test_v2f64_post_imm_ld2lane(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C) nounwind {
6610 ; SDAG-LABEL: test_v2f64_post_imm_ld2lane:
6611 ; SDAG:       ; %bb.0:
6612 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6613 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6614 ; SDAG-NEXT:    ld2.d { v0, v1 }[0], [x0], #16
6615 ; SDAG-NEXT:    str x0, [x1]
6616 ; SDAG-NEXT:    ret
6618 ; CHECK-GISEL-LABEL: test_v2f64_post_imm_ld2lane:
6619 ; CHECK-GISEL:       ; %bb.0:
6620 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6621 ; CHECK-GISEL-NEXT:    add x8, x0, #16
6622 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6623 ; CHECK-GISEL-NEXT:    ld2.d { v0, v1 }[0], [x0]
6624 ; CHECK-GISEL-NEXT:    str x8, [x1]
6625 ; CHECK-GISEL-NEXT:    ret
6626   %ld2 = call { <2 x double>, <2 x double> } @llvm.aarch64.neon.ld2lane.v2f64.p0(<2 x double> %B, <2 x double> %C, i64 0, ptr %A)
6627   %tmp = getelementptr double, ptr %A, i32 2
6628   store ptr %tmp, ptr %ptr
6629   ret { <2 x double>, <2 x double> } %ld2
6632 define { <2 x double>, <2 x double> } @test_v2f64_post_reg_ld2lane(ptr %A, ptr %ptr, i64 %inc, <2 x double> %B, <2 x double> %C) nounwind {
6633 ; SDAG-LABEL: test_v2f64_post_reg_ld2lane:
6634 ; SDAG:       ; %bb.0:
6635 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6636 ; SDAG-NEXT:    lsl x8, x2, #3
6637 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6638 ; SDAG-NEXT:    ld2.d { v0, v1 }[0], [x0], x8
6639 ; SDAG-NEXT:    str x0, [x1]
6640 ; SDAG-NEXT:    ret
6642 ; CHECK-GISEL-LABEL: test_v2f64_post_reg_ld2lane:
6643 ; CHECK-GISEL:       ; %bb.0:
6644 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
6645 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
6646 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
6647 ; CHECK-GISEL-NEXT:    ld2.d { v0, v1 }[0], [x0]
6648 ; CHECK-GISEL-NEXT:    str x8, [x1]
6649 ; CHECK-GISEL-NEXT:    ret
6650   %ld2 = call { <2 x double>, <2 x double> } @llvm.aarch64.neon.ld2lane.v2f64.p0(<2 x double> %B, <2 x double> %C, i64 0, ptr %A)
6651   %tmp = getelementptr double, ptr %A, i64 %inc
6652   store ptr %tmp, ptr %ptr
6653   ret { <2 x double>, <2 x double> } %ld2
6656 declare { <2 x double>, <2 x double> } @llvm.aarch64.neon.ld2lane.v2f64.p0(<2 x double>, <2 x double>, i64, ptr) nounwind readonly
6659 define { <1 x double>, <1 x double> } @test_v1f64_post_imm_ld2lane(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C) nounwind {
6660 ; SDAG-LABEL: test_v1f64_post_imm_ld2lane:
6661 ; SDAG:       ; %bb.0:
6662 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
6663 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
6664 ; SDAG-NEXT:    ld2.d { v0, v1 }[0], [x0], #16
6665 ; SDAG-NEXT:    str x0, [x1]
6666 ; SDAG-NEXT:    ret
6668 ; CHECK-GISEL-LABEL: test_v1f64_post_imm_ld2lane:
6669 ; CHECK-GISEL:       ; %bb.0:
6670 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
6671 ; CHECK-GISEL-NEXT:    add x8, x0, #16
6672 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
6673 ; CHECK-GISEL-NEXT:    ld2.d { v0, v1 }[0], [x0]
6674 ; CHECK-GISEL-NEXT:    str x8, [x1]
6675 ; CHECK-GISEL-NEXT:    ret
6676   %ld2 = call { <1 x double>, <1 x double> } @llvm.aarch64.neon.ld2lane.v1f64.p0(<1 x double> %B, <1 x double> %C, i64 0, ptr %A)
6677   %tmp = getelementptr double, ptr %A, i32 2
6678   store ptr %tmp, ptr %ptr
6679   ret { <1 x double>, <1 x double> } %ld2
6682 define { <1 x double>, <1 x double> } @test_v1f64_post_reg_ld2lane(ptr %A, ptr %ptr, i64 %inc, <1 x double> %B, <1 x double> %C) nounwind {
6683 ; SDAG-LABEL: test_v1f64_post_reg_ld2lane:
6684 ; SDAG:       ; %bb.0:
6685 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
6686 ; SDAG-NEXT:    lsl x8, x2, #3
6687 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
6688 ; SDAG-NEXT:    ld2.d { v0, v1 }[0], [x0], x8
6689 ; SDAG-NEXT:    str x0, [x1]
6690 ; SDAG-NEXT:    ret
6692 ; CHECK-GISEL-LABEL: test_v1f64_post_reg_ld2lane:
6693 ; CHECK-GISEL:       ; %bb.0:
6694 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
6695 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
6696 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
6697 ; CHECK-GISEL-NEXT:    ld2.d { v0, v1 }[0], [x0]
6698 ; CHECK-GISEL-NEXT:    str x8, [x1]
6699 ; CHECK-GISEL-NEXT:    ret
6700   %ld2 = call { <1 x double>, <1 x double> } @llvm.aarch64.neon.ld2lane.v1f64.p0(<1 x double> %B, <1 x double> %C, i64 0, ptr %A)
6701   %tmp = getelementptr double, ptr %A, i64 %inc
6702   store ptr %tmp, ptr %ptr
6703   ret { <1 x double>, <1 x double> } %ld2
6706 declare { <1 x double>, <1 x double> } @llvm.aarch64.neon.ld2lane.v1f64.p0(<1 x double>, <1 x double>, i64, ptr) nounwind readonly
6709 define { <16 x i8>, <16 x i8>, <16 x i8> } @test_v16i8_post_imm_ld3lane(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D) nounwind {
6710 ; SDAG-LABEL: test_v16i8_post_imm_ld3lane:
6711 ; SDAG:       ; %bb.0:
6712 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
6713 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
6714 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
6715 ; SDAG-NEXT:    ld3.b { v0, v1, v2 }[0], [x0], #3
6716 ; SDAG-NEXT:    str x0, [x1]
6717 ; SDAG-NEXT:    ret
6719 ; CHECK-GISEL-LABEL: test_v16i8_post_imm_ld3lane:
6720 ; CHECK-GISEL:       ; %bb.0:
6721 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
6722 ; CHECK-GISEL-NEXT:    add x8, x0, #3
6723 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
6724 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
6725 ; CHECK-GISEL-NEXT:    ld3.b { v0, v1, v2 }[0], [x0]
6726 ; CHECK-GISEL-NEXT:    str x8, [x1]
6727 ; CHECK-GISEL-NEXT:    ret
6728   %ld3 = call { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld3lane.v16i8.p0(<16 x i8> %B, <16 x i8> %C, <16 x i8> %D, i64 0, ptr %A)
6729   %tmp = getelementptr i8, ptr %A, i32 3
6730   store ptr %tmp, ptr %ptr
6731   ret { <16 x i8>, <16 x i8>, <16 x i8> } %ld3
6734 define { <16 x i8>, <16 x i8>, <16 x i8> } @test_v16i8_post_reg_ld3lane(ptr %A, ptr %ptr, i64 %inc, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D) nounwind {
6735 ; SDAG-LABEL: test_v16i8_post_reg_ld3lane:
6736 ; SDAG:       ; %bb.0:
6737 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
6738 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
6739 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
6740 ; SDAG-NEXT:    ld3.b { v0, v1, v2 }[0], [x0], x2
6741 ; SDAG-NEXT:    str x0, [x1]
6742 ; SDAG-NEXT:    ret
6744 ; CHECK-GISEL-LABEL: test_v16i8_post_reg_ld3lane:
6745 ; CHECK-GISEL:       ; %bb.0:
6746 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
6747 ; CHECK-GISEL-NEXT:    add x8, x0, x2
6748 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
6749 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
6750 ; CHECK-GISEL-NEXT:    ld3.b { v0, v1, v2 }[0], [x0]
6751 ; CHECK-GISEL-NEXT:    str x8, [x1]
6752 ; CHECK-GISEL-NEXT:    ret
6753   %ld3 = call { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld3lane.v16i8.p0(<16 x i8> %B, <16 x i8> %C, <16 x i8> %D, i64 0, ptr %A)
6754   %tmp = getelementptr i8, ptr %A, i64 %inc
6755   store ptr %tmp, ptr %ptr
6756   ret { <16 x i8>, <16 x i8>, <16 x i8> } %ld3
6759 declare { <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld3lane.v16i8.p0(<16 x i8>, <16 x i8>, <16 x i8>, i64, ptr) nounwind readonly
6762 define { <8 x i8>, <8 x i8>, <8 x i8> } @test_v8i8_post_imm_ld3lane(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, <8 x i8> %D) nounwind {
6763 ; SDAG-LABEL: test_v8i8_post_imm_ld3lane:
6764 ; SDAG:       ; %bb.0:
6765 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
6766 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
6767 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
6768 ; SDAG-NEXT:    ld3.b { v0, v1, v2 }[0], [x0], #3
6769 ; SDAG-NEXT:    str x0, [x1]
6770 ; SDAG-NEXT:    ret
6772 ; CHECK-GISEL-LABEL: test_v8i8_post_imm_ld3lane:
6773 ; CHECK-GISEL:       ; %bb.0:
6774 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
6775 ; CHECK-GISEL-NEXT:    add x8, x0, #3
6776 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
6777 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
6778 ; CHECK-GISEL-NEXT:    ld3.b { v0, v1, v2 }[0], [x0]
6779 ; CHECK-GISEL-NEXT:    str x8, [x1]
6780 ; CHECK-GISEL-NEXT:    ret
6781   %ld3 = call { <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld3lane.v8i8.p0(<8 x i8> %B, <8 x i8> %C, <8 x i8> %D, i64 0, ptr %A)
6782   %tmp = getelementptr i8, ptr %A, i32 3
6783   store ptr %tmp, ptr %ptr
6784   ret { <8 x i8>, <8 x i8>, <8 x i8> } %ld3
6787 define { <8 x i8>, <8 x i8>, <8 x i8> } @test_v8i8_post_reg_ld3lane(ptr %A, ptr %ptr, i64 %inc, <8 x i8> %B, <8 x i8> %C, <8 x i8> %D) nounwind {
6788 ; SDAG-LABEL: test_v8i8_post_reg_ld3lane:
6789 ; SDAG:       ; %bb.0:
6790 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
6791 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
6792 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
6793 ; SDAG-NEXT:    ld3.b { v0, v1, v2 }[0], [x0], x2
6794 ; SDAG-NEXT:    str x0, [x1]
6795 ; SDAG-NEXT:    ret
6797 ; CHECK-GISEL-LABEL: test_v8i8_post_reg_ld3lane:
6798 ; CHECK-GISEL:       ; %bb.0:
6799 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
6800 ; CHECK-GISEL-NEXT:    add x8, x0, x2
6801 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
6802 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
6803 ; CHECK-GISEL-NEXT:    ld3.b { v0, v1, v2 }[0], [x0]
6804 ; CHECK-GISEL-NEXT:    str x8, [x1]
6805 ; CHECK-GISEL-NEXT:    ret
6806   %ld3 = call { <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld3lane.v8i8.p0(<8 x i8> %B, <8 x i8> %C, <8 x i8> %D, i64 0, ptr %A)
6807   %tmp = getelementptr i8, ptr %A, i64 %inc
6808   store ptr %tmp, ptr %ptr
6809   ret { <8 x i8>, <8 x i8>, <8 x i8> } %ld3
6812 declare { <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld3lane.v8i8.p0(<8 x i8>, <8 x i8>, <8 x i8>, i64, ptr) nounwind readonly
6815 define { <8 x i16>, <8 x i16>, <8 x i16> } @test_v8i16_post_imm_ld3lane(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D) nounwind {
6816 ; SDAG-LABEL: test_v8i16_post_imm_ld3lane:
6817 ; SDAG:       ; %bb.0:
6818 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
6819 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
6820 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
6821 ; SDAG-NEXT:    ld3.h { v0, v1, v2 }[0], [x0], #6
6822 ; SDAG-NEXT:    str x0, [x1]
6823 ; SDAG-NEXT:    ret
6825 ; CHECK-GISEL-LABEL: test_v8i16_post_imm_ld3lane:
6826 ; CHECK-GISEL:       ; %bb.0:
6827 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
6828 ; CHECK-GISEL-NEXT:    add x8, x0, #6
6829 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
6830 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
6831 ; CHECK-GISEL-NEXT:    ld3.h { v0, v1, v2 }[0], [x0]
6832 ; CHECK-GISEL-NEXT:    str x8, [x1]
6833 ; CHECK-GISEL-NEXT:    ret
6834   %ld3 = call { <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld3lane.v8i16.p0(<8 x i16> %B, <8 x i16> %C, <8 x i16> %D, i64 0, ptr %A)
6835   %tmp = getelementptr i16, ptr %A, i32 3
6836   store ptr %tmp, ptr %ptr
6837   ret { <8 x i16>, <8 x i16>, <8 x i16> } %ld3
6840 define { <8 x i16>, <8 x i16>, <8 x i16> } @test_v8i16_post_reg_ld3lane(ptr %A, ptr %ptr, i64 %inc, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D) nounwind {
6841 ; SDAG-LABEL: test_v8i16_post_reg_ld3lane:
6842 ; SDAG:       ; %bb.0:
6843 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
6844 ; SDAG-NEXT:    lsl x8, x2, #1
6845 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
6846 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
6847 ; SDAG-NEXT:    ld3.h { v0, v1, v2 }[0], [x0], x8
6848 ; SDAG-NEXT:    str x0, [x1]
6849 ; SDAG-NEXT:    ret
6851 ; CHECK-GISEL-LABEL: test_v8i16_post_reg_ld3lane:
6852 ; CHECK-GISEL:       ; %bb.0:
6853 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
6854 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #1
6855 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
6856 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
6857 ; CHECK-GISEL-NEXT:    ld3.h { v0, v1, v2 }[0], [x0]
6858 ; CHECK-GISEL-NEXT:    str x8, [x1]
6859 ; CHECK-GISEL-NEXT:    ret
6860   %ld3 = call { <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld3lane.v8i16.p0(<8 x i16> %B, <8 x i16> %C, <8 x i16> %D, i64 0, ptr %A)
6861   %tmp = getelementptr i16, ptr %A, i64 %inc
6862   store ptr %tmp, ptr %ptr
6863   ret { <8 x i16>, <8 x i16>, <8 x i16> } %ld3
6866 declare { <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld3lane.v8i16.p0(<8 x i16>, <8 x i16>, <8 x i16>, i64, ptr) nounwind readonly
6869 define { <4 x i16>, <4 x i16>, <4 x i16> } @test_v4i16_post_imm_ld3lane(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, <4 x i16> %D) nounwind {
6870 ; SDAG-LABEL: test_v4i16_post_imm_ld3lane:
6871 ; SDAG:       ; %bb.0:
6872 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
6873 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
6874 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
6875 ; SDAG-NEXT:    ld3.h { v0, v1, v2 }[0], [x0], #6
6876 ; SDAG-NEXT:    str x0, [x1]
6877 ; SDAG-NEXT:    ret
6879 ; CHECK-GISEL-LABEL: test_v4i16_post_imm_ld3lane:
6880 ; CHECK-GISEL:       ; %bb.0:
6881 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
6882 ; CHECK-GISEL-NEXT:    add x8, x0, #6
6883 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
6884 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
6885 ; CHECK-GISEL-NEXT:    ld3.h { v0, v1, v2 }[0], [x0]
6886 ; CHECK-GISEL-NEXT:    str x8, [x1]
6887 ; CHECK-GISEL-NEXT:    ret
6888   %ld3 = call { <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld3lane.v4i16.p0(<4 x i16> %B, <4 x i16> %C, <4 x i16> %D, i64 0, ptr %A)
6889   %tmp = getelementptr i16, ptr %A, i32 3
6890   store ptr %tmp, ptr %ptr
6891   ret { <4 x i16>, <4 x i16>, <4 x i16> } %ld3
6894 define { <4 x i16>, <4 x i16>, <4 x i16> } @test_v4i16_post_reg_ld3lane(ptr %A, ptr %ptr, i64 %inc, <4 x i16> %B, <4 x i16> %C, <4 x i16> %D) nounwind {
6895 ; SDAG-LABEL: test_v4i16_post_reg_ld3lane:
6896 ; SDAG:       ; %bb.0:
6897 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
6898 ; SDAG-NEXT:    lsl x8, x2, #1
6899 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
6900 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
6901 ; SDAG-NEXT:    ld3.h { v0, v1, v2 }[0], [x0], x8
6902 ; SDAG-NEXT:    str x0, [x1]
6903 ; SDAG-NEXT:    ret
6905 ; CHECK-GISEL-LABEL: test_v4i16_post_reg_ld3lane:
6906 ; CHECK-GISEL:       ; %bb.0:
6907 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
6908 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #1
6909 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
6910 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
6911 ; CHECK-GISEL-NEXT:    ld3.h { v0, v1, v2 }[0], [x0]
6912 ; CHECK-GISEL-NEXT:    str x8, [x1]
6913 ; CHECK-GISEL-NEXT:    ret
6914   %ld3 = call { <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld3lane.v4i16.p0(<4 x i16> %B, <4 x i16> %C, <4 x i16> %D, i64 0, ptr %A)
6915   %tmp = getelementptr i16, ptr %A, i64 %inc
6916   store ptr %tmp, ptr %ptr
6917   ret { <4 x i16>, <4 x i16>, <4 x i16> } %ld3
6920 declare { <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld3lane.v4i16.p0(<4 x i16>, <4 x i16>, <4 x i16>, i64, ptr) nounwind readonly
6923 define { <4 x i32>, <4 x i32>, <4 x i32> } @test_v4i32_post_imm_ld3lane(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D) nounwind {
6924 ; SDAG-LABEL: test_v4i32_post_imm_ld3lane:
6925 ; SDAG:       ; %bb.0:
6926 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
6927 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
6928 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
6929 ; SDAG-NEXT:    ld3.s { v0, v1, v2 }[0], [x0], #12
6930 ; SDAG-NEXT:    str x0, [x1]
6931 ; SDAG-NEXT:    ret
6933 ; CHECK-GISEL-LABEL: test_v4i32_post_imm_ld3lane:
6934 ; CHECK-GISEL:       ; %bb.0:
6935 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
6936 ; CHECK-GISEL-NEXT:    add x8, x0, #12
6937 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
6938 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
6939 ; CHECK-GISEL-NEXT:    ld3.s { v0, v1, v2 }[0], [x0]
6940 ; CHECK-GISEL-NEXT:    str x8, [x1]
6941 ; CHECK-GISEL-NEXT:    ret
6942   %ld3 = call { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld3lane.v4i32.p0(<4 x i32> %B, <4 x i32> %C, <4 x i32> %D, i64 0, ptr %A)
6943   %tmp = getelementptr i32, ptr %A, i32 3
6944   store ptr %tmp, ptr %ptr
6945   ret { <4 x i32>, <4 x i32>, <4 x i32> } %ld3
6948 define { <4 x i32>, <4 x i32>, <4 x i32> } @test_v4i32_post_reg_ld3lane(ptr %A, ptr %ptr, i64 %inc, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D) nounwind {
6949 ; SDAG-LABEL: test_v4i32_post_reg_ld3lane:
6950 ; SDAG:       ; %bb.0:
6951 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
6952 ; SDAG-NEXT:    lsl x8, x2, #2
6953 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
6954 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
6955 ; SDAG-NEXT:    ld3.s { v0, v1, v2 }[0], [x0], x8
6956 ; SDAG-NEXT:    str x0, [x1]
6957 ; SDAG-NEXT:    ret
6959 ; CHECK-GISEL-LABEL: test_v4i32_post_reg_ld3lane:
6960 ; CHECK-GISEL:       ; %bb.0:
6961 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
6962 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
6963 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
6964 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
6965 ; CHECK-GISEL-NEXT:    ld3.s { v0, v1, v2 }[0], [x0]
6966 ; CHECK-GISEL-NEXT:    str x8, [x1]
6967 ; CHECK-GISEL-NEXT:    ret
6968   %ld3 = call { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld3lane.v4i32.p0(<4 x i32> %B, <4 x i32> %C, <4 x i32> %D, i64 0, ptr %A)
6969   %tmp = getelementptr i32, ptr %A, i64 %inc
6970   store ptr %tmp, ptr %ptr
6971   ret { <4 x i32>, <4 x i32>, <4 x i32> } %ld3
6974 declare { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld3lane.v4i32.p0(<4 x i32>, <4 x i32>, <4 x i32>, i64, ptr) nounwind readonly
6977 define { <2 x i32>, <2 x i32>, <2 x i32> } @test_v2i32_post_imm_ld3lane(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, <2 x i32> %D) nounwind {
6978 ; SDAG-LABEL: test_v2i32_post_imm_ld3lane:
6979 ; SDAG:       ; %bb.0:
6980 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
6981 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
6982 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
6983 ; SDAG-NEXT:    ld3.s { v0, v1, v2 }[0], [x0], #12
6984 ; SDAG-NEXT:    str x0, [x1]
6985 ; SDAG-NEXT:    ret
6987 ; CHECK-GISEL-LABEL: test_v2i32_post_imm_ld3lane:
6988 ; CHECK-GISEL:       ; %bb.0:
6989 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
6990 ; CHECK-GISEL-NEXT:    add x8, x0, #12
6991 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
6992 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
6993 ; CHECK-GISEL-NEXT:    ld3.s { v0, v1, v2 }[0], [x0]
6994 ; CHECK-GISEL-NEXT:    str x8, [x1]
6995 ; CHECK-GISEL-NEXT:    ret
6996   %ld3 = call { <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld3lane.v2i32.p0(<2 x i32> %B, <2 x i32> %C, <2 x i32> %D, i64 0, ptr %A)
6997   %tmp = getelementptr i32, ptr %A, i32 3
6998   store ptr %tmp, ptr %ptr
6999   ret { <2 x i32>, <2 x i32>, <2 x i32> } %ld3
7002 define { <2 x i32>, <2 x i32>, <2 x i32> } @test_v2i32_post_reg_ld3lane(ptr %A, ptr %ptr, i64 %inc, <2 x i32> %B, <2 x i32> %C, <2 x i32> %D) nounwind {
7003 ; SDAG-LABEL: test_v2i32_post_reg_ld3lane:
7004 ; SDAG:       ; %bb.0:
7005 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
7006 ; SDAG-NEXT:    lsl x8, x2, #2
7007 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
7008 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
7009 ; SDAG-NEXT:    ld3.s { v0, v1, v2 }[0], [x0], x8
7010 ; SDAG-NEXT:    str x0, [x1]
7011 ; SDAG-NEXT:    ret
7013 ; CHECK-GISEL-LABEL: test_v2i32_post_reg_ld3lane:
7014 ; CHECK-GISEL:       ; %bb.0:
7015 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
7016 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
7017 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
7018 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
7019 ; CHECK-GISEL-NEXT:    ld3.s { v0, v1, v2 }[0], [x0]
7020 ; CHECK-GISEL-NEXT:    str x8, [x1]
7021 ; CHECK-GISEL-NEXT:    ret
7022   %ld3 = call { <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld3lane.v2i32.p0(<2 x i32> %B, <2 x i32> %C, <2 x i32> %D, i64 0, ptr %A)
7023   %tmp = getelementptr i32, ptr %A, i64 %inc
7024   store ptr %tmp, ptr %ptr
7025   ret { <2 x i32>, <2 x i32>, <2 x i32> } %ld3
7028 declare { <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld3lane.v2i32.p0(<2 x i32>, <2 x i32>, <2 x i32>, i64, ptr) nounwind readonly
7031 define { <2 x i64>, <2 x i64>, <2 x i64> } @test_v2i64_post_imm_ld3lane(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D) nounwind {
7032 ; SDAG-LABEL: test_v2i64_post_imm_ld3lane:
7033 ; SDAG:       ; %bb.0:
7034 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
7035 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
7036 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
7037 ; SDAG-NEXT:    ld3.d { v0, v1, v2 }[0], [x0], #24
7038 ; SDAG-NEXT:    str x0, [x1]
7039 ; SDAG-NEXT:    ret
7041 ; CHECK-GISEL-LABEL: test_v2i64_post_imm_ld3lane:
7042 ; CHECK-GISEL:       ; %bb.0:
7043 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
7044 ; CHECK-GISEL-NEXT:    add x8, x0, #24
7045 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
7046 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
7047 ; CHECK-GISEL-NEXT:    ld3.d { v0, v1, v2 }[0], [x0]
7048 ; CHECK-GISEL-NEXT:    str x8, [x1]
7049 ; CHECK-GISEL-NEXT:    ret
7050   %ld3 = call { <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld3lane.v2i64.p0(<2 x i64> %B, <2 x i64> %C, <2 x i64> %D, i64 0, ptr %A)
7051   %tmp = getelementptr i64, ptr %A, i32 3
7052   store ptr %tmp, ptr %ptr
7053   ret { <2 x i64>, <2 x i64>, <2 x i64> } %ld3
7056 define { <2 x i64>, <2 x i64>, <2 x i64> } @test_v2i64_post_reg_ld3lane(ptr %A, ptr %ptr, i64 %inc, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D) nounwind {
7057 ; SDAG-LABEL: test_v2i64_post_reg_ld3lane:
7058 ; SDAG:       ; %bb.0:
7059 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
7060 ; SDAG-NEXT:    lsl x8, x2, #3
7061 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
7062 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
7063 ; SDAG-NEXT:    ld3.d { v0, v1, v2 }[0], [x0], x8
7064 ; SDAG-NEXT:    str x0, [x1]
7065 ; SDAG-NEXT:    ret
7067 ; CHECK-GISEL-LABEL: test_v2i64_post_reg_ld3lane:
7068 ; CHECK-GISEL:       ; %bb.0:
7069 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
7070 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
7071 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
7072 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
7073 ; CHECK-GISEL-NEXT:    ld3.d { v0, v1, v2 }[0], [x0]
7074 ; CHECK-GISEL-NEXT:    str x8, [x1]
7075 ; CHECK-GISEL-NEXT:    ret
7076   %ld3 = call { <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld3lane.v2i64.p0(<2 x i64> %B, <2 x i64> %C, <2 x i64> %D, i64 0, ptr %A)
7077   %tmp = getelementptr i64, ptr %A, i64 %inc
7078   store ptr %tmp, ptr %ptr
7079   ret { <2 x i64>, <2 x i64>, <2 x i64> } %ld3
7082 declare { <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld3lane.v2i64.p0(<2 x i64>, <2 x i64>, <2 x i64>, i64, ptr) nounwind readonly
7085 define { <1 x i64>, <1 x i64>, <1 x i64> } @test_v1i64_post_imm_ld3lane(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, <1 x i64> %D) nounwind {
7086 ; SDAG-LABEL: test_v1i64_post_imm_ld3lane:
7087 ; SDAG:       ; %bb.0:
7088 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
7089 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
7090 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
7091 ; SDAG-NEXT:    ld3.d { v0, v1, v2 }[0], [x0], #24
7092 ; SDAG-NEXT:    str x0, [x1]
7093 ; SDAG-NEXT:    ret
7095 ; CHECK-GISEL-LABEL: test_v1i64_post_imm_ld3lane:
7096 ; CHECK-GISEL:       ; %bb.0:
7097 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
7098 ; CHECK-GISEL-NEXT:    add x8, x0, #24
7099 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
7100 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
7101 ; CHECK-GISEL-NEXT:    ld3.d { v0, v1, v2 }[0], [x0]
7102 ; CHECK-GISEL-NEXT:    str x8, [x1]
7103 ; CHECK-GISEL-NEXT:    ret
7104   %ld3 = call { <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld3lane.v1i64.p0(<1 x i64> %B, <1 x i64> %C, <1 x i64> %D, i64 0, ptr %A)
7105   %tmp = getelementptr i64, ptr %A, i32 3
7106   store ptr %tmp, ptr %ptr
7107   ret { <1 x i64>, <1 x i64>, <1 x i64> } %ld3
7110 define { <1 x i64>, <1 x i64>, <1 x i64> } @test_v1i64_post_reg_ld3lane(ptr %A, ptr %ptr, i64 %inc, <1 x i64> %B, <1 x i64> %C, <1 x i64> %D) nounwind {
7111 ; SDAG-LABEL: test_v1i64_post_reg_ld3lane:
7112 ; SDAG:       ; %bb.0:
7113 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
7114 ; SDAG-NEXT:    lsl x8, x2, #3
7115 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
7116 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
7117 ; SDAG-NEXT:    ld3.d { v0, v1, v2 }[0], [x0], x8
7118 ; SDAG-NEXT:    str x0, [x1]
7119 ; SDAG-NEXT:    ret
7121 ; CHECK-GISEL-LABEL: test_v1i64_post_reg_ld3lane:
7122 ; CHECK-GISEL:       ; %bb.0:
7123 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
7124 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
7125 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
7126 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
7127 ; CHECK-GISEL-NEXT:    ld3.d { v0, v1, v2 }[0], [x0]
7128 ; CHECK-GISEL-NEXT:    str x8, [x1]
7129 ; CHECK-GISEL-NEXT:    ret
7130   %ld3 = call { <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld3lane.v1i64.p0(<1 x i64> %B, <1 x i64> %C, <1 x i64> %D, i64 0, ptr %A)
7131   %tmp = getelementptr i64, ptr %A, i64 %inc
7132   store ptr %tmp, ptr %ptr
7133   ret { <1 x i64>, <1 x i64>, <1 x i64> } %ld3
7136 declare { <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld3lane.v1i64.p0(<1 x i64>, <1 x i64>, <1 x i64>, i64, ptr) nounwind readonly
7139 define { <4 x float>, <4 x float>, <4 x float> } @test_v4f32_post_imm_ld3lane(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, <4 x float> %D) nounwind {
7140 ; SDAG-LABEL: test_v4f32_post_imm_ld3lane:
7141 ; SDAG:       ; %bb.0:
7142 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
7143 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
7144 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
7145 ; SDAG-NEXT:    ld3.s { v0, v1, v2 }[0], [x0], #12
7146 ; SDAG-NEXT:    str x0, [x1]
7147 ; SDAG-NEXT:    ret
7149 ; CHECK-GISEL-LABEL: test_v4f32_post_imm_ld3lane:
7150 ; CHECK-GISEL:       ; %bb.0:
7151 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
7152 ; CHECK-GISEL-NEXT:    add x8, x0, #12
7153 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
7154 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
7155 ; CHECK-GISEL-NEXT:    ld3.s { v0, v1, v2 }[0], [x0]
7156 ; CHECK-GISEL-NEXT:    str x8, [x1]
7157 ; CHECK-GISEL-NEXT:    ret
7158   %ld3 = call { <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld3lane.v4f32.p0(<4 x float> %B, <4 x float> %C, <4 x float> %D, i64 0, ptr %A)
7159   %tmp = getelementptr float, ptr %A, i32 3
7160   store ptr %tmp, ptr %ptr
7161   ret { <4 x float>, <4 x float>, <4 x float> } %ld3
7164 define { <4 x float>, <4 x float>, <4 x float> } @test_v4f32_post_reg_ld3lane(ptr %A, ptr %ptr, i64 %inc, <4 x float> %B, <4 x float> %C, <4 x float> %D) nounwind {
7165 ; SDAG-LABEL: test_v4f32_post_reg_ld3lane:
7166 ; SDAG:       ; %bb.0:
7167 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
7168 ; SDAG-NEXT:    lsl x8, x2, #2
7169 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
7170 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
7171 ; SDAG-NEXT:    ld3.s { v0, v1, v2 }[0], [x0], x8
7172 ; SDAG-NEXT:    str x0, [x1]
7173 ; SDAG-NEXT:    ret
7175 ; CHECK-GISEL-LABEL: test_v4f32_post_reg_ld3lane:
7176 ; CHECK-GISEL:       ; %bb.0:
7177 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
7178 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
7179 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
7180 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
7181 ; CHECK-GISEL-NEXT:    ld3.s { v0, v1, v2 }[0], [x0]
7182 ; CHECK-GISEL-NEXT:    str x8, [x1]
7183 ; CHECK-GISEL-NEXT:    ret
7184   %ld3 = call { <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld3lane.v4f32.p0(<4 x float> %B, <4 x float> %C, <4 x float> %D, i64 0, ptr %A)
7185   %tmp = getelementptr float, ptr %A, i64 %inc
7186   store ptr %tmp, ptr %ptr
7187   ret { <4 x float>, <4 x float>, <4 x float> } %ld3
7190 declare { <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld3lane.v4f32.p0(<4 x float>, <4 x float>, <4 x float>, i64, ptr) nounwind readonly
7193 define { <2 x float>, <2 x float>, <2 x float> } @test_v2f32_post_imm_ld3lane(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, <2 x float> %D) nounwind {
7194 ; SDAG-LABEL: test_v2f32_post_imm_ld3lane:
7195 ; SDAG:       ; %bb.0:
7196 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
7197 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
7198 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
7199 ; SDAG-NEXT:    ld3.s { v0, v1, v2 }[0], [x0], #12
7200 ; SDAG-NEXT:    str x0, [x1]
7201 ; SDAG-NEXT:    ret
7203 ; CHECK-GISEL-LABEL: test_v2f32_post_imm_ld3lane:
7204 ; CHECK-GISEL:       ; %bb.0:
7205 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
7206 ; CHECK-GISEL-NEXT:    add x8, x0, #12
7207 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
7208 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
7209 ; CHECK-GISEL-NEXT:    ld3.s { v0, v1, v2 }[0], [x0]
7210 ; CHECK-GISEL-NEXT:    str x8, [x1]
7211 ; CHECK-GISEL-NEXT:    ret
7212   %ld3 = call { <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld3lane.v2f32.p0(<2 x float> %B, <2 x float> %C, <2 x float> %D, i64 0, ptr %A)
7213   %tmp = getelementptr float, ptr %A, i32 3
7214   store ptr %tmp, ptr %ptr
7215   ret { <2 x float>, <2 x float>, <2 x float> } %ld3
7218 define { <2 x float>, <2 x float>, <2 x float> } @test_v2f32_post_reg_ld3lane(ptr %A, ptr %ptr, i64 %inc, <2 x float> %B, <2 x float> %C, <2 x float> %D) nounwind {
7219 ; SDAG-LABEL: test_v2f32_post_reg_ld3lane:
7220 ; SDAG:       ; %bb.0:
7221 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
7222 ; SDAG-NEXT:    lsl x8, x2, #2
7223 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
7224 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
7225 ; SDAG-NEXT:    ld3.s { v0, v1, v2 }[0], [x0], x8
7226 ; SDAG-NEXT:    str x0, [x1]
7227 ; SDAG-NEXT:    ret
7229 ; CHECK-GISEL-LABEL: test_v2f32_post_reg_ld3lane:
7230 ; CHECK-GISEL:       ; %bb.0:
7231 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
7232 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
7233 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
7234 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
7235 ; CHECK-GISEL-NEXT:    ld3.s { v0, v1, v2 }[0], [x0]
7236 ; CHECK-GISEL-NEXT:    str x8, [x1]
7237 ; CHECK-GISEL-NEXT:    ret
7238   %ld3 = call { <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld3lane.v2f32.p0(<2 x float> %B, <2 x float> %C, <2 x float> %D, i64 0, ptr %A)
7239   %tmp = getelementptr float, ptr %A, i64 %inc
7240   store ptr %tmp, ptr %ptr
7241   ret { <2 x float>, <2 x float>, <2 x float> } %ld3
7244 declare { <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld3lane.v2f32.p0(<2 x float>, <2 x float>, <2 x float>, i64, ptr) nounwind readonly
7247 define { <2 x double>, <2 x double>, <2 x double> } @test_v2f64_post_imm_ld3lane(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, <2 x double> %D) nounwind {
7248 ; SDAG-LABEL: test_v2f64_post_imm_ld3lane:
7249 ; SDAG:       ; %bb.0:
7250 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
7251 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
7252 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
7253 ; SDAG-NEXT:    ld3.d { v0, v1, v2 }[0], [x0], #24
7254 ; SDAG-NEXT:    str x0, [x1]
7255 ; SDAG-NEXT:    ret
7257 ; CHECK-GISEL-LABEL: test_v2f64_post_imm_ld3lane:
7258 ; CHECK-GISEL:       ; %bb.0:
7259 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
7260 ; CHECK-GISEL-NEXT:    add x8, x0, #24
7261 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
7262 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
7263 ; CHECK-GISEL-NEXT:    ld3.d { v0, v1, v2 }[0], [x0]
7264 ; CHECK-GISEL-NEXT:    str x8, [x1]
7265 ; CHECK-GISEL-NEXT:    ret
7266   %ld3 = call { <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld3lane.v2f64.p0(<2 x double> %B, <2 x double> %C, <2 x double> %D, i64 0, ptr %A)
7267   %tmp = getelementptr double, ptr %A, i32 3
7268   store ptr %tmp, ptr %ptr
7269   ret { <2 x double>, <2 x double>, <2 x double> } %ld3
7272 define { <2 x double>, <2 x double>, <2 x double> } @test_v2f64_post_reg_ld3lane(ptr %A, ptr %ptr, i64 %inc, <2 x double> %B, <2 x double> %C, <2 x double> %D) nounwind {
7273 ; SDAG-LABEL: test_v2f64_post_reg_ld3lane:
7274 ; SDAG:       ; %bb.0:
7275 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
7276 ; SDAG-NEXT:    lsl x8, x2, #3
7277 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
7278 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
7279 ; SDAG-NEXT:    ld3.d { v0, v1, v2 }[0], [x0], x8
7280 ; SDAG-NEXT:    str x0, [x1]
7281 ; SDAG-NEXT:    ret
7283 ; CHECK-GISEL-LABEL: test_v2f64_post_reg_ld3lane:
7284 ; CHECK-GISEL:       ; %bb.0:
7285 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
7286 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
7287 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
7288 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
7289 ; CHECK-GISEL-NEXT:    ld3.d { v0, v1, v2 }[0], [x0]
7290 ; CHECK-GISEL-NEXT:    str x8, [x1]
7291 ; CHECK-GISEL-NEXT:    ret
7292   %ld3 = call { <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld3lane.v2f64.p0(<2 x double> %B, <2 x double> %C, <2 x double> %D, i64 0, ptr %A)
7293   %tmp = getelementptr double, ptr %A, i64 %inc
7294   store ptr %tmp, ptr %ptr
7295   ret { <2 x double>, <2 x double>, <2 x double> } %ld3
7298 declare { <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld3lane.v2f64.p0(<2 x double>, <2 x double>, <2 x double>, i64, ptr) nounwind readonly
7301 define { <1 x double>, <1 x double>, <1 x double> } @test_v1f64_post_imm_ld3lane(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, <1 x double> %D) nounwind {
7302 ; SDAG-LABEL: test_v1f64_post_imm_ld3lane:
7303 ; SDAG:       ; %bb.0:
7304 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
7305 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
7306 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
7307 ; SDAG-NEXT:    ld3.d { v0, v1, v2 }[0], [x0], #24
7308 ; SDAG-NEXT:    str x0, [x1]
7309 ; SDAG-NEXT:    ret
7311 ; CHECK-GISEL-LABEL: test_v1f64_post_imm_ld3lane:
7312 ; CHECK-GISEL:       ; %bb.0:
7313 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
7314 ; CHECK-GISEL-NEXT:    add x8, x0, #24
7315 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
7316 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
7317 ; CHECK-GISEL-NEXT:    ld3.d { v0, v1, v2 }[0], [x0]
7318 ; CHECK-GISEL-NEXT:    str x8, [x1]
7319 ; CHECK-GISEL-NEXT:    ret
7320   %ld3 = call { <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld3lane.v1f64.p0(<1 x double> %B, <1 x double> %C, <1 x double> %D, i64 0, ptr %A)
7321   %tmp = getelementptr double, ptr %A, i32 3
7322   store ptr %tmp, ptr %ptr
7323   ret { <1 x double>, <1 x double>, <1 x double> } %ld3
7326 define { <1 x double>, <1 x double>, <1 x double> } @test_v1f64_post_reg_ld3lane(ptr %A, ptr %ptr, i64 %inc, <1 x double> %B, <1 x double> %C, <1 x double> %D) nounwind {
7327 ; SDAG-LABEL: test_v1f64_post_reg_ld3lane:
7328 ; SDAG:       ; %bb.0:
7329 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
7330 ; SDAG-NEXT:    lsl x8, x2, #3
7331 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
7332 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
7333 ; SDAG-NEXT:    ld3.d { v0, v1, v2 }[0], [x0], x8
7334 ; SDAG-NEXT:    str x0, [x1]
7335 ; SDAG-NEXT:    ret
7337 ; CHECK-GISEL-LABEL: test_v1f64_post_reg_ld3lane:
7338 ; CHECK-GISEL:       ; %bb.0:
7339 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
7340 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
7341 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
7342 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
7343 ; CHECK-GISEL-NEXT:    ld3.d { v0, v1, v2 }[0], [x0]
7344 ; CHECK-GISEL-NEXT:    str x8, [x1]
7345 ; CHECK-GISEL-NEXT:    ret
7346   %ld3 = call { <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld3lane.v1f64.p0(<1 x double> %B, <1 x double> %C, <1 x double> %D, i64 0, ptr %A)
7347   %tmp = getelementptr double, ptr %A, i64 %inc
7348   store ptr %tmp, ptr %ptr
7349   ret { <1 x double>, <1 x double>, <1 x double> } %ld3
7352 declare { <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld3lane.v1f64.p0(<1 x double>, <1 x double>, <1 x double>, i64, ptr) nounwind readonly
7355 define { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @test_v16i8_post_imm_ld4lane(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D, <16 x i8> %E) nounwind {
7356 ; SDAG-LABEL: test_v16i8_post_imm_ld4lane:
7357 ; SDAG:       ; %bb.0:
7358 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7359 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7360 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7361 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7362 ; SDAG-NEXT:    ld4.b { v0, v1, v2, v3 }[0], [x0], #4
7363 ; SDAG-NEXT:    str x0, [x1]
7364 ; SDAG-NEXT:    ret
7366 ; CHECK-GISEL-LABEL: test_v16i8_post_imm_ld4lane:
7367 ; CHECK-GISEL:       ; %bb.0:
7368 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7369 ; CHECK-GISEL-NEXT:    add x8, x0, #4
7370 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7371 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7372 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7373 ; CHECK-GISEL-NEXT:    ld4.b { v0, v1, v2, v3 }[0], [x0]
7374 ; CHECK-GISEL-NEXT:    str x8, [x1]
7375 ; CHECK-GISEL-NEXT:    ret
7376   %ld4 = call { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld4lane.v16i8.p0(<16 x i8> %B, <16 x i8> %C, <16 x i8> %D, <16 x i8> %E, i64 0, ptr %A)
7377   %tmp = getelementptr i8, ptr %A, i32 4
7378   store ptr %tmp, ptr %ptr
7379   ret { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %ld4
7382 define { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @test_v16i8_post_reg_ld4lane(ptr %A, ptr %ptr, i64 %inc, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D, <16 x i8> %E) nounwind {
7383 ; SDAG-LABEL: test_v16i8_post_reg_ld4lane:
7384 ; SDAG:       ; %bb.0:
7385 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7386 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7387 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7388 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7389 ; SDAG-NEXT:    ld4.b { v0, v1, v2, v3 }[0], [x0], x2
7390 ; SDAG-NEXT:    str x0, [x1]
7391 ; SDAG-NEXT:    ret
7393 ; CHECK-GISEL-LABEL: test_v16i8_post_reg_ld4lane:
7394 ; CHECK-GISEL:       ; %bb.0:
7395 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7396 ; CHECK-GISEL-NEXT:    add x8, x0, x2
7397 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7398 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7399 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7400 ; CHECK-GISEL-NEXT:    ld4.b { v0, v1, v2, v3 }[0], [x0]
7401 ; CHECK-GISEL-NEXT:    str x8, [x1]
7402 ; CHECK-GISEL-NEXT:    ret
7403   %ld4 = call { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld4lane.v16i8.p0(<16 x i8> %B, <16 x i8> %C, <16 x i8> %D, <16 x i8> %E, i64 0, ptr %A)
7404   %tmp = getelementptr i8, ptr %A, i64 %inc
7405   store ptr %tmp, ptr %ptr
7406   ret { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } %ld4
7409 declare { <16 x i8>, <16 x i8>, <16 x i8>, <16 x i8> } @llvm.aarch64.neon.ld4lane.v16i8.p0(<16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, i64, ptr) nounwind readonly
7412 define { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @test_v8i8_post_imm_ld4lane(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, <8 x i8> %D, <8 x i8> %E) nounwind {
7413 ; SDAG-LABEL: test_v8i8_post_imm_ld4lane:
7414 ; SDAG:       ; %bb.0:
7415 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7416 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7417 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7418 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7419 ; SDAG-NEXT:    ld4.b { v0, v1, v2, v3 }[0], [x0], #4
7420 ; SDAG-NEXT:    str x0, [x1]
7421 ; SDAG-NEXT:    ret
7423 ; CHECK-GISEL-LABEL: test_v8i8_post_imm_ld4lane:
7424 ; CHECK-GISEL:       ; %bb.0:
7425 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7426 ; CHECK-GISEL-NEXT:    add x8, x0, #4
7427 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7428 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7429 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7430 ; CHECK-GISEL-NEXT:    ld4.b { v0, v1, v2, v3 }[0], [x0]
7431 ; CHECK-GISEL-NEXT:    str x8, [x1]
7432 ; CHECK-GISEL-NEXT:    ret
7433   %ld4 = call { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld4lane.v8i8.p0(<8 x i8> %B, <8 x i8> %C, <8 x i8> %D, <8 x i8> %E, i64 0, ptr %A)
7434   %tmp = getelementptr i8, ptr %A, i32 4
7435   store ptr %tmp, ptr %ptr
7436   ret { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %ld4
7439 define { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @test_v8i8_post_reg_ld4lane(ptr %A, ptr %ptr, i64 %inc, <8 x i8> %B, <8 x i8> %C, <8 x i8> %D, <8 x i8> %E) nounwind {
7440 ; SDAG-LABEL: test_v8i8_post_reg_ld4lane:
7441 ; SDAG:       ; %bb.0:
7442 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7443 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7444 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7445 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7446 ; SDAG-NEXT:    ld4.b { v0, v1, v2, v3 }[0], [x0], x2
7447 ; SDAG-NEXT:    str x0, [x1]
7448 ; SDAG-NEXT:    ret
7450 ; CHECK-GISEL-LABEL: test_v8i8_post_reg_ld4lane:
7451 ; CHECK-GISEL:       ; %bb.0:
7452 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7453 ; CHECK-GISEL-NEXT:    add x8, x0, x2
7454 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7455 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7456 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7457 ; CHECK-GISEL-NEXT:    ld4.b { v0, v1, v2, v3 }[0], [x0]
7458 ; CHECK-GISEL-NEXT:    str x8, [x1]
7459 ; CHECK-GISEL-NEXT:    ret
7460   %ld4 = call { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld4lane.v8i8.p0(<8 x i8> %B, <8 x i8> %C, <8 x i8> %D, <8 x i8> %E, i64 0, ptr %A)
7461   %tmp = getelementptr i8, ptr %A, i64 %inc
7462   store ptr %tmp, ptr %ptr
7463   ret { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } %ld4
7466 declare { <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld4lane.v8i8.p0(<8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, i64, ptr) nounwind readonly
7469 define { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @test_v8i16_post_imm_ld4lane(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D, <8 x i16> %E) nounwind {
7470 ; SDAG-LABEL: test_v8i16_post_imm_ld4lane:
7471 ; SDAG:       ; %bb.0:
7472 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7473 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7474 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7475 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7476 ; SDAG-NEXT:    ld4.h { v0, v1, v2, v3 }[0], [x0], #8
7477 ; SDAG-NEXT:    str x0, [x1]
7478 ; SDAG-NEXT:    ret
7480 ; CHECK-GISEL-LABEL: test_v8i16_post_imm_ld4lane:
7481 ; CHECK-GISEL:       ; %bb.0:
7482 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7483 ; CHECK-GISEL-NEXT:    add x8, x0, #8
7484 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7485 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7486 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7487 ; CHECK-GISEL-NEXT:    ld4.h { v0, v1, v2, v3 }[0], [x0]
7488 ; CHECK-GISEL-NEXT:    str x8, [x1]
7489 ; CHECK-GISEL-NEXT:    ret
7490   %ld4 = call { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld4lane.v8i16.p0(<8 x i16> %B, <8 x i16> %C, <8 x i16> %D, <8 x i16> %E, i64 0, ptr %A)
7491   %tmp = getelementptr i16, ptr %A, i32 4
7492   store ptr %tmp, ptr %ptr
7493   ret { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %ld4
7496 define { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @test_v8i16_post_reg_ld4lane(ptr %A, ptr %ptr, i64 %inc, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D, <8 x i16> %E) nounwind {
7497 ; SDAG-LABEL: test_v8i16_post_reg_ld4lane:
7498 ; SDAG:       ; %bb.0:
7499 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7500 ; SDAG-NEXT:    lsl x8, x2, #1
7501 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7502 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7503 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7504 ; SDAG-NEXT:    ld4.h { v0, v1, v2, v3 }[0], [x0], x8
7505 ; SDAG-NEXT:    str x0, [x1]
7506 ; SDAG-NEXT:    ret
7508 ; CHECK-GISEL-LABEL: test_v8i16_post_reg_ld4lane:
7509 ; CHECK-GISEL:       ; %bb.0:
7510 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7511 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #1
7512 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7513 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7514 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7515 ; CHECK-GISEL-NEXT:    ld4.h { v0, v1, v2, v3 }[0], [x0]
7516 ; CHECK-GISEL-NEXT:    str x8, [x1]
7517 ; CHECK-GISEL-NEXT:    ret
7518   %ld4 = call { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld4lane.v8i16.p0(<8 x i16> %B, <8 x i16> %C, <8 x i16> %D, <8 x i16> %E, i64 0, ptr %A)
7519   %tmp = getelementptr i16, ptr %A, i64 %inc
7520   store ptr %tmp, ptr %ptr
7521   ret { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } %ld4
7524 declare { <8 x i16>, <8 x i16>, <8 x i16>, <8 x i16> } @llvm.aarch64.neon.ld4lane.v8i16.p0(<8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, i64, ptr) nounwind readonly
7527 define { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @test_v4i16_post_imm_ld4lane(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, <4 x i16> %D, <4 x i16> %E) nounwind {
7528 ; SDAG-LABEL: test_v4i16_post_imm_ld4lane:
7529 ; SDAG:       ; %bb.0:
7530 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7531 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7532 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7533 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7534 ; SDAG-NEXT:    ld4.h { v0, v1, v2, v3 }[0], [x0], #8
7535 ; SDAG-NEXT:    str x0, [x1]
7536 ; SDAG-NEXT:    ret
7538 ; CHECK-GISEL-LABEL: test_v4i16_post_imm_ld4lane:
7539 ; CHECK-GISEL:       ; %bb.0:
7540 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7541 ; CHECK-GISEL-NEXT:    add x8, x0, #8
7542 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7543 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7544 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7545 ; CHECK-GISEL-NEXT:    ld4.h { v0, v1, v2, v3 }[0], [x0]
7546 ; CHECK-GISEL-NEXT:    str x8, [x1]
7547 ; CHECK-GISEL-NEXT:    ret
7548   %ld4 = call { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld4lane.v4i16.p0(<4 x i16> %B, <4 x i16> %C, <4 x i16> %D, <4 x i16> %E, i64 0, ptr %A)
7549   %tmp = getelementptr i16, ptr %A, i32 4
7550   store ptr %tmp, ptr %ptr
7551   ret { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %ld4
7554 define { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @test_v4i16_post_reg_ld4lane(ptr %A, ptr %ptr, i64 %inc, <4 x i16> %B, <4 x i16> %C, <4 x i16> %D, <4 x i16> %E) nounwind {
7555 ; SDAG-LABEL: test_v4i16_post_reg_ld4lane:
7556 ; SDAG:       ; %bb.0:
7557 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7558 ; SDAG-NEXT:    lsl x8, x2, #1
7559 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7560 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7561 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7562 ; SDAG-NEXT:    ld4.h { v0, v1, v2, v3 }[0], [x0], x8
7563 ; SDAG-NEXT:    str x0, [x1]
7564 ; SDAG-NEXT:    ret
7566 ; CHECK-GISEL-LABEL: test_v4i16_post_reg_ld4lane:
7567 ; CHECK-GISEL:       ; %bb.0:
7568 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7569 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #1
7570 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7571 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7572 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7573 ; CHECK-GISEL-NEXT:    ld4.h { v0, v1, v2, v3 }[0], [x0]
7574 ; CHECK-GISEL-NEXT:    str x8, [x1]
7575 ; CHECK-GISEL-NEXT:    ret
7576   %ld4 = call { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld4lane.v4i16.p0(<4 x i16> %B, <4 x i16> %C, <4 x i16> %D, <4 x i16> %E, i64 0, ptr %A)
7577   %tmp = getelementptr i16, ptr %A, i64 %inc
7578   store ptr %tmp, ptr %ptr
7579   ret { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } %ld4
7582 declare { <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16> } @llvm.aarch64.neon.ld4lane.v4i16.p0(<4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, i64, ptr) nounwind readonly
7585 define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @test_v4i32_post_imm_ld4lane(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D, <4 x i32> %E) nounwind {
7586 ; SDAG-LABEL: test_v4i32_post_imm_ld4lane:
7587 ; SDAG:       ; %bb.0:
7588 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7589 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7590 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7591 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7592 ; SDAG-NEXT:    ld4.s { v0, v1, v2, v3 }[0], [x0], #16
7593 ; SDAG-NEXT:    str x0, [x1]
7594 ; SDAG-NEXT:    ret
7596 ; CHECK-GISEL-LABEL: test_v4i32_post_imm_ld4lane:
7597 ; CHECK-GISEL:       ; %bb.0:
7598 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7599 ; CHECK-GISEL-NEXT:    add x8, x0, #16
7600 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7601 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7602 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7603 ; CHECK-GISEL-NEXT:    ld4.s { v0, v1, v2, v3 }[0], [x0]
7604 ; CHECK-GISEL-NEXT:    str x8, [x1]
7605 ; CHECK-GISEL-NEXT:    ret
7606   %ld4 = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld4lane.v4i32.p0(<4 x i32> %B, <4 x i32> %C, <4 x i32> %D, <4 x i32> %E, i64 0, ptr %A)
7607   %tmp = getelementptr i32, ptr %A, i32 4
7608   store ptr %tmp, ptr %ptr
7609   ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %ld4
7612 define { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @test_v4i32_post_reg_ld4lane(ptr %A, ptr %ptr, i64 %inc, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D, <4 x i32> %E) nounwind {
7613 ; SDAG-LABEL: test_v4i32_post_reg_ld4lane:
7614 ; SDAG:       ; %bb.0:
7615 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7616 ; SDAG-NEXT:    lsl x8, x2, #2
7617 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7618 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7619 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7620 ; SDAG-NEXT:    ld4.s { v0, v1, v2, v3 }[0], [x0], x8
7621 ; SDAG-NEXT:    str x0, [x1]
7622 ; SDAG-NEXT:    ret
7624 ; CHECK-GISEL-LABEL: test_v4i32_post_reg_ld4lane:
7625 ; CHECK-GISEL:       ; %bb.0:
7626 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7627 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
7628 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7629 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7630 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7631 ; CHECK-GISEL-NEXT:    ld4.s { v0, v1, v2, v3 }[0], [x0]
7632 ; CHECK-GISEL-NEXT:    str x8, [x1]
7633 ; CHECK-GISEL-NEXT:    ret
7634   %ld4 = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld4lane.v4i32.p0(<4 x i32> %B, <4 x i32> %C, <4 x i32> %D, <4 x i32> %E, i64 0, ptr %A)
7635   %tmp = getelementptr i32, ptr %A, i64 %inc
7636   store ptr %tmp, ptr %ptr
7637   ret { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } %ld4
7640 declare { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld4lane.v4i32.p0(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, i64, ptr) nounwind readonly
7643 define { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @test_v2i32_post_imm_ld4lane(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, <2 x i32> %D, <2 x i32> %E) nounwind {
7644 ; SDAG-LABEL: test_v2i32_post_imm_ld4lane:
7645 ; SDAG:       ; %bb.0:
7646 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7647 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7648 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7649 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7650 ; SDAG-NEXT:    ld4.s { v0, v1, v2, v3 }[0], [x0], #16
7651 ; SDAG-NEXT:    str x0, [x1]
7652 ; SDAG-NEXT:    ret
7654 ; CHECK-GISEL-LABEL: test_v2i32_post_imm_ld4lane:
7655 ; CHECK-GISEL:       ; %bb.0:
7656 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7657 ; CHECK-GISEL-NEXT:    add x8, x0, #16
7658 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7659 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7660 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7661 ; CHECK-GISEL-NEXT:    ld4.s { v0, v1, v2, v3 }[0], [x0]
7662 ; CHECK-GISEL-NEXT:    str x8, [x1]
7663 ; CHECK-GISEL-NEXT:    ret
7664   %ld4 = call { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld4lane.v2i32.p0(<2 x i32> %B, <2 x i32> %C, <2 x i32> %D, <2 x i32> %E, i64 0, ptr %A)
7665   %tmp = getelementptr i32, ptr %A, i32 4
7666   store ptr %tmp, ptr %ptr
7667   ret { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %ld4
7670 define { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @test_v2i32_post_reg_ld4lane(ptr %A, ptr %ptr, i64 %inc, <2 x i32> %B, <2 x i32> %C, <2 x i32> %D, <2 x i32> %E) nounwind {
7671 ; SDAG-LABEL: test_v2i32_post_reg_ld4lane:
7672 ; SDAG:       ; %bb.0:
7673 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7674 ; SDAG-NEXT:    lsl x8, x2, #2
7675 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7676 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7677 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7678 ; SDAG-NEXT:    ld4.s { v0, v1, v2, v3 }[0], [x0], x8
7679 ; SDAG-NEXT:    str x0, [x1]
7680 ; SDAG-NEXT:    ret
7682 ; CHECK-GISEL-LABEL: test_v2i32_post_reg_ld4lane:
7683 ; CHECK-GISEL:       ; %bb.0:
7684 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7685 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
7686 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7687 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7688 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7689 ; CHECK-GISEL-NEXT:    ld4.s { v0, v1, v2, v3 }[0], [x0]
7690 ; CHECK-GISEL-NEXT:    str x8, [x1]
7691 ; CHECK-GISEL-NEXT:    ret
7692   %ld4 = call { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld4lane.v2i32.p0(<2 x i32> %B, <2 x i32> %C, <2 x i32> %D, <2 x i32> %E, i64 0, ptr %A)
7693   %tmp = getelementptr i32, ptr %A, i64 %inc
7694   store ptr %tmp, ptr %ptr
7695   ret { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } %ld4
7698 declare { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @llvm.aarch64.neon.ld4lane.v2i32.p0(<2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, i64, ptr) nounwind readonly
7701 define { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @test_v2i64_post_imm_ld4lane(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D, <2 x i64> %E) nounwind {
7702 ; SDAG-LABEL: test_v2i64_post_imm_ld4lane:
7703 ; SDAG:       ; %bb.0:
7704 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7705 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7706 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7707 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7708 ; SDAG-NEXT:    ld4.d { v0, v1, v2, v3 }[0], [x0], #32
7709 ; SDAG-NEXT:    str x0, [x1]
7710 ; SDAG-NEXT:    ret
7712 ; CHECK-GISEL-LABEL: test_v2i64_post_imm_ld4lane:
7713 ; CHECK-GISEL:       ; %bb.0:
7714 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7715 ; CHECK-GISEL-NEXT:    add x8, x0, #32
7716 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7717 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7718 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7719 ; CHECK-GISEL-NEXT:    ld4.d { v0, v1, v2, v3 }[0], [x0]
7720 ; CHECK-GISEL-NEXT:    str x8, [x1]
7721 ; CHECK-GISEL-NEXT:    ret
7722   %ld4 = call { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld4lane.v2i64.p0(<2 x i64> %B, <2 x i64> %C, <2 x i64> %D, <2 x i64> %E, i64 0, ptr %A)
7723   %tmp = getelementptr i64, ptr %A, i32 4
7724   store ptr %tmp, ptr %ptr
7725   ret { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %ld4
7728 define { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @test_v2i64_post_reg_ld4lane(ptr %A, ptr %ptr, i64 %inc, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D, <2 x i64> %E) nounwind {
7729 ; SDAG-LABEL: test_v2i64_post_reg_ld4lane:
7730 ; SDAG:       ; %bb.0:
7731 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7732 ; SDAG-NEXT:    lsl x8, x2, #3
7733 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7734 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7735 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7736 ; SDAG-NEXT:    ld4.d { v0, v1, v2, v3 }[0], [x0], x8
7737 ; SDAG-NEXT:    str x0, [x1]
7738 ; SDAG-NEXT:    ret
7740 ; CHECK-GISEL-LABEL: test_v2i64_post_reg_ld4lane:
7741 ; CHECK-GISEL:       ; %bb.0:
7742 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7743 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
7744 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7745 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7746 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7747 ; CHECK-GISEL-NEXT:    ld4.d { v0, v1, v2, v3 }[0], [x0]
7748 ; CHECK-GISEL-NEXT:    str x8, [x1]
7749 ; CHECK-GISEL-NEXT:    ret
7750   %ld4 = call { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld4lane.v2i64.p0(<2 x i64> %B, <2 x i64> %C, <2 x i64> %D, <2 x i64> %E, i64 0, ptr %A)
7751   %tmp = getelementptr i64, ptr %A, i64 %inc
7752   store ptr %tmp, ptr %ptr
7753   ret { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %ld4
7756 declare { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld4lane.v2i64.p0(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, i64, ptr) nounwind readonly
7759 define { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @test_v1i64_post_imm_ld4lane(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, <1 x i64> %D, <1 x i64> %E) nounwind {
7760 ; SDAG-LABEL: test_v1i64_post_imm_ld4lane:
7761 ; SDAG:       ; %bb.0:
7762 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7763 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7764 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7765 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7766 ; SDAG-NEXT:    ld4.d { v0, v1, v2, v3 }[0], [x0], #32
7767 ; SDAG-NEXT:    str x0, [x1]
7768 ; SDAG-NEXT:    ret
7770 ; CHECK-GISEL-LABEL: test_v1i64_post_imm_ld4lane:
7771 ; CHECK-GISEL:       ; %bb.0:
7772 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7773 ; CHECK-GISEL-NEXT:    add x8, x0, #32
7774 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7775 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7776 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7777 ; CHECK-GISEL-NEXT:    ld4.d { v0, v1, v2, v3 }[0], [x0]
7778 ; CHECK-GISEL-NEXT:    str x8, [x1]
7779 ; CHECK-GISEL-NEXT:    ret
7780   %ld4 = call { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld4lane.v1i64.p0(<1 x i64> %B, <1 x i64> %C, <1 x i64> %D, <1 x i64> %E, i64 0, ptr %A)
7781   %tmp = getelementptr i64, ptr %A, i32 4
7782   store ptr %tmp, ptr %ptr
7783   ret { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } %ld4
7786 define { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @test_v1i64_post_reg_ld4lane(ptr %A, ptr %ptr, i64 %inc, <1 x i64> %B, <1 x i64> %C, <1 x i64> %D, <1 x i64> %E) nounwind {
7787 ; SDAG-LABEL: test_v1i64_post_reg_ld4lane:
7788 ; SDAG:       ; %bb.0:
7789 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7790 ; SDAG-NEXT:    lsl x8, x2, #3
7791 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7792 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7793 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7794 ; SDAG-NEXT:    ld4.d { v0, v1, v2, v3 }[0], [x0], x8
7795 ; SDAG-NEXT:    str x0, [x1]
7796 ; SDAG-NEXT:    ret
7798 ; CHECK-GISEL-LABEL: test_v1i64_post_reg_ld4lane:
7799 ; CHECK-GISEL:       ; %bb.0:
7800 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7801 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
7802 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7803 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7804 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7805 ; CHECK-GISEL-NEXT:    ld4.d { v0, v1, v2, v3 }[0], [x0]
7806 ; CHECK-GISEL-NEXT:    str x8, [x1]
7807 ; CHECK-GISEL-NEXT:    ret
7808   %ld4 = call { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld4lane.v1i64.p0(<1 x i64> %B, <1 x i64> %C, <1 x i64> %D, <1 x i64> %E, i64 0, ptr %A)
7809   %tmp = getelementptr i64, ptr %A, i64 %inc
7810   store ptr %tmp, ptr %ptr
7811   ret { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } %ld4
7814 declare { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @llvm.aarch64.neon.ld4lane.v1i64.p0(<1 x i64>, <1 x i64>, <1 x i64>, <1 x i64>, i64, ptr) nounwind readonly
7817 define { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @test_v4f32_post_imm_ld4lane(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, <4 x float> %D, <4 x float> %E) nounwind {
7818 ; SDAG-LABEL: test_v4f32_post_imm_ld4lane:
7819 ; SDAG:       ; %bb.0:
7820 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7821 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7822 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7823 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7824 ; SDAG-NEXT:    ld4.s { v0, v1, v2, v3 }[0], [x0], #16
7825 ; SDAG-NEXT:    str x0, [x1]
7826 ; SDAG-NEXT:    ret
7828 ; CHECK-GISEL-LABEL: test_v4f32_post_imm_ld4lane:
7829 ; CHECK-GISEL:       ; %bb.0:
7830 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7831 ; CHECK-GISEL-NEXT:    add x8, x0, #16
7832 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7833 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7834 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7835 ; CHECK-GISEL-NEXT:    ld4.s { v0, v1, v2, v3 }[0], [x0]
7836 ; CHECK-GISEL-NEXT:    str x8, [x1]
7837 ; CHECK-GISEL-NEXT:    ret
7838   %ld4 = call { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld4lane.v4f32.p0(<4 x float> %B, <4 x float> %C, <4 x float> %D, <4 x float> %E, i64 0, ptr %A)
7839   %tmp = getelementptr float, ptr %A, i32 4
7840   store ptr %tmp, ptr %ptr
7841   ret { <4 x float>, <4 x float>, <4 x float>, <4 x float> } %ld4
7844 define { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @test_v4f32_post_reg_ld4lane(ptr %A, ptr %ptr, i64 %inc, <4 x float> %B, <4 x float> %C, <4 x float> %D, <4 x float> %E) nounwind {
7845 ; SDAG-LABEL: test_v4f32_post_reg_ld4lane:
7846 ; SDAG:       ; %bb.0:
7847 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7848 ; SDAG-NEXT:    lsl x8, x2, #2
7849 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7850 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7851 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7852 ; SDAG-NEXT:    ld4.s { v0, v1, v2, v3 }[0], [x0], x8
7853 ; SDAG-NEXT:    str x0, [x1]
7854 ; SDAG-NEXT:    ret
7856 ; CHECK-GISEL-LABEL: test_v4f32_post_reg_ld4lane:
7857 ; CHECK-GISEL:       ; %bb.0:
7858 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7859 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
7860 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7861 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7862 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7863 ; CHECK-GISEL-NEXT:    ld4.s { v0, v1, v2, v3 }[0], [x0]
7864 ; CHECK-GISEL-NEXT:    str x8, [x1]
7865 ; CHECK-GISEL-NEXT:    ret
7866   %ld4 = call { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld4lane.v4f32.p0(<4 x float> %B, <4 x float> %C, <4 x float> %D, <4 x float> %E, i64 0, ptr %A)
7867   %tmp = getelementptr float, ptr %A, i64 %inc
7868   store ptr %tmp, ptr %ptr
7869   ret { <4 x float>, <4 x float>, <4 x float>, <4 x float> } %ld4
7872 declare { <4 x float>, <4 x float>, <4 x float>, <4 x float> } @llvm.aarch64.neon.ld4lane.v4f32.p0(<4 x float>, <4 x float>, <4 x float>, <4 x float>, i64, ptr) nounwind readonly
7875 define { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @test_v2f32_post_imm_ld4lane(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, <2 x float> %D, <2 x float> %E) nounwind {
7876 ; SDAG-LABEL: test_v2f32_post_imm_ld4lane:
7877 ; SDAG:       ; %bb.0:
7878 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7879 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7880 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7881 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7882 ; SDAG-NEXT:    ld4.s { v0, v1, v2, v3 }[0], [x0], #16
7883 ; SDAG-NEXT:    str x0, [x1]
7884 ; SDAG-NEXT:    ret
7886 ; CHECK-GISEL-LABEL: test_v2f32_post_imm_ld4lane:
7887 ; CHECK-GISEL:       ; %bb.0:
7888 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7889 ; CHECK-GISEL-NEXT:    add x8, x0, #16
7890 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7891 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7892 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7893 ; CHECK-GISEL-NEXT:    ld4.s { v0, v1, v2, v3 }[0], [x0]
7894 ; CHECK-GISEL-NEXT:    str x8, [x1]
7895 ; CHECK-GISEL-NEXT:    ret
7896   %ld4 = call { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld4lane.v2f32.p0(<2 x float> %B, <2 x float> %C, <2 x float> %D, <2 x float> %E, i64 0, ptr %A)
7897   %tmp = getelementptr float, ptr %A, i32 4
7898   store ptr %tmp, ptr %ptr
7899   ret { <2 x float>, <2 x float>, <2 x float>, <2 x float> } %ld4
7902 define { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @test_v2f32_post_reg_ld4lane(ptr %A, ptr %ptr, i64 %inc, <2 x float> %B, <2 x float> %C, <2 x float> %D, <2 x float> %E) nounwind {
7903 ; SDAG-LABEL: test_v2f32_post_reg_ld4lane:
7904 ; SDAG:       ; %bb.0:
7905 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7906 ; SDAG-NEXT:    lsl x8, x2, #2
7907 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7908 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7909 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7910 ; SDAG-NEXT:    ld4.s { v0, v1, v2, v3 }[0], [x0], x8
7911 ; SDAG-NEXT:    str x0, [x1]
7912 ; SDAG-NEXT:    ret
7914 ; CHECK-GISEL-LABEL: test_v2f32_post_reg_ld4lane:
7915 ; CHECK-GISEL:       ; %bb.0:
7916 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7917 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
7918 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7919 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7920 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7921 ; CHECK-GISEL-NEXT:    ld4.s { v0, v1, v2, v3 }[0], [x0]
7922 ; CHECK-GISEL-NEXT:    str x8, [x1]
7923 ; CHECK-GISEL-NEXT:    ret
7924   %ld4 = call { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld4lane.v2f32.p0(<2 x float> %B, <2 x float> %C, <2 x float> %D, <2 x float> %E, i64 0, ptr %A)
7925   %tmp = getelementptr float, ptr %A, i64 %inc
7926   store ptr %tmp, ptr %ptr
7927   ret { <2 x float>, <2 x float>, <2 x float>, <2 x float> } %ld4
7930 declare { <2 x float>, <2 x float>, <2 x float>, <2 x float> } @llvm.aarch64.neon.ld4lane.v2f32.p0(<2 x float>, <2 x float>, <2 x float>, <2 x float>, i64, ptr) nounwind readonly
7933 define { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @test_v2f64_post_imm_ld4lane(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, <2 x double> %D, <2 x double> %E) nounwind {
7934 ; SDAG-LABEL: test_v2f64_post_imm_ld4lane:
7935 ; SDAG:       ; %bb.0:
7936 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7937 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7938 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7939 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7940 ; SDAG-NEXT:    ld4.d { v0, v1, v2, v3 }[0], [x0], #32
7941 ; SDAG-NEXT:    str x0, [x1]
7942 ; SDAG-NEXT:    ret
7944 ; CHECK-GISEL-LABEL: test_v2f64_post_imm_ld4lane:
7945 ; CHECK-GISEL:       ; %bb.0:
7946 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7947 ; CHECK-GISEL-NEXT:    add x8, x0, #32
7948 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7949 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7950 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7951 ; CHECK-GISEL-NEXT:    ld4.d { v0, v1, v2, v3 }[0], [x0]
7952 ; CHECK-GISEL-NEXT:    str x8, [x1]
7953 ; CHECK-GISEL-NEXT:    ret
7954   %ld4 = call { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld4lane.v2f64.p0(<2 x double> %B, <2 x double> %C, <2 x double> %D, <2 x double> %E, i64 0, ptr %A)
7955   %tmp = getelementptr double, ptr %A, i32 4
7956   store ptr %tmp, ptr %ptr
7957   ret { <2 x double>, <2 x double>, <2 x double>, <2 x double> } %ld4
7960 define { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @test_v2f64_post_reg_ld4lane(ptr %A, ptr %ptr, i64 %inc, <2 x double> %B, <2 x double> %C, <2 x double> %D, <2 x double> %E) nounwind {
7961 ; SDAG-LABEL: test_v2f64_post_reg_ld4lane:
7962 ; SDAG:       ; %bb.0:
7963 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7964 ; SDAG-NEXT:    lsl x8, x2, #3
7965 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7966 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7967 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7968 ; SDAG-NEXT:    ld4.d { v0, v1, v2, v3 }[0], [x0], x8
7969 ; SDAG-NEXT:    str x0, [x1]
7970 ; SDAG-NEXT:    ret
7972 ; CHECK-GISEL-LABEL: test_v2f64_post_reg_ld4lane:
7973 ; CHECK-GISEL:       ; %bb.0:
7974 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7975 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
7976 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7977 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7978 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7979 ; CHECK-GISEL-NEXT:    ld4.d { v0, v1, v2, v3 }[0], [x0]
7980 ; CHECK-GISEL-NEXT:    str x8, [x1]
7981 ; CHECK-GISEL-NEXT:    ret
7982   %ld4 = call { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld4lane.v2f64.p0(<2 x double> %B, <2 x double> %C, <2 x double> %D, <2 x double> %E, i64 0, ptr %A)
7983   %tmp = getelementptr double, ptr %A, i64 %inc
7984   store ptr %tmp, ptr %ptr
7985   ret { <2 x double>, <2 x double>, <2 x double>, <2 x double> } %ld4
7988 declare { <2 x double>, <2 x double>, <2 x double>, <2 x double> } @llvm.aarch64.neon.ld4lane.v2f64.p0(<2 x double>, <2 x double>, <2 x double>, <2 x double>, i64, ptr) nounwind readonly
7991 define { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @test_v1f64_post_imm_ld4lane(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, <1 x double> %D, <1 x double> %E) nounwind {
7992 ; SDAG-LABEL: test_v1f64_post_imm_ld4lane:
7993 ; SDAG:       ; %bb.0:
7994 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7995 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7996 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7997 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
7998 ; SDAG-NEXT:    ld4.d { v0, v1, v2, v3 }[0], [x0], #32
7999 ; SDAG-NEXT:    str x0, [x1]
8000 ; SDAG-NEXT:    ret
8002 ; CHECK-GISEL-LABEL: test_v1f64_post_imm_ld4lane:
8003 ; CHECK-GISEL:       ; %bb.0:
8004 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8005 ; CHECK-GISEL-NEXT:    add x8, x0, #32
8006 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8007 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8008 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8009 ; CHECK-GISEL-NEXT:    ld4.d { v0, v1, v2, v3 }[0], [x0]
8010 ; CHECK-GISEL-NEXT:    str x8, [x1]
8011 ; CHECK-GISEL-NEXT:    ret
8012   %ld4 = call { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld4lane.v1f64.p0(<1 x double> %B, <1 x double> %C, <1 x double> %D, <1 x double> %E, i64 0, ptr %A)
8013   %tmp = getelementptr double, ptr %A, i32 4
8014   store ptr %tmp, ptr %ptr
8015   ret { <1 x double>, <1 x double>, <1 x double>, <1 x double> } %ld4
8018 define { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @test_v1f64_post_reg_ld4lane(ptr %A, ptr %ptr, i64 %inc, <1 x double> %B, <1 x double> %C, <1 x double> %D, <1 x double> %E) nounwind {
8019 ; SDAG-LABEL: test_v1f64_post_reg_ld4lane:
8020 ; SDAG:       ; %bb.0:
8021 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8022 ; SDAG-NEXT:    lsl x8, x2, #3
8023 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8024 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8025 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8026 ; SDAG-NEXT:    ld4.d { v0, v1, v2, v3 }[0], [x0], x8
8027 ; SDAG-NEXT:    str x0, [x1]
8028 ; SDAG-NEXT:    ret
8030 ; CHECK-GISEL-LABEL: test_v1f64_post_reg_ld4lane:
8031 ; CHECK-GISEL:       ; %bb.0:
8032 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8033 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
8034 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8035 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8036 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
8037 ; CHECK-GISEL-NEXT:    ld4.d { v0, v1, v2, v3 }[0], [x0]
8038 ; CHECK-GISEL-NEXT:    str x8, [x1]
8039 ; CHECK-GISEL-NEXT:    ret
8040   %ld4 = call { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld4lane.v1f64.p0(<1 x double> %B, <1 x double> %C, <1 x double> %D, <1 x double> %E, i64 0, ptr %A)
8041   %tmp = getelementptr double, ptr %A, i64 %inc
8042   store ptr %tmp, ptr %ptr
8043   ret { <1 x double>, <1 x double>, <1 x double>, <1 x double> } %ld4
8046 declare { <1 x double>, <1 x double>, <1 x double>, <1 x double> } @llvm.aarch64.neon.ld4lane.v1f64.p0(<1 x double>, <1 x double>, <1 x double>, <1 x double>, i64, ptr) nounwind readonly
8049 define ptr @test_v16i8_post_imm_st2(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C) nounwind {
8050 ; SDAG-LABEL: test_v16i8_post_imm_st2:
8051 ; SDAG:       ; %bb.0:
8052 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
8053 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
8054 ; SDAG-NEXT:    st2.16b { v0, v1 }, [x0], #32
8055 ; SDAG-NEXT:    ret
8057 ; CHECK-GISEL-LABEL: test_v16i8_post_imm_st2:
8058 ; CHECK-GISEL:       ; %bb.0:
8059 ; CHECK-GISEL-NEXT:    mov x8, x0
8060 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
8061 ; CHECK-GISEL-NEXT:    add x0, x0, #32
8062 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
8063 ; CHECK-GISEL-NEXT:    st2.16b { v0, v1 }, [x8]
8064 ; CHECK-GISEL-NEXT:    ret
8065   call void @llvm.aarch64.neon.st2.v16i8.p0(<16 x i8> %B, <16 x i8> %C, ptr %A)
8066   %tmp = getelementptr i8, ptr %A, i32 32
8067   ret ptr %tmp
8070 define ptr @test_v16i8_post_reg_st2(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, i64 %inc) nounwind {
8071 ; SDAG-LABEL: test_v16i8_post_reg_st2:
8072 ; SDAG:       ; %bb.0:
8073 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
8074 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
8075 ; SDAG-NEXT:    st2.16b { v0, v1 }, [x0], x2
8076 ; SDAG-NEXT:    ret
8078 ; CHECK-GISEL-LABEL: test_v16i8_post_reg_st2:
8079 ; CHECK-GISEL:       ; %bb.0:
8080 ; CHECK-GISEL-NEXT:    mov x8, x0
8081 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
8082 ; CHECK-GISEL-NEXT:    add x0, x0, x2
8083 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
8084 ; CHECK-GISEL-NEXT:    st2.16b { v0, v1 }, [x8]
8085 ; CHECK-GISEL-NEXT:    ret
8086   call void @llvm.aarch64.neon.st2.v16i8.p0(<16 x i8> %B, <16 x i8> %C, ptr %A)
8087   %tmp = getelementptr i8, ptr %A, i64 %inc
8088   ret ptr %tmp
8091 declare void @llvm.aarch64.neon.st2.v16i8.p0(<16 x i8>, <16 x i8>, ptr)
8094 define ptr @test_v8i8_post_imm_st2(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C) nounwind {
8095 ; SDAG-LABEL: test_v8i8_post_imm_st2:
8096 ; SDAG:       ; %bb.0:
8097 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
8098 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
8099 ; SDAG-NEXT:    st2.8b { v0, v1 }, [x0], #16
8100 ; SDAG-NEXT:    ret
8102 ; CHECK-GISEL-LABEL: test_v8i8_post_imm_st2:
8103 ; CHECK-GISEL:       ; %bb.0:
8104 ; CHECK-GISEL-NEXT:    mov x8, x0
8105 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
8106 ; CHECK-GISEL-NEXT:    add x0, x0, #16
8107 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
8108 ; CHECK-GISEL-NEXT:    st2.8b { v0, v1 }, [x8]
8109 ; CHECK-GISEL-NEXT:    ret
8110   call void @llvm.aarch64.neon.st2.v8i8.p0(<8 x i8> %B, <8 x i8> %C, ptr %A)
8111   %tmp = getelementptr i8, ptr %A, i32 16
8112   ret ptr %tmp
8115 define ptr @test_v8i8_post_reg_st2(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, i64 %inc) nounwind {
8116 ; SDAG-LABEL: test_v8i8_post_reg_st2:
8117 ; SDAG:       ; %bb.0:
8118 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
8119 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
8120 ; SDAG-NEXT:    st2.8b { v0, v1 }, [x0], x2
8121 ; SDAG-NEXT:    ret
8123 ; CHECK-GISEL-LABEL: test_v8i8_post_reg_st2:
8124 ; CHECK-GISEL:       ; %bb.0:
8125 ; CHECK-GISEL-NEXT:    mov x8, x0
8126 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
8127 ; CHECK-GISEL-NEXT:    add x0, x0, x2
8128 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
8129 ; CHECK-GISEL-NEXT:    st2.8b { v0, v1 }, [x8]
8130 ; CHECK-GISEL-NEXT:    ret
8131   call void @llvm.aarch64.neon.st2.v8i8.p0(<8 x i8> %B, <8 x i8> %C, ptr %A)
8132   %tmp = getelementptr i8, ptr %A, i64 %inc
8133   ret ptr %tmp
8136 declare void @llvm.aarch64.neon.st2.v8i8.p0(<8 x i8>, <8 x i8>, ptr)
8139 define ptr @test_v8i16_post_imm_st2(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C) nounwind {
8140 ; SDAG-LABEL: test_v8i16_post_imm_st2:
8141 ; SDAG:       ; %bb.0:
8142 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
8143 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
8144 ; SDAG-NEXT:    st2.8h { v0, v1 }, [x0], #32
8145 ; SDAG-NEXT:    ret
8147 ; CHECK-GISEL-LABEL: test_v8i16_post_imm_st2:
8148 ; CHECK-GISEL:       ; %bb.0:
8149 ; CHECK-GISEL-NEXT:    mov x8, x0
8150 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
8151 ; CHECK-GISEL-NEXT:    add x0, x0, #32
8152 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
8153 ; CHECK-GISEL-NEXT:    st2.8h { v0, v1 }, [x8]
8154 ; CHECK-GISEL-NEXT:    ret
8155   call void @llvm.aarch64.neon.st2.v8i16.p0(<8 x i16> %B, <8 x i16> %C, ptr %A)
8156   %tmp = getelementptr i16, ptr %A, i32 16
8157   ret ptr %tmp
8160 define ptr @test_v8i16_post_reg_st2(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, i64 %inc) nounwind {
8161 ; SDAG-LABEL: test_v8i16_post_reg_st2:
8162 ; SDAG:       ; %bb.0:
8163 ; SDAG-NEXT:    lsl x8, x2, #1
8164 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
8165 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
8166 ; SDAG-NEXT:    st2.8h { v0, v1 }, [x0], x8
8167 ; SDAG-NEXT:    ret
8169 ; CHECK-GISEL-LABEL: test_v8i16_post_reg_st2:
8170 ; CHECK-GISEL:       ; %bb.0:
8171 ; CHECK-GISEL-NEXT:    mov x8, x0
8172 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #1
8173 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
8174 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
8175 ; CHECK-GISEL-NEXT:    st2.8h { v0, v1 }, [x8]
8176 ; CHECK-GISEL-NEXT:    ret
8177   call void @llvm.aarch64.neon.st2.v8i16.p0(<8 x i16> %B, <8 x i16> %C, ptr %A)
8178   %tmp = getelementptr i16, ptr %A, i64 %inc
8179   ret ptr %tmp
8182 declare void @llvm.aarch64.neon.st2.v8i16.p0(<8 x i16>, <8 x i16>, ptr)
8185 define ptr @test_v4i16_post_imm_st2(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C) nounwind {
8186 ; SDAG-LABEL: test_v4i16_post_imm_st2:
8187 ; SDAG:       ; %bb.0:
8188 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
8189 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
8190 ; SDAG-NEXT:    st2.4h { v0, v1 }, [x0], #16
8191 ; SDAG-NEXT:    ret
8193 ; CHECK-GISEL-LABEL: test_v4i16_post_imm_st2:
8194 ; CHECK-GISEL:       ; %bb.0:
8195 ; CHECK-GISEL-NEXT:    mov x8, x0
8196 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
8197 ; CHECK-GISEL-NEXT:    add x0, x0, #16
8198 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
8199 ; CHECK-GISEL-NEXT:    st2.4h { v0, v1 }, [x8]
8200 ; CHECK-GISEL-NEXT:    ret
8201   call void @llvm.aarch64.neon.st2.v4i16.p0(<4 x i16> %B, <4 x i16> %C, ptr %A)
8202   %tmp = getelementptr i16, ptr %A, i32 8
8203   ret ptr %tmp
8206 define ptr @test_v4i16_post_reg_st2(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, i64 %inc) nounwind {
8207 ; SDAG-LABEL: test_v4i16_post_reg_st2:
8208 ; SDAG:       ; %bb.0:
8209 ; SDAG-NEXT:    lsl x8, x2, #1
8210 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
8211 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
8212 ; SDAG-NEXT:    st2.4h { v0, v1 }, [x0], x8
8213 ; SDAG-NEXT:    ret
8215 ; CHECK-GISEL-LABEL: test_v4i16_post_reg_st2:
8216 ; CHECK-GISEL:       ; %bb.0:
8217 ; CHECK-GISEL-NEXT:    mov x8, x0
8218 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #1
8219 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
8220 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
8221 ; CHECK-GISEL-NEXT:    st2.4h { v0, v1 }, [x8]
8222 ; CHECK-GISEL-NEXT:    ret
8223   call void @llvm.aarch64.neon.st2.v4i16.p0(<4 x i16> %B, <4 x i16> %C, ptr %A)
8224   %tmp = getelementptr i16, ptr %A, i64 %inc
8225   ret ptr %tmp
8228 declare void @llvm.aarch64.neon.st2.v4i16.p0(<4 x i16>, <4 x i16>, ptr)
8231 define ptr @test_v4i32_post_imm_st2(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C) nounwind {
8232 ; SDAG-LABEL: test_v4i32_post_imm_st2:
8233 ; SDAG:       ; %bb.0:
8234 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
8235 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
8236 ; SDAG-NEXT:    st2.4s { v0, v1 }, [x0], #32
8237 ; SDAG-NEXT:    ret
8239 ; CHECK-GISEL-LABEL: test_v4i32_post_imm_st2:
8240 ; CHECK-GISEL:       ; %bb.0:
8241 ; CHECK-GISEL-NEXT:    mov x8, x0
8242 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
8243 ; CHECK-GISEL-NEXT:    add x0, x0, #32
8244 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
8245 ; CHECK-GISEL-NEXT:    st2.4s { v0, v1 }, [x8]
8246 ; CHECK-GISEL-NEXT:    ret
8247   call void @llvm.aarch64.neon.st2.v4i32.p0(<4 x i32> %B, <4 x i32> %C, ptr %A)
8248   %tmp = getelementptr i32, ptr %A, i32 8
8249   ret ptr %tmp
8252 define ptr @test_v4i32_post_reg_st2(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, i64 %inc) nounwind {
8253 ; SDAG-LABEL: test_v4i32_post_reg_st2:
8254 ; SDAG:       ; %bb.0:
8255 ; SDAG-NEXT:    lsl x8, x2, #2
8256 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
8257 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
8258 ; SDAG-NEXT:    st2.4s { v0, v1 }, [x0], x8
8259 ; SDAG-NEXT:    ret
8261 ; CHECK-GISEL-LABEL: test_v4i32_post_reg_st2:
8262 ; CHECK-GISEL:       ; %bb.0:
8263 ; CHECK-GISEL-NEXT:    mov x8, x0
8264 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
8265 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
8266 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
8267 ; CHECK-GISEL-NEXT:    st2.4s { v0, v1 }, [x8]
8268 ; CHECK-GISEL-NEXT:    ret
8269   call void @llvm.aarch64.neon.st2.v4i32.p0(<4 x i32> %B, <4 x i32> %C, ptr %A)
8270   %tmp = getelementptr i32, ptr %A, i64 %inc
8271   ret ptr %tmp
8274 declare void @llvm.aarch64.neon.st2.v4i32.p0(<4 x i32>, <4 x i32>, ptr)
8277 define ptr @test_v2i32_post_imm_st2(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C) nounwind {
8278 ; SDAG-LABEL: test_v2i32_post_imm_st2:
8279 ; SDAG:       ; %bb.0:
8280 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
8281 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
8282 ; SDAG-NEXT:    st2.2s { v0, v1 }, [x0], #16
8283 ; SDAG-NEXT:    ret
8285 ; CHECK-GISEL-LABEL: test_v2i32_post_imm_st2:
8286 ; CHECK-GISEL:       ; %bb.0:
8287 ; CHECK-GISEL-NEXT:    mov x8, x0
8288 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
8289 ; CHECK-GISEL-NEXT:    add x0, x0, #16
8290 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
8291 ; CHECK-GISEL-NEXT:    st2.2s { v0, v1 }, [x8]
8292 ; CHECK-GISEL-NEXT:    ret
8293   call void @llvm.aarch64.neon.st2.v2i32.p0(<2 x i32> %B, <2 x i32> %C, ptr %A)
8294   %tmp = getelementptr i32, ptr %A, i32 4
8295   ret ptr %tmp
8298 define ptr @test_v2i32_post_reg_st2(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, i64 %inc) nounwind {
8299 ; SDAG-LABEL: test_v2i32_post_reg_st2:
8300 ; SDAG:       ; %bb.0:
8301 ; SDAG-NEXT:    lsl x8, x2, #2
8302 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
8303 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
8304 ; SDAG-NEXT:    st2.2s { v0, v1 }, [x0], x8
8305 ; SDAG-NEXT:    ret
8307 ; CHECK-GISEL-LABEL: test_v2i32_post_reg_st2:
8308 ; CHECK-GISEL:       ; %bb.0:
8309 ; CHECK-GISEL-NEXT:    mov x8, x0
8310 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
8311 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
8312 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
8313 ; CHECK-GISEL-NEXT:    st2.2s { v0, v1 }, [x8]
8314 ; CHECK-GISEL-NEXT:    ret
8315   call void @llvm.aarch64.neon.st2.v2i32.p0(<2 x i32> %B, <2 x i32> %C, ptr %A)
8316   %tmp = getelementptr i32, ptr %A, i64 %inc
8317   ret ptr %tmp
8320 declare void @llvm.aarch64.neon.st2.v2i32.p0(<2 x i32>, <2 x i32>, ptr)
8323 define ptr @test_v2i64_post_imm_st2(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C) nounwind {
8324 ; SDAG-LABEL: test_v2i64_post_imm_st2:
8325 ; SDAG:       ; %bb.0:
8326 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
8327 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
8328 ; SDAG-NEXT:    st2.2d { v0, v1 }, [x0], #32
8329 ; SDAG-NEXT:    ret
8331 ; CHECK-GISEL-LABEL: test_v2i64_post_imm_st2:
8332 ; CHECK-GISEL:       ; %bb.0:
8333 ; CHECK-GISEL-NEXT:    mov x8, x0
8334 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
8335 ; CHECK-GISEL-NEXT:    add x0, x0, #32
8336 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
8337 ; CHECK-GISEL-NEXT:    st2.2d { v0, v1 }, [x8]
8338 ; CHECK-GISEL-NEXT:    ret
8339   call void @llvm.aarch64.neon.st2.v2i64.p0(<2 x i64> %B, <2 x i64> %C, ptr %A)
8340   %tmp = getelementptr i64, ptr %A, i64 4
8341   ret ptr %tmp
8344 define ptr @test_v2i64_post_reg_st2(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, i64 %inc) nounwind {
8345 ; SDAG-LABEL: test_v2i64_post_reg_st2:
8346 ; SDAG:       ; %bb.0:
8347 ; SDAG-NEXT:    lsl x8, x2, #3
8348 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
8349 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
8350 ; SDAG-NEXT:    st2.2d { v0, v1 }, [x0], x8
8351 ; SDAG-NEXT:    ret
8353 ; CHECK-GISEL-LABEL: test_v2i64_post_reg_st2:
8354 ; CHECK-GISEL:       ; %bb.0:
8355 ; CHECK-GISEL-NEXT:    mov x8, x0
8356 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
8357 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
8358 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
8359 ; CHECK-GISEL-NEXT:    st2.2d { v0, v1 }, [x8]
8360 ; CHECK-GISEL-NEXT:    ret
8361   call void @llvm.aarch64.neon.st2.v2i64.p0(<2 x i64> %B, <2 x i64> %C, ptr %A)
8362   %tmp = getelementptr i64, ptr %A, i64 %inc
8363   ret ptr %tmp
8366 declare void @llvm.aarch64.neon.st2.v2i64.p0(<2 x i64>, <2 x i64>, ptr)
8369 define ptr @test_v1i64_post_imm_st2(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C) nounwind {
8370 ; SDAG-LABEL: test_v1i64_post_imm_st2:
8371 ; SDAG:       ; %bb.0:
8372 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
8373 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
8374 ; SDAG-NEXT:    st1.1d { v0, v1 }, [x0], #16
8375 ; SDAG-NEXT:    ret
8377 ; CHECK-GISEL-LABEL: test_v1i64_post_imm_st2:
8378 ; CHECK-GISEL:       ; %bb.0:
8379 ; CHECK-GISEL-NEXT:    mov x8, x0
8380 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
8381 ; CHECK-GISEL-NEXT:    add x0, x0, #16
8382 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
8383 ; CHECK-GISEL-NEXT:    st1.1d { v0, v1 }, [x8]
8384 ; CHECK-GISEL-NEXT:    ret
8385   call void @llvm.aarch64.neon.st2.v1i64.p0(<1 x i64> %B, <1 x i64> %C, ptr %A)
8386   %tmp = getelementptr i64, ptr %A, i64 2
8387   ret ptr %tmp
8390 define ptr @test_v1i64_post_reg_st2(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, i64 %inc) nounwind {
8391 ; SDAG-LABEL: test_v1i64_post_reg_st2:
8392 ; SDAG:       ; %bb.0:
8393 ; SDAG-NEXT:    lsl x8, x2, #3
8394 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
8395 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
8396 ; SDAG-NEXT:    st1.1d { v0, v1 }, [x0], x8
8397 ; SDAG-NEXT:    ret
8399 ; CHECK-GISEL-LABEL: test_v1i64_post_reg_st2:
8400 ; CHECK-GISEL:       ; %bb.0:
8401 ; CHECK-GISEL-NEXT:    mov x8, x0
8402 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
8403 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
8404 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
8405 ; CHECK-GISEL-NEXT:    st1.1d { v0, v1 }, [x8]
8406 ; CHECK-GISEL-NEXT:    ret
8407   call void @llvm.aarch64.neon.st2.v1i64.p0(<1 x i64> %B, <1 x i64> %C, ptr %A)
8408   %tmp = getelementptr i64, ptr %A, i64 %inc
8409   ret ptr %tmp
8412 declare void @llvm.aarch64.neon.st2.v1i64.p0(<1 x i64>, <1 x i64>, ptr)
8415 define ptr @test_v4f32_post_imm_st2(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C) nounwind {
8416 ; SDAG-LABEL: test_v4f32_post_imm_st2:
8417 ; SDAG:       ; %bb.0:
8418 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
8419 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
8420 ; SDAG-NEXT:    st2.4s { v0, v1 }, [x0], #32
8421 ; SDAG-NEXT:    ret
8423 ; CHECK-GISEL-LABEL: test_v4f32_post_imm_st2:
8424 ; CHECK-GISEL:       ; %bb.0:
8425 ; CHECK-GISEL-NEXT:    mov x8, x0
8426 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
8427 ; CHECK-GISEL-NEXT:    add x0, x0, #32
8428 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
8429 ; CHECK-GISEL-NEXT:    st2.4s { v0, v1 }, [x8]
8430 ; CHECK-GISEL-NEXT:    ret
8431   call void @llvm.aarch64.neon.st2.v4f32.p0(<4 x float> %B, <4 x float> %C, ptr %A)
8432   %tmp = getelementptr float, ptr %A, i32 8
8433   ret ptr %tmp
8436 define ptr @test_v4f32_post_reg_st2(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, i64 %inc) nounwind {
8437 ; SDAG-LABEL: test_v4f32_post_reg_st2:
8438 ; SDAG:       ; %bb.0:
8439 ; SDAG-NEXT:    lsl x8, x2, #2
8440 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
8441 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
8442 ; SDAG-NEXT:    st2.4s { v0, v1 }, [x0], x8
8443 ; SDAG-NEXT:    ret
8445 ; CHECK-GISEL-LABEL: test_v4f32_post_reg_st2:
8446 ; CHECK-GISEL:       ; %bb.0:
8447 ; CHECK-GISEL-NEXT:    mov x8, x0
8448 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
8449 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
8450 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
8451 ; CHECK-GISEL-NEXT:    st2.4s { v0, v1 }, [x8]
8452 ; CHECK-GISEL-NEXT:    ret
8453   call void @llvm.aarch64.neon.st2.v4f32.p0(<4 x float> %B, <4 x float> %C, ptr %A)
8454   %tmp = getelementptr float, ptr %A, i64 %inc
8455   ret ptr %tmp
8458 declare void @llvm.aarch64.neon.st2.v4f32.p0(<4 x float>, <4 x float>, ptr)
8461 define ptr @test_v2f32_post_imm_st2(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C) nounwind {
8462 ; SDAG-LABEL: test_v2f32_post_imm_st2:
8463 ; SDAG:       ; %bb.0:
8464 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
8465 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
8466 ; SDAG-NEXT:    st2.2s { v0, v1 }, [x0], #16
8467 ; SDAG-NEXT:    ret
8469 ; CHECK-GISEL-LABEL: test_v2f32_post_imm_st2:
8470 ; CHECK-GISEL:       ; %bb.0:
8471 ; CHECK-GISEL-NEXT:    mov x8, x0
8472 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
8473 ; CHECK-GISEL-NEXT:    add x0, x0, #16
8474 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
8475 ; CHECK-GISEL-NEXT:    st2.2s { v0, v1 }, [x8]
8476 ; CHECK-GISEL-NEXT:    ret
8477   call void @llvm.aarch64.neon.st2.v2f32.p0(<2 x float> %B, <2 x float> %C, ptr %A)
8478   %tmp = getelementptr float, ptr %A, i32 4
8479   ret ptr %tmp
8482 define ptr @test_v2f32_post_reg_st2(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, i64 %inc) nounwind {
8483 ; SDAG-LABEL: test_v2f32_post_reg_st2:
8484 ; SDAG:       ; %bb.0:
8485 ; SDAG-NEXT:    lsl x8, x2, #2
8486 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
8487 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
8488 ; SDAG-NEXT:    st2.2s { v0, v1 }, [x0], x8
8489 ; SDAG-NEXT:    ret
8491 ; CHECK-GISEL-LABEL: test_v2f32_post_reg_st2:
8492 ; CHECK-GISEL:       ; %bb.0:
8493 ; CHECK-GISEL-NEXT:    mov x8, x0
8494 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
8495 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
8496 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
8497 ; CHECK-GISEL-NEXT:    st2.2s { v0, v1 }, [x8]
8498 ; CHECK-GISEL-NEXT:    ret
8499   call void @llvm.aarch64.neon.st2.v2f32.p0(<2 x float> %B, <2 x float> %C, ptr %A)
8500   %tmp = getelementptr float, ptr %A, i64 %inc
8501   ret ptr %tmp
8504 declare void @llvm.aarch64.neon.st2.v2f32.p0(<2 x float>, <2 x float>, ptr)
8507 define ptr @test_v2f64_post_imm_st2(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C) nounwind {
8508 ; SDAG-LABEL: test_v2f64_post_imm_st2:
8509 ; SDAG:       ; %bb.0:
8510 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
8511 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
8512 ; SDAG-NEXT:    st2.2d { v0, v1 }, [x0], #32
8513 ; SDAG-NEXT:    ret
8515 ; CHECK-GISEL-LABEL: test_v2f64_post_imm_st2:
8516 ; CHECK-GISEL:       ; %bb.0:
8517 ; CHECK-GISEL-NEXT:    mov x8, x0
8518 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
8519 ; CHECK-GISEL-NEXT:    add x0, x0, #32
8520 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
8521 ; CHECK-GISEL-NEXT:    st2.2d { v0, v1 }, [x8]
8522 ; CHECK-GISEL-NEXT:    ret
8523   call void @llvm.aarch64.neon.st2.v2f64.p0(<2 x double> %B, <2 x double> %C, ptr %A)
8524   %tmp = getelementptr double, ptr %A, i64 4
8525   ret ptr %tmp
8528 define ptr @test_v2f64_post_reg_st2(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, i64 %inc) nounwind {
8529 ; SDAG-LABEL: test_v2f64_post_reg_st2:
8530 ; SDAG:       ; %bb.0:
8531 ; SDAG-NEXT:    lsl x8, x2, #3
8532 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
8533 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
8534 ; SDAG-NEXT:    st2.2d { v0, v1 }, [x0], x8
8535 ; SDAG-NEXT:    ret
8537 ; CHECK-GISEL-LABEL: test_v2f64_post_reg_st2:
8538 ; CHECK-GISEL:       ; %bb.0:
8539 ; CHECK-GISEL-NEXT:    mov x8, x0
8540 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
8541 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
8542 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
8543 ; CHECK-GISEL-NEXT:    st2.2d { v0, v1 }, [x8]
8544 ; CHECK-GISEL-NEXT:    ret
8545   call void @llvm.aarch64.neon.st2.v2f64.p0(<2 x double> %B, <2 x double> %C, ptr %A)
8546   %tmp = getelementptr double, ptr %A, i64 %inc
8547   ret ptr %tmp
8550 declare void @llvm.aarch64.neon.st2.v2f64.p0(<2 x double>, <2 x double>, ptr)
8553 define ptr @test_v1f64_post_imm_st2(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C) nounwind {
8554 ; SDAG-LABEL: test_v1f64_post_imm_st2:
8555 ; SDAG:       ; %bb.0:
8556 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
8557 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
8558 ; SDAG-NEXT:    st1.1d { v0, v1 }, [x0], #16
8559 ; SDAG-NEXT:    ret
8561 ; CHECK-GISEL-LABEL: test_v1f64_post_imm_st2:
8562 ; CHECK-GISEL:       ; %bb.0:
8563 ; CHECK-GISEL-NEXT:    mov x8, x0
8564 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
8565 ; CHECK-GISEL-NEXT:    add x0, x0, #16
8566 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
8567 ; CHECK-GISEL-NEXT:    st1.1d { v0, v1 }, [x8]
8568 ; CHECK-GISEL-NEXT:    ret
8569   call void @llvm.aarch64.neon.st2.v1f64.p0(<1 x double> %B, <1 x double> %C, ptr %A)
8570   %tmp = getelementptr double, ptr %A, i64 2
8571   ret ptr %tmp
8574 define ptr @test_v1f64_post_reg_st2(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, i64 %inc) nounwind {
8575 ; SDAG-LABEL: test_v1f64_post_reg_st2:
8576 ; SDAG:       ; %bb.0:
8577 ; SDAG-NEXT:    lsl x8, x2, #3
8578 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
8579 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
8580 ; SDAG-NEXT:    st1.1d { v0, v1 }, [x0], x8
8581 ; SDAG-NEXT:    ret
8583 ; CHECK-GISEL-LABEL: test_v1f64_post_reg_st2:
8584 ; CHECK-GISEL:       ; %bb.0:
8585 ; CHECK-GISEL-NEXT:    mov x8, x0
8586 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
8587 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
8588 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
8589 ; CHECK-GISEL-NEXT:    st1.1d { v0, v1 }, [x8]
8590 ; CHECK-GISEL-NEXT:    ret
8591   call void @llvm.aarch64.neon.st2.v1f64.p0(<1 x double> %B, <1 x double> %C, ptr %A)
8592   %tmp = getelementptr double, ptr %A, i64 %inc
8593   ret ptr %tmp
8596 declare void @llvm.aarch64.neon.st2.v1f64.p0(<1 x double>, <1 x double>, ptr)
8599 define ptr @test_v16i8_post_imm_st3(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D) nounwind {
8600 ; SDAG-LABEL: test_v16i8_post_imm_st3:
8601 ; SDAG:       ; %bb.0:
8602 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
8603 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
8604 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
8605 ; SDAG-NEXT:    st3.16b { v0, v1, v2 }, [x0], #48
8606 ; SDAG-NEXT:    ret
8608 ; CHECK-GISEL-LABEL: test_v16i8_post_imm_st3:
8609 ; CHECK-GISEL:       ; %bb.0:
8610 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
8611 ; CHECK-GISEL-NEXT:    mov x8, x0
8612 ; CHECK-GISEL-NEXT:    add x0, x0, #48
8613 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
8614 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
8615 ; CHECK-GISEL-NEXT:    st3.16b { v0, v1, v2 }, [x8]
8616 ; CHECK-GISEL-NEXT:    ret
8617   call void @llvm.aarch64.neon.st3.v16i8.p0(<16 x i8> %B, <16 x i8> %C, <16 x i8> %D, ptr %A)
8618   %tmp = getelementptr i8, ptr %A, i32 48
8619   ret ptr %tmp
8622 define ptr @test_v16i8_post_reg_st3(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D, i64 %inc) nounwind {
8623 ; SDAG-LABEL: test_v16i8_post_reg_st3:
8624 ; SDAG:       ; %bb.0:
8625 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
8626 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
8627 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
8628 ; SDAG-NEXT:    st3.16b { v0, v1, v2 }, [x0], x2
8629 ; SDAG-NEXT:    ret
8631 ; CHECK-GISEL-LABEL: test_v16i8_post_reg_st3:
8632 ; CHECK-GISEL:       ; %bb.0:
8633 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
8634 ; CHECK-GISEL-NEXT:    mov x8, x0
8635 ; CHECK-GISEL-NEXT:    add x0, x0, x2
8636 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
8637 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
8638 ; CHECK-GISEL-NEXT:    st3.16b { v0, v1, v2 }, [x8]
8639 ; CHECK-GISEL-NEXT:    ret
8640   call void @llvm.aarch64.neon.st3.v16i8.p0(<16 x i8> %B, <16 x i8> %C, <16 x i8> %D, ptr %A)
8641   %tmp = getelementptr i8, ptr %A, i64 %inc
8642   ret ptr %tmp
8645 declare void @llvm.aarch64.neon.st3.v16i8.p0(<16 x i8>, <16 x i8>, <16 x i8>, ptr)
8648 define ptr @test_v8i8_post_imm_st3(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, <8 x i8> %D) nounwind {
8649 ; SDAG-LABEL: test_v8i8_post_imm_st3:
8650 ; SDAG:       ; %bb.0:
8651 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
8652 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
8653 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
8654 ; SDAG-NEXT:    st3.8b { v0, v1, v2 }, [x0], #24
8655 ; SDAG-NEXT:    ret
8657 ; CHECK-GISEL-LABEL: test_v8i8_post_imm_st3:
8658 ; CHECK-GISEL:       ; %bb.0:
8659 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
8660 ; CHECK-GISEL-NEXT:    mov x8, x0
8661 ; CHECK-GISEL-NEXT:    add x0, x0, #24
8662 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
8663 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
8664 ; CHECK-GISEL-NEXT:    st3.8b { v0, v1, v2 }, [x8]
8665 ; CHECK-GISEL-NEXT:    ret
8666   call void @llvm.aarch64.neon.st3.v8i8.p0(<8 x i8> %B, <8 x i8> %C, <8 x i8> %D, ptr %A)
8667   %tmp = getelementptr i8, ptr %A, i32 24
8668   ret ptr %tmp
8671 define ptr @test_v8i8_post_reg_st3(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, <8 x i8> %D, i64 %inc) nounwind {
8672 ; SDAG-LABEL: test_v8i8_post_reg_st3:
8673 ; SDAG:       ; %bb.0:
8674 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
8675 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
8676 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
8677 ; SDAG-NEXT:    st3.8b { v0, v1, v2 }, [x0], x2
8678 ; SDAG-NEXT:    ret
8680 ; CHECK-GISEL-LABEL: test_v8i8_post_reg_st3:
8681 ; CHECK-GISEL:       ; %bb.0:
8682 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
8683 ; CHECK-GISEL-NEXT:    mov x8, x0
8684 ; CHECK-GISEL-NEXT:    add x0, x0, x2
8685 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
8686 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
8687 ; CHECK-GISEL-NEXT:    st3.8b { v0, v1, v2 }, [x8]
8688 ; CHECK-GISEL-NEXT:    ret
8689   call void @llvm.aarch64.neon.st3.v8i8.p0(<8 x i8> %B, <8 x i8> %C, <8 x i8> %D, ptr %A)
8690   %tmp = getelementptr i8, ptr %A, i64 %inc
8691   ret ptr %tmp
8694 declare void @llvm.aarch64.neon.st3.v8i8.p0(<8 x i8>, <8 x i8>, <8 x i8>, ptr)
8697 define ptr @test_v8i16_post_imm_st3(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D) nounwind {
8698 ; SDAG-LABEL: test_v8i16_post_imm_st3:
8699 ; SDAG:       ; %bb.0:
8700 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
8701 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
8702 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
8703 ; SDAG-NEXT:    st3.8h { v0, v1, v2 }, [x0], #48
8704 ; SDAG-NEXT:    ret
8706 ; CHECK-GISEL-LABEL: test_v8i16_post_imm_st3:
8707 ; CHECK-GISEL:       ; %bb.0:
8708 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
8709 ; CHECK-GISEL-NEXT:    mov x8, x0
8710 ; CHECK-GISEL-NEXT:    add x0, x0, #48
8711 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
8712 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
8713 ; CHECK-GISEL-NEXT:    st3.8h { v0, v1, v2 }, [x8]
8714 ; CHECK-GISEL-NEXT:    ret
8715   call void @llvm.aarch64.neon.st3.v8i16.p0(<8 x i16> %B, <8 x i16> %C, <8 x i16> %D, ptr %A)
8716   %tmp = getelementptr i16, ptr %A, i32 24
8717   ret ptr %tmp
8720 define ptr @test_v8i16_post_reg_st3(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D, i64 %inc) nounwind {
8721 ; SDAG-LABEL: test_v8i16_post_reg_st3:
8722 ; SDAG:       ; %bb.0:
8723 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
8724 ; SDAG-NEXT:    lsl x8, x2, #1
8725 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
8726 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
8727 ; SDAG-NEXT:    st3.8h { v0, v1, v2 }, [x0], x8
8728 ; SDAG-NEXT:    ret
8730 ; CHECK-GISEL-LABEL: test_v8i16_post_reg_st3:
8731 ; CHECK-GISEL:       ; %bb.0:
8732 ; CHECK-GISEL-NEXT:    mov x8, x0
8733 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
8734 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #1
8735 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
8736 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
8737 ; CHECK-GISEL-NEXT:    st3.8h { v0, v1, v2 }, [x8]
8738 ; CHECK-GISEL-NEXT:    ret
8739   call void @llvm.aarch64.neon.st3.v8i16.p0(<8 x i16> %B, <8 x i16> %C, <8 x i16> %D, ptr %A)
8740   %tmp = getelementptr i16, ptr %A, i64 %inc
8741   ret ptr %tmp
8744 declare void @llvm.aarch64.neon.st3.v8i16.p0(<8 x i16>, <8 x i16>, <8 x i16>, ptr)
8747 define ptr @test_v4i16_post_imm_st3(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, <4 x i16> %D) nounwind {
8748 ; SDAG-LABEL: test_v4i16_post_imm_st3:
8749 ; SDAG:       ; %bb.0:
8750 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
8751 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
8752 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
8753 ; SDAG-NEXT:    st3.4h { v0, v1, v2 }, [x0], #24
8754 ; SDAG-NEXT:    ret
8756 ; CHECK-GISEL-LABEL: test_v4i16_post_imm_st3:
8757 ; CHECK-GISEL:       ; %bb.0:
8758 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
8759 ; CHECK-GISEL-NEXT:    mov x8, x0
8760 ; CHECK-GISEL-NEXT:    add x0, x0, #24
8761 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
8762 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
8763 ; CHECK-GISEL-NEXT:    st3.4h { v0, v1, v2 }, [x8]
8764 ; CHECK-GISEL-NEXT:    ret
8765   call void @llvm.aarch64.neon.st3.v4i16.p0(<4 x i16> %B, <4 x i16> %C, <4 x i16> %D, ptr %A)
8766   %tmp = getelementptr i16, ptr %A, i32 12
8767   ret ptr %tmp
8770 define ptr @test_v4i16_post_reg_st3(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, <4 x i16> %D, i64 %inc) nounwind {
8771 ; SDAG-LABEL: test_v4i16_post_reg_st3:
8772 ; SDAG:       ; %bb.0:
8773 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
8774 ; SDAG-NEXT:    lsl x8, x2, #1
8775 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
8776 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
8777 ; SDAG-NEXT:    st3.4h { v0, v1, v2 }, [x0], x8
8778 ; SDAG-NEXT:    ret
8780 ; CHECK-GISEL-LABEL: test_v4i16_post_reg_st3:
8781 ; CHECK-GISEL:       ; %bb.0:
8782 ; CHECK-GISEL-NEXT:    mov x8, x0
8783 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
8784 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #1
8785 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
8786 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
8787 ; CHECK-GISEL-NEXT:    st3.4h { v0, v1, v2 }, [x8]
8788 ; CHECK-GISEL-NEXT:    ret
8789   call void @llvm.aarch64.neon.st3.v4i16.p0(<4 x i16> %B, <4 x i16> %C, <4 x i16> %D, ptr %A)
8790   %tmp = getelementptr i16, ptr %A, i64 %inc
8791   ret ptr %tmp
8794 declare void @llvm.aarch64.neon.st3.v4i16.p0(<4 x i16>, <4 x i16>, <4 x i16>, ptr)
8797 define ptr @test_v4i32_post_imm_st3(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D) nounwind {
8798 ; SDAG-LABEL: test_v4i32_post_imm_st3:
8799 ; SDAG:       ; %bb.0:
8800 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
8801 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
8802 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
8803 ; SDAG-NEXT:    st3.4s { v0, v1, v2 }, [x0], #48
8804 ; SDAG-NEXT:    ret
8806 ; CHECK-GISEL-LABEL: test_v4i32_post_imm_st3:
8807 ; CHECK-GISEL:       ; %bb.0:
8808 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
8809 ; CHECK-GISEL-NEXT:    mov x8, x0
8810 ; CHECK-GISEL-NEXT:    add x0, x0, #48
8811 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
8812 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
8813 ; CHECK-GISEL-NEXT:    st3.4s { v0, v1, v2 }, [x8]
8814 ; CHECK-GISEL-NEXT:    ret
8815   call void @llvm.aarch64.neon.st3.v4i32.p0(<4 x i32> %B, <4 x i32> %C, <4 x i32> %D, ptr %A)
8816   %tmp = getelementptr i32, ptr %A, i32 12
8817   ret ptr %tmp
8820 define ptr @test_v4i32_post_reg_st3(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D, i64 %inc) nounwind {
8821 ; SDAG-LABEL: test_v4i32_post_reg_st3:
8822 ; SDAG:       ; %bb.0:
8823 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
8824 ; SDAG-NEXT:    lsl x8, x2, #2
8825 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
8826 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
8827 ; SDAG-NEXT:    st3.4s { v0, v1, v2 }, [x0], x8
8828 ; SDAG-NEXT:    ret
8830 ; CHECK-GISEL-LABEL: test_v4i32_post_reg_st3:
8831 ; CHECK-GISEL:       ; %bb.0:
8832 ; CHECK-GISEL-NEXT:    mov x8, x0
8833 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
8834 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
8835 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
8836 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
8837 ; CHECK-GISEL-NEXT:    st3.4s { v0, v1, v2 }, [x8]
8838 ; CHECK-GISEL-NEXT:    ret
8839   call void @llvm.aarch64.neon.st3.v4i32.p0(<4 x i32> %B, <4 x i32> %C, <4 x i32> %D, ptr %A)
8840   %tmp = getelementptr i32, ptr %A, i64 %inc
8841   ret ptr %tmp
8844 declare void @llvm.aarch64.neon.st3.v4i32.p0(<4 x i32>, <4 x i32>, <4 x i32>, ptr)
8847 define ptr @test_v2i32_post_imm_st3(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, <2 x i32> %D) nounwind {
8848 ; SDAG-LABEL: test_v2i32_post_imm_st3:
8849 ; SDAG:       ; %bb.0:
8850 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
8851 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
8852 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
8853 ; SDAG-NEXT:    st3.2s { v0, v1, v2 }, [x0], #24
8854 ; SDAG-NEXT:    ret
8856 ; CHECK-GISEL-LABEL: test_v2i32_post_imm_st3:
8857 ; CHECK-GISEL:       ; %bb.0:
8858 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
8859 ; CHECK-GISEL-NEXT:    mov x8, x0
8860 ; CHECK-GISEL-NEXT:    add x0, x0, #24
8861 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
8862 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
8863 ; CHECK-GISEL-NEXT:    st3.2s { v0, v1, v2 }, [x8]
8864 ; CHECK-GISEL-NEXT:    ret
8865   call void @llvm.aarch64.neon.st3.v2i32.p0(<2 x i32> %B, <2 x i32> %C, <2 x i32> %D, ptr %A)
8866   %tmp = getelementptr i32, ptr %A, i32 6
8867   ret ptr %tmp
8870 define ptr @test_v2i32_post_reg_st3(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, <2 x i32> %D, i64 %inc) nounwind {
8871 ; SDAG-LABEL: test_v2i32_post_reg_st3:
8872 ; SDAG:       ; %bb.0:
8873 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
8874 ; SDAG-NEXT:    lsl x8, x2, #2
8875 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
8876 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
8877 ; SDAG-NEXT:    st3.2s { v0, v1, v2 }, [x0], x8
8878 ; SDAG-NEXT:    ret
8880 ; CHECK-GISEL-LABEL: test_v2i32_post_reg_st3:
8881 ; CHECK-GISEL:       ; %bb.0:
8882 ; CHECK-GISEL-NEXT:    mov x8, x0
8883 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
8884 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
8885 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
8886 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
8887 ; CHECK-GISEL-NEXT:    st3.2s { v0, v1, v2 }, [x8]
8888 ; CHECK-GISEL-NEXT:    ret
8889   call void @llvm.aarch64.neon.st3.v2i32.p0(<2 x i32> %B, <2 x i32> %C, <2 x i32> %D, ptr %A)
8890   %tmp = getelementptr i32, ptr %A, i64 %inc
8891   ret ptr %tmp
8894 declare void @llvm.aarch64.neon.st3.v2i32.p0(<2 x i32>, <2 x i32>, <2 x i32>, ptr)
8897 define ptr @test_v2i64_post_imm_st3(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D) nounwind {
8898 ; SDAG-LABEL: test_v2i64_post_imm_st3:
8899 ; SDAG:       ; %bb.0:
8900 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
8901 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
8902 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
8903 ; SDAG-NEXT:    st3.2d { v0, v1, v2 }, [x0], #48
8904 ; SDAG-NEXT:    ret
8906 ; CHECK-GISEL-LABEL: test_v2i64_post_imm_st3:
8907 ; CHECK-GISEL:       ; %bb.0:
8908 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
8909 ; CHECK-GISEL-NEXT:    mov x8, x0
8910 ; CHECK-GISEL-NEXT:    add x0, x0, #48
8911 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
8912 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
8913 ; CHECK-GISEL-NEXT:    st3.2d { v0, v1, v2 }, [x8]
8914 ; CHECK-GISEL-NEXT:    ret
8915   call void @llvm.aarch64.neon.st3.v2i64.p0(<2 x i64> %B, <2 x i64> %C, <2 x i64> %D, ptr %A)
8916   %tmp = getelementptr i64, ptr %A, i64 6
8917   ret ptr %tmp
8920 define ptr @test_v2i64_post_reg_st3(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D, i64 %inc) nounwind {
8921 ; SDAG-LABEL: test_v2i64_post_reg_st3:
8922 ; SDAG:       ; %bb.0:
8923 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
8924 ; SDAG-NEXT:    lsl x8, x2, #3
8925 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
8926 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
8927 ; SDAG-NEXT:    st3.2d { v0, v1, v2 }, [x0], x8
8928 ; SDAG-NEXT:    ret
8930 ; CHECK-GISEL-LABEL: test_v2i64_post_reg_st3:
8931 ; CHECK-GISEL:       ; %bb.0:
8932 ; CHECK-GISEL-NEXT:    mov x8, x0
8933 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
8934 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
8935 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
8936 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
8937 ; CHECK-GISEL-NEXT:    st3.2d { v0, v1, v2 }, [x8]
8938 ; CHECK-GISEL-NEXT:    ret
8939   call void @llvm.aarch64.neon.st3.v2i64.p0(<2 x i64> %B, <2 x i64> %C, <2 x i64> %D, ptr %A)
8940   %tmp = getelementptr i64, ptr %A, i64 %inc
8941   ret ptr %tmp
8944 declare void @llvm.aarch64.neon.st3.v2i64.p0(<2 x i64>, <2 x i64>, <2 x i64>, ptr)
8947 define ptr @test_v1i64_post_imm_st3(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, <1 x i64> %D) nounwind {
8948 ; SDAG-LABEL: test_v1i64_post_imm_st3:
8949 ; SDAG:       ; %bb.0:
8950 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
8951 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
8952 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
8953 ; SDAG-NEXT:    st1.1d { v0, v1, v2 }, [x0], #24
8954 ; SDAG-NEXT:    ret
8956 ; CHECK-GISEL-LABEL: test_v1i64_post_imm_st3:
8957 ; CHECK-GISEL:       ; %bb.0:
8958 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
8959 ; CHECK-GISEL-NEXT:    mov x8, x0
8960 ; CHECK-GISEL-NEXT:    add x0, x0, #24
8961 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
8962 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
8963 ; CHECK-GISEL-NEXT:    st1.1d { v0, v1, v2 }, [x8]
8964 ; CHECK-GISEL-NEXT:    ret
8965   call void @llvm.aarch64.neon.st3.v1i64.p0(<1 x i64> %B, <1 x i64> %C, <1 x i64> %D, ptr %A)
8966   %tmp = getelementptr i64, ptr %A, i64 3
8967   ret ptr %tmp
8970 define ptr @test_v1i64_post_reg_st3(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, <1 x i64> %D, i64 %inc) nounwind {
8971 ; SDAG-LABEL: test_v1i64_post_reg_st3:
8972 ; SDAG:       ; %bb.0:
8973 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
8974 ; SDAG-NEXT:    lsl x8, x2, #3
8975 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
8976 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
8977 ; SDAG-NEXT:    st1.1d { v0, v1, v2 }, [x0], x8
8978 ; SDAG-NEXT:    ret
8980 ; CHECK-GISEL-LABEL: test_v1i64_post_reg_st3:
8981 ; CHECK-GISEL:       ; %bb.0:
8982 ; CHECK-GISEL-NEXT:    mov x8, x0
8983 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
8984 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
8985 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
8986 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
8987 ; CHECK-GISEL-NEXT:    st1.1d { v0, v1, v2 }, [x8]
8988 ; CHECK-GISEL-NEXT:    ret
8989   call void @llvm.aarch64.neon.st3.v1i64.p0(<1 x i64> %B, <1 x i64> %C, <1 x i64> %D, ptr %A)
8990   %tmp = getelementptr i64, ptr %A, i64 %inc
8991   ret ptr %tmp
8994 declare void @llvm.aarch64.neon.st3.v1i64.p0(<1 x i64>, <1 x i64>, <1 x i64>, ptr)
8997 define ptr @test_v4f32_post_imm_st3(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, <4 x float> %D) nounwind {
8998 ; SDAG-LABEL: test_v4f32_post_imm_st3:
8999 ; SDAG:       ; %bb.0:
9000 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
9001 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
9002 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
9003 ; SDAG-NEXT:    st3.4s { v0, v1, v2 }, [x0], #48
9004 ; SDAG-NEXT:    ret
9006 ; CHECK-GISEL-LABEL: test_v4f32_post_imm_st3:
9007 ; CHECK-GISEL:       ; %bb.0:
9008 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
9009 ; CHECK-GISEL-NEXT:    mov x8, x0
9010 ; CHECK-GISEL-NEXT:    add x0, x0, #48
9011 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
9012 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
9013 ; CHECK-GISEL-NEXT:    st3.4s { v0, v1, v2 }, [x8]
9014 ; CHECK-GISEL-NEXT:    ret
9015   call void @llvm.aarch64.neon.st3.v4f32.p0(<4 x float> %B, <4 x float> %C, <4 x float> %D, ptr %A)
9016   %tmp = getelementptr float, ptr %A, i32 12
9017   ret ptr %tmp
9020 define ptr @test_v4f32_post_reg_st3(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, <4 x float> %D, i64 %inc) nounwind {
9021 ; SDAG-LABEL: test_v4f32_post_reg_st3:
9022 ; SDAG:       ; %bb.0:
9023 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
9024 ; SDAG-NEXT:    lsl x8, x2, #2
9025 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
9026 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
9027 ; SDAG-NEXT:    st3.4s { v0, v1, v2 }, [x0], x8
9028 ; SDAG-NEXT:    ret
9030 ; CHECK-GISEL-LABEL: test_v4f32_post_reg_st3:
9031 ; CHECK-GISEL:       ; %bb.0:
9032 ; CHECK-GISEL-NEXT:    mov x8, x0
9033 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
9034 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
9035 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
9036 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
9037 ; CHECK-GISEL-NEXT:    st3.4s { v0, v1, v2 }, [x8]
9038 ; CHECK-GISEL-NEXT:    ret
9039   call void @llvm.aarch64.neon.st3.v4f32.p0(<4 x float> %B, <4 x float> %C, <4 x float> %D, ptr %A)
9040   %tmp = getelementptr float, ptr %A, i64 %inc
9041   ret ptr %tmp
9044 declare void @llvm.aarch64.neon.st3.v4f32.p0(<4 x float>, <4 x float>, <4 x float>, ptr)
9047 define ptr @test_v2f32_post_imm_st3(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, <2 x float> %D) nounwind {
9048 ; SDAG-LABEL: test_v2f32_post_imm_st3:
9049 ; SDAG:       ; %bb.0:
9050 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
9051 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
9052 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
9053 ; SDAG-NEXT:    st3.2s { v0, v1, v2 }, [x0], #24
9054 ; SDAG-NEXT:    ret
9056 ; CHECK-GISEL-LABEL: test_v2f32_post_imm_st3:
9057 ; CHECK-GISEL:       ; %bb.0:
9058 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
9059 ; CHECK-GISEL-NEXT:    mov x8, x0
9060 ; CHECK-GISEL-NEXT:    add x0, x0, #24
9061 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
9062 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
9063 ; CHECK-GISEL-NEXT:    st3.2s { v0, v1, v2 }, [x8]
9064 ; CHECK-GISEL-NEXT:    ret
9065   call void @llvm.aarch64.neon.st3.v2f32.p0(<2 x float> %B, <2 x float> %C, <2 x float> %D, ptr %A)
9066   %tmp = getelementptr float, ptr %A, i32 6
9067   ret ptr %tmp
9070 define ptr @test_v2f32_post_reg_st3(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, <2 x float> %D, i64 %inc) nounwind {
9071 ; SDAG-LABEL: test_v2f32_post_reg_st3:
9072 ; SDAG:       ; %bb.0:
9073 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
9074 ; SDAG-NEXT:    lsl x8, x2, #2
9075 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
9076 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
9077 ; SDAG-NEXT:    st3.2s { v0, v1, v2 }, [x0], x8
9078 ; SDAG-NEXT:    ret
9080 ; CHECK-GISEL-LABEL: test_v2f32_post_reg_st3:
9081 ; CHECK-GISEL:       ; %bb.0:
9082 ; CHECK-GISEL-NEXT:    mov x8, x0
9083 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
9084 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
9085 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
9086 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
9087 ; CHECK-GISEL-NEXT:    st3.2s { v0, v1, v2 }, [x8]
9088 ; CHECK-GISEL-NEXT:    ret
9089   call void @llvm.aarch64.neon.st3.v2f32.p0(<2 x float> %B, <2 x float> %C, <2 x float> %D, ptr %A)
9090   %tmp = getelementptr float, ptr %A, i64 %inc
9091   ret ptr %tmp
9094 declare void @llvm.aarch64.neon.st3.v2f32.p0(<2 x float>, <2 x float>, <2 x float>, ptr)
9097 define ptr @test_v2f64_post_imm_st3(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, <2 x double> %D) nounwind {
9098 ; SDAG-LABEL: test_v2f64_post_imm_st3:
9099 ; SDAG:       ; %bb.0:
9100 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
9101 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
9102 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
9103 ; SDAG-NEXT:    st3.2d { v0, v1, v2 }, [x0], #48
9104 ; SDAG-NEXT:    ret
9106 ; CHECK-GISEL-LABEL: test_v2f64_post_imm_st3:
9107 ; CHECK-GISEL:       ; %bb.0:
9108 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
9109 ; CHECK-GISEL-NEXT:    mov x8, x0
9110 ; CHECK-GISEL-NEXT:    add x0, x0, #48
9111 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
9112 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
9113 ; CHECK-GISEL-NEXT:    st3.2d { v0, v1, v2 }, [x8]
9114 ; CHECK-GISEL-NEXT:    ret
9115   call void @llvm.aarch64.neon.st3.v2f64.p0(<2 x double> %B, <2 x double> %C, <2 x double> %D, ptr %A)
9116   %tmp = getelementptr double, ptr %A, i64 6
9117   ret ptr %tmp
9120 define ptr @test_v2f64_post_reg_st3(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, <2 x double> %D, i64 %inc) nounwind {
9121 ; SDAG-LABEL: test_v2f64_post_reg_st3:
9122 ; SDAG:       ; %bb.0:
9123 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
9124 ; SDAG-NEXT:    lsl x8, x2, #3
9125 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
9126 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
9127 ; SDAG-NEXT:    st3.2d { v0, v1, v2 }, [x0], x8
9128 ; SDAG-NEXT:    ret
9130 ; CHECK-GISEL-LABEL: test_v2f64_post_reg_st3:
9131 ; CHECK-GISEL:       ; %bb.0:
9132 ; CHECK-GISEL-NEXT:    mov x8, x0
9133 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
9134 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
9135 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
9136 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
9137 ; CHECK-GISEL-NEXT:    st3.2d { v0, v1, v2 }, [x8]
9138 ; CHECK-GISEL-NEXT:    ret
9139   call void @llvm.aarch64.neon.st3.v2f64.p0(<2 x double> %B, <2 x double> %C, <2 x double> %D, ptr %A)
9140   %tmp = getelementptr double, ptr %A, i64 %inc
9141   ret ptr %tmp
9144 declare void @llvm.aarch64.neon.st3.v2f64.p0(<2 x double>, <2 x double>, <2 x double>, ptr)
9147 define ptr @test_v1f64_post_imm_st3(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, <1 x double> %D) nounwind {
9148 ; SDAG-LABEL: test_v1f64_post_imm_st3:
9149 ; SDAG:       ; %bb.0:
9150 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
9151 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
9152 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
9153 ; SDAG-NEXT:    st1.1d { v0, v1, v2 }, [x0], #24
9154 ; SDAG-NEXT:    ret
9156 ; CHECK-GISEL-LABEL: test_v1f64_post_imm_st3:
9157 ; CHECK-GISEL:       ; %bb.0:
9158 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
9159 ; CHECK-GISEL-NEXT:    mov x8, x0
9160 ; CHECK-GISEL-NEXT:    add x0, x0, #24
9161 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
9162 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
9163 ; CHECK-GISEL-NEXT:    st1.1d { v0, v1, v2 }, [x8]
9164 ; CHECK-GISEL-NEXT:    ret
9165   call void @llvm.aarch64.neon.st3.v1f64.p0(<1 x double> %B, <1 x double> %C, <1 x double> %D, ptr %A)
9166   %tmp = getelementptr double, ptr %A, i64 3
9167   ret ptr %tmp
9170 define ptr @test_v1f64_post_reg_st3(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, <1 x double> %D, i64 %inc) nounwind {
9171 ; SDAG-LABEL: test_v1f64_post_reg_st3:
9172 ; SDAG:       ; %bb.0:
9173 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
9174 ; SDAG-NEXT:    lsl x8, x2, #3
9175 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
9176 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
9177 ; SDAG-NEXT:    st1.1d { v0, v1, v2 }, [x0], x8
9178 ; SDAG-NEXT:    ret
9180 ; CHECK-GISEL-LABEL: test_v1f64_post_reg_st3:
9181 ; CHECK-GISEL:       ; %bb.0:
9182 ; CHECK-GISEL-NEXT:    mov x8, x0
9183 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
9184 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
9185 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
9186 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
9187 ; CHECK-GISEL-NEXT:    st1.1d { v0, v1, v2 }, [x8]
9188 ; CHECK-GISEL-NEXT:    ret
9189   call void @llvm.aarch64.neon.st3.v1f64.p0(<1 x double> %B, <1 x double> %C, <1 x double> %D, ptr %A)
9190   %tmp = getelementptr double, ptr %A, i64 %inc
9191   ret ptr %tmp
9194 declare void @llvm.aarch64.neon.st3.v1f64.p0(<1 x double>, <1 x double>, <1 x double>, ptr)
9197 define ptr @test_v16i8_post_imm_st4(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D, <16 x i8> %E) nounwind {
9198 ; SDAG-LABEL: test_v16i8_post_imm_st4:
9199 ; SDAG:       ; %bb.0:
9200 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9201 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9202 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9203 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9204 ; SDAG-NEXT:    st4.16b { v0, v1, v2, v3 }, [x0], #64
9205 ; SDAG-NEXT:    ret
9207 ; CHECK-GISEL-LABEL: test_v16i8_post_imm_st4:
9208 ; CHECK-GISEL:       ; %bb.0:
9209 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9210 ; CHECK-GISEL-NEXT:    mov x8, x0
9211 ; CHECK-GISEL-NEXT:    add x0, x0, #64
9212 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9213 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9214 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9215 ; CHECK-GISEL-NEXT:    st4.16b { v0, v1, v2, v3 }, [x8]
9216 ; CHECK-GISEL-NEXT:    ret
9217   call void @llvm.aarch64.neon.st4.v16i8.p0(<16 x i8> %B, <16 x i8> %C, <16 x i8> %D, <16 x i8> %E, ptr %A)
9218   %tmp = getelementptr i8, ptr %A, i32 64
9219   ret ptr %tmp
9222 define ptr @test_v16i8_post_reg_st4(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D, <16 x i8> %E, i64 %inc) nounwind {
9223 ; SDAG-LABEL: test_v16i8_post_reg_st4:
9224 ; SDAG:       ; %bb.0:
9225 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9226 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9227 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9228 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9229 ; SDAG-NEXT:    st4.16b { v0, v1, v2, v3 }, [x0], x2
9230 ; SDAG-NEXT:    ret
9232 ; CHECK-GISEL-LABEL: test_v16i8_post_reg_st4:
9233 ; CHECK-GISEL:       ; %bb.0:
9234 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9235 ; CHECK-GISEL-NEXT:    mov x8, x0
9236 ; CHECK-GISEL-NEXT:    add x0, x0, x2
9237 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9238 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9239 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9240 ; CHECK-GISEL-NEXT:    st4.16b { v0, v1, v2, v3 }, [x8]
9241 ; CHECK-GISEL-NEXT:    ret
9242   call void @llvm.aarch64.neon.st4.v16i8.p0(<16 x i8> %B, <16 x i8> %C, <16 x i8> %D, <16 x i8> %E, ptr %A)
9243   %tmp = getelementptr i8, ptr %A, i64 %inc
9244   ret ptr %tmp
9247 declare void @llvm.aarch64.neon.st4.v16i8.p0(<16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, ptr)
9250 define ptr @test_v8i8_post_imm_st4(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, <8 x i8> %D, <8 x i8> %E) nounwind {
9251 ; SDAG-LABEL: test_v8i8_post_imm_st4:
9252 ; SDAG:       ; %bb.0:
9253 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9254 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9255 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9256 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9257 ; SDAG-NEXT:    st4.8b { v0, v1, v2, v3 }, [x0], #32
9258 ; SDAG-NEXT:    ret
9260 ; CHECK-GISEL-LABEL: test_v8i8_post_imm_st4:
9261 ; CHECK-GISEL:       ; %bb.0:
9262 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9263 ; CHECK-GISEL-NEXT:    mov x8, x0
9264 ; CHECK-GISEL-NEXT:    add x0, x0, #32
9265 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9266 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9267 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9268 ; CHECK-GISEL-NEXT:    st4.8b { v0, v1, v2, v3 }, [x8]
9269 ; CHECK-GISEL-NEXT:    ret
9270   call void @llvm.aarch64.neon.st4.v8i8.p0(<8 x i8> %B, <8 x i8> %C, <8 x i8> %D, <8 x i8> %E, ptr %A)
9271   %tmp = getelementptr i8, ptr %A, i32 32
9272   ret ptr %tmp
9275 define ptr @test_v8i8_post_reg_st4(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, <8 x i8> %D, <8 x i8> %E, i64 %inc) nounwind {
9276 ; SDAG-LABEL: test_v8i8_post_reg_st4:
9277 ; SDAG:       ; %bb.0:
9278 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9279 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9280 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9281 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9282 ; SDAG-NEXT:    st4.8b { v0, v1, v2, v3 }, [x0], x2
9283 ; SDAG-NEXT:    ret
9285 ; CHECK-GISEL-LABEL: test_v8i8_post_reg_st4:
9286 ; CHECK-GISEL:       ; %bb.0:
9287 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9288 ; CHECK-GISEL-NEXT:    mov x8, x0
9289 ; CHECK-GISEL-NEXT:    add x0, x0, x2
9290 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9291 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9292 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9293 ; CHECK-GISEL-NEXT:    st4.8b { v0, v1, v2, v3 }, [x8]
9294 ; CHECK-GISEL-NEXT:    ret
9295   call void @llvm.aarch64.neon.st4.v8i8.p0(<8 x i8> %B, <8 x i8> %C, <8 x i8> %D, <8 x i8> %E, ptr %A)
9296   %tmp = getelementptr i8, ptr %A, i64 %inc
9297   ret ptr %tmp
9300 declare void @llvm.aarch64.neon.st4.v8i8.p0(<8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, ptr)
9303 define ptr @test_v8i16_post_imm_st4(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D, <8 x i16> %E) nounwind {
9304 ; SDAG-LABEL: test_v8i16_post_imm_st4:
9305 ; SDAG:       ; %bb.0:
9306 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9307 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9308 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9309 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9310 ; SDAG-NEXT:    st4.8h { v0, v1, v2, v3 }, [x0], #64
9311 ; SDAG-NEXT:    ret
9313 ; CHECK-GISEL-LABEL: test_v8i16_post_imm_st4:
9314 ; CHECK-GISEL:       ; %bb.0:
9315 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9316 ; CHECK-GISEL-NEXT:    mov x8, x0
9317 ; CHECK-GISEL-NEXT:    add x0, x0, #64
9318 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9319 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9320 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9321 ; CHECK-GISEL-NEXT:    st4.8h { v0, v1, v2, v3 }, [x8]
9322 ; CHECK-GISEL-NEXT:    ret
9323   call void @llvm.aarch64.neon.st4.v8i16.p0(<8 x i16> %B, <8 x i16> %C, <8 x i16> %D, <8 x i16> %E, ptr %A)
9324   %tmp = getelementptr i16, ptr %A, i32 32
9325   ret ptr %tmp
9328 define ptr @test_v8i16_post_reg_st4(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D, <8 x i16> %E, i64 %inc) nounwind {
9329 ; SDAG-LABEL: test_v8i16_post_reg_st4:
9330 ; SDAG:       ; %bb.0:
9331 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9332 ; SDAG-NEXT:    lsl x8, x2, #1
9333 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9334 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9335 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9336 ; SDAG-NEXT:    st4.8h { v0, v1, v2, v3 }, [x0], x8
9337 ; SDAG-NEXT:    ret
9339 ; CHECK-GISEL-LABEL: test_v8i16_post_reg_st4:
9340 ; CHECK-GISEL:       ; %bb.0:
9341 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9342 ; CHECK-GISEL-NEXT:    mov x8, x0
9343 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #1
9344 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9345 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9346 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9347 ; CHECK-GISEL-NEXT:    st4.8h { v0, v1, v2, v3 }, [x8]
9348 ; CHECK-GISEL-NEXT:    ret
9349   call void @llvm.aarch64.neon.st4.v8i16.p0(<8 x i16> %B, <8 x i16> %C, <8 x i16> %D, <8 x i16> %E, ptr %A)
9350   %tmp = getelementptr i16, ptr %A, i64 %inc
9351   ret ptr %tmp
9354 declare void @llvm.aarch64.neon.st4.v8i16.p0(<8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, ptr)
9357 define ptr @test_v4i16_post_imm_st4(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, <4 x i16> %D, <4 x i16> %E) nounwind {
9358 ; SDAG-LABEL: test_v4i16_post_imm_st4:
9359 ; SDAG:       ; %bb.0:
9360 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9361 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9362 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9363 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9364 ; SDAG-NEXT:    st4.4h { v0, v1, v2, v3 }, [x0], #32
9365 ; SDAG-NEXT:    ret
9367 ; CHECK-GISEL-LABEL: test_v4i16_post_imm_st4:
9368 ; CHECK-GISEL:       ; %bb.0:
9369 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9370 ; CHECK-GISEL-NEXT:    mov x8, x0
9371 ; CHECK-GISEL-NEXT:    add x0, x0, #32
9372 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9373 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9374 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9375 ; CHECK-GISEL-NEXT:    st4.4h { v0, v1, v2, v3 }, [x8]
9376 ; CHECK-GISEL-NEXT:    ret
9377   call void @llvm.aarch64.neon.st4.v4i16.p0(<4 x i16> %B, <4 x i16> %C, <4 x i16> %D, <4 x i16> %E, ptr %A)
9378   %tmp = getelementptr i16, ptr %A, i32 16
9379   ret ptr %tmp
9382 define ptr @test_v4i16_post_reg_st4(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, <4 x i16> %D, <4 x i16> %E, i64 %inc) nounwind {
9383 ; SDAG-LABEL: test_v4i16_post_reg_st4:
9384 ; SDAG:       ; %bb.0:
9385 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9386 ; SDAG-NEXT:    lsl x8, x2, #1
9387 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9388 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9389 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9390 ; SDAG-NEXT:    st4.4h { v0, v1, v2, v3 }, [x0], x8
9391 ; SDAG-NEXT:    ret
9393 ; CHECK-GISEL-LABEL: test_v4i16_post_reg_st4:
9394 ; CHECK-GISEL:       ; %bb.0:
9395 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9396 ; CHECK-GISEL-NEXT:    mov x8, x0
9397 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #1
9398 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9399 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9400 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9401 ; CHECK-GISEL-NEXT:    st4.4h { v0, v1, v2, v3 }, [x8]
9402 ; CHECK-GISEL-NEXT:    ret
9403   call void @llvm.aarch64.neon.st4.v4i16.p0(<4 x i16> %B, <4 x i16> %C, <4 x i16> %D, <4 x i16> %E, ptr %A)
9404   %tmp = getelementptr i16, ptr %A, i64 %inc
9405   ret ptr %tmp
9408 declare void @llvm.aarch64.neon.st4.v4i16.p0(<4 x i16>, <4 x i16>, <4 x i16>,<4 x i16>,  ptr)
9411 define ptr @test_v4i32_post_imm_st4(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D, <4 x i32> %E) nounwind {
9412 ; SDAG-LABEL: test_v4i32_post_imm_st4:
9413 ; SDAG:       ; %bb.0:
9414 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9415 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9416 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9417 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9418 ; SDAG-NEXT:    st4.4s { v0, v1, v2, v3 }, [x0], #64
9419 ; SDAG-NEXT:    ret
9421 ; CHECK-GISEL-LABEL: test_v4i32_post_imm_st4:
9422 ; CHECK-GISEL:       ; %bb.0:
9423 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9424 ; CHECK-GISEL-NEXT:    mov x8, x0
9425 ; CHECK-GISEL-NEXT:    add x0, x0, #64
9426 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9427 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9428 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9429 ; CHECK-GISEL-NEXT:    st4.4s { v0, v1, v2, v3 }, [x8]
9430 ; CHECK-GISEL-NEXT:    ret
9431   call void @llvm.aarch64.neon.st4.v4i32.p0(<4 x i32> %B, <4 x i32> %C, <4 x i32> %D, <4 x i32> %E, ptr %A)
9432   %tmp = getelementptr i32, ptr %A, i32 16
9433   ret ptr %tmp
9436 define ptr @test_v4i32_post_reg_st4(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D, <4 x i32> %E, i64 %inc) nounwind {
9437 ; SDAG-LABEL: test_v4i32_post_reg_st4:
9438 ; SDAG:       ; %bb.0:
9439 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9440 ; SDAG-NEXT:    lsl x8, x2, #2
9441 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9442 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9443 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9444 ; SDAG-NEXT:    st4.4s { v0, v1, v2, v3 }, [x0], x8
9445 ; SDAG-NEXT:    ret
9447 ; CHECK-GISEL-LABEL: test_v4i32_post_reg_st4:
9448 ; CHECK-GISEL:       ; %bb.0:
9449 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9450 ; CHECK-GISEL-NEXT:    mov x8, x0
9451 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
9452 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9453 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9454 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9455 ; CHECK-GISEL-NEXT:    st4.4s { v0, v1, v2, v3 }, [x8]
9456 ; CHECK-GISEL-NEXT:    ret
9457   call void @llvm.aarch64.neon.st4.v4i32.p0(<4 x i32> %B, <4 x i32> %C, <4 x i32> %D, <4 x i32> %E, ptr %A)
9458   %tmp = getelementptr i32, ptr %A, i64 %inc
9459   ret ptr %tmp
9462 declare void @llvm.aarch64.neon.st4.v4i32.p0(<4 x i32>, <4 x i32>, <4 x i32>,<4 x i32>,  ptr)
9465 define ptr @test_v2i32_post_imm_st4(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, <2 x i32> %D, <2 x i32> %E) nounwind {
9466 ; SDAG-LABEL: test_v2i32_post_imm_st4:
9467 ; SDAG:       ; %bb.0:
9468 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9469 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9470 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9471 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9472 ; SDAG-NEXT:    st4.2s { v0, v1, v2, v3 }, [x0], #32
9473 ; SDAG-NEXT:    ret
9475 ; CHECK-GISEL-LABEL: test_v2i32_post_imm_st4:
9476 ; CHECK-GISEL:       ; %bb.0:
9477 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9478 ; CHECK-GISEL-NEXT:    mov x8, x0
9479 ; CHECK-GISEL-NEXT:    add x0, x0, #32
9480 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9481 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9482 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9483 ; CHECK-GISEL-NEXT:    st4.2s { v0, v1, v2, v3 }, [x8]
9484 ; CHECK-GISEL-NEXT:    ret
9485   call void @llvm.aarch64.neon.st4.v2i32.p0(<2 x i32> %B, <2 x i32> %C, <2 x i32> %D, <2 x i32> %E, ptr %A)
9486   %tmp = getelementptr i32, ptr %A, i32 8
9487   ret ptr %tmp
9490 define ptr @test_v2i32_post_reg_st4(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, <2 x i32> %D, <2 x i32> %E, i64 %inc) nounwind {
9491 ; SDAG-LABEL: test_v2i32_post_reg_st4:
9492 ; SDAG:       ; %bb.0:
9493 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9494 ; SDAG-NEXT:    lsl x8, x2, #2
9495 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9496 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9497 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9498 ; SDAG-NEXT:    st4.2s { v0, v1, v2, v3 }, [x0], x8
9499 ; SDAG-NEXT:    ret
9501 ; CHECK-GISEL-LABEL: test_v2i32_post_reg_st4:
9502 ; CHECK-GISEL:       ; %bb.0:
9503 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9504 ; CHECK-GISEL-NEXT:    mov x8, x0
9505 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
9506 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9507 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9508 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9509 ; CHECK-GISEL-NEXT:    st4.2s { v0, v1, v2, v3 }, [x8]
9510 ; CHECK-GISEL-NEXT:    ret
9511   call void @llvm.aarch64.neon.st4.v2i32.p0(<2 x i32> %B, <2 x i32> %C, <2 x i32> %D, <2 x i32> %E, ptr %A)
9512   %tmp = getelementptr i32, ptr %A, i64 %inc
9513   ret ptr %tmp
9516 declare void @llvm.aarch64.neon.st4.v2i32.p0(<2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, ptr)
9519 define ptr @test_v2i64_post_imm_st4(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D, <2 x i64> %E) nounwind {
9520 ; SDAG-LABEL: test_v2i64_post_imm_st4:
9521 ; SDAG:       ; %bb.0:
9522 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9523 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9524 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9525 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9526 ; SDAG-NEXT:    st4.2d { v0, v1, v2, v3 }, [x0], #64
9527 ; SDAG-NEXT:    ret
9529 ; CHECK-GISEL-LABEL: test_v2i64_post_imm_st4:
9530 ; CHECK-GISEL:       ; %bb.0:
9531 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9532 ; CHECK-GISEL-NEXT:    mov x8, x0
9533 ; CHECK-GISEL-NEXT:    add x0, x0, #64
9534 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9535 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9536 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9537 ; CHECK-GISEL-NEXT:    st4.2d { v0, v1, v2, v3 }, [x8]
9538 ; CHECK-GISEL-NEXT:    ret
9539   call void @llvm.aarch64.neon.st4.v2i64.p0(<2 x i64> %B, <2 x i64> %C, <2 x i64> %D, <2 x i64> %E, ptr %A)
9540   %tmp = getelementptr i64, ptr %A, i64 8
9541   ret ptr %tmp
9544 define ptr @test_v2i64_post_reg_st4(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D, <2 x i64> %E, i64 %inc) nounwind {
9545 ; SDAG-LABEL: test_v2i64_post_reg_st4:
9546 ; SDAG:       ; %bb.0:
9547 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9548 ; SDAG-NEXT:    lsl x8, x2, #3
9549 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9550 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9551 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9552 ; SDAG-NEXT:    st4.2d { v0, v1, v2, v3 }, [x0], x8
9553 ; SDAG-NEXT:    ret
9555 ; CHECK-GISEL-LABEL: test_v2i64_post_reg_st4:
9556 ; CHECK-GISEL:       ; %bb.0:
9557 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9558 ; CHECK-GISEL-NEXT:    mov x8, x0
9559 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
9560 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9561 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9562 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9563 ; CHECK-GISEL-NEXT:    st4.2d { v0, v1, v2, v3 }, [x8]
9564 ; CHECK-GISEL-NEXT:    ret
9565   call void @llvm.aarch64.neon.st4.v2i64.p0(<2 x i64> %B, <2 x i64> %C, <2 x i64> %D, <2 x i64> %E, ptr %A)
9566   %tmp = getelementptr i64, ptr %A, i64 %inc
9567   ret ptr %tmp
9570 declare void @llvm.aarch64.neon.st4.v2i64.p0(<2 x i64>, <2 x i64>, <2 x i64>,<2 x i64>,  ptr)
9573 define ptr @test_v1i64_post_imm_st4(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, <1 x i64> %D, <1 x i64> %E) nounwind {
9574 ; SDAG-LABEL: test_v1i64_post_imm_st4:
9575 ; SDAG:       ; %bb.0:
9576 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9577 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9578 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9579 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9580 ; SDAG-NEXT:    st1.1d { v0, v1, v2, v3 }, [x0], #32
9581 ; SDAG-NEXT:    ret
9583 ; CHECK-GISEL-LABEL: test_v1i64_post_imm_st4:
9584 ; CHECK-GISEL:       ; %bb.0:
9585 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9586 ; CHECK-GISEL-NEXT:    mov x8, x0
9587 ; CHECK-GISEL-NEXT:    add x0, x0, #32
9588 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9589 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9590 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9591 ; CHECK-GISEL-NEXT:    st1.1d { v0, v1, v2, v3 }, [x8]
9592 ; CHECK-GISEL-NEXT:    ret
9593   call void @llvm.aarch64.neon.st4.v1i64.p0(<1 x i64> %B, <1 x i64> %C, <1 x i64> %D, <1 x i64> %E, ptr %A)
9594   %tmp = getelementptr i64, ptr %A, i64 4
9595   ret ptr %tmp
9598 define ptr @test_v1i64_post_reg_st4(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, <1 x i64> %D, <1 x i64> %E, i64 %inc) nounwind {
9599 ; SDAG-LABEL: test_v1i64_post_reg_st4:
9600 ; SDAG:       ; %bb.0:
9601 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9602 ; SDAG-NEXT:    lsl x8, x2, #3
9603 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9604 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9605 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9606 ; SDAG-NEXT:    st1.1d { v0, v1, v2, v3 }, [x0], x8
9607 ; SDAG-NEXT:    ret
9609 ; CHECK-GISEL-LABEL: test_v1i64_post_reg_st4:
9610 ; CHECK-GISEL:       ; %bb.0:
9611 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9612 ; CHECK-GISEL-NEXT:    mov x8, x0
9613 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
9614 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9615 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9616 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9617 ; CHECK-GISEL-NEXT:    st1.1d { v0, v1, v2, v3 }, [x8]
9618 ; CHECK-GISEL-NEXT:    ret
9619   call void @llvm.aarch64.neon.st4.v1i64.p0(<1 x i64> %B, <1 x i64> %C, <1 x i64> %D, <1 x i64> %E, ptr %A)
9620   %tmp = getelementptr i64, ptr %A, i64 %inc
9621   ret ptr %tmp
9624 declare void @llvm.aarch64.neon.st4.v1i64.p0(<1 x i64>, <1 x i64>, <1 x i64>,<1 x i64>,  ptr)
9627 define ptr @test_v4f32_post_imm_st4(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, <4 x float> %D, <4 x float> %E) nounwind {
9628 ; SDAG-LABEL: test_v4f32_post_imm_st4:
9629 ; SDAG:       ; %bb.0:
9630 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9631 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9632 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9633 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9634 ; SDAG-NEXT:    st4.4s { v0, v1, v2, v3 }, [x0], #64
9635 ; SDAG-NEXT:    ret
9637 ; CHECK-GISEL-LABEL: test_v4f32_post_imm_st4:
9638 ; CHECK-GISEL:       ; %bb.0:
9639 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9640 ; CHECK-GISEL-NEXT:    mov x8, x0
9641 ; CHECK-GISEL-NEXT:    add x0, x0, #64
9642 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9643 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9644 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9645 ; CHECK-GISEL-NEXT:    st4.4s { v0, v1, v2, v3 }, [x8]
9646 ; CHECK-GISEL-NEXT:    ret
9647   call void @llvm.aarch64.neon.st4.v4f32.p0(<4 x float> %B, <4 x float> %C, <4 x float> %D, <4 x float> %E, ptr %A)
9648   %tmp = getelementptr float, ptr %A, i32 16
9649   ret ptr %tmp
9652 define ptr @test_v4f32_post_reg_st4(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, <4 x float> %D, <4 x float> %E, i64 %inc) nounwind {
9653 ; SDAG-LABEL: test_v4f32_post_reg_st4:
9654 ; SDAG:       ; %bb.0:
9655 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9656 ; SDAG-NEXT:    lsl x8, x2, #2
9657 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9658 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9659 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9660 ; SDAG-NEXT:    st4.4s { v0, v1, v2, v3 }, [x0], x8
9661 ; SDAG-NEXT:    ret
9663 ; CHECK-GISEL-LABEL: test_v4f32_post_reg_st4:
9664 ; CHECK-GISEL:       ; %bb.0:
9665 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9666 ; CHECK-GISEL-NEXT:    mov x8, x0
9667 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
9668 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9669 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9670 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9671 ; CHECK-GISEL-NEXT:    st4.4s { v0, v1, v2, v3 }, [x8]
9672 ; CHECK-GISEL-NEXT:    ret
9673   call void @llvm.aarch64.neon.st4.v4f32.p0(<4 x float> %B, <4 x float> %C, <4 x float> %D, <4 x float> %E, ptr %A)
9674   %tmp = getelementptr float, ptr %A, i64 %inc
9675   ret ptr %tmp
9678 declare void @llvm.aarch64.neon.st4.v4f32.p0(<4 x float>, <4 x float>, <4 x float>, <4 x float>, ptr)
9681 define ptr @test_v2f32_post_imm_st4(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, <2 x float> %D, <2 x float> %E) nounwind {
9682 ; SDAG-LABEL: test_v2f32_post_imm_st4:
9683 ; SDAG:       ; %bb.0:
9684 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9685 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9686 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9687 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9688 ; SDAG-NEXT:    st4.2s { v0, v1, v2, v3 }, [x0], #32
9689 ; SDAG-NEXT:    ret
9691 ; CHECK-GISEL-LABEL: test_v2f32_post_imm_st4:
9692 ; CHECK-GISEL:       ; %bb.0:
9693 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9694 ; CHECK-GISEL-NEXT:    mov x8, x0
9695 ; CHECK-GISEL-NEXT:    add x0, x0, #32
9696 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9697 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9698 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9699 ; CHECK-GISEL-NEXT:    st4.2s { v0, v1, v2, v3 }, [x8]
9700 ; CHECK-GISEL-NEXT:    ret
9701   call void @llvm.aarch64.neon.st4.v2f32.p0(<2 x float> %B, <2 x float> %C, <2 x float> %D, <2 x float> %E, ptr %A)
9702   %tmp = getelementptr float, ptr %A, i32 8
9703   ret ptr %tmp
9706 define ptr @test_v2f32_post_reg_st4(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, <2 x float> %D, <2 x float> %E, i64 %inc) nounwind {
9707 ; SDAG-LABEL: test_v2f32_post_reg_st4:
9708 ; SDAG:       ; %bb.0:
9709 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9710 ; SDAG-NEXT:    lsl x8, x2, #2
9711 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9712 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9713 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9714 ; SDAG-NEXT:    st4.2s { v0, v1, v2, v3 }, [x0], x8
9715 ; SDAG-NEXT:    ret
9717 ; CHECK-GISEL-LABEL: test_v2f32_post_reg_st4:
9718 ; CHECK-GISEL:       ; %bb.0:
9719 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9720 ; CHECK-GISEL-NEXT:    mov x8, x0
9721 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
9722 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9723 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9724 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9725 ; CHECK-GISEL-NEXT:    st4.2s { v0, v1, v2, v3 }, [x8]
9726 ; CHECK-GISEL-NEXT:    ret
9727   call void @llvm.aarch64.neon.st4.v2f32.p0(<2 x float> %B, <2 x float> %C, <2 x float> %D, <2 x float> %E, ptr %A)
9728   %tmp = getelementptr float, ptr %A, i64 %inc
9729   ret ptr %tmp
9732 declare void @llvm.aarch64.neon.st4.v2f32.p0(<2 x float>, <2 x float>, <2 x float>, <2 x float>, ptr)
9735 define ptr @test_v2f64_post_imm_st4(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, <2 x double> %D, <2 x double> %E) nounwind {
9736 ; SDAG-LABEL: test_v2f64_post_imm_st4:
9737 ; SDAG:       ; %bb.0:
9738 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9739 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9740 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9741 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9742 ; SDAG-NEXT:    st4.2d { v0, v1, v2, v3 }, [x0], #64
9743 ; SDAG-NEXT:    ret
9745 ; CHECK-GISEL-LABEL: test_v2f64_post_imm_st4:
9746 ; CHECK-GISEL:       ; %bb.0:
9747 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9748 ; CHECK-GISEL-NEXT:    mov x8, x0
9749 ; CHECK-GISEL-NEXT:    add x0, x0, #64
9750 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9751 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9752 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9753 ; CHECK-GISEL-NEXT:    st4.2d { v0, v1, v2, v3 }, [x8]
9754 ; CHECK-GISEL-NEXT:    ret
9755   call void @llvm.aarch64.neon.st4.v2f64.p0(<2 x double> %B, <2 x double> %C, <2 x double> %D, <2 x double> %E, ptr %A)
9756   %tmp = getelementptr double, ptr %A, i64 8
9757   ret ptr %tmp
9760 define ptr @test_v2f64_post_reg_st4(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, <2 x double> %D, <2 x double> %E, i64 %inc) nounwind {
9761 ; SDAG-LABEL: test_v2f64_post_reg_st4:
9762 ; SDAG:       ; %bb.0:
9763 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9764 ; SDAG-NEXT:    lsl x8, x2, #3
9765 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9766 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9767 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9768 ; SDAG-NEXT:    st4.2d { v0, v1, v2, v3 }, [x0], x8
9769 ; SDAG-NEXT:    ret
9771 ; CHECK-GISEL-LABEL: test_v2f64_post_reg_st4:
9772 ; CHECK-GISEL:       ; %bb.0:
9773 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9774 ; CHECK-GISEL-NEXT:    mov x8, x0
9775 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
9776 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9777 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9778 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
9779 ; CHECK-GISEL-NEXT:    st4.2d { v0, v1, v2, v3 }, [x8]
9780 ; CHECK-GISEL-NEXT:    ret
9781   call void @llvm.aarch64.neon.st4.v2f64.p0(<2 x double> %B, <2 x double> %C, <2 x double> %D, <2 x double> %E, ptr %A)
9782   %tmp = getelementptr double, ptr %A, i64 %inc
9783   ret ptr %tmp
9786 declare void @llvm.aarch64.neon.st4.v2f64.p0(<2 x double>, <2 x double>, <2 x double>,<2 x double>,  ptr)
9789 define ptr @test_v1f64_post_imm_st4(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, <1 x double> %D, <1 x double> %E) nounwind {
9790 ; SDAG-LABEL: test_v1f64_post_imm_st4:
9791 ; SDAG:       ; %bb.0:
9792 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9793 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9794 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9795 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9796 ; SDAG-NEXT:    st1.1d { v0, v1, v2, v3 }, [x0], #32
9797 ; SDAG-NEXT:    ret
9799 ; CHECK-GISEL-LABEL: test_v1f64_post_imm_st4:
9800 ; CHECK-GISEL:       ; %bb.0:
9801 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9802 ; CHECK-GISEL-NEXT:    mov x8, x0
9803 ; CHECK-GISEL-NEXT:    add x0, x0, #32
9804 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9805 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9806 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9807 ; CHECK-GISEL-NEXT:    st1.1d { v0, v1, v2, v3 }, [x8]
9808 ; CHECK-GISEL-NEXT:    ret
9809   call void @llvm.aarch64.neon.st4.v1f64.p0(<1 x double> %B, <1 x double> %C, <1 x double> %D, <1 x double> %E, ptr %A)
9810   %tmp = getelementptr double, ptr %A, i64 4
9811   ret ptr %tmp
9814 define ptr @test_v1f64_post_reg_st4(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, <1 x double> %D, <1 x double> %E, i64 %inc) nounwind {
9815 ; SDAG-LABEL: test_v1f64_post_reg_st4:
9816 ; SDAG:       ; %bb.0:
9817 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9818 ; SDAG-NEXT:    lsl x8, x2, #3
9819 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9820 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9821 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9822 ; SDAG-NEXT:    st1.1d { v0, v1, v2, v3 }, [x0], x8
9823 ; SDAG-NEXT:    ret
9825 ; CHECK-GISEL-LABEL: test_v1f64_post_reg_st4:
9826 ; CHECK-GISEL:       ; %bb.0:
9827 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9828 ; CHECK-GISEL-NEXT:    mov x8, x0
9829 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
9830 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9831 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9832 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
9833 ; CHECK-GISEL-NEXT:    st1.1d { v0, v1, v2, v3 }, [x8]
9834 ; CHECK-GISEL-NEXT:    ret
9835   call void @llvm.aarch64.neon.st4.v1f64.p0(<1 x double> %B, <1 x double> %C, <1 x double> %D, <1 x double> %E, ptr %A)
9836   %tmp = getelementptr double, ptr %A, i64 %inc
9837   ret ptr %tmp
9840 declare void @llvm.aarch64.neon.st4.v1f64.p0(<1 x double>, <1 x double>, <1 x double>, <1 x double>, ptr)
9843 define ptr @test_v16i8_post_imm_st1x2(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C) nounwind {
9844 ; SDAG-LABEL: test_v16i8_post_imm_st1x2:
9845 ; SDAG:       ; %bb.0:
9846 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
9847 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
9848 ; SDAG-NEXT:    st1.16b { v0, v1 }, [x0], #32
9849 ; SDAG-NEXT:    ret
9851 ; CHECK-GISEL-LABEL: test_v16i8_post_imm_st1x2:
9852 ; CHECK-GISEL:       ; %bb.0:
9853 ; CHECK-GISEL-NEXT:    mov x8, x0
9854 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
9855 ; CHECK-GISEL-NEXT:    add x0, x0, #32
9856 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
9857 ; CHECK-GISEL-NEXT:    st1.16b { v0, v1 }, [x8]
9858 ; CHECK-GISEL-NEXT:    ret
9859   call void @llvm.aarch64.neon.st1x2.v16i8.p0(<16 x i8> %B, <16 x i8> %C, ptr %A)
9860   %tmp = getelementptr i8, ptr %A, i32 32
9861   ret ptr %tmp
9864 define ptr @test_v16i8_post_reg_st1x2(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, i64 %inc) nounwind {
9865 ; SDAG-LABEL: test_v16i8_post_reg_st1x2:
9866 ; SDAG:       ; %bb.0:
9867 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
9868 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
9869 ; SDAG-NEXT:    st1.16b { v0, v1 }, [x0], x2
9870 ; SDAG-NEXT:    ret
9872 ; CHECK-GISEL-LABEL: test_v16i8_post_reg_st1x2:
9873 ; CHECK-GISEL:       ; %bb.0:
9874 ; CHECK-GISEL-NEXT:    mov x8, x0
9875 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
9876 ; CHECK-GISEL-NEXT:    add x0, x0, x2
9877 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
9878 ; CHECK-GISEL-NEXT:    st1.16b { v0, v1 }, [x8]
9879 ; CHECK-GISEL-NEXT:    ret
9880   call void @llvm.aarch64.neon.st1x2.v16i8.p0(<16 x i8> %B, <16 x i8> %C, ptr %A)
9881   %tmp = getelementptr i8, ptr %A, i64 %inc
9882   ret ptr %tmp
9885 declare void @llvm.aarch64.neon.st1x2.v16i8.p0(<16 x i8>, <16 x i8>, ptr)
9888 define ptr @test_v8i8_post_imm_st1x2(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C) nounwind {
9889 ; SDAG-LABEL: test_v8i8_post_imm_st1x2:
9890 ; SDAG:       ; %bb.0:
9891 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
9892 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
9893 ; SDAG-NEXT:    st1.8b { v0, v1 }, [x0], #16
9894 ; SDAG-NEXT:    ret
9896 ; CHECK-GISEL-LABEL: test_v8i8_post_imm_st1x2:
9897 ; CHECK-GISEL:       ; %bb.0:
9898 ; CHECK-GISEL-NEXT:    mov x8, x0
9899 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
9900 ; CHECK-GISEL-NEXT:    add x0, x0, #16
9901 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
9902 ; CHECK-GISEL-NEXT:    st1.8b { v0, v1 }, [x8]
9903 ; CHECK-GISEL-NEXT:    ret
9904   call void @llvm.aarch64.neon.st1x2.v8i8.p0(<8 x i8> %B, <8 x i8> %C, ptr %A)
9905   %tmp = getelementptr i8, ptr %A, i32 16
9906   ret ptr %tmp
9909 define ptr @test_v8i8_post_reg_st1x2(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, i64 %inc) nounwind {
9910 ; SDAG-LABEL: test_v8i8_post_reg_st1x2:
9911 ; SDAG:       ; %bb.0:
9912 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
9913 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
9914 ; SDAG-NEXT:    st1.8b { v0, v1 }, [x0], x2
9915 ; SDAG-NEXT:    ret
9917 ; CHECK-GISEL-LABEL: test_v8i8_post_reg_st1x2:
9918 ; CHECK-GISEL:       ; %bb.0:
9919 ; CHECK-GISEL-NEXT:    mov x8, x0
9920 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
9921 ; CHECK-GISEL-NEXT:    add x0, x0, x2
9922 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
9923 ; CHECK-GISEL-NEXT:    st1.8b { v0, v1 }, [x8]
9924 ; CHECK-GISEL-NEXT:    ret
9925   call void @llvm.aarch64.neon.st1x2.v8i8.p0(<8 x i8> %B, <8 x i8> %C, ptr %A)
9926   %tmp = getelementptr i8, ptr %A, i64 %inc
9927   ret ptr %tmp
9930 declare void @llvm.aarch64.neon.st1x2.v8i8.p0(<8 x i8>, <8 x i8>, ptr)
9933 define ptr @test_v8i16_post_imm_st1x2(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C) nounwind {
9934 ; SDAG-LABEL: test_v8i16_post_imm_st1x2:
9935 ; SDAG:       ; %bb.0:
9936 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
9937 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
9938 ; SDAG-NEXT:    st1.8h { v0, v1 }, [x0], #32
9939 ; SDAG-NEXT:    ret
9941 ; CHECK-GISEL-LABEL: test_v8i16_post_imm_st1x2:
9942 ; CHECK-GISEL:       ; %bb.0:
9943 ; CHECK-GISEL-NEXT:    mov x8, x0
9944 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
9945 ; CHECK-GISEL-NEXT:    add x0, x0, #32
9946 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
9947 ; CHECK-GISEL-NEXT:    st1.8h { v0, v1 }, [x8]
9948 ; CHECK-GISEL-NEXT:    ret
9949   call void @llvm.aarch64.neon.st1x2.v8i16.p0(<8 x i16> %B, <8 x i16> %C, ptr %A)
9950   %tmp = getelementptr i16, ptr %A, i32 16
9951   ret ptr %tmp
9954 define ptr @test_v8i16_post_reg_st1x2(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, i64 %inc) nounwind {
9955 ; SDAG-LABEL: test_v8i16_post_reg_st1x2:
9956 ; SDAG:       ; %bb.0:
9957 ; SDAG-NEXT:    lsl x8, x2, #1
9958 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
9959 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
9960 ; SDAG-NEXT:    st1.8h { v0, v1 }, [x0], x8
9961 ; SDAG-NEXT:    ret
9963 ; CHECK-GISEL-LABEL: test_v8i16_post_reg_st1x2:
9964 ; CHECK-GISEL:       ; %bb.0:
9965 ; CHECK-GISEL-NEXT:    mov x8, x0
9966 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #1
9967 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
9968 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
9969 ; CHECK-GISEL-NEXT:    st1.8h { v0, v1 }, [x8]
9970 ; CHECK-GISEL-NEXT:    ret
9971   call void @llvm.aarch64.neon.st1x2.v8i16.p0(<8 x i16> %B, <8 x i16> %C, ptr %A)
9972   %tmp = getelementptr i16, ptr %A, i64 %inc
9973   ret ptr %tmp
9976 declare void @llvm.aarch64.neon.st1x2.v8i16.p0(<8 x i16>, <8 x i16>, ptr)
9979 define ptr @test_v4i16_post_imm_st1x2(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C) nounwind {
9980 ; SDAG-LABEL: test_v4i16_post_imm_st1x2:
9981 ; SDAG:       ; %bb.0:
9982 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
9983 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
9984 ; SDAG-NEXT:    st1.4h { v0, v1 }, [x0], #16
9985 ; SDAG-NEXT:    ret
9987 ; CHECK-GISEL-LABEL: test_v4i16_post_imm_st1x2:
9988 ; CHECK-GISEL:       ; %bb.0:
9989 ; CHECK-GISEL-NEXT:    mov x8, x0
9990 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
9991 ; CHECK-GISEL-NEXT:    add x0, x0, #16
9992 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
9993 ; CHECK-GISEL-NEXT:    st1.4h { v0, v1 }, [x8]
9994 ; CHECK-GISEL-NEXT:    ret
9995   call void @llvm.aarch64.neon.st1x2.v4i16.p0(<4 x i16> %B, <4 x i16> %C, ptr %A)
9996   %tmp = getelementptr i16, ptr %A, i32 8
9997   ret ptr %tmp
10000 define ptr @test_v4i16_post_reg_st1x2(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, i64 %inc) nounwind {
10001 ; SDAG-LABEL: test_v4i16_post_reg_st1x2:
10002 ; SDAG:       ; %bb.0:
10003 ; SDAG-NEXT:    lsl x8, x2, #1
10004 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
10005 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
10006 ; SDAG-NEXT:    st1.4h { v0, v1 }, [x0], x8
10007 ; SDAG-NEXT:    ret
10009 ; CHECK-GISEL-LABEL: test_v4i16_post_reg_st1x2:
10010 ; CHECK-GISEL:       ; %bb.0:
10011 ; CHECK-GISEL-NEXT:    mov x8, x0
10012 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #1
10013 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
10014 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
10015 ; CHECK-GISEL-NEXT:    st1.4h { v0, v1 }, [x8]
10016 ; CHECK-GISEL-NEXT:    ret
10017   call void @llvm.aarch64.neon.st1x2.v4i16.p0(<4 x i16> %B, <4 x i16> %C, ptr %A)
10018   %tmp = getelementptr i16, ptr %A, i64 %inc
10019   ret ptr %tmp
10022 declare void @llvm.aarch64.neon.st1x2.v4i16.p0(<4 x i16>, <4 x i16>, ptr)
10025 define ptr @test_v4i32_post_imm_st1x2(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C) nounwind {
10026 ; SDAG-LABEL: test_v4i32_post_imm_st1x2:
10027 ; SDAG:       ; %bb.0:
10028 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
10029 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
10030 ; SDAG-NEXT:    st1.4s { v0, v1 }, [x0], #32
10031 ; SDAG-NEXT:    ret
10033 ; CHECK-GISEL-LABEL: test_v4i32_post_imm_st1x2:
10034 ; CHECK-GISEL:       ; %bb.0:
10035 ; CHECK-GISEL-NEXT:    mov x8, x0
10036 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
10037 ; CHECK-GISEL-NEXT:    add x0, x0, #32
10038 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
10039 ; CHECK-GISEL-NEXT:    st1.4s { v0, v1 }, [x8]
10040 ; CHECK-GISEL-NEXT:    ret
10041   call void @llvm.aarch64.neon.st1x2.v4i32.p0(<4 x i32> %B, <4 x i32> %C, ptr %A)
10042   %tmp = getelementptr i32, ptr %A, i32 8
10043   ret ptr %tmp
10046 define ptr @test_v4i32_post_reg_st1x2(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, i64 %inc) nounwind {
10047 ; SDAG-LABEL: test_v4i32_post_reg_st1x2:
10048 ; SDAG:       ; %bb.0:
10049 ; SDAG-NEXT:    lsl x8, x2, #2
10050 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
10051 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
10052 ; SDAG-NEXT:    st1.4s { v0, v1 }, [x0], x8
10053 ; SDAG-NEXT:    ret
10055 ; CHECK-GISEL-LABEL: test_v4i32_post_reg_st1x2:
10056 ; CHECK-GISEL:       ; %bb.0:
10057 ; CHECK-GISEL-NEXT:    mov x8, x0
10058 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
10059 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
10060 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
10061 ; CHECK-GISEL-NEXT:    st1.4s { v0, v1 }, [x8]
10062 ; CHECK-GISEL-NEXT:    ret
10063   call void @llvm.aarch64.neon.st1x2.v4i32.p0(<4 x i32> %B, <4 x i32> %C, ptr %A)
10064   %tmp = getelementptr i32, ptr %A, i64 %inc
10065   ret ptr %tmp
10068 declare void @llvm.aarch64.neon.st1x2.v4i32.p0(<4 x i32>, <4 x i32>, ptr)
10071 define ptr @test_v2i32_post_imm_st1x2(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C) nounwind {
10072 ; SDAG-LABEL: test_v2i32_post_imm_st1x2:
10073 ; SDAG:       ; %bb.0:
10074 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
10075 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
10076 ; SDAG-NEXT:    st1.2s { v0, v1 }, [x0], #16
10077 ; SDAG-NEXT:    ret
10079 ; CHECK-GISEL-LABEL: test_v2i32_post_imm_st1x2:
10080 ; CHECK-GISEL:       ; %bb.0:
10081 ; CHECK-GISEL-NEXT:    mov x8, x0
10082 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
10083 ; CHECK-GISEL-NEXT:    add x0, x0, #16
10084 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
10085 ; CHECK-GISEL-NEXT:    st1.2s { v0, v1 }, [x8]
10086 ; CHECK-GISEL-NEXT:    ret
10087   call void @llvm.aarch64.neon.st1x2.v2i32.p0(<2 x i32> %B, <2 x i32> %C, ptr %A)
10088   %tmp = getelementptr i32, ptr %A, i32 4
10089   ret ptr %tmp
10092 define ptr @test_v2i32_post_reg_st1x2(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, i64 %inc) nounwind {
10093 ; SDAG-LABEL: test_v2i32_post_reg_st1x2:
10094 ; SDAG:       ; %bb.0:
10095 ; SDAG-NEXT:    lsl x8, x2, #2
10096 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
10097 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
10098 ; SDAG-NEXT:    st1.2s { v0, v1 }, [x0], x8
10099 ; SDAG-NEXT:    ret
10101 ; CHECK-GISEL-LABEL: test_v2i32_post_reg_st1x2:
10102 ; CHECK-GISEL:       ; %bb.0:
10103 ; CHECK-GISEL-NEXT:    mov x8, x0
10104 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
10105 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
10106 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
10107 ; CHECK-GISEL-NEXT:    st1.2s { v0, v1 }, [x8]
10108 ; CHECK-GISEL-NEXT:    ret
10109   call void @llvm.aarch64.neon.st1x2.v2i32.p0(<2 x i32> %B, <2 x i32> %C, ptr %A)
10110   %tmp = getelementptr i32, ptr %A, i64 %inc
10111   ret ptr %tmp
10114 declare void @llvm.aarch64.neon.st1x2.v2i32.p0(<2 x i32>, <2 x i32>, ptr)
10117 define ptr @test_v2i64_post_imm_st1x2(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C) nounwind {
10118 ; SDAG-LABEL: test_v2i64_post_imm_st1x2:
10119 ; SDAG:       ; %bb.0:
10120 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
10121 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
10122 ; SDAG-NEXT:    st1.2d { v0, v1 }, [x0], #32
10123 ; SDAG-NEXT:    ret
10125 ; CHECK-GISEL-LABEL: test_v2i64_post_imm_st1x2:
10126 ; CHECK-GISEL:       ; %bb.0:
10127 ; CHECK-GISEL-NEXT:    mov x8, x0
10128 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
10129 ; CHECK-GISEL-NEXT:    add x0, x0, #32
10130 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
10131 ; CHECK-GISEL-NEXT:    st1.2d { v0, v1 }, [x8]
10132 ; CHECK-GISEL-NEXT:    ret
10133   call void @llvm.aarch64.neon.st1x2.v2i64.p0(<2 x i64> %B, <2 x i64> %C, ptr %A)
10134   %tmp = getelementptr i64, ptr %A, i64 4
10135   ret ptr %tmp
10138 define ptr @test_v2i64_post_reg_st1x2(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, i64 %inc) nounwind {
10139 ; SDAG-LABEL: test_v2i64_post_reg_st1x2:
10140 ; SDAG:       ; %bb.0:
10141 ; SDAG-NEXT:    lsl x8, x2, #3
10142 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
10143 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
10144 ; SDAG-NEXT:    st1.2d { v0, v1 }, [x0], x8
10145 ; SDAG-NEXT:    ret
10147 ; CHECK-GISEL-LABEL: test_v2i64_post_reg_st1x2:
10148 ; CHECK-GISEL:       ; %bb.0:
10149 ; CHECK-GISEL-NEXT:    mov x8, x0
10150 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
10151 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
10152 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
10153 ; CHECK-GISEL-NEXT:    st1.2d { v0, v1 }, [x8]
10154 ; CHECK-GISEL-NEXT:    ret
10155   call void @llvm.aarch64.neon.st1x2.v2i64.p0(<2 x i64> %B, <2 x i64> %C, ptr %A)
10156   %tmp = getelementptr i64, ptr %A, i64 %inc
10157   ret ptr %tmp
10160 declare void @llvm.aarch64.neon.st1x2.v2i64.p0(<2 x i64>, <2 x i64>, ptr)
10163 define ptr @test_v1i64_post_imm_st1x2(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C) nounwind {
10164 ; SDAG-LABEL: test_v1i64_post_imm_st1x2:
10165 ; SDAG:       ; %bb.0:
10166 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
10167 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
10168 ; SDAG-NEXT:    st1.1d { v0, v1 }, [x0], #16
10169 ; SDAG-NEXT:    ret
10171 ; CHECK-GISEL-LABEL: test_v1i64_post_imm_st1x2:
10172 ; CHECK-GISEL:       ; %bb.0:
10173 ; CHECK-GISEL-NEXT:    mov x8, x0
10174 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
10175 ; CHECK-GISEL-NEXT:    add x0, x0, #16
10176 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
10177 ; CHECK-GISEL-NEXT:    st1.1d { v0, v1 }, [x8]
10178 ; CHECK-GISEL-NEXT:    ret
10179   call void @llvm.aarch64.neon.st1x2.v1i64.p0(<1 x i64> %B, <1 x i64> %C, ptr %A)
10180   %tmp = getelementptr i64, ptr %A, i64 2
10181   ret ptr %tmp
10184 define ptr @test_v1i64_post_reg_st1x2(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, i64 %inc) nounwind {
10185 ; SDAG-LABEL: test_v1i64_post_reg_st1x2:
10186 ; SDAG:       ; %bb.0:
10187 ; SDAG-NEXT:    lsl x8, x2, #3
10188 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
10189 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
10190 ; SDAG-NEXT:    st1.1d { v0, v1 }, [x0], x8
10191 ; SDAG-NEXT:    ret
10193 ; CHECK-GISEL-LABEL: test_v1i64_post_reg_st1x2:
10194 ; CHECK-GISEL:       ; %bb.0:
10195 ; CHECK-GISEL-NEXT:    mov x8, x0
10196 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
10197 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
10198 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
10199 ; CHECK-GISEL-NEXT:    st1.1d { v0, v1 }, [x8]
10200 ; CHECK-GISEL-NEXT:    ret
10201   call void @llvm.aarch64.neon.st1x2.v1i64.p0(<1 x i64> %B, <1 x i64> %C, ptr %A)
10202   %tmp = getelementptr i64, ptr %A, i64 %inc
10203   ret ptr %tmp
10206 declare void @llvm.aarch64.neon.st1x2.v1i64.p0(<1 x i64>, <1 x i64>, ptr)
10209 define ptr @test_v4f32_post_imm_st1x2(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C) nounwind {
10210 ; SDAG-LABEL: test_v4f32_post_imm_st1x2:
10211 ; SDAG:       ; %bb.0:
10212 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
10213 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
10214 ; SDAG-NEXT:    st1.4s { v0, v1 }, [x0], #32
10215 ; SDAG-NEXT:    ret
10217 ; CHECK-GISEL-LABEL: test_v4f32_post_imm_st1x2:
10218 ; CHECK-GISEL:       ; %bb.0:
10219 ; CHECK-GISEL-NEXT:    mov x8, x0
10220 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
10221 ; CHECK-GISEL-NEXT:    add x0, x0, #32
10222 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
10223 ; CHECK-GISEL-NEXT:    st1.4s { v0, v1 }, [x8]
10224 ; CHECK-GISEL-NEXT:    ret
10225   call void @llvm.aarch64.neon.st1x2.v4f32.p0(<4 x float> %B, <4 x float> %C, ptr %A)
10226   %tmp = getelementptr float, ptr %A, i32 8
10227   ret ptr %tmp
10230 define ptr @test_v4f32_post_reg_st1x2(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, i64 %inc) nounwind {
10231 ; SDAG-LABEL: test_v4f32_post_reg_st1x2:
10232 ; SDAG:       ; %bb.0:
10233 ; SDAG-NEXT:    lsl x8, x2, #2
10234 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
10235 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
10236 ; SDAG-NEXT:    st1.4s { v0, v1 }, [x0], x8
10237 ; SDAG-NEXT:    ret
10239 ; CHECK-GISEL-LABEL: test_v4f32_post_reg_st1x2:
10240 ; CHECK-GISEL:       ; %bb.0:
10241 ; CHECK-GISEL-NEXT:    mov x8, x0
10242 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
10243 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
10244 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
10245 ; CHECK-GISEL-NEXT:    st1.4s { v0, v1 }, [x8]
10246 ; CHECK-GISEL-NEXT:    ret
10247   call void @llvm.aarch64.neon.st1x2.v4f32.p0(<4 x float> %B, <4 x float> %C, ptr %A)
10248   %tmp = getelementptr float, ptr %A, i64 %inc
10249   ret ptr %tmp
10252 declare void @llvm.aarch64.neon.st1x2.v4f32.p0(<4 x float>, <4 x float>, ptr)
10255 define ptr @test_v2f32_post_imm_st1x2(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C) nounwind {
10256 ; SDAG-LABEL: test_v2f32_post_imm_st1x2:
10257 ; SDAG:       ; %bb.0:
10258 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
10259 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
10260 ; SDAG-NEXT:    st1.2s { v0, v1 }, [x0], #16
10261 ; SDAG-NEXT:    ret
10263 ; CHECK-GISEL-LABEL: test_v2f32_post_imm_st1x2:
10264 ; CHECK-GISEL:       ; %bb.0:
10265 ; CHECK-GISEL-NEXT:    mov x8, x0
10266 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
10267 ; CHECK-GISEL-NEXT:    add x0, x0, #16
10268 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
10269 ; CHECK-GISEL-NEXT:    st1.2s { v0, v1 }, [x8]
10270 ; CHECK-GISEL-NEXT:    ret
10271   call void @llvm.aarch64.neon.st1x2.v2f32.p0(<2 x float> %B, <2 x float> %C, ptr %A)
10272   %tmp = getelementptr float, ptr %A, i32 4
10273   ret ptr %tmp
10276 define ptr @test_v2f32_post_reg_st1x2(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, i64 %inc) nounwind {
10277 ; SDAG-LABEL: test_v2f32_post_reg_st1x2:
10278 ; SDAG:       ; %bb.0:
10279 ; SDAG-NEXT:    lsl x8, x2, #2
10280 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
10281 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
10282 ; SDAG-NEXT:    st1.2s { v0, v1 }, [x0], x8
10283 ; SDAG-NEXT:    ret
10285 ; CHECK-GISEL-LABEL: test_v2f32_post_reg_st1x2:
10286 ; CHECK-GISEL:       ; %bb.0:
10287 ; CHECK-GISEL-NEXT:    mov x8, x0
10288 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
10289 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
10290 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
10291 ; CHECK-GISEL-NEXT:    st1.2s { v0, v1 }, [x8]
10292 ; CHECK-GISEL-NEXT:    ret
10293   call void @llvm.aarch64.neon.st1x2.v2f32.p0(<2 x float> %B, <2 x float> %C, ptr %A)
10294   %tmp = getelementptr float, ptr %A, i64 %inc
10295   ret ptr %tmp
10298 declare void @llvm.aarch64.neon.st1x2.v2f32.p0(<2 x float>, <2 x float>, ptr)
10301 define ptr @test_v2f64_post_imm_st1x2(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C) nounwind {
10302 ; SDAG-LABEL: test_v2f64_post_imm_st1x2:
10303 ; SDAG:       ; %bb.0:
10304 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
10305 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
10306 ; SDAG-NEXT:    st1.2d { v0, v1 }, [x0], #32
10307 ; SDAG-NEXT:    ret
10309 ; CHECK-GISEL-LABEL: test_v2f64_post_imm_st1x2:
10310 ; CHECK-GISEL:       ; %bb.0:
10311 ; CHECK-GISEL-NEXT:    mov x8, x0
10312 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
10313 ; CHECK-GISEL-NEXT:    add x0, x0, #32
10314 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
10315 ; CHECK-GISEL-NEXT:    st1.2d { v0, v1 }, [x8]
10316 ; CHECK-GISEL-NEXT:    ret
10317   call void @llvm.aarch64.neon.st1x2.v2f64.p0(<2 x double> %B, <2 x double> %C, ptr %A)
10318   %tmp = getelementptr double, ptr %A, i64 4
10319   ret ptr %tmp
10322 define ptr @test_v2f64_post_reg_st1x2(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, i64 %inc) nounwind {
10323 ; SDAG-LABEL: test_v2f64_post_reg_st1x2:
10324 ; SDAG:       ; %bb.0:
10325 ; SDAG-NEXT:    lsl x8, x2, #3
10326 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
10327 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
10328 ; SDAG-NEXT:    st1.2d { v0, v1 }, [x0], x8
10329 ; SDAG-NEXT:    ret
10331 ; CHECK-GISEL-LABEL: test_v2f64_post_reg_st1x2:
10332 ; CHECK-GISEL:       ; %bb.0:
10333 ; CHECK-GISEL-NEXT:    mov x8, x0
10334 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
10335 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
10336 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
10337 ; CHECK-GISEL-NEXT:    st1.2d { v0, v1 }, [x8]
10338 ; CHECK-GISEL-NEXT:    ret
10339   call void @llvm.aarch64.neon.st1x2.v2f64.p0(<2 x double> %B, <2 x double> %C, ptr %A)
10340   %tmp = getelementptr double, ptr %A, i64 %inc
10341   ret ptr %tmp
10344 declare void @llvm.aarch64.neon.st1x2.v2f64.p0(<2 x double>, <2 x double>, ptr)
10347 define ptr @test_v1f64_post_imm_st1x2(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C) nounwind {
10348 ; SDAG-LABEL: test_v1f64_post_imm_st1x2:
10349 ; SDAG:       ; %bb.0:
10350 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
10351 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
10352 ; SDAG-NEXT:    st1.1d { v0, v1 }, [x0], #16
10353 ; SDAG-NEXT:    ret
10355 ; CHECK-GISEL-LABEL: test_v1f64_post_imm_st1x2:
10356 ; CHECK-GISEL:       ; %bb.0:
10357 ; CHECK-GISEL-NEXT:    mov x8, x0
10358 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
10359 ; CHECK-GISEL-NEXT:    add x0, x0, #16
10360 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
10361 ; CHECK-GISEL-NEXT:    st1.1d { v0, v1 }, [x8]
10362 ; CHECK-GISEL-NEXT:    ret
10363   call void @llvm.aarch64.neon.st1x2.v1f64.p0(<1 x double> %B, <1 x double> %C, ptr %A)
10364   %tmp = getelementptr double, ptr %A, i64 2
10365   ret ptr %tmp
10368 define ptr @test_v1f64_post_reg_st1x2(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, i64 %inc) nounwind {
10369 ; SDAG-LABEL: test_v1f64_post_reg_st1x2:
10370 ; SDAG:       ; %bb.0:
10371 ; SDAG-NEXT:    lsl x8, x2, #3
10372 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
10373 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
10374 ; SDAG-NEXT:    st1.1d { v0, v1 }, [x0], x8
10375 ; SDAG-NEXT:    ret
10377 ; CHECK-GISEL-LABEL: test_v1f64_post_reg_st1x2:
10378 ; CHECK-GISEL:       ; %bb.0:
10379 ; CHECK-GISEL-NEXT:    mov x8, x0
10380 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
10381 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1 def $d0_d1
10382 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1 def $d0_d1
10383 ; CHECK-GISEL-NEXT:    st1.1d { v0, v1 }, [x8]
10384 ; CHECK-GISEL-NEXT:    ret
10385   call void @llvm.aarch64.neon.st1x2.v1f64.p0(<1 x double> %B, <1 x double> %C, ptr %A)
10386   %tmp = getelementptr double, ptr %A, i64 %inc
10387   ret ptr %tmp
10390 declare void @llvm.aarch64.neon.st1x2.v1f64.p0(<1 x double>, <1 x double>, ptr)
10393 define ptr @test_v16i8_post_imm_st1x3(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D) nounwind {
10394 ; SDAG-LABEL: test_v16i8_post_imm_st1x3:
10395 ; SDAG:       ; %bb.0:
10396 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
10397 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
10398 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
10399 ; SDAG-NEXT:    st1.16b { v0, v1, v2 }, [x0], #48
10400 ; SDAG-NEXT:    ret
10402 ; CHECK-GISEL-LABEL: test_v16i8_post_imm_st1x3:
10403 ; CHECK-GISEL:       ; %bb.0:
10404 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
10405 ; CHECK-GISEL-NEXT:    mov x8, x0
10406 ; CHECK-GISEL-NEXT:    add x0, x0, #48
10407 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
10408 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
10409 ; CHECK-GISEL-NEXT:    st1.16b { v0, v1, v2 }, [x8]
10410 ; CHECK-GISEL-NEXT:    ret
10411   call void @llvm.aarch64.neon.st1x3.v16i8.p0(<16 x i8> %B, <16 x i8> %C, <16 x i8> %D, ptr %A)
10412   %tmp = getelementptr i8, ptr %A, i32 48
10413   ret ptr %tmp
10416 define ptr @test_v16i8_post_reg_st1x3(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D, i64 %inc) nounwind {
10417 ; SDAG-LABEL: test_v16i8_post_reg_st1x3:
10418 ; SDAG:       ; %bb.0:
10419 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
10420 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
10421 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
10422 ; SDAG-NEXT:    st1.16b { v0, v1, v2 }, [x0], x2
10423 ; SDAG-NEXT:    ret
10425 ; CHECK-GISEL-LABEL: test_v16i8_post_reg_st1x3:
10426 ; CHECK-GISEL:       ; %bb.0:
10427 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
10428 ; CHECK-GISEL-NEXT:    mov x8, x0
10429 ; CHECK-GISEL-NEXT:    add x0, x0, x2
10430 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
10431 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
10432 ; CHECK-GISEL-NEXT:    st1.16b { v0, v1, v2 }, [x8]
10433 ; CHECK-GISEL-NEXT:    ret
10434   call void @llvm.aarch64.neon.st1x3.v16i8.p0(<16 x i8> %B, <16 x i8> %C, <16 x i8> %D, ptr %A)
10435   %tmp = getelementptr i8, ptr %A, i64 %inc
10436   ret ptr %tmp
10439 declare void @llvm.aarch64.neon.st1x3.v16i8.p0(<16 x i8>, <16 x i8>, <16 x i8>, ptr)
10442 define ptr @test_v8i8_post_imm_st1x3(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, <8 x i8> %D) nounwind {
10443 ; SDAG-LABEL: test_v8i8_post_imm_st1x3:
10444 ; SDAG:       ; %bb.0:
10445 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
10446 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
10447 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
10448 ; SDAG-NEXT:    st1.8b { v0, v1, v2 }, [x0], #24
10449 ; SDAG-NEXT:    ret
10451 ; CHECK-GISEL-LABEL: test_v8i8_post_imm_st1x3:
10452 ; CHECK-GISEL:       ; %bb.0:
10453 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
10454 ; CHECK-GISEL-NEXT:    mov x8, x0
10455 ; CHECK-GISEL-NEXT:    add x0, x0, #24
10456 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
10457 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
10458 ; CHECK-GISEL-NEXT:    st1.8b { v0, v1, v2 }, [x8]
10459 ; CHECK-GISEL-NEXT:    ret
10460   call void @llvm.aarch64.neon.st1x3.v8i8.p0(<8 x i8> %B, <8 x i8> %C, <8 x i8> %D, ptr %A)
10461   %tmp = getelementptr i8, ptr %A, i32 24
10462   ret ptr %tmp
10465 define ptr @test_v8i8_post_reg_st1x3(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, <8 x i8> %D, i64 %inc) nounwind {
10466 ; SDAG-LABEL: test_v8i8_post_reg_st1x3:
10467 ; SDAG:       ; %bb.0:
10468 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
10469 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
10470 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
10471 ; SDAG-NEXT:    st1.8b { v0, v1, v2 }, [x0], x2
10472 ; SDAG-NEXT:    ret
10474 ; CHECK-GISEL-LABEL: test_v8i8_post_reg_st1x3:
10475 ; CHECK-GISEL:       ; %bb.0:
10476 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
10477 ; CHECK-GISEL-NEXT:    mov x8, x0
10478 ; CHECK-GISEL-NEXT:    add x0, x0, x2
10479 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
10480 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
10481 ; CHECK-GISEL-NEXT:    st1.8b { v0, v1, v2 }, [x8]
10482 ; CHECK-GISEL-NEXT:    ret
10483   call void @llvm.aarch64.neon.st1x3.v8i8.p0(<8 x i8> %B, <8 x i8> %C, <8 x i8> %D, ptr %A)
10484   %tmp = getelementptr i8, ptr %A, i64 %inc
10485   ret ptr %tmp
10488 declare void @llvm.aarch64.neon.st1x3.v8i8.p0(<8 x i8>, <8 x i8>, <8 x i8>, ptr)
10491 define ptr @test_v8i16_post_imm_st1x3(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D) nounwind {
10492 ; SDAG-LABEL: test_v8i16_post_imm_st1x3:
10493 ; SDAG:       ; %bb.0:
10494 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
10495 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
10496 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
10497 ; SDAG-NEXT:    st1.8h { v0, v1, v2 }, [x0], #48
10498 ; SDAG-NEXT:    ret
10500 ; CHECK-GISEL-LABEL: test_v8i16_post_imm_st1x3:
10501 ; CHECK-GISEL:       ; %bb.0:
10502 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
10503 ; CHECK-GISEL-NEXT:    mov x8, x0
10504 ; CHECK-GISEL-NEXT:    add x0, x0, #48
10505 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
10506 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
10507 ; CHECK-GISEL-NEXT:    st1.8h { v0, v1, v2 }, [x8]
10508 ; CHECK-GISEL-NEXT:    ret
10509   call void @llvm.aarch64.neon.st1x3.v8i16.p0(<8 x i16> %B, <8 x i16> %C, <8 x i16> %D, ptr %A)
10510   %tmp = getelementptr i16, ptr %A, i32 24
10511   ret ptr %tmp
10514 define ptr @test_v8i16_post_reg_st1x3(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D, i64 %inc) nounwind {
10515 ; SDAG-LABEL: test_v8i16_post_reg_st1x3:
10516 ; SDAG:       ; %bb.0:
10517 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
10518 ; SDAG-NEXT:    lsl x8, x2, #1
10519 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
10520 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
10521 ; SDAG-NEXT:    st1.8h { v0, v1, v2 }, [x0], x8
10522 ; SDAG-NEXT:    ret
10524 ; CHECK-GISEL-LABEL: test_v8i16_post_reg_st1x3:
10525 ; CHECK-GISEL:       ; %bb.0:
10526 ; CHECK-GISEL-NEXT:    mov x8, x0
10527 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
10528 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #1
10529 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
10530 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
10531 ; CHECK-GISEL-NEXT:    st1.8h { v0, v1, v2 }, [x8]
10532 ; CHECK-GISEL-NEXT:    ret
10533   call void @llvm.aarch64.neon.st1x3.v8i16.p0(<8 x i16> %B, <8 x i16> %C, <8 x i16> %D, ptr %A)
10534   %tmp = getelementptr i16, ptr %A, i64 %inc
10535   ret ptr %tmp
10538 declare void @llvm.aarch64.neon.st1x3.v8i16.p0(<8 x i16>, <8 x i16>, <8 x i16>, ptr)
10541 define ptr @test_v4i16_post_imm_st1x3(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, <4 x i16> %D) nounwind {
10542 ; SDAG-LABEL: test_v4i16_post_imm_st1x3:
10543 ; SDAG:       ; %bb.0:
10544 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
10545 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
10546 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
10547 ; SDAG-NEXT:    st1.4h { v0, v1, v2 }, [x0], #24
10548 ; SDAG-NEXT:    ret
10550 ; CHECK-GISEL-LABEL: test_v4i16_post_imm_st1x3:
10551 ; CHECK-GISEL:       ; %bb.0:
10552 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
10553 ; CHECK-GISEL-NEXT:    mov x8, x0
10554 ; CHECK-GISEL-NEXT:    add x0, x0, #24
10555 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
10556 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
10557 ; CHECK-GISEL-NEXT:    st1.4h { v0, v1, v2 }, [x8]
10558 ; CHECK-GISEL-NEXT:    ret
10559   call void @llvm.aarch64.neon.st1x3.v4i16.p0(<4 x i16> %B, <4 x i16> %C, <4 x i16> %D, ptr %A)
10560   %tmp = getelementptr i16, ptr %A, i32 12
10561   ret ptr %tmp
10564 define ptr @test_v4i16_post_reg_st1x3(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, <4 x i16> %D, i64 %inc) nounwind {
10565 ; SDAG-LABEL: test_v4i16_post_reg_st1x3:
10566 ; SDAG:       ; %bb.0:
10567 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
10568 ; SDAG-NEXT:    lsl x8, x2, #1
10569 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
10570 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
10571 ; SDAG-NEXT:    st1.4h { v0, v1, v2 }, [x0], x8
10572 ; SDAG-NEXT:    ret
10574 ; CHECK-GISEL-LABEL: test_v4i16_post_reg_st1x3:
10575 ; CHECK-GISEL:       ; %bb.0:
10576 ; CHECK-GISEL-NEXT:    mov x8, x0
10577 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
10578 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #1
10579 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
10580 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
10581 ; CHECK-GISEL-NEXT:    st1.4h { v0, v1, v2 }, [x8]
10582 ; CHECK-GISEL-NEXT:    ret
10583   call void @llvm.aarch64.neon.st1x3.v4i16.p0(<4 x i16> %B, <4 x i16> %C, <4 x i16> %D, ptr %A)
10584   %tmp = getelementptr i16, ptr %A, i64 %inc
10585   ret ptr %tmp
10588 declare void @llvm.aarch64.neon.st1x3.v4i16.p0(<4 x i16>, <4 x i16>, <4 x i16>, ptr)
10591 define ptr @test_v4i32_post_imm_st1x3(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D) nounwind {
10592 ; SDAG-LABEL: test_v4i32_post_imm_st1x3:
10593 ; SDAG:       ; %bb.0:
10594 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
10595 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
10596 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
10597 ; SDAG-NEXT:    st1.4s { v0, v1, v2 }, [x0], #48
10598 ; SDAG-NEXT:    ret
10600 ; CHECK-GISEL-LABEL: test_v4i32_post_imm_st1x3:
10601 ; CHECK-GISEL:       ; %bb.0:
10602 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
10603 ; CHECK-GISEL-NEXT:    mov x8, x0
10604 ; CHECK-GISEL-NEXT:    add x0, x0, #48
10605 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
10606 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
10607 ; CHECK-GISEL-NEXT:    st1.4s { v0, v1, v2 }, [x8]
10608 ; CHECK-GISEL-NEXT:    ret
10609   call void @llvm.aarch64.neon.st1x3.v4i32.p0(<4 x i32> %B, <4 x i32> %C, <4 x i32> %D, ptr %A)
10610   %tmp = getelementptr i32, ptr %A, i32 12
10611   ret ptr %tmp
10614 define ptr @test_v4i32_post_reg_st1x3(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D, i64 %inc) nounwind {
10615 ; SDAG-LABEL: test_v4i32_post_reg_st1x3:
10616 ; SDAG:       ; %bb.0:
10617 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
10618 ; SDAG-NEXT:    lsl x8, x2, #2
10619 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
10620 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
10621 ; SDAG-NEXT:    st1.4s { v0, v1, v2 }, [x0], x8
10622 ; SDAG-NEXT:    ret
10624 ; CHECK-GISEL-LABEL: test_v4i32_post_reg_st1x3:
10625 ; CHECK-GISEL:       ; %bb.0:
10626 ; CHECK-GISEL-NEXT:    mov x8, x0
10627 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
10628 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
10629 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
10630 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
10631 ; CHECK-GISEL-NEXT:    st1.4s { v0, v1, v2 }, [x8]
10632 ; CHECK-GISEL-NEXT:    ret
10633   call void @llvm.aarch64.neon.st1x3.v4i32.p0(<4 x i32> %B, <4 x i32> %C, <4 x i32> %D, ptr %A)
10634   %tmp = getelementptr i32, ptr %A, i64 %inc
10635   ret ptr %tmp
10638 declare void @llvm.aarch64.neon.st1x3.v4i32.p0(<4 x i32>, <4 x i32>, <4 x i32>, ptr)
10641 define ptr @test_v2i32_post_imm_st1x3(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, <2 x i32> %D) nounwind {
10642 ; SDAG-LABEL: test_v2i32_post_imm_st1x3:
10643 ; SDAG:       ; %bb.0:
10644 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
10645 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
10646 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
10647 ; SDAG-NEXT:    st1.2s { v0, v1, v2 }, [x0], #24
10648 ; SDAG-NEXT:    ret
10650 ; CHECK-GISEL-LABEL: test_v2i32_post_imm_st1x3:
10651 ; CHECK-GISEL:       ; %bb.0:
10652 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
10653 ; CHECK-GISEL-NEXT:    mov x8, x0
10654 ; CHECK-GISEL-NEXT:    add x0, x0, #24
10655 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
10656 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
10657 ; CHECK-GISEL-NEXT:    st1.2s { v0, v1, v2 }, [x8]
10658 ; CHECK-GISEL-NEXT:    ret
10659   call void @llvm.aarch64.neon.st1x3.v2i32.p0(<2 x i32> %B, <2 x i32> %C, <2 x i32> %D, ptr %A)
10660   %tmp = getelementptr i32, ptr %A, i32 6
10661   ret ptr %tmp
10664 define ptr @test_v2i32_post_reg_st1x3(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, <2 x i32> %D, i64 %inc) nounwind {
10665 ; SDAG-LABEL: test_v2i32_post_reg_st1x3:
10666 ; SDAG:       ; %bb.0:
10667 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
10668 ; SDAG-NEXT:    lsl x8, x2, #2
10669 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
10670 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
10671 ; SDAG-NEXT:    st1.2s { v0, v1, v2 }, [x0], x8
10672 ; SDAG-NEXT:    ret
10674 ; CHECK-GISEL-LABEL: test_v2i32_post_reg_st1x3:
10675 ; CHECK-GISEL:       ; %bb.0:
10676 ; CHECK-GISEL-NEXT:    mov x8, x0
10677 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
10678 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
10679 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
10680 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
10681 ; CHECK-GISEL-NEXT:    st1.2s { v0, v1, v2 }, [x8]
10682 ; CHECK-GISEL-NEXT:    ret
10683   call void @llvm.aarch64.neon.st1x3.v2i32.p0(<2 x i32> %B, <2 x i32> %C, <2 x i32> %D, ptr %A)
10684   %tmp = getelementptr i32, ptr %A, i64 %inc
10685   ret ptr %tmp
10688 declare void @llvm.aarch64.neon.st1x3.v2i32.p0(<2 x i32>, <2 x i32>, <2 x i32>, ptr)
10691 define ptr @test_v2i64_post_imm_st1x3(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D) nounwind {
10692 ; SDAG-LABEL: test_v2i64_post_imm_st1x3:
10693 ; SDAG:       ; %bb.0:
10694 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
10695 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
10696 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
10697 ; SDAG-NEXT:    st1.2d { v0, v1, v2 }, [x0], #48
10698 ; SDAG-NEXT:    ret
10700 ; CHECK-GISEL-LABEL: test_v2i64_post_imm_st1x3:
10701 ; CHECK-GISEL:       ; %bb.0:
10702 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
10703 ; CHECK-GISEL-NEXT:    mov x8, x0
10704 ; CHECK-GISEL-NEXT:    add x0, x0, #48
10705 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
10706 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
10707 ; CHECK-GISEL-NEXT:    st1.2d { v0, v1, v2 }, [x8]
10708 ; CHECK-GISEL-NEXT:    ret
10709   call void @llvm.aarch64.neon.st1x3.v2i64.p0(<2 x i64> %B, <2 x i64> %C, <2 x i64> %D, ptr %A)
10710   %tmp = getelementptr i64, ptr %A, i64 6
10711   ret ptr %tmp
10714 define ptr @test_v2i64_post_reg_st1x3(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D, i64 %inc) nounwind {
10715 ; SDAG-LABEL: test_v2i64_post_reg_st1x3:
10716 ; SDAG:       ; %bb.0:
10717 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
10718 ; SDAG-NEXT:    lsl x8, x2, #3
10719 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
10720 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
10721 ; SDAG-NEXT:    st1.2d { v0, v1, v2 }, [x0], x8
10722 ; SDAG-NEXT:    ret
10724 ; CHECK-GISEL-LABEL: test_v2i64_post_reg_st1x3:
10725 ; CHECK-GISEL:       ; %bb.0:
10726 ; CHECK-GISEL-NEXT:    mov x8, x0
10727 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
10728 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
10729 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
10730 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
10731 ; CHECK-GISEL-NEXT:    st1.2d { v0, v1, v2 }, [x8]
10732 ; CHECK-GISEL-NEXT:    ret
10733   call void @llvm.aarch64.neon.st1x3.v2i64.p0(<2 x i64> %B, <2 x i64> %C, <2 x i64> %D, ptr %A)
10734   %tmp = getelementptr i64, ptr %A, i64 %inc
10735   ret ptr %tmp
10738 declare void @llvm.aarch64.neon.st1x3.v2i64.p0(<2 x i64>, <2 x i64>, <2 x i64>, ptr)
10741 define ptr @test_v1i64_post_imm_st1x3(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, <1 x i64> %D) nounwind {
10742 ; SDAG-LABEL: test_v1i64_post_imm_st1x3:
10743 ; SDAG:       ; %bb.0:
10744 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
10745 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
10746 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
10747 ; SDAG-NEXT:    st1.1d { v0, v1, v2 }, [x0], #24
10748 ; SDAG-NEXT:    ret
10750 ; CHECK-GISEL-LABEL: test_v1i64_post_imm_st1x3:
10751 ; CHECK-GISEL:       ; %bb.0:
10752 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
10753 ; CHECK-GISEL-NEXT:    mov x8, x0
10754 ; CHECK-GISEL-NEXT:    add x0, x0, #24
10755 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
10756 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
10757 ; CHECK-GISEL-NEXT:    st1.1d { v0, v1, v2 }, [x8]
10758 ; CHECK-GISEL-NEXT:    ret
10759   call void @llvm.aarch64.neon.st1x3.v1i64.p0(<1 x i64> %B, <1 x i64> %C, <1 x i64> %D, ptr %A)
10760   %tmp = getelementptr i64, ptr %A, i64 3
10761   ret ptr %tmp
10764 define ptr @test_v1i64_post_reg_st1x3(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, <1 x i64> %D, i64 %inc) nounwind {
10765 ; SDAG-LABEL: test_v1i64_post_reg_st1x3:
10766 ; SDAG:       ; %bb.0:
10767 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
10768 ; SDAG-NEXT:    lsl x8, x2, #3
10769 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
10770 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
10771 ; SDAG-NEXT:    st1.1d { v0, v1, v2 }, [x0], x8
10772 ; SDAG-NEXT:    ret
10774 ; CHECK-GISEL-LABEL: test_v1i64_post_reg_st1x3:
10775 ; CHECK-GISEL:       ; %bb.0:
10776 ; CHECK-GISEL-NEXT:    mov x8, x0
10777 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
10778 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
10779 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
10780 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
10781 ; CHECK-GISEL-NEXT:    st1.1d { v0, v1, v2 }, [x8]
10782 ; CHECK-GISEL-NEXT:    ret
10783   call void @llvm.aarch64.neon.st1x3.v1i64.p0(<1 x i64> %B, <1 x i64> %C, <1 x i64> %D, ptr %A)
10784   %tmp = getelementptr i64, ptr %A, i64 %inc
10785   ret ptr %tmp
10788 declare void @llvm.aarch64.neon.st1x3.v1i64.p0(<1 x i64>, <1 x i64>, <1 x i64>, ptr)
10791 define ptr @test_v4f32_post_imm_st1x3(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, <4 x float> %D) nounwind {
10792 ; SDAG-LABEL: test_v4f32_post_imm_st1x3:
10793 ; SDAG:       ; %bb.0:
10794 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
10795 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
10796 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
10797 ; SDAG-NEXT:    st1.4s { v0, v1, v2 }, [x0], #48
10798 ; SDAG-NEXT:    ret
10800 ; CHECK-GISEL-LABEL: test_v4f32_post_imm_st1x3:
10801 ; CHECK-GISEL:       ; %bb.0:
10802 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
10803 ; CHECK-GISEL-NEXT:    mov x8, x0
10804 ; CHECK-GISEL-NEXT:    add x0, x0, #48
10805 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
10806 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
10807 ; CHECK-GISEL-NEXT:    st1.4s { v0, v1, v2 }, [x8]
10808 ; CHECK-GISEL-NEXT:    ret
10809   call void @llvm.aarch64.neon.st1x3.v4f32.p0(<4 x float> %B, <4 x float> %C, <4 x float> %D, ptr %A)
10810   %tmp = getelementptr float, ptr %A, i32 12
10811   ret ptr %tmp
10814 define ptr @test_v4f32_post_reg_st1x3(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, <4 x float> %D, i64 %inc) nounwind {
10815 ; SDAG-LABEL: test_v4f32_post_reg_st1x3:
10816 ; SDAG:       ; %bb.0:
10817 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
10818 ; SDAG-NEXT:    lsl x8, x2, #2
10819 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
10820 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
10821 ; SDAG-NEXT:    st1.4s { v0, v1, v2 }, [x0], x8
10822 ; SDAG-NEXT:    ret
10824 ; CHECK-GISEL-LABEL: test_v4f32_post_reg_st1x3:
10825 ; CHECK-GISEL:       ; %bb.0:
10826 ; CHECK-GISEL-NEXT:    mov x8, x0
10827 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
10828 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
10829 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
10830 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
10831 ; CHECK-GISEL-NEXT:    st1.4s { v0, v1, v2 }, [x8]
10832 ; CHECK-GISEL-NEXT:    ret
10833   call void @llvm.aarch64.neon.st1x3.v4f32.p0(<4 x float> %B, <4 x float> %C, <4 x float> %D, ptr %A)
10834   %tmp = getelementptr float, ptr %A, i64 %inc
10835   ret ptr %tmp
10838 declare void @llvm.aarch64.neon.st1x3.v4f32.p0(<4 x float>, <4 x float>, <4 x float>, ptr)
10841 define ptr @test_v2f32_post_imm_st1x3(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, <2 x float> %D) nounwind {
10842 ; SDAG-LABEL: test_v2f32_post_imm_st1x3:
10843 ; SDAG:       ; %bb.0:
10844 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
10845 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
10846 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
10847 ; SDAG-NEXT:    st1.2s { v0, v1, v2 }, [x0], #24
10848 ; SDAG-NEXT:    ret
10850 ; CHECK-GISEL-LABEL: test_v2f32_post_imm_st1x3:
10851 ; CHECK-GISEL:       ; %bb.0:
10852 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
10853 ; CHECK-GISEL-NEXT:    mov x8, x0
10854 ; CHECK-GISEL-NEXT:    add x0, x0, #24
10855 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
10856 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
10857 ; CHECK-GISEL-NEXT:    st1.2s { v0, v1, v2 }, [x8]
10858 ; CHECK-GISEL-NEXT:    ret
10859   call void @llvm.aarch64.neon.st1x3.v2f32.p0(<2 x float> %B, <2 x float> %C, <2 x float> %D, ptr %A)
10860   %tmp = getelementptr float, ptr %A, i32 6
10861   ret ptr %tmp
10864 define ptr @test_v2f32_post_reg_st1x3(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, <2 x float> %D, i64 %inc) nounwind {
10865 ; SDAG-LABEL: test_v2f32_post_reg_st1x3:
10866 ; SDAG:       ; %bb.0:
10867 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
10868 ; SDAG-NEXT:    lsl x8, x2, #2
10869 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
10870 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
10871 ; SDAG-NEXT:    st1.2s { v0, v1, v2 }, [x0], x8
10872 ; SDAG-NEXT:    ret
10874 ; CHECK-GISEL-LABEL: test_v2f32_post_reg_st1x3:
10875 ; CHECK-GISEL:       ; %bb.0:
10876 ; CHECK-GISEL-NEXT:    mov x8, x0
10877 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
10878 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
10879 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
10880 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
10881 ; CHECK-GISEL-NEXT:    st1.2s { v0, v1, v2 }, [x8]
10882 ; CHECK-GISEL-NEXT:    ret
10883   call void @llvm.aarch64.neon.st1x3.v2f32.p0(<2 x float> %B, <2 x float> %C, <2 x float> %D, ptr %A)
10884   %tmp = getelementptr float, ptr %A, i64 %inc
10885   ret ptr %tmp
10888 declare void @llvm.aarch64.neon.st1x3.v2f32.p0(<2 x float>, <2 x float>, <2 x float>, ptr)
10891 define ptr @test_v2f64_post_imm_st1x3(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, <2 x double> %D) nounwind {
10892 ; SDAG-LABEL: test_v2f64_post_imm_st1x3:
10893 ; SDAG:       ; %bb.0:
10894 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
10895 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
10896 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
10897 ; SDAG-NEXT:    st1.2d { v0, v1, v2 }, [x0], #48
10898 ; SDAG-NEXT:    ret
10900 ; CHECK-GISEL-LABEL: test_v2f64_post_imm_st1x3:
10901 ; CHECK-GISEL:       ; %bb.0:
10902 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
10903 ; CHECK-GISEL-NEXT:    mov x8, x0
10904 ; CHECK-GISEL-NEXT:    add x0, x0, #48
10905 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
10906 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
10907 ; CHECK-GISEL-NEXT:    st1.2d { v0, v1, v2 }, [x8]
10908 ; CHECK-GISEL-NEXT:    ret
10909   call void @llvm.aarch64.neon.st1x3.v2f64.p0(<2 x double> %B, <2 x double> %C, <2 x double> %D, ptr %A)
10910   %tmp = getelementptr double, ptr %A, i64 6
10911   ret ptr %tmp
10914 define ptr @test_v2f64_post_reg_st1x3(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, <2 x double> %D, i64 %inc) nounwind {
10915 ; SDAG-LABEL: test_v2f64_post_reg_st1x3:
10916 ; SDAG:       ; %bb.0:
10917 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
10918 ; SDAG-NEXT:    lsl x8, x2, #3
10919 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
10920 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
10921 ; SDAG-NEXT:    st1.2d { v0, v1, v2 }, [x0], x8
10922 ; SDAG-NEXT:    ret
10924 ; CHECK-GISEL-LABEL: test_v2f64_post_reg_st1x3:
10925 ; CHECK-GISEL:       ; %bb.0:
10926 ; CHECK-GISEL-NEXT:    mov x8, x0
10927 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
10928 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
10929 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
10930 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
10931 ; CHECK-GISEL-NEXT:    st1.2d { v0, v1, v2 }, [x8]
10932 ; CHECK-GISEL-NEXT:    ret
10933   call void @llvm.aarch64.neon.st1x3.v2f64.p0(<2 x double> %B, <2 x double> %C, <2 x double> %D, ptr %A)
10934   %tmp = getelementptr double, ptr %A, i64 %inc
10935   ret ptr %tmp
10938 declare void @llvm.aarch64.neon.st1x3.v2f64.p0(<2 x double>, <2 x double>, <2 x double>, ptr)
10941 define ptr @test_v1f64_post_imm_st1x3(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, <1 x double> %D) nounwind {
10942 ; SDAG-LABEL: test_v1f64_post_imm_st1x3:
10943 ; SDAG:       ; %bb.0:
10944 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
10945 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
10946 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
10947 ; SDAG-NEXT:    st1.1d { v0, v1, v2 }, [x0], #24
10948 ; SDAG-NEXT:    ret
10950 ; CHECK-GISEL-LABEL: test_v1f64_post_imm_st1x3:
10951 ; CHECK-GISEL:       ; %bb.0:
10952 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
10953 ; CHECK-GISEL-NEXT:    mov x8, x0
10954 ; CHECK-GISEL-NEXT:    add x0, x0, #24
10955 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
10956 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
10957 ; CHECK-GISEL-NEXT:    st1.1d { v0, v1, v2 }, [x8]
10958 ; CHECK-GISEL-NEXT:    ret
10959   call void @llvm.aarch64.neon.st1x3.v1f64.p0(<1 x double> %B, <1 x double> %C, <1 x double> %D, ptr %A)
10960   %tmp = getelementptr double, ptr %A, i64 3
10961   ret ptr %tmp
10964 define ptr @test_v1f64_post_reg_st1x3(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, <1 x double> %D, i64 %inc) nounwind {
10965 ; SDAG-LABEL: test_v1f64_post_reg_st1x3:
10966 ; SDAG:       ; %bb.0:
10967 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
10968 ; SDAG-NEXT:    lsl x8, x2, #3
10969 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
10970 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
10971 ; SDAG-NEXT:    st1.1d { v0, v1, v2 }, [x0], x8
10972 ; SDAG-NEXT:    ret
10974 ; CHECK-GISEL-LABEL: test_v1f64_post_reg_st1x3:
10975 ; CHECK-GISEL:       ; %bb.0:
10976 ; CHECK-GISEL-NEXT:    mov x8, x0
10977 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2 def $d0_d1_d2
10978 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
10979 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2 def $d0_d1_d2
10980 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2 def $d0_d1_d2
10981 ; CHECK-GISEL-NEXT:    st1.1d { v0, v1, v2 }, [x8]
10982 ; CHECK-GISEL-NEXT:    ret
10983   call void @llvm.aarch64.neon.st1x3.v1f64.p0(<1 x double> %B, <1 x double> %C, <1 x double> %D, ptr %A)
10984   %tmp = getelementptr double, ptr %A, i64 %inc
10985   ret ptr %tmp
10988 declare void @llvm.aarch64.neon.st1x3.v1f64.p0(<1 x double>, <1 x double>, <1 x double>, ptr)
10991 define ptr @test_v16i8_post_imm_st1x4(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D, <16 x i8> %E) nounwind {
10992 ; SDAG-LABEL: test_v16i8_post_imm_st1x4:
10993 ; SDAG:       ; %bb.0:
10994 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
10995 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
10996 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
10997 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
10998 ; SDAG-NEXT:    st1.16b { v0, v1, v2, v3 }, [x0], #64
10999 ; SDAG-NEXT:    ret
11001 ; CHECK-GISEL-LABEL: test_v16i8_post_imm_st1x4:
11002 ; CHECK-GISEL:       ; %bb.0:
11003 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11004 ; CHECK-GISEL-NEXT:    mov x8, x0
11005 ; CHECK-GISEL-NEXT:    add x0, x0, #64
11006 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11007 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11008 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11009 ; CHECK-GISEL-NEXT:    st1.16b { v0, v1, v2, v3 }, [x8]
11010 ; CHECK-GISEL-NEXT:    ret
11011   call void @llvm.aarch64.neon.st1x4.v16i8.p0(<16 x i8> %B, <16 x i8> %C, <16 x i8> %D, <16 x i8> %E, ptr %A)
11012   %tmp = getelementptr i8, ptr %A, i32 64
11013   ret ptr %tmp
11016 define ptr @test_v16i8_post_reg_st1x4(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D, <16 x i8> %E, i64 %inc) nounwind {
11017 ; SDAG-LABEL: test_v16i8_post_reg_st1x4:
11018 ; SDAG:       ; %bb.0:
11019 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11020 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11021 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11022 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11023 ; SDAG-NEXT:    st1.16b { v0, v1, v2, v3 }, [x0], x2
11024 ; SDAG-NEXT:    ret
11026 ; CHECK-GISEL-LABEL: test_v16i8_post_reg_st1x4:
11027 ; CHECK-GISEL:       ; %bb.0:
11028 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11029 ; CHECK-GISEL-NEXT:    mov x8, x0
11030 ; CHECK-GISEL-NEXT:    add x0, x0, x2
11031 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11032 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11033 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11034 ; CHECK-GISEL-NEXT:    st1.16b { v0, v1, v2, v3 }, [x8]
11035 ; CHECK-GISEL-NEXT:    ret
11036   call void @llvm.aarch64.neon.st1x4.v16i8.p0(<16 x i8> %B, <16 x i8> %C, <16 x i8> %D, <16 x i8> %E, ptr %A)
11037   %tmp = getelementptr i8, ptr %A, i64 %inc
11038   ret ptr %tmp
11041 declare void @llvm.aarch64.neon.st1x4.v16i8.p0(<16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, ptr)
11044 define ptr @test_v8i8_post_imm_st1x4(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, <8 x i8> %D, <8 x i8> %E) nounwind {
11045 ; SDAG-LABEL: test_v8i8_post_imm_st1x4:
11046 ; SDAG:       ; %bb.0:
11047 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11048 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11049 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11050 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11051 ; SDAG-NEXT:    st1.8b { v0, v1, v2, v3 }, [x0], #32
11052 ; SDAG-NEXT:    ret
11054 ; CHECK-GISEL-LABEL: test_v8i8_post_imm_st1x4:
11055 ; CHECK-GISEL:       ; %bb.0:
11056 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11057 ; CHECK-GISEL-NEXT:    mov x8, x0
11058 ; CHECK-GISEL-NEXT:    add x0, x0, #32
11059 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11060 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11061 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11062 ; CHECK-GISEL-NEXT:    st1.8b { v0, v1, v2, v3 }, [x8]
11063 ; CHECK-GISEL-NEXT:    ret
11064   call void @llvm.aarch64.neon.st1x4.v8i8.p0(<8 x i8> %B, <8 x i8> %C, <8 x i8> %D, <8 x i8> %E, ptr %A)
11065   %tmp = getelementptr i8, ptr %A, i32 32
11066   ret ptr %tmp
11069 define ptr @test_v8i8_post_reg_st1x4(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, <8 x i8> %D, <8 x i8> %E, i64 %inc) nounwind {
11070 ; SDAG-LABEL: test_v8i8_post_reg_st1x4:
11071 ; SDAG:       ; %bb.0:
11072 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11073 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11074 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11075 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11076 ; SDAG-NEXT:    st1.8b { v0, v1, v2, v3 }, [x0], x2
11077 ; SDAG-NEXT:    ret
11079 ; CHECK-GISEL-LABEL: test_v8i8_post_reg_st1x4:
11080 ; CHECK-GISEL:       ; %bb.0:
11081 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11082 ; CHECK-GISEL-NEXT:    mov x8, x0
11083 ; CHECK-GISEL-NEXT:    add x0, x0, x2
11084 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11085 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11086 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11087 ; CHECK-GISEL-NEXT:    st1.8b { v0, v1, v2, v3 }, [x8]
11088 ; CHECK-GISEL-NEXT:    ret
11089   call void @llvm.aarch64.neon.st1x4.v8i8.p0(<8 x i8> %B, <8 x i8> %C, <8 x i8> %D, <8 x i8> %E, ptr %A)
11090   %tmp = getelementptr i8, ptr %A, i64 %inc
11091   ret ptr %tmp
11094 declare void @llvm.aarch64.neon.st1x4.v8i8.p0(<8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, ptr)
11097 define ptr @test_v8i16_post_imm_st1x4(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D, <8 x i16> %E) nounwind {
11098 ; SDAG-LABEL: test_v8i16_post_imm_st1x4:
11099 ; SDAG:       ; %bb.0:
11100 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11101 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11102 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11103 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11104 ; SDAG-NEXT:    st1.8h { v0, v1, v2, v3 }, [x0], #64
11105 ; SDAG-NEXT:    ret
11107 ; CHECK-GISEL-LABEL: test_v8i16_post_imm_st1x4:
11108 ; CHECK-GISEL:       ; %bb.0:
11109 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11110 ; CHECK-GISEL-NEXT:    mov x8, x0
11111 ; CHECK-GISEL-NEXT:    add x0, x0, #64
11112 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11113 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11114 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11115 ; CHECK-GISEL-NEXT:    st1.8h { v0, v1, v2, v3 }, [x8]
11116 ; CHECK-GISEL-NEXT:    ret
11117   call void @llvm.aarch64.neon.st1x4.v8i16.p0(<8 x i16> %B, <8 x i16> %C, <8 x i16> %D, <8 x i16> %E, ptr %A)
11118   %tmp = getelementptr i16, ptr %A, i32 32
11119   ret ptr %tmp
11122 define ptr @test_v8i16_post_reg_st1x4(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D, <8 x i16> %E, i64 %inc) nounwind {
11123 ; SDAG-LABEL: test_v8i16_post_reg_st1x4:
11124 ; SDAG:       ; %bb.0:
11125 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11126 ; SDAG-NEXT:    lsl x8, x2, #1
11127 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11128 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11129 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11130 ; SDAG-NEXT:    st1.8h { v0, v1, v2, v3 }, [x0], x8
11131 ; SDAG-NEXT:    ret
11133 ; CHECK-GISEL-LABEL: test_v8i16_post_reg_st1x4:
11134 ; CHECK-GISEL:       ; %bb.0:
11135 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11136 ; CHECK-GISEL-NEXT:    mov x8, x0
11137 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #1
11138 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11139 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11140 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11141 ; CHECK-GISEL-NEXT:    st1.8h { v0, v1, v2, v3 }, [x8]
11142 ; CHECK-GISEL-NEXT:    ret
11143   call void @llvm.aarch64.neon.st1x4.v8i16.p0(<8 x i16> %B, <8 x i16> %C, <8 x i16> %D, <8 x i16> %E, ptr %A)
11144   %tmp = getelementptr i16, ptr %A, i64 %inc
11145   ret ptr %tmp
11148 declare void @llvm.aarch64.neon.st1x4.v8i16.p0(<8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, ptr)
11151 define ptr @test_v4i16_post_imm_st1x4(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, <4 x i16> %D, <4 x i16> %E) nounwind {
11152 ; SDAG-LABEL: test_v4i16_post_imm_st1x4:
11153 ; SDAG:       ; %bb.0:
11154 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11155 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11156 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11157 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11158 ; SDAG-NEXT:    st1.4h { v0, v1, v2, v3 }, [x0], #32
11159 ; SDAG-NEXT:    ret
11161 ; CHECK-GISEL-LABEL: test_v4i16_post_imm_st1x4:
11162 ; CHECK-GISEL:       ; %bb.0:
11163 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11164 ; CHECK-GISEL-NEXT:    mov x8, x0
11165 ; CHECK-GISEL-NEXT:    add x0, x0, #32
11166 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11167 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11168 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11169 ; CHECK-GISEL-NEXT:    st1.4h { v0, v1, v2, v3 }, [x8]
11170 ; CHECK-GISEL-NEXT:    ret
11171   call void @llvm.aarch64.neon.st1x4.v4i16.p0(<4 x i16> %B, <4 x i16> %C, <4 x i16> %D, <4 x i16> %E, ptr %A)
11172   %tmp = getelementptr i16, ptr %A, i32 16
11173   ret ptr %tmp
11176 define ptr @test_v4i16_post_reg_st1x4(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, <4 x i16> %D, <4 x i16> %E, i64 %inc) nounwind {
11177 ; SDAG-LABEL: test_v4i16_post_reg_st1x4:
11178 ; SDAG:       ; %bb.0:
11179 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11180 ; SDAG-NEXT:    lsl x8, x2, #1
11181 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11182 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11183 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11184 ; SDAG-NEXT:    st1.4h { v0, v1, v2, v3 }, [x0], x8
11185 ; SDAG-NEXT:    ret
11187 ; CHECK-GISEL-LABEL: test_v4i16_post_reg_st1x4:
11188 ; CHECK-GISEL:       ; %bb.0:
11189 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11190 ; CHECK-GISEL-NEXT:    mov x8, x0
11191 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #1
11192 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11193 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11194 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11195 ; CHECK-GISEL-NEXT:    st1.4h { v0, v1, v2, v3 }, [x8]
11196 ; CHECK-GISEL-NEXT:    ret
11197   call void @llvm.aarch64.neon.st1x4.v4i16.p0(<4 x i16> %B, <4 x i16> %C, <4 x i16> %D, <4 x i16> %E, ptr %A)
11198   %tmp = getelementptr i16, ptr %A, i64 %inc
11199   ret ptr %tmp
11202 declare void @llvm.aarch64.neon.st1x4.v4i16.p0(<4 x i16>, <4 x i16>, <4 x i16>,<4 x i16>,  ptr)
11205 define ptr @test_v4i32_post_imm_st1x4(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D, <4 x i32> %E) nounwind {
11206 ; SDAG-LABEL: test_v4i32_post_imm_st1x4:
11207 ; SDAG:       ; %bb.0:
11208 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11209 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11210 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11211 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11212 ; SDAG-NEXT:    st1.4s { v0, v1, v2, v3 }, [x0], #64
11213 ; SDAG-NEXT:    ret
11215 ; CHECK-GISEL-LABEL: test_v4i32_post_imm_st1x4:
11216 ; CHECK-GISEL:       ; %bb.0:
11217 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11218 ; CHECK-GISEL-NEXT:    mov x8, x0
11219 ; CHECK-GISEL-NEXT:    add x0, x0, #64
11220 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11221 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11222 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11223 ; CHECK-GISEL-NEXT:    st1.4s { v0, v1, v2, v3 }, [x8]
11224 ; CHECK-GISEL-NEXT:    ret
11225   call void @llvm.aarch64.neon.st1x4.v4i32.p0(<4 x i32> %B, <4 x i32> %C, <4 x i32> %D, <4 x i32> %E, ptr %A)
11226   %tmp = getelementptr i32, ptr %A, i32 16
11227   ret ptr %tmp
11230 define ptr @test_v4i32_post_reg_st1x4(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D, <4 x i32> %E, i64 %inc) nounwind {
11231 ; SDAG-LABEL: test_v4i32_post_reg_st1x4:
11232 ; SDAG:       ; %bb.0:
11233 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11234 ; SDAG-NEXT:    lsl x8, x2, #2
11235 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11236 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11237 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11238 ; SDAG-NEXT:    st1.4s { v0, v1, v2, v3 }, [x0], x8
11239 ; SDAG-NEXT:    ret
11241 ; CHECK-GISEL-LABEL: test_v4i32_post_reg_st1x4:
11242 ; CHECK-GISEL:       ; %bb.0:
11243 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11244 ; CHECK-GISEL-NEXT:    mov x8, x0
11245 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
11246 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11247 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11248 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11249 ; CHECK-GISEL-NEXT:    st1.4s { v0, v1, v2, v3 }, [x8]
11250 ; CHECK-GISEL-NEXT:    ret
11251   call void @llvm.aarch64.neon.st1x4.v4i32.p0(<4 x i32> %B, <4 x i32> %C, <4 x i32> %D, <4 x i32> %E, ptr %A)
11252   %tmp = getelementptr i32, ptr %A, i64 %inc
11253   ret ptr %tmp
11256 declare void @llvm.aarch64.neon.st1x4.v4i32.p0(<4 x i32>, <4 x i32>, <4 x i32>,<4 x i32>,  ptr)
11259 define ptr @test_v2i32_post_imm_st1x4(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, <2 x i32> %D, <2 x i32> %E) nounwind {
11260 ; SDAG-LABEL: test_v2i32_post_imm_st1x4:
11261 ; SDAG:       ; %bb.0:
11262 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11263 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11264 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11265 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11266 ; SDAG-NEXT:    st1.2s { v0, v1, v2, v3 }, [x0], #32
11267 ; SDAG-NEXT:    ret
11269 ; CHECK-GISEL-LABEL: test_v2i32_post_imm_st1x4:
11270 ; CHECK-GISEL:       ; %bb.0:
11271 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11272 ; CHECK-GISEL-NEXT:    mov x8, x0
11273 ; CHECK-GISEL-NEXT:    add x0, x0, #32
11274 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11275 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11276 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11277 ; CHECK-GISEL-NEXT:    st1.2s { v0, v1, v2, v3 }, [x8]
11278 ; CHECK-GISEL-NEXT:    ret
11279   call void @llvm.aarch64.neon.st1x4.v2i32.p0(<2 x i32> %B, <2 x i32> %C, <2 x i32> %D, <2 x i32> %E, ptr %A)
11280   %tmp = getelementptr i32, ptr %A, i32 8
11281   ret ptr %tmp
11284 define ptr @test_v2i32_post_reg_st1x4(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, <2 x i32> %D, <2 x i32> %E, i64 %inc) nounwind {
11285 ; SDAG-LABEL: test_v2i32_post_reg_st1x4:
11286 ; SDAG:       ; %bb.0:
11287 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11288 ; SDAG-NEXT:    lsl x8, x2, #2
11289 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11290 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11291 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11292 ; SDAG-NEXT:    st1.2s { v0, v1, v2, v3 }, [x0], x8
11293 ; SDAG-NEXT:    ret
11295 ; CHECK-GISEL-LABEL: test_v2i32_post_reg_st1x4:
11296 ; CHECK-GISEL:       ; %bb.0:
11297 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11298 ; CHECK-GISEL-NEXT:    mov x8, x0
11299 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
11300 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11301 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11302 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11303 ; CHECK-GISEL-NEXT:    st1.2s { v0, v1, v2, v3 }, [x8]
11304 ; CHECK-GISEL-NEXT:    ret
11305   call void @llvm.aarch64.neon.st1x4.v2i32.p0(<2 x i32> %B, <2 x i32> %C, <2 x i32> %D, <2 x i32> %E, ptr %A)
11306   %tmp = getelementptr i32, ptr %A, i64 %inc
11307   ret ptr %tmp
11310 declare void @llvm.aarch64.neon.st1x4.v2i32.p0(<2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, ptr)
11313 define ptr @test_v2i64_post_imm_st1x4(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D, <2 x i64> %E) nounwind {
11314 ; SDAG-LABEL: test_v2i64_post_imm_st1x4:
11315 ; SDAG:       ; %bb.0:
11316 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11317 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11318 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11319 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11320 ; SDAG-NEXT:    st1.2d { v0, v1, v2, v3 }, [x0], #64
11321 ; SDAG-NEXT:    ret
11323 ; CHECK-GISEL-LABEL: test_v2i64_post_imm_st1x4:
11324 ; CHECK-GISEL:       ; %bb.0:
11325 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11326 ; CHECK-GISEL-NEXT:    mov x8, x0
11327 ; CHECK-GISEL-NEXT:    add x0, x0, #64
11328 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11329 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11330 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11331 ; CHECK-GISEL-NEXT:    st1.2d { v0, v1, v2, v3 }, [x8]
11332 ; CHECK-GISEL-NEXT:    ret
11333   call void @llvm.aarch64.neon.st1x4.v2i64.p0(<2 x i64> %B, <2 x i64> %C, <2 x i64> %D, <2 x i64> %E, ptr %A)
11334   %tmp = getelementptr i64, ptr %A, i64 8
11335   ret ptr %tmp
11338 define ptr @test_v2i64_post_reg_st1x4(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D, <2 x i64> %E, i64 %inc) nounwind {
11339 ; SDAG-LABEL: test_v2i64_post_reg_st1x4:
11340 ; SDAG:       ; %bb.0:
11341 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11342 ; SDAG-NEXT:    lsl x8, x2, #3
11343 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11344 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11345 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11346 ; SDAG-NEXT:    st1.2d { v0, v1, v2, v3 }, [x0], x8
11347 ; SDAG-NEXT:    ret
11349 ; CHECK-GISEL-LABEL: test_v2i64_post_reg_st1x4:
11350 ; CHECK-GISEL:       ; %bb.0:
11351 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11352 ; CHECK-GISEL-NEXT:    mov x8, x0
11353 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
11354 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11355 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11356 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11357 ; CHECK-GISEL-NEXT:    st1.2d { v0, v1, v2, v3 }, [x8]
11358 ; CHECK-GISEL-NEXT:    ret
11359   call void @llvm.aarch64.neon.st1x4.v2i64.p0(<2 x i64> %B, <2 x i64> %C, <2 x i64> %D, <2 x i64> %E, ptr %A)
11360   %tmp = getelementptr i64, ptr %A, i64 %inc
11361   ret ptr %tmp
11364 declare void @llvm.aarch64.neon.st1x4.v2i64.p0(<2 x i64>, <2 x i64>, <2 x i64>,<2 x i64>,  ptr)
11367 define ptr @test_v1i64_post_imm_st1x4(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, <1 x i64> %D, <1 x i64> %E) nounwind {
11368 ; SDAG-LABEL: test_v1i64_post_imm_st1x4:
11369 ; SDAG:       ; %bb.0:
11370 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11371 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11372 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11373 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11374 ; SDAG-NEXT:    st1.1d { v0, v1, v2, v3 }, [x0], #32
11375 ; SDAG-NEXT:    ret
11377 ; CHECK-GISEL-LABEL: test_v1i64_post_imm_st1x4:
11378 ; CHECK-GISEL:       ; %bb.0:
11379 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11380 ; CHECK-GISEL-NEXT:    mov x8, x0
11381 ; CHECK-GISEL-NEXT:    add x0, x0, #32
11382 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11383 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11384 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11385 ; CHECK-GISEL-NEXT:    st1.1d { v0, v1, v2, v3 }, [x8]
11386 ; CHECK-GISEL-NEXT:    ret
11387   call void @llvm.aarch64.neon.st1x4.v1i64.p0(<1 x i64> %B, <1 x i64> %C, <1 x i64> %D, <1 x i64> %E, ptr %A)
11388   %tmp = getelementptr i64, ptr %A, i64 4
11389   ret ptr %tmp
11392 define ptr @test_v1i64_post_reg_st1x4(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, <1 x i64> %D, <1 x i64> %E, i64 %inc) nounwind {
11393 ; SDAG-LABEL: test_v1i64_post_reg_st1x4:
11394 ; SDAG:       ; %bb.0:
11395 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11396 ; SDAG-NEXT:    lsl x8, x2, #3
11397 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11398 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11399 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11400 ; SDAG-NEXT:    st1.1d { v0, v1, v2, v3 }, [x0], x8
11401 ; SDAG-NEXT:    ret
11403 ; CHECK-GISEL-LABEL: test_v1i64_post_reg_st1x4:
11404 ; CHECK-GISEL:       ; %bb.0:
11405 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11406 ; CHECK-GISEL-NEXT:    mov x8, x0
11407 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
11408 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11409 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11410 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11411 ; CHECK-GISEL-NEXT:    st1.1d { v0, v1, v2, v3 }, [x8]
11412 ; CHECK-GISEL-NEXT:    ret
11413   call void @llvm.aarch64.neon.st1x4.v1i64.p0(<1 x i64> %B, <1 x i64> %C, <1 x i64> %D, <1 x i64> %E, ptr %A)
11414   %tmp = getelementptr i64, ptr %A, i64 %inc
11415   ret ptr %tmp
11418 declare void @llvm.aarch64.neon.st1x4.v1i64.p0(<1 x i64>, <1 x i64>, <1 x i64>,<1 x i64>,  ptr)
11421 define ptr @test_v4f32_post_imm_st1x4(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, <4 x float> %D, <4 x float> %E) nounwind {
11422 ; SDAG-LABEL: test_v4f32_post_imm_st1x4:
11423 ; SDAG:       ; %bb.0:
11424 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11425 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11426 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11427 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11428 ; SDAG-NEXT:    st1.4s { v0, v1, v2, v3 }, [x0], #64
11429 ; SDAG-NEXT:    ret
11431 ; CHECK-GISEL-LABEL: test_v4f32_post_imm_st1x4:
11432 ; CHECK-GISEL:       ; %bb.0:
11433 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11434 ; CHECK-GISEL-NEXT:    mov x8, x0
11435 ; CHECK-GISEL-NEXT:    add x0, x0, #64
11436 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11437 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11438 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11439 ; CHECK-GISEL-NEXT:    st1.4s { v0, v1, v2, v3 }, [x8]
11440 ; CHECK-GISEL-NEXT:    ret
11441   call void @llvm.aarch64.neon.st1x4.v4f32.p0(<4 x float> %B, <4 x float> %C, <4 x float> %D, <4 x float> %E, ptr %A)
11442   %tmp = getelementptr float, ptr %A, i32 16
11443   ret ptr %tmp
11446 define ptr @test_v4f32_post_reg_st1x4(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, <4 x float> %D, <4 x float> %E, i64 %inc) nounwind {
11447 ; SDAG-LABEL: test_v4f32_post_reg_st1x4:
11448 ; SDAG:       ; %bb.0:
11449 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11450 ; SDAG-NEXT:    lsl x8, x2, #2
11451 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11452 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11453 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11454 ; SDAG-NEXT:    st1.4s { v0, v1, v2, v3 }, [x0], x8
11455 ; SDAG-NEXT:    ret
11457 ; CHECK-GISEL-LABEL: test_v4f32_post_reg_st1x4:
11458 ; CHECK-GISEL:       ; %bb.0:
11459 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11460 ; CHECK-GISEL-NEXT:    mov x8, x0
11461 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
11462 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11463 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11464 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11465 ; CHECK-GISEL-NEXT:    st1.4s { v0, v1, v2, v3 }, [x8]
11466 ; CHECK-GISEL-NEXT:    ret
11467   call void @llvm.aarch64.neon.st1x4.v4f32.p0(<4 x float> %B, <4 x float> %C, <4 x float> %D, <4 x float> %E, ptr %A)
11468   %tmp = getelementptr float, ptr %A, i64 %inc
11469   ret ptr %tmp
11472 declare void @llvm.aarch64.neon.st1x4.v4f32.p0(<4 x float>, <4 x float>, <4 x float>, <4 x float>, ptr)
11475 define ptr @test_v2f32_post_imm_st1x4(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, <2 x float> %D, <2 x float> %E) nounwind {
11476 ; SDAG-LABEL: test_v2f32_post_imm_st1x4:
11477 ; SDAG:       ; %bb.0:
11478 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11479 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11480 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11481 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11482 ; SDAG-NEXT:    st1.2s { v0, v1, v2, v3 }, [x0], #32
11483 ; SDAG-NEXT:    ret
11485 ; CHECK-GISEL-LABEL: test_v2f32_post_imm_st1x4:
11486 ; CHECK-GISEL:       ; %bb.0:
11487 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11488 ; CHECK-GISEL-NEXT:    mov x8, x0
11489 ; CHECK-GISEL-NEXT:    add x0, x0, #32
11490 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11491 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11492 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11493 ; CHECK-GISEL-NEXT:    st1.2s { v0, v1, v2, v3 }, [x8]
11494 ; CHECK-GISEL-NEXT:    ret
11495   call void @llvm.aarch64.neon.st1x4.v2f32.p0(<2 x float> %B, <2 x float> %C, <2 x float> %D, <2 x float> %E, ptr %A)
11496   %tmp = getelementptr float, ptr %A, i32 8
11497   ret ptr %tmp
11500 define ptr @test_v2f32_post_reg_st1x4(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, <2 x float> %D, <2 x float> %E, i64 %inc) nounwind {
11501 ; SDAG-LABEL: test_v2f32_post_reg_st1x4:
11502 ; SDAG:       ; %bb.0:
11503 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11504 ; SDAG-NEXT:    lsl x8, x2, #2
11505 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11506 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11507 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11508 ; SDAG-NEXT:    st1.2s { v0, v1, v2, v3 }, [x0], x8
11509 ; SDAG-NEXT:    ret
11511 ; CHECK-GISEL-LABEL: test_v2f32_post_reg_st1x4:
11512 ; CHECK-GISEL:       ; %bb.0:
11513 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11514 ; CHECK-GISEL-NEXT:    mov x8, x0
11515 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
11516 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11517 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11518 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11519 ; CHECK-GISEL-NEXT:    st1.2s { v0, v1, v2, v3 }, [x8]
11520 ; CHECK-GISEL-NEXT:    ret
11521   call void @llvm.aarch64.neon.st1x4.v2f32.p0(<2 x float> %B, <2 x float> %C, <2 x float> %D, <2 x float> %E, ptr %A)
11522   %tmp = getelementptr float, ptr %A, i64 %inc
11523   ret ptr %tmp
11526 declare void @llvm.aarch64.neon.st1x4.v2f32.p0(<2 x float>, <2 x float>, <2 x float>, <2 x float>, ptr)
11529 define ptr @test_v2f64_post_imm_st1x4(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, <2 x double> %D, <2 x double> %E) nounwind {
11530 ; SDAG-LABEL: test_v2f64_post_imm_st1x4:
11531 ; SDAG:       ; %bb.0:
11532 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11533 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11534 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11535 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11536 ; SDAG-NEXT:    st1.2d { v0, v1, v2, v3 }, [x0], #64
11537 ; SDAG-NEXT:    ret
11539 ; CHECK-GISEL-LABEL: test_v2f64_post_imm_st1x4:
11540 ; CHECK-GISEL:       ; %bb.0:
11541 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11542 ; CHECK-GISEL-NEXT:    mov x8, x0
11543 ; CHECK-GISEL-NEXT:    add x0, x0, #64
11544 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11545 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11546 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11547 ; CHECK-GISEL-NEXT:    st1.2d { v0, v1, v2, v3 }, [x8]
11548 ; CHECK-GISEL-NEXT:    ret
11549   call void @llvm.aarch64.neon.st1x4.v2f64.p0(<2 x double> %B, <2 x double> %C, <2 x double> %D, <2 x double> %E, ptr %A)
11550   %tmp = getelementptr double, ptr %A, i64 8
11551   ret ptr %tmp
11554 define ptr @test_v2f64_post_reg_st1x4(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, <2 x double> %D, <2 x double> %E, i64 %inc) nounwind {
11555 ; SDAG-LABEL: test_v2f64_post_reg_st1x4:
11556 ; SDAG:       ; %bb.0:
11557 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11558 ; SDAG-NEXT:    lsl x8, x2, #3
11559 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11560 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11561 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11562 ; SDAG-NEXT:    st1.2d { v0, v1, v2, v3 }, [x0], x8
11563 ; SDAG-NEXT:    ret
11565 ; CHECK-GISEL-LABEL: test_v2f64_post_reg_st1x4:
11566 ; CHECK-GISEL:       ; %bb.0:
11567 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11568 ; CHECK-GISEL-NEXT:    mov x8, x0
11569 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
11570 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11571 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11572 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
11573 ; CHECK-GISEL-NEXT:    st1.2d { v0, v1, v2, v3 }, [x8]
11574 ; CHECK-GISEL-NEXT:    ret
11575   call void @llvm.aarch64.neon.st1x4.v2f64.p0(<2 x double> %B, <2 x double> %C, <2 x double> %D, <2 x double> %E, ptr %A)
11576   %tmp = getelementptr double, ptr %A, i64 %inc
11577   ret ptr %tmp
11580 declare void @llvm.aarch64.neon.st1x4.v2f64.p0(<2 x double>, <2 x double>, <2 x double>,<2 x double>,  ptr)
11583 define ptr @test_v1f64_post_imm_st1x4(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, <1 x double> %D, <1 x double> %E) nounwind {
11584 ; SDAG-LABEL: test_v1f64_post_imm_st1x4:
11585 ; SDAG:       ; %bb.0:
11586 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11587 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11588 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11589 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11590 ; SDAG-NEXT:    st1.1d { v0, v1, v2, v3 }, [x0], #32
11591 ; SDAG-NEXT:    ret
11593 ; CHECK-GISEL-LABEL: test_v1f64_post_imm_st1x4:
11594 ; CHECK-GISEL:       ; %bb.0:
11595 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11596 ; CHECK-GISEL-NEXT:    mov x8, x0
11597 ; CHECK-GISEL-NEXT:    add x0, x0, #32
11598 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11599 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11600 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11601 ; CHECK-GISEL-NEXT:    st1.1d { v0, v1, v2, v3 }, [x8]
11602 ; CHECK-GISEL-NEXT:    ret
11603   call void @llvm.aarch64.neon.st1x4.v1f64.p0(<1 x double> %B, <1 x double> %C, <1 x double> %D, <1 x double> %E, ptr %A)
11604   %tmp = getelementptr double, ptr %A, i64 4
11605   ret ptr %tmp
11608 define ptr @test_v1f64_post_reg_st1x4(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, <1 x double> %D, <1 x double> %E, i64 %inc) nounwind {
11609 ; SDAG-LABEL: test_v1f64_post_reg_st1x4:
11610 ; SDAG:       ; %bb.0:
11611 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11612 ; SDAG-NEXT:    lsl x8, x2, #3
11613 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11614 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11615 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11616 ; SDAG-NEXT:    st1.1d { v0, v1, v2, v3 }, [x0], x8
11617 ; SDAG-NEXT:    ret
11619 ; CHECK-GISEL-LABEL: test_v1f64_post_reg_st1x4:
11620 ; CHECK-GISEL:       ; %bb.0:
11621 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11622 ; CHECK-GISEL-NEXT:    mov x8, x0
11623 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
11624 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11625 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11626 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $d0_d1_d2_d3 def $d0_d1_d2_d3
11627 ; CHECK-GISEL-NEXT:    st1.1d { v0, v1, v2, v3 }, [x8]
11628 ; CHECK-GISEL-NEXT:    ret
11629   call void @llvm.aarch64.neon.st1x4.v1f64.p0(<1 x double> %B, <1 x double> %C, <1 x double> %D, <1 x double> %E, ptr %A)
11630   %tmp = getelementptr double, ptr %A, i64 %inc
11631   ret ptr %tmp
11634 declare void @llvm.aarch64.neon.st1x4.v1f64.p0(<1 x double>, <1 x double>, <1 x double>, <1 x double>, ptr)
11636 define ptr @test_v16i8_post_imm_st2lane(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C) nounwind {
11637 ; SDAG-LABEL: test_v16i8_post_imm_st2lane:
11638 ; SDAG:       ; %bb.0:
11639 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
11640 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
11641 ; SDAG-NEXT:    st2.b { v0, v1 }[0], [x0], #2
11642 ; SDAG-NEXT:    ret
11644 ; CHECK-GISEL-LABEL: test_v16i8_post_imm_st2lane:
11645 ; CHECK-GISEL:       ; %bb.0:
11646 ; CHECK-GISEL-NEXT:    mov x8, x0
11647 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
11648 ; CHECK-GISEL-NEXT:    add x0, x0, #2
11649 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
11650 ; CHECK-GISEL-NEXT:    st2.b { v0, v1 }[0], [x8]
11651 ; CHECK-GISEL-NEXT:    ret
11652   call void @llvm.aarch64.neon.st2lane.v16i8.p0(<16 x i8> %B, <16 x i8> %C, i64 0, ptr %A)
11653   %tmp = getelementptr i8, ptr %A, i32 2
11654   ret ptr %tmp
11657 define ptr @test_v16i8_post_reg_st2lane(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, i64 %inc) nounwind {
11658 ; SDAG-LABEL: test_v16i8_post_reg_st2lane:
11659 ; SDAG:       ; %bb.0:
11660 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
11661 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
11662 ; SDAG-NEXT:    st2.b { v0, v1 }[0], [x0], x2
11663 ; SDAG-NEXT:    ret
11665 ; CHECK-GISEL-LABEL: test_v16i8_post_reg_st2lane:
11666 ; CHECK-GISEL:       ; %bb.0:
11667 ; CHECK-GISEL-NEXT:    mov x8, x0
11668 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
11669 ; CHECK-GISEL-NEXT:    add x0, x0, x2
11670 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
11671 ; CHECK-GISEL-NEXT:    st2.b { v0, v1 }[0], [x8]
11672 ; CHECK-GISEL-NEXT:    ret
11673   call void @llvm.aarch64.neon.st2lane.v16i8.p0(<16 x i8> %B, <16 x i8> %C, i64 0, ptr %A)
11674   %tmp = getelementptr i8, ptr %A, i64 %inc
11675   ret ptr %tmp
11678 declare void @llvm.aarch64.neon.st2lane.v16i8.p0(<16 x i8>, <16 x i8>, i64, ptr)
11681 define ptr @test_v8i8_post_imm_st2lane(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C) nounwind {
11682 ; SDAG-LABEL: test_v8i8_post_imm_st2lane:
11683 ; SDAG:       ; %bb.0:
11684 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
11685 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
11686 ; SDAG-NEXT:    st2.b { v0, v1 }[0], [x0], #2
11687 ; SDAG-NEXT:    ret
11689 ; CHECK-GISEL-LABEL: test_v8i8_post_imm_st2lane:
11690 ; CHECK-GISEL:       ; %bb.0:
11691 ; CHECK-GISEL-NEXT:    mov x8, x0
11692 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
11693 ; CHECK-GISEL-NEXT:    add x0, x0, #2
11694 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
11695 ; CHECK-GISEL-NEXT:    st2.b { v0, v1 }[0], [x8]
11696 ; CHECK-GISEL-NEXT:    ret
11697   call void @llvm.aarch64.neon.st2lane.v8i8.p0(<8 x i8> %B, <8 x i8> %C, i64 0, ptr %A)
11698   %tmp = getelementptr i8, ptr %A, i32 2
11699   ret ptr %tmp
11702 define ptr @test_v8i8_post_reg_st2lane(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, i64 %inc) nounwind {
11703 ; SDAG-LABEL: test_v8i8_post_reg_st2lane:
11704 ; SDAG:       ; %bb.0:
11705 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
11706 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
11707 ; SDAG-NEXT:    st2.b { v0, v1 }[0], [x0], x2
11708 ; SDAG-NEXT:    ret
11710 ; CHECK-GISEL-LABEL: test_v8i8_post_reg_st2lane:
11711 ; CHECK-GISEL:       ; %bb.0:
11712 ; CHECK-GISEL-NEXT:    mov x8, x0
11713 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
11714 ; CHECK-GISEL-NEXT:    add x0, x0, x2
11715 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
11716 ; CHECK-GISEL-NEXT:    st2.b { v0, v1 }[0], [x8]
11717 ; CHECK-GISEL-NEXT:    ret
11718   call void @llvm.aarch64.neon.st2lane.v8i8.p0(<8 x i8> %B, <8 x i8> %C, i64 0, ptr %A)
11719   %tmp = getelementptr i8, ptr %A, i64 %inc
11720   ret ptr %tmp
11723 declare void @llvm.aarch64.neon.st2lane.v8i8.p0(<8 x i8>, <8 x i8>, i64, ptr)
11726 define ptr @test_v8i16_post_imm_st2lane(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C) nounwind {
11727 ; SDAG-LABEL: test_v8i16_post_imm_st2lane:
11728 ; SDAG:       ; %bb.0:
11729 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
11730 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
11731 ; SDAG-NEXT:    st2.h { v0, v1 }[0], [x0], #4
11732 ; SDAG-NEXT:    ret
11734 ; CHECK-GISEL-LABEL: test_v8i16_post_imm_st2lane:
11735 ; CHECK-GISEL:       ; %bb.0:
11736 ; CHECK-GISEL-NEXT:    mov x8, x0
11737 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
11738 ; CHECK-GISEL-NEXT:    add x0, x0, #4
11739 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
11740 ; CHECK-GISEL-NEXT:    st2.h { v0, v1 }[0], [x8]
11741 ; CHECK-GISEL-NEXT:    ret
11742   call void @llvm.aarch64.neon.st2lane.v8i16.p0(<8 x i16> %B, <8 x i16> %C, i64 0, ptr %A)
11743   %tmp = getelementptr i16, ptr %A, i32 2
11744   ret ptr %tmp
11747 define ptr @test_v8i16_post_reg_st2lane(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, i64 %inc) nounwind {
11748 ; SDAG-LABEL: test_v8i16_post_reg_st2lane:
11749 ; SDAG:       ; %bb.0:
11750 ; SDAG-NEXT:    lsl x8, x2, #1
11751 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
11752 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
11753 ; SDAG-NEXT:    st2.h { v0, v1 }[0], [x0], x8
11754 ; SDAG-NEXT:    ret
11756 ; CHECK-GISEL-LABEL: test_v8i16_post_reg_st2lane:
11757 ; CHECK-GISEL:       ; %bb.0:
11758 ; CHECK-GISEL-NEXT:    mov x8, x0
11759 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #1
11760 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
11761 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
11762 ; CHECK-GISEL-NEXT:    st2.h { v0, v1 }[0], [x8]
11763 ; CHECK-GISEL-NEXT:    ret
11764   call void @llvm.aarch64.neon.st2lane.v8i16.p0(<8 x i16> %B, <8 x i16> %C, i64 0, ptr %A)
11765   %tmp = getelementptr i16, ptr %A, i64 %inc
11766   ret ptr %tmp
11769 declare void @llvm.aarch64.neon.st2lane.v8i16.p0(<8 x i16>, <8 x i16>, i64, ptr)
11772 define ptr @test_v4i16_post_imm_st2lane(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C) nounwind {
11773 ; SDAG-LABEL: test_v4i16_post_imm_st2lane:
11774 ; SDAG:       ; %bb.0:
11775 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
11776 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
11777 ; SDAG-NEXT:    st2.h { v0, v1 }[0], [x0], #4
11778 ; SDAG-NEXT:    ret
11780 ; CHECK-GISEL-LABEL: test_v4i16_post_imm_st2lane:
11781 ; CHECK-GISEL:       ; %bb.0:
11782 ; CHECK-GISEL-NEXT:    mov x8, x0
11783 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
11784 ; CHECK-GISEL-NEXT:    add x0, x0, #4
11785 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
11786 ; CHECK-GISEL-NEXT:    st2.h { v0, v1 }[0], [x8]
11787 ; CHECK-GISEL-NEXT:    ret
11788   call void @llvm.aarch64.neon.st2lane.v4i16.p0(<4 x i16> %B, <4 x i16> %C, i64 0, ptr %A)
11789   %tmp = getelementptr i16, ptr %A, i32 2
11790   ret ptr %tmp
11793 define ptr @test_v4i16_post_reg_st2lane(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, i64 %inc) nounwind {
11794 ; SDAG-LABEL: test_v4i16_post_reg_st2lane:
11795 ; SDAG:       ; %bb.0:
11796 ; SDAG-NEXT:    lsl x8, x2, #1
11797 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
11798 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
11799 ; SDAG-NEXT:    st2.h { v0, v1 }[0], [x0], x8
11800 ; SDAG-NEXT:    ret
11802 ; CHECK-GISEL-LABEL: test_v4i16_post_reg_st2lane:
11803 ; CHECK-GISEL:       ; %bb.0:
11804 ; CHECK-GISEL-NEXT:    mov x8, x0
11805 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #1
11806 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
11807 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
11808 ; CHECK-GISEL-NEXT:    st2.h { v0, v1 }[0], [x8]
11809 ; CHECK-GISEL-NEXT:    ret
11810   call void @llvm.aarch64.neon.st2lane.v4i16.p0(<4 x i16> %B, <4 x i16> %C, i64 0, ptr %A)
11811   %tmp = getelementptr i16, ptr %A, i64 %inc
11812   ret ptr %tmp
11815 declare void @llvm.aarch64.neon.st2lane.v4i16.p0(<4 x i16>, <4 x i16>, i64, ptr)
11818 define ptr @test_v4i32_post_imm_st2lane(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C) nounwind {
11819 ; SDAG-LABEL: test_v4i32_post_imm_st2lane:
11820 ; SDAG:       ; %bb.0:
11821 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
11822 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
11823 ; SDAG-NEXT:    st2.s { v0, v1 }[0], [x0], #8
11824 ; SDAG-NEXT:    ret
11826 ; CHECK-GISEL-LABEL: test_v4i32_post_imm_st2lane:
11827 ; CHECK-GISEL:       ; %bb.0:
11828 ; CHECK-GISEL-NEXT:    mov x8, x0
11829 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
11830 ; CHECK-GISEL-NEXT:    add x0, x0, #8
11831 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
11832 ; CHECK-GISEL-NEXT:    st2.s { v0, v1 }[0], [x8]
11833 ; CHECK-GISEL-NEXT:    ret
11834   call void @llvm.aarch64.neon.st2lane.v4i32.p0(<4 x i32> %B, <4 x i32> %C, i64 0, ptr %A)
11835   %tmp = getelementptr i32, ptr %A, i32 2
11836   ret ptr %tmp
11839 define ptr @test_v4i32_post_reg_st2lane(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, i64 %inc) nounwind {
11840 ; SDAG-LABEL: test_v4i32_post_reg_st2lane:
11841 ; SDAG:       ; %bb.0:
11842 ; SDAG-NEXT:    lsl x8, x2, #2
11843 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
11844 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
11845 ; SDAG-NEXT:    st2.s { v0, v1 }[0], [x0], x8
11846 ; SDAG-NEXT:    ret
11848 ; CHECK-GISEL-LABEL: test_v4i32_post_reg_st2lane:
11849 ; CHECK-GISEL:       ; %bb.0:
11850 ; CHECK-GISEL-NEXT:    mov x8, x0
11851 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
11852 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
11853 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
11854 ; CHECK-GISEL-NEXT:    st2.s { v0, v1 }[0], [x8]
11855 ; CHECK-GISEL-NEXT:    ret
11856   call void @llvm.aarch64.neon.st2lane.v4i32.p0(<4 x i32> %B, <4 x i32> %C, i64 0, ptr %A)
11857   %tmp = getelementptr i32, ptr %A, i64 %inc
11858   ret ptr %tmp
11861 declare void @llvm.aarch64.neon.st2lane.v4i32.p0(<4 x i32>, <4 x i32>, i64, ptr)
11864 define ptr @test_v2i32_post_imm_st2lane(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C) nounwind {
11865 ; SDAG-LABEL: test_v2i32_post_imm_st2lane:
11866 ; SDAG:       ; %bb.0:
11867 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
11868 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
11869 ; SDAG-NEXT:    st2.s { v0, v1 }[0], [x0], #8
11870 ; SDAG-NEXT:    ret
11872 ; CHECK-GISEL-LABEL: test_v2i32_post_imm_st2lane:
11873 ; CHECK-GISEL:       ; %bb.0:
11874 ; CHECK-GISEL-NEXT:    mov x8, x0
11875 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
11876 ; CHECK-GISEL-NEXT:    add x0, x0, #8
11877 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
11878 ; CHECK-GISEL-NEXT:    st2.s { v0, v1 }[0], [x8]
11879 ; CHECK-GISEL-NEXT:    ret
11880   call void @llvm.aarch64.neon.st2lane.v2i32.p0(<2 x i32> %B, <2 x i32> %C, i64 0, ptr %A)
11881   %tmp = getelementptr i32, ptr %A, i32 2
11882   ret ptr %tmp
11885 define ptr @test_v2i32_post_reg_st2lane(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, i64 %inc) nounwind {
11886 ; SDAG-LABEL: test_v2i32_post_reg_st2lane:
11887 ; SDAG:       ; %bb.0:
11888 ; SDAG-NEXT:    lsl x8, x2, #2
11889 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
11890 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
11891 ; SDAG-NEXT:    st2.s { v0, v1 }[0], [x0], x8
11892 ; SDAG-NEXT:    ret
11894 ; CHECK-GISEL-LABEL: test_v2i32_post_reg_st2lane:
11895 ; CHECK-GISEL:       ; %bb.0:
11896 ; CHECK-GISEL-NEXT:    mov x8, x0
11897 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
11898 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
11899 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
11900 ; CHECK-GISEL-NEXT:    st2.s { v0, v1 }[0], [x8]
11901 ; CHECK-GISEL-NEXT:    ret
11902   call void @llvm.aarch64.neon.st2lane.v2i32.p0(<2 x i32> %B, <2 x i32> %C, i64 0, ptr %A)
11903   %tmp = getelementptr i32, ptr %A, i64 %inc
11904   ret ptr %tmp
11907 declare void @llvm.aarch64.neon.st2lane.v2i32.p0(<2 x i32>, <2 x i32>, i64, ptr)
11910 define ptr @test_v2i64_post_imm_st2lane(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C) nounwind {
11911 ; SDAG-LABEL: test_v2i64_post_imm_st2lane:
11912 ; SDAG:       ; %bb.0:
11913 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
11914 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
11915 ; SDAG-NEXT:    st2.d { v0, v1 }[0], [x0], #16
11916 ; SDAG-NEXT:    ret
11918 ; CHECK-GISEL-LABEL: test_v2i64_post_imm_st2lane:
11919 ; CHECK-GISEL:       ; %bb.0:
11920 ; CHECK-GISEL-NEXT:    mov x8, x0
11921 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
11922 ; CHECK-GISEL-NEXT:    add x0, x0, #16
11923 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
11924 ; CHECK-GISEL-NEXT:    st2.d { v0, v1 }[0], [x8]
11925 ; CHECK-GISEL-NEXT:    ret
11926   call void @llvm.aarch64.neon.st2lane.v2i64.p0(<2 x i64> %B, <2 x i64> %C, i64 0, ptr %A)
11927   %tmp = getelementptr i64, ptr %A, i64 2
11928   ret ptr %tmp
11931 define ptr @test_v2i64_post_reg_st2lane(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, i64 %inc) nounwind {
11932 ; SDAG-LABEL: test_v2i64_post_reg_st2lane:
11933 ; SDAG:       ; %bb.0:
11934 ; SDAG-NEXT:    lsl x8, x2, #3
11935 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
11936 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
11937 ; SDAG-NEXT:    st2.d { v0, v1 }[0], [x0], x8
11938 ; SDAG-NEXT:    ret
11940 ; CHECK-GISEL-LABEL: test_v2i64_post_reg_st2lane:
11941 ; CHECK-GISEL:       ; %bb.0:
11942 ; CHECK-GISEL-NEXT:    mov x8, x0
11943 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
11944 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
11945 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
11946 ; CHECK-GISEL-NEXT:    st2.d { v0, v1 }[0], [x8]
11947 ; CHECK-GISEL-NEXT:    ret
11948   call void @llvm.aarch64.neon.st2lane.v2i64.p0(<2 x i64> %B, <2 x i64> %C, i64 0, ptr %A)
11949   %tmp = getelementptr i64, ptr %A, i64 %inc
11950   ret ptr %tmp
11953 declare void @llvm.aarch64.neon.st2lane.v2i64.p0(<2 x i64>, <2 x i64>, i64, ptr)
11956 define ptr @test_v1i64_post_imm_st2lane(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C) nounwind {
11957 ; SDAG-LABEL: test_v1i64_post_imm_st2lane:
11958 ; SDAG:       ; %bb.0:
11959 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
11960 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
11961 ; SDAG-NEXT:    st2.d { v0, v1 }[0], [x0], #16
11962 ; SDAG-NEXT:    ret
11964 ; CHECK-GISEL-LABEL: test_v1i64_post_imm_st2lane:
11965 ; CHECK-GISEL:       ; %bb.0:
11966 ; CHECK-GISEL-NEXT:    mov x8, x0
11967 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
11968 ; CHECK-GISEL-NEXT:    add x0, x0, #16
11969 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
11970 ; CHECK-GISEL-NEXT:    st2.d { v0, v1 }[0], [x8]
11971 ; CHECK-GISEL-NEXT:    ret
11972   call void @llvm.aarch64.neon.st2lane.v1i64.p0(<1 x i64> %B, <1 x i64> %C, i64 0, ptr %A)
11973   %tmp = getelementptr i64, ptr %A, i64 2
11974   ret ptr %tmp
11977 define ptr @test_v1i64_post_reg_st2lane(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, i64 %inc) nounwind {
11978 ; SDAG-LABEL: test_v1i64_post_reg_st2lane:
11979 ; SDAG:       ; %bb.0:
11980 ; SDAG-NEXT:    lsl x8, x2, #3
11981 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
11982 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
11983 ; SDAG-NEXT:    st2.d { v0, v1 }[0], [x0], x8
11984 ; SDAG-NEXT:    ret
11986 ; CHECK-GISEL-LABEL: test_v1i64_post_reg_st2lane:
11987 ; CHECK-GISEL:       ; %bb.0:
11988 ; CHECK-GISEL-NEXT:    mov x8, x0
11989 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
11990 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
11991 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
11992 ; CHECK-GISEL-NEXT:    st2.d { v0, v1 }[0], [x8]
11993 ; CHECK-GISEL-NEXT:    ret
11994   call void @llvm.aarch64.neon.st2lane.v1i64.p0(<1 x i64> %B, <1 x i64> %C, i64 0, ptr %A)
11995   %tmp = getelementptr i64, ptr %A, i64 %inc
11996   ret ptr %tmp
11999 declare void @llvm.aarch64.neon.st2lane.v1i64.p0(<1 x i64>, <1 x i64>, i64, ptr)
12002 define ptr @test_v4f32_post_imm_st2lane(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C) nounwind {
12003 ; SDAG-LABEL: test_v4f32_post_imm_st2lane:
12004 ; SDAG:       ; %bb.0:
12005 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
12006 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
12007 ; SDAG-NEXT:    st2.s { v0, v1 }[0], [x0], #8
12008 ; SDAG-NEXT:    ret
12010 ; CHECK-GISEL-LABEL: test_v4f32_post_imm_st2lane:
12011 ; CHECK-GISEL:       ; %bb.0:
12012 ; CHECK-GISEL-NEXT:    mov x8, x0
12013 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
12014 ; CHECK-GISEL-NEXT:    add x0, x0, #8
12015 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
12016 ; CHECK-GISEL-NEXT:    st2.s { v0, v1 }[0], [x8]
12017 ; CHECK-GISEL-NEXT:    ret
12018   call void @llvm.aarch64.neon.st2lane.v4f32.p0(<4 x float> %B, <4 x float> %C, i64 0, ptr %A)
12019   %tmp = getelementptr float, ptr %A, i32 2
12020   ret ptr %tmp
12023 define ptr @test_v4f32_post_reg_st2lane(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, i64 %inc) nounwind {
12024 ; SDAG-LABEL: test_v4f32_post_reg_st2lane:
12025 ; SDAG:       ; %bb.0:
12026 ; SDAG-NEXT:    lsl x8, x2, #2
12027 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
12028 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
12029 ; SDAG-NEXT:    st2.s { v0, v1 }[0], [x0], x8
12030 ; SDAG-NEXT:    ret
12032 ; CHECK-GISEL-LABEL: test_v4f32_post_reg_st2lane:
12033 ; CHECK-GISEL:       ; %bb.0:
12034 ; CHECK-GISEL-NEXT:    mov x8, x0
12035 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
12036 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
12037 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
12038 ; CHECK-GISEL-NEXT:    st2.s { v0, v1 }[0], [x8]
12039 ; CHECK-GISEL-NEXT:    ret
12040   call void @llvm.aarch64.neon.st2lane.v4f32.p0(<4 x float> %B, <4 x float> %C, i64 0, ptr %A)
12041   %tmp = getelementptr float, ptr %A, i64 %inc
12042   ret ptr %tmp
12045 declare void @llvm.aarch64.neon.st2lane.v4f32.p0(<4 x float>, <4 x float>, i64, ptr)
12048 define ptr @test_v2f32_post_imm_st2lane(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C) nounwind {
12049 ; SDAG-LABEL: test_v2f32_post_imm_st2lane:
12050 ; SDAG:       ; %bb.0:
12051 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
12052 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
12053 ; SDAG-NEXT:    st2.s { v0, v1 }[0], [x0], #8
12054 ; SDAG-NEXT:    ret
12056 ; CHECK-GISEL-LABEL: test_v2f32_post_imm_st2lane:
12057 ; CHECK-GISEL:       ; %bb.0:
12058 ; CHECK-GISEL-NEXT:    mov x8, x0
12059 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
12060 ; CHECK-GISEL-NEXT:    add x0, x0, #8
12061 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
12062 ; CHECK-GISEL-NEXT:    st2.s { v0, v1 }[0], [x8]
12063 ; CHECK-GISEL-NEXT:    ret
12064   call void @llvm.aarch64.neon.st2lane.v2f32.p0(<2 x float> %B, <2 x float> %C, i64 0, ptr %A)
12065   %tmp = getelementptr float, ptr %A, i32 2
12066   ret ptr %tmp
12069 define ptr @test_v2f32_post_reg_st2lane(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, i64 %inc) nounwind {
12070 ; SDAG-LABEL: test_v2f32_post_reg_st2lane:
12071 ; SDAG:       ; %bb.0:
12072 ; SDAG-NEXT:    lsl x8, x2, #2
12073 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
12074 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
12075 ; SDAG-NEXT:    st2.s { v0, v1 }[0], [x0], x8
12076 ; SDAG-NEXT:    ret
12078 ; CHECK-GISEL-LABEL: test_v2f32_post_reg_st2lane:
12079 ; CHECK-GISEL:       ; %bb.0:
12080 ; CHECK-GISEL-NEXT:    mov x8, x0
12081 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
12082 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
12083 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
12084 ; CHECK-GISEL-NEXT:    st2.s { v0, v1 }[0], [x8]
12085 ; CHECK-GISEL-NEXT:    ret
12086   call void @llvm.aarch64.neon.st2lane.v2f32.p0(<2 x float> %B, <2 x float> %C, i64 0, ptr %A)
12087   %tmp = getelementptr float, ptr %A, i64 %inc
12088   ret ptr %tmp
12091 declare void @llvm.aarch64.neon.st2lane.v2f32.p0(<2 x float>, <2 x float>, i64, ptr)
12094 define ptr @test_v2f64_post_imm_st2lane(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C) nounwind {
12095 ; SDAG-LABEL: test_v2f64_post_imm_st2lane:
12096 ; SDAG:       ; %bb.0:
12097 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
12098 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
12099 ; SDAG-NEXT:    st2.d { v0, v1 }[0], [x0], #16
12100 ; SDAG-NEXT:    ret
12102 ; CHECK-GISEL-LABEL: test_v2f64_post_imm_st2lane:
12103 ; CHECK-GISEL:       ; %bb.0:
12104 ; CHECK-GISEL-NEXT:    mov x8, x0
12105 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
12106 ; CHECK-GISEL-NEXT:    add x0, x0, #16
12107 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
12108 ; CHECK-GISEL-NEXT:    st2.d { v0, v1 }[0], [x8]
12109 ; CHECK-GISEL-NEXT:    ret
12110   call void @llvm.aarch64.neon.st2lane.v2f64.p0(<2 x double> %B, <2 x double> %C, i64 0, ptr %A)
12111   %tmp = getelementptr double, ptr %A, i64 2
12112   ret ptr %tmp
12115 define ptr @test_v2f64_post_reg_st2lane(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, i64 %inc) nounwind {
12116 ; SDAG-LABEL: test_v2f64_post_reg_st2lane:
12117 ; SDAG:       ; %bb.0:
12118 ; SDAG-NEXT:    lsl x8, x2, #3
12119 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
12120 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
12121 ; SDAG-NEXT:    st2.d { v0, v1 }[0], [x0], x8
12122 ; SDAG-NEXT:    ret
12124 ; CHECK-GISEL-LABEL: test_v2f64_post_reg_st2lane:
12125 ; CHECK-GISEL:       ; %bb.0:
12126 ; CHECK-GISEL-NEXT:    mov x8, x0
12127 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
12128 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1 def $q0_q1
12129 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1 def $q0_q1
12130 ; CHECK-GISEL-NEXT:    st2.d { v0, v1 }[0], [x8]
12131 ; CHECK-GISEL-NEXT:    ret
12132   call void @llvm.aarch64.neon.st2lane.v2f64.p0(<2 x double> %B, <2 x double> %C, i64 0, ptr %A)
12133   %tmp = getelementptr double, ptr %A, i64 %inc
12134   ret ptr %tmp
12137 declare void @llvm.aarch64.neon.st2lane.v2f64.p0(<2 x double>, <2 x double>, i64, ptr)
12140 define ptr @test_v1f64_post_imm_st2lane(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C) nounwind {
12141 ; SDAG-LABEL: test_v1f64_post_imm_st2lane:
12142 ; SDAG:       ; %bb.0:
12143 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
12144 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
12145 ; SDAG-NEXT:    st2.d { v0, v1 }[0], [x0], #16
12146 ; SDAG-NEXT:    ret
12148 ; CHECK-GISEL-LABEL: test_v1f64_post_imm_st2lane:
12149 ; CHECK-GISEL:       ; %bb.0:
12150 ; CHECK-GISEL-NEXT:    mov x8, x0
12151 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
12152 ; CHECK-GISEL-NEXT:    add x0, x0, #16
12153 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
12154 ; CHECK-GISEL-NEXT:    st2.d { v0, v1 }[0], [x8]
12155 ; CHECK-GISEL-NEXT:    ret
12156   call void @llvm.aarch64.neon.st2lane.v1f64.p0(<1 x double> %B, <1 x double> %C, i64 0, ptr %A)
12157   %tmp = getelementptr double, ptr %A, i64 2
12158   ret ptr %tmp
12161 define ptr @test_v1f64_post_reg_st2lane(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, i64 %inc) nounwind {
12162 ; SDAG-LABEL: test_v1f64_post_reg_st2lane:
12163 ; SDAG:       ; %bb.0:
12164 ; SDAG-NEXT:    lsl x8, x2, #3
12165 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
12166 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
12167 ; SDAG-NEXT:    st2.d { v0, v1 }[0], [x0], x8
12168 ; SDAG-NEXT:    ret
12170 ; CHECK-GISEL-LABEL: test_v1f64_post_reg_st2lane:
12171 ; CHECK-GISEL:       ; %bb.0:
12172 ; CHECK-GISEL-NEXT:    mov x8, x0
12173 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
12174 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1 def $q0_q1
12175 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1 def $q0_q1
12176 ; CHECK-GISEL-NEXT:    st2.d { v0, v1 }[0], [x8]
12177 ; CHECK-GISEL-NEXT:    ret
12178   call void @llvm.aarch64.neon.st2lane.v1f64.p0(<1 x double> %B, <1 x double> %C, i64 0, ptr %A)
12179   %tmp = getelementptr double, ptr %A, i64 %inc
12180   ret ptr %tmp
12183 declare void @llvm.aarch64.neon.st2lane.v1f64.p0(<1 x double>, <1 x double>, i64, ptr)
12186 define ptr @test_v16i8_post_imm_st3lane(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D) nounwind {
12187 ; SDAG-LABEL: test_v16i8_post_imm_st3lane:
12188 ; SDAG:       ; %bb.0:
12189 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
12190 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
12191 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
12192 ; SDAG-NEXT:    st3.b { v0, v1, v2 }[0], [x0], #3
12193 ; SDAG-NEXT:    ret
12195 ; CHECK-GISEL-LABEL: test_v16i8_post_imm_st3lane:
12196 ; CHECK-GISEL:       ; %bb.0:
12197 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
12198 ; CHECK-GISEL-NEXT:    mov x8, x0
12199 ; CHECK-GISEL-NEXT:    add x0, x0, #3
12200 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
12201 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
12202 ; CHECK-GISEL-NEXT:    st3.b { v0, v1, v2 }[0], [x8]
12203 ; CHECK-GISEL-NEXT:    ret
12204   call void @llvm.aarch64.neon.st3lane.v16i8.p0(<16 x i8> %B, <16 x i8> %C, <16 x i8> %D, i64 0, ptr %A)
12205   %tmp = getelementptr i8, ptr %A, i32 3
12206   ret ptr %tmp
12209 define ptr @test_v16i8_post_reg_st3lane(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D, i64 %inc) nounwind {
12210 ; SDAG-LABEL: test_v16i8_post_reg_st3lane:
12211 ; SDAG:       ; %bb.0:
12212 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
12213 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
12214 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
12215 ; SDAG-NEXT:    st3.b { v0, v1, v2 }[0], [x0], x2
12216 ; SDAG-NEXT:    ret
12218 ; CHECK-GISEL-LABEL: test_v16i8_post_reg_st3lane:
12219 ; CHECK-GISEL:       ; %bb.0:
12220 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
12221 ; CHECK-GISEL-NEXT:    mov x8, x0
12222 ; CHECK-GISEL-NEXT:    add x0, x0, x2
12223 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
12224 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
12225 ; CHECK-GISEL-NEXT:    st3.b { v0, v1, v2 }[0], [x8]
12226 ; CHECK-GISEL-NEXT:    ret
12227   call void @llvm.aarch64.neon.st3lane.v16i8.p0(<16 x i8> %B, <16 x i8> %C, <16 x i8> %D, i64 0, ptr %A)
12228   %tmp = getelementptr i8, ptr %A, i64 %inc
12229   ret ptr %tmp
12232 declare void @llvm.aarch64.neon.st3lane.v16i8.p0(<16 x i8>, <16 x i8>, <16 x i8>, i64, ptr)
12235 define ptr @test_v8i8_post_imm_st3lane(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, <8 x i8> %D) nounwind {
12236 ; SDAG-LABEL: test_v8i8_post_imm_st3lane:
12237 ; SDAG:       ; %bb.0:
12238 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
12239 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
12240 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
12241 ; SDAG-NEXT:    st3.b { v0, v1, v2 }[0], [x0], #3
12242 ; SDAG-NEXT:    ret
12244 ; CHECK-GISEL-LABEL: test_v8i8_post_imm_st3lane:
12245 ; CHECK-GISEL:       ; %bb.0:
12246 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
12247 ; CHECK-GISEL-NEXT:    mov x8, x0
12248 ; CHECK-GISEL-NEXT:    add x0, x0, #3
12249 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
12250 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
12251 ; CHECK-GISEL-NEXT:    st3.b { v0, v1, v2 }[0], [x8]
12252 ; CHECK-GISEL-NEXT:    ret
12253   call void @llvm.aarch64.neon.st3lane.v8i8.p0(<8 x i8> %B, <8 x i8> %C, <8 x i8> %D, i64 0, ptr %A)
12254   %tmp = getelementptr i8, ptr %A, i32 3
12255   ret ptr %tmp
12258 define ptr @test_v8i8_post_reg_st3lane(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, <8 x i8> %D, i64 %inc) nounwind {
12259 ; SDAG-LABEL: test_v8i8_post_reg_st3lane:
12260 ; SDAG:       ; %bb.0:
12261 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
12262 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
12263 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
12264 ; SDAG-NEXT:    st3.b { v0, v1, v2 }[0], [x0], x2
12265 ; SDAG-NEXT:    ret
12267 ; CHECK-GISEL-LABEL: test_v8i8_post_reg_st3lane:
12268 ; CHECK-GISEL:       ; %bb.0:
12269 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
12270 ; CHECK-GISEL-NEXT:    mov x8, x0
12271 ; CHECK-GISEL-NEXT:    add x0, x0, x2
12272 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
12273 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
12274 ; CHECK-GISEL-NEXT:    st3.b { v0, v1, v2 }[0], [x8]
12275 ; CHECK-GISEL-NEXT:    ret
12276   call void @llvm.aarch64.neon.st3lane.v8i8.p0(<8 x i8> %B, <8 x i8> %C, <8 x i8> %D, i64 0, ptr %A)
12277   %tmp = getelementptr i8, ptr %A, i64 %inc
12278   ret ptr %tmp
12281 declare void @llvm.aarch64.neon.st3lane.v8i8.p0(<8 x i8>, <8 x i8>, <8 x i8>, i64, ptr)
12284 define ptr @test_v8i16_post_imm_st3lane(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D) nounwind {
12285 ; SDAG-LABEL: test_v8i16_post_imm_st3lane:
12286 ; SDAG:       ; %bb.0:
12287 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
12288 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
12289 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
12290 ; SDAG-NEXT:    st3.h { v0, v1, v2 }[0], [x0], #6
12291 ; SDAG-NEXT:    ret
12293 ; CHECK-GISEL-LABEL: test_v8i16_post_imm_st3lane:
12294 ; CHECK-GISEL:       ; %bb.0:
12295 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
12296 ; CHECK-GISEL-NEXT:    mov x8, x0
12297 ; CHECK-GISEL-NEXT:    add x0, x0, #6
12298 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
12299 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
12300 ; CHECK-GISEL-NEXT:    st3.h { v0, v1, v2 }[0], [x8]
12301 ; CHECK-GISEL-NEXT:    ret
12302   call void @llvm.aarch64.neon.st3lane.v8i16.p0(<8 x i16> %B, <8 x i16> %C, <8 x i16> %D, i64 0, ptr %A)
12303   %tmp = getelementptr i16, ptr %A, i32 3
12304   ret ptr %tmp
12307 define ptr @test_v8i16_post_reg_st3lane(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D, i64 %inc) nounwind {
12308 ; SDAG-LABEL: test_v8i16_post_reg_st3lane:
12309 ; SDAG:       ; %bb.0:
12310 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
12311 ; SDAG-NEXT:    lsl x8, x2, #1
12312 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
12313 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
12314 ; SDAG-NEXT:    st3.h { v0, v1, v2 }[0], [x0], x8
12315 ; SDAG-NEXT:    ret
12317 ; CHECK-GISEL-LABEL: test_v8i16_post_reg_st3lane:
12318 ; CHECK-GISEL:       ; %bb.0:
12319 ; CHECK-GISEL-NEXT:    mov x8, x0
12320 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
12321 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #1
12322 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
12323 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
12324 ; CHECK-GISEL-NEXT:    st3.h { v0, v1, v2 }[0], [x8]
12325 ; CHECK-GISEL-NEXT:    ret
12326   call void @llvm.aarch64.neon.st3lane.v8i16.p0(<8 x i16> %B, <8 x i16> %C, <8 x i16> %D, i64 0, ptr %A)
12327   %tmp = getelementptr i16, ptr %A, i64 %inc
12328   ret ptr %tmp
12331 declare void @llvm.aarch64.neon.st3lane.v8i16.p0(<8 x i16>, <8 x i16>, <8 x i16>, i64, ptr)
12334 define ptr @test_v4i16_post_imm_st3lane(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, <4 x i16> %D) nounwind {
12335 ; SDAG-LABEL: test_v4i16_post_imm_st3lane:
12336 ; SDAG:       ; %bb.0:
12337 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
12338 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
12339 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
12340 ; SDAG-NEXT:    st3.h { v0, v1, v2 }[0], [x0], #6
12341 ; SDAG-NEXT:    ret
12343 ; CHECK-GISEL-LABEL: test_v4i16_post_imm_st3lane:
12344 ; CHECK-GISEL:       ; %bb.0:
12345 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
12346 ; CHECK-GISEL-NEXT:    mov x8, x0
12347 ; CHECK-GISEL-NEXT:    add x0, x0, #6
12348 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
12349 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
12350 ; CHECK-GISEL-NEXT:    st3.h { v0, v1, v2 }[0], [x8]
12351 ; CHECK-GISEL-NEXT:    ret
12352   call void @llvm.aarch64.neon.st3lane.v4i16.p0(<4 x i16> %B, <4 x i16> %C, <4 x i16> %D, i64 0, ptr %A)
12353   %tmp = getelementptr i16, ptr %A, i32 3
12354   ret ptr %tmp
12357 define ptr @test_v4i16_post_reg_st3lane(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, <4 x i16> %D, i64 %inc) nounwind {
12358 ; SDAG-LABEL: test_v4i16_post_reg_st3lane:
12359 ; SDAG:       ; %bb.0:
12360 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
12361 ; SDAG-NEXT:    lsl x8, x2, #1
12362 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
12363 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
12364 ; SDAG-NEXT:    st3.h { v0, v1, v2 }[0], [x0], x8
12365 ; SDAG-NEXT:    ret
12367 ; CHECK-GISEL-LABEL: test_v4i16_post_reg_st3lane:
12368 ; CHECK-GISEL:       ; %bb.0:
12369 ; CHECK-GISEL-NEXT:    mov x8, x0
12370 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
12371 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #1
12372 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
12373 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
12374 ; CHECK-GISEL-NEXT:    st3.h { v0, v1, v2 }[0], [x8]
12375 ; CHECK-GISEL-NEXT:    ret
12376   call void @llvm.aarch64.neon.st3lane.v4i16.p0(<4 x i16> %B, <4 x i16> %C, <4 x i16> %D, i64 0, ptr %A)
12377   %tmp = getelementptr i16, ptr %A, i64 %inc
12378   ret ptr %tmp
12381 declare void @llvm.aarch64.neon.st3lane.v4i16.p0(<4 x i16>, <4 x i16>, <4 x i16>, i64, ptr)
12384 define ptr @test_v4i32_post_imm_st3lane(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D) nounwind {
12385 ; SDAG-LABEL: test_v4i32_post_imm_st3lane:
12386 ; SDAG:       ; %bb.0:
12387 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
12388 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
12389 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
12390 ; SDAG-NEXT:    st3.s { v0, v1, v2 }[0], [x0], #12
12391 ; SDAG-NEXT:    ret
12393 ; CHECK-GISEL-LABEL: test_v4i32_post_imm_st3lane:
12394 ; CHECK-GISEL:       ; %bb.0:
12395 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
12396 ; CHECK-GISEL-NEXT:    mov x8, x0
12397 ; CHECK-GISEL-NEXT:    add x0, x0, #12
12398 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
12399 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
12400 ; CHECK-GISEL-NEXT:    st3.s { v0, v1, v2 }[0], [x8]
12401 ; CHECK-GISEL-NEXT:    ret
12402   call void @llvm.aarch64.neon.st3lane.v4i32.p0(<4 x i32> %B, <4 x i32> %C, <4 x i32> %D, i64 0, ptr %A)
12403   %tmp = getelementptr i32, ptr %A, i32 3
12404   ret ptr %tmp
12407 define ptr @test_v4i32_post_reg_st3lane(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D, i64 %inc) nounwind {
12408 ; SDAG-LABEL: test_v4i32_post_reg_st3lane:
12409 ; SDAG:       ; %bb.0:
12410 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
12411 ; SDAG-NEXT:    lsl x8, x2, #2
12412 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
12413 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
12414 ; SDAG-NEXT:    st3.s { v0, v1, v2 }[0], [x0], x8
12415 ; SDAG-NEXT:    ret
12417 ; CHECK-GISEL-LABEL: test_v4i32_post_reg_st3lane:
12418 ; CHECK-GISEL:       ; %bb.0:
12419 ; CHECK-GISEL-NEXT:    mov x8, x0
12420 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
12421 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
12422 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
12423 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
12424 ; CHECK-GISEL-NEXT:    st3.s { v0, v1, v2 }[0], [x8]
12425 ; CHECK-GISEL-NEXT:    ret
12426   call void @llvm.aarch64.neon.st3lane.v4i32.p0(<4 x i32> %B, <4 x i32> %C, <4 x i32> %D, i64 0, ptr %A)
12427   %tmp = getelementptr i32, ptr %A, i64 %inc
12428   ret ptr %tmp
12431 declare void @llvm.aarch64.neon.st3lane.v4i32.p0(<4 x i32>, <4 x i32>, <4 x i32>, i64, ptr)
12434 define ptr @test_v2i32_post_imm_st3lane(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, <2 x i32> %D) nounwind {
12435 ; SDAG-LABEL: test_v2i32_post_imm_st3lane:
12436 ; SDAG:       ; %bb.0:
12437 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
12438 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
12439 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
12440 ; SDAG-NEXT:    st3.s { v0, v1, v2 }[0], [x0], #12
12441 ; SDAG-NEXT:    ret
12443 ; CHECK-GISEL-LABEL: test_v2i32_post_imm_st3lane:
12444 ; CHECK-GISEL:       ; %bb.0:
12445 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
12446 ; CHECK-GISEL-NEXT:    mov x8, x0
12447 ; CHECK-GISEL-NEXT:    add x0, x0, #12
12448 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
12449 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
12450 ; CHECK-GISEL-NEXT:    st3.s { v0, v1, v2 }[0], [x8]
12451 ; CHECK-GISEL-NEXT:    ret
12452   call void @llvm.aarch64.neon.st3lane.v2i32.p0(<2 x i32> %B, <2 x i32> %C, <2 x i32> %D, i64 0, ptr %A)
12453   %tmp = getelementptr i32, ptr %A, i32 3
12454   ret ptr %tmp
12457 define ptr @test_v2i32_post_reg_st3lane(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, <2 x i32> %D, i64 %inc) nounwind {
12458 ; SDAG-LABEL: test_v2i32_post_reg_st3lane:
12459 ; SDAG:       ; %bb.0:
12460 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
12461 ; SDAG-NEXT:    lsl x8, x2, #2
12462 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
12463 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
12464 ; SDAG-NEXT:    st3.s { v0, v1, v2 }[0], [x0], x8
12465 ; SDAG-NEXT:    ret
12467 ; CHECK-GISEL-LABEL: test_v2i32_post_reg_st3lane:
12468 ; CHECK-GISEL:       ; %bb.0:
12469 ; CHECK-GISEL-NEXT:    mov x8, x0
12470 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
12471 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
12472 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
12473 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
12474 ; CHECK-GISEL-NEXT:    st3.s { v0, v1, v2 }[0], [x8]
12475 ; CHECK-GISEL-NEXT:    ret
12476   call void @llvm.aarch64.neon.st3lane.v2i32.p0(<2 x i32> %B, <2 x i32> %C, <2 x i32> %D, i64 0, ptr %A)
12477   %tmp = getelementptr i32, ptr %A, i64 %inc
12478   ret ptr %tmp
12481 declare void @llvm.aarch64.neon.st3lane.v2i32.p0(<2 x i32>, <2 x i32>, <2 x i32>, i64, ptr)
12484 define ptr @test_v2i64_post_imm_st3lane(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D) nounwind {
12485 ; SDAG-LABEL: test_v2i64_post_imm_st3lane:
12486 ; SDAG:       ; %bb.0:
12487 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
12488 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
12489 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
12490 ; SDAG-NEXT:    st3.d { v0, v1, v2 }[0], [x0], #24
12491 ; SDAG-NEXT:    ret
12493 ; CHECK-GISEL-LABEL: test_v2i64_post_imm_st3lane:
12494 ; CHECK-GISEL:       ; %bb.0:
12495 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
12496 ; CHECK-GISEL-NEXT:    mov x8, x0
12497 ; CHECK-GISEL-NEXT:    add x0, x0, #24
12498 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
12499 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
12500 ; CHECK-GISEL-NEXT:    st3.d { v0, v1, v2 }[0], [x8]
12501 ; CHECK-GISEL-NEXT:    ret
12502   call void @llvm.aarch64.neon.st3lane.v2i64.p0(<2 x i64> %B, <2 x i64> %C, <2 x i64> %D, i64 0, ptr %A)
12503   %tmp = getelementptr i64, ptr %A, i64 3
12504   ret ptr %tmp
12507 define ptr @test_v2i64_post_reg_st3lane(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D, i64 %inc) nounwind {
12508 ; SDAG-LABEL: test_v2i64_post_reg_st3lane:
12509 ; SDAG:       ; %bb.0:
12510 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
12511 ; SDAG-NEXT:    lsl x8, x2, #3
12512 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
12513 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
12514 ; SDAG-NEXT:    st3.d { v0, v1, v2 }[0], [x0], x8
12515 ; SDAG-NEXT:    ret
12517 ; CHECK-GISEL-LABEL: test_v2i64_post_reg_st3lane:
12518 ; CHECK-GISEL:       ; %bb.0:
12519 ; CHECK-GISEL-NEXT:    mov x8, x0
12520 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
12521 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
12522 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
12523 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
12524 ; CHECK-GISEL-NEXT:    st3.d { v0, v1, v2 }[0], [x8]
12525 ; CHECK-GISEL-NEXT:    ret
12526   call void @llvm.aarch64.neon.st3lane.v2i64.p0(<2 x i64> %B, <2 x i64> %C, <2 x i64> %D, i64 0, ptr %A)
12527   %tmp = getelementptr i64, ptr %A, i64 %inc
12528   ret ptr %tmp
12531 declare void @llvm.aarch64.neon.st3lane.v2i64.p0(<2 x i64>, <2 x i64>, <2 x i64>, i64, ptr)
12534 define ptr @test_v1i64_post_imm_st3lane(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, <1 x i64> %D) nounwind {
12535 ; SDAG-LABEL: test_v1i64_post_imm_st3lane:
12536 ; SDAG:       ; %bb.0:
12537 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
12538 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
12539 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
12540 ; SDAG-NEXT:    st3.d { v0, v1, v2 }[0], [x0], #24
12541 ; SDAG-NEXT:    ret
12543 ; CHECK-GISEL-LABEL: test_v1i64_post_imm_st3lane:
12544 ; CHECK-GISEL:       ; %bb.0:
12545 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
12546 ; CHECK-GISEL-NEXT:    mov x8, x0
12547 ; CHECK-GISEL-NEXT:    add x0, x0, #24
12548 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
12549 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
12550 ; CHECK-GISEL-NEXT:    st3.d { v0, v1, v2 }[0], [x8]
12551 ; CHECK-GISEL-NEXT:    ret
12552   call void @llvm.aarch64.neon.st3lane.v1i64.p0(<1 x i64> %B, <1 x i64> %C, <1 x i64> %D, i64 0, ptr %A)
12553   %tmp = getelementptr i64, ptr %A, i64 3
12554   ret ptr %tmp
12557 define ptr @test_v1i64_post_reg_st3lane(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, <1 x i64> %D, i64 %inc) nounwind {
12558 ; SDAG-LABEL: test_v1i64_post_reg_st3lane:
12559 ; SDAG:       ; %bb.0:
12560 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
12561 ; SDAG-NEXT:    lsl x8, x2, #3
12562 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
12563 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
12564 ; SDAG-NEXT:    st3.d { v0, v1, v2 }[0], [x0], x8
12565 ; SDAG-NEXT:    ret
12567 ; CHECK-GISEL-LABEL: test_v1i64_post_reg_st3lane:
12568 ; CHECK-GISEL:       ; %bb.0:
12569 ; CHECK-GISEL-NEXT:    mov x8, x0
12570 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
12571 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
12572 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
12573 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
12574 ; CHECK-GISEL-NEXT:    st3.d { v0, v1, v2 }[0], [x8]
12575 ; CHECK-GISEL-NEXT:    ret
12576   call void @llvm.aarch64.neon.st3lane.v1i64.p0(<1 x i64> %B, <1 x i64> %C, <1 x i64> %D, i64 0, ptr %A)
12577   %tmp = getelementptr i64, ptr %A, i64 %inc
12578   ret ptr %tmp
12581 declare void @llvm.aarch64.neon.st3lane.v1i64.p0(<1 x i64>, <1 x i64>, <1 x i64>, i64, ptr)
12584 define ptr @test_v4f32_post_imm_st3lane(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, <4 x float> %D) nounwind {
12585 ; SDAG-LABEL: test_v4f32_post_imm_st3lane:
12586 ; SDAG:       ; %bb.0:
12587 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
12588 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
12589 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
12590 ; SDAG-NEXT:    st3.s { v0, v1, v2 }[0], [x0], #12
12591 ; SDAG-NEXT:    ret
12593 ; CHECK-GISEL-LABEL: test_v4f32_post_imm_st3lane:
12594 ; CHECK-GISEL:       ; %bb.0:
12595 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
12596 ; CHECK-GISEL-NEXT:    mov x8, x0
12597 ; CHECK-GISEL-NEXT:    add x0, x0, #12
12598 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
12599 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
12600 ; CHECK-GISEL-NEXT:    st3.s { v0, v1, v2 }[0], [x8]
12601 ; CHECK-GISEL-NEXT:    ret
12602   call void @llvm.aarch64.neon.st3lane.v4f32.p0(<4 x float> %B, <4 x float> %C, <4 x float> %D, i64 0, ptr %A)
12603   %tmp = getelementptr float, ptr %A, i32 3
12604   ret ptr %tmp
12607 define ptr @test_v4f32_post_reg_st3lane(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, <4 x float> %D, i64 %inc) nounwind {
12608 ; SDAG-LABEL: test_v4f32_post_reg_st3lane:
12609 ; SDAG:       ; %bb.0:
12610 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
12611 ; SDAG-NEXT:    lsl x8, x2, #2
12612 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
12613 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
12614 ; SDAG-NEXT:    st3.s { v0, v1, v2 }[0], [x0], x8
12615 ; SDAG-NEXT:    ret
12617 ; CHECK-GISEL-LABEL: test_v4f32_post_reg_st3lane:
12618 ; CHECK-GISEL:       ; %bb.0:
12619 ; CHECK-GISEL-NEXT:    mov x8, x0
12620 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
12621 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
12622 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
12623 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
12624 ; CHECK-GISEL-NEXT:    st3.s { v0, v1, v2 }[0], [x8]
12625 ; CHECK-GISEL-NEXT:    ret
12626   call void @llvm.aarch64.neon.st3lane.v4f32.p0(<4 x float> %B, <4 x float> %C, <4 x float> %D, i64 0, ptr %A)
12627   %tmp = getelementptr float, ptr %A, i64 %inc
12628   ret ptr %tmp
12631 declare void @llvm.aarch64.neon.st3lane.v4f32.p0(<4 x float>, <4 x float>, <4 x float>, i64, ptr)
12634 define ptr @test_v2f32_post_imm_st3lane(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, <2 x float> %D) nounwind {
12635 ; SDAG-LABEL: test_v2f32_post_imm_st3lane:
12636 ; SDAG:       ; %bb.0:
12637 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
12638 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
12639 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
12640 ; SDAG-NEXT:    st3.s { v0, v1, v2 }[0], [x0], #12
12641 ; SDAG-NEXT:    ret
12643 ; CHECK-GISEL-LABEL: test_v2f32_post_imm_st3lane:
12644 ; CHECK-GISEL:       ; %bb.0:
12645 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
12646 ; CHECK-GISEL-NEXT:    mov x8, x0
12647 ; CHECK-GISEL-NEXT:    add x0, x0, #12
12648 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
12649 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
12650 ; CHECK-GISEL-NEXT:    st3.s { v0, v1, v2 }[0], [x8]
12651 ; CHECK-GISEL-NEXT:    ret
12652   call void @llvm.aarch64.neon.st3lane.v2f32.p0(<2 x float> %B, <2 x float> %C, <2 x float> %D, i64 0, ptr %A)
12653   %tmp = getelementptr float, ptr %A, i32 3
12654   ret ptr %tmp
12657 define ptr @test_v2f32_post_reg_st3lane(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, <2 x float> %D, i64 %inc) nounwind {
12658 ; SDAG-LABEL: test_v2f32_post_reg_st3lane:
12659 ; SDAG:       ; %bb.0:
12660 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
12661 ; SDAG-NEXT:    lsl x8, x2, #2
12662 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
12663 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
12664 ; SDAG-NEXT:    st3.s { v0, v1, v2 }[0], [x0], x8
12665 ; SDAG-NEXT:    ret
12667 ; CHECK-GISEL-LABEL: test_v2f32_post_reg_st3lane:
12668 ; CHECK-GISEL:       ; %bb.0:
12669 ; CHECK-GISEL-NEXT:    mov x8, x0
12670 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
12671 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
12672 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
12673 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
12674 ; CHECK-GISEL-NEXT:    st3.s { v0, v1, v2 }[0], [x8]
12675 ; CHECK-GISEL-NEXT:    ret
12676   call void @llvm.aarch64.neon.st3lane.v2f32.p0(<2 x float> %B, <2 x float> %C, <2 x float> %D, i64 0, ptr %A)
12677   %tmp = getelementptr float, ptr %A, i64 %inc
12678   ret ptr %tmp
12681 declare void @llvm.aarch64.neon.st3lane.v2f32.p0(<2 x float>, <2 x float>, <2 x float>, i64, ptr)
12684 define ptr @test_v2f64_post_imm_st3lane(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, <2 x double> %D) nounwind {
12685 ; SDAG-LABEL: test_v2f64_post_imm_st3lane:
12686 ; SDAG:       ; %bb.0:
12687 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
12688 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
12689 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
12690 ; SDAG-NEXT:    st3.d { v0, v1, v2 }[0], [x0], #24
12691 ; SDAG-NEXT:    ret
12693 ; CHECK-GISEL-LABEL: test_v2f64_post_imm_st3lane:
12694 ; CHECK-GISEL:       ; %bb.0:
12695 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
12696 ; CHECK-GISEL-NEXT:    mov x8, x0
12697 ; CHECK-GISEL-NEXT:    add x0, x0, #24
12698 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
12699 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
12700 ; CHECK-GISEL-NEXT:    st3.d { v0, v1, v2 }[0], [x8]
12701 ; CHECK-GISEL-NEXT:    ret
12702   call void @llvm.aarch64.neon.st3lane.v2f64.p0(<2 x double> %B, <2 x double> %C, <2 x double> %D, i64 0, ptr %A)
12703   %tmp = getelementptr double, ptr %A, i64 3
12704   ret ptr %tmp
12707 define ptr @test_v2f64_post_reg_st3lane(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, <2 x double> %D, i64 %inc) nounwind {
12708 ; SDAG-LABEL: test_v2f64_post_reg_st3lane:
12709 ; SDAG:       ; %bb.0:
12710 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
12711 ; SDAG-NEXT:    lsl x8, x2, #3
12712 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
12713 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
12714 ; SDAG-NEXT:    st3.d { v0, v1, v2 }[0], [x0], x8
12715 ; SDAG-NEXT:    ret
12717 ; CHECK-GISEL-LABEL: test_v2f64_post_reg_st3lane:
12718 ; CHECK-GISEL:       ; %bb.0:
12719 ; CHECK-GISEL-NEXT:    mov x8, x0
12720 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2 def $q0_q1_q2
12721 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
12722 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2 def $q0_q1_q2
12723 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2 def $q0_q1_q2
12724 ; CHECK-GISEL-NEXT:    st3.d { v0, v1, v2 }[0], [x8]
12725 ; CHECK-GISEL-NEXT:    ret
12726   call void @llvm.aarch64.neon.st3lane.v2f64.p0(<2 x double> %B, <2 x double> %C, <2 x double> %D, i64 0, ptr %A)
12727   %tmp = getelementptr double, ptr %A, i64 %inc
12728   ret ptr %tmp
12731 declare void @llvm.aarch64.neon.st3lane.v2f64.p0(<2 x double>, <2 x double>, <2 x double>, i64, ptr)
12734 define ptr @test_v1f64_post_imm_st3lane(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, <1 x double> %D) nounwind {
12735 ; SDAG-LABEL: test_v1f64_post_imm_st3lane:
12736 ; SDAG:       ; %bb.0:
12737 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
12738 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
12739 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
12740 ; SDAG-NEXT:    st3.d { v0, v1, v2 }[0], [x0], #24
12741 ; SDAG-NEXT:    ret
12743 ; CHECK-GISEL-LABEL: test_v1f64_post_imm_st3lane:
12744 ; CHECK-GISEL:       ; %bb.0:
12745 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
12746 ; CHECK-GISEL-NEXT:    mov x8, x0
12747 ; CHECK-GISEL-NEXT:    add x0, x0, #24
12748 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
12749 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
12750 ; CHECK-GISEL-NEXT:    st3.d { v0, v1, v2 }[0], [x8]
12751 ; CHECK-GISEL-NEXT:    ret
12752   call void @llvm.aarch64.neon.st3lane.v1f64.p0(<1 x double> %B, <1 x double> %C, <1 x double> %D, i64 0, ptr %A)
12753   %tmp = getelementptr double, ptr %A, i64 3
12754   ret ptr %tmp
12757 define ptr @test_v1f64_post_reg_st3lane(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, <1 x double> %D, i64 %inc) nounwind {
12758 ; SDAG-LABEL: test_v1f64_post_reg_st3lane:
12759 ; SDAG:       ; %bb.0:
12760 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
12761 ; SDAG-NEXT:    lsl x8, x2, #3
12762 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
12763 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
12764 ; SDAG-NEXT:    st3.d { v0, v1, v2 }[0], [x0], x8
12765 ; SDAG-NEXT:    ret
12767 ; CHECK-GISEL-LABEL: test_v1f64_post_reg_st3lane:
12768 ; CHECK-GISEL:       ; %bb.0:
12769 ; CHECK-GISEL-NEXT:    mov x8, x0
12770 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2 def $q0_q1_q2
12771 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
12772 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2 def $q0_q1_q2
12773 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2 def $q0_q1_q2
12774 ; CHECK-GISEL-NEXT:    st3.d { v0, v1, v2 }[0], [x8]
12775 ; CHECK-GISEL-NEXT:    ret
12776   call void @llvm.aarch64.neon.st3lane.v1f64.p0(<1 x double> %B, <1 x double> %C, <1 x double> %D, i64 0, ptr %A)
12777   %tmp = getelementptr double, ptr %A, i64 %inc
12778   ret ptr %tmp
12781 declare void @llvm.aarch64.neon.st3lane.v1f64.p0(<1 x double>, <1 x double>, <1 x double>, i64, ptr)
12784 define ptr @test_v16i8_post_imm_st4lane(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D, <16 x i8> %E) nounwind {
12785 ; SDAG-LABEL: test_v16i8_post_imm_st4lane:
12786 ; SDAG:       ; %bb.0:
12787 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12788 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12789 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12790 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12791 ; SDAG-NEXT:    st4.b { v0, v1, v2, v3 }[0], [x0], #4
12792 ; SDAG-NEXT:    ret
12794 ; CHECK-GISEL-LABEL: test_v16i8_post_imm_st4lane:
12795 ; CHECK-GISEL:       ; %bb.0:
12796 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12797 ; CHECK-GISEL-NEXT:    mov x8, x0
12798 ; CHECK-GISEL-NEXT:    add x0, x0, #4
12799 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12800 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12801 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12802 ; CHECK-GISEL-NEXT:    st4.b { v0, v1, v2, v3 }[0], [x8]
12803 ; CHECK-GISEL-NEXT:    ret
12804   call void @llvm.aarch64.neon.st4lane.v16i8.p0(<16 x i8> %B, <16 x i8> %C, <16 x i8> %D, <16 x i8> %E, i64 0, ptr %A)
12805   %tmp = getelementptr i8, ptr %A, i32 4
12806   ret ptr %tmp
12809 define ptr @test_v16i8_post_reg_st4lane(ptr %A, ptr %ptr, <16 x i8> %B, <16 x i8> %C, <16 x i8> %D, <16 x i8> %E, i64 %inc) nounwind {
12810 ; SDAG-LABEL: test_v16i8_post_reg_st4lane:
12811 ; SDAG:       ; %bb.0:
12812 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12813 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12814 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12815 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12816 ; SDAG-NEXT:    st4.b { v0, v1, v2, v3 }[0], [x0], x2
12817 ; SDAG-NEXT:    ret
12819 ; CHECK-GISEL-LABEL: test_v16i8_post_reg_st4lane:
12820 ; CHECK-GISEL:       ; %bb.0:
12821 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12822 ; CHECK-GISEL-NEXT:    mov x8, x0
12823 ; CHECK-GISEL-NEXT:    add x0, x0, x2
12824 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12825 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12826 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12827 ; CHECK-GISEL-NEXT:    st4.b { v0, v1, v2, v3 }[0], [x8]
12828 ; CHECK-GISEL-NEXT:    ret
12829   call void @llvm.aarch64.neon.st4lane.v16i8.p0(<16 x i8> %B, <16 x i8> %C, <16 x i8> %D, <16 x i8> %E, i64 0, ptr %A)
12830   %tmp = getelementptr i8, ptr %A, i64 %inc
12831   ret ptr %tmp
12834 declare void @llvm.aarch64.neon.st4lane.v16i8.p0(<16 x i8>, <16 x i8>, <16 x i8>, <16 x i8>, i64, ptr)
12837 define ptr @test_v8i8_post_imm_st4lane(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, <8 x i8> %D, <8 x i8> %E) nounwind {
12838 ; SDAG-LABEL: test_v8i8_post_imm_st4lane:
12839 ; SDAG:       ; %bb.0:
12840 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12841 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12842 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12843 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12844 ; SDAG-NEXT:    st4.b { v0, v1, v2, v3 }[0], [x0], #4
12845 ; SDAG-NEXT:    ret
12847 ; CHECK-GISEL-LABEL: test_v8i8_post_imm_st4lane:
12848 ; CHECK-GISEL:       ; %bb.0:
12849 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12850 ; CHECK-GISEL-NEXT:    mov x8, x0
12851 ; CHECK-GISEL-NEXT:    add x0, x0, #4
12852 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12853 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12854 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12855 ; CHECK-GISEL-NEXT:    st4.b { v0, v1, v2, v3 }[0], [x8]
12856 ; CHECK-GISEL-NEXT:    ret
12857   call void @llvm.aarch64.neon.st4lane.v8i8.p0(<8 x i8> %B, <8 x i8> %C, <8 x i8> %D, <8 x i8> %E, i64 0, ptr %A)
12858   %tmp = getelementptr i8, ptr %A, i32 4
12859   ret ptr %tmp
12862 define ptr @test_v8i8_post_reg_st4lane(ptr %A, ptr %ptr, <8 x i8> %B, <8 x i8> %C, <8 x i8> %D, <8 x i8> %E, i64 %inc) nounwind {
12863 ; SDAG-LABEL: test_v8i8_post_reg_st4lane:
12864 ; SDAG:       ; %bb.0:
12865 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12866 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12867 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12868 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12869 ; SDAG-NEXT:    st4.b { v0, v1, v2, v3 }[0], [x0], x2
12870 ; SDAG-NEXT:    ret
12872 ; CHECK-GISEL-LABEL: test_v8i8_post_reg_st4lane:
12873 ; CHECK-GISEL:       ; %bb.0:
12874 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12875 ; CHECK-GISEL-NEXT:    mov x8, x0
12876 ; CHECK-GISEL-NEXT:    add x0, x0, x2
12877 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12878 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12879 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12880 ; CHECK-GISEL-NEXT:    st4.b { v0, v1, v2, v3 }[0], [x8]
12881 ; CHECK-GISEL-NEXT:    ret
12882   call void @llvm.aarch64.neon.st4lane.v8i8.p0(<8 x i8> %B, <8 x i8> %C, <8 x i8> %D, <8 x i8> %E, i64 0, ptr %A)
12883   %tmp = getelementptr i8, ptr %A, i64 %inc
12884   ret ptr %tmp
12887 declare void @llvm.aarch64.neon.st4lane.v8i8.p0(<8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, i64, ptr)
12890 define ptr @test_v8i16_post_imm_st4lane(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D, <8 x i16> %E) nounwind {
12891 ; SDAG-LABEL: test_v8i16_post_imm_st4lane:
12892 ; SDAG:       ; %bb.0:
12893 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12894 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12895 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12896 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12897 ; SDAG-NEXT:    st4.h { v0, v1, v2, v3 }[0], [x0], #8
12898 ; SDAG-NEXT:    ret
12900 ; CHECK-GISEL-LABEL: test_v8i16_post_imm_st4lane:
12901 ; CHECK-GISEL:       ; %bb.0:
12902 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12903 ; CHECK-GISEL-NEXT:    mov x8, x0
12904 ; CHECK-GISEL-NEXT:    add x0, x0, #8
12905 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12906 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12907 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12908 ; CHECK-GISEL-NEXT:    st4.h { v0, v1, v2, v3 }[0], [x8]
12909 ; CHECK-GISEL-NEXT:    ret
12910   call void @llvm.aarch64.neon.st4lane.v8i16.p0(<8 x i16> %B, <8 x i16> %C, <8 x i16> %D, <8 x i16> %E, i64 0, ptr %A)
12911   %tmp = getelementptr i16, ptr %A, i32 4
12912   ret ptr %tmp
12915 define ptr @test_v8i16_post_reg_st4lane(ptr %A, ptr %ptr, <8 x i16> %B, <8 x i16> %C, <8 x i16> %D, <8 x i16> %E, i64 %inc) nounwind {
12916 ; SDAG-LABEL: test_v8i16_post_reg_st4lane:
12917 ; SDAG:       ; %bb.0:
12918 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12919 ; SDAG-NEXT:    lsl x8, x2, #1
12920 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12921 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12922 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12923 ; SDAG-NEXT:    st4.h { v0, v1, v2, v3 }[0], [x0], x8
12924 ; SDAG-NEXT:    ret
12926 ; CHECK-GISEL-LABEL: test_v8i16_post_reg_st4lane:
12927 ; CHECK-GISEL:       ; %bb.0:
12928 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12929 ; CHECK-GISEL-NEXT:    mov x8, x0
12930 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #1
12931 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12932 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12933 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12934 ; CHECK-GISEL-NEXT:    st4.h { v0, v1, v2, v3 }[0], [x8]
12935 ; CHECK-GISEL-NEXT:    ret
12936   call void @llvm.aarch64.neon.st4lane.v8i16.p0(<8 x i16> %B, <8 x i16> %C, <8 x i16> %D, <8 x i16> %E, i64 0, ptr %A)
12937   %tmp = getelementptr i16, ptr %A, i64 %inc
12938   ret ptr %tmp
12941 declare void @llvm.aarch64.neon.st4lane.v8i16.p0(<8 x i16>, <8 x i16>, <8 x i16>, <8 x i16>, i64, ptr)
12944 define ptr @test_v4i16_post_imm_st4lane(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, <4 x i16> %D, <4 x i16> %E) nounwind {
12945 ; SDAG-LABEL: test_v4i16_post_imm_st4lane:
12946 ; SDAG:       ; %bb.0:
12947 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12948 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12949 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12950 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12951 ; SDAG-NEXT:    st4.h { v0, v1, v2, v3 }[0], [x0], #8
12952 ; SDAG-NEXT:    ret
12954 ; CHECK-GISEL-LABEL: test_v4i16_post_imm_st4lane:
12955 ; CHECK-GISEL:       ; %bb.0:
12956 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12957 ; CHECK-GISEL-NEXT:    mov x8, x0
12958 ; CHECK-GISEL-NEXT:    add x0, x0, #8
12959 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12960 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12961 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12962 ; CHECK-GISEL-NEXT:    st4.h { v0, v1, v2, v3 }[0], [x8]
12963 ; CHECK-GISEL-NEXT:    ret
12964   call void @llvm.aarch64.neon.st4lane.v4i16.p0(<4 x i16> %B, <4 x i16> %C, <4 x i16> %D, <4 x i16> %E, i64 0, ptr %A)
12965   %tmp = getelementptr i16, ptr %A, i32 4
12966   ret ptr %tmp
12969 define ptr @test_v4i16_post_reg_st4lane(ptr %A, ptr %ptr, <4 x i16> %B, <4 x i16> %C, <4 x i16> %D, <4 x i16> %E, i64 %inc) nounwind {
12970 ; SDAG-LABEL: test_v4i16_post_reg_st4lane:
12971 ; SDAG:       ; %bb.0:
12972 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12973 ; SDAG-NEXT:    lsl x8, x2, #1
12974 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12975 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12976 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12977 ; SDAG-NEXT:    st4.h { v0, v1, v2, v3 }[0], [x0], x8
12978 ; SDAG-NEXT:    ret
12980 ; CHECK-GISEL-LABEL: test_v4i16_post_reg_st4lane:
12981 ; CHECK-GISEL:       ; %bb.0:
12982 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12983 ; CHECK-GISEL-NEXT:    mov x8, x0
12984 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #1
12985 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12986 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12987 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
12988 ; CHECK-GISEL-NEXT:    st4.h { v0, v1, v2, v3 }[0], [x8]
12989 ; CHECK-GISEL-NEXT:    ret
12990   call void @llvm.aarch64.neon.st4lane.v4i16.p0(<4 x i16> %B, <4 x i16> %C, <4 x i16> %D, <4 x i16> %E, i64 0, ptr %A)
12991   %tmp = getelementptr i16, ptr %A, i64 %inc
12992   ret ptr %tmp
12995 declare void @llvm.aarch64.neon.st4lane.v4i16.p0(<4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, i64, ptr)
12998 define ptr @test_v4i32_post_imm_st4lane(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D, <4 x i32> %E) nounwind {
12999 ; SDAG-LABEL: test_v4i32_post_imm_st4lane:
13000 ; SDAG:       ; %bb.0:
13001 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13002 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13003 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13004 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13005 ; SDAG-NEXT:    st4.s { v0, v1, v2, v3 }[0], [x0], #16
13006 ; SDAG-NEXT:    ret
13008 ; CHECK-GISEL-LABEL: test_v4i32_post_imm_st4lane:
13009 ; CHECK-GISEL:       ; %bb.0:
13010 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13011 ; CHECK-GISEL-NEXT:    mov x8, x0
13012 ; CHECK-GISEL-NEXT:    add x0, x0, #16
13013 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13014 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13015 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13016 ; CHECK-GISEL-NEXT:    st4.s { v0, v1, v2, v3 }[0], [x8]
13017 ; CHECK-GISEL-NEXT:    ret
13018   call void @llvm.aarch64.neon.st4lane.v4i32.p0(<4 x i32> %B, <4 x i32> %C, <4 x i32> %D, <4 x i32> %E, i64 0, ptr %A)
13019   %tmp = getelementptr i32, ptr %A, i32 4
13020   ret ptr %tmp
13023 define ptr @test_v4i32_post_reg_st4lane(ptr %A, ptr %ptr, <4 x i32> %B, <4 x i32> %C, <4 x i32> %D, <4 x i32> %E, i64 %inc) nounwind {
13024 ; SDAG-LABEL: test_v4i32_post_reg_st4lane:
13025 ; SDAG:       ; %bb.0:
13026 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13027 ; SDAG-NEXT:    lsl x8, x2, #2
13028 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13029 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13030 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13031 ; SDAG-NEXT:    st4.s { v0, v1, v2, v3 }[0], [x0], x8
13032 ; SDAG-NEXT:    ret
13034 ; CHECK-GISEL-LABEL: test_v4i32_post_reg_st4lane:
13035 ; CHECK-GISEL:       ; %bb.0:
13036 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13037 ; CHECK-GISEL-NEXT:    mov x8, x0
13038 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
13039 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13040 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13041 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13042 ; CHECK-GISEL-NEXT:    st4.s { v0, v1, v2, v3 }[0], [x8]
13043 ; CHECK-GISEL-NEXT:    ret
13044   call void @llvm.aarch64.neon.st4lane.v4i32.p0(<4 x i32> %B, <4 x i32> %C, <4 x i32> %D, <4 x i32> %E, i64 0, ptr %A)
13045   %tmp = getelementptr i32, ptr %A, i64 %inc
13046   ret ptr %tmp
13049 declare void @llvm.aarch64.neon.st4lane.v4i32.p0(<4 x i32>, <4 x i32>, <4 x i32>, <4 x i32>, i64, ptr)
13052 define ptr @test_v2i32_post_imm_st4lane(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, <2 x i32> %D, <2 x i32> %E) nounwind {
13053 ; SDAG-LABEL: test_v2i32_post_imm_st4lane:
13054 ; SDAG:       ; %bb.0:
13055 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13056 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13057 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13058 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13059 ; SDAG-NEXT:    st4.s { v0, v1, v2, v3 }[0], [x0], #16
13060 ; SDAG-NEXT:    ret
13062 ; CHECK-GISEL-LABEL: test_v2i32_post_imm_st4lane:
13063 ; CHECK-GISEL:       ; %bb.0:
13064 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13065 ; CHECK-GISEL-NEXT:    mov x8, x0
13066 ; CHECK-GISEL-NEXT:    add x0, x0, #16
13067 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13068 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13069 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13070 ; CHECK-GISEL-NEXT:    st4.s { v0, v1, v2, v3 }[0], [x8]
13071 ; CHECK-GISEL-NEXT:    ret
13072   call void @llvm.aarch64.neon.st4lane.v2i32.p0(<2 x i32> %B, <2 x i32> %C, <2 x i32> %D, <2 x i32> %E, i64 0, ptr %A)
13073   %tmp = getelementptr i32, ptr %A, i32 4
13074   ret ptr %tmp
13077 define ptr @test_v2i32_post_reg_st4lane(ptr %A, ptr %ptr, <2 x i32> %B, <2 x i32> %C, <2 x i32> %D, <2 x i32> %E, i64 %inc) nounwind {
13078 ; SDAG-LABEL: test_v2i32_post_reg_st4lane:
13079 ; SDAG:       ; %bb.0:
13080 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13081 ; SDAG-NEXT:    lsl x8, x2, #2
13082 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13083 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13084 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13085 ; SDAG-NEXT:    st4.s { v0, v1, v2, v3 }[0], [x0], x8
13086 ; SDAG-NEXT:    ret
13088 ; CHECK-GISEL-LABEL: test_v2i32_post_reg_st4lane:
13089 ; CHECK-GISEL:       ; %bb.0:
13090 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13091 ; CHECK-GISEL-NEXT:    mov x8, x0
13092 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
13093 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13094 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13095 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13096 ; CHECK-GISEL-NEXT:    st4.s { v0, v1, v2, v3 }[0], [x8]
13097 ; CHECK-GISEL-NEXT:    ret
13098   call void @llvm.aarch64.neon.st4lane.v2i32.p0(<2 x i32> %B, <2 x i32> %C, <2 x i32> %D, <2 x i32> %E, i64 0, ptr %A)
13099   %tmp = getelementptr i32, ptr %A, i64 %inc
13100   ret ptr %tmp
13103 declare void @llvm.aarch64.neon.st4lane.v2i32.p0(<2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, i64, ptr)
13106 define ptr @test_v2i64_post_imm_st4lane(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D, <2 x i64> %E) nounwind {
13107 ; SDAG-LABEL: test_v2i64_post_imm_st4lane:
13108 ; SDAG:       ; %bb.0:
13109 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13110 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13111 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13112 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13113 ; SDAG-NEXT:    st4.d { v0, v1, v2, v3 }[0], [x0], #32
13114 ; SDAG-NEXT:    ret
13116 ; CHECK-GISEL-LABEL: test_v2i64_post_imm_st4lane:
13117 ; CHECK-GISEL:       ; %bb.0:
13118 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13119 ; CHECK-GISEL-NEXT:    mov x8, x0
13120 ; CHECK-GISEL-NEXT:    add x0, x0, #32
13121 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13122 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13123 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13124 ; CHECK-GISEL-NEXT:    st4.d { v0, v1, v2, v3 }[0], [x8]
13125 ; CHECK-GISEL-NEXT:    ret
13126   call void @llvm.aarch64.neon.st4lane.v2i64.p0(<2 x i64> %B, <2 x i64> %C, <2 x i64> %D, <2 x i64> %E, i64 0, ptr %A)
13127   %tmp = getelementptr i64, ptr %A, i64 4
13128   ret ptr %tmp
13131 define ptr @test_v2i64_post_reg_st4lane(ptr %A, ptr %ptr, <2 x i64> %B, <2 x i64> %C, <2 x i64> %D, <2 x i64> %E, i64 %inc) nounwind {
13132 ; SDAG-LABEL: test_v2i64_post_reg_st4lane:
13133 ; SDAG:       ; %bb.0:
13134 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13135 ; SDAG-NEXT:    lsl x8, x2, #3
13136 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13137 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13138 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13139 ; SDAG-NEXT:    st4.d { v0, v1, v2, v3 }[0], [x0], x8
13140 ; SDAG-NEXT:    ret
13142 ; CHECK-GISEL-LABEL: test_v2i64_post_reg_st4lane:
13143 ; CHECK-GISEL:       ; %bb.0:
13144 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13145 ; CHECK-GISEL-NEXT:    mov x8, x0
13146 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
13147 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13148 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13149 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13150 ; CHECK-GISEL-NEXT:    st4.d { v0, v1, v2, v3 }[0], [x8]
13151 ; CHECK-GISEL-NEXT:    ret
13152   call void @llvm.aarch64.neon.st4lane.v2i64.p0(<2 x i64> %B, <2 x i64> %C, <2 x i64> %D, <2 x i64> %E, i64 0, ptr %A)
13153   %tmp = getelementptr i64, ptr %A, i64 %inc
13154   ret ptr %tmp
13157 declare void @llvm.aarch64.neon.st4lane.v2i64.p0(<2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, i64, ptr)
13160 define ptr @test_v1i64_post_imm_st4lane(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, <1 x i64> %D, <1 x i64> %E) nounwind {
13161 ; SDAG-LABEL: test_v1i64_post_imm_st4lane:
13162 ; SDAG:       ; %bb.0:
13163 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13164 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13165 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13166 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13167 ; SDAG-NEXT:    st4.d { v0, v1, v2, v3 }[0], [x0], #32
13168 ; SDAG-NEXT:    ret
13170 ; CHECK-GISEL-LABEL: test_v1i64_post_imm_st4lane:
13171 ; CHECK-GISEL:       ; %bb.0:
13172 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13173 ; CHECK-GISEL-NEXT:    mov x8, x0
13174 ; CHECK-GISEL-NEXT:    add x0, x0, #32
13175 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13176 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13177 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13178 ; CHECK-GISEL-NEXT:    st4.d { v0, v1, v2, v3 }[0], [x8]
13179 ; CHECK-GISEL-NEXT:    ret
13180   call void @llvm.aarch64.neon.st4lane.v1i64.p0(<1 x i64> %B, <1 x i64> %C, <1 x i64> %D, <1 x i64> %E, i64 0, ptr %A)
13181   %tmp = getelementptr i64, ptr %A, i64 4
13182   ret ptr %tmp
13185 define ptr @test_v1i64_post_reg_st4lane(ptr %A, ptr %ptr, <1 x i64> %B, <1 x i64> %C, <1 x i64> %D, <1 x i64> %E, i64 %inc) nounwind {
13186 ; SDAG-LABEL: test_v1i64_post_reg_st4lane:
13187 ; SDAG:       ; %bb.0:
13188 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13189 ; SDAG-NEXT:    lsl x8, x2, #3
13190 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13191 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13192 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13193 ; SDAG-NEXT:    st4.d { v0, v1, v2, v3 }[0], [x0], x8
13194 ; SDAG-NEXT:    ret
13196 ; CHECK-GISEL-LABEL: test_v1i64_post_reg_st4lane:
13197 ; CHECK-GISEL:       ; %bb.0:
13198 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13199 ; CHECK-GISEL-NEXT:    mov x8, x0
13200 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
13201 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13202 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13203 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13204 ; CHECK-GISEL-NEXT:    st4.d { v0, v1, v2, v3 }[0], [x8]
13205 ; CHECK-GISEL-NEXT:    ret
13206   call void @llvm.aarch64.neon.st4lane.v1i64.p0(<1 x i64> %B, <1 x i64> %C, <1 x i64> %D, <1 x i64> %E, i64 0, ptr %A)
13207   %tmp = getelementptr i64, ptr %A, i64 %inc
13208   ret ptr %tmp
13211 declare void @llvm.aarch64.neon.st4lane.v1i64.p0(<1 x i64>, <1 x i64>, <1 x i64>, <1 x i64>, i64, ptr)
13214 define ptr @test_v4f32_post_imm_st4lane(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, <4 x float> %D, <4 x float> %E) nounwind {
13215 ; SDAG-LABEL: test_v4f32_post_imm_st4lane:
13216 ; SDAG:       ; %bb.0:
13217 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13218 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13219 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13220 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13221 ; SDAG-NEXT:    st4.s { v0, v1, v2, v3 }[0], [x0], #16
13222 ; SDAG-NEXT:    ret
13224 ; CHECK-GISEL-LABEL: test_v4f32_post_imm_st4lane:
13225 ; CHECK-GISEL:       ; %bb.0:
13226 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13227 ; CHECK-GISEL-NEXT:    mov x8, x0
13228 ; CHECK-GISEL-NEXT:    add x0, x0, #16
13229 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13230 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13231 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13232 ; CHECK-GISEL-NEXT:    st4.s { v0, v1, v2, v3 }[0], [x8]
13233 ; CHECK-GISEL-NEXT:    ret
13234   call void @llvm.aarch64.neon.st4lane.v4f32.p0(<4 x float> %B, <4 x float> %C, <4 x float> %D, <4 x float> %E, i64 0, ptr %A)
13235   %tmp = getelementptr float, ptr %A, i32 4
13236   ret ptr %tmp
13239 define ptr @test_v4f32_post_reg_st4lane(ptr %A, ptr %ptr, <4 x float> %B, <4 x float> %C, <4 x float> %D, <4 x float> %E, i64 %inc) nounwind {
13240 ; SDAG-LABEL: test_v4f32_post_reg_st4lane:
13241 ; SDAG:       ; %bb.0:
13242 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13243 ; SDAG-NEXT:    lsl x8, x2, #2
13244 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13245 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13246 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13247 ; SDAG-NEXT:    st4.s { v0, v1, v2, v3 }[0], [x0], x8
13248 ; SDAG-NEXT:    ret
13250 ; CHECK-GISEL-LABEL: test_v4f32_post_reg_st4lane:
13251 ; CHECK-GISEL:       ; %bb.0:
13252 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13253 ; CHECK-GISEL-NEXT:    mov x8, x0
13254 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
13255 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13256 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13257 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13258 ; CHECK-GISEL-NEXT:    st4.s { v0, v1, v2, v3 }[0], [x8]
13259 ; CHECK-GISEL-NEXT:    ret
13260   call void @llvm.aarch64.neon.st4lane.v4f32.p0(<4 x float> %B, <4 x float> %C, <4 x float> %D, <4 x float> %E, i64 0, ptr %A)
13261   %tmp = getelementptr float, ptr %A, i64 %inc
13262   ret ptr %tmp
13265 declare void @llvm.aarch64.neon.st4lane.v4f32.p0(<4 x float>, <4 x float>, <4 x float>, <4 x float>, i64, ptr)
13268 define ptr @test_v2f32_post_imm_st4lane(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, <2 x float> %D, <2 x float> %E) nounwind {
13269 ; SDAG-LABEL: test_v2f32_post_imm_st4lane:
13270 ; SDAG:       ; %bb.0:
13271 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13272 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13273 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13274 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13275 ; SDAG-NEXT:    st4.s { v0, v1, v2, v3 }[0], [x0], #16
13276 ; SDAG-NEXT:    ret
13278 ; CHECK-GISEL-LABEL: test_v2f32_post_imm_st4lane:
13279 ; CHECK-GISEL:       ; %bb.0:
13280 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13281 ; CHECK-GISEL-NEXT:    mov x8, x0
13282 ; CHECK-GISEL-NEXT:    add x0, x0, #16
13283 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13284 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13285 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13286 ; CHECK-GISEL-NEXT:    st4.s { v0, v1, v2, v3 }[0], [x8]
13287 ; CHECK-GISEL-NEXT:    ret
13288   call void @llvm.aarch64.neon.st4lane.v2f32.p0(<2 x float> %B, <2 x float> %C, <2 x float> %D, <2 x float> %E, i64 0, ptr %A)
13289   %tmp = getelementptr float, ptr %A, i32 4
13290   ret ptr %tmp
13293 define ptr @test_v2f32_post_reg_st4lane(ptr %A, ptr %ptr, <2 x float> %B, <2 x float> %C, <2 x float> %D, <2 x float> %E, i64 %inc) nounwind {
13294 ; SDAG-LABEL: test_v2f32_post_reg_st4lane:
13295 ; SDAG:       ; %bb.0:
13296 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13297 ; SDAG-NEXT:    lsl x8, x2, #2
13298 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13299 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13300 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13301 ; SDAG-NEXT:    st4.s { v0, v1, v2, v3 }[0], [x0], x8
13302 ; SDAG-NEXT:    ret
13304 ; CHECK-GISEL-LABEL: test_v2f32_post_reg_st4lane:
13305 ; CHECK-GISEL:       ; %bb.0:
13306 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13307 ; CHECK-GISEL-NEXT:    mov x8, x0
13308 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #2
13309 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13310 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13311 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13312 ; CHECK-GISEL-NEXT:    st4.s { v0, v1, v2, v3 }[0], [x8]
13313 ; CHECK-GISEL-NEXT:    ret
13314   call void @llvm.aarch64.neon.st4lane.v2f32.p0(<2 x float> %B, <2 x float> %C, <2 x float> %D, <2 x float> %E, i64 0, ptr %A)
13315   %tmp = getelementptr float, ptr %A, i64 %inc
13316   ret ptr %tmp
13319 declare void @llvm.aarch64.neon.st4lane.v2f32.p0(<2 x float>, <2 x float>, <2 x float>, <2 x float>, i64, ptr)
13322 define ptr @test_v2f64_post_imm_st4lane(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, <2 x double> %D, <2 x double> %E) nounwind {
13323 ; SDAG-LABEL: test_v2f64_post_imm_st4lane:
13324 ; SDAG:       ; %bb.0:
13325 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13326 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13327 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13328 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13329 ; SDAG-NEXT:    st4.d { v0, v1, v2, v3 }[0], [x0], #32
13330 ; SDAG-NEXT:    ret
13332 ; CHECK-GISEL-LABEL: test_v2f64_post_imm_st4lane:
13333 ; CHECK-GISEL:       ; %bb.0:
13334 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13335 ; CHECK-GISEL-NEXT:    mov x8, x0
13336 ; CHECK-GISEL-NEXT:    add x0, x0, #32
13337 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13338 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13339 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13340 ; CHECK-GISEL-NEXT:    st4.d { v0, v1, v2, v3 }[0], [x8]
13341 ; CHECK-GISEL-NEXT:    ret
13342   call void @llvm.aarch64.neon.st4lane.v2f64.p0(<2 x double> %B, <2 x double> %C, <2 x double> %D, <2 x double> %E, i64 0, ptr %A)
13343   %tmp = getelementptr double, ptr %A, i64 4
13344   ret ptr %tmp
13347 define ptr @test_v2f64_post_reg_st4lane(ptr %A, ptr %ptr, <2 x double> %B, <2 x double> %C, <2 x double> %D, <2 x double> %E, i64 %inc) nounwind {
13348 ; SDAG-LABEL: test_v2f64_post_reg_st4lane:
13349 ; SDAG:       ; %bb.0:
13350 ; SDAG-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13351 ; SDAG-NEXT:    lsl x8, x2, #3
13352 ; SDAG-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13353 ; SDAG-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13354 ; SDAG-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13355 ; SDAG-NEXT:    st4.d { v0, v1, v2, v3 }[0], [x0], x8
13356 ; SDAG-NEXT:    ret
13358 ; CHECK-GISEL-LABEL: test_v2f64_post_reg_st4lane:
13359 ; CHECK-GISEL:       ; %bb.0:
13360 ; CHECK-GISEL-NEXT:    ; kill: def $q0 killed $q0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13361 ; CHECK-GISEL-NEXT:    mov x8, x0
13362 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
13363 ; CHECK-GISEL-NEXT:    ; kill: def $q1 killed $q1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13364 ; CHECK-GISEL-NEXT:    ; kill: def $q2 killed $q2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13365 ; CHECK-GISEL-NEXT:    ; kill: def $q3 killed $q3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13366 ; CHECK-GISEL-NEXT:    st4.d { v0, v1, v2, v3 }[0], [x8]
13367 ; CHECK-GISEL-NEXT:    ret
13368   call void @llvm.aarch64.neon.st4lane.v2f64.p0(<2 x double> %B, <2 x double> %C, <2 x double> %D, <2 x double> %E, i64 0, ptr %A)
13369   %tmp = getelementptr double, ptr %A, i64 %inc
13370   ret ptr %tmp
13373 declare void @llvm.aarch64.neon.st4lane.v2f64.p0(<2 x double>, <2 x double>, <2 x double>, <2 x double>, i64, ptr)
13376 define ptr @test_v1f64_post_imm_st4lane(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, <1 x double> %D, <1 x double> %E) nounwind {
13377 ; SDAG-LABEL: test_v1f64_post_imm_st4lane:
13378 ; SDAG:       ; %bb.0:
13379 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13380 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13381 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13382 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13383 ; SDAG-NEXT:    st4.d { v0, v1, v2, v3 }[0], [x0], #32
13384 ; SDAG-NEXT:    ret
13386 ; CHECK-GISEL-LABEL: test_v1f64_post_imm_st4lane:
13387 ; CHECK-GISEL:       ; %bb.0:
13388 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13389 ; CHECK-GISEL-NEXT:    mov x8, x0
13390 ; CHECK-GISEL-NEXT:    add x0, x0, #32
13391 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13392 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13393 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13394 ; CHECK-GISEL-NEXT:    st4.d { v0, v1, v2, v3 }[0], [x8]
13395 ; CHECK-GISEL-NEXT:    ret
13396   call void @llvm.aarch64.neon.st4lane.v1f64.p0(<1 x double> %B, <1 x double> %C, <1 x double> %D, <1 x double> %E, i64 0, ptr %A)
13397   %tmp = getelementptr double, ptr %A, i64 4
13398   ret ptr %tmp
13401 define ptr @test_v1f64_post_reg_st4lane(ptr %A, ptr %ptr, <1 x double> %B, <1 x double> %C, <1 x double> %D, <1 x double> %E, i64 %inc) nounwind {
13402 ; SDAG-LABEL: test_v1f64_post_reg_st4lane:
13403 ; SDAG:       ; %bb.0:
13404 ; SDAG-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13405 ; SDAG-NEXT:    lsl x8, x2, #3
13406 ; SDAG-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13407 ; SDAG-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13408 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13409 ; SDAG-NEXT:    st4.d { v0, v1, v2, v3 }[0], [x0], x8
13410 ; SDAG-NEXT:    ret
13412 ; CHECK-GISEL-LABEL: test_v1f64_post_reg_st4lane:
13413 ; CHECK-GISEL:       ; %bb.0:
13414 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13415 ; CHECK-GISEL-NEXT:    mov x8, x0
13416 ; CHECK-GISEL-NEXT:    add x0, x0, x2, lsl #3
13417 ; CHECK-GISEL-NEXT:    ; kill: def $d1 killed $d1 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13418 ; CHECK-GISEL-NEXT:    ; kill: def $d2 killed $d2 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13419 ; CHECK-GISEL-NEXT:    ; kill: def $d3 killed $d3 killed $q0_q1_q2_q3 def $q0_q1_q2_q3
13420 ; CHECK-GISEL-NEXT:    st4.d { v0, v1, v2, v3 }[0], [x8]
13421 ; CHECK-GISEL-NEXT:    ret
13422   call void @llvm.aarch64.neon.st4lane.v1f64.p0(<1 x double> %B, <1 x double> %C, <1 x double> %D, <1 x double> %E, i64 0, ptr %A)
13423   %tmp = getelementptr double, ptr %A, i64 %inc
13424   ret ptr %tmp
13427 declare void @llvm.aarch64.neon.st4lane.v1f64.p0(<1 x double>, <1 x double>, <1 x double>, <1 x double>, i64, ptr)
13429 define <16 x i8> @test_v16i8_post_imm_ld1r(ptr %bar, ptr %ptr) {
13430 ; SDAG-LABEL: test_v16i8_post_imm_ld1r:
13431 ; SDAG:       ; %bb.0:
13432 ; SDAG-NEXT:    ld1r.16b { v0 }, [x0], #1
13433 ; SDAG-NEXT:    str x0, [x1]
13434 ; SDAG-NEXT:    ret
13436 ; CHECK-GISEL-LABEL: test_v16i8_post_imm_ld1r:
13437 ; CHECK-GISEL:       ; %bb.0:
13438 ; CHECK-GISEL-NEXT:    ldrb w8, [x0], #1
13439 ; CHECK-GISEL-NEXT:    str x0, [x1]
13440 ; CHECK-GISEL-NEXT:    dup.16b v0, w8
13441 ; CHECK-GISEL-NEXT:    ret
13442   %tmp1 = load i8, ptr %bar
13443   %tmp2 = insertelement <16 x i8> <i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, i8 %tmp1, i32 0
13444   %tmp3 = insertelement <16 x i8> %tmp2, i8 %tmp1, i32 1
13445   %tmp4 = insertelement <16 x i8> %tmp3, i8 %tmp1, i32 2
13446   %tmp5 = insertelement <16 x i8> %tmp4, i8 %tmp1, i32 3
13447   %tmp6 = insertelement <16 x i8> %tmp5, i8 %tmp1, i32 4
13448   %tmp7 = insertelement <16 x i8> %tmp6, i8 %tmp1, i32 5
13449   %tmp8 = insertelement <16 x i8> %tmp7, i8 %tmp1, i32 6
13450   %tmp9 = insertelement <16 x i8> %tmp8, i8 %tmp1, i32 7
13451   %tmp10 = insertelement <16 x i8> %tmp9, i8 %tmp1, i32 8
13452   %tmp11 = insertelement <16 x i8> %tmp10, i8 %tmp1, i32 9
13453   %tmp12 = insertelement <16 x i8> %tmp11, i8 %tmp1, i32 10
13454   %tmp13 = insertelement <16 x i8> %tmp12, i8 %tmp1, i32 11
13455   %tmp14 = insertelement <16 x i8> %tmp13, i8 %tmp1, i32 12
13456   %tmp15 = insertelement <16 x i8> %tmp14, i8 %tmp1, i32 13
13457   %tmp16 = insertelement <16 x i8> %tmp15, i8 %tmp1, i32 14
13458   %tmp17 = insertelement <16 x i8> %tmp16, i8 %tmp1, i32 15
13459   %tmp18 = getelementptr i8, ptr %bar, i64 1
13460   store ptr %tmp18, ptr %ptr
13461   ret <16 x i8> %tmp17
13464 define <16 x i8> @test_v16i8_post_reg_ld1r(ptr %bar, ptr %ptr, i64 %inc) {
13465 ; SDAG-LABEL: test_v16i8_post_reg_ld1r:
13466 ; SDAG:       ; %bb.0:
13467 ; SDAG-NEXT:    ld1r.16b { v0 }, [x0], x2
13468 ; SDAG-NEXT:    str x0, [x1]
13469 ; SDAG-NEXT:    ret
13471 ; CHECK-GISEL-LABEL: test_v16i8_post_reg_ld1r:
13472 ; CHECK-GISEL:       ; %bb.0:
13473 ; CHECK-GISEL-NEXT:    ld1r.16b { v0 }, [x0]
13474 ; CHECK-GISEL-NEXT:    add x8, x0, x2
13475 ; CHECK-GISEL-NEXT:    str x8, [x1]
13476 ; CHECK-GISEL-NEXT:    ret
13477   %tmp1 = load i8, ptr %bar
13478   %tmp2 = insertelement <16 x i8> <i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, i8 %tmp1, i32 0
13479   %tmp3 = insertelement <16 x i8> %tmp2, i8 %tmp1, i32 1
13480   %tmp4 = insertelement <16 x i8> %tmp3, i8 %tmp1, i32 2
13481   %tmp5 = insertelement <16 x i8> %tmp4, i8 %tmp1, i32 3
13482   %tmp6 = insertelement <16 x i8> %tmp5, i8 %tmp1, i32 4
13483   %tmp7 = insertelement <16 x i8> %tmp6, i8 %tmp1, i32 5
13484   %tmp8 = insertelement <16 x i8> %tmp7, i8 %tmp1, i32 6
13485   %tmp9 = insertelement <16 x i8> %tmp8, i8 %tmp1, i32 7
13486   %tmp10 = insertelement <16 x i8> %tmp9, i8 %tmp1, i32 8
13487   %tmp11 = insertelement <16 x i8> %tmp10, i8 %tmp1, i32 9
13488   %tmp12 = insertelement <16 x i8> %tmp11, i8 %tmp1, i32 10
13489   %tmp13 = insertelement <16 x i8> %tmp12, i8 %tmp1, i32 11
13490   %tmp14 = insertelement <16 x i8> %tmp13, i8 %tmp1, i32 12
13491   %tmp15 = insertelement <16 x i8> %tmp14, i8 %tmp1, i32 13
13492   %tmp16 = insertelement <16 x i8> %tmp15, i8 %tmp1, i32 14
13493   %tmp17 = insertelement <16 x i8> %tmp16, i8 %tmp1, i32 15
13494   %tmp18 = getelementptr i8, ptr %bar, i64 %inc
13495   store ptr %tmp18, ptr %ptr
13496   ret <16 x i8> %tmp17
13499 define <8 x i8> @test_v8i8_post_imm_ld1r(ptr %bar, ptr %ptr) {
13500 ; SDAG-LABEL: test_v8i8_post_imm_ld1r:
13501 ; SDAG:       ; %bb.0:
13502 ; SDAG-NEXT:    ld1r.8b { v0 }, [x0], #1
13503 ; SDAG-NEXT:    str x0, [x1]
13504 ; SDAG-NEXT:    ret
13506 ; CHECK-GISEL-LABEL: test_v8i8_post_imm_ld1r:
13507 ; CHECK-GISEL:       ; %bb.0:
13508 ; CHECK-GISEL-NEXT:    ldrb w8, [x0], #1
13509 ; CHECK-GISEL-NEXT:    str x0, [x1]
13510 ; CHECK-GISEL-NEXT:    dup.8b v0, w8
13511 ; CHECK-GISEL-NEXT:    ret
13512   %tmp1 = load i8, ptr %bar
13513   %tmp2 = insertelement <8 x i8> <i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, i8 %tmp1, i32 0
13514   %tmp3 = insertelement <8 x i8> %tmp2, i8 %tmp1, i32 1
13515   %tmp4 = insertelement <8 x i8> %tmp3, i8 %tmp1, i32 2
13516   %tmp5 = insertelement <8 x i8> %tmp4, i8 %tmp1, i32 3
13517   %tmp6 = insertelement <8 x i8> %tmp5, i8 %tmp1, i32 4
13518   %tmp7 = insertelement <8 x i8> %tmp6, i8 %tmp1, i32 5
13519   %tmp8 = insertelement <8 x i8> %tmp7, i8 %tmp1, i32 6
13520   %tmp9 = insertelement <8 x i8> %tmp8, i8 %tmp1, i32 7
13521   %tmp10 = getelementptr i8, ptr %bar, i64 1
13522   store ptr %tmp10, ptr %ptr
13523   ret <8 x i8> %tmp9
13526 define <8 x i8> @test_v8i8_post_reg_ld1r(ptr %bar, ptr %ptr, i64 %inc) {
13527 ; SDAG-LABEL: test_v8i8_post_reg_ld1r:
13528 ; SDAG:       ; %bb.0:
13529 ; SDAG-NEXT:    ld1r.8b { v0 }, [x0], x2
13530 ; SDAG-NEXT:    str x0, [x1]
13531 ; SDAG-NEXT:    ret
13533 ; CHECK-GISEL-LABEL: test_v8i8_post_reg_ld1r:
13534 ; CHECK-GISEL:       ; %bb.0:
13535 ; CHECK-GISEL-NEXT:    ld1r.8b { v0 }, [x0]
13536 ; CHECK-GISEL-NEXT:    add x8, x0, x2
13537 ; CHECK-GISEL-NEXT:    str x8, [x1]
13538 ; CHECK-GISEL-NEXT:    ret
13539   %tmp1 = load i8, ptr %bar
13540   %tmp2 = insertelement <8 x i8> <i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, i8 %tmp1, i32 0
13541   %tmp3 = insertelement <8 x i8> %tmp2, i8 %tmp1, i32 1
13542   %tmp4 = insertelement <8 x i8> %tmp3, i8 %tmp1, i32 2
13543   %tmp5 = insertelement <8 x i8> %tmp4, i8 %tmp1, i32 3
13544   %tmp6 = insertelement <8 x i8> %tmp5, i8 %tmp1, i32 4
13545   %tmp7 = insertelement <8 x i8> %tmp6, i8 %tmp1, i32 5
13546   %tmp8 = insertelement <8 x i8> %tmp7, i8 %tmp1, i32 6
13547   %tmp9 = insertelement <8 x i8> %tmp8, i8 %tmp1, i32 7
13548   %tmp10 = getelementptr i8, ptr %bar, i64 %inc
13549   store ptr %tmp10, ptr %ptr
13550   ret <8 x i8> %tmp9
13553 define <8 x i16> @test_v8i16_post_imm_ld1r(ptr %bar, ptr %ptr) {
13554 ; SDAG-LABEL: test_v8i16_post_imm_ld1r:
13555 ; SDAG:       ; %bb.0:
13556 ; SDAG-NEXT:    ld1r.8h { v0 }, [x0], #2
13557 ; SDAG-NEXT:    str x0, [x1]
13558 ; SDAG-NEXT:    ret
13560 ; CHECK-GISEL-LABEL: test_v8i16_post_imm_ld1r:
13561 ; CHECK-GISEL:       ; %bb.0:
13562 ; CHECK-GISEL-NEXT:    ldrh w8, [x0], #2
13563 ; CHECK-GISEL-NEXT:    str x0, [x1]
13564 ; CHECK-GISEL-NEXT:    dup.8h v0, w8
13565 ; CHECK-GISEL-NEXT:    ret
13566   %tmp1 = load i16, ptr %bar
13567   %tmp2 = insertelement <8 x i16> <i16 undef, i16 undef, i16 undef, i16 undef, i16 undef, i16 undef, i16 undef, i16 undef>, i16 %tmp1, i32 0
13568   %tmp3 = insertelement <8 x i16> %tmp2, i16 %tmp1, i32 1
13569   %tmp4 = insertelement <8 x i16> %tmp3, i16 %tmp1, i32 2
13570   %tmp5 = insertelement <8 x i16> %tmp4, i16 %tmp1, i32 3
13571   %tmp6 = insertelement <8 x i16> %tmp5, i16 %tmp1, i32 4
13572   %tmp7 = insertelement <8 x i16> %tmp6, i16 %tmp1, i32 5
13573   %tmp8 = insertelement <8 x i16> %tmp7, i16 %tmp1, i32 6
13574   %tmp9 = insertelement <8 x i16> %tmp8, i16 %tmp1, i32 7
13575   %tmp10 = getelementptr i16, ptr %bar, i64 1
13576   store ptr %tmp10, ptr %ptr
13577   ret <8 x i16> %tmp9
13580 define <8 x i16> @test_v8i16_post_reg_ld1r(ptr %bar, ptr %ptr, i64 %inc) {
13581 ; SDAG-LABEL: test_v8i16_post_reg_ld1r:
13582 ; SDAG:       ; %bb.0:
13583 ; SDAG-NEXT:    lsl x8, x2, #1
13584 ; SDAG-NEXT:    ld1r.8h { v0 }, [x0], x8
13585 ; SDAG-NEXT:    str x0, [x1]
13586 ; SDAG-NEXT:    ret
13588 ; CHECK-GISEL-LABEL: test_v8i16_post_reg_ld1r:
13589 ; CHECK-GISEL:       ; %bb.0:
13590 ; CHECK-GISEL-NEXT:    ld1r.8h { v0 }, [x0]
13591 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #1
13592 ; CHECK-GISEL-NEXT:    str x8, [x1]
13593 ; CHECK-GISEL-NEXT:    ret
13594   %tmp1 = load i16, ptr %bar
13595   %tmp2 = insertelement <8 x i16> <i16 undef, i16 undef, i16 undef, i16 undef, i16 undef, i16 undef, i16 undef, i16 undef>, i16 %tmp1, i32 0
13596   %tmp3 = insertelement <8 x i16> %tmp2, i16 %tmp1, i32 1
13597   %tmp4 = insertelement <8 x i16> %tmp3, i16 %tmp1, i32 2
13598   %tmp5 = insertelement <8 x i16> %tmp4, i16 %tmp1, i32 3
13599   %tmp6 = insertelement <8 x i16> %tmp5, i16 %tmp1, i32 4
13600   %tmp7 = insertelement <8 x i16> %tmp6, i16 %tmp1, i32 5
13601   %tmp8 = insertelement <8 x i16> %tmp7, i16 %tmp1, i32 6
13602   %tmp9 = insertelement <8 x i16> %tmp8, i16 %tmp1, i32 7
13603   %tmp10 = getelementptr i16, ptr %bar, i64 %inc
13604   store ptr %tmp10, ptr %ptr
13605   ret <8 x i16> %tmp9
13608 define <4 x i16> @test_v4i16_post_imm_ld1r(ptr %bar, ptr %ptr) {
13609 ; SDAG-LABEL: test_v4i16_post_imm_ld1r:
13610 ; SDAG:       ; %bb.0:
13611 ; SDAG-NEXT:    ld1r.4h { v0 }, [x0], #2
13612 ; SDAG-NEXT:    str x0, [x1]
13613 ; SDAG-NEXT:    ret
13615 ; CHECK-GISEL-LABEL: test_v4i16_post_imm_ld1r:
13616 ; CHECK-GISEL:       ; %bb.0:
13617 ; CHECK-GISEL-NEXT:    ldrh w8, [x0], #2
13618 ; CHECK-GISEL-NEXT:    str x0, [x1]
13619 ; CHECK-GISEL-NEXT:    dup.4h v0, w8
13620 ; CHECK-GISEL-NEXT:    ret
13621   %tmp1 = load i16, ptr %bar
13622   %tmp2 = insertelement <4 x i16> <i16 undef, i16 undef, i16 undef, i16 undef>, i16 %tmp1, i32 0
13623   %tmp3 = insertelement <4 x i16> %tmp2, i16 %tmp1, i32 1
13624   %tmp4 = insertelement <4 x i16> %tmp3, i16 %tmp1, i32 2
13625   %tmp5 = insertelement <4 x i16> %tmp4, i16 %tmp1, i32 3
13626   %tmp6 = getelementptr i16, ptr %bar, i64 1
13627   store ptr %tmp6, ptr %ptr
13628   ret <4 x i16> %tmp5
13631 define <4 x i16> @test_v4i16_post_reg_ld1r(ptr %bar, ptr %ptr, i64 %inc) {
13632 ; SDAG-LABEL: test_v4i16_post_reg_ld1r:
13633 ; SDAG:       ; %bb.0:
13634 ; SDAG-NEXT:    lsl x8, x2, #1
13635 ; SDAG-NEXT:    ld1r.4h { v0 }, [x0], x8
13636 ; SDAG-NEXT:    str x0, [x1]
13637 ; SDAG-NEXT:    ret
13639 ; CHECK-GISEL-LABEL: test_v4i16_post_reg_ld1r:
13640 ; CHECK-GISEL:       ; %bb.0:
13641 ; CHECK-GISEL-NEXT:    ld1r.4h { v0 }, [x0]
13642 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #1
13643 ; CHECK-GISEL-NEXT:    str x8, [x1]
13644 ; CHECK-GISEL-NEXT:    ret
13645   %tmp1 = load i16, ptr %bar
13646   %tmp2 = insertelement <4 x i16> <i16 undef, i16 undef, i16 undef, i16 undef>, i16 %tmp1, i32 0
13647   %tmp3 = insertelement <4 x i16> %tmp2, i16 %tmp1, i32 1
13648   %tmp4 = insertelement <4 x i16> %tmp3, i16 %tmp1, i32 2
13649   %tmp5 = insertelement <4 x i16> %tmp4, i16 %tmp1, i32 3
13650   %tmp6 = getelementptr i16, ptr %bar, i64 %inc
13651   store ptr %tmp6, ptr %ptr
13652   ret <4 x i16> %tmp5
13655 define <4 x i32> @test_v4i32_post_imm_ld1r(ptr %bar, ptr %ptr) {
13656 ; SDAG-LABEL: test_v4i32_post_imm_ld1r:
13657 ; SDAG:       ; %bb.0:
13658 ; SDAG-NEXT:    ld1r.4s { v0 }, [x0], #4
13659 ; SDAG-NEXT:    str x0, [x1]
13660 ; SDAG-NEXT:    ret
13662 ; CHECK-GISEL-LABEL: test_v4i32_post_imm_ld1r:
13663 ; CHECK-GISEL:       ; %bb.0:
13664 ; CHECK-GISEL-NEXT:    ldr w8, [x0], #4
13665 ; CHECK-GISEL-NEXT:    str x0, [x1]
13666 ; CHECK-GISEL-NEXT:    dup.4s v0, w8
13667 ; CHECK-GISEL-NEXT:    ret
13668   %tmp1 = load i32, ptr %bar
13669   %tmp2 = insertelement <4 x i32> <i32 undef, i32 undef, i32 undef, i32 undef>, i32 %tmp1, i32 0
13670   %tmp3 = insertelement <4 x i32> %tmp2, i32 %tmp1, i32 1
13671   %tmp4 = insertelement <4 x i32> %tmp3, i32 %tmp1, i32 2
13672   %tmp5 = insertelement <4 x i32> %tmp4, i32 %tmp1, i32 3
13673   %tmp6 = getelementptr i32, ptr %bar, i64 1
13674   store ptr %tmp6, ptr %ptr
13675   ret <4 x i32> %tmp5
13678 define <4 x i32> @test_v4i32_post_reg_ld1r(ptr %bar, ptr %ptr, i64 %inc) {
13679 ; SDAG-LABEL: test_v4i32_post_reg_ld1r:
13680 ; SDAG:       ; %bb.0:
13681 ; SDAG-NEXT:    lsl x8, x2, #2
13682 ; SDAG-NEXT:    ld1r.4s { v0 }, [x0], x8
13683 ; SDAG-NEXT:    str x0, [x1]
13684 ; SDAG-NEXT:    ret
13686 ; CHECK-GISEL-LABEL: test_v4i32_post_reg_ld1r:
13687 ; CHECK-GISEL:       ; %bb.0:
13688 ; CHECK-GISEL-NEXT:    ld1r.4s { v0 }, [x0]
13689 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
13690 ; CHECK-GISEL-NEXT:    str x8, [x1]
13691 ; CHECK-GISEL-NEXT:    ret
13692   %tmp1 = load i32, ptr %bar
13693   %tmp2 = insertelement <4 x i32> <i32 undef, i32 undef, i32 undef, i32 undef>, i32 %tmp1, i32 0
13694   %tmp3 = insertelement <4 x i32> %tmp2, i32 %tmp1, i32 1
13695   %tmp4 = insertelement <4 x i32> %tmp3, i32 %tmp1, i32 2
13696   %tmp5 = insertelement <4 x i32> %tmp4, i32 %tmp1, i32 3
13697   %tmp6 = getelementptr i32, ptr %bar, i64 %inc
13698   store ptr %tmp6, ptr %ptr
13699   ret <4 x i32> %tmp5
13702 define <2 x i32> @test_v2i32_post_imm_ld1r(ptr %bar, ptr %ptr) {
13703 ; SDAG-LABEL: test_v2i32_post_imm_ld1r:
13704 ; SDAG:       ; %bb.0:
13705 ; SDAG-NEXT:    ld1r.2s { v0 }, [x0], #4
13706 ; SDAG-NEXT:    str x0, [x1]
13707 ; SDAG-NEXT:    ret
13709 ; CHECK-GISEL-LABEL: test_v2i32_post_imm_ld1r:
13710 ; CHECK-GISEL:       ; %bb.0:
13711 ; CHECK-GISEL-NEXT:    ldr w8, [x0], #4
13712 ; CHECK-GISEL-NEXT:    str x0, [x1]
13713 ; CHECK-GISEL-NEXT:    dup.2s v0, w8
13714 ; CHECK-GISEL-NEXT:    ret
13715   %tmp1 = load i32, ptr %bar
13716   %tmp2 = insertelement <2 x i32> <i32 undef, i32 undef>, i32 %tmp1, i32 0
13717   %tmp3 = insertelement <2 x i32> %tmp2, i32 %tmp1, i32 1
13718   %tmp4 = getelementptr i32, ptr %bar, i64 1
13719   store ptr %tmp4, ptr %ptr
13720   ret <2 x i32> %tmp3
13723 define <2 x i32> @test_v2i32_post_reg_ld1r(ptr %bar, ptr %ptr, i64 %inc) {
13724 ; SDAG-LABEL: test_v2i32_post_reg_ld1r:
13725 ; SDAG:       ; %bb.0:
13726 ; SDAG-NEXT:    lsl x8, x2, #2
13727 ; SDAG-NEXT:    ld1r.2s { v0 }, [x0], x8
13728 ; SDAG-NEXT:    str x0, [x1]
13729 ; SDAG-NEXT:    ret
13731 ; CHECK-GISEL-LABEL: test_v2i32_post_reg_ld1r:
13732 ; CHECK-GISEL:       ; %bb.0:
13733 ; CHECK-GISEL-NEXT:    ld1r.2s { v0 }, [x0]
13734 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
13735 ; CHECK-GISEL-NEXT:    str x8, [x1]
13736 ; CHECK-GISEL-NEXT:    ret
13737   %tmp1 = load i32, ptr %bar
13738   %tmp2 = insertelement <2 x i32> <i32 undef, i32 undef>, i32 %tmp1, i32 0
13739   %tmp3 = insertelement <2 x i32> %tmp2, i32 %tmp1, i32 1
13740   %tmp4 = getelementptr i32, ptr %bar, i64 %inc
13741   store ptr %tmp4, ptr %ptr
13742   ret <2 x i32> %tmp3
13745 define <2 x i64> @test_v2i64_post_imm_ld1r(ptr %bar, ptr %ptr) {
13746 ; SDAG-LABEL: test_v2i64_post_imm_ld1r:
13747 ; SDAG:       ; %bb.0:
13748 ; SDAG-NEXT:    ld1r.2d { v0 }, [x0], #8
13749 ; SDAG-NEXT:    str x0, [x1]
13750 ; SDAG-NEXT:    ret
13752 ; CHECK-GISEL-LABEL: test_v2i64_post_imm_ld1r:
13753 ; CHECK-GISEL:       ; %bb.0:
13754 ; CHECK-GISEL-NEXT:    ldr x8, [x0], #8
13755 ; CHECK-GISEL-NEXT:    str x0, [x1]
13756 ; CHECK-GISEL-NEXT:    dup.2d v0, x8
13757 ; CHECK-GISEL-NEXT:    ret
13758   %tmp1 = load i64, ptr %bar
13759   %tmp2 = insertelement <2 x i64> <i64 undef, i64 undef>, i64 %tmp1, i32 0
13760   %tmp3 = insertelement <2 x i64> %tmp2, i64 %tmp1, i32 1
13761   %tmp4 = getelementptr i64, ptr %bar, i64 1
13762   store ptr %tmp4, ptr %ptr
13763   ret <2 x i64> %tmp3
13766 define <2 x i64> @test_v2i64_post_reg_ld1r(ptr %bar, ptr %ptr, i64 %inc) {
13767 ; SDAG-LABEL: test_v2i64_post_reg_ld1r:
13768 ; SDAG:       ; %bb.0:
13769 ; SDAG-NEXT:    lsl x8, x2, #3
13770 ; SDAG-NEXT:    ld1r.2d { v0 }, [x0], x8
13771 ; SDAG-NEXT:    str x0, [x1]
13772 ; SDAG-NEXT:    ret
13774 ; CHECK-GISEL-LABEL: test_v2i64_post_reg_ld1r:
13775 ; CHECK-GISEL:       ; %bb.0:
13776 ; CHECK-GISEL-NEXT:    ld1r.2d { v0 }, [x0]
13777 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
13778 ; CHECK-GISEL-NEXT:    str x8, [x1]
13779 ; CHECK-GISEL-NEXT:    ret
13780   %tmp1 = load i64, ptr %bar
13781   %tmp2 = insertelement <2 x i64> <i64 undef, i64 undef>, i64 %tmp1, i32 0
13782   %tmp3 = insertelement <2 x i64> %tmp2, i64 %tmp1, i32 1
13783   %tmp4 = getelementptr i64, ptr %bar, i64 %inc
13784   store ptr %tmp4, ptr %ptr
13785   ret <2 x i64> %tmp3
13788 define <4 x float> @test_v4f32_post_imm_ld1r(ptr %bar, ptr %ptr) {
13789 ; SDAG-LABEL: test_v4f32_post_imm_ld1r:
13790 ; SDAG:       ; %bb.0:
13791 ; SDAG-NEXT:    ld1r.4s { v0 }, [x0], #4
13792 ; SDAG-NEXT:    str x0, [x1]
13793 ; SDAG-NEXT:    ret
13795 ; CHECK-GISEL-LABEL: test_v4f32_post_imm_ld1r:
13796 ; CHECK-GISEL:       ; %bb.0:
13797 ; CHECK-GISEL-NEXT:    ldr s0, [x0], #4
13798 ; CHECK-GISEL-NEXT:    str x0, [x1]
13799 ; CHECK-GISEL-NEXT:    dup.4s v0, v0[0]
13800 ; CHECK-GISEL-NEXT:    ret
13801   %tmp1 = load float, ptr %bar
13802   %tmp2 = insertelement <4 x float> <float undef, float undef, float undef, float undef>, float %tmp1, i32 0
13803   %tmp3 = insertelement <4 x float> %tmp2, float %tmp1, i32 1
13804   %tmp4 = insertelement <4 x float> %tmp3, float %tmp1, i32 2
13805   %tmp5 = insertelement <4 x float> %tmp4, float %tmp1, i32 3
13806   %tmp6 = getelementptr float, ptr %bar, i64 1
13807   store ptr %tmp6, ptr %ptr
13808   ret <4 x float> %tmp5
13811 define <4 x float> @test_v4f32_post_reg_ld1r(ptr %bar, ptr %ptr, i64 %inc) {
13812 ; SDAG-LABEL: test_v4f32_post_reg_ld1r:
13813 ; SDAG:       ; %bb.0:
13814 ; SDAG-NEXT:    lsl x8, x2, #2
13815 ; SDAG-NEXT:    ld1r.4s { v0 }, [x0], x8
13816 ; SDAG-NEXT:    str x0, [x1]
13817 ; SDAG-NEXT:    ret
13819 ; CHECK-GISEL-LABEL: test_v4f32_post_reg_ld1r:
13820 ; CHECK-GISEL:       ; %bb.0:
13821 ; CHECK-GISEL-NEXT:    ld1r.4s { v0 }, [x0]
13822 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
13823 ; CHECK-GISEL-NEXT:    str x8, [x1]
13824 ; CHECK-GISEL-NEXT:    ret
13825   %tmp1 = load float, ptr %bar
13826   %tmp2 = insertelement <4 x float> <float undef, float undef, float undef, float undef>, float %tmp1, i32 0
13827   %tmp3 = insertelement <4 x float> %tmp2, float %tmp1, i32 1
13828   %tmp4 = insertelement <4 x float> %tmp3, float %tmp1, i32 2
13829   %tmp5 = insertelement <4 x float> %tmp4, float %tmp1, i32 3
13830   %tmp6 = getelementptr float, ptr %bar, i64 %inc
13831   store ptr %tmp6, ptr %ptr
13832   ret <4 x float> %tmp5
13835 define <2 x float> @test_v2f32_post_imm_ld1r(ptr %bar, ptr %ptr) {
13836 ; SDAG-LABEL: test_v2f32_post_imm_ld1r:
13837 ; SDAG:       ; %bb.0:
13838 ; SDAG-NEXT:    ld1r.2s { v0 }, [x0], #4
13839 ; SDAG-NEXT:    str x0, [x1]
13840 ; SDAG-NEXT:    ret
13842 ; CHECK-GISEL-LABEL: test_v2f32_post_imm_ld1r:
13843 ; CHECK-GISEL:       ; %bb.0:
13844 ; CHECK-GISEL-NEXT:    ldr s0, [x0], #4
13845 ; CHECK-GISEL-NEXT:    str x0, [x1]
13846 ; CHECK-GISEL-NEXT:    dup.2s v0, v0[0]
13847 ; CHECK-GISEL-NEXT:    ret
13848   %tmp1 = load float, ptr %bar
13849   %tmp2 = insertelement <2 x float> <float undef, float undef>, float %tmp1, i32 0
13850   %tmp3 = insertelement <2 x float> %tmp2, float %tmp1, i32 1
13851   %tmp4 = getelementptr float, ptr %bar, i64 1
13852   store ptr %tmp4, ptr %ptr
13853   ret <2 x float> %tmp3
13856 define <2 x float> @test_v2f32_post_reg_ld1r(ptr %bar, ptr %ptr, i64 %inc) {
13857 ; SDAG-LABEL: test_v2f32_post_reg_ld1r:
13858 ; SDAG:       ; %bb.0:
13859 ; SDAG-NEXT:    lsl x8, x2, #2
13860 ; SDAG-NEXT:    ld1r.2s { v0 }, [x0], x8
13861 ; SDAG-NEXT:    str x0, [x1]
13862 ; SDAG-NEXT:    ret
13864 ; CHECK-GISEL-LABEL: test_v2f32_post_reg_ld1r:
13865 ; CHECK-GISEL:       ; %bb.0:
13866 ; CHECK-GISEL-NEXT:    ld1r.2s { v0 }, [x0]
13867 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
13868 ; CHECK-GISEL-NEXT:    str x8, [x1]
13869 ; CHECK-GISEL-NEXT:    ret
13870   %tmp1 = load float, ptr %bar
13871   %tmp2 = insertelement <2 x float> <float undef, float undef>, float %tmp1, i32 0
13872   %tmp3 = insertelement <2 x float> %tmp2, float %tmp1, i32 1
13873   %tmp4 = getelementptr float, ptr %bar, i64 %inc
13874   store ptr %tmp4, ptr %ptr
13875   ret <2 x float> %tmp3
13878 define <2 x double> @test_v2f64_post_imm_ld1r(ptr %bar, ptr %ptr) {
13879 ; SDAG-LABEL: test_v2f64_post_imm_ld1r:
13880 ; SDAG:       ; %bb.0:
13881 ; SDAG-NEXT:    ld1r.2d { v0 }, [x0], #8
13882 ; SDAG-NEXT:    str x0, [x1]
13883 ; SDAG-NEXT:    ret
13885 ; CHECK-GISEL-LABEL: test_v2f64_post_imm_ld1r:
13886 ; CHECK-GISEL:       ; %bb.0:
13887 ; CHECK-GISEL-NEXT:    ldr d0, [x0], #8
13888 ; CHECK-GISEL-NEXT:    str x0, [x1]
13889 ; CHECK-GISEL-NEXT:    dup.2d v0, v0[0]
13890 ; CHECK-GISEL-NEXT:    ret
13891   %tmp1 = load double, ptr %bar
13892   %tmp2 = insertelement <2 x double> <double undef, double undef>, double %tmp1, i32 0
13893   %tmp3 = insertelement <2 x double> %tmp2, double %tmp1, i32 1
13894   %tmp4 = getelementptr double, ptr %bar, i64 1
13895   store ptr %tmp4, ptr %ptr
13896   ret <2 x double> %tmp3
13899 define <2 x double> @test_v2f64_post_reg_ld1r(ptr %bar, ptr %ptr, i64 %inc) {
13900 ; SDAG-LABEL: test_v2f64_post_reg_ld1r:
13901 ; SDAG:       ; %bb.0:
13902 ; SDAG-NEXT:    lsl x8, x2, #3
13903 ; SDAG-NEXT:    ld1r.2d { v0 }, [x0], x8
13904 ; SDAG-NEXT:    str x0, [x1]
13905 ; SDAG-NEXT:    ret
13907 ; CHECK-GISEL-LABEL: test_v2f64_post_reg_ld1r:
13908 ; CHECK-GISEL:       ; %bb.0:
13909 ; CHECK-GISEL-NEXT:    ld1r.2d { v0 }, [x0]
13910 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
13911 ; CHECK-GISEL-NEXT:    str x8, [x1]
13912 ; CHECK-GISEL-NEXT:    ret
13913   %tmp1 = load double, ptr %bar
13914   %tmp2 = insertelement <2 x double> <double undef, double undef>, double %tmp1, i32 0
13915   %tmp3 = insertelement <2 x double> %tmp2, double %tmp1, i32 1
13916   %tmp4 = getelementptr double, ptr %bar, i64 %inc
13917   store ptr %tmp4, ptr %ptr
13918   ret <2 x double> %tmp3
13921 define <16 x i8> @test_v16i8_post_imm_ld1lane(ptr %bar, ptr %ptr, <16 x i8> %A) {
13922 ; SDAG-LABEL: test_v16i8_post_imm_ld1lane:
13923 ; SDAG:       ; %bb.0:
13924 ; SDAG-NEXT:    ld1.b { v0 }[1], [x0], #1
13925 ; SDAG-NEXT:    str x0, [x1]
13926 ; SDAG-NEXT:    ret
13928 ; CHECK-GISEL-LABEL: test_v16i8_post_imm_ld1lane:
13929 ; CHECK-GISEL:       ; %bb.0:
13930 ; CHECK-GISEL-NEXT:    ldrb w8, [x0], #1
13931 ; CHECK-GISEL-NEXT:    str x0, [x1]
13932 ; CHECK-GISEL-NEXT:    mov.b v0[1], w8
13933 ; CHECK-GISEL-NEXT:    ret
13934   %tmp1 = load i8, ptr %bar
13935   %tmp2 = insertelement <16 x i8> %A, i8 %tmp1, i32 1
13936   %tmp3 = getelementptr i8, ptr %bar, i64 1
13937   store ptr %tmp3, ptr %ptr
13938   ret <16 x i8> %tmp2
13941 define <16 x i8> @test_v16i8_post_reg_ld1lane(ptr %bar, ptr %ptr, i64 %inc, <16 x i8> %A) {
13942 ; SDAG-LABEL: test_v16i8_post_reg_ld1lane:
13943 ; SDAG:       ; %bb.0:
13944 ; SDAG-NEXT:    ld1.b { v0 }[1], [x0], x2
13945 ; SDAG-NEXT:    str x0, [x1]
13946 ; SDAG-NEXT:    ret
13948 ; CHECK-GISEL-LABEL: test_v16i8_post_reg_ld1lane:
13949 ; CHECK-GISEL:       ; %bb.0:
13950 ; CHECK-GISEL-NEXT:    ldr b1, [x0]
13951 ; CHECK-GISEL-NEXT:    add x8, x0, x2
13952 ; CHECK-GISEL-NEXT:    str x8, [x1]
13953 ; CHECK-GISEL-NEXT:    mov.b v0[1], v1[0]
13954 ; CHECK-GISEL-NEXT:    ret
13955   %tmp1 = load i8, ptr %bar
13956   %tmp2 = insertelement <16 x i8> %A, i8 %tmp1, i32 1
13957   %tmp3 = getelementptr i8, ptr %bar, i64 %inc
13958   store ptr %tmp3, ptr %ptr
13959   ret <16 x i8> %tmp2
13962 define <8 x i8> @test_v8i8_post_imm_ld1lane(ptr %bar, ptr %ptr, <8 x i8> %A) {
13963 ; SDAG-LABEL: test_v8i8_post_imm_ld1lane:
13964 ; SDAG:       ; %bb.0:
13965 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 def $q0
13966 ; SDAG-NEXT:    ld1.b { v0 }[1], [x0], #1
13967 ; SDAG-NEXT:    str x0, [x1]
13968 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0
13969 ; SDAG-NEXT:    ret
13971 ; CHECK-GISEL-LABEL: test_v8i8_post_imm_ld1lane:
13972 ; CHECK-GISEL:       ; %bb.0:
13973 ; CHECK-GISEL-NEXT:    ldrb w8, [x0], #1
13974 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 def $q0
13975 ; CHECK-GISEL-NEXT:    str x0, [x1]
13976 ; CHECK-GISEL-NEXT:    mov.b v0[1], w8
13977 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0
13978 ; CHECK-GISEL-NEXT:    ret
13979   %tmp1 = load i8, ptr %bar
13980   %tmp2 = insertelement <8 x i8> %A, i8 %tmp1, i32 1
13981   %tmp3 = getelementptr i8, ptr %bar, i64 1
13982   store ptr %tmp3, ptr %ptr
13983   ret <8 x i8> %tmp2
13986 define <8 x i8> @test_v8i8_post_reg_ld1lane(ptr %bar, ptr %ptr, i64 %inc, <8 x i8> %A) {
13987 ; SDAG-LABEL: test_v8i8_post_reg_ld1lane:
13988 ; SDAG:       ; %bb.0:
13989 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 def $q0
13990 ; SDAG-NEXT:    ld1.b { v0 }[1], [x0], x2
13991 ; SDAG-NEXT:    str x0, [x1]
13992 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0
13993 ; SDAG-NEXT:    ret
13995 ; CHECK-GISEL-LABEL: test_v8i8_post_reg_ld1lane:
13996 ; CHECK-GISEL:       ; %bb.0:
13997 ; CHECK-GISEL-NEXT:    ldr b1, [x0]
13998 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 def $q0
13999 ; CHECK-GISEL-NEXT:    add x8, x0, x2
14000 ; CHECK-GISEL-NEXT:    str x8, [x1]
14001 ; CHECK-GISEL-NEXT:    mov.b v0[1], v1[0]
14002 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0
14003 ; CHECK-GISEL-NEXT:    ret
14004   %tmp1 = load i8, ptr %bar
14005   %tmp2 = insertelement <8 x i8> %A, i8 %tmp1, i32 1
14006   %tmp3 = getelementptr i8, ptr %bar, i64 %inc
14007   store ptr %tmp3, ptr %ptr
14008   ret <8 x i8> %tmp2
14011 define <8 x i16> @test_v8i16_post_imm_ld1lane(ptr %bar, ptr %ptr, <8 x i16> %A) {
14012 ; SDAG-LABEL: test_v8i16_post_imm_ld1lane:
14013 ; SDAG:       ; %bb.0:
14014 ; SDAG-NEXT:    ld1.h { v0 }[1], [x0], #2
14015 ; SDAG-NEXT:    str x0, [x1]
14016 ; SDAG-NEXT:    ret
14018 ; CHECK-GISEL-LABEL: test_v8i16_post_imm_ld1lane:
14019 ; CHECK-GISEL:       ; %bb.0:
14020 ; CHECK-GISEL-NEXT:    ldrh w8, [x0], #2
14021 ; CHECK-GISEL-NEXT:    str x0, [x1]
14022 ; CHECK-GISEL-NEXT:    mov.h v0[1], w8
14023 ; CHECK-GISEL-NEXT:    ret
14024   %tmp1 = load i16, ptr %bar
14025   %tmp2 = insertelement <8 x i16> %A, i16 %tmp1, i32 1
14026   %tmp3 = getelementptr i16, ptr %bar, i64 1
14027   store ptr %tmp3, ptr %ptr
14028   ret <8 x i16> %tmp2
14031 define <8 x i16> @test_v8i16_post_reg_ld1lane(ptr %bar, ptr %ptr, i64 %inc, <8 x i16> %A) {
14032 ; SDAG-LABEL: test_v8i16_post_reg_ld1lane:
14033 ; SDAG:       ; %bb.0:
14034 ; SDAG-NEXT:    lsl x8, x2, #1
14035 ; SDAG-NEXT:    ld1.h { v0 }[1], [x0], x8
14036 ; SDAG-NEXT:    str x0, [x1]
14037 ; SDAG-NEXT:    ret
14039 ; CHECK-GISEL-LABEL: test_v8i16_post_reg_ld1lane:
14040 ; CHECK-GISEL:       ; %bb.0:
14041 ; CHECK-GISEL-NEXT:    ldr h1, [x0]
14042 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #1
14043 ; CHECK-GISEL-NEXT:    mov.h v0[1], v1[0]
14044 ; CHECK-GISEL-NEXT:    str x8, [x1]
14045 ; CHECK-GISEL-NEXT:    ret
14046   %tmp1 = load i16, ptr %bar
14047   %tmp2 = insertelement <8 x i16> %A, i16 %tmp1, i32 1
14048   %tmp3 = getelementptr i16, ptr %bar, i64 %inc
14049   store ptr %tmp3, ptr %ptr
14050   ret <8 x i16> %tmp2
14053 define <4 x i16> @test_v4i16_post_imm_ld1lane(ptr %bar, ptr %ptr, <4 x i16> %A) {
14054 ; SDAG-LABEL: test_v4i16_post_imm_ld1lane:
14055 ; SDAG:       ; %bb.0:
14056 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 def $q0
14057 ; SDAG-NEXT:    ld1.h { v0 }[1], [x0], #2
14058 ; SDAG-NEXT:    str x0, [x1]
14059 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0
14060 ; SDAG-NEXT:    ret
14062 ; CHECK-GISEL-LABEL: test_v4i16_post_imm_ld1lane:
14063 ; CHECK-GISEL:       ; %bb.0:
14064 ; CHECK-GISEL-NEXT:    ldrh w8, [x0], #2
14065 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 def $q0
14066 ; CHECK-GISEL-NEXT:    str x0, [x1]
14067 ; CHECK-GISEL-NEXT:    mov.h v0[1], w8
14068 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0
14069 ; CHECK-GISEL-NEXT:    ret
14070   %tmp1 = load i16, ptr %bar
14071   %tmp2 = insertelement <4 x i16> %A, i16 %tmp1, i32 1
14072   %tmp3 = getelementptr i16, ptr %bar, i64 1
14073   store ptr %tmp3, ptr %ptr
14074   ret <4 x i16> %tmp2
14077 define <4 x i16> @test_v4i16_post_reg_ld1lane(ptr %bar, ptr %ptr, i64 %inc, <4 x i16> %A) {
14078 ; SDAG-LABEL: test_v4i16_post_reg_ld1lane:
14079 ; SDAG:       ; %bb.0:
14080 ; SDAG-NEXT:    lsl x8, x2, #1
14081 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 def $q0
14082 ; SDAG-NEXT:    ld1.h { v0 }[1], [x0], x8
14083 ; SDAG-NEXT:    str x0, [x1]
14084 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0
14085 ; SDAG-NEXT:    ret
14087 ; CHECK-GISEL-LABEL: test_v4i16_post_reg_ld1lane:
14088 ; CHECK-GISEL:       ; %bb.0:
14089 ; CHECK-GISEL-NEXT:    ldr h1, [x0]
14090 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 def $q0
14091 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #1
14092 ; CHECK-GISEL-NEXT:    mov.h v0[1], v1[0]
14093 ; CHECK-GISEL-NEXT:    str x8, [x1]
14094 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0
14095 ; CHECK-GISEL-NEXT:    ret
14096   %tmp1 = load i16, ptr %bar
14097   %tmp2 = insertelement <4 x i16> %A, i16 %tmp1, i32 1
14098   %tmp3 = getelementptr i16, ptr %bar, i64 %inc
14099   store ptr %tmp3, ptr %ptr
14100   ret <4 x i16> %tmp2
14103 define <4 x i32> @test_v4i32_post_imm_ld1lane(ptr %bar, ptr %ptr, <4 x i32> %A) {
14104 ; SDAG-LABEL: test_v4i32_post_imm_ld1lane:
14105 ; SDAG:       ; %bb.0:
14106 ; SDAG-NEXT:    ld1.s { v0 }[1], [x0], #4
14107 ; SDAG-NEXT:    str x0, [x1]
14108 ; SDAG-NEXT:    ret
14110 ; CHECK-GISEL-LABEL: test_v4i32_post_imm_ld1lane:
14111 ; CHECK-GISEL:       ; %bb.0:
14112 ; CHECK-GISEL-NEXT:    ldr w8, [x0], #4
14113 ; CHECK-GISEL-NEXT:    str x0, [x1]
14114 ; CHECK-GISEL-NEXT:    mov.s v0[1], w8
14115 ; CHECK-GISEL-NEXT:    ret
14116   %tmp1 = load i32, ptr %bar
14117   %tmp2 = insertelement <4 x i32> %A, i32 %tmp1, i32 1
14118   %tmp3 = getelementptr i32, ptr %bar, i64 1
14119   store ptr %tmp3, ptr %ptr
14120   ret <4 x i32> %tmp2
14123 define <4 x i32> @test_v4i32_post_reg_ld1lane(ptr %bar, ptr %ptr, i64 %inc, <4 x i32> %A) {
14124 ; SDAG-LABEL: test_v4i32_post_reg_ld1lane:
14125 ; SDAG:       ; %bb.0:
14126 ; SDAG-NEXT:    lsl x8, x2, #2
14127 ; SDAG-NEXT:    ld1.s { v0 }[1], [x0], x8
14128 ; SDAG-NEXT:    str x0, [x1]
14129 ; SDAG-NEXT:    ret
14131 ; CHECK-GISEL-LABEL: test_v4i32_post_reg_ld1lane:
14132 ; CHECK-GISEL:       ; %bb.0:
14133 ; CHECK-GISEL-NEXT:    ldr s1, [x0]
14134 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
14135 ; CHECK-GISEL-NEXT:    mov.s v0[1], v1[0]
14136 ; CHECK-GISEL-NEXT:    str x8, [x1]
14137 ; CHECK-GISEL-NEXT:    ret
14138   %tmp1 = load i32, ptr %bar
14139   %tmp2 = insertelement <4 x i32> %A, i32 %tmp1, i32 1
14140   %tmp3 = getelementptr i32, ptr %bar, i64 %inc
14141   store ptr %tmp3, ptr %ptr
14142   ret <4 x i32> %tmp2
14145 define <2 x i32> @test_v2i32_post_imm_ld1lane(ptr %bar, ptr %ptr, <2 x i32> %A) {
14146 ; SDAG-LABEL: test_v2i32_post_imm_ld1lane:
14147 ; SDAG:       ; %bb.0:
14148 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 def $q0
14149 ; SDAG-NEXT:    ld1.s { v0 }[1], [x0], #4
14150 ; SDAG-NEXT:    str x0, [x1]
14151 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0
14152 ; SDAG-NEXT:    ret
14154 ; CHECK-GISEL-LABEL: test_v2i32_post_imm_ld1lane:
14155 ; CHECK-GISEL:       ; %bb.0:
14156 ; CHECK-GISEL-NEXT:    ldr w8, [x0], #4
14157 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 def $q0
14158 ; CHECK-GISEL-NEXT:    str x0, [x1]
14159 ; CHECK-GISEL-NEXT:    mov.s v0[1], w8
14160 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0
14161 ; CHECK-GISEL-NEXT:    ret
14162   %tmp1 = load i32, ptr %bar
14163   %tmp2 = insertelement <2 x i32> %A, i32 %tmp1, i32 1
14164   %tmp3 = getelementptr i32, ptr %bar, i64 1
14165   store ptr %tmp3, ptr %ptr
14166   ret <2 x i32> %tmp2
14169 define <2 x i32> @test_v2i32_post_reg_ld1lane(ptr %bar, ptr %ptr, i64 %inc, <2 x i32> %A) {
14170 ; SDAG-LABEL: test_v2i32_post_reg_ld1lane:
14171 ; SDAG:       ; %bb.0:
14172 ; SDAG-NEXT:    lsl x8, x2, #2
14173 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 def $q0
14174 ; SDAG-NEXT:    ld1.s { v0 }[1], [x0], x8
14175 ; SDAG-NEXT:    str x0, [x1]
14176 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0
14177 ; SDAG-NEXT:    ret
14179 ; CHECK-GISEL-LABEL: test_v2i32_post_reg_ld1lane:
14180 ; CHECK-GISEL:       ; %bb.0:
14181 ; CHECK-GISEL-NEXT:    ldr s1, [x0]
14182 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 def $q0
14183 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
14184 ; CHECK-GISEL-NEXT:    mov.s v0[1], v1[0]
14185 ; CHECK-GISEL-NEXT:    str x8, [x1]
14186 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0
14187 ; CHECK-GISEL-NEXT:    ret
14188   %tmp1 = load i32, ptr %bar
14189   %tmp2 = insertelement <2 x i32> %A, i32 %tmp1, i32 1
14190   %tmp3 = getelementptr i32, ptr %bar, i64 %inc
14191   store ptr %tmp3, ptr %ptr
14192   ret <2 x i32> %tmp2
14195 define <2 x i64> @test_v2i64_post_imm_ld1lane(ptr %bar, ptr %ptr, <2 x i64> %A) {
14196 ; SDAG-LABEL: test_v2i64_post_imm_ld1lane:
14197 ; SDAG:       ; %bb.0:
14198 ; SDAG-NEXT:    ld1.d { v0 }[1], [x0], #8
14199 ; SDAG-NEXT:    str x0, [x1]
14200 ; SDAG-NEXT:    ret
14202 ; CHECK-GISEL-LABEL: test_v2i64_post_imm_ld1lane:
14203 ; CHECK-GISEL:       ; %bb.0:
14204 ; CHECK-GISEL-NEXT:    ldr x8, [x0], #8
14205 ; CHECK-GISEL-NEXT:    str x0, [x1]
14206 ; CHECK-GISEL-NEXT:    mov.d v0[1], x8
14207 ; CHECK-GISEL-NEXT:    ret
14208   %tmp1 = load i64, ptr %bar
14209   %tmp2 = insertelement <2 x i64> %A, i64 %tmp1, i32 1
14210   %tmp3 = getelementptr i64, ptr %bar, i64 1
14211   store ptr %tmp3, ptr %ptr
14212   ret <2 x i64> %tmp2
14215 define <2 x i64> @test_v2i64_post_reg_ld1lane(ptr %bar, ptr %ptr, i64 %inc, <2 x i64> %A) {
14216 ; SDAG-LABEL: test_v2i64_post_reg_ld1lane:
14217 ; SDAG:       ; %bb.0:
14218 ; SDAG-NEXT:    lsl x8, x2, #3
14219 ; SDAG-NEXT:    ld1.d { v0 }[1], [x0], x8
14220 ; SDAG-NEXT:    str x0, [x1]
14221 ; SDAG-NEXT:    ret
14223 ; CHECK-GISEL-LABEL: test_v2i64_post_reg_ld1lane:
14224 ; CHECK-GISEL:       ; %bb.0:
14225 ; CHECK-GISEL-NEXT:    ldr d1, [x0]
14226 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
14227 ; CHECK-GISEL-NEXT:    mov.d v0[1], v1[0]
14228 ; CHECK-GISEL-NEXT:    str x8, [x1]
14229 ; CHECK-GISEL-NEXT:    ret
14230   %tmp1 = load i64, ptr %bar
14231   %tmp2 = insertelement <2 x i64> %A, i64 %tmp1, i32 1
14232   %tmp3 = getelementptr i64, ptr %bar, i64 %inc
14233   store ptr %tmp3, ptr %ptr
14234   ret <2 x i64> %tmp2
14237 define <4 x float> @test_v4f32_post_imm_ld1lane(ptr %bar, ptr %ptr, <4 x float> %A) {
14238 ; SDAG-LABEL: test_v4f32_post_imm_ld1lane:
14239 ; SDAG:       ; %bb.0:
14240 ; SDAG-NEXT:    ld1.s { v0 }[1], [x0], #4
14241 ; SDAG-NEXT:    str x0, [x1]
14242 ; SDAG-NEXT:    ret
14244 ; CHECK-GISEL-LABEL: test_v4f32_post_imm_ld1lane:
14245 ; CHECK-GISEL:       ; %bb.0:
14246 ; CHECK-GISEL-NEXT:    ldr s1, [x0], #4
14247 ; CHECK-GISEL-NEXT:    str x0, [x1]
14248 ; CHECK-GISEL-NEXT:    mov.s v0[1], v1[0]
14249 ; CHECK-GISEL-NEXT:    ret
14250   %tmp1 = load float, ptr %bar
14251   %tmp2 = insertelement <4 x float> %A, float %tmp1, i32 1
14252   %tmp3 = getelementptr float, ptr %bar, i64 1
14253   store ptr %tmp3, ptr %ptr
14254   ret <4 x float> %tmp2
14257 define <4 x float> @test_v4f32_post_reg_ld1lane(ptr %bar, ptr %ptr, i64 %inc, <4 x float> %A) {
14258 ; SDAG-LABEL: test_v4f32_post_reg_ld1lane:
14259 ; SDAG:       ; %bb.0:
14260 ; SDAG-NEXT:    lsl x8, x2, #2
14261 ; SDAG-NEXT:    ld1.s { v0 }[1], [x0], x8
14262 ; SDAG-NEXT:    str x0, [x1]
14263 ; SDAG-NEXT:    ret
14265 ; CHECK-GISEL-LABEL: test_v4f32_post_reg_ld1lane:
14266 ; CHECK-GISEL:       ; %bb.0:
14267 ; CHECK-GISEL-NEXT:    ldr s1, [x0]
14268 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
14269 ; CHECK-GISEL-NEXT:    mov.s v0[1], v1[0]
14270 ; CHECK-GISEL-NEXT:    str x8, [x1]
14271 ; CHECK-GISEL-NEXT:    ret
14272   %tmp1 = load float, ptr %bar
14273   %tmp2 = insertelement <4 x float> %A, float %tmp1, i32 1
14274   %tmp3 = getelementptr float, ptr %bar, i64 %inc
14275   store ptr %tmp3, ptr %ptr
14276   ret <4 x float> %tmp2
14279 define <2 x float> @test_v2f32_post_imm_ld1lane(ptr %bar, ptr %ptr, <2 x float> %A) {
14280 ; SDAG-LABEL: test_v2f32_post_imm_ld1lane:
14281 ; SDAG:       ; %bb.0:
14282 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 def $q0
14283 ; SDAG-NEXT:    ld1.s { v0 }[1], [x0], #4
14284 ; SDAG-NEXT:    str x0, [x1]
14285 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0
14286 ; SDAG-NEXT:    ret
14288 ; CHECK-GISEL-LABEL: test_v2f32_post_imm_ld1lane:
14289 ; CHECK-GISEL:       ; %bb.0:
14290 ; CHECK-GISEL-NEXT:    ldr s1, [x0], #4
14291 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 def $q0
14292 ; CHECK-GISEL-NEXT:    str x0, [x1]
14293 ; CHECK-GISEL-NEXT:    mov.s v0[1], v1[0]
14294 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0
14295 ; CHECK-GISEL-NEXT:    ret
14296   %tmp1 = load float, ptr %bar
14297   %tmp2 = insertelement <2 x float> %A, float %tmp1, i32 1
14298   %tmp3 = getelementptr float, ptr %bar, i64 1
14299   store ptr %tmp3, ptr %ptr
14300   ret <2 x float> %tmp2
14303 define <2 x float> @test_v2f32_post_reg_ld1lane(ptr %bar, ptr %ptr, i64 %inc, <2 x float> %A) {
14304 ; SDAG-LABEL: test_v2f32_post_reg_ld1lane:
14305 ; SDAG:       ; %bb.0:
14306 ; SDAG-NEXT:    lsl x8, x2, #2
14307 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 def $q0
14308 ; SDAG-NEXT:    ld1.s { v0 }[1], [x0], x8
14309 ; SDAG-NEXT:    str x0, [x1]
14310 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0
14311 ; SDAG-NEXT:    ret
14313 ; CHECK-GISEL-LABEL: test_v2f32_post_reg_ld1lane:
14314 ; CHECK-GISEL:       ; %bb.0:
14315 ; CHECK-GISEL-NEXT:    ldr s1, [x0]
14316 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 def $q0
14317 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #2
14318 ; CHECK-GISEL-NEXT:    mov.s v0[1], v1[0]
14319 ; CHECK-GISEL-NEXT:    str x8, [x1]
14320 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0
14321 ; CHECK-GISEL-NEXT:    ret
14322   %tmp1 = load float, ptr %bar
14323   %tmp2 = insertelement <2 x float> %A, float %tmp1, i32 1
14324   %tmp3 = getelementptr float, ptr %bar, i64 %inc
14325   store ptr %tmp3, ptr %ptr
14326   ret <2 x float> %tmp2
14329 define <2 x double> @test_v2f64_post_imm_ld1lane(ptr %bar, ptr %ptr, <2 x double> %A) {
14330 ; SDAG-LABEL: test_v2f64_post_imm_ld1lane:
14331 ; SDAG:       ; %bb.0:
14332 ; SDAG-NEXT:    ld1.d { v0 }[1], [x0], #8
14333 ; SDAG-NEXT:    str x0, [x1]
14334 ; SDAG-NEXT:    ret
14336 ; CHECK-GISEL-LABEL: test_v2f64_post_imm_ld1lane:
14337 ; CHECK-GISEL:       ; %bb.0:
14338 ; CHECK-GISEL-NEXT:    ldr d1, [x0], #8
14339 ; CHECK-GISEL-NEXT:    str x0, [x1]
14340 ; CHECK-GISEL-NEXT:    mov.d v0[1], v1[0]
14341 ; CHECK-GISEL-NEXT:    ret
14342   %tmp1 = load double, ptr %bar
14343   %tmp2 = insertelement <2 x double> %A, double %tmp1, i32 1
14344   %tmp3 = getelementptr double, ptr %bar, i64 1
14345   store ptr %tmp3, ptr %ptr
14346   ret <2 x double> %tmp2
14349 define <2 x double> @test_v2f64_post_reg_ld1lane(ptr %bar, ptr %ptr, i64 %inc, <2 x double> %A) {
14350 ; SDAG-LABEL: test_v2f64_post_reg_ld1lane:
14351 ; SDAG:       ; %bb.0:
14352 ; SDAG-NEXT:    lsl x8, x2, #3
14353 ; SDAG-NEXT:    ld1.d { v0 }[1], [x0], x8
14354 ; SDAG-NEXT:    str x0, [x1]
14355 ; SDAG-NEXT:    ret
14357 ; CHECK-GISEL-LABEL: test_v2f64_post_reg_ld1lane:
14358 ; CHECK-GISEL:       ; %bb.0:
14359 ; CHECK-GISEL-NEXT:    ldr d1, [x0]
14360 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #3
14361 ; CHECK-GISEL-NEXT:    mov.d v0[1], v1[0]
14362 ; CHECK-GISEL-NEXT:    str x8, [x1]
14363 ; CHECK-GISEL-NEXT:    ret
14364   %tmp1 = load double, ptr %bar
14365   %tmp2 = insertelement <2 x double> %A, double %tmp1, i32 1
14366   %tmp3 = getelementptr double, ptr %bar, i64 %inc
14367   store ptr %tmp3, ptr %ptr
14368   ret <2 x double> %tmp2
14371 ; Check for dependencies between the vector and the scalar load.
14372 define <4 x float> @test_v4f32_post_reg_ld1lane_dep_vec_on_load(ptr %bar, ptr %ptr, i64 %inc, ptr %dep_ptr_1, ptr %dep_ptr_2, <4 x float> %vec) {
14373 ; CHECK-LABEL: test_v4f32_post_reg_ld1lane_dep_vec_on_load:
14374 ; CHECK:       ; %bb.0:
14375 ; CHECK-NEXT:    ldr s1, [x0]
14376 ; CHECK-NEXT:    str q0, [x3]
14377 ; CHECK-NEXT:    add x8, x0, x2, lsl #2
14378 ; CHECK-NEXT:    ldr q0, [x4]
14379 ; CHECK-NEXT:    str x8, [x1]
14380 ; CHECK-NEXT:    mov.s v0[1], v1[0]
14381 ; CHECK-NEXT:    ret
14382   %tmp1 = load float, ptr %bar
14383   store <4 x float> %vec, ptr %dep_ptr_1, align 16
14384   %A = load <4 x float>, ptr %dep_ptr_2, align 16
14385   %tmp2 = insertelement <4 x float> %A, float %tmp1, i32 1
14386   %tmp3 = getelementptr float, ptr %bar, i64 %inc
14387   store ptr %tmp3, ptr %ptr
14388   ret <4 x float> %tmp2
14391 ; Make sure that we test the narrow V64 code path.
14392 ; The tests above don't, because there, 64-bit insert_vector_elt nodes will be
14393 ; widened to 128-bit before the LD1LANEpost combine has the chance to run,
14394 ; making it avoid narrow vector types.
14395 ; One way to trick that combine into running early is to force the vector ops
14396 ; legalizer to run.  We achieve that using the ctpop.
14397 ; PR23265
14398 define <4 x i16> @test_v4i16_post_reg_ld1lane_forced_narrow(ptr %bar, ptr %ptr, i64 %inc, <4 x i16> %A, ptr %d) {
14399 ; SDAG-LABEL: test_v4i16_post_reg_ld1lane_forced_narrow:
14400 ; SDAG:       ; %bb.0:
14401 ; SDAG-NEXT:    lsl x8, x2, #1
14402 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 def $q0
14403 ; SDAG-NEXT:    ld1.h { v0 }[1], [x0], x8
14404 ; SDAG-NEXT:    str x0, [x1]
14405 ; SDAG-NEXT:    ldr d1, [x3]
14406 ; SDAG-NEXT:    ; kill: def $d0 killed $d0 killed $q0
14407 ; SDAG-NEXT:    cnt.8b v1, v1
14408 ; SDAG-NEXT:    uaddlp.4h v1, v1
14409 ; SDAG-NEXT:    uaddlp.2s v1, v1
14410 ; SDAG-NEXT:    str d1, [x3]
14411 ; SDAG-NEXT:    ret
14413 ; CHECK-GISEL-LABEL: test_v4i16_post_reg_ld1lane_forced_narrow:
14414 ; CHECK-GISEL:       ; %bb.0:
14415 ; CHECK-GISEL-NEXT:    add x8, x0, x2, lsl #1
14416 ; CHECK-GISEL-NEXT:    ldr h1, [x0]
14417 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 def $q0
14418 ; CHECK-GISEL-NEXT:    str x8, [x1]
14419 ; CHECK-GISEL-NEXT:    mov.h v0[1], v1[0]
14420 ; CHECK-GISEL-NEXT:    ldr d2, [x3]
14421 ; CHECK-GISEL-NEXT:    ; kill: def $d0 killed $d0 killed $q0
14422 ; CHECK-GISEL-NEXT:    cnt.8b v2, v2
14423 ; CHECK-GISEL-NEXT:    uaddlp.4h v2, v2
14424 ; CHECK-GISEL-NEXT:    uaddlp.2s v1, v2
14425 ; CHECK-GISEL-NEXT:    str d1, [x3]
14426 ; CHECK-GISEL-NEXT:    ret
14427   %tmp1 = load i16, ptr %bar
14428   %tmp2 = insertelement <4 x i16> %A, i16 %tmp1, i32 1
14429   %tmp3 = getelementptr i16, ptr %bar, i64 %inc
14430   store ptr %tmp3, ptr %ptr
14431   %dl =  load <2 x i32>,  ptr %d
14432   %dr = call <2 x i32> @llvm.ctpop.v2i32(<2 x i32> %dl)
14433   store <2 x i32> %dr, ptr %d
14434   ret <4 x i16> %tmp2
14437 declare <2 x i32> @llvm.ctpop.v2i32(<2 x i32>)
14439 define void @test_ld1lane_build(ptr %ptr0, ptr %ptr1, ptr %ptr2, ptr %ptr3, ptr %out) {
14440 ; SDAG-LABEL: test_ld1lane_build:
14441 ; SDAG:       ; %bb.0:
14442 ; SDAG-NEXT:    ldr s0, [x2]
14443 ; SDAG-NEXT:    ldr s1, [x0]
14444 ; SDAG-NEXT:    ld1.s { v0 }[1], [x3]
14445 ; SDAG-NEXT:    ld1.s { v1 }[1], [x1]
14446 ; SDAG-NEXT:    sub.2s v0, v1, v0
14447 ; SDAG-NEXT:    str d0, [x4]
14448 ; SDAG-NEXT:    ret
14450 ; CHECK-GISEL-LABEL: test_ld1lane_build:
14451 ; CHECK-GISEL:       ; %bb.0:
14452 ; CHECK-GISEL-NEXT:    ldr s0, [x0]
14453 ; CHECK-GISEL-NEXT:    ldr s1, [x1]
14454 ; CHECK-GISEL-NEXT:    ldr s2, [x2]
14455 ; CHECK-GISEL-NEXT:    ldr s3, [x3]
14456 ; CHECK-GISEL-NEXT:    mov.s v0[1], v1[0]
14457 ; CHECK-GISEL-NEXT:    mov.s v2[1], v3[0]
14458 ; CHECK-GISEL-NEXT:    sub.2s v0, v0, v2
14459 ; CHECK-GISEL-NEXT:    str d0, [x4]
14460 ; CHECK-GISEL-NEXT:    ret
14461   %load0 = load i32, ptr %ptr0, align 4
14462   %load1 = load i32, ptr %ptr1, align 4
14463   %vec0_0 = insertelement <2 x i32> undef, i32 %load0, i32 0
14464   %vec0_1 = insertelement <2 x i32> %vec0_0, i32 %load1, i32 1
14466   %load2 = load i32, ptr %ptr2, align 4
14467   %load3 = load i32, ptr %ptr3, align 4
14468   %vec1_0 = insertelement <2 x i32> undef, i32 %load2, i32 0
14469   %vec1_1 = insertelement <2 x i32> %vec1_0, i32 %load3, i32 1
14471   %sub = sub nsw <2 x i32> %vec0_1, %vec1_1
14472   store <2 x i32> %sub, ptr %out, align 16
14473   ret void
14476 define void  @test_ld1lane_build_i16(ptr %a, ptr %b, ptr %c, ptr %d, <4 x i16> %e, ptr %p) {
14477 ; SDAG-LABEL: test_ld1lane_build_i16:
14478 ; SDAG:       ; %bb.0:
14479 ; SDAG-NEXT:    ldr h1, [x0]
14480 ; SDAG-NEXT:    ld1.h { v1 }[1], [x1]
14481 ; SDAG-NEXT:    ld1.h { v1 }[2], [x2]
14482 ; SDAG-NEXT:    ld1.h { v1 }[3], [x3]
14483 ; SDAG-NEXT:    sub.4h v0, v1, v0
14484 ; SDAG-NEXT:    str d0, [x4]
14485 ; SDAG-NEXT:    ret
14487 ; CHECK-GISEL-LABEL: test_ld1lane_build_i16:
14488 ; CHECK-GISEL:       ; %bb.0:
14489 ; CHECK-GISEL-NEXT:    ldr h1, [x0]
14490 ; CHECK-GISEL-NEXT:    ldr h2, [x1]
14491 ; CHECK-GISEL-NEXT:    mov.h v1[1], v2[0]
14492 ; CHECK-GISEL-NEXT:    ldr h2, [x2]
14493 ; CHECK-GISEL-NEXT:    mov.h v1[2], v2[0]
14494 ; CHECK-GISEL-NEXT:    ldr h2, [x3]
14495 ; CHECK-GISEL-NEXT:    mov.h v1[3], v2[0]
14496 ; CHECK-GISEL-NEXT:    sub.4h v0, v1, v0
14497 ; CHECK-GISEL-NEXT:    str d0, [x4]
14498 ; CHECK-GISEL-NEXT:    ret
14499   %ld.a = load i16, ptr %a
14500   %ld.b = load i16, ptr %b
14501   %ld.c = load i16, ptr %c
14502   %ld.d = load i16, ptr %d
14503   %v.a = insertelement <4 x i16> undef, i16 %ld.a, i64 0
14504   %v.b = insertelement <4 x i16> %v.a, i16 %ld.b, i64 1
14505   %v.c = insertelement <4 x i16> %v.b, i16 %ld.c, i64 2
14506   %v = insertelement <4 x i16> %v.c, i16 %ld.d, i64 3
14507   %sub = sub nsw <4 x i16> %v, %e
14508   store <4 x i16> %sub, ptr %p
14509   ret void
14512 define void  @test_ld1lane_build_half(ptr %a, ptr %b, ptr %c, ptr %d, <4 x half> %e, ptr %p) {
14513 ; SDAG-LABEL: test_ld1lane_build_half:
14514 ; SDAG:       ; %bb.0:
14515 ; SDAG-NEXT:    ldr h1, [x0]
14516 ; SDAG-NEXT:    fcvtl v0.4s, v0.4h
14517 ; SDAG-NEXT:    ld1.h { v1 }[1], [x1]
14518 ; SDAG-NEXT:    ld1.h { v1 }[2], [x2]
14519 ; SDAG-NEXT:    ld1.h { v1 }[3], [x3]
14520 ; SDAG-NEXT:    fcvtl v1.4s, v1.4h
14521 ; SDAG-NEXT:    fsub.4s v0, v1, v0
14522 ; SDAG-NEXT:    fcvtn v0.4h, v0.4s
14523 ; SDAG-NEXT:    str d0, [x4]
14524 ; SDAG-NEXT:    ret
14526 ; CHECK-GISEL-LABEL: test_ld1lane_build_half:
14527 ; CHECK-GISEL:       ; %bb.0:
14528 ; CHECK-GISEL-NEXT:    ldr h1, [x0]
14529 ; CHECK-GISEL-NEXT:    ldr h2, [x1]
14530 ; CHECK-GISEL-NEXT:    fcvtl v0.4s, v0.4h
14531 ; CHECK-GISEL-NEXT:    mov.h v1[1], v2[0]
14532 ; CHECK-GISEL-NEXT:    ldr h2, [x2]
14533 ; CHECK-GISEL-NEXT:    mov.h v1[2], v2[0]
14534 ; CHECK-GISEL-NEXT:    ldr h2, [x3]
14535 ; CHECK-GISEL-NEXT:    mov.h v1[3], v2[0]
14536 ; CHECK-GISEL-NEXT:    fcvtl v1.4s, v1.4h
14537 ; CHECK-GISEL-NEXT:    fsub.4s v0, v1, v0
14538 ; CHECK-GISEL-NEXT:    fcvtn v0.4h, v0.4s
14539 ; CHECK-GISEL-NEXT:    str d0, [x4]
14540 ; CHECK-GISEL-NEXT:    ret
14541   %ld.a = load half, ptr %a
14542   %ld.b = load half, ptr %b
14543   %ld.c = load half, ptr %c
14544   %ld.d = load half, ptr %d
14545   %v.a = insertelement <4 x half> undef, half %ld.a, i64 0
14546   %v.b = insertelement <4 x half> %v.a, half %ld.b, i64 1
14547   %v.c = insertelement <4 x half> %v.b, half %ld.c, i64 2
14548   %v = insertelement <4 x half> %v.c, half %ld.d, i64 3
14549   %sub = fsub <4 x half> %v, %e
14550   store <4 x half> %sub, ptr %p
14551   ret void
14554 define void  @test_ld1lane_build_i8(ptr %a, ptr %b, ptr %c, ptr %d, ptr %e, ptr %f, ptr %g, ptr %h, <8 x i8> %v, ptr %p) {
14555 ; SDAG-LABEL: test_ld1lane_build_i8:
14556 ; SDAG:       ; %bb.0:
14557 ; SDAG-NEXT:    ldr b1, [x0]
14558 ; SDAG-NEXT:    ldr x8, [sp]
14559 ; SDAG-NEXT:    ld1.b { v1 }[1], [x1]
14560 ; SDAG-NEXT:    ld1.b { v1 }[2], [x2]
14561 ; SDAG-NEXT:    ld1.b { v1 }[3], [x3]
14562 ; SDAG-NEXT:    ld1.b { v1 }[4], [x4]
14563 ; SDAG-NEXT:    ld1.b { v1 }[5], [x5]
14564 ; SDAG-NEXT:    ld1.b { v1 }[6], [x6]
14565 ; SDAG-NEXT:    ld1.b { v1 }[7], [x7]
14566 ; SDAG-NEXT:    sub.8b v0, v1, v0
14567 ; SDAG-NEXT:    str d0, [x8]
14568 ; SDAG-NEXT:    ret
14570 ; CHECK-GISEL-LABEL: test_ld1lane_build_i8:
14571 ; CHECK-GISEL:       ; %bb.0:
14572 ; CHECK-GISEL-NEXT:    ldr b1, [x0]
14573 ; CHECK-GISEL-NEXT:    ldr b2, [x1]
14574 ; CHECK-GISEL-NEXT:    ldr x8, [sp]
14575 ; CHECK-GISEL-NEXT:    mov.b v1[1], v2[0]
14576 ; CHECK-GISEL-NEXT:    ldr b2, [x2]
14577 ; CHECK-GISEL-NEXT:    mov.b v1[2], v2[0]
14578 ; CHECK-GISEL-NEXT:    ldr b2, [x3]
14579 ; CHECK-GISEL-NEXT:    mov.b v1[3], v2[0]
14580 ; CHECK-GISEL-NEXT:    ldr b2, [x4]
14581 ; CHECK-GISEL-NEXT:    mov.b v1[4], v2[0]
14582 ; CHECK-GISEL-NEXT:    ldr b2, [x5]
14583 ; CHECK-GISEL-NEXT:    mov.b v1[5], v2[0]
14584 ; CHECK-GISEL-NEXT:    ldr b2, [x6]
14585 ; CHECK-GISEL-NEXT:    mov.b v1[6], v2[0]
14586 ; CHECK-GISEL-NEXT:    ldr b2, [x7]
14587 ; CHECK-GISEL-NEXT:    mov.b v1[7], v2[0]
14588 ; CHECK-GISEL-NEXT:    sub.8b v0, v1, v0
14589 ; CHECK-GISEL-NEXT:    str d0, [x8]
14590 ; CHECK-GISEL-NEXT:    ret
14591   %ld.a = load i8, ptr %a
14592   %ld.b = load i8, ptr %b
14593   %ld.c = load i8, ptr %c
14594   %ld.d = load i8, ptr %d
14595   %ld.e = load i8, ptr %e
14596   %ld.f = load i8, ptr %f
14597   %ld.g = load i8, ptr %g
14598   %ld.h = load i8, ptr %h
14599   %v.a = insertelement <8 x i8> undef, i8 %ld.a, i64 0
14600   %v.b = insertelement <8 x i8> %v.a,  i8 %ld.b, i64 1
14601   %v.c = insertelement <8 x i8> %v.b,  i8 %ld.c, i64 2
14602   %v.d = insertelement <8 x i8> %v.c,  i8 %ld.d, i64 3
14603   %v.e = insertelement <8 x i8> %v.d,  i8 %ld.e, i64 4
14604   %v.f = insertelement <8 x i8> %v.e,  i8 %ld.f, i64 5
14605   %v.g = insertelement <8 x i8> %v.f,  i8 %ld.g, i64 6
14606   %v1 = insertelement <8 x i8> %v.g,  i8 %ld.h, i64 7
14607   %sub = sub nsw <8 x i8> %v1, %v
14608   store <8 x i8> %sub, ptr %p
14609   ret void
14612 define <4 x i32> @test_inc_cycle(<4 x i32> %vec, ptr %in) {
14613 ; SDAG-LABEL: test_inc_cycle:
14614 ; SDAG:       ; %bb.0:
14615 ; SDAG-NEXT:    ld1.s { v0 }[0], [x0]
14616 ; SDAG-NEXT:    adrp x9, _var@PAGE
14617 ; SDAG-NEXT:    fmov x8, d0
14618 ; SDAG-NEXT:    add x8, x0, x8, lsl #2
14619 ; SDAG-NEXT:    str x8, [x9, _var@PAGEOFF]
14620 ; SDAG-NEXT:    ret
14622 ; CHECK-GISEL-LABEL: test_inc_cycle:
14623 ; CHECK-GISEL:       ; %bb.0:
14624 ; CHECK-GISEL-NEXT:    ldr s1, [x0]
14625 ; CHECK-GISEL-NEXT:    adrp x9, _var@PAGE
14626 ; CHECK-GISEL-NEXT:    mov.s v0[0], v1[0]
14627 ; CHECK-GISEL-NEXT:    fmov x8, d0
14628 ; CHECK-GISEL-NEXT:    add x8, x0, x8, lsl #2
14629 ; CHECK-GISEL-NEXT:    str x8, [x9, _var@PAGEOFF]
14630 ; CHECK-GISEL-NEXT:    ret
14631   %elt = load i32, ptr %in
14632   %newvec = insertelement <4 x i32> %vec, i32 %elt, i32 0
14634   ; %inc cannot be %elt directly because we check that the load is only
14635   ; used by the insert before trying to form post-inc.
14636   %inc.vec = bitcast <4 x i32> %newvec to <2 x i64>
14637   %inc = extractelement <2 x i64> %inc.vec, i32 0
14638   %newaddr = getelementptr i32, ptr %in, i64 %inc
14639   store ptr %newaddr, ptr @var
14641   ret <4 x i32> %newvec
14644 @var = global ptr null
14646 define i8 @load_single_extract_variable_index_i8(ptr %A, i32 %idx) {
14647 ; SDAG-LABEL: load_single_extract_variable_index_i8:
14648 ; SDAG:       ; %bb.0:
14649 ; SDAG-NEXT:    sub sp, sp, #16
14650 ; SDAG-NEXT:    .cfi_def_cfa_offset 16
14651 ; SDAG-NEXT:    mov x8, sp
14652 ; SDAG-NEXT:    ldr q0, [x0]
14653 ; SDAG-NEXT:    ; kill: def $w1 killed $w1 def $x1
14654 ; SDAG-NEXT:    bfxil x8, x1, #0, #4
14655 ; SDAG-NEXT:    str q0, [sp]
14656 ; SDAG-NEXT:    ldrb w0, [x8]
14657 ; SDAG-NEXT:    add sp, sp, #16
14658 ; SDAG-NEXT:    ret
14660 ; CHECK-GISEL-LABEL: load_single_extract_variable_index_i8:
14661 ; CHECK-GISEL:       ; %bb.0:
14662 ; CHECK-GISEL-NEXT:    sub sp, sp, #16
14663 ; CHECK-GISEL-NEXT:    .cfi_def_cfa_offset 16
14664 ; CHECK-GISEL-NEXT:    mov w9, w1
14665 ; CHECK-GISEL-NEXT:    ldr q0, [x0]
14666 ; CHECK-GISEL-NEXT:    mov x8, sp
14667 ; CHECK-GISEL-NEXT:    and x9, x9, #0xf
14668 ; CHECK-GISEL-NEXT:    lsl x10, x9, #1
14669 ; CHECK-GISEL-NEXT:    str q0, [sp]
14670 ; CHECK-GISEL-NEXT:    sub x9, x10, x9
14671 ; CHECK-GISEL-NEXT:    ldrb w0, [x8, x9]
14672 ; CHECK-GISEL-NEXT:    add sp, sp, #16
14673 ; CHECK-GISEL-NEXT:    ret
14674   %lv = load <16 x i8>, ptr %A
14675   %e = extractelement <16 x i8> %lv, i32 %idx
14676   ret i8 %e
14679 define i16 @load_single_extract_variable_index_i16(ptr %A, i32 %idx) {
14680 ; SDAG-LABEL: load_single_extract_variable_index_i16:
14681 ; SDAG:       ; %bb.0:
14682 ; SDAG-NEXT:    sub sp, sp, #16
14683 ; SDAG-NEXT:    .cfi_def_cfa_offset 16
14684 ; SDAG-NEXT:    mov x8, sp
14685 ; SDAG-NEXT:    ldr q0, [x0]
14686 ; SDAG-NEXT:    ; kill: def $w1 killed $w1 def $x1
14687 ; SDAG-NEXT:    bfi x8, x1, #1, #3
14688 ; SDAG-NEXT:    str q0, [sp]
14689 ; SDAG-NEXT:    ldrh w0, [x8]
14690 ; SDAG-NEXT:    add sp, sp, #16
14691 ; SDAG-NEXT:    ret
14693 ; CHECK-GISEL-LABEL: load_single_extract_variable_index_i16:
14694 ; CHECK-GISEL:       ; %bb.0:
14695 ; CHECK-GISEL-NEXT:    sub sp, sp, #16
14696 ; CHECK-GISEL-NEXT:    .cfi_def_cfa_offset 16
14697 ; CHECK-GISEL-NEXT:    ldr q0, [x0]
14698 ; CHECK-GISEL-NEXT:    mov w9, w1
14699 ; CHECK-GISEL-NEXT:    mov x8, sp
14700 ; CHECK-GISEL-NEXT:    and x9, x9, #0x7
14701 ; CHECK-GISEL-NEXT:    str q0, [sp]
14702 ; CHECK-GISEL-NEXT:    ldrh w0, [x8, x9, lsl #1]
14703 ; CHECK-GISEL-NEXT:    add sp, sp, #16
14704 ; CHECK-GISEL-NEXT:    ret
14705   %lv = load <8 x i16>, ptr %A
14706   %e = extractelement <8 x i16> %lv, i32 %idx
14707   ret i16 %e
14710 define i32 @load_single_extract_variable_index_i32(ptr %A, i32 %idx) {
14711 ; SDAG-LABEL: load_single_extract_variable_index_i32:
14712 ; SDAG:       ; %bb.0:
14713 ; SDAG-NEXT:    ; kill: def $w1 killed $w1 def $x1
14714 ; SDAG-NEXT:    and x8, x1, #0x3
14715 ; SDAG-NEXT:    ldr w0, [x0, x8, lsl #2]
14716 ; SDAG-NEXT:    ret
14718 ; CHECK-GISEL-LABEL: load_single_extract_variable_index_i32:
14719 ; CHECK-GISEL:       ; %bb.0:
14720 ; CHECK-GISEL-NEXT:    sub sp, sp, #16
14721 ; CHECK-GISEL-NEXT:    .cfi_def_cfa_offset 16
14722 ; CHECK-GISEL-NEXT:    ldr q0, [x0]
14723 ; CHECK-GISEL-NEXT:    mov w9, w1
14724 ; CHECK-GISEL-NEXT:    mov x8, sp
14725 ; CHECK-GISEL-NEXT:    and x9, x9, #0x3
14726 ; CHECK-GISEL-NEXT:    str q0, [sp]
14727 ; CHECK-GISEL-NEXT:    ldr w0, [x8, x9, lsl #2]
14728 ; CHECK-GISEL-NEXT:    add sp, sp, #16
14729 ; CHECK-GISEL-NEXT:    ret
14730   %lv = load <4 x i32>, ptr %A
14731   %e = extractelement <4 x i32> %lv, i32 %idx
14732   ret i32 %e
14735 define i32 @load_single_extract_variable_index_v3i32_small_align(ptr %A, i32 %idx) {
14736 ; CHECK-LABEL: load_single_extract_variable_index_v3i32_small_align:
14737 ; CHECK:       ; %bb.0:
14738 ; CHECK-NEXT:    mov w9, w1
14739 ; CHECK-NEXT:    mov w8, #2 ; =0x2
14740 ; CHECK-NEXT:    cmp x9, #2
14741 ; CHECK-NEXT:    csel x8, x9, x8, lo
14742 ; CHECK-NEXT:    ldr w0, [x0, x8, lsl #2]
14743 ; CHECK-NEXT:    ret
14744   %lv = load <3 x i32>, ptr %A, align 2
14745   %e = extractelement <3 x i32> %lv, i32 %idx
14746   ret i32 %e
14749 define i32 @load_single_extract_variable_index_v3i32_default_align(ptr %A, i32 %idx) {
14750 ; CHECK-LABEL: load_single_extract_variable_index_v3i32_default_align:
14751 ; CHECK:       ; %bb.0:
14752 ; CHECK-NEXT:    mov w9, w1
14753 ; CHECK-NEXT:    mov w8, #2 ; =0x2
14754 ; CHECK-NEXT:    cmp x9, #2
14755 ; CHECK-NEXT:    csel x8, x9, x8, lo
14756 ; CHECK-NEXT:    ldr w0, [x0, x8, lsl #2]
14757 ; CHECK-NEXT:    ret
14758   %lv = load <3 x i32>, ptr %A
14759   %e = extractelement <3 x i32> %lv, i32 %idx
14760   ret i32 %e
14763 define i32 @load_single_extract_valid_const_index_v3i32(ptr %A, i32 %idx) {
14764 ; CHECK-LABEL: load_single_extract_valid_const_index_v3i32:
14765 ; CHECK:       ; %bb.0:
14766 ; CHECK-NEXT:    ldr w0, [x0, #8]
14767 ; CHECK-NEXT:    ret
14768   %lv = load <3 x i32>, ptr %A
14769   %e = extractelement <3 x i32> %lv, i32 2
14770   ret i32 %e
14773 define i32 @load_single_extract_variable_index_masked_i32(ptr %A, i32 %idx) {
14774 ; SDAG-LABEL: load_single_extract_variable_index_masked_i32:
14775 ; SDAG:       ; %bb.0:
14776 ; SDAG-NEXT:    and w8, w1, #0x3
14777 ; SDAG-NEXT:    ldr w0, [x0, w8, uxtw #2]
14778 ; SDAG-NEXT:    ret
14780 ; CHECK-GISEL-LABEL: load_single_extract_variable_index_masked_i32:
14781 ; CHECK-GISEL:       ; %bb.0:
14782 ; CHECK-GISEL-NEXT:    sub sp, sp, #16
14783 ; CHECK-GISEL-NEXT:    .cfi_def_cfa_offset 16
14784 ; CHECK-GISEL-NEXT:    ldr q0, [x0]
14785 ; CHECK-GISEL-NEXT:    mov x8, sp
14786 ; CHECK-GISEL-NEXT:    and w9, w1, #0x3
14787 ; CHECK-GISEL-NEXT:    str q0, [sp]
14788 ; CHECK-GISEL-NEXT:    ldr w0, [x8, w9, uxtw #2]
14789 ; CHECK-GISEL-NEXT:    add sp, sp, #16
14790 ; CHECK-GISEL-NEXT:    ret
14791   %idx.x = and i32 %idx, 3
14792   %lv = load <4 x i32>, ptr %A
14793   %e = extractelement <4 x i32> %lv, i32 %idx.x
14794   ret i32 %e
14797 define i32 @load_single_extract_variable_index_masked2_i32(ptr %A, i32 %idx) {
14798 ; SDAG-LABEL: load_single_extract_variable_index_masked2_i32:
14799 ; SDAG:       ; %bb.0:
14800 ; SDAG-NEXT:    and w8, w1, #0x1
14801 ; SDAG-NEXT:    ldr w0, [x0, w8, uxtw #2]
14802 ; SDAG-NEXT:    ret
14804 ; CHECK-GISEL-LABEL: load_single_extract_variable_index_masked2_i32:
14805 ; CHECK-GISEL:       ; %bb.0:
14806 ; CHECK-GISEL-NEXT:    sub sp, sp, #16
14807 ; CHECK-GISEL-NEXT:    .cfi_def_cfa_offset 16
14808 ; CHECK-GISEL-NEXT:    ldr q0, [x0]
14809 ; CHECK-GISEL-NEXT:    mov x8, sp
14810 ; CHECK-GISEL-NEXT:    and w9, w1, #0x1
14811 ; CHECK-GISEL-NEXT:    str q0, [sp]
14812 ; CHECK-GISEL-NEXT:    ldr w0, [x8, w9, uxtw #2]
14813 ; CHECK-GISEL-NEXT:    add sp, sp, #16
14814 ; CHECK-GISEL-NEXT:    ret
14815   %idx.x = and i32 %idx, 1
14816   %lv = load <4 x i32>, ptr %A
14817   %e = extractelement <4 x i32> %lv, i32 %idx.x
14818   ret i32 %e