[RISCV] Add shrinkwrap test cases showing gaps in current impl
[llvm-project.git] / llvm / test / CodeGen / AArch64 / arm64-extract-insert-varidx.ll
blob7a4cdd52db904aae2140c8411406bbab14d49a3b
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 -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:    mov b1, v0.b[1]
33 ; CHECK-GISEL-NEXT:    add x8, sp, #8
34 ; CHECK-GISEL-NEXT:    and x9, x9, #0x7
35 ; CHECK-GISEL-NEXT:    str d0, [sp, #8]
36 ; CHECK-GISEL-NEXT:    mov b2, 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 w9, s1
42 ; CHECK-GISEL-NEXT:    fmov s1, w8
43 ; CHECK-GISEL-NEXT:    fmov w8, s2
44 ; CHECK-GISEL-NEXT:    mov v1.h[1], w9
45 ; CHECK-GISEL-NEXT:    mov v1.h[2], w8
46 ; CHECK-GISEL-NEXT:    fmov w8, s0
47 ; CHECK-GISEL-NEXT:    mov v1.h[3], w8
48 ; CHECK-GISEL-NEXT:    fmov d0, d1
49 ; CHECK-GISEL-NEXT:    add sp, sp, #16
50 ; CHECK-GISEL-NEXT:    ret
51   %tmp = extractelement <8 x i8> %x, i32 %idx
52   %tmp2 = insertelement <4 x i8> undef, i8 %tmp, i32 0
53   %tmp3 = extractelement <8 x i8> %x, i32 1
54   %tmp4 = insertelement <4 x i8> %tmp2, i8 %tmp3, i32 1
55   %tmp5 = extractelement <8 x i8> %x, i32 2
56   %tmp6 = insertelement <4 x i8> %tmp4, i8 %tmp5, i32 2
57   %tmp7 = extractelement <8 x i8> %x, i32 3
58   %tmp8 = insertelement <4 x i8> %tmp6, i8 %tmp7, i32 3
59   ret <4 x i8> %tmp8
62 define <8 x i8> @test_varidx_extract_v16s8(<16 x i8> %x, i32 %idx) {
63 ; CHECK-SDAG-LABEL: test_varidx_extract_v16s8:
64 ; CHECK-SDAG:       // %bb.0:
65 ; CHECK-SDAG-NEXT:    sub sp, sp, #16
66 ; CHECK-SDAG-NEXT:    .cfi_def_cfa_offset 16
67 ; CHECK-SDAG-NEXT:    mov x8, sp
68 ; CHECK-SDAG-NEXT:    // kill: def $w0 killed $w0 def $x0
69 ; CHECK-SDAG-NEXT:    str q0, [sp]
70 ; CHECK-SDAG-NEXT:    bfxil x8, x0, #0, #4
71 ; CHECK-SDAG-NEXT:    ldr b1, [x8]
72 ; CHECK-SDAG-NEXT:    mov v1.b[1], v0.b[1]
73 ; CHECK-SDAG-NEXT:    mov v1.b[2], v0.b[2]
74 ; CHECK-SDAG-NEXT:    mov v1.b[3], v0.b[3]
75 ; CHECK-SDAG-NEXT:    mov v1.b[4], v0.b[4]
76 ; CHECK-SDAG-NEXT:    mov v1.b[5], v0.b[5]
77 ; CHECK-SDAG-NEXT:    mov v1.b[6], v0.b[6]
78 ; CHECK-SDAG-NEXT:    mov v1.b[7], v0.b[7]
79 ; CHECK-SDAG-NEXT:    fmov d0, d1
80 ; CHECK-SDAG-NEXT:    add sp, sp, #16
81 ; CHECK-SDAG-NEXT:    ret
83 ; CHECK-GISEL-LABEL: test_varidx_extract_v16s8:
84 ; CHECK-GISEL:       // %bb.0:
85 ; CHECK-GISEL-NEXT:    sub sp, sp, #16
86 ; CHECK-GISEL-NEXT:    .cfi_def_cfa_offset 16
87 ; CHECK-GISEL-NEXT:    mov w9, w0
88 ; CHECK-GISEL-NEXT:    mov x8, sp
89 ; CHECK-GISEL-NEXT:    str q0, [sp]
90 ; CHECK-GISEL-NEXT:    and x9, x9, #0xf
91 ; CHECK-GISEL-NEXT:    mov b2, v0.b[1]
92 ; CHECK-GISEL-NEXT:    mov b3, v0.b[2]
93 ; CHECK-GISEL-NEXT:    lsl x10, x9, #1
94 ; CHECK-GISEL-NEXT:    sub x9, x10, x9
95 ; CHECK-GISEL-NEXT:    ldr b1, [x8, x9]
96 ; CHECK-GISEL-NEXT:    mov v1.b[0], v1.b[0]
97 ; CHECK-GISEL-NEXT:    mov v1.b[1], v2.b[0]
98 ; CHECK-GISEL-NEXT:    mov b2, v0.b[3]
99 ; CHECK-GISEL-NEXT:    mov v1.b[2], v3.b[0]
100 ; CHECK-GISEL-NEXT:    mov b3, v0.b[4]
101 ; CHECK-GISEL-NEXT:    mov v1.b[3], v2.b[0]
102 ; CHECK-GISEL-NEXT:    mov b2, v0.b[5]
103 ; CHECK-GISEL-NEXT:    mov v1.b[4], v3.b[0]
104 ; CHECK-GISEL-NEXT:    mov b3, v0.b[6]
105 ; CHECK-GISEL-NEXT:    mov b0, v0.b[7]
106 ; CHECK-GISEL-NEXT:    mov v1.b[5], v2.b[0]
107 ; CHECK-GISEL-NEXT:    mov v1.b[6], v3.b[0]
108 ; CHECK-GISEL-NEXT:    mov v1.b[7], v0.b[0]
109 ; CHECK-GISEL-NEXT:    fmov d0, d1
110 ; CHECK-GISEL-NEXT:    add sp, sp, #16
111 ; CHECK-GISEL-NEXT:    ret
112   %tmp = extractelement <16 x i8> %x, i32 %idx
113   %tmp2 = insertelement <8 x i8> undef, i8 %tmp, i32 0
114   %tmp3 = extractelement <16 x i8> %x, i32 1
115   %tmp4 = insertelement <8 x i8> %tmp2, i8 %tmp3, i32 1
116   %tmp5 = extractelement <16 x i8> %x, i32 2
117   %tmp6 = insertelement <8 x i8> %tmp4, i8 %tmp5, i32 2
118   %tmp7 = extractelement <16 x i8> %x, i32 3
119   %tmp8 = insertelement <8 x i8> %tmp6, i8 %tmp7, i32 3
120   %tmp9 = extractelement <16 x i8> %x, i32 4
121   %tmp10 = insertelement <8 x i8> %tmp8, i8 %tmp9, i32 4
122   %tmp11 = extractelement <16 x i8> %x, i32 5
123   %tmp12 = insertelement <8 x i8> %tmp10, i8 %tmp11, i32 5
124   %tmp13 = extractelement <16 x i8> %x, i32 6
125   %tmp14 = insertelement <8 x i8> %tmp12, i8 %tmp13, i32 6
126   %tmp15 = extractelement <16 x i8> %x, i32 7
127   %tmp16 = insertelement <8 x i8> %tmp14, i8 %tmp15, i32 7
128   ret <8 x i8> %tmp16
131 define i16 @test_varidx_extract_v2s16(<2 x i16> %x, i32 %idx) {
132 ; CHECK-SDAG-LABEL: test_varidx_extract_v2s16:
133 ; CHECK-SDAG:       // %bb.0:
134 ; CHECK-SDAG-NEXT:    sub sp, sp, #16
135 ; CHECK-SDAG-NEXT:    .cfi_def_cfa_offset 16
136 ; CHECK-SDAG-NEXT:    add x8, sp, #8
137 ; CHECK-SDAG-NEXT:    // kill: def $w0 killed $w0 def $x0
138 ; CHECK-SDAG-NEXT:    str d0, [sp, #8]
139 ; CHECK-SDAG-NEXT:    bfi x8, x0, #2, #1
140 ; CHECK-SDAG-NEXT:    ldr w0, [x8]
141 ; CHECK-SDAG-NEXT:    add sp, sp, #16
142 ; CHECK-SDAG-NEXT:    ret
144 ; CHECK-GISEL-LABEL: test_varidx_extract_v2s16:
145 ; CHECK-GISEL:       // %bb.0:
146 ; CHECK-GISEL-NEXT:    sub sp, sp, #16
147 ; CHECK-GISEL-NEXT:    .cfi_def_cfa_offset 16
148 ; CHECK-GISEL-NEXT:    // kill: def $d0 killed $d0 def $q0
149 ; CHECK-GISEL-NEXT:    mov s1, v0.s[1]
150 ; CHECK-GISEL-NEXT:    mov w9, w0
151 ; CHECK-GISEL-NEXT:    add x8, sp, #12
152 ; CHECK-GISEL-NEXT:    str h0, [sp, #12]
153 ; CHECK-GISEL-NEXT:    and x9, x9, #0x1
154 ; CHECK-GISEL-NEXT:    str h1, [sp, #14]
155 ; CHECK-GISEL-NEXT:    ldrh w0, [x8, x9, lsl #1]
156 ; CHECK-GISEL-NEXT:    add sp, sp, #16
157 ; CHECK-GISEL-NEXT:    ret
158   %tmp = extractelement <2 x i16> %x, i32 %idx
159   ret i16 %tmp
162 define <2 x i16> @test_varidx_extract_v4s16(<4 x i16> %x, i32 %idx) {
163 ; CHECK-SDAG-LABEL: test_varidx_extract_v4s16:
164 ; CHECK-SDAG:       // %bb.0:
165 ; CHECK-SDAG-NEXT:    sub sp, sp, #16
166 ; CHECK-SDAG-NEXT:    .cfi_def_cfa_offset 16
167 ; CHECK-SDAG-NEXT:    add x8, sp, #8
168 ; CHECK-SDAG-NEXT:    // kill: def $w0 killed $w0 def $x0
169 ; CHECK-SDAG-NEXT:    // kill: def $d0 killed $d0 def $q0
170 ; CHECK-SDAG-NEXT:    str d0, [sp, #8]
171 ; CHECK-SDAG-NEXT:    umov w9, v0.h[1]
172 ; CHECK-SDAG-NEXT:    bfi x8, x0, #1, #2
173 ; CHECK-SDAG-NEXT:    ld1 { v0.h }[0], [x8]
174 ; CHECK-SDAG-NEXT:    mov v0.s[1], w9
175 ; CHECK-SDAG-NEXT:    // kill: def $d0 killed $d0 killed $q0
176 ; CHECK-SDAG-NEXT:    add sp, sp, #16
177 ; CHECK-SDAG-NEXT:    ret
179 ; CHECK-GISEL-LABEL: test_varidx_extract_v4s16:
180 ; CHECK-GISEL:       // %bb.0:
181 ; CHECK-GISEL-NEXT:    sub sp, sp, #16
182 ; CHECK-GISEL-NEXT:    .cfi_def_cfa_offset 16
183 ; CHECK-GISEL-NEXT:    mov w9, w0
184 ; CHECK-GISEL-NEXT:    mov w8, #2 // =0x2
185 ; CHECK-GISEL-NEXT:    add x10, sp, #8
186 ; CHECK-GISEL-NEXT:    and x9, x9, #0x3
187 ; CHECK-GISEL-NEXT:    // kill: def $d0 killed $d0 def $q0
188 ; CHECK-GISEL-NEXT:    str d0, [sp, #8]
189 ; CHECK-GISEL-NEXT:    madd x8, x9, x8, x10
190 ; CHECK-GISEL-NEXT:    umov w9, v0.h[1]
191 ; CHECK-GISEL-NEXT:    ld1 { v0.h }[0], [x8]
192 ; CHECK-GISEL-NEXT:    mov v0.s[1], w9
193 ; CHECK-GISEL-NEXT:    // kill: def $d0 killed $d0 killed $q0
194 ; CHECK-GISEL-NEXT:    add sp, sp, #16
195 ; CHECK-GISEL-NEXT:    ret
196   %tmp = extractelement <4 x i16> %x, i32 %idx
197   %tmp2 = insertelement <2 x i16> undef, i16 %tmp, i32 0
198   %tmp3 = extractelement <4 x i16> %x, i32 1
199   %tmp4 = insertelement <2 x i16> %tmp2, i16 %tmp3, i32 1
200   ret <2 x i16> %tmp4
203 define <4 x i16> @test_varidx_extract_v8s16(<8 x i16> %x, i32 %idx) {
204 ; CHECK-SDAG-LABEL: test_varidx_extract_v8s16:
205 ; CHECK-SDAG:       // %bb.0:
206 ; CHECK-SDAG-NEXT:    sub sp, sp, #16
207 ; CHECK-SDAG-NEXT:    .cfi_def_cfa_offset 16
208 ; CHECK-SDAG-NEXT:    mov x8, sp
209 ; CHECK-SDAG-NEXT:    // kill: def $w0 killed $w0 def $x0
210 ; CHECK-SDAG-NEXT:    str q0, [sp]
211 ; CHECK-SDAG-NEXT:    bfi x8, x0, #1, #3
212 ; CHECK-SDAG-NEXT:    ldr h1, [x8]
213 ; CHECK-SDAG-NEXT:    mov v1.h[1], v0.h[1]
214 ; CHECK-SDAG-NEXT:    mov v1.h[2], v0.h[2]
215 ; CHECK-SDAG-NEXT:    mov v1.h[3], v0.h[3]
216 ; CHECK-SDAG-NEXT:    fmov d0, d1
217 ; CHECK-SDAG-NEXT:    add sp, sp, #16
218 ; CHECK-SDAG-NEXT:    ret
220 ; CHECK-GISEL-LABEL: test_varidx_extract_v8s16:
221 ; CHECK-GISEL:       // %bb.0:
222 ; CHECK-GISEL-NEXT:    sub sp, sp, #16
223 ; CHECK-GISEL-NEXT:    .cfi_def_cfa_offset 16
224 ; CHECK-GISEL-NEXT:    mov w9, w0
225 ; CHECK-GISEL-NEXT:    mov x8, sp
226 ; CHECK-GISEL-NEXT:    str q0, [sp]
227 ; CHECK-GISEL-NEXT:    and x9, x9, #0x7
228 ; CHECK-GISEL-NEXT:    ldr h1, [x8, x9, lsl #1]
229 ; CHECK-GISEL-NEXT:    mov v1.h[1], v0.h[1]
230 ; CHECK-GISEL-NEXT:    mov v1.h[2], v0.h[2]
231 ; CHECK-GISEL-NEXT:    mov v1.h[3], v0.h[3]
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
243   ret <4 x i16> %tmp8
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
271   ret i32 %tmp
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 x8, sp
295 ; CHECK-GISEL-NEXT:    str q0, [sp]
296 ; CHECK-GISEL-NEXT:    and x9, x9, #0x3
297 ; CHECK-GISEL-NEXT:    ldr s1, [x8, x9, lsl #2]
298 ; CHECK-GISEL-NEXT:    mov v1.s[1], v0.s[1]
299 ; CHECK-GISEL-NEXT:    fmov d0, d1
300 ; CHECK-GISEL-NEXT:    add sp, sp, #16
301 ; CHECK-GISEL-NEXT:    ret
302   %tmp = extractelement <4 x i32> %x, i32 %idx
303   %tmp2 = insertelement <2 x i32> undef, i32 %tmp, i32 0
304   %tmp3 = extractelement <4 x i32> %x, i32 1
305   %tmp4 = insertelement <2 x i32> %tmp2, i32 %tmp3, i32 1
306   ret <2 x i32> %tmp4
309 define i64 @test_varidx_extract_v2s64(<2 x i64> %x, i32 %idx) {
310 ; CHECK-SDAG-LABEL: test_varidx_extract_v2s64:
311 ; CHECK-SDAG:       // %bb.0:
312 ; CHECK-SDAG-NEXT:    sub sp, sp, #16
313 ; CHECK-SDAG-NEXT:    .cfi_def_cfa_offset 16
314 ; CHECK-SDAG-NEXT:    mov x8, sp
315 ; CHECK-SDAG-NEXT:    // kill: def $w0 killed $w0 def $x0
316 ; CHECK-SDAG-NEXT:    str q0, [sp]
317 ; CHECK-SDAG-NEXT:    bfi x8, x0, #3, #1
318 ; CHECK-SDAG-NEXT:    ldr x0, [x8]
319 ; CHECK-SDAG-NEXT:    add sp, sp, #16
320 ; CHECK-SDAG-NEXT:    ret
322 ; CHECK-GISEL-LABEL: test_varidx_extract_v2s64:
323 ; CHECK-GISEL:       // %bb.0:
324 ; CHECK-GISEL-NEXT:    sub sp, sp, #16
325 ; CHECK-GISEL-NEXT:    .cfi_def_cfa_offset 16
326 ; CHECK-GISEL-NEXT:    mov w9, w0
327 ; CHECK-GISEL-NEXT:    mov x8, sp
328 ; CHECK-GISEL-NEXT:    str q0, [sp]
329 ; CHECK-GISEL-NEXT:    and x9, x9, #0x1
330 ; CHECK-GISEL-NEXT:    ldr x0, [x8, x9, lsl #3]
331 ; CHECK-GISEL-NEXT:    add sp, sp, #16
332 ; CHECK-GISEL-NEXT:    ret
333   %tmp = extractelement <2 x i64> %x, i32 %idx
334   ret i64 %tmp
337 define ptr @test_varidx_extract_v2p0(<2 x ptr> %x, i32 %idx) {
338 ; CHECK-SDAG-LABEL: test_varidx_extract_v2p0:
339 ; CHECK-SDAG:       // %bb.0:
340 ; CHECK-SDAG-NEXT:    sub sp, sp, #16
341 ; CHECK-SDAG-NEXT:    .cfi_def_cfa_offset 16
342 ; CHECK-SDAG-NEXT:    mov x8, sp
343 ; CHECK-SDAG-NEXT:    // kill: def $w0 killed $w0 def $x0
344 ; CHECK-SDAG-NEXT:    str q0, [sp]
345 ; CHECK-SDAG-NEXT:    bfi x8, x0, #3, #1
346 ; CHECK-SDAG-NEXT:    ldr x0, [x8]
347 ; CHECK-SDAG-NEXT:    add sp, sp, #16
348 ; CHECK-SDAG-NEXT:    ret
350 ; CHECK-GISEL-LABEL: test_varidx_extract_v2p0:
351 ; CHECK-GISEL:       // %bb.0:
352 ; CHECK-GISEL-NEXT:    sub sp, sp, #16
353 ; CHECK-GISEL-NEXT:    .cfi_def_cfa_offset 16
354 ; CHECK-GISEL-NEXT:    mov w9, w0
355 ; CHECK-GISEL-NEXT:    mov x8, sp
356 ; CHECK-GISEL-NEXT:    str q0, [sp]
357 ; CHECK-GISEL-NEXT:    and x9, x9, #0x1
358 ; CHECK-GISEL-NEXT:    ldr x0, [x8, x9, lsl #3]
359 ; CHECK-GISEL-NEXT:    add sp, sp, #16
360 ; CHECK-GISEL-NEXT:    ret
361   %tmp = extractelement <2 x ptr> %x, i32 %idx
362   ret ptr %tmp