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