1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3
2 ; RUN: llc < %s -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -mattr=+neon -fp-contract=fast -aarch64-enable-sink-fold=true | FileCheck %s --check-prefix=CHECK-SDAG
3 ; RUN: llc < %s -global-isel -global-isel-abort=2 -verify-machineinstrs -mtriple=aarch64-none-linux-gnu -mattr=+neon -fp-contract=fast -aarch64-enable-sink-fold=true | FileCheck %s --check-prefix=CHECK-GISEL
5 define <4 x i8> @test_varidx_extract_v8s8(<8 x i8> %x, i32 %idx) {
6 ; CHECK-SDAG-LABEL: test_varidx_extract_v8s8:
7 ; CHECK-SDAG: // %bb.0:
8 ; CHECK-SDAG-NEXT: sub sp, sp, #16
9 ; CHECK-SDAG-NEXT: .cfi_def_cfa_offset 16
10 ; CHECK-SDAG-NEXT: add x8, sp, #8
11 ; CHECK-SDAG-NEXT: // kill: def $w0 killed $w0 def $x0
12 ; CHECK-SDAG-NEXT: // kill: def $d0 killed $d0 def $q0
13 ; CHECK-SDAG-NEXT: str d0, [sp, #8]
14 ; CHECK-SDAG-NEXT: umov w9, v0.b[1]
15 ; CHECK-SDAG-NEXT: bfxil x8, x0, #0, #3
16 ; CHECK-SDAG-NEXT: ld1 { v1.b }[0], [x8]
17 ; CHECK-SDAG-NEXT: umov w8, v0.b[2]
18 ; CHECK-SDAG-NEXT: mov v1.h[1], w9
19 ; CHECK-SDAG-NEXT: umov w9, v0.b[3]
20 ; CHECK-SDAG-NEXT: mov v1.h[2], w8
21 ; CHECK-SDAG-NEXT: mov v1.h[3], w9
22 ; CHECK-SDAG-NEXT: fmov d0, d1
23 ; CHECK-SDAG-NEXT: add sp, sp, #16
24 ; CHECK-SDAG-NEXT: ret
26 ; CHECK-GISEL-LABEL: test_varidx_extract_v8s8:
27 ; CHECK-GISEL: // %bb.0:
28 ; CHECK-GISEL-NEXT: sub sp, sp, #16
29 ; CHECK-GISEL-NEXT: .cfi_def_cfa_offset 16
30 ; CHECK-GISEL-NEXT: mov w9, w0
31 ; CHECK-GISEL-NEXT: // kill: def $d0 killed $d0 def $q0
32 ; CHECK-GISEL-NEXT: add x8, sp, #8
33 ; CHECK-GISEL-NEXT: str d0, [sp, #8]
34 ; CHECK-GISEL-NEXT: and x9, x9, #0x7
35 ; CHECK-GISEL-NEXT: mov b2, v0.b[1]
36 ; CHECK-GISEL-NEXT: mov b3, v0.b[2]
37 ; CHECK-GISEL-NEXT: lsl x10, x9, #1
38 ; CHECK-GISEL-NEXT: mov b0, v0.b[3]
39 ; CHECK-GISEL-NEXT: sub x9, x10, x9
40 ; CHECK-GISEL-NEXT: ldrb w8, [x8, x9]
41 ; CHECK-GISEL-NEXT: fmov s1, w8
42 ; CHECK-GISEL-NEXT: mov v1.h[1], v2.h[0]
43 ; CHECK-GISEL-NEXT: mov v1.h[2], v3.h[0]
44 ; CHECK-GISEL-NEXT: mov v1.h[3], v0.h[0]
45 ; CHECK-GISEL-NEXT: fmov d0, d1
46 ; CHECK-GISEL-NEXT: add sp, sp, #16
47 ; CHECK-GISEL-NEXT: ret
48 %tmp = extractelement <8 x i8> %x, i32 %idx
49 %tmp2 = insertelement <4 x i8> undef, i8 %tmp, i32 0
50 %tmp3 = extractelement <8 x i8> %x, i32 1
51 %tmp4 = insertelement <4 x i8> %tmp2, i8 %tmp3, i32 1
52 %tmp5 = extractelement <8 x i8> %x, i32 2
53 %tmp6 = insertelement <4 x i8> %tmp4, i8 %tmp5, i32 2
54 %tmp7 = extractelement <8 x i8> %x, i32 3
55 %tmp8 = insertelement <4 x i8> %tmp6, i8 %tmp7, i32 3
59 define <8 x i8> @test_varidx_extract_v16s8(<16 x i8> %x, i32 %idx) {
60 ; CHECK-SDAG-LABEL: test_varidx_extract_v16s8:
61 ; CHECK-SDAG: // %bb.0:
62 ; CHECK-SDAG-NEXT: sub sp, sp, #16
63 ; CHECK-SDAG-NEXT: .cfi_def_cfa_offset 16
64 ; CHECK-SDAG-NEXT: mov x8, sp
65 ; CHECK-SDAG-NEXT: // kill: def $w0 killed $w0 def $x0
66 ; CHECK-SDAG-NEXT: str q0, [sp]
67 ; CHECK-SDAG-NEXT: bfxil x8, x0, #0, #4
68 ; CHECK-SDAG-NEXT: ldr b1, [x8]
69 ; CHECK-SDAG-NEXT: mov v1.b[1], v0.b[1]
70 ; CHECK-SDAG-NEXT: mov v1.b[2], v0.b[2]
71 ; CHECK-SDAG-NEXT: mov v1.b[3], v0.b[3]
72 ; CHECK-SDAG-NEXT: mov v1.b[4], v0.b[4]
73 ; CHECK-SDAG-NEXT: mov v1.b[5], v0.b[5]
74 ; CHECK-SDAG-NEXT: mov v1.b[6], v0.b[6]
75 ; CHECK-SDAG-NEXT: mov v1.b[7], v0.b[7]
76 ; CHECK-SDAG-NEXT: fmov d0, d1
77 ; CHECK-SDAG-NEXT: add sp, sp, #16
78 ; CHECK-SDAG-NEXT: ret
80 ; CHECK-GISEL-LABEL: test_varidx_extract_v16s8:
81 ; CHECK-GISEL: // %bb.0:
82 ; CHECK-GISEL-NEXT: sub sp, sp, #16
83 ; CHECK-GISEL-NEXT: .cfi_def_cfa_offset 16
84 ; CHECK-GISEL-NEXT: mov w9, w0
85 ; CHECK-GISEL-NEXT: mov b2, v0.b[1]
86 ; CHECK-GISEL-NEXT: mov x8, sp
87 ; CHECK-GISEL-NEXT: and x9, x9, #0xf
88 ; CHECK-GISEL-NEXT: str q0, [sp]
89 ; CHECK-GISEL-NEXT: mov b3, v0.b[2]
90 ; CHECK-GISEL-NEXT: lsl x10, x9, #1
91 ; CHECK-GISEL-NEXT: sub x9, x10, x9
92 ; CHECK-GISEL-NEXT: ldr b1, [x8, x9]
93 ; CHECK-GISEL-NEXT: mov v1.b[1], v2.b[0]
94 ; CHECK-GISEL-NEXT: mov b2, v0.b[3]
95 ; CHECK-GISEL-NEXT: mov v1.b[2], v3.b[0]
96 ; CHECK-GISEL-NEXT: mov b3, v0.b[4]
97 ; CHECK-GISEL-NEXT: mov v1.b[3], v2.b[0]
98 ; CHECK-GISEL-NEXT: mov b2, v0.b[5]
99 ; CHECK-GISEL-NEXT: mov v1.b[4], v3.b[0]
100 ; CHECK-GISEL-NEXT: mov b3, v0.b[6]
101 ; CHECK-GISEL-NEXT: mov b0, v0.b[7]
102 ; CHECK-GISEL-NEXT: mov v1.b[5], v2.b[0]
103 ; CHECK-GISEL-NEXT: mov v1.b[6], v3.b[0]
104 ; CHECK-GISEL-NEXT: mov v1.b[7], v0.b[0]
105 ; CHECK-GISEL-NEXT: fmov d0, d1
106 ; CHECK-GISEL-NEXT: add sp, sp, #16
107 ; CHECK-GISEL-NEXT: ret
108 %tmp = extractelement <16 x i8> %x, i32 %idx
109 %tmp2 = insertelement <8 x i8> undef, i8 %tmp, i32 0
110 %tmp3 = extractelement <16 x i8> %x, i32 1
111 %tmp4 = insertelement <8 x i8> %tmp2, i8 %tmp3, i32 1
112 %tmp5 = extractelement <16 x i8> %x, i32 2
113 %tmp6 = insertelement <8 x i8> %tmp4, i8 %tmp5, i32 2
114 %tmp7 = extractelement <16 x i8> %x, i32 3
115 %tmp8 = insertelement <8 x i8> %tmp6, i8 %tmp7, i32 3
116 %tmp9 = extractelement <16 x i8> %x, i32 4
117 %tmp10 = insertelement <8 x i8> %tmp8, i8 %tmp9, i32 4
118 %tmp11 = extractelement <16 x i8> %x, i32 5
119 %tmp12 = insertelement <8 x i8> %tmp10, i8 %tmp11, i32 5
120 %tmp13 = extractelement <16 x i8> %x, i32 6
121 %tmp14 = insertelement <8 x i8> %tmp12, i8 %tmp13, i32 6
122 %tmp15 = extractelement <16 x i8> %x, i32 7
123 %tmp16 = insertelement <8 x i8> %tmp14, i8 %tmp15, i32 7
127 define i16 @test_varidx_extract_v2s16(<2 x i16> %x, i32 %idx) {
128 ; CHECK-SDAG-LABEL: test_varidx_extract_v2s16:
129 ; CHECK-SDAG: // %bb.0:
130 ; CHECK-SDAG-NEXT: sub sp, sp, #16
131 ; CHECK-SDAG-NEXT: .cfi_def_cfa_offset 16
132 ; CHECK-SDAG-NEXT: add x8, sp, #8
133 ; CHECK-SDAG-NEXT: // kill: def $w0 killed $w0 def $x0
134 ; CHECK-SDAG-NEXT: str d0, [sp, #8]
135 ; CHECK-SDAG-NEXT: bfi x8, x0, #2, #1
136 ; CHECK-SDAG-NEXT: ldr w0, [x8]
137 ; CHECK-SDAG-NEXT: add sp, sp, #16
138 ; CHECK-SDAG-NEXT: ret
140 ; CHECK-GISEL-LABEL: test_varidx_extract_v2s16:
141 ; CHECK-GISEL: // %bb.0:
142 ; CHECK-GISEL-NEXT: sub sp, sp, #16
143 ; CHECK-GISEL-NEXT: .cfi_def_cfa_offset 16
144 ; CHECK-GISEL-NEXT: // kill: def $d0 killed $d0 def $q0
145 ; CHECK-GISEL-NEXT: mov s1, v0.s[1]
146 ; CHECK-GISEL-NEXT: mov w9, w0
147 ; CHECK-GISEL-NEXT: add x8, sp, #12
148 ; CHECK-GISEL-NEXT: str h0, [sp, #12]
149 ; CHECK-GISEL-NEXT: and x9, x9, #0x1
150 ; CHECK-GISEL-NEXT: str h1, [sp, #14]
151 ; CHECK-GISEL-NEXT: ldrh w0, [x8, x9, lsl #1]
152 ; CHECK-GISEL-NEXT: add sp, sp, #16
153 ; CHECK-GISEL-NEXT: ret
154 %tmp = extractelement <2 x i16> %x, i32 %idx
158 define <2 x i16> @test_varidx_extract_v4s16(<4 x i16> %x, i32 %idx) {
159 ; CHECK-SDAG-LABEL: test_varidx_extract_v4s16:
160 ; CHECK-SDAG: // %bb.0:
161 ; CHECK-SDAG-NEXT: sub sp, sp, #16
162 ; CHECK-SDAG-NEXT: .cfi_def_cfa_offset 16
163 ; CHECK-SDAG-NEXT: add x8, sp, #8
164 ; CHECK-SDAG-NEXT: // kill: def $w0 killed $w0 def $x0
165 ; CHECK-SDAG-NEXT: // kill: def $d0 killed $d0 def $q0
166 ; CHECK-SDAG-NEXT: str d0, [sp, #8]
167 ; CHECK-SDAG-NEXT: umov w9, v0.h[1]
168 ; CHECK-SDAG-NEXT: bfi x8, x0, #1, #2
169 ; CHECK-SDAG-NEXT: ld1 { v0.h }[0], [x8]
170 ; CHECK-SDAG-NEXT: mov v0.s[1], w9
171 ; CHECK-SDAG-NEXT: // kill: def $d0 killed $d0 killed $q0
172 ; CHECK-SDAG-NEXT: add sp, sp, #16
173 ; CHECK-SDAG-NEXT: ret
175 ; CHECK-GISEL-LABEL: test_varidx_extract_v4s16:
176 ; CHECK-GISEL: // %bb.0:
177 ; CHECK-GISEL-NEXT: sub sp, sp, #16
178 ; CHECK-GISEL-NEXT: .cfi_def_cfa_offset 16
179 ; CHECK-GISEL-NEXT: mov w9, w0
180 ; CHECK-GISEL-NEXT: mov w8, #2 // =0x2
181 ; CHECK-GISEL-NEXT: add x10, sp, #8
182 ; CHECK-GISEL-NEXT: and x9, x9, #0x3
183 ; CHECK-GISEL-NEXT: // kill: def $d0 killed $d0 def $q0
184 ; CHECK-GISEL-NEXT: str d0, [sp, #8]
185 ; CHECK-GISEL-NEXT: madd x8, x9, x8, x10
186 ; CHECK-GISEL-NEXT: umov w9, v0.h[1]
187 ; CHECK-GISEL-NEXT: fmov s1, w9
188 ; CHECK-GISEL-NEXT: ldr h0, [x8]
189 ; CHECK-GISEL-NEXT: mov v0.s[1], v1.s[0]
190 ; CHECK-GISEL-NEXT: // kill: def $d0 killed $d0 killed $q0
191 ; CHECK-GISEL-NEXT: add sp, sp, #16
192 ; CHECK-GISEL-NEXT: ret
193 %tmp = extractelement <4 x i16> %x, i32 %idx
194 %tmp2 = insertelement <2 x i16> undef, i16 %tmp, i32 0
195 %tmp3 = extractelement <4 x i16> %x, i32 1
196 %tmp4 = insertelement <2 x i16> %tmp2, i16 %tmp3, i32 1
200 define <4 x i16> @test_varidx_extract_v8s16(<8 x i16> %x, i32 %idx) {
201 ; CHECK-SDAG-LABEL: test_varidx_extract_v8s16:
202 ; CHECK-SDAG: // %bb.0:
203 ; CHECK-SDAG-NEXT: sub sp, sp, #16
204 ; CHECK-SDAG-NEXT: .cfi_def_cfa_offset 16
205 ; CHECK-SDAG-NEXT: mov x8, sp
206 ; CHECK-SDAG-NEXT: // kill: def $w0 killed $w0 def $x0
207 ; CHECK-SDAG-NEXT: str q0, [sp]
208 ; CHECK-SDAG-NEXT: bfi x8, x0, #1, #3
209 ; CHECK-SDAG-NEXT: ldr h1, [x8]
210 ; CHECK-SDAG-NEXT: mov v1.h[1], v0.h[1]
211 ; CHECK-SDAG-NEXT: mov v1.h[2], v0.h[2]
212 ; CHECK-SDAG-NEXT: mov v1.h[3], v0.h[3]
213 ; CHECK-SDAG-NEXT: fmov d0, d1
214 ; CHECK-SDAG-NEXT: add sp, sp, #16
215 ; CHECK-SDAG-NEXT: ret
217 ; CHECK-GISEL-LABEL: test_varidx_extract_v8s16:
218 ; CHECK-GISEL: // %bb.0:
219 ; CHECK-GISEL-NEXT: sub sp, sp, #16
220 ; CHECK-GISEL-NEXT: .cfi_def_cfa_offset 16
221 ; CHECK-GISEL-NEXT: mov w9, w0
222 ; CHECK-GISEL-NEXT: mov h2, v0.h[1]
223 ; CHECK-GISEL-NEXT: mov x8, sp
224 ; CHECK-GISEL-NEXT: str q0, [sp]
225 ; CHECK-GISEL-NEXT: and x9, x9, #0x7
226 ; CHECK-GISEL-NEXT: mov h3, v0.h[2]
227 ; CHECK-GISEL-NEXT: ldr h1, [x8, x9, lsl #1]
228 ; CHECK-GISEL-NEXT: mov h0, v0.h[3]
229 ; CHECK-GISEL-NEXT: mov v1.h[1], v2.h[0]
230 ; CHECK-GISEL-NEXT: mov v1.h[2], v3.h[0]
231 ; CHECK-GISEL-NEXT: mov v1.h[3], v0.h[0]
232 ; CHECK-GISEL-NEXT: fmov d0, d1
233 ; CHECK-GISEL-NEXT: add sp, sp, #16
234 ; CHECK-GISEL-NEXT: ret
235 %tmp = extractelement <8 x i16> %x, i32 %idx
236 %tmp2 = insertelement <4 x i16> undef, i16 %tmp, i32 0
237 %tmp3 = extractelement <8 x i16> %x, i32 1
238 %tmp4 = insertelement <4 x i16> %tmp2, i16 %tmp3, i32 1
239 %tmp5 = extractelement <8 x i16> %x, i32 2
240 %tmp6 = insertelement <4 x i16> %tmp4, i16 %tmp5, i32 2
241 %tmp7 = extractelement <8 x i16> %x, i32 3
242 %tmp8 = insertelement <4 x i16> %tmp6, i16 %tmp7, i32 3
246 define i32 @test_varidx_extract_v2s32(<2 x i32> %x, i32 %idx) {
247 ; CHECK-SDAG-LABEL: test_varidx_extract_v2s32:
248 ; CHECK-SDAG: // %bb.0:
249 ; CHECK-SDAG-NEXT: sub sp, sp, #16
250 ; CHECK-SDAG-NEXT: .cfi_def_cfa_offset 16
251 ; CHECK-SDAG-NEXT: add x8, sp, #8
252 ; CHECK-SDAG-NEXT: // kill: def $w0 killed $w0 def $x0
253 ; CHECK-SDAG-NEXT: str d0, [sp, #8]
254 ; CHECK-SDAG-NEXT: bfi x8, x0, #2, #1
255 ; CHECK-SDAG-NEXT: ldr w0, [x8]
256 ; CHECK-SDAG-NEXT: add sp, sp, #16
257 ; CHECK-SDAG-NEXT: ret
259 ; CHECK-GISEL-LABEL: test_varidx_extract_v2s32:
260 ; CHECK-GISEL: // %bb.0:
261 ; CHECK-GISEL-NEXT: sub sp, sp, #16
262 ; CHECK-GISEL-NEXT: .cfi_def_cfa_offset 16
263 ; CHECK-GISEL-NEXT: mov w9, w0
264 ; CHECK-GISEL-NEXT: add x8, sp, #8
265 ; CHECK-GISEL-NEXT: str d0, [sp, #8]
266 ; CHECK-GISEL-NEXT: and x9, x9, #0x1
267 ; CHECK-GISEL-NEXT: ldr w0, [x8, x9, lsl #2]
268 ; CHECK-GISEL-NEXT: add sp, sp, #16
269 ; CHECK-GISEL-NEXT: ret
270 %tmp = extractelement <2 x i32> %x, i32 %idx
274 define <2 x i32> @test_varidx_extract_v4s32(<4 x i32> %x, i32 %idx) {
275 ; CHECK-SDAG-LABEL: test_varidx_extract_v4s32:
276 ; CHECK-SDAG: // %bb.0:
277 ; CHECK-SDAG-NEXT: sub sp, sp, #16
278 ; CHECK-SDAG-NEXT: .cfi_def_cfa_offset 16
279 ; CHECK-SDAG-NEXT: mov x8, sp
280 ; CHECK-SDAG-NEXT: // kill: def $w0 killed $w0 def $x0
281 ; CHECK-SDAG-NEXT: str q0, [sp]
282 ; CHECK-SDAG-NEXT: bfi x8, x0, #2, #2
283 ; CHECK-SDAG-NEXT: ldr s1, [x8]
284 ; CHECK-SDAG-NEXT: mov v1.s[1], v0.s[1]
285 ; CHECK-SDAG-NEXT: fmov d0, d1
286 ; CHECK-SDAG-NEXT: add sp, sp, #16
287 ; CHECK-SDAG-NEXT: ret
289 ; CHECK-GISEL-LABEL: test_varidx_extract_v4s32:
290 ; CHECK-GISEL: // %bb.0:
291 ; CHECK-GISEL-NEXT: sub sp, sp, #16
292 ; CHECK-GISEL-NEXT: .cfi_def_cfa_offset 16
293 ; CHECK-GISEL-NEXT: mov w9, w0
294 ; CHECK-GISEL-NEXT: mov s1, v0.s[1]
295 ; CHECK-GISEL-NEXT: mov x8, sp
296 ; CHECK-GISEL-NEXT: str q0, [sp]
297 ; CHECK-GISEL-NEXT: and x9, x9, #0x3
298 ; CHECK-GISEL-NEXT: ldr s0, [x8, x9, lsl #2]
299 ; CHECK-GISEL-NEXT: mov v0.s[1], v1.s[0]
300 ; CHECK-GISEL-NEXT: // kill: def $d0 killed $d0 killed $q0
301 ; CHECK-GISEL-NEXT: add sp, sp, #16
302 ; CHECK-GISEL-NEXT: ret
303 %tmp = extractelement <4 x i32> %x, i32 %idx
304 %tmp2 = insertelement <2 x i32> undef, i32 %tmp, i32 0
305 %tmp3 = extractelement <4 x i32> %x, i32 1
306 %tmp4 = insertelement <2 x i32> %tmp2, i32 %tmp3, i32 1
310 define i64 @test_varidx_extract_v2s64(<2 x i64> %x, i32 %idx) {
311 ; CHECK-SDAG-LABEL: test_varidx_extract_v2s64:
312 ; CHECK-SDAG: // %bb.0:
313 ; CHECK-SDAG-NEXT: sub sp, sp, #16
314 ; CHECK-SDAG-NEXT: .cfi_def_cfa_offset 16
315 ; CHECK-SDAG-NEXT: mov x8, sp
316 ; CHECK-SDAG-NEXT: // kill: def $w0 killed $w0 def $x0
317 ; CHECK-SDAG-NEXT: str q0, [sp]
318 ; CHECK-SDAG-NEXT: bfi x8, x0, #3, #1
319 ; CHECK-SDAG-NEXT: ldr x0, [x8]
320 ; CHECK-SDAG-NEXT: add sp, sp, #16
321 ; CHECK-SDAG-NEXT: ret
323 ; CHECK-GISEL-LABEL: test_varidx_extract_v2s64:
324 ; CHECK-GISEL: // %bb.0:
325 ; CHECK-GISEL-NEXT: sub sp, sp, #16
326 ; CHECK-GISEL-NEXT: .cfi_def_cfa_offset 16
327 ; CHECK-GISEL-NEXT: mov w9, w0
328 ; CHECK-GISEL-NEXT: mov x8, sp
329 ; CHECK-GISEL-NEXT: str q0, [sp]
330 ; CHECK-GISEL-NEXT: and x9, x9, #0x1
331 ; CHECK-GISEL-NEXT: ldr x0, [x8, x9, lsl #3]
332 ; CHECK-GISEL-NEXT: add sp, sp, #16
333 ; CHECK-GISEL-NEXT: ret
334 %tmp = extractelement <2 x i64> %x, i32 %idx
338 define ptr @test_varidx_extract_v2p0(<2 x ptr> %x, i32 %idx) {
339 ; CHECK-SDAG-LABEL: test_varidx_extract_v2p0:
340 ; CHECK-SDAG: // %bb.0:
341 ; CHECK-SDAG-NEXT: sub sp, sp, #16
342 ; CHECK-SDAG-NEXT: .cfi_def_cfa_offset 16
343 ; CHECK-SDAG-NEXT: mov x8, sp
344 ; CHECK-SDAG-NEXT: // kill: def $w0 killed $w0 def $x0
345 ; CHECK-SDAG-NEXT: str q0, [sp]
346 ; CHECK-SDAG-NEXT: bfi x8, x0, #3, #1
347 ; CHECK-SDAG-NEXT: ldr x0, [x8]
348 ; CHECK-SDAG-NEXT: add sp, sp, #16
349 ; CHECK-SDAG-NEXT: ret
351 ; CHECK-GISEL-LABEL: test_varidx_extract_v2p0:
352 ; CHECK-GISEL: // %bb.0:
353 ; CHECK-GISEL-NEXT: sub sp, sp, #16
354 ; CHECK-GISEL-NEXT: .cfi_def_cfa_offset 16
355 ; CHECK-GISEL-NEXT: mov w9, w0
356 ; CHECK-GISEL-NEXT: mov x8, sp
357 ; CHECK-GISEL-NEXT: str q0, [sp]
358 ; CHECK-GISEL-NEXT: and x9, x9, #0x1
359 ; CHECK-GISEL-NEXT: ldr x0, [x8, x9, lsl #3]
360 ; CHECK-GISEL-NEXT: add sp, sp, #16
361 ; CHECK-GISEL-NEXT: ret
362 %tmp = extractelement <2 x ptr> %x, i32 %idx