Fix undefined behavior in vector shift tests.
[oota-llvm.git] / test / CodeGen / X86 / anyregcc.ll
1 ; RUN: llc < %s -mtriple=x86_64-apple-darwin                  -disable-fp-elim | FileCheck %s
2 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7     -disable-fp-elim | FileCheck --check-prefix=SSE %s
3 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=corei7-avx -disable-fp-elim | FileCheck --check-prefix=AVX %s
4
5
6 ; Stackmap Header: no constants - 6 callsites
7 ; CHECK-LABEL:  .section __LLVM_STACKMAPS,__llvm_stackmaps
8 ; CHECK-NEXT:   __LLVM_StackMaps:
9 ; Header
10 ; CHECK-NEXT:   .long 0
11 ; Num Functions
12 ; CHECK-NEXT:   .long 8
13 ; CHECK-NEXT:   .long _test
14 ; CHECK-NEXT:   .long 8
15 ; CHECK-NEXT:   .long _property_access1
16 ; CHECK-NEXT:   .long 8
17 ; CHECK-NEXT:   .long _property_access2
18 ; CHECK-NEXT:   .long 24
19 ; CHECK-NEXT:   .long _property_access3
20 ; CHECK-NEXT:   .long 24
21 ; CHECK-NEXT:   .long _anyreg_test1
22 ; CHECK-NEXT:   .long 56
23 ; CHECK-NEXT:   .long _anyreg_test2
24 ; CHECK-NEXT:   .long 56
25 ; CHECK-NEXT:   .long _patchpoint_spilldef
26 ; CHECK-NEXT:   .long 56
27 ; CHECK-NEXT:   .long _patchpoint_spillargs
28 ; CHECK-NEXT:   .long 88
29 ; Num Constants
30 ; CHECK-NEXT:   .long   0
31 ; Num Callsites
32 ; CHECK-NEXT:   .long   8
33
34 ; test
35 ; CHECK-LABEL:  .long   L{{.*}}-_test
36 ; CHECK-NEXT:   .short  0
37 ; 3 locations
38 ; CHECK-NEXT:   .short  3
39 ; Loc 0: Register
40 ; CHECK-NEXT:   .byte 1
41 ; CHECK-NEXT:   .byte 4
42 ; CHECK-NEXT:   .short {{[0-9]+}}
43 ; CHECK-NEXT:   .long 0
44 ; Loc 1: Register
45 ; CHECK-NEXT:   .byte 1
46 ; CHECK-NEXT:   .byte 4
47 ; CHECK-NEXT:   .short {{[0-9]+}}
48 ; CHECK-NEXT:   .long 0
49 ; Loc 2: Constant 3
50 ; CHECK-NEXT:   .byte 4
51 ; CHECK-NEXT:   .byte 8
52 ; CHECK-NEXT:   .short  0
53 ; CHECK-NEXT:   .long 3
54 define i64 @test() nounwind ssp uwtable {
55 entry:
56   call anyregcc void (i64, i32, i8*, i32, ...)* @llvm.experimental.patchpoint.void(i64 0, i32 15, i8* null, i32 2, i32 1, i32 2, i64 3)
57   ret i64 0
58 }
59
60 ; property access 1 - %obj is an anyreg call argument and should therefore be in a register
61 ; CHECK-LABEL:  .long   L{{.*}}-_property_access1
62 ; CHECK-NEXT:   .short  0
63 ; 2 locations
64 ; CHECK-NEXT:   .short  2
65 ; Loc 0: Register <-- this is the return register
66 ; CHECK-NEXT:   .byte 1
67 ; CHECK-NEXT:   .byte 8
68 ; CHECK-NEXT:   .short {{[0-9]+}}
69 ; CHECK-NEXT:   .long 0
70 ; Loc 1: Register
71 ; CHECK-NEXT:   .byte 1
72 ; CHECK-NEXT:   .byte 8
73 ; CHECK-NEXT:   .short {{[0-9]+}}
74 ; CHECK-NEXT:   .long 0
75 define i64 @property_access1(i8* %obj) nounwind ssp uwtable {
76 entry:
77   %f = inttoptr i64 12297829382473034410 to i8*
78   %ret = call anyregcc i64 (i64, i32, i8*, i32, ...)* @llvm.experimental.patchpoint.i64(i64 1, i32 15, i8* %f, i32 1, i8* %obj)
79   ret i64 %ret
80 }
81
82 ; property access 2 - %obj is an anyreg call argument and should therefore be in a register
83 ; CHECK-LABEL:  .long   L{{.*}}-_property_access2
84 ; CHECK-NEXT:   .short  0
85 ; 2 locations
86 ; CHECK-NEXT:   .short  2
87 ; Loc 0: Register <-- this is the return register
88 ; CHECK-NEXT:   .byte 1
89 ; CHECK-NEXT:   .byte 8
90 ; CHECK-NEXT:   .short {{[0-9]+}}
91 ; CHECK-NEXT:   .long 0
92 ; Loc 1: Register
93 ; CHECK-NEXT:   .byte 1
94 ; CHECK-NEXT:   .byte 8
95 ; CHECK-NEXT:   .short {{[0-9]+}}
96 ; CHECK-NEXT:   .long 0
97 define i64 @property_access2() nounwind ssp uwtable {
98 entry:
99   %obj = alloca i64, align 8
100   %f = inttoptr i64 12297829382473034410 to i8*
101   %ret = call anyregcc i64 (i64, i32, i8*, i32, ...)* @llvm.experimental.patchpoint.i64(i64 2, i32 15, i8* %f, i32 1, i64* %obj)
102   ret i64 %ret
103 }
104
105 ; property access 3 - %obj is a frame index
106 ; CHECK-LABEL:  .long   L{{.*}}-_property_access3
107 ; CHECK-NEXT:   .short  0
108 ; 2 locations
109 ; CHECK-NEXT:   .short  2
110 ; Loc 0: Register <-- this is the return register
111 ; CHECK-NEXT:   .byte 1
112 ; CHECK-NEXT:   .byte 8
113 ; CHECK-NEXT:   .short {{[0-9]+}}
114 ; CHECK-NEXT:   .long 0
115 ; Loc 1: Direct RBP - ofs
116 ; CHECK-NEXT:   .byte 2
117 ; CHECK-NEXT:   .byte 8
118 ; CHECK-NEXT:   .short 6
119 ; CHECK-NEXT:   .long
120 define i64 @property_access3() nounwind ssp uwtable {
121 entry:
122   %obj = alloca i64, align 8
123   %f = inttoptr i64 12297829382473034410 to i8*
124   %ret = call anyregcc i64 (i64, i32, i8*, i32, ...)* @llvm.experimental.patchpoint.i64(i64 3, i32 15, i8* %f, i32 0, i64* %obj)
125   ret i64 %ret
126 }
127
128 ; anyreg_test1
129 ; CHECK-LABEL:  .long   L{{.*}}-_anyreg_test1
130 ; CHECK-NEXT:   .short  0
131 ; 14 locations
132 ; CHECK-NEXT:   .short  14
133 ; Loc 0: Register <-- this is the return register
134 ; CHECK-NEXT:   .byte 1
135 ; CHECK-NEXT:   .byte 8
136 ; CHECK-NEXT:   .short {{[0-9]+}}
137 ; CHECK-NEXT:   .long 0
138 ; Loc 1: Register
139 ; CHECK-NEXT:   .byte 1
140 ; CHECK-NEXT:   .byte 8
141 ; CHECK-NEXT:   .short {{[0-9]+}}
142 ; CHECK-NEXT:   .long 0
143 ; Loc 2: Register
144 ; CHECK-NEXT:   .byte 1
145 ; CHECK-NEXT:   .byte 8
146 ; CHECK-NEXT:   .short {{[0-9]+}}
147 ; CHECK-NEXT:   .long 0
148 ; Loc 3: Register
149 ; CHECK-NEXT:   .byte 1
150 ; CHECK-NEXT:   .byte 8
151 ; CHECK-NEXT:   .short {{[0-9]+}}
152 ; CHECK-NEXT:   .long 0
153 ; Loc 4: Register
154 ; CHECK-NEXT:   .byte 1
155 ; CHECK-NEXT:   .byte 8
156 ; CHECK-NEXT:   .short {{[0-9]+}}
157 ; CHECK-NEXT:   .long 0
158 ; Loc 5: Register
159 ; CHECK-NEXT:   .byte 1
160 ; CHECK-NEXT:   .byte 8
161 ; CHECK-NEXT:   .short {{[0-9]+}}
162 ; CHECK-NEXT:   .long 0
163 ; Loc 6: Register
164 ; CHECK-NEXT:   .byte 1
165 ; CHECK-NEXT:   .byte 8
166 ; CHECK-NEXT:   .short {{[0-9]+}}
167 ; CHECK-NEXT:   .long 0
168 ; Loc 7: Register
169 ; CHECK-NEXT:   .byte 1
170 ; CHECK-NEXT:   .byte 8
171 ; CHECK-NEXT:   .short {{[0-9]+}}
172 ; CHECK-NEXT:   .long 0
173 ; Loc 8: Register
174 ; CHECK-NEXT:   .byte 1
175 ; CHECK-NEXT:   .byte 8
176 ; CHECK-NEXT:   .short {{[0-9]+}}
177 ; CHECK-NEXT:   .long 0
178 ; Loc 9: Register
179 ; CHECK-NEXT:   .byte 1
180 ; CHECK-NEXT:   .byte 8
181 ; CHECK-NEXT:   .short {{[0-9]+}}
182 ; CHECK-NEXT:   .long 0
183 ; Loc 10: Register
184 ; CHECK-NEXT:   .byte 1
185 ; CHECK-NEXT:   .byte 8
186 ; CHECK-NEXT:   .short {{[0-9]+}}
187 ; CHECK-NEXT:   .long 0
188 ; Loc 11: Register
189 ; CHECK-NEXT:   .byte 1
190 ; CHECK-NEXT:   .byte 8
191 ; CHECK-NEXT:   .short {{[0-9]+}}
192 ; CHECK-NEXT:   .long 0
193 ; Loc 12: Register
194 ; CHECK-NEXT:   .byte 1
195 ; CHECK-NEXT:   .byte 8
196 ; CHECK-NEXT:   .short {{[0-9]+}}
197 ; CHECK-NEXT:   .long 0
198 ; Loc 13: Register
199 ; CHECK-NEXT:   .byte 1
200 ; CHECK-NEXT:   .byte 8
201 ; CHECK-NEXT:   .short {{[0-9]+}}
202 ; CHECK-NEXT:   .long 0
203 define i64 @anyreg_test1(i8* %a1, i8* %a2, i8* %a3, i8* %a4, i8* %a5, i8* %a6, i8* %a7, i8* %a8, i8* %a9, i8* %a10, i8* %a11, i8* %a12, i8* %a13) nounwind ssp uwtable {
204 entry:
205   %f = inttoptr i64 12297829382473034410 to i8*
206   %ret = call anyregcc i64 (i64, i32, i8*, i32, ...)* @llvm.experimental.patchpoint.i64(i64 4, i32 15, i8* %f, i32 13, i8* %a1, i8* %a2, i8* %a3, i8* %a4, i8* %a5, i8* %a6, i8* %a7, i8* %a8, i8* %a9, i8* %a10, i8* %a11, i8* %a12, i8* %a13)
207   ret i64 %ret
208 }
209
210 ; anyreg_test2
211 ; CHECK-LABEL:  .long   L{{.*}}-_anyreg_test2
212 ; CHECK-NEXT:   .short  0
213 ; 14 locations
214 ; CHECK-NEXT:   .short  14
215 ; Loc 0: Register <-- this is the return register
216 ; CHECK-NEXT:   .byte 1
217 ; CHECK-NEXT:   .byte 8
218 ; CHECK-NEXT:   .short {{[0-9]+}}
219 ; CHECK-NEXT:   .long 0
220 ; Loc 1: Register
221 ; CHECK-NEXT:   .byte 1
222 ; CHECK-NEXT:   .byte 8
223 ; CHECK-NEXT:   .short {{[0-9]+}}
224 ; CHECK-NEXT:   .long 0
225 ; Loc 2: Register
226 ; CHECK-NEXT:   .byte 1
227 ; CHECK-NEXT:   .byte 8
228 ; CHECK-NEXT:   .short {{[0-9]+}}
229 ; CHECK-NEXT:   .long 0
230 ; Loc 3: Register
231 ; CHECK-NEXT:   .byte 1
232 ; CHECK-NEXT:   .byte 8
233 ; CHECK-NEXT:   .short {{[0-9]+}}
234 ; CHECK-NEXT:   .long 0
235 ; Loc 4: Register
236 ; CHECK-NEXT:   .byte 1
237 ; CHECK-NEXT:   .byte 8
238 ; CHECK-NEXT:   .short {{[0-9]+}}
239 ; CHECK-NEXT:   .long 0
240 ; Loc 5: Register
241 ; CHECK-NEXT:   .byte 1
242 ; CHECK-NEXT:   .byte 8
243 ; CHECK-NEXT:   .short {{[0-9]+}}
244 ; CHECK-NEXT:   .long 0
245 ; Loc 6: Register
246 ; CHECK-NEXT:   .byte 1
247 ; CHECK-NEXT:   .byte 8
248 ; CHECK-NEXT:   .short {{[0-9]+}}
249 ; CHECK-NEXT:   .long 0
250 ; Loc 7: Register
251 ; CHECK-NEXT:   .byte 1
252 ; CHECK-NEXT:   .byte 8
253 ; CHECK-NEXT:   .short {{[0-9]+}}
254 ; CHECK-NEXT:   .long 0
255 ; Loc 8: Register
256 ; CHECK-NEXT:   .byte 1
257 ; CHECK-NEXT:   .byte 8
258 ; CHECK-NEXT:   .short {{[0-9]+}}
259 ; CHECK-NEXT:   .long 0
260 ; Loc 9: Register
261 ; CHECK-NEXT:   .byte 1
262 ; CHECK-NEXT:   .byte 8
263 ; CHECK-NEXT:   .short {{[0-9]+}}
264 ; CHECK-NEXT:   .long 0
265 ; Loc 10: Register
266 ; CHECK-NEXT:   .byte 1
267 ; CHECK-NEXT:   .byte 8
268 ; CHECK-NEXT:   .short {{[0-9]+}}
269 ; CHECK-NEXT:   .long 0
270 ; Loc 11: Register
271 ; CHECK-NEXT:   .byte 1
272 ; CHECK-NEXT:   .byte 8
273 ; CHECK-NEXT:   .short {{[0-9]+}}
274 ; CHECK-NEXT:   .long 0
275 ; Loc 12: Register
276 ; CHECK-NEXT:   .byte 1
277 ; CHECK-NEXT:   .byte 8
278 ; CHECK-NEXT:   .short {{[0-9]+}}
279 ; CHECK-NEXT:   .long 0
280 ; Loc 13: Register
281 ; CHECK-NEXT:   .byte 1
282 ; CHECK-NEXT:   .byte 8
283 ; CHECK-NEXT:   .short {{[0-9]+}}
284 ; CHECK-NEXT:   .long 0
285 define i64 @anyreg_test2(i8* %a1, i8* %a2, i8* %a3, i8* %a4, i8* %a5, i8* %a6, i8* %a7, i8* %a8, i8* %a9, i8* %a10, i8* %a11, i8* %a12, i8* %a13) nounwind ssp uwtable {
286 entry:
287   %f = inttoptr i64 12297829382473034410 to i8*
288   %ret = call anyregcc i64 (i64, i32, i8*, i32, ...)* @llvm.experimental.patchpoint.i64(i64 5, i32 15, i8* %f, i32 8, i8* %a1, i8* %a2, i8* %a3, i8* %a4, i8* %a5, i8* %a6, i8* %a7, i8* %a8, i8* %a9, i8* %a10, i8* %a11, i8* %a12, i8* %a13)
289   ret i64 %ret
290 }
291
292 ; Test spilling the return value of an anyregcc call.
293 ;
294 ; <rdar://problem/15432754> [JS] Assertion: "Folded a def to a non-store!"
295 ;
296 ; CHECK-LABEL: .long L{{.*}}-_patchpoint_spilldef
297 ; CHECK-NEXT: .short 0
298 ; CHECK-NEXT: .short 3
299 ; Loc 0: Register (some register that will be spilled to the stack)
300 ; CHECK-NEXT: .byte  1
301 ; CHECK-NEXT: .byte  8
302 ; CHECK-NEXT: .short {{[0-9]+}}
303 ; CHECK-NEXT: .long  0
304 ; Loc 1: Register RDI
305 ; CHECK-NEXT: .byte  1
306 ; CHECK-NEXT: .byte  8
307 ; CHECK-NEXT: .short 5
308 ; CHECK-NEXT: .long  0
309 ; Loc 1: Register RSI
310 ; CHECK-NEXT: .byte  1
311 ; CHECK-NEXT: .byte  8
312 ; CHECK-NEXT: .short 4
313 ; CHECK-NEXT: .long  0
314 define i64 @patchpoint_spilldef(i64 %p1, i64 %p2, i64 %p3, i64 %p4) {
315 entry:
316   %result = tail call anyregcc i64 (i64, i32, i8*, i32, ...)* @llvm.experimental.patchpoint.i64(i64 12, i32 15, i8* inttoptr (i64 0 to i8*), i32 2, i64 %p1, i64 %p2)
317   tail call void asm sideeffect "nop", "~{ax},~{bx},~{cx},~{dx},~{bp},~{si},~{di},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15}"() nounwind
318   ret i64 %result
319 }
320
321 ; Test spilling the arguments of an anyregcc call.
322 ;
323 ; <rdar://problem/15487687> [JS] AnyRegCC argument ends up being spilled
324 ;
325 ; CHECK-LABEL: .long L{{.*}}-_patchpoint_spillargs
326 ; CHECK-NEXT: .short 0
327 ; CHECK-NEXT: .short 5
328 ; Loc 0: Return a register
329 ; CHECK-NEXT: .byte  1
330 ; CHECK-NEXT: .byte  8
331 ; CHECK-NEXT: .short {{[0-9]+}}
332 ; CHECK-NEXT: .long  0
333 ; Loc 1: Arg0 in a Register
334 ; CHECK-NEXT: .byte  1
335 ; CHECK-NEXT: .byte  8
336 ; CHECK-NEXT: .short {{[0-9]+}}
337 ; CHECK-NEXT: .long  0
338 ; Loc 2: Arg1 in a Register
339 ; CHECK-NEXT: .byte  1
340 ; CHECK-NEXT: .byte  8
341 ; CHECK-NEXT: .short {{[0-9]+}}
342 ; CHECK-NEXT: .long  0
343 ; Loc 3: Arg2 spilled to RBP +
344 ; CHECK-NEXT: .byte  3
345 ; CHECK-NEXT: .byte  8
346 ; CHECK-NEXT: .short 6
347 ; CHECK-NEXT: .long
348 ; Loc 4: Arg3 spilled to RBP +
349 ; CHECK-NEXT: .byte  3
350 ; CHECK-NEXT: .byte  8
351 ; CHECK-NEXT: .short 6
352 ; CHECK-NEXT: .long
353 define i64 @patchpoint_spillargs(i64 %p1, i64 %p2, i64 %p3, i64 %p4) {
354 entry:
355   tail call void asm sideeffect "nop", "~{ax},~{bx},~{cx},~{dx},~{bp},~{si},~{di},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15}"() nounwind
356   %result = tail call anyregcc i64 (i64, i32, i8*, i32, ...)* @llvm.experimental.patchpoint.i64(i64 13, i32 15, i8* inttoptr (i64 0 to i8*), i32 2, i64 %p1, i64 %p2, i64 %p3, i64 %p4)
357   ret i64 %result
358 }
359
360 ; Make sure all regs are spilled
361 define anyregcc void @anyregcc1() {
362 entry:
363 ;SSE-LABEL: anyregcc1
364 ;SSE:      pushq %rbp
365 ;SSE:      pushq %rax
366 ;SSE:      pushq %r15
367 ;SSE:      pushq %r14
368 ;SSE:      pushq %r13
369 ;SSE:      pushq %r12
370 ;SSE:      pushq %r11
371 ;SSE:      pushq %r10
372 ;SSE:      pushq %r9
373 ;SSE:      pushq %r8
374 ;SSE:      pushq %rdi
375 ;SSE:      pushq %rsi
376 ;SSE:      pushq %rdx
377 ;SSE:      pushq %rcx
378 ;SSE:      pushq %rbx
379 ;SSE:      movaps %xmm15
380 ;SSE-NEXT: movaps %xmm14
381 ;SSE-NEXT: movaps %xmm13
382 ;SSE-NEXT: movaps %xmm12
383 ;SSE-NEXT: movaps %xmm11
384 ;SSE-NEXT: movaps %xmm10
385 ;SSE-NEXT: movaps %xmm9
386 ;SSE-NEXT: movaps %xmm8
387 ;SSE-NEXT: movaps %xmm7
388 ;SSE-NEXT: movaps %xmm6
389 ;SSE-NEXT: movaps %xmm5
390 ;SSE-NEXT: movaps %xmm4
391 ;SSE-NEXT: movaps %xmm3
392 ;SSE-NEXT: movaps %xmm2
393 ;SSE-NEXT: movaps %xmm1
394 ;SSE-NEXT: movaps %xmm0
395 ;AVX-LABEL:anyregcc1
396 ;AVX:      pushq %rbp
397 ;AVX:      pushq %rax
398 ;AVX:      pushq %r15
399 ;AVX:      pushq %r14
400 ;AVX:      pushq %r13
401 ;AVX:      pushq %r12
402 ;AVX:      pushq %r11
403 ;AVX:      pushq %r10
404 ;AVX:      pushq %r9
405 ;AVX:      pushq %r8
406 ;AVX:      pushq %rdi
407 ;AVX:      pushq %rsi
408 ;AVX:      pushq %rdx
409 ;AVX:      pushq %rcx
410 ;AVX:      pushq %rbx
411 ;AVX:      vmovaps %ymm15
412 ;AVX-NEXT: vmovaps %ymm14
413 ;AVX-NEXT: vmovaps %ymm13
414 ;AVX-NEXT: vmovaps %ymm12
415 ;AVX-NEXT: vmovaps %ymm11
416 ;AVX-NEXT: vmovaps %ymm10
417 ;AVX-NEXT: vmovaps %ymm9
418 ;AVX-NEXT: vmovaps %ymm8
419 ;AVX-NEXT: vmovaps %ymm7
420 ;AVX-NEXT: vmovaps %ymm6
421 ;AVX-NEXT: vmovaps %ymm5
422 ;AVX-NEXT: vmovaps %ymm4
423 ;AVX-NEXT: vmovaps %ymm3
424 ;AVX-NEXT: vmovaps %ymm2
425 ;AVX-NEXT: vmovaps %ymm1
426 ;AVX-NEXT: vmovaps %ymm0
427   call void asm sideeffect "", "~{rax},~{rbx},~{rcx},~{rdx},~{rsi},~{rdi},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15},~{rbp},~{xmm0},~{xmm1},~{xmm2},~{xmm3},~{xmm4},~{xmm5},~{xmm6},~{xmm7},~{xmm8},~{xmm9},~{xmm10},~{xmm11},~{xmm12},~{xmm13},~{xmm14},~{xmm15}"()
428   ret void
429 }
430
431 ; Make sure we don't spill any XMMs/YMMs
432 declare anyregcc void @foo()
433 define void @anyregcc2() {
434 entry:
435 ;SSE-LABEL: anyregcc2
436 ;SSE-NOT: movaps %xmm
437 ;AVX-LABEL: anyregcc2
438 ;AVX-NOT: vmovups %ymm
439   %a0 = call <2 x double> asm sideeffect "", "={xmm0}"() nounwind
440   %a1 = call <2 x double> asm sideeffect "", "={xmm1}"() nounwind
441   %a2 = call <2 x double> asm sideeffect "", "={xmm2}"() nounwind
442   %a3 = call <2 x double> asm sideeffect "", "={xmm3}"() nounwind
443   %a4 = call <2 x double> asm sideeffect "", "={xmm4}"() nounwind
444   %a5 = call <2 x double> asm sideeffect "", "={xmm5}"() nounwind
445   %a6 = call <2 x double> asm sideeffect "", "={xmm6}"() nounwind
446   %a7 = call <2 x double> asm sideeffect "", "={xmm7}"() nounwind
447   %a8 = call <2 x double> asm sideeffect "", "={xmm8}"() nounwind
448   %a9 = call <2 x double> asm sideeffect "", "={xmm9}"() nounwind
449   %a10 = call <2 x double> asm sideeffect "", "={xmm10}"() nounwind
450   %a11 = call <2 x double> asm sideeffect "", "={xmm11}"() nounwind
451   %a12 = call <2 x double> asm sideeffect "", "={xmm12}"() nounwind
452   %a13 = call <2 x double> asm sideeffect "", "={xmm13}"() nounwind
453   %a14 = call <2 x double> asm sideeffect "", "={xmm14}"() nounwind
454   %a15 = call <2 x double> asm sideeffect "", "={xmm15}"() nounwind
455   call anyregcc void @foo()
456   call void asm sideeffect "", "{xmm0},{xmm1},{xmm2},{xmm3},{xmm4},{xmm5},{xmm6},{xmm7},{xmm8},{xmm9},{xmm10},{xmm11},{xmm12},{xmm13},{xmm14},{xmm15}"(<2 x double> %a0, <2 x double> %a1, <2 x double> %a2, <2 x double> %a3, <2 x double> %a4, <2 x double> %a5, <2 x double> %a6, <2 x double> %a7, <2 x double> %a8, <2 x double> %a9, <2 x double> %a10, <2 x double> %a11, <2 x double> %a12, <2 x double> %a13, <2 x double> %a14, <2 x double> %a15)
457   ret void
458 }
459
460 declare void @llvm.experimental.patchpoint.void(i64, i32, i8*, i32, ...)
461 declare i64 @llvm.experimental.patchpoint.i64(i64, i32, i8*, i32, ...)