[RISCV] Add shrinkwrap test cases showing gaps in current impl
[llvm-project.git] / llvm / test / CodeGen / X86 / vector-intrinsics.ll
blobea4a339d9d5e86ad40c0c3fcf9333d9a8bc0bdc3
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-- | FileCheck %s
4 declare <4 x double> @llvm.sin.v4f64(<4 x double> %p)
5 declare <4 x double> @llvm.cos.v4f64(<4 x double> %p)
6 declare <4 x double> @llvm.pow.v4f64(<4 x double> %p, <4 x double> %q)
7 declare <4 x double> @llvm.powi.v4f64.i32(<4 x double> %p, i32)
9 define <4 x double> @foo(<4 x double> %p)
10 ; CHECK-LABEL: foo:
11 ; CHECK:       # %bb.0:
12 ; CHECK-NEXT:    subq $56, %rsp
13 ; CHECK-NEXT:    .cfi_def_cfa_offset 64
14 ; CHECK-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
15 ; CHECK-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
16 ; CHECK-NEXT:    callq sin@PLT
17 ; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
18 ; CHECK-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
19 ; CHECK-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
20 ; CHECK-NEXT:    callq sin@PLT
21 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
22 ; CHECK-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]
23 ; CHECK-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
24 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
25 ; CHECK-NEXT:    callq sin@PLT
26 ; CHECK-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
27 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
28 ; CHECK-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
29 ; CHECK-NEXT:    callq sin@PLT
30 ; CHECK-NEXT:    movaps (%rsp), %xmm1 # 16-byte Reload
31 ; CHECK-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]
32 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
33 ; CHECK-NEXT:    addq $56, %rsp
34 ; CHECK-NEXT:    .cfi_def_cfa_offset 8
35 ; CHECK-NEXT:    retq
37   %t = call <4 x double> @llvm.sin.v4f64(<4 x double> %p)
38   ret <4 x double> %t
40 define <4 x double> @goo(<4 x double> %p)
41 ; CHECK-LABEL: goo:
42 ; CHECK:       # %bb.0:
43 ; CHECK-NEXT:    subq $56, %rsp
44 ; CHECK-NEXT:    .cfi_def_cfa_offset 64
45 ; CHECK-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
46 ; CHECK-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
47 ; CHECK-NEXT:    callq cos@PLT
48 ; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
49 ; CHECK-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
50 ; CHECK-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
51 ; CHECK-NEXT:    callq cos@PLT
52 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
53 ; CHECK-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]
54 ; CHECK-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
55 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
56 ; CHECK-NEXT:    callq cos@PLT
57 ; CHECK-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
58 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
59 ; CHECK-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
60 ; CHECK-NEXT:    callq cos@PLT
61 ; CHECK-NEXT:    movaps (%rsp), %xmm1 # 16-byte Reload
62 ; CHECK-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]
63 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
64 ; CHECK-NEXT:    addq $56, %rsp
65 ; CHECK-NEXT:    .cfi_def_cfa_offset 8
66 ; CHECK-NEXT:    retq
68   %t = call <4 x double> @llvm.cos.v4f64(<4 x double> %p)
69   ret <4 x double> %t
71 define <4 x double> @moo(<4 x double> %p, <4 x double> %q)
72 ; CHECK-LABEL: moo:
73 ; CHECK:       # %bb.0:
74 ; CHECK-NEXT:    subq $88, %rsp
75 ; CHECK-NEXT:    .cfi_def_cfa_offset 96
76 ; CHECK-NEXT:    movaps %xmm3, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
77 ; CHECK-NEXT:    movaps %xmm2, (%rsp) # 16-byte Spill
78 ; CHECK-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
79 ; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
80 ; CHECK-NEXT:    movaps %xmm2, %xmm1
81 ; CHECK-NEXT:    callq pow@PLT
82 ; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
83 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
84 ; CHECK-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
85 ; CHECK-NEXT:    movaps (%rsp), %xmm1 # 16-byte Reload
86 ; CHECK-NEXT:    movhlps {{.*#+}} xmm1 = xmm1[1,1]
87 ; CHECK-NEXT:    callq pow@PLT
88 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
89 ; CHECK-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]
90 ; CHECK-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
91 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
92 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
93 ; CHECK-NEXT:    callq pow@PLT
94 ; CHECK-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
95 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
96 ; CHECK-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
97 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
98 ; CHECK-NEXT:    movhlps {{.*#+}} xmm1 = xmm1[1,1]
99 ; CHECK-NEXT:    callq pow@PLT
100 ; CHECK-NEXT:    movaps (%rsp), %xmm1 # 16-byte Reload
101 ; CHECK-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]
102 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
103 ; CHECK-NEXT:    addq $88, %rsp
104 ; CHECK-NEXT:    .cfi_def_cfa_offset 8
105 ; CHECK-NEXT:    retq
107   %t = call <4 x double> @llvm.pow.v4f64(<4 x double> %p, <4 x double> %q)
108   ret <4 x double> %t
110 define <4 x double> @zoo(<4 x double> %p, i32 %q)
111 ; CHECK-LABEL: zoo:
112 ; CHECK:       # %bb.0:
113 ; CHECK-NEXT:    pushq %rbx
114 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
115 ; CHECK-NEXT:    subq $48, %rsp
116 ; CHECK-NEXT:    .cfi_def_cfa_offset 64
117 ; CHECK-NEXT:    .cfi_offset %rbx, -16
118 ; CHECK-NEXT:    movl %edi, %ebx
119 ; CHECK-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
120 ; CHECK-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
121 ; CHECK-NEXT:    callq __powidf2@PLT
122 ; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
123 ; CHECK-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
124 ; CHECK-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
125 ; CHECK-NEXT:    movl %ebx, %edi
126 ; CHECK-NEXT:    callq __powidf2@PLT
127 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
128 ; CHECK-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]
129 ; CHECK-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
130 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
131 ; CHECK-NEXT:    movl %ebx, %edi
132 ; CHECK-NEXT:    callq __powidf2@PLT
133 ; CHECK-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
134 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
135 ; CHECK-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
136 ; CHECK-NEXT:    movl %ebx, %edi
137 ; CHECK-NEXT:    callq __powidf2@PLT
138 ; CHECK-NEXT:    movaps (%rsp), %xmm1 # 16-byte Reload
139 ; CHECK-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]
140 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
141 ; CHECK-NEXT:    addq $48, %rsp
142 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
143 ; CHECK-NEXT:    popq %rbx
144 ; CHECK-NEXT:    .cfi_def_cfa_offset 8
145 ; CHECK-NEXT:    retq
147   %t = call <4 x double> @llvm.powi.v4f64.i32(<4 x double> %p, i32 %q)
148   ret <4 x double> %t
152 declare <9 x double> @llvm.exp.v9f64(<9 x double> %a)
153 declare <9 x double> @llvm.pow.v9f64(<9 x double> %a, <9 x double> %b)
154 declare <9 x double> @llvm.powi.v9f64.i32(<9 x double> %a, i32)
156 define void @a(ptr %p) nounwind {
157 ; CHECK-LABEL: a:
158 ; CHECK:       # %bb.0:
159 ; CHECK-NEXT:    pushq %rbx
160 ; CHECK-NEXT:    subq $96, %rsp
161 ; CHECK-NEXT:    movq %rdi, %rbx
162 ; CHECK-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
163 ; CHECK-NEXT:    movsd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
164 ; CHECK-NEXT:    movaps (%rdi), %xmm0
165 ; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
166 ; CHECK-NEXT:    movaps 16(%rdi), %xmm0
167 ; CHECK-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
168 ; CHECK-NEXT:    movaps 32(%rdi), %xmm0
169 ; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
170 ; CHECK-NEXT:    movaps 48(%rdi), %xmm0
171 ; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
172 ; CHECK-NEXT:    callq exp@PLT
173 ; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
174 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
175 ; CHECK-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
176 ; CHECK-NEXT:    callq exp@PLT
177 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
178 ; CHECK-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]
179 ; CHECK-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
180 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
181 ; CHECK-NEXT:    callq exp@PLT
182 ; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
183 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
184 ; CHECK-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
185 ; CHECK-NEXT:    callq exp@PLT
186 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
187 ; CHECK-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]
188 ; CHECK-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
189 ; CHECK-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
190 ; CHECK-NEXT:    callq exp@PLT
191 ; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
192 ; CHECK-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
193 ; CHECK-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
194 ; CHECK-NEXT:    callq exp@PLT
195 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
196 ; CHECK-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]
197 ; CHECK-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
198 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
199 ; CHECK-NEXT:    callq exp@PLT
200 ; CHECK-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
201 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
202 ; CHECK-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
203 ; CHECK-NEXT:    callq exp@PLT
204 ; CHECK-NEXT:    movaps (%rsp), %xmm1 # 16-byte Reload
205 ; CHECK-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]
206 ; CHECK-NEXT:    movaps %xmm1, (%rsp) # 16-byte Spill
207 ; CHECK-NEXT:    movsd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 8-byte Reload
208 ; CHECK-NEXT:    # xmm0 = mem[0],zero
209 ; CHECK-NEXT:    callq exp@PLT
210 ; CHECK-NEXT:    movsd %xmm0, 64(%rbx)
211 ; CHECK-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
212 ; CHECK-NEXT:    movaps %xmm0, (%rbx)
213 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
214 ; CHECK-NEXT:    movaps %xmm0, 16(%rbx)
215 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
216 ; CHECK-NEXT:    movaps %xmm0, 32(%rbx)
217 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
218 ; CHECK-NEXT:    movaps %xmm0, 48(%rbx)
219 ; CHECK-NEXT:    addq $96, %rsp
220 ; CHECK-NEXT:    popq %rbx
221 ; CHECK-NEXT:    retq
222   %a = load <9 x double>, ptr %p
223   %r = call <9 x double> @llvm.exp.v9f64(<9 x double> %a)
224   store <9 x double> %r, ptr %p
225   ret void
227 define void @b(ptr %p, ptr %q) nounwind {
228 ; CHECK-LABEL: b:
229 ; CHECK:       # %bb.0:
230 ; CHECK-NEXT:    pushq %rbx
231 ; CHECK-NEXT:    subq $160, %rsp
232 ; CHECK-NEXT:    movq %rdi, %rbx
233 ; CHECK-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
234 ; CHECK-NEXT:    movsd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
235 ; CHECK-NEXT:    movaps (%rdi), %xmm0
236 ; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
237 ; CHECK-NEXT:    movaps 16(%rdi), %xmm0
238 ; CHECK-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
239 ; CHECK-NEXT:    movaps 32(%rdi), %xmm0
240 ; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
241 ; CHECK-NEXT:    movaps 48(%rdi), %xmm2
242 ; CHECK-NEXT:    movaps %xmm2, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
243 ; CHECK-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
244 ; CHECK-NEXT:    movsd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
245 ; CHECK-NEXT:    movaps (%rsi), %xmm0
246 ; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
247 ; CHECK-NEXT:    movaps 16(%rsi), %xmm0
248 ; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
249 ; CHECK-NEXT:    movaps 32(%rsi), %xmm0
250 ; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
251 ; CHECK-NEXT:    movaps 48(%rsi), %xmm1
252 ; CHECK-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
253 ; CHECK-NEXT:    movaps %xmm2, %xmm0
254 ; CHECK-NEXT:    callq pow@PLT
255 ; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
256 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
257 ; CHECK-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
258 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
259 ; CHECK-NEXT:    movhlps {{.*#+}} xmm1 = xmm1[1,1]
260 ; CHECK-NEXT:    callq pow@PLT
261 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
262 ; CHECK-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]
263 ; CHECK-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
264 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
265 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
266 ; CHECK-NEXT:    callq pow@PLT
267 ; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
268 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
269 ; CHECK-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
270 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
271 ; CHECK-NEXT:    movhlps {{.*#+}} xmm1 = xmm1[1,1]
272 ; CHECK-NEXT:    callq pow@PLT
273 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
274 ; CHECK-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]
275 ; CHECK-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
276 ; CHECK-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
277 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
278 ; CHECK-NEXT:    callq pow@PLT
279 ; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
280 ; CHECK-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
281 ; CHECK-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
282 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
283 ; CHECK-NEXT:    movhlps {{.*#+}} xmm1 = xmm1[1,1]
284 ; CHECK-NEXT:    callq pow@PLT
285 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
286 ; CHECK-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]
287 ; CHECK-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
288 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
289 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
290 ; CHECK-NEXT:    callq pow@PLT
291 ; CHECK-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
292 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
293 ; CHECK-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
294 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
295 ; CHECK-NEXT:    movhlps {{.*#+}} xmm1 = xmm1[1,1]
296 ; CHECK-NEXT:    callq pow@PLT
297 ; CHECK-NEXT:    movaps (%rsp), %xmm1 # 16-byte Reload
298 ; CHECK-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]
299 ; CHECK-NEXT:    movaps %xmm1, (%rsp) # 16-byte Spill
300 ; CHECK-NEXT:    movsd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 8-byte Reload
301 ; CHECK-NEXT:    # xmm0 = mem[0],zero
302 ; CHECK-NEXT:    movsd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 8-byte Reload
303 ; CHECK-NEXT:    # xmm1 = mem[0],zero
304 ; CHECK-NEXT:    callq pow@PLT
305 ; CHECK-NEXT:    movsd %xmm0, 64(%rbx)
306 ; CHECK-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
307 ; CHECK-NEXT:    movaps %xmm0, (%rbx)
308 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
309 ; CHECK-NEXT:    movaps %xmm0, 16(%rbx)
310 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
311 ; CHECK-NEXT:    movaps %xmm0, 32(%rbx)
312 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
313 ; CHECK-NEXT:    movaps %xmm0, 48(%rbx)
314 ; CHECK-NEXT:    addq $160, %rsp
315 ; CHECK-NEXT:    popq %rbx
316 ; CHECK-NEXT:    retq
317   %a = load <9 x double>, ptr %p
318   %b = load <9 x double>, ptr %q
319   %r = call <9 x double> @llvm.pow.v9f64(<9 x double> %a, <9 x double> %b)
320   store <9 x double> %r, ptr %p
321   ret void
323 define void @c(ptr %p, i32 %n) nounwind {
324 ; CHECK-LABEL: c:
325 ; CHECK:       # %bb.0:
326 ; CHECK-NEXT:    pushq %rbp
327 ; CHECK-NEXT:    pushq %rbx
328 ; CHECK-NEXT:    subq $104, %rsp
329 ; CHECK-NEXT:    movl %esi, %ebp
330 ; CHECK-NEXT:    movq %rdi, %rbx
331 ; CHECK-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
332 ; CHECK-NEXT:    movsd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
333 ; CHECK-NEXT:    movaps (%rdi), %xmm0
334 ; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
335 ; CHECK-NEXT:    movaps 16(%rdi), %xmm0
336 ; CHECK-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
337 ; CHECK-NEXT:    movaps 32(%rdi), %xmm0
338 ; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
339 ; CHECK-NEXT:    movaps 48(%rdi), %xmm0
340 ; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
341 ; CHECK-NEXT:    movl %esi, %edi
342 ; CHECK-NEXT:    callq __powidf2@PLT
343 ; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
344 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
345 ; CHECK-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
346 ; CHECK-NEXT:    movl %ebp, %edi
347 ; CHECK-NEXT:    callq __powidf2@PLT
348 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
349 ; CHECK-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]
350 ; CHECK-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
351 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
352 ; CHECK-NEXT:    movl %ebp, %edi
353 ; CHECK-NEXT:    callq __powidf2@PLT
354 ; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
355 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
356 ; CHECK-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
357 ; CHECK-NEXT:    movl %ebp, %edi
358 ; CHECK-NEXT:    callq __powidf2@PLT
359 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
360 ; CHECK-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]
361 ; CHECK-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
362 ; CHECK-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
363 ; CHECK-NEXT:    movl %ebp, %edi
364 ; CHECK-NEXT:    callq __powidf2@PLT
365 ; CHECK-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
366 ; CHECK-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
367 ; CHECK-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
368 ; CHECK-NEXT:    movl %ebp, %edi
369 ; CHECK-NEXT:    callq __powidf2@PLT
370 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
371 ; CHECK-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]
372 ; CHECK-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
373 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
374 ; CHECK-NEXT:    movl %ebp, %edi
375 ; CHECK-NEXT:    callq __powidf2@PLT
376 ; CHECK-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
377 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
378 ; CHECK-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
379 ; CHECK-NEXT:    movl %ebp, %edi
380 ; CHECK-NEXT:    callq __powidf2@PLT
381 ; CHECK-NEXT:    movaps (%rsp), %xmm1 # 16-byte Reload
382 ; CHECK-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]
383 ; CHECK-NEXT:    movaps %xmm1, (%rsp) # 16-byte Spill
384 ; CHECK-NEXT:    movsd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 8-byte Reload
385 ; CHECK-NEXT:    # xmm0 = mem[0],zero
386 ; CHECK-NEXT:    movl %ebp, %edi
387 ; CHECK-NEXT:    callq __powidf2@PLT
388 ; CHECK-NEXT:    movsd %xmm0, 64(%rbx)
389 ; CHECK-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
390 ; CHECK-NEXT:    movaps %xmm0, (%rbx)
391 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
392 ; CHECK-NEXT:    movaps %xmm0, 16(%rbx)
393 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
394 ; CHECK-NEXT:    movaps %xmm0, 32(%rbx)
395 ; CHECK-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
396 ; CHECK-NEXT:    movaps %xmm0, 48(%rbx)
397 ; CHECK-NEXT:    addq $104, %rsp
398 ; CHECK-NEXT:    popq %rbx
399 ; CHECK-NEXT:    popq %rbp
400 ; CHECK-NEXT:    retq
401   %a = load <9 x double>, ptr %p
402   %r = call <9 x double> @llvm.powi.v9f64.i32(<9 x double> %a, i32 %n)
403   store <9 x double> %r, ptr %p
404   ret void