Mercurial > hg > CbC > CbC_llvm
comparison test/CodeGen/AArch64/arm64-st1.ll @ 147:c2174574ed3a
LLVM 10
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 14 Aug 2019 16:55:33 +0900 |
parents | 3a76565eade5 |
children |
comparison
equal
deleted
inserted
replaced
134:3a76565eade5 | 147:c2174574ed3a |
---|---|
2 ; RUN: llc < %s -mtriple=arm64-eabi -aarch64-neon-syntax=apple -verify-machineinstrs -mcpu=exynos-m1 | FileCheck --check-prefix=EXYNOS %s | 2 ; RUN: llc < %s -mtriple=arm64-eabi -aarch64-neon-syntax=apple -verify-machineinstrs -mcpu=exynos-m1 | FileCheck --check-prefix=EXYNOS %s |
3 ; The instruction latencies of Exynos-M1 trigger the transform we see under the Exynos check. | 3 ; The instruction latencies of Exynos-M1 trigger the transform we see under the Exynos check. |
4 | 4 |
5 define void @st1lane_16b(<16 x i8> %A, i8* %D) { | 5 define void @st1lane_16b(<16 x i8> %A, i8* %D) { |
6 ; CHECK-LABEL: st1lane_16b | 6 ; CHECK-LABEL: st1lane_16b |
7 ; CHECK: st1.b | 7 ; CHECK: st1.b { v0 }[1], [x{{[0-9]+}}] |
8 %ptr = getelementptr i8, i8* %D, i64 1 | |
8 %tmp = extractelement <16 x i8> %A, i32 1 | 9 %tmp = extractelement <16 x i8> %A, i32 1 |
9 store i8 %tmp, i8* %D | 10 store i8 %tmp, i8* %ptr |
11 ret void | |
12 } | |
13 | |
14 define void @st1lane0_16b(<16 x i8> %A, i8* %D) { | |
15 ; CHECK-LABEL: st1lane0_16b | |
16 ; CHECK: st1.b { v0 }[0], [x{{[0-9]+}}] | |
17 %ptr = getelementptr i8, i8* %D, i64 1 | |
18 %tmp = extractelement <16 x i8> %A, i32 0 | |
19 store i8 %tmp, i8* %ptr | |
20 ret void | |
21 } | |
22 | |
23 define void @st1lane0u_16b(<16 x i8> %A, i8* %D) { | |
24 ; CHECK-LABEL: st1lane0u_16b | |
25 ; CHECK: st1.b { v0 }[0], [x{{[0-9]+}}] | |
26 %ptr = getelementptr i8, i8* %D, i64 -1 | |
27 %tmp = extractelement <16 x i8> %A, i32 0 | |
28 store i8 %tmp, i8* %ptr | |
10 ret void | 29 ret void |
11 } | 30 } |
12 | 31 |
13 define void @st1lane_ro_16b(<16 x i8> %A, i8* %D, i64 %offset) { | 32 define void @st1lane_ro_16b(<16 x i8> %A, i8* %D, i64 %offset) { |
14 ; CHECK-LABEL: st1lane_ro_16b | 33 ; CHECK-LABEL: st1lane_ro_16b |
30 ret void | 49 ret void |
31 } | 50 } |
32 | 51 |
33 define void @st1lane_8h(<8 x i16> %A, i16* %D) { | 52 define void @st1lane_8h(<8 x i16> %A, i16* %D) { |
34 ; CHECK-LABEL: st1lane_8h | 53 ; CHECK-LABEL: st1lane_8h |
35 ; CHECK: st1.h | 54 ; CHECK: st1.h { v0 }[1], [x{{[0-9]+}}] |
55 %ptr = getelementptr i16, i16* %D, i64 1 | |
36 %tmp = extractelement <8 x i16> %A, i32 1 | 56 %tmp = extractelement <8 x i16> %A, i32 1 |
37 store i16 %tmp, i16* %D | 57 store i16 %tmp, i16* %ptr |
58 ret void | |
59 } | |
60 | |
61 define void @st1lane0_8h(<8 x i16> %A, i16* %D) { | |
62 ; CHECK-LABEL: st1lane0_8h | |
63 ; CHECK: str h0, [x0, #2] | |
64 %ptr = getelementptr i16, i16* %D, i64 1 | |
65 %tmp = extractelement <8 x i16> %A, i32 0 | |
66 store i16 %tmp, i16* %ptr | |
67 ret void | |
68 } | |
69 | |
70 define void @st1lane0u_8h(<8 x i16> %A, i16* %D) { | |
71 ; CHECK-LABEL: st1lane0u_8h | |
72 ; CHECK: stur h0, [x0, #-2] | |
73 %ptr = getelementptr i16, i16* %D, i64 -1 | |
74 %tmp = extractelement <8 x i16> %A, i32 0 | |
75 store i16 %tmp, i16* %ptr | |
38 ret void | 76 ret void |
39 } | 77 } |
40 | 78 |
41 define void @st1lane_ro_8h(<8 x i16> %A, i16* %D, i64 %offset) { | 79 define void @st1lane_ro_8h(<8 x i16> %A, i16* %D, i64 %offset) { |
42 ; CHECK-LABEL: st1lane_ro_8h | 80 ; CHECK-LABEL: st1lane_ro_8h |
57 ret void | 95 ret void |
58 } | 96 } |
59 | 97 |
60 define void @st1lane_4s(<4 x i32> %A, i32* %D) { | 98 define void @st1lane_4s(<4 x i32> %A, i32* %D) { |
61 ; CHECK-LABEL: st1lane_4s | 99 ; CHECK-LABEL: st1lane_4s |
62 ; CHECK: st1.s | 100 ; CHECK: st1.s { v0 }[1], [x{{[0-9]+}}] |
101 %ptr = getelementptr i32, i32* %D, i64 1 | |
63 %tmp = extractelement <4 x i32> %A, i32 1 | 102 %tmp = extractelement <4 x i32> %A, i32 1 |
64 store i32 %tmp, i32* %D | 103 store i32 %tmp, i32* %ptr |
104 ret void | |
105 } | |
106 | |
107 define void @st1lane0_4s(<4 x i32> %A, i32* %D) { | |
108 ; CHECK-LABEL: st1lane0_4s | |
109 ; CHECK: str s0, [x0, #4] | |
110 %ptr = getelementptr i32, i32* %D, i64 1 | |
111 %tmp = extractelement <4 x i32> %A, i32 0 | |
112 store i32 %tmp, i32* %ptr | |
113 ret void | |
114 } | |
115 | |
116 define void @st1lane0u_4s(<4 x i32> %A, i32* %D) { | |
117 ; CHECK-LABEL: st1lane0u_4s | |
118 ; CHECK: stur s0, [x0, #-4] | |
119 %ptr = getelementptr i32, i32* %D, i64 -1 | |
120 %tmp = extractelement <4 x i32> %A, i32 0 | |
121 store i32 %tmp, i32* %ptr | |
65 ret void | 122 ret void |
66 } | 123 } |
67 | 124 |
68 define void @st1lane_ro_4s(<4 x i32> %A, i32* %D, i64 %offset) { | 125 define void @st1lane_ro_4s(<4 x i32> %A, i32* %D, i64 %offset) { |
69 ; CHECK-LABEL: st1lane_ro_4s | 126 ; CHECK-LABEL: st1lane_ro_4s |
84 ret void | 141 ret void |
85 } | 142 } |
86 | 143 |
87 define void @st1lane_4s_float(<4 x float> %A, float* %D) { | 144 define void @st1lane_4s_float(<4 x float> %A, float* %D) { |
88 ; CHECK-LABEL: st1lane_4s_float | 145 ; CHECK-LABEL: st1lane_4s_float |
89 ; CHECK: st1.s | 146 ; CHECK: st1.s { v0 }[1], [x{{[0-9]+}}] |
147 %ptr = getelementptr float, float* %D, i64 1 | |
90 %tmp = extractelement <4 x float> %A, i32 1 | 148 %tmp = extractelement <4 x float> %A, i32 1 |
91 store float %tmp, float* %D | 149 store float %tmp, float* %ptr |
150 ret void | |
151 } | |
152 | |
153 define void @st1lane0_4s_float(<4 x float> %A, float* %D) { | |
154 ; CHECK-LABEL: st1lane0_4s_float | |
155 ; CHECK: str s0, [x0, #4] | |
156 %ptr = getelementptr float, float* %D, i64 1 | |
157 %tmp = extractelement <4 x float> %A, i32 0 | |
158 store float %tmp, float* %ptr | |
159 ret void | |
160 } | |
161 | |
162 define void @st1lane0u_4s_float(<4 x float> %A, float* %D) { | |
163 ; CHECK-LABEL: st1lane0u_4s_float | |
164 ; CHECK: stur s0, [x0, #-4] | |
165 %ptr = getelementptr float, float* %D, i64 -1 | |
166 %tmp = extractelement <4 x float> %A, i32 0 | |
167 store float %tmp, float* %ptr | |
92 ret void | 168 ret void |
93 } | 169 } |
94 | 170 |
95 define void @st1lane_ro_4s_float(<4 x float> %A, float* %D, i64 %offset) { | 171 define void @st1lane_ro_4s_float(<4 x float> %A, float* %D, i64 %offset) { |
96 ; CHECK-LABEL: st1lane_ro_4s_float | 172 ; CHECK-LABEL: st1lane_ro_4s_float |
111 ret void | 187 ret void |
112 } | 188 } |
113 | 189 |
114 define void @st1lane_2d(<2 x i64> %A, i64* %D) { | 190 define void @st1lane_2d(<2 x i64> %A, i64* %D) { |
115 ; CHECK-LABEL: st1lane_2d | 191 ; CHECK-LABEL: st1lane_2d |
116 ; CHECK: st1.d | 192 ; CHECK: st1.d { v0 }[1], [x{{[0-9]+}}] |
193 %ptr = getelementptr i64, i64* %D, i64 1 | |
117 %tmp = extractelement <2 x i64> %A, i32 1 | 194 %tmp = extractelement <2 x i64> %A, i32 1 |
118 store i64 %tmp, i64* %D | 195 store i64 %tmp, i64* %ptr |
196 ret void | |
197 } | |
198 | |
199 define void @st1lane0_2d(<2 x i64> %A, i64* %D) { | |
200 ; CHECK-LABEL: st1lane0_2d | |
201 ; CHECK: str d0, [x0, #8] | |
202 %ptr = getelementptr i64, i64* %D, i64 1 | |
203 %tmp = extractelement <2 x i64> %A, i32 0 | |
204 store i64 %tmp, i64* %ptr | |
205 ret void | |
206 } | |
207 | |
208 define void @st1lane0u_2d(<2 x i64> %A, i64* %D) { | |
209 ; CHECK-LABEL: st1lane0u_2d | |
210 ; CHECK: stur d0, [x0, #-8] | |
211 %ptr = getelementptr i64, i64* %D, i64 -1 | |
212 %tmp = extractelement <2 x i64> %A, i32 0 | |
213 store i64 %tmp, i64* %ptr | |
119 ret void | 214 ret void |
120 } | 215 } |
121 | 216 |
122 define void @st1lane_ro_2d(<2 x i64> %A, i64* %D, i64 %offset) { | 217 define void @st1lane_ro_2d(<2 x i64> %A, i64* %D, i64 %offset) { |
123 ; CHECK-LABEL: st1lane_ro_2d | 218 ; CHECK-LABEL: st1lane_ro_2d |
138 ret void | 233 ret void |
139 } | 234 } |
140 | 235 |
141 define void @st1lane_2d_double(<2 x double> %A, double* %D) { | 236 define void @st1lane_2d_double(<2 x double> %A, double* %D) { |
142 ; CHECK-LABEL: st1lane_2d_double | 237 ; CHECK-LABEL: st1lane_2d_double |
143 ; CHECK: st1.d | 238 ; CHECK: st1.d { v0 }[1], [x{{[0-9]+}}] |
239 %ptr = getelementptr double, double* %D, i64 1 | |
144 %tmp = extractelement <2 x double> %A, i32 1 | 240 %tmp = extractelement <2 x double> %A, i32 1 |
145 store double %tmp, double* %D | 241 store double %tmp, double* %ptr |
242 ret void | |
243 } | |
244 | |
245 define void @st1lane0_2d_double(<2 x double> %A, double* %D) { | |
246 ; CHECK-LABEL: st1lane0_2d_double | |
247 ; CHECK: str d0, [x0, #8] | |
248 %ptr = getelementptr double, double* %D, i64 1 | |
249 %tmp = extractelement <2 x double> %A, i32 0 | |
250 store double %tmp, double* %ptr | |
251 ret void | |
252 } | |
253 | |
254 define void @st1lane0u_2d_double(<2 x double> %A, double* %D) { | |
255 ; CHECK-LABEL: st1lane0u_2d_double | |
256 ; CHECK: stur d0, [x0, #-8] | |
257 %ptr = getelementptr double, double* %D, i64 -1 | |
258 %tmp = extractelement <2 x double> %A, i32 0 | |
259 store double %tmp, double* %ptr | |
146 ret void | 260 ret void |
147 } | 261 } |
148 | 262 |
149 define void @st1lane_ro_2d_double(<2 x double> %A, double* %D, i64 %offset) { | 263 define void @st1lane_ro_2d_double(<2 x double> %A, double* %D, i64 %offset) { |
150 ; CHECK-LABEL: st1lane_ro_2d_double | 264 ; CHECK-LABEL: st1lane_ro_2d_double |
165 ret void | 279 ret void |
166 } | 280 } |
167 | 281 |
168 define void @st1lane_8b(<8 x i8> %A, i8* %D) { | 282 define void @st1lane_8b(<8 x i8> %A, i8* %D) { |
169 ; CHECK-LABEL: st1lane_8b | 283 ; CHECK-LABEL: st1lane_8b |
170 ; CHECK: st1.b | 284 ; CHECK: st1.b { v0 }[1], [x{{[0-9]+}}] |
285 %ptr = getelementptr i8, i8* %D, i64 1 | |
171 %tmp = extractelement <8 x i8> %A, i32 1 | 286 %tmp = extractelement <8 x i8> %A, i32 1 |
172 store i8 %tmp, i8* %D | 287 store i8 %tmp, i8* %ptr |
173 ret void | 288 ret void |
174 } | 289 } |
175 | 290 |
176 define void @st1lane_ro_8b(<8 x i8> %A, i8* %D, i64 %offset) { | 291 define void @st1lane_ro_8b(<8 x i8> %A, i8* %D, i64 %offset) { |
177 ; CHECK-LABEL: st1lane_ro_8b | 292 ; CHECK-LABEL: st1lane_ro_8b |
193 ret void | 308 ret void |
194 } | 309 } |
195 | 310 |
196 define void @st1lane_4h(<4 x i16> %A, i16* %D) { | 311 define void @st1lane_4h(<4 x i16> %A, i16* %D) { |
197 ; CHECK-LABEL: st1lane_4h | 312 ; CHECK-LABEL: st1lane_4h |
198 ; CHECK: st1.h | 313 ; CHECK: st1.h { v0 }[1], [x{{[0-9]+}}] |
314 %ptr = getelementptr i16, i16* %D, i64 1 | |
199 %tmp = extractelement <4 x i16> %A, i32 1 | 315 %tmp = extractelement <4 x i16> %A, i32 1 |
200 store i16 %tmp, i16* %D | 316 store i16 %tmp, i16* %ptr |
317 ret void | |
318 } | |
319 | |
320 define void @st1lane0_4h(<4 x i16> %A, i16* %D) { | |
321 ; CHECK-LABEL: st1lane0_4h | |
322 ; CHECK: str h0, [x0, #2] | |
323 %ptr = getelementptr i16, i16* %D, i64 1 | |
324 %tmp = extractelement <4 x i16> %A, i32 0 | |
325 store i16 %tmp, i16* %ptr | |
326 ret void | |
327 } | |
328 | |
329 define void @st1lane0u_4h(<4 x i16> %A, i16* %D) { | |
330 ; CHECK-LABEL: st1lane0u_4h | |
331 ; CHECK: stur h0, [x0, #-2] | |
332 %ptr = getelementptr i16, i16* %D, i64 -1 | |
333 %tmp = extractelement <4 x i16> %A, i32 0 | |
334 store i16 %tmp, i16* %ptr | |
201 ret void | 335 ret void |
202 } | 336 } |
203 | 337 |
204 define void @st1lane_ro_4h(<4 x i16> %A, i16* %D, i64 %offset) { | 338 define void @st1lane_ro_4h(<4 x i16> %A, i16* %D, i64 %offset) { |
205 ; CHECK-LABEL: st1lane_ro_4h | 339 ; CHECK-LABEL: st1lane_ro_4h |
220 ret void | 354 ret void |
221 } | 355 } |
222 | 356 |
223 define void @st1lane_2s(<2 x i32> %A, i32* %D) { | 357 define void @st1lane_2s(<2 x i32> %A, i32* %D) { |
224 ; CHECK-LABEL: st1lane_2s | 358 ; CHECK-LABEL: st1lane_2s |
225 ; CHECK: st1.s | 359 ; CHECK: st1.s { v0 }[1], [x{{[0-9]+}}] |
360 %ptr = getelementptr i32, i32* %D, i64 1 | |
226 %tmp = extractelement <2 x i32> %A, i32 1 | 361 %tmp = extractelement <2 x i32> %A, i32 1 |
227 store i32 %tmp, i32* %D | 362 store i32 %tmp, i32* %ptr |
363 ret void | |
364 } | |
365 | |
366 define void @st1lane0_2s(<2 x i32> %A, i32* %D) { | |
367 ; CHECK-LABEL: st1lane0_2s | |
368 ; CHECK: str s0, [x0, #4] | |
369 %ptr = getelementptr i32, i32* %D, i64 1 | |
370 %tmp = extractelement <2 x i32> %A, i32 0 | |
371 store i32 %tmp, i32* %ptr | |
372 ret void | |
373 } | |
374 | |
375 define void @st1lane0u_2s(<2 x i32> %A, i32* %D) { | |
376 ; CHECK-LABEL: st1lane0u_2s | |
377 ; CHECK: stur s0, [x0, #-4] | |
378 %ptr = getelementptr i32, i32* %D, i64 -1 | |
379 %tmp = extractelement <2 x i32> %A, i32 0 | |
380 store i32 %tmp, i32* %ptr | |
228 ret void | 381 ret void |
229 } | 382 } |
230 | 383 |
231 define void @st1lane_ro_2s(<2 x i32> %A, i32* %D, i64 %offset) { | 384 define void @st1lane_ro_2s(<2 x i32> %A, i32* %D, i64 %offset) { |
232 ; CHECK-LABEL: st1lane_ro_2s | 385 ; CHECK-LABEL: st1lane_ro_2s |
247 ret void | 400 ret void |
248 } | 401 } |
249 | 402 |
250 define void @st1lane_2s_float(<2 x float> %A, float* %D) { | 403 define void @st1lane_2s_float(<2 x float> %A, float* %D) { |
251 ; CHECK-LABEL: st1lane_2s_float | 404 ; CHECK-LABEL: st1lane_2s_float |
252 ; CHECK: st1.s | 405 ; CHECK: st1.s { v0 }[1], [x{{[0-9]+}}] |
406 %ptr = getelementptr float, float* %D, i64 1 | |
253 %tmp = extractelement <2 x float> %A, i32 1 | 407 %tmp = extractelement <2 x float> %A, i32 1 |
254 store float %tmp, float* %D | 408 store float %tmp, float* %ptr |
409 ret void | |
410 } | |
411 | |
412 define void @st1lane0_2s_float(<2 x float> %A, float* %D) { | |
413 ; CHECK-LABEL: st1lane0_2s_float | |
414 ; CHECK: str s0, [x0, #4] | |
415 %ptr = getelementptr float, float* %D, i64 1 | |
416 %tmp = extractelement <2 x float> %A, i32 0 | |
417 store float %tmp, float* %ptr | |
418 ret void | |
419 } | |
420 | |
421 define void @st1lane0u_2s_float(<2 x float> %A, float* %D) { | |
422 ; CHECK-LABEL: st1lane0u_2s_float | |
423 ; CHECK: stur s0, [x0, #-4] | |
424 %ptr = getelementptr float, float* %D, i64 -1 | |
425 %tmp = extractelement <2 x float> %A, i32 0 | |
426 store float %tmp, float* %ptr | |
255 ret void | 427 ret void |
256 } | 428 } |
257 | 429 |
258 define void @st1lane_ro_2s_float(<2 x float> %A, float* %D, i64 %offset) { | 430 define void @st1lane_ro_2s_float(<2 x float> %A, float* %D, i64 %offset) { |
259 ; CHECK-LABEL: st1lane_ro_2s_float | 431 ; CHECK-LABEL: st1lane_ro_2s_float |
269 ; CHECK-LABEL: st1lane0_ro_2s_float | 441 ; CHECK-LABEL: st1lane0_ro_2s_float |
270 ; CHECK: str s0, [x0, x1, lsl #2] | 442 ; CHECK: str s0, [x0, x1, lsl #2] |
271 %ptr = getelementptr float, float* %D, i64 %offset | 443 %ptr = getelementptr float, float* %D, i64 %offset |
272 %tmp = extractelement <2 x float> %A, i32 0 | 444 %tmp = extractelement <2 x float> %A, i32 0 |
273 store float %tmp, float* %ptr | 445 store float %tmp, float* %ptr |
446 ret void | |
447 } | |
448 | |
449 define void @st1lane0_1d(<1 x i64> %A, i64* %D) { | |
450 ; CHECK-LABEL: st1lane0_1d | |
451 ; CHECK: str d0, [x0, #8] | |
452 %ptr = getelementptr i64, i64* %D, i64 1 | |
453 %tmp = extractelement <1 x i64> %A, i32 0 | |
454 store i64 %tmp, i64* %ptr | |
455 ret void | |
456 } | |
457 | |
458 define void @st1lane0u_1d(<1 x i64> %A, i64* %D) { | |
459 ; CHECK-LABEL: st1lane0u_1d | |
460 ; CHECK: stur d0, [x0, #-8] | |
461 %ptr = getelementptr i64, i64* %D, i64 -1 | |
462 %tmp = extractelement <1 x i64> %A, i32 0 | |
463 store i64 %tmp, i64* %ptr | |
464 ret void | |
465 } | |
466 | |
467 define void @st1lane0_ro_1d(<1 x i64> %A, i64* %D, i64 %offset) { | |
468 ; CHECK-LABEL: st1lane0_ro_1d | |
469 ; CHECK: str d0, [x0, x1, lsl #3] | |
470 %ptr = getelementptr i64, i64* %D, i64 %offset | |
471 %tmp = extractelement <1 x i64> %A, i32 0 | |
472 store i64 %tmp, i64* %ptr | |
473 ret void | |
474 } | |
475 | |
476 define void @st1lane0_1d_double(<1 x double> %A, double* %D) { | |
477 ; CHECK-LABEL: st1lane0_1d_double | |
478 ; CHECK: str d0, [x0, #8] | |
479 %ptr = getelementptr double, double* %D, i64 1 | |
480 %tmp = extractelement <1 x double> %A, i32 0 | |
481 store double %tmp, double* %ptr | |
482 ret void | |
483 } | |
484 | |
485 define void @st1lane0u_1d_double(<1 x double> %A, double* %D) { | |
486 ; CHECK-LABEL: st1lane0u_1d_double | |
487 ; CHECK: stur d0, [x0, #-8] | |
488 %ptr = getelementptr double, double* %D, i64 -1 | |
489 %tmp = extractelement <1 x double> %A, i32 0 | |
490 store double %tmp, double* %ptr | |
491 ret void | |
492 } | |
493 | |
494 define void @st1lane0_ro_1d_double(<1 x double> %A, double* %D, i64 %offset) { | |
495 ; CHECK-LABEL: st1lane0_ro_1d_double | |
496 ; CHECK: str d0, [x0, x1, lsl #3] | |
497 %ptr = getelementptr double, double* %D, i64 %offset | |
498 %tmp = extractelement <1 x double> %A, i32 0 | |
499 store double %tmp, double* %ptr | |
274 ret void | 500 ret void |
275 } | 501 } |
276 | 502 |
277 define void @st2lane_16b(<16 x i8> %A, <16 x i8> %B, i8* %D) { | 503 define void @st2lane_16b(<16 x i8> %A, <16 x i8> %B, i8* %D) { |
278 ; CHECK-LABEL: st2lane_16b | 504 ; CHECK-LABEL: st2lane_16b |