|
1 | 1 | ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
2 | 2 | ; RUN: llc < %s -mtriple=aarch64 -verify-machineinstrs -global-isel=0 | FileCheck %s --check-prefixes=CHECK,CHECK-SD
|
3 |
| -; RUN: llc < %s -mtriple=aarch64 -verify-machineinstrs -global-isel=1 -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI |
4 |
| - |
5 |
| -; CHECK-GI: warning: Instruction selection used fallback path for vector_gep_v3i32 |
6 |
| -; CHECK-GI-NEXT: warning: Instruction selection used fallback path for vector_gep_v3i64 |
7 |
| -; CHECK-GI-NEXT: warning: Instruction selection used fallback path for vector_gep_v3i64_base |
8 |
| -; CHECK-GI-NEXT: warning: Instruction selection used fallback path for vector_gep_v3i64_c10 |
9 |
| -; CHECK-GI-NEXT: warning: Instruction selection used fallback path for vector_gep_v3i64_cm10 |
| 3 | +; RUN: llc < %s -mtriple=aarch64 -verify-machineinstrs -global-isel=1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI |
10 | 4 |
|
11 | 5 | define ptr @scalar_gep_i32(ptr %b, i32 %off) {
|
12 | 6 | ; CHECK-LABEL: scalar_gep_i32:
|
@@ -78,20 +72,38 @@ entry:
|
78 | 72 | }
|
79 | 73 |
|
80 | 74 | define <3 x ptr> @vector_gep_v3i32(<3 x ptr> %b, <3 x i32> %off) {
|
81 |
| -; CHECK-LABEL: vector_gep_v3i32: |
82 |
| -; CHECK: // %bb.0: // %entry |
83 |
| -; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 |
84 |
| -; CHECK-NEXT: // kill: def $d1 killed $d1 def $q1 |
85 |
| -; CHECK-NEXT: ext v4.16b, v3.16b, v3.16b, #8 |
86 |
| -; CHECK-NEXT: // kill: def $d2 killed $d2 def $q2 |
87 |
| -; CHECK-NEXT: mov v0.d[1], v1.d[0] |
88 |
| -; CHECK-NEXT: saddw v2.2d, v2.2d, v4.2s |
89 |
| -; CHECK-NEXT: saddw v0.2d, v0.2d, v3.2s |
90 |
| -; CHECK-NEXT: // kill: def $d2 killed $d2 killed $q2 |
91 |
| -; CHECK-NEXT: ext v1.16b, v0.16b, v0.16b, #8 |
92 |
| -; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 |
93 |
| -; CHECK-NEXT: // kill: def $d1 killed $d1 killed $q1 |
94 |
| -; CHECK-NEXT: ret |
| 75 | +; CHECK-SD-LABEL: vector_gep_v3i32: |
| 76 | +; CHECK-SD: // %bb.0: // %entry |
| 77 | +; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 |
| 78 | +; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1 |
| 79 | +; CHECK-SD-NEXT: ext v4.16b, v3.16b, v3.16b, #8 |
| 80 | +; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q2 |
| 81 | +; CHECK-SD-NEXT: mov v0.d[1], v1.d[0] |
| 82 | +; CHECK-SD-NEXT: saddw v2.2d, v2.2d, v4.2s |
| 83 | +; CHECK-SD-NEXT: saddw v0.2d, v0.2d, v3.2s |
| 84 | +; CHECK-SD-NEXT: // kill: def $d2 killed $d2 killed $q2 |
| 85 | +; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8 |
| 86 | +; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 |
| 87 | +; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1 |
| 88 | +; CHECK-SD-NEXT: ret |
| 89 | +; |
| 90 | +; CHECK-GI-LABEL: vector_gep_v3i32: |
| 91 | +; CHECK-GI: // %bb.0: // %entry |
| 92 | +; CHECK-GI-NEXT: smov x9, v3.s[0] |
| 93 | +; CHECK-GI-NEXT: fmov x8, d0 |
| 94 | +; CHECK-GI-NEXT: mov v0.d[0], x8 |
| 95 | +; CHECK-GI-NEXT: smov x8, v3.s[1] |
| 96 | +; CHECK-GI-NEXT: mov v4.d[0], x9 |
| 97 | +; CHECK-GI-NEXT: fmov x9, d1 |
| 98 | +; CHECK-GI-NEXT: mov v0.d[1], x9 |
| 99 | +; CHECK-GI-NEXT: fmov x9, d2 |
| 100 | +; CHECK-GI-NEXT: mov v4.d[1], x8 |
| 101 | +; CHECK-GI-NEXT: mov w8, v3.s[2] |
| 102 | +; CHECK-GI-NEXT: add v0.2d, v0.2d, v4.2d |
| 103 | +; CHECK-GI-NEXT: add x8, x9, w8, sxtw |
| 104 | +; CHECK-GI-NEXT: fmov d2, x8 |
| 105 | +; CHECK-GI-NEXT: mov d1, v0.d[1] |
| 106 | +; CHECK-GI-NEXT: ret |
95 | 107 | entry:
|
96 | 108 | %g = getelementptr i8, <3 x ptr> %b, <3 x i32> %off
|
97 | 109 | ret <3 x ptr> %g
|
@@ -143,12 +155,29 @@ entry:
|
143 | 155 | }
|
144 | 156 |
|
145 | 157 | define <3 x ptr> @vector_gep_v3i64(<3 x ptr> %b, <3 x i64> %off) {
|
146 |
| -; CHECK-LABEL: vector_gep_v3i64: |
147 |
| -; CHECK: // %bb.0: // %entry |
148 |
| -; CHECK-NEXT: add d0, d0, d3 |
149 |
| -; CHECK-NEXT: add d1, d1, d4 |
150 |
| -; CHECK-NEXT: add d2, d2, d5 |
151 |
| -; CHECK-NEXT: ret |
| 158 | +; CHECK-SD-LABEL: vector_gep_v3i64: |
| 159 | +; CHECK-SD: // %bb.0: // %entry |
| 160 | +; CHECK-SD-NEXT: add d0, d0, d3 |
| 161 | +; CHECK-SD-NEXT: add d1, d1, d4 |
| 162 | +; CHECK-SD-NEXT: add d2, d2, d5 |
| 163 | +; CHECK-SD-NEXT: ret |
| 164 | +; |
| 165 | +; CHECK-GI-LABEL: vector_gep_v3i64: |
| 166 | +; CHECK-GI: // %bb.0: // %entry |
| 167 | +; CHECK-GI-NEXT: fmov x8, d0 |
| 168 | +; CHECK-GI-NEXT: // kill: def $d3 killed $d3 def $q3 |
| 169 | +; CHECK-GI-NEXT: // kill: def $d4 killed $d4 def $q4 |
| 170 | +; CHECK-GI-NEXT: fmov x9, d5 |
| 171 | +; CHECK-GI-NEXT: mov v3.d[1], v4.d[0] |
| 172 | +; CHECK-GI-NEXT: mov v0.d[0], x8 |
| 173 | +; CHECK-GI-NEXT: fmov x8, d1 |
| 174 | +; CHECK-GI-NEXT: mov v0.d[1], x8 |
| 175 | +; CHECK-GI-NEXT: fmov x8, d2 |
| 176 | +; CHECK-GI-NEXT: add x8, x8, x9 |
| 177 | +; CHECK-GI-NEXT: add v0.2d, v0.2d, v3.2d |
| 178 | +; CHECK-GI-NEXT: fmov d2, x8 |
| 179 | +; CHECK-GI-NEXT: mov d1, v0.d[1] |
| 180 | +; CHECK-GI-NEXT: ret |
152 | 181 | entry:
|
153 | 182 | %g = getelementptr i8, <3 x ptr> %b, <3 x i64> %off
|
154 | 183 | ret <3 x ptr> %g
|
@@ -221,19 +250,32 @@ entry:
|
221 | 250 | }
|
222 | 251 |
|
223 | 252 | define <3 x ptr> @vector_gep_v3i64_base(ptr %b, <3 x i64> %off) {
|
224 |
| -; CHECK-LABEL: vector_gep_v3i64_base: |
225 |
| -; CHECK: // %bb.0: // %entry |
226 |
| -; CHECK-NEXT: // kill: def $d0 killed $d0 def $q0 |
227 |
| -; CHECK-NEXT: // kill: def $d1 killed $d1 def $q1 |
228 |
| -; CHECK-NEXT: fmov d3, x0 |
229 |
| -; CHECK-NEXT: mov v0.d[1], v1.d[0] |
230 |
| -; CHECK-NEXT: dup v1.2d, x0 |
231 |
| -; CHECK-NEXT: add d2, d3, d2 |
232 |
| -; CHECK-NEXT: add v0.2d, v1.2d, v0.2d |
233 |
| -; CHECK-NEXT: ext v1.16b, v0.16b, v0.16b, #8 |
234 |
| -; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 |
235 |
| -; CHECK-NEXT: // kill: def $d1 killed $d1 killed $q1 |
236 |
| -; CHECK-NEXT: ret |
| 253 | +; CHECK-SD-LABEL: vector_gep_v3i64_base: |
| 254 | +; CHECK-SD: // %bb.0: // %entry |
| 255 | +; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0 |
| 256 | +; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1 |
| 257 | +; CHECK-SD-NEXT: fmov d3, x0 |
| 258 | +; CHECK-SD-NEXT: mov v0.d[1], v1.d[0] |
| 259 | +; CHECK-SD-NEXT: dup v1.2d, x0 |
| 260 | +; CHECK-SD-NEXT: add d2, d3, d2 |
| 261 | +; CHECK-SD-NEXT: add v0.2d, v1.2d, v0.2d |
| 262 | +; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8 |
| 263 | +; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 |
| 264 | +; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1 |
| 265 | +; CHECK-SD-NEXT: ret |
| 266 | +; |
| 267 | +; CHECK-GI-LABEL: vector_gep_v3i64_base: |
| 268 | +; CHECK-GI: // %bb.0: // %entry |
| 269 | +; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0 |
| 270 | +; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1 |
| 271 | +; CHECK-GI-NEXT: fmov x8, d2 |
| 272 | +; CHECK-GI-NEXT: mov v0.d[1], v1.d[0] |
| 273 | +; CHECK-GI-NEXT: dup v1.2d, x0 |
| 274 | +; CHECK-GI-NEXT: add x8, x0, x8 |
| 275 | +; CHECK-GI-NEXT: fmov d2, x8 |
| 276 | +; CHECK-GI-NEXT: add v0.2d, v1.2d, v0.2d |
| 277 | +; CHECK-GI-NEXT: mov d1, v0.d[1] |
| 278 | +; CHECK-GI-NEXT: ret |
237 | 279 | entry:
|
238 | 280 | %g = getelementptr i8, ptr %b, <3 x i64> %off
|
239 | 281 | ret <3 x ptr> %g
|
@@ -292,18 +334,29 @@ entry:
|
292 | 334 | }
|
293 | 335 |
|
294 | 336 | define <3 x ptr> @vector_gep_v3i64_c10(ptr %b) {
|
295 |
| -; CHECK-LABEL: vector_gep_v3i64_c10: |
296 |
| -; CHECK: // %bb.0: // %entry |
297 |
| -; CHECK-NEXT: mov w8, #10 // =0xa |
298 |
| -; CHECK-NEXT: dup v0.2d, x0 |
299 |
| -; CHECK-NEXT: fmov d3, x0 |
300 |
| -; CHECK-NEXT: dup v2.2d, x8 |
301 |
| -; CHECK-NEXT: add v0.2d, v0.2d, v2.2d |
302 |
| -; CHECK-NEXT: add d2, d3, d2 |
303 |
| -; CHECK-NEXT: ext v1.16b, v0.16b, v0.16b, #8 |
304 |
| -; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 |
305 |
| -; CHECK-NEXT: // kill: def $d1 killed $d1 killed $q1 |
306 |
| -; CHECK-NEXT: ret |
| 337 | +; CHECK-SD-LABEL: vector_gep_v3i64_c10: |
| 338 | +; CHECK-SD: // %bb.0: // %entry |
| 339 | +; CHECK-SD-NEXT: mov w8, #10 // =0xa |
| 340 | +; CHECK-SD-NEXT: dup v0.2d, x0 |
| 341 | +; CHECK-SD-NEXT: fmov d3, x0 |
| 342 | +; CHECK-SD-NEXT: dup v2.2d, x8 |
| 343 | +; CHECK-SD-NEXT: add v0.2d, v0.2d, v2.2d |
| 344 | +; CHECK-SD-NEXT: add d2, d3, d2 |
| 345 | +; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8 |
| 346 | +; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 |
| 347 | +; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1 |
| 348 | +; CHECK-SD-NEXT: ret |
| 349 | +; |
| 350 | +; CHECK-GI-LABEL: vector_gep_v3i64_c10: |
| 351 | +; CHECK-GI: // %bb.0: // %entry |
| 352 | +; CHECK-GI-NEXT: adrp x8, .LCPI19_0 |
| 353 | +; CHECK-GI-NEXT: dup v0.2d, x0 |
| 354 | +; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI19_0] |
| 355 | +; CHECK-GI-NEXT: add x8, x0, #10 |
| 356 | +; CHECK-GI-NEXT: fmov d2, x8 |
| 357 | +; CHECK-GI-NEXT: add v0.2d, v0.2d, v1.2d |
| 358 | +; CHECK-GI-NEXT: mov d1, v0.d[1] |
| 359 | +; CHECK-GI-NEXT: ret |
307 | 360 | entry:
|
308 | 361 | %g = getelementptr i8, ptr %b, <3 x i64> <i64 10, i64 10, i64 10>
|
309 | 362 | ret <3 x ptr> %g
|
@@ -373,18 +426,29 @@ entry:
|
373 | 426 | }
|
374 | 427 |
|
375 | 428 | define <3 x ptr> @vector_gep_v3i64_cm10(ptr %b) {
|
376 |
| -; CHECK-LABEL: vector_gep_v3i64_cm10: |
377 |
| -; CHECK: // %bb.0: // %entry |
378 |
| -; CHECK-NEXT: mov x8, #-10 // =0xfffffffffffffff6 |
379 |
| -; CHECK-NEXT: dup v0.2d, x0 |
380 |
| -; CHECK-NEXT: fmov d3, x0 |
381 |
| -; CHECK-NEXT: dup v2.2d, x8 |
382 |
| -; CHECK-NEXT: add v0.2d, v0.2d, v2.2d |
383 |
| -; CHECK-NEXT: add d2, d3, d2 |
384 |
| -; CHECK-NEXT: ext v1.16b, v0.16b, v0.16b, #8 |
385 |
| -; CHECK-NEXT: // kill: def $d0 killed $d0 killed $q0 |
386 |
| -; CHECK-NEXT: // kill: def $d1 killed $d1 killed $q1 |
387 |
| -; CHECK-NEXT: ret |
| 429 | +; CHECK-SD-LABEL: vector_gep_v3i64_cm10: |
| 430 | +; CHECK-SD: // %bb.0: // %entry |
| 431 | +; CHECK-SD-NEXT: mov x8, #-10 // =0xfffffffffffffff6 |
| 432 | +; CHECK-SD-NEXT: dup v0.2d, x0 |
| 433 | +; CHECK-SD-NEXT: fmov d3, x0 |
| 434 | +; CHECK-SD-NEXT: dup v2.2d, x8 |
| 435 | +; CHECK-SD-NEXT: add v0.2d, v0.2d, v2.2d |
| 436 | +; CHECK-SD-NEXT: add d2, d3, d2 |
| 437 | +; CHECK-SD-NEXT: ext v1.16b, v0.16b, v0.16b, #8 |
| 438 | +; CHECK-SD-NEXT: // kill: def $d0 killed $d0 killed $q0 |
| 439 | +; CHECK-SD-NEXT: // kill: def $d1 killed $d1 killed $q1 |
| 440 | +; CHECK-SD-NEXT: ret |
| 441 | +; |
| 442 | +; CHECK-GI-LABEL: vector_gep_v3i64_cm10: |
| 443 | +; CHECK-GI: // %bb.0: // %entry |
| 444 | +; CHECK-GI-NEXT: adrp x8, .LCPI23_0 |
| 445 | +; CHECK-GI-NEXT: dup v0.2d, x0 |
| 446 | +; CHECK-GI-NEXT: ldr q1, [x8, :lo12:.LCPI23_0] |
| 447 | +; CHECK-GI-NEXT: sub x8, x0, #10 |
| 448 | +; CHECK-GI-NEXT: fmov d2, x8 |
| 449 | +; CHECK-GI-NEXT: add v0.2d, v0.2d, v1.2d |
| 450 | +; CHECK-GI-NEXT: mov d1, v0.d[1] |
| 451 | +; CHECK-GI-NEXT: ret |
388 | 452 | entry:
|
389 | 453 | %g = getelementptr i8, ptr %b, <3 x i64> <i64 -10, i64 -10, i64 -10>
|
390 | 454 | ret <3 x ptr> %g
|
|
0 commit comments