[X86][BdVer2] Transfer delays from the integer to the floating point unit.
[lldb.git] / llvm / test / CodeGen / X86 / sse-schedule.ll
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=x86-64 | FileCheck %s --check-prefixes=CHECK,GENERIC
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=atom -mattr=-sse3 | FileCheck %s --check-prefixes=CHECK,ATOM
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=slm -mattr=-sse3 | FileCheck %s --check-prefixes=CHECK,SLM
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=sandybridge -mattr=-sse3 | FileCheck %s --check-prefixes=CHECK,SANDY-SSE
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=sandybridge -mattr=-avx2 | FileCheck %s --check-prefixes=CHECK,SANDY
7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=ivybridge -mattr=-sse3 | FileCheck %s --check-prefixes=CHECK,SANDY-SSE
8 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=ivybridge -mattr=-avx2 | FileCheck %s --check-prefixes=CHECK,SANDY
9 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=haswell -mattr=-sse3 | FileCheck %s --check-prefixes=CHECK,HASWELL-SSE
10 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=haswell -mattr=-avx2 | FileCheck %s --check-prefixes=CHECK,HASWELL
11 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=broadwell -mattr=-sse3 | FileCheck %s --check-prefixes=CHECK,BROADWELL-SSE
12 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=broadwell -mattr=-avx2 | FileCheck %s --check-prefixes=CHECK,BROADWELL
13 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=skylake -mattr=-sse3 | FileCheck %s --check-prefixes=CHECK,SKYLAKE-SSE
14 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=skylake -mattr=-avx2 | FileCheck %s --check-prefixes=CHECK,SKYLAKE
15 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=skx -mattr=-sse3 | FileCheck %s --check-prefixes=CHECK,SKX-SSE
16 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=skx -mattr=-avx2 | FileCheck %s --check-prefixes=CHECK,SKX
17 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=bdver2 -mattr=-sse3 | FileCheck %s --check-prefixes=CHECK,BDVER2-SSE
18 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=bdver2 -mattr=-avx2 | FileCheck %s --check-prefixes=CHECK,BDVER2
19 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=btver2 -mattr=-sse3 | FileCheck %s --check-prefixes=CHECK,BTVER2-SSE
20 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=btver2 -mattr=-avx2 | FileCheck %s --check-prefixes=CHECK,BTVER2
21 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=znver1 -mattr=-sse3 | FileCheck %s --check-prefixes=CHECK,ZNVER1-SSE
22 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=znver1 -mattr=-avx2 | FileCheck %s --check-prefixes=CHECK,ZNVER1
23
24 ; FIXME: we should really use -mattr=-sse2 here but some of the comparison tests don't work without access to legal <4 x i32> types.
25
26 define <4 x float> @test_addps(<4 x float> %a0, <4 x float> %a1, <4 x float> *%a2) {
27 ; GENERIC-LABEL: test_addps:
28 ; GENERIC:       # %bb.0:
29 ; GENERIC-NEXT:    addps %xmm1, %xmm0 # sched: [3:1.00]
30 ; GENERIC-NEXT:    addps (%rdi), %xmm0 # sched: [9:1.00]
31 ; GENERIC-NEXT:    retq # sched: [1:1.00]
32 ;
33 ; ATOM-LABEL: test_addps:
34 ; ATOM:       # %bb.0:
35 ; ATOM-NEXT:    addps %xmm1, %xmm0 # sched: [5:5.00]
36 ; ATOM-NEXT:    addps (%rdi), %xmm0 # sched: [5:5.00]
37 ; ATOM-NEXT:    retq # sched: [79:39.50]
38 ;
39 ; SLM-LABEL: test_addps:
40 ; SLM:       # %bb.0:
41 ; SLM-NEXT:    addps %xmm1, %xmm0 # sched: [3:1.00]
42 ; SLM-NEXT:    addps (%rdi), %xmm0 # sched: [6:1.00]
43 ; SLM-NEXT:    retq # sched: [4:1.00]
44 ;
45 ; SANDY-SSE-LABEL: test_addps:
46 ; SANDY-SSE:       # %bb.0:
47 ; SANDY-SSE-NEXT:    addps %xmm1, %xmm0 # sched: [3:1.00]
48 ; SANDY-SSE-NEXT:    addps (%rdi), %xmm0 # sched: [9:1.00]
49 ; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
50 ;
51 ; SANDY-LABEL: test_addps:
52 ; SANDY:       # %bb.0:
53 ; SANDY-NEXT:    vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
54 ; SANDY-NEXT:    vaddps (%rdi), %xmm0, %xmm0 # sched: [9:1.00]
55 ; SANDY-NEXT:    retq # sched: [1:1.00]
56 ;
57 ; HASWELL-SSE-LABEL: test_addps:
58 ; HASWELL-SSE:       # %bb.0:
59 ; HASWELL-SSE-NEXT:    addps %xmm1, %xmm0 # sched: [3:1.00]
60 ; HASWELL-SSE-NEXT:    addps (%rdi), %xmm0 # sched: [9:1.00]
61 ; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
62 ;
63 ; HASWELL-LABEL: test_addps:
64 ; HASWELL:       # %bb.0:
65 ; HASWELL-NEXT:    vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
66 ; HASWELL-NEXT:    vaddps (%rdi), %xmm0, %xmm0 # sched: [9:1.00]
67 ; HASWELL-NEXT:    retq # sched: [7:1.00]
68 ;
69 ; BROADWELL-SSE-LABEL: test_addps:
70 ; BROADWELL-SSE:       # %bb.0:
71 ; BROADWELL-SSE-NEXT:    addps %xmm1, %xmm0 # sched: [3:1.00]
72 ; BROADWELL-SSE-NEXT:    addps (%rdi), %xmm0 # sched: [8:1.00]
73 ; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
74 ;
75 ; BROADWELL-LABEL: test_addps:
76 ; BROADWELL:       # %bb.0:
77 ; BROADWELL-NEXT:    vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
78 ; BROADWELL-NEXT:    vaddps (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
79 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
80 ;
81 ; SKYLAKE-SSE-LABEL: test_addps:
82 ; SKYLAKE-SSE:       # %bb.0:
83 ; SKYLAKE-SSE-NEXT:    addps %xmm1, %xmm0 # sched: [4:0.50]
84 ; SKYLAKE-SSE-NEXT:    addps (%rdi), %xmm0 # sched: [10:0.50]
85 ; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
86 ;
87 ; SKYLAKE-LABEL: test_addps:
88 ; SKYLAKE:       # %bb.0:
89 ; SKYLAKE-NEXT:    vaddps %xmm1, %xmm0, %xmm0 # sched: [4:0.50]
90 ; SKYLAKE-NEXT:    vaddps (%rdi), %xmm0, %xmm0 # sched: [10:0.50]
91 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
92 ;
93 ; SKX-SSE-LABEL: test_addps:
94 ; SKX-SSE:       # %bb.0:
95 ; SKX-SSE-NEXT:    addps %xmm1, %xmm0 # sched: [4:0.50]
96 ; SKX-SSE-NEXT:    addps (%rdi), %xmm0 # sched: [10:0.50]
97 ; SKX-SSE-NEXT:    retq # sched: [7:1.00]
98 ;
99 ; SKX-LABEL: test_addps:
100 ; SKX:       # %bb.0:
101 ; SKX-NEXT:    vaddps %xmm1, %xmm0, %xmm0 # sched: [4:0.50]
102 ; SKX-NEXT:    vaddps (%rdi), %xmm0, %xmm0 # sched: [10:0.50]
103 ; SKX-NEXT:    retq # sched: [7:1.00]
104 ;
105 ; BDVER2-SSE-LABEL: test_addps:
106 ; BDVER2-SSE:       # %bb.0:
107 ; BDVER2-SSE-NEXT:    addps %xmm1, %xmm0 # sched: [5:1.00]
108 ; BDVER2-SSE-NEXT:    addps (%rdi), %xmm0 # sched: [10:1.00]
109 ; BDVER2-SSE-NEXT:    retq # sched: [5:1.00]
110 ;
111 ; BDVER2-LABEL: test_addps:
112 ; BDVER2:       # %bb.0:
113 ; BDVER2-NEXT:    vaddps %xmm1, %xmm0, %xmm0 # sched: [5:1.00]
114 ; BDVER2-NEXT:    vaddps (%rdi), %xmm0, %xmm0 # sched: [10:1.00]
115 ; BDVER2-NEXT:    retq # sched: [5:1.00]
116 ;
117 ; BTVER2-SSE-LABEL: test_addps:
118 ; BTVER2-SSE:       # %bb.0:
119 ; BTVER2-SSE-NEXT:    addps %xmm1, %xmm0 # sched: [3:1.00]
120 ; BTVER2-SSE-NEXT:    addps (%rdi), %xmm0 # sched: [8:1.00]
121 ; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
122 ;
123 ; BTVER2-LABEL: test_addps:
124 ; BTVER2:       # %bb.0:
125 ; BTVER2-NEXT:    vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
126 ; BTVER2-NEXT:    vaddps (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
127 ; BTVER2-NEXT:    retq # sched: [4:1.00]
128 ;
129 ; ZNVER1-SSE-LABEL: test_addps:
130 ; ZNVER1-SSE:       # %bb.0:
131 ; ZNVER1-SSE-NEXT:    addps %xmm1, %xmm0 # sched: [3:1.00]
132 ; ZNVER1-SSE-NEXT:    addps (%rdi), %xmm0 # sched: [10:1.00]
133 ; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
134 ;
135 ; ZNVER1-LABEL: test_addps:
136 ; ZNVER1:       # %bb.0:
137 ; ZNVER1-NEXT:    vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
138 ; ZNVER1-NEXT:    vaddps (%rdi), %xmm0, %xmm0 # sched: [10:1.00]
139 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
140   %1 = fadd <4 x float> %a0, %a1
141   %2 = load <4 x float>, <4 x float> *%a2, align 16
142   %3 = fadd <4 x float> %1, %2
143   ret <4 x float> %3
144 }
145
146 define float @test_addss(float %a0, float %a1, float *%a2) {
147 ; GENERIC-LABEL: test_addss:
148 ; GENERIC:       # %bb.0:
149 ; GENERIC-NEXT:    addss %xmm1, %xmm0 # sched: [3:1.00]
150 ; GENERIC-NEXT:    addss (%rdi), %xmm0 # sched: [9:1.00]
151 ; GENERIC-NEXT:    retq # sched: [1:1.00]
152 ;
153 ; ATOM-LABEL: test_addss:
154 ; ATOM:       # %bb.0:
155 ; ATOM-NEXT:    addss %xmm1, %xmm0 # sched: [5:5.00]
156 ; ATOM-NEXT:    addss (%rdi), %xmm0 # sched: [5:5.00]
157 ; ATOM-NEXT:    retq # sched: [79:39.50]
158 ;
159 ; SLM-LABEL: test_addss:
160 ; SLM:       # %bb.0:
161 ; SLM-NEXT:    addss %xmm1, %xmm0 # sched: [3:1.00]
162 ; SLM-NEXT:    addss (%rdi), %xmm0 # sched: [6:1.00]
163 ; SLM-NEXT:    retq # sched: [4:1.00]
164 ;
165 ; SANDY-SSE-LABEL: test_addss:
166 ; SANDY-SSE:       # %bb.0:
167 ; SANDY-SSE-NEXT:    addss %xmm1, %xmm0 # sched: [3:1.00]
168 ; SANDY-SSE-NEXT:    addss (%rdi), %xmm0 # sched: [9:1.00]
169 ; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
170 ;
171 ; SANDY-LABEL: test_addss:
172 ; SANDY:       # %bb.0:
173 ; SANDY-NEXT:    vaddss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
174 ; SANDY-NEXT:    vaddss (%rdi), %xmm0, %xmm0 # sched: [9:1.00]
175 ; SANDY-NEXT:    retq # sched: [1:1.00]
176 ;
177 ; HASWELL-SSE-LABEL: test_addss:
178 ; HASWELL-SSE:       # %bb.0:
179 ; HASWELL-SSE-NEXT:    addss %xmm1, %xmm0 # sched: [3:1.00]
180 ; HASWELL-SSE-NEXT:    addss (%rdi), %xmm0 # sched: [8:1.00]
181 ; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
182 ;
183 ; HASWELL-LABEL: test_addss:
184 ; HASWELL:       # %bb.0:
185 ; HASWELL-NEXT:    vaddss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
186 ; HASWELL-NEXT:    vaddss (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
187 ; HASWELL-NEXT:    retq # sched: [7:1.00]
188 ;
189 ; BROADWELL-SSE-LABEL: test_addss:
190 ; BROADWELL-SSE:       # %bb.0:
191 ; BROADWELL-SSE-NEXT:    addss %xmm1, %xmm0 # sched: [3:1.00]
192 ; BROADWELL-SSE-NEXT:    addss (%rdi), %xmm0 # sched: [8:1.00]
193 ; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
194 ;
195 ; BROADWELL-LABEL: test_addss:
196 ; BROADWELL:       # %bb.0:
197 ; BROADWELL-NEXT:    vaddss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
198 ; BROADWELL-NEXT:    vaddss (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
199 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
200 ;
201 ; SKYLAKE-SSE-LABEL: test_addss:
202 ; SKYLAKE-SSE:       # %bb.0:
203 ; SKYLAKE-SSE-NEXT:    addss %xmm1, %xmm0 # sched: [4:0.50]
204 ; SKYLAKE-SSE-NEXT:    addss (%rdi), %xmm0 # sched: [9:0.50]
205 ; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
206 ;
207 ; SKYLAKE-LABEL: test_addss:
208 ; SKYLAKE:       # %bb.0:
209 ; SKYLAKE-NEXT:    vaddss %xmm1, %xmm0, %xmm0 # sched: [4:0.50]
210 ; SKYLAKE-NEXT:    vaddss (%rdi), %xmm0, %xmm0 # sched: [9:0.50]
211 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
212 ;
213 ; SKX-SSE-LABEL: test_addss:
214 ; SKX-SSE:       # %bb.0:
215 ; SKX-SSE-NEXT:    addss %xmm1, %xmm0 # sched: [4:0.50]
216 ; SKX-SSE-NEXT:    addss (%rdi), %xmm0 # sched: [9:0.50]
217 ; SKX-SSE-NEXT:    retq # sched: [7:1.00]
218 ;
219 ; SKX-LABEL: test_addss:
220 ; SKX:       # %bb.0:
221 ; SKX-NEXT:    vaddss %xmm1, %xmm0, %xmm0 # sched: [4:0.50]
222 ; SKX-NEXT:    vaddss (%rdi), %xmm0, %xmm0 # sched: [9:0.50]
223 ; SKX-NEXT:    retq # sched: [7:1.00]
224 ;
225 ; BDVER2-SSE-LABEL: test_addss:
226 ; BDVER2-SSE:       # %bb.0:
227 ; BDVER2-SSE-NEXT:    addss %xmm1, %xmm0 # sched: [5:1.00]
228 ; BDVER2-SSE-NEXT:    addss (%rdi), %xmm0 # sched: [10:1.00]
229 ; BDVER2-SSE-NEXT:    retq # sched: [5:1.00]
230 ;
231 ; BDVER2-LABEL: test_addss:
232 ; BDVER2:       # %bb.0:
233 ; BDVER2-NEXT:    vaddss %xmm1, %xmm0, %xmm0 # sched: [5:1.00]
234 ; BDVER2-NEXT:    vaddss (%rdi), %xmm0, %xmm0 # sched: [10:1.00]
235 ; BDVER2-NEXT:    retq # sched: [5:1.00]
236 ;
237 ; BTVER2-SSE-LABEL: test_addss:
238 ; BTVER2-SSE:       # %bb.0:
239 ; BTVER2-SSE-NEXT:    addss %xmm1, %xmm0 # sched: [3:1.00]
240 ; BTVER2-SSE-NEXT:    addss (%rdi), %xmm0 # sched: [8:1.00]
241 ; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
242 ;
243 ; BTVER2-LABEL: test_addss:
244 ; BTVER2:       # %bb.0:
245 ; BTVER2-NEXT:    vaddss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
246 ; BTVER2-NEXT:    vaddss (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
247 ; BTVER2-NEXT:    retq # sched: [4:1.00]
248 ;
249 ; ZNVER1-SSE-LABEL: test_addss:
250 ; ZNVER1-SSE:       # %bb.0:
251 ; ZNVER1-SSE-NEXT:    addss %xmm1, %xmm0 # sched: [3:1.00]
252 ; ZNVER1-SSE-NEXT:    addss (%rdi), %xmm0 # sched: [10:1.00]
253 ; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
254 ;
255 ; ZNVER1-LABEL: test_addss:
256 ; ZNVER1:       # %bb.0:
257 ; ZNVER1-NEXT:    vaddss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
258 ; ZNVER1-NEXT:    vaddss (%rdi), %xmm0, %xmm0 # sched: [10:1.00]
259 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
260   %1 = fadd float %a0, %a1
261   %2 = load float, float *%a2, align 4
262   %3 = fadd float %1, %2
263   ret float %3
264 }
265
266 define <4 x float> @test_andps(<4 x float> %a0, <4 x float> %a1, <4 x float> *%a2) {
267 ; GENERIC-LABEL: test_andps:
268 ; GENERIC:       # %bb.0:
269 ; GENERIC-NEXT:    andps %xmm1, %xmm0 # sched: [1:1.00]
270 ; GENERIC-NEXT:    andps (%rdi), %xmm0 # sched: [7:1.00]
271 ; GENERIC-NEXT:    retq # sched: [1:1.00]
272 ;
273 ; ATOM-LABEL: test_andps:
274 ; ATOM:       # %bb.0:
275 ; ATOM-NEXT:    andps %xmm1, %xmm0 # sched: [1:0.50]
276 ; ATOM-NEXT:    andps (%rdi), %xmm0 # sched: [1:1.00]
277 ; ATOM-NEXT:    nop # sched: [1:0.50]
278 ; ATOM-NEXT:    nop # sched: [1:0.50]
279 ; ATOM-NEXT:    nop # sched: [1:0.50]
280 ; ATOM-NEXT:    nop # sched: [1:0.50]
281 ; ATOM-NEXT:    retq # sched: [79:39.50]
282 ;
283 ; SLM-LABEL: test_andps:
284 ; SLM:       # %bb.0:
285 ; SLM-NEXT:    andps %xmm1, %xmm0 # sched: [1:0.50]
286 ; SLM-NEXT:    andps (%rdi), %xmm0 # sched: [4:1.00]
287 ; SLM-NEXT:    retq # sched: [4:1.00]
288 ;
289 ; SANDY-SSE-LABEL: test_andps:
290 ; SANDY-SSE:       # %bb.0:
291 ; SANDY-SSE-NEXT:    andps %xmm1, %xmm0 # sched: [1:1.00]
292 ; SANDY-SSE-NEXT:    andps (%rdi), %xmm0 # sched: [7:1.00]
293 ; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
294 ;
295 ; SANDY-LABEL: test_andps:
296 ; SANDY:       # %bb.0:
297 ; SANDY-NEXT:    vandps %xmm1, %xmm0, %xmm0 # sched: [1:1.00]
298 ; SANDY-NEXT:    vandps (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
299 ; SANDY-NEXT:    retq # sched: [1:1.00]
300 ;
301 ; HASWELL-SSE-LABEL: test_andps:
302 ; HASWELL-SSE:       # %bb.0:
303 ; HASWELL-SSE-NEXT:    andps %xmm1, %xmm0 # sched: [1:1.00]
304 ; HASWELL-SSE-NEXT:    andps (%rdi), %xmm0 # sched: [7:1.00]
305 ; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
306 ;
307 ; HASWELL-LABEL: test_andps:
308 ; HASWELL:       # %bb.0:
309 ; HASWELL-NEXT:    vandps %xmm1, %xmm0, %xmm0 # sched: [1:1.00]
310 ; HASWELL-NEXT:    vandps (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
311 ; HASWELL-NEXT:    retq # sched: [7:1.00]
312 ;
313 ; BROADWELL-SSE-LABEL: test_andps:
314 ; BROADWELL-SSE:       # %bb.0:
315 ; BROADWELL-SSE-NEXT:    andps %xmm1, %xmm0 # sched: [1:1.00]
316 ; BROADWELL-SSE-NEXT:    andps (%rdi), %xmm0 # sched: [6:1.00]
317 ; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
318 ;
319 ; BROADWELL-LABEL: test_andps:
320 ; BROADWELL:       # %bb.0:
321 ; BROADWELL-NEXT:    vandps %xmm1, %xmm0, %xmm0 # sched: [1:1.00]
322 ; BROADWELL-NEXT:    vandps (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
323 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
324 ;
325 ; SKYLAKE-SSE-LABEL: test_andps:
326 ; SKYLAKE-SSE:       # %bb.0:
327 ; SKYLAKE-SSE-NEXT:    andps %xmm1, %xmm0 # sched: [1:0.33]
328 ; SKYLAKE-SSE-NEXT:    andps (%rdi), %xmm0 # sched: [7:0.50]
329 ; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
330 ;
331 ; SKYLAKE-LABEL: test_andps:
332 ; SKYLAKE:       # %bb.0:
333 ; SKYLAKE-NEXT:    vandps %xmm1, %xmm0, %xmm0 # sched: [1:0.33]
334 ; SKYLAKE-NEXT:    vandps (%rdi), %xmm0, %xmm0 # sched: [7:0.50]
335 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
336 ;
337 ; SKX-SSE-LABEL: test_andps:
338 ; SKX-SSE:       # %bb.0:
339 ; SKX-SSE-NEXT:    andps %xmm1, %xmm0 # sched: [1:0.33]
340 ; SKX-SSE-NEXT:    andps (%rdi), %xmm0 # sched: [7:0.50]
341 ; SKX-SSE-NEXT:    retq # sched: [7:1.00]
342 ;
343 ; SKX-LABEL: test_andps:
344 ; SKX:       # %bb.0:
345 ; SKX-NEXT:    vandps %xmm1, %xmm0, %xmm0 # sched: [1:0.33]
346 ; SKX-NEXT:    vandps (%rdi), %xmm0, %xmm0 # sched: [7:0.50]
347 ; SKX-NEXT:    retq # sched: [7:1.00]
348 ;
349 ; BDVER2-SSE-LABEL: test_andps:
350 ; BDVER2-SSE:       # %bb.0:
351 ; BDVER2-SSE-NEXT:    andps %xmm1, %xmm0 # sched: [2:0.50]
352 ; BDVER2-SSE-NEXT:    andps (%rdi), %xmm0 # sched: [7:0.50]
353 ; BDVER2-SSE-NEXT:    retq # sched: [5:1.00]
354 ;
355 ; BDVER2-LABEL: test_andps:
356 ; BDVER2:       # %bb.0:
357 ; BDVER2-NEXT:    vandps %xmm1, %xmm0, %xmm0 # sched: [2:0.50]
358 ; BDVER2-NEXT:    vandps (%rdi), %xmm0, %xmm0 # sched: [7:0.50]
359 ; BDVER2-NEXT:    retq # sched: [5:1.00]
360 ;
361 ; BTVER2-SSE-LABEL: test_andps:
362 ; BTVER2-SSE:       # %bb.0:
363 ; BTVER2-SSE-NEXT:    andps %xmm1, %xmm0 # sched: [1:0.50]
364 ; BTVER2-SSE-NEXT:    andps (%rdi), %xmm0 # sched: [6:1.00]
365 ; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
366 ;
367 ; BTVER2-LABEL: test_andps:
368 ; BTVER2:       # %bb.0:
369 ; BTVER2-NEXT:    vandps %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
370 ; BTVER2-NEXT:    vandps (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
371 ; BTVER2-NEXT:    retq # sched: [4:1.00]
372 ;
373 ; ZNVER1-SSE-LABEL: test_andps:
374 ; ZNVER1-SSE:       # %bb.0:
375 ; ZNVER1-SSE-NEXT:    andps %xmm1, %xmm0 # sched: [1:0.25]
376 ; ZNVER1-SSE-NEXT:    andps (%rdi), %xmm0 # sched: [8:0.50]
377 ; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
378 ;
379 ; ZNVER1-LABEL: test_andps:
380 ; ZNVER1:       # %bb.0:
381 ; ZNVER1-NEXT:    vandps %xmm1, %xmm0, %xmm0 # sched: [1:0.25]
382 ; ZNVER1-NEXT:    vandps (%rdi), %xmm0, %xmm0 # sched: [8:0.50]
383 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
384   %1 = bitcast <4 x float> %a0 to <4 x i32>
385   %2 = bitcast <4 x float> %a1 to <4 x i32>
386   %3 = and <4 x i32> %1, %2
387   %4 = load <4 x float>, <4 x float> *%a2, align 16
388   %5 = bitcast <4 x float> %4 to <4 x i32>
389   %6 = and <4 x i32> %3, %5
390   %7 = bitcast <4 x i32> %6 to <4 x float>
391   ret <4 x float> %7
392 }
393
394 define <4 x float> @test_andnotps(<4 x float> %a0, <4 x float> %a1, <4 x float> *%a2) {
395 ; GENERIC-LABEL: test_andnotps:
396 ; GENERIC:       # %bb.0:
397 ; GENERIC-NEXT:    andnps %xmm1, %xmm0 # sched: [1:1.00]
398 ; GENERIC-NEXT:    andnps (%rdi), %xmm0 # sched: [7:1.00]
399 ; GENERIC-NEXT:    retq # sched: [1:1.00]
400 ;
401 ; ATOM-LABEL: test_andnotps:
402 ; ATOM:       # %bb.0:
403 ; ATOM-NEXT:    andnps %xmm1, %xmm0 # sched: [1:0.50]
404 ; ATOM-NEXT:    andnps (%rdi), %xmm0 # sched: [1:1.00]
405 ; ATOM-NEXT:    nop # sched: [1:0.50]
406 ; ATOM-NEXT:    nop # sched: [1:0.50]
407 ; ATOM-NEXT:    nop # sched: [1:0.50]
408 ; ATOM-NEXT:    nop # sched: [1:0.50]
409 ; ATOM-NEXT:    retq # sched: [79:39.50]
410 ;
411 ; SLM-LABEL: test_andnotps:
412 ; SLM:       # %bb.0:
413 ; SLM-NEXT:    andnps %xmm1, %xmm0 # sched: [1:0.50]
414 ; SLM-NEXT:    andnps (%rdi), %xmm0 # sched: [4:1.00]
415 ; SLM-NEXT:    retq # sched: [4:1.00]
416 ;
417 ; SANDY-SSE-LABEL: test_andnotps:
418 ; SANDY-SSE:       # %bb.0:
419 ; SANDY-SSE-NEXT:    andnps %xmm1, %xmm0 # sched: [1:1.00]
420 ; SANDY-SSE-NEXT:    andnps (%rdi), %xmm0 # sched: [7:1.00]
421 ; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
422 ;
423 ; SANDY-LABEL: test_andnotps:
424 ; SANDY:       # %bb.0:
425 ; SANDY-NEXT:    vandnps %xmm1, %xmm0, %xmm0 # sched: [1:1.00]
426 ; SANDY-NEXT:    vandnps (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
427 ; SANDY-NEXT:    retq # sched: [1:1.00]
428 ;
429 ; HASWELL-SSE-LABEL: test_andnotps:
430 ; HASWELL-SSE:       # %bb.0:
431 ; HASWELL-SSE-NEXT:    andnps %xmm1, %xmm0 # sched: [1:1.00]
432 ; HASWELL-SSE-NEXT:    andnps (%rdi), %xmm0 # sched: [7:1.00]
433 ; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
434 ;
435 ; HASWELL-LABEL: test_andnotps:
436 ; HASWELL:       # %bb.0:
437 ; HASWELL-NEXT:    vandnps %xmm1, %xmm0, %xmm0 # sched: [1:1.00]
438 ; HASWELL-NEXT:    vandnps (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
439 ; HASWELL-NEXT:    retq # sched: [7:1.00]
440 ;
441 ; BROADWELL-SSE-LABEL: test_andnotps:
442 ; BROADWELL-SSE:       # %bb.0:
443 ; BROADWELL-SSE-NEXT:    andnps %xmm1, %xmm0 # sched: [1:1.00]
444 ; BROADWELL-SSE-NEXT:    andnps (%rdi), %xmm0 # sched: [6:1.00]
445 ; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
446 ;
447 ; BROADWELL-LABEL: test_andnotps:
448 ; BROADWELL:       # %bb.0:
449 ; BROADWELL-NEXT:    vandnps %xmm1, %xmm0, %xmm0 # sched: [1:1.00]
450 ; BROADWELL-NEXT:    vandnps (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
451 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
452 ;
453 ; SKYLAKE-SSE-LABEL: test_andnotps:
454 ; SKYLAKE-SSE:       # %bb.0:
455 ; SKYLAKE-SSE-NEXT:    andnps %xmm1, %xmm0 # sched: [1:0.33]
456 ; SKYLAKE-SSE-NEXT:    andnps (%rdi), %xmm0 # sched: [7:0.50]
457 ; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
458 ;
459 ; SKYLAKE-LABEL: test_andnotps:
460 ; SKYLAKE:       # %bb.0:
461 ; SKYLAKE-NEXT:    vandnps %xmm1, %xmm0, %xmm0 # sched: [1:0.33]
462 ; SKYLAKE-NEXT:    vandnps (%rdi), %xmm0, %xmm0 # sched: [7:0.50]
463 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
464 ;
465 ; SKX-SSE-LABEL: test_andnotps:
466 ; SKX-SSE:       # %bb.0:
467 ; SKX-SSE-NEXT:    andnps %xmm1, %xmm0 # sched: [1:0.33]
468 ; SKX-SSE-NEXT:    andnps (%rdi), %xmm0 # sched: [7:0.50]
469 ; SKX-SSE-NEXT:    retq # sched: [7:1.00]
470 ;
471 ; SKX-LABEL: test_andnotps:
472 ; SKX:       # %bb.0:
473 ; SKX-NEXT:    vandnps %xmm1, %xmm0, %xmm0 # sched: [1:0.33]
474 ; SKX-NEXT:    vandnps (%rdi), %xmm0, %xmm0 # sched: [7:0.50]
475 ; SKX-NEXT:    retq # sched: [7:1.00]
476 ;
477 ; BDVER2-SSE-LABEL: test_andnotps:
478 ; BDVER2-SSE:       # %bb.0:
479 ; BDVER2-SSE-NEXT:    andnps %xmm1, %xmm0 # sched: [2:0.50]
480 ; BDVER2-SSE-NEXT:    andnps (%rdi), %xmm0 # sched: [7:0.50]
481 ; BDVER2-SSE-NEXT:    retq # sched: [5:1.00]
482 ;
483 ; BDVER2-LABEL: test_andnotps:
484 ; BDVER2:       # %bb.0:
485 ; BDVER2-NEXT:    vandnps %xmm1, %xmm0, %xmm0 # sched: [2:0.50]
486 ; BDVER2-NEXT:    vandnps (%rdi), %xmm0, %xmm0 # sched: [7:0.50]
487 ; BDVER2-NEXT:    retq # sched: [5:1.00]
488 ;
489 ; BTVER2-SSE-LABEL: test_andnotps:
490 ; BTVER2-SSE:       # %bb.0:
491 ; BTVER2-SSE-NEXT:    andnps %xmm1, %xmm0 # sched: [1:0.50]
492 ; BTVER2-SSE-NEXT:    andnps (%rdi), %xmm0 # sched: [6:1.00]
493 ; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
494 ;
495 ; BTVER2-LABEL: test_andnotps:
496 ; BTVER2:       # %bb.0:
497 ; BTVER2-NEXT:    vandnps %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
498 ; BTVER2-NEXT:    vandnps (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
499 ; BTVER2-NEXT:    retq # sched: [4:1.00]
500 ;
501 ; ZNVER1-SSE-LABEL: test_andnotps:
502 ; ZNVER1-SSE:       # %bb.0:
503 ; ZNVER1-SSE-NEXT:    andnps %xmm1, %xmm0 # sched: [1:0.25]
504 ; ZNVER1-SSE-NEXT:    andnps (%rdi), %xmm0 # sched: [8:0.50]
505 ; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
506 ;
507 ; ZNVER1-LABEL: test_andnotps:
508 ; ZNVER1:       # %bb.0:
509 ; ZNVER1-NEXT:    vandnps %xmm1, %xmm0, %xmm0 # sched: [1:0.25]
510 ; ZNVER1-NEXT:    vandnps (%rdi), %xmm0, %xmm0 # sched: [8:0.50]
511 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
512   %1 = bitcast <4 x float> %a0 to <4 x i32>
513   %2 = bitcast <4 x float> %a1 to <4 x i32>
514   %3 = xor <4 x i32> %1, <i32 -1, i32 -1, i32 -1, i32 -1>
515   %4 = and <4 x i32> %3, %2
516   %5 = load <4 x float>, <4 x float> *%a2, align 16
517   %6 = bitcast <4 x float> %5 to <4 x i32>
518   %7 = xor <4 x i32> %4, <i32 -1, i32 -1, i32 -1, i32 -1>
519   %8 = and <4 x i32> %6, %7
520   %9 = bitcast <4 x i32> %8 to <4 x float>
521   ret <4 x float> %9
522 }
523
524 define <4 x float> @test_cmpps(<4 x float> %a0, <4 x float> %a1, <4 x float> *%a2) {
525 ; GENERIC-LABEL: test_cmpps:
526 ; GENERIC:       # %bb.0:
527 ; GENERIC-NEXT:    cmpeqps %xmm0, %xmm1 # sched: [3:1.00]
528 ; GENERIC-NEXT:    cmpeqps (%rdi), %xmm0 # sched: [9:1.00]
529 ; GENERIC-NEXT:    orps %xmm1, %xmm0 # sched: [1:1.00]
530 ; GENERIC-NEXT:    retq # sched: [1:1.00]
531 ;
532 ; ATOM-LABEL: test_cmpps:
533 ; ATOM:       # %bb.0:
534 ; ATOM-NEXT:    cmpeqps %xmm0, %xmm1 # sched: [5:5.00]
535 ; ATOM-NEXT:    cmpeqps (%rdi), %xmm0 # sched: [5:5.00]
536 ; ATOM-NEXT:    orps %xmm1, %xmm0 # sched: [1:0.50]
537 ; ATOM-NEXT:    retq # sched: [79:39.50]
538 ;
539 ; SLM-LABEL: test_cmpps:
540 ; SLM:       # %bb.0:
541 ; SLM-NEXT:    cmpeqps %xmm0, %xmm1 # sched: [3:1.00]
542 ; SLM-NEXT:    cmpeqps (%rdi), %xmm0 # sched: [6:1.00]
543 ; SLM-NEXT:    orps %xmm1, %xmm0 # sched: [1:0.50]
544 ; SLM-NEXT:    retq # sched: [4:1.00]
545 ;
546 ; SANDY-SSE-LABEL: test_cmpps:
547 ; SANDY-SSE:       # %bb.0:
548 ; SANDY-SSE-NEXT:    cmpeqps %xmm0, %xmm1 # sched: [3:1.00]
549 ; SANDY-SSE-NEXT:    cmpeqps (%rdi), %xmm0 # sched: [9:1.00]
550 ; SANDY-SSE-NEXT:    orps %xmm1, %xmm0 # sched: [1:1.00]
551 ; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
552 ;
553 ; SANDY-LABEL: test_cmpps:
554 ; SANDY:       # %bb.0:
555 ; SANDY-NEXT:    vcmpeqps %xmm1, %xmm0, %xmm1 # sched: [3:1.00]
556 ; SANDY-NEXT:    vcmpeqps (%rdi), %xmm0, %xmm0 # sched: [9:1.00]
557 ; SANDY-NEXT:    vorps %xmm0, %xmm1, %xmm0 # sched: [1:1.00]
558 ; SANDY-NEXT:    retq # sched: [1:1.00]
559 ;
560 ; HASWELL-SSE-LABEL: test_cmpps:
561 ; HASWELL-SSE:       # %bb.0:
562 ; HASWELL-SSE-NEXT:    cmpeqps %xmm0, %xmm1 # sched: [3:1.00]
563 ; HASWELL-SSE-NEXT:    cmpeqps (%rdi), %xmm0 # sched: [9:1.00]
564 ; HASWELL-SSE-NEXT:    orps %xmm1, %xmm0 # sched: [1:1.00]
565 ; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
566 ;
567 ; HASWELL-LABEL: test_cmpps:
568 ; HASWELL:       # %bb.0:
569 ; HASWELL-NEXT:    vcmpeqps %xmm1, %xmm0, %xmm1 # sched: [3:1.00]
570 ; HASWELL-NEXT:    vcmpeqps (%rdi), %xmm0, %xmm0 # sched: [9:1.00]
571 ; HASWELL-NEXT:    vorps %xmm0, %xmm1, %xmm0 # sched: [1:1.00]
572 ; HASWELL-NEXT:    retq # sched: [7:1.00]
573 ;
574 ; BROADWELL-SSE-LABEL: test_cmpps:
575 ; BROADWELL-SSE:       # %bb.0:
576 ; BROADWELL-SSE-NEXT:    cmpeqps %xmm0, %xmm1 # sched: [3:1.00]
577 ; BROADWELL-SSE-NEXT:    cmpeqps (%rdi), %xmm0 # sched: [8:1.00]
578 ; BROADWELL-SSE-NEXT:    orps %xmm1, %xmm0 # sched: [1:1.00]
579 ; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
580 ;
581 ; BROADWELL-LABEL: test_cmpps:
582 ; BROADWELL:       # %bb.0:
583 ; BROADWELL-NEXT:    vcmpeqps %xmm1, %xmm0, %xmm1 # sched: [3:1.00]
584 ; BROADWELL-NEXT:    vcmpeqps (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
585 ; BROADWELL-NEXT:    vorps %xmm0, %xmm1, %xmm0 # sched: [1:1.00]
586 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
587 ;
588 ; SKYLAKE-SSE-LABEL: test_cmpps:
589 ; SKYLAKE-SSE:       # %bb.0:
590 ; SKYLAKE-SSE-NEXT:    cmpeqps %xmm0, %xmm1 # sched: [4:0.50]
591 ; SKYLAKE-SSE-NEXT:    cmpeqps (%rdi), %xmm0 # sched: [10:0.50]
592 ; SKYLAKE-SSE-NEXT:    orps %xmm1, %xmm0 # sched: [1:0.33]
593 ; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
594 ;
595 ; SKYLAKE-LABEL: test_cmpps:
596 ; SKYLAKE:       # %bb.0:
597 ; SKYLAKE-NEXT:    vcmpeqps %xmm1, %xmm0, %xmm1 # sched: [4:0.50]
598 ; SKYLAKE-NEXT:    vcmpeqps (%rdi), %xmm0, %xmm0 # sched: [10:0.50]
599 ; SKYLAKE-NEXT:    vorps %xmm0, %xmm1, %xmm0 # sched: [1:0.33]
600 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
601 ;
602 ; SKX-SSE-LABEL: test_cmpps:
603 ; SKX-SSE:       # %bb.0:
604 ; SKX-SSE-NEXT:    cmpeqps %xmm0, %xmm1 # sched: [4:0.50]
605 ; SKX-SSE-NEXT:    cmpeqps (%rdi), %xmm0 # sched: [10:0.50]
606 ; SKX-SSE-NEXT:    orps %xmm1, %xmm0 # sched: [1:0.33]
607 ; SKX-SSE-NEXT:    retq # sched: [7:1.00]
608 ;
609 ; SKX-LABEL: test_cmpps:
610 ; SKX:       # %bb.0:
611 ; SKX-NEXT:    vcmpeqps %xmm1, %xmm0, %xmm1 # sched: [4:0.50]
612 ; SKX-NEXT:    vcmpeqps (%rdi), %xmm0, %xmm0 # sched: [10:0.50]
613 ; SKX-NEXT:    vorps %xmm0, %xmm1, %xmm0 # sched: [1:0.33]
614 ; SKX-NEXT:    retq # sched: [7:1.00]
615 ;
616 ; BDVER2-SSE-LABEL: test_cmpps:
617 ; BDVER2-SSE:       # %bb.0:
618 ; BDVER2-SSE-NEXT:    cmpeqps %xmm0, %xmm1 # sched: [2:1.00]
619 ; BDVER2-SSE-NEXT:    cmpeqps (%rdi), %xmm0 # sched: [7:1.00]
620 ; BDVER2-SSE-NEXT:    orps %xmm1, %xmm0 # sched: [2:0.50]
621 ; BDVER2-SSE-NEXT:    retq # sched: [5:1.00]
622 ;
623 ; BDVER2-LABEL: test_cmpps:
624 ; BDVER2:       # %bb.0:
625 ; BDVER2-NEXT:    vcmpeqps %xmm1, %xmm0, %xmm1 # sched: [2:1.00]
626 ; BDVER2-NEXT:    vcmpeqps (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
627 ; BDVER2-NEXT:    vorps %xmm0, %xmm1, %xmm0 # sched: [2:0.50]
628 ; BDVER2-NEXT:    retq # sched: [5:1.00]
629 ;
630 ; BTVER2-SSE-LABEL: test_cmpps:
631 ; BTVER2-SSE:       # %bb.0:
632 ; BTVER2-SSE-NEXT:    cmpeqps %xmm0, %xmm1 # sched: [2:1.00]
633 ; BTVER2-SSE-NEXT:    cmpeqps (%rdi), %xmm0 # sched: [7:1.00]
634 ; BTVER2-SSE-NEXT:    orps %xmm1, %xmm0 # sched: [1:0.50]
635 ; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
636 ;
637 ; BTVER2-LABEL: test_cmpps:
638 ; BTVER2:       # %bb.0:
639 ; BTVER2-NEXT:    vcmpeqps %xmm1, %xmm0, %xmm1 # sched: [2:1.00]
640 ; BTVER2-NEXT:    vcmpeqps (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
641 ; BTVER2-NEXT:    vorps %xmm0, %xmm1, %xmm0 # sched: [1:0.50]
642 ; BTVER2-NEXT:    retq # sched: [4:1.00]
643 ;
644 ; ZNVER1-SSE-LABEL: test_cmpps:
645 ; ZNVER1-SSE:       # %bb.0:
646 ; ZNVER1-SSE-NEXT:    cmpeqps %xmm0, %xmm1 # sched: [3:1.00]
647 ; ZNVER1-SSE-NEXT:    cmpeqps (%rdi), %xmm0 # sched: [10:1.00]
648 ; ZNVER1-SSE-NEXT:    orps %xmm1, %xmm0 # sched: [1:0.25]
649 ; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
650 ;
651 ; ZNVER1-LABEL: test_cmpps:
652 ; ZNVER1:       # %bb.0:
653 ; ZNVER1-NEXT:    vcmpeqps %xmm1, %xmm0, %xmm1 # sched: [3:1.00]
654 ; ZNVER1-NEXT:    vcmpeqps (%rdi), %xmm0, %xmm0 # sched: [10:1.00]
655 ; ZNVER1-NEXT:    vorps %xmm0, %xmm1, %xmm0 # sched: [1:0.25]
656 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
657   %1 = fcmp oeq <4 x float> %a0, %a1
658   %2 = load <4 x float>, <4 x float> *%a2, align 16
659   %3 = fcmp oeq <4 x float> %a0, %2
660   %4 = sext <4 x i1> %1 to <4 x i32>
661   %5 = sext <4 x i1> %3 to <4 x i32>
662   %6 = or <4 x i32> %4, %5
663   %7 = bitcast <4 x i32> %6 to <4 x float>
664   ret <4 x float> %7
665 }
666
667 define float @test_cmpss(float %a0, float %a1, float *%a2) {
668 ; GENERIC-LABEL: test_cmpss:
669 ; GENERIC:       # %bb.0:
670 ; GENERIC-NEXT:    cmpeqss %xmm1, %xmm0 # sched: [3:1.00]
671 ; GENERIC-NEXT:    cmpeqss (%rdi), %xmm0 # sched: [9:1.00]
672 ; GENERIC-NEXT:    retq # sched: [1:1.00]
673 ;
674 ; ATOM-LABEL: test_cmpss:
675 ; ATOM:       # %bb.0:
676 ; ATOM-NEXT:    cmpeqss %xmm1, %xmm0 # sched: [5:5.00]
677 ; ATOM-NEXT:    cmpeqss (%rdi), %xmm0 # sched: [5:5.00]
678 ; ATOM-NEXT:    retq # sched: [79:39.50]
679 ;
680 ; SLM-LABEL: test_cmpss:
681 ; SLM:       # %bb.0:
682 ; SLM-NEXT:    cmpeqss %xmm1, %xmm0 # sched: [3:1.00]
683 ; SLM-NEXT:    cmpeqss (%rdi), %xmm0 # sched: [6:1.00]
684 ; SLM-NEXT:    retq # sched: [4:1.00]
685 ;
686 ; SANDY-SSE-LABEL: test_cmpss:
687 ; SANDY-SSE:       # %bb.0:
688 ; SANDY-SSE-NEXT:    cmpeqss %xmm1, %xmm0 # sched: [3:1.00]
689 ; SANDY-SSE-NEXT:    cmpeqss (%rdi), %xmm0 # sched: [9:1.00]
690 ; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
691 ;
692 ; SANDY-LABEL: test_cmpss:
693 ; SANDY:       # %bb.0:
694 ; SANDY-NEXT:    vcmpeqss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
695 ; SANDY-NEXT:    vcmpeqss (%rdi), %xmm0, %xmm0 # sched: [9:1.00]
696 ; SANDY-NEXT:    retq # sched: [1:1.00]
697 ;
698 ; HASWELL-SSE-LABEL: test_cmpss:
699 ; HASWELL-SSE:       # %bb.0:
700 ; HASWELL-SSE-NEXT:    cmpeqss %xmm1, %xmm0 # sched: [3:1.00]
701 ; HASWELL-SSE-NEXT:    cmpeqss (%rdi), %xmm0 # sched: [8:1.00]
702 ; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
703 ;
704 ; HASWELL-LABEL: test_cmpss:
705 ; HASWELL:       # %bb.0:
706 ; HASWELL-NEXT:    vcmpeqss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
707 ; HASWELL-NEXT:    vcmpeqss (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
708 ; HASWELL-NEXT:    retq # sched: [7:1.00]
709 ;
710 ; BROADWELL-SSE-LABEL: test_cmpss:
711 ; BROADWELL-SSE:       # %bb.0:
712 ; BROADWELL-SSE-NEXT:    cmpeqss %xmm1, %xmm0 # sched: [3:1.00]
713 ; BROADWELL-SSE-NEXT:    cmpeqss (%rdi), %xmm0 # sched: [8:1.00]
714 ; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
715 ;
716 ; BROADWELL-LABEL: test_cmpss:
717 ; BROADWELL:       # %bb.0:
718 ; BROADWELL-NEXT:    vcmpeqss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
719 ; BROADWELL-NEXT:    vcmpeqss (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
720 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
721 ;
722 ; SKYLAKE-SSE-LABEL: test_cmpss:
723 ; SKYLAKE-SSE:       # %bb.0:
724 ; SKYLAKE-SSE-NEXT:    cmpeqss %xmm1, %xmm0 # sched: [4:0.50]
725 ; SKYLAKE-SSE-NEXT:    cmpeqss (%rdi), %xmm0 # sched: [9:0.50]
726 ; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
727 ;
728 ; SKYLAKE-LABEL: test_cmpss:
729 ; SKYLAKE:       # %bb.0:
730 ; SKYLAKE-NEXT:    vcmpeqss %xmm1, %xmm0, %xmm0 # sched: [4:0.50]
731 ; SKYLAKE-NEXT:    vcmpeqss (%rdi), %xmm0, %xmm0 # sched: [9:0.50]
732 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
733 ;
734 ; SKX-SSE-LABEL: test_cmpss:
735 ; SKX-SSE:       # %bb.0:
736 ; SKX-SSE-NEXT:    cmpeqss %xmm1, %xmm0 # sched: [4:0.50]
737 ; SKX-SSE-NEXT:    cmpeqss (%rdi), %xmm0 # sched: [9:0.50]
738 ; SKX-SSE-NEXT:    retq # sched: [7:1.00]
739 ;
740 ; SKX-LABEL: test_cmpss:
741 ; SKX:       # %bb.0:
742 ; SKX-NEXT:    vcmpeqss %xmm1, %xmm0, %xmm0 # sched: [4:0.50]
743 ; SKX-NEXT:    vcmpeqss (%rdi), %xmm0, %xmm0 # sched: [9:0.50]
744 ; SKX-NEXT:    retq # sched: [7:1.00]
745 ;
746 ; BDVER2-SSE-LABEL: test_cmpss:
747 ; BDVER2-SSE:       # %bb.0:
748 ; BDVER2-SSE-NEXT:    cmpeqss %xmm1, %xmm0 # sched: [2:1.00]
749 ; BDVER2-SSE-NEXT:    cmpeqss (%rdi), %xmm0 # sched: [7:1.00]
750 ; BDVER2-SSE-NEXT:    retq # sched: [5:1.00]
751 ;
752 ; BDVER2-LABEL: test_cmpss:
753 ; BDVER2:       # %bb.0:
754 ; BDVER2-NEXT:    vcmpeqss %xmm1, %xmm0, %xmm0 # sched: [2:1.00]
755 ; BDVER2-NEXT:    vcmpeqss (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
756 ; BDVER2-NEXT:    retq # sched: [5:1.00]
757 ;
758 ; BTVER2-SSE-LABEL: test_cmpss:
759 ; BTVER2-SSE:       # %bb.0:
760 ; BTVER2-SSE-NEXT:    cmpeqss %xmm1, %xmm0 # sched: [2:1.00]
761 ; BTVER2-SSE-NEXT:    cmpeqss (%rdi), %xmm0 # sched: [7:1.00]
762 ; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
763 ;
764 ; BTVER2-LABEL: test_cmpss:
765 ; BTVER2:       # %bb.0:
766 ; BTVER2-NEXT:    vcmpeqss %xmm1, %xmm0, %xmm0 # sched: [2:1.00]
767 ; BTVER2-NEXT:    vcmpeqss (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
768 ; BTVER2-NEXT:    retq # sched: [4:1.00]
769 ;
770 ; ZNVER1-SSE-LABEL: test_cmpss:
771 ; ZNVER1-SSE:       # %bb.0:
772 ; ZNVER1-SSE-NEXT:    cmpeqss %xmm1, %xmm0 # sched: [3:1.00]
773 ; ZNVER1-SSE-NEXT:    cmpeqss (%rdi), %xmm0 # sched: [10:1.00]
774 ; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
775 ;
776 ; ZNVER1-LABEL: test_cmpss:
777 ; ZNVER1:       # %bb.0:
778 ; ZNVER1-NEXT:    vcmpeqss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
779 ; ZNVER1-NEXT:    vcmpeqss (%rdi), %xmm0, %xmm0 # sched: [10:1.00]
780 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
781   %1 = insertelement <4 x float> undef, float %a0, i32 0
782   %2 = insertelement <4 x float> undef, float %a1, i32 0
783   %3 = call <4 x float> @llvm.x86.sse.cmp.ss(<4 x float> %1, <4 x float> %2, i8 0)
784   %4 = load float, float *%a2, align 4
785   %5 = insertelement <4 x float> undef, float %4, i32 0
786   %6 = call <4 x float> @llvm.x86.sse.cmp.ss(<4 x float> %3, <4 x float> %5, i8 0)
787   %7 = extractelement <4 x float> %6, i32 0
788   ret float %7
789 }
790 declare <4 x float> @llvm.x86.sse.cmp.ss(<4 x float>, <4 x float>, i8) nounwind readnone
791
792 define i32 @test_comiss(<4 x float> %a0, <4 x float> %a1, <4 x float> *%a2) {
793 ; GENERIC-LABEL: test_comiss:
794 ; GENERIC:       # %bb.0:
795 ; GENERIC-NEXT:    comiss %xmm1, %xmm0 # sched: [2:1.00]
796 ; GENERIC-NEXT:    setnp %al # sched: [1:0.50]
797 ; GENERIC-NEXT:    sete %cl # sched: [1:0.50]
798 ; GENERIC-NEXT:    andb %al, %cl # sched: [1:0.33]
799 ; GENERIC-NEXT:    comiss (%rdi), %xmm0 # sched: [8:1.00]
800 ; GENERIC-NEXT:    setnp %al # sched: [1:0.50]
801 ; GENERIC-NEXT:    sete %dl # sched: [1:0.50]
802 ; GENERIC-NEXT:    andb %al, %dl # sched: [1:0.33]
803 ; GENERIC-NEXT:    orb %cl, %dl # sched: [1:0.33]
804 ; GENERIC-NEXT:    movzbl %dl, %eax # sched: [1:0.33]
805 ; GENERIC-NEXT:    retq # sched: [1:1.00]
806 ;
807 ; ATOM-LABEL: test_comiss:
808 ; ATOM:       # %bb.0:
809 ; ATOM-NEXT:    comiss %xmm1, %xmm0 # sched: [9:4.50]
810 ; ATOM-NEXT:    setnp %al # sched: [1:0.50]
811 ; ATOM-NEXT:    sete %cl # sched: [1:0.50]
812 ; ATOM-NEXT:    andb %al, %cl # sched: [1:0.50]
813 ; ATOM-NEXT:    comiss (%rdi), %xmm0 # sched: [10:5.00]
814 ; ATOM-NEXT:    setnp %al # sched: [1:0.50]
815 ; ATOM-NEXT:    sete %dl # sched: [1:0.50]
816 ; ATOM-NEXT:    andb %al, %dl # sched: [1:0.50]
817 ; ATOM-NEXT:    orb %cl, %dl # sched: [1:0.50]
818 ; ATOM-NEXT:    movzbl %dl, %eax # sched: [1:1.00]
819 ; ATOM-NEXT:    retq # sched: [79:39.50]
820 ;
821 ; SLM-LABEL: test_comiss:
822 ; SLM:       # %bb.0:
823 ; SLM-NEXT:    comiss %xmm1, %xmm0 # sched: [3:1.00]
824 ; SLM-NEXT:    setnp %al # sched: [1:0.50]
825 ; SLM-NEXT:    sete %cl # sched: [1:0.50]
826 ; SLM-NEXT:    andb %al, %cl # sched: [1:0.50]
827 ; SLM-NEXT:    comiss (%rdi), %xmm0 # sched: [6:1.00]
828 ; SLM-NEXT:    setnp %al # sched: [1:0.50]
829 ; SLM-NEXT:    sete %dl # sched: [1:0.50]
830 ; SLM-NEXT:    andb %al, %dl # sched: [1:0.50]
831 ; SLM-NEXT:    orb %cl, %dl # sched: [1:0.50]
832 ; SLM-NEXT:    movzbl %dl, %eax # sched: [1:0.50]
833 ; SLM-NEXT:    retq # sched: [4:1.00]
834 ;
835 ; SANDY-SSE-LABEL: test_comiss:
836 ; SANDY-SSE:       # %bb.0:
837 ; SANDY-SSE-NEXT:    comiss %xmm1, %xmm0 # sched: [2:1.00]
838 ; SANDY-SSE-NEXT:    setnp %al # sched: [1:0.50]
839 ; SANDY-SSE-NEXT:    sete %cl # sched: [1:0.50]
840 ; SANDY-SSE-NEXT:    andb %al, %cl # sched: [1:0.33]
841 ; SANDY-SSE-NEXT:    comiss (%rdi), %xmm0 # sched: [8:1.00]
842 ; SANDY-SSE-NEXT:    setnp %al # sched: [1:0.50]
843 ; SANDY-SSE-NEXT:    sete %dl # sched: [1:0.50]
844 ; SANDY-SSE-NEXT:    andb %al, %dl # sched: [1:0.33]
845 ; SANDY-SSE-NEXT:    orb %cl, %dl # sched: [1:0.33]
846 ; SANDY-SSE-NEXT:    movzbl %dl, %eax # sched: [1:0.33]
847 ; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
848 ;
849 ; SANDY-LABEL: test_comiss:
850 ; SANDY:       # %bb.0:
851 ; SANDY-NEXT:    vcomiss %xmm1, %xmm0 # sched: [2:1.00]
852 ; SANDY-NEXT:    setnp %al # sched: [1:0.50]
853 ; SANDY-NEXT:    sete %cl # sched: [1:0.50]
854 ; SANDY-NEXT:    andb %al, %cl # sched: [1:0.33]
855 ; SANDY-NEXT:    vcomiss (%rdi), %xmm0 # sched: [8:1.00]
856 ; SANDY-NEXT:    setnp %al # sched: [1:0.50]
857 ; SANDY-NEXT:    sete %dl # sched: [1:0.50]
858 ; SANDY-NEXT:    andb %al, %dl # sched: [1:0.33]
859 ; SANDY-NEXT:    orb %cl, %dl # sched: [1:0.33]
860 ; SANDY-NEXT:    movzbl %dl, %eax # sched: [1:0.33]
861 ; SANDY-NEXT:    retq # sched: [1:1.00]
862 ;
863 ; HASWELL-SSE-LABEL: test_comiss:
864 ; HASWELL-SSE:       # %bb.0:
865 ; HASWELL-SSE-NEXT:    comiss %xmm1, %xmm0 # sched: [3:1.00]
866 ; HASWELL-SSE-NEXT:    setnp %al # sched: [1:0.50]
867 ; HASWELL-SSE-NEXT:    sete %cl # sched: [1:0.50]
868 ; HASWELL-SSE-NEXT:    andb %al, %cl # sched: [1:0.25]
869 ; HASWELL-SSE-NEXT:    comiss (%rdi), %xmm0 # sched: [8:1.00]
870 ; HASWELL-SSE-NEXT:    setnp %al # sched: [1:0.50]
871 ; HASWELL-SSE-NEXT:    sete %dl # sched: [1:0.50]
872 ; HASWELL-SSE-NEXT:    andb %al, %dl # sched: [1:0.25]
873 ; HASWELL-SSE-NEXT:    orb %cl, %dl # sched: [1:0.25]
874 ; HASWELL-SSE-NEXT:    movzbl %dl, %eax # sched: [1:0.25]
875 ; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
876 ;
877 ; HASWELL-LABEL: test_comiss:
878 ; HASWELL:       # %bb.0:
879 ; HASWELL-NEXT:    vcomiss %xmm1, %xmm0 # sched: [3:1.00]
880 ; HASWELL-NEXT:    setnp %al # sched: [1:0.50]
881 ; HASWELL-NEXT:    sete %cl # sched: [1:0.50]
882 ; HASWELL-NEXT:    andb %al, %cl # sched: [1:0.25]
883 ; HASWELL-NEXT:    vcomiss (%rdi), %xmm0 # sched: [8:1.00]
884 ; HASWELL-NEXT:    setnp %al # sched: [1:0.50]
885 ; HASWELL-NEXT:    sete %dl # sched: [1:0.50]
886 ; HASWELL-NEXT:    andb %al, %dl # sched: [1:0.25]
887 ; HASWELL-NEXT:    orb %cl, %dl # sched: [1:0.25]
888 ; HASWELL-NEXT:    movzbl %dl, %eax # sched: [1:0.25]
889 ; HASWELL-NEXT:    retq # sched: [7:1.00]
890 ;
891 ; BROADWELL-SSE-LABEL: test_comiss:
892 ; BROADWELL-SSE:       # %bb.0:
893 ; BROADWELL-SSE-NEXT:    comiss %xmm1, %xmm0 # sched: [3:1.00]
894 ; BROADWELL-SSE-NEXT:    setnp %al # sched: [1:0.50]
895 ; BROADWELL-SSE-NEXT:    sete %cl # sched: [1:0.50]
896 ; BROADWELL-SSE-NEXT:    andb %al, %cl # sched: [1:0.25]
897 ; BROADWELL-SSE-NEXT:    comiss (%rdi), %xmm0 # sched: [8:1.00]
898 ; BROADWELL-SSE-NEXT:    setnp %al # sched: [1:0.50]
899 ; BROADWELL-SSE-NEXT:    sete %dl # sched: [1:0.50]
900 ; BROADWELL-SSE-NEXT:    andb %al, %dl # sched: [1:0.25]
901 ; BROADWELL-SSE-NEXT:    orb %cl, %dl # sched: [1:0.25]
902 ; BROADWELL-SSE-NEXT:    movzbl %dl, %eax # sched: [1:0.25]
903 ; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
904 ;
905 ; BROADWELL-LABEL: test_comiss:
906 ; BROADWELL:       # %bb.0:
907 ; BROADWELL-NEXT:    vcomiss %xmm1, %xmm0 # sched: [3:1.00]
908 ; BROADWELL-NEXT:    setnp %al # sched: [1:0.50]
909 ; BROADWELL-NEXT:    sete %cl # sched: [1:0.50]
910 ; BROADWELL-NEXT:    andb %al, %cl # sched: [1:0.25]
911 ; BROADWELL-NEXT:    vcomiss (%rdi), %xmm0 # sched: [8:1.00]
912 ; BROADWELL-NEXT:    setnp %al # sched: [1:0.50]
913 ; BROADWELL-NEXT:    sete %dl # sched: [1:0.50]
914 ; BROADWELL-NEXT:    andb %al, %dl # sched: [1:0.25]
915 ; BROADWELL-NEXT:    orb %cl, %dl # sched: [1:0.25]
916 ; BROADWELL-NEXT:    movzbl %dl, %eax # sched: [1:0.25]
917 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
918 ;
919 ; SKYLAKE-SSE-LABEL: test_comiss:
920 ; SKYLAKE-SSE:       # %bb.0:
921 ; SKYLAKE-SSE-NEXT:    comiss %xmm1, %xmm0 # sched: [2:1.00]
922 ; SKYLAKE-SSE-NEXT:    setnp %al # sched: [1:0.50]
923 ; SKYLAKE-SSE-NEXT:    sete %cl # sched: [1:0.50]
924 ; SKYLAKE-SSE-NEXT:    andb %al, %cl # sched: [1:0.25]
925 ; SKYLAKE-SSE-NEXT:    comiss (%rdi), %xmm0 # sched: [7:1.00]
926 ; SKYLAKE-SSE-NEXT:    setnp %al # sched: [1:0.50]
927 ; SKYLAKE-SSE-NEXT:    sete %dl # sched: [1:0.50]
928 ; SKYLAKE-SSE-NEXT:    andb %al, %dl # sched: [1:0.25]
929 ; SKYLAKE-SSE-NEXT:    orb %cl, %dl # sched: [1:0.25]
930 ; SKYLAKE-SSE-NEXT:    movzbl %dl, %eax # sched: [1:0.25]
931 ; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
932 ;
933 ; SKYLAKE-LABEL: test_comiss:
934 ; SKYLAKE:       # %bb.0:
935 ; SKYLAKE-NEXT:    vcomiss %xmm1, %xmm0 # sched: [2:1.00]
936 ; SKYLAKE-NEXT:    setnp %al # sched: [1:0.50]
937 ; SKYLAKE-NEXT:    sete %cl # sched: [1:0.50]
938 ; SKYLAKE-NEXT:    andb %al, %cl # sched: [1:0.25]
939 ; SKYLAKE-NEXT:    vcomiss (%rdi), %xmm0 # sched: [7:1.00]
940 ; SKYLAKE-NEXT:    setnp %al # sched: [1:0.50]
941 ; SKYLAKE-NEXT:    sete %dl # sched: [1:0.50]
942 ; SKYLAKE-NEXT:    andb %al, %dl # sched: [1:0.25]
943 ; SKYLAKE-NEXT:    orb %cl, %dl # sched: [1:0.25]
944 ; SKYLAKE-NEXT:    movzbl %dl, %eax # sched: [1:0.25]
945 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
946 ;
947 ; SKX-SSE-LABEL: test_comiss:
948 ; SKX-SSE:       # %bb.0:
949 ; SKX-SSE-NEXT:    comiss %xmm1, %xmm0 # sched: [2:1.00]
950 ; SKX-SSE-NEXT:    setnp %al # sched: [1:0.50]
951 ; SKX-SSE-NEXT:    sete %cl # sched: [1:0.50]
952 ; SKX-SSE-NEXT:    andb %al, %cl # sched: [1:0.25]
953 ; SKX-SSE-NEXT:    comiss (%rdi), %xmm0 # sched: [7:1.00]
954 ; SKX-SSE-NEXT:    setnp %al # sched: [1:0.50]
955 ; SKX-SSE-NEXT:    sete %dl # sched: [1:0.50]
956 ; SKX-SSE-NEXT:    andb %al, %dl # sched: [1:0.25]
957 ; SKX-SSE-NEXT:    orb %cl, %dl # sched: [1:0.25]
958 ; SKX-SSE-NEXT:    movzbl %dl, %eax # sched: [1:0.25]
959 ; SKX-SSE-NEXT:    retq # sched: [7:1.00]
960 ;
961 ; SKX-LABEL: test_comiss:
962 ; SKX:       # %bb.0:
963 ; SKX-NEXT:    vcomiss %xmm1, %xmm0 # sched: [2:1.00]
964 ; SKX-NEXT:    setnp %al # sched: [1:0.50]
965 ; SKX-NEXT:    sete %cl # sched: [1:0.50]
966 ; SKX-NEXT:    andb %al, %cl # sched: [1:0.25]
967 ; SKX-NEXT:    vcomiss (%rdi), %xmm0 # sched: [7:1.00]
968 ; SKX-NEXT:    setnp %al # sched: [1:0.50]
969 ; SKX-NEXT:    sete %dl # sched: [1:0.50]
970 ; SKX-NEXT:    andb %al, %dl # sched: [1:0.25]
971 ; SKX-NEXT:    orb %cl, %dl # sched: [1:0.25]
972 ; SKX-NEXT:    movzbl %dl, %eax # sched: [1:0.25]
973 ; SKX-NEXT:    retq # sched: [7:1.00]
974 ;
975 ; BDVER2-SSE-LABEL: test_comiss:
976 ; BDVER2-SSE:       # %bb.0:
977 ; BDVER2-SSE-NEXT:    comiss %xmm1, %xmm0 # sched: [1:1.00]
978 ; BDVER2-SSE-NEXT:    setnp %al # sched: [1:0.50]
979 ; BDVER2-SSE-NEXT:    sete %cl # sched: [1:0.50]
980 ; BDVER2-SSE-NEXT:    andb %al, %cl # sched: [1:0.50]
981 ; BDVER2-SSE-NEXT:    comiss (%rdi), %xmm0 # sched: [6:1.00]
982 ; BDVER2-SSE-NEXT:    setnp %al # sched: [1:0.50]
983 ; BDVER2-SSE-NEXT:    sete %dl # sched: [1:0.50]
984 ; BDVER2-SSE-NEXT:    andb %al, %dl # sched: [1:0.50]
985 ; BDVER2-SSE-NEXT:    orb %cl, %dl # sched: [1:0.50]
986 ; BDVER2-SSE-NEXT:    movzbl %dl, %eax # sched: [1:0.50]
987 ; BDVER2-SSE-NEXT:    retq # sched: [5:1.00]
988 ;
989 ; BDVER2-LABEL: test_comiss:
990 ; BDVER2:       # %bb.0:
991 ; BDVER2-NEXT:    vcomiss %xmm1, %xmm0 # sched: [1:1.00]
992 ; BDVER2-NEXT:    setnp %al # sched: [1:0.50]
993 ; BDVER2-NEXT:    sete %cl # sched: [1:0.50]
994 ; BDVER2-NEXT:    andb %al, %cl # sched: [1:0.50]
995 ; BDVER2-NEXT:    vcomiss (%rdi), %xmm0 # sched: [6:1.00]
996 ; BDVER2-NEXT:    setnp %al # sched: [1:0.50]
997 ; BDVER2-NEXT:    sete %dl # sched: [1:0.50]
998 ; BDVER2-NEXT:    andb %al, %dl # sched: [1:0.50]
999 ; BDVER2-NEXT:    orb %cl, %dl # sched: [1:0.50]
1000 ; BDVER2-NEXT:    movzbl %dl, %eax # sched: [1:0.50]
1001 ; BDVER2-NEXT:    retq # sched: [5:1.00]
1002 ;
1003 ; BTVER2-SSE-LABEL: test_comiss:
1004 ; BTVER2-SSE:       # %bb.0:
1005 ; BTVER2-SSE-NEXT:    comiss %xmm1, %xmm0 # sched: [3:1.00]
1006 ; BTVER2-SSE-NEXT:    setnp %al # sched: [1:0.50]
1007 ; BTVER2-SSE-NEXT:    sete %cl # sched: [1:0.50]
1008 ; BTVER2-SSE-NEXT:    andb %al, %cl # sched: [1:0.50]
1009 ; BTVER2-SSE-NEXT:    comiss (%rdi), %xmm0 # sched: [8:1.00]
1010 ; BTVER2-SSE-NEXT:    setnp %al # sched: [1:0.50]
1011 ; BTVER2-SSE-NEXT:    sete %dl # sched: [1:0.50]
1012 ; BTVER2-SSE-NEXT:    andb %al, %dl # sched: [1:0.50]
1013 ; BTVER2-SSE-NEXT:    orb %cl, %dl # sched: [1:0.50]
1014 ; BTVER2-SSE-NEXT:    movzbl %dl, %eax # sched: [1:0.50]
1015 ; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
1016 ;
1017 ; BTVER2-LABEL: test_comiss:
1018 ; BTVER2:       # %bb.0:
1019 ; BTVER2-NEXT:    vcomiss %xmm1, %xmm0 # sched: [3:1.00]
1020 ; BTVER2-NEXT:    setnp %al # sched: [1:0.50]
1021 ; BTVER2-NEXT:    sete %cl # sched: [1:0.50]
1022 ; BTVER2-NEXT:    andb %al, %cl # sched: [1:0.50]
1023 ; BTVER2-NEXT:    vcomiss (%rdi), %xmm0 # sched: [8:1.00]
1024 ; BTVER2-NEXT:    setnp %al # sched: [1:0.50]
1025 ; BTVER2-NEXT:    sete %dl # sched: [1:0.50]
1026 ; BTVER2-NEXT:    andb %al, %dl # sched: [1:0.50]
1027 ; BTVER2-NEXT:    orb %cl, %dl # sched: [1:0.50]
1028 ; BTVER2-NEXT:    movzbl %dl, %eax # sched: [1:0.50]
1029 ; BTVER2-NEXT:    retq # sched: [4:1.00]
1030 ;
1031 ; ZNVER1-SSE-LABEL: test_comiss:
1032 ; ZNVER1-SSE:       # %bb.0:
1033 ; ZNVER1-SSE-NEXT:    comiss %xmm1, %xmm0 # sched: [3:1.00]
1034 ; ZNVER1-SSE-NEXT:    setnp %al # sched: [1:0.25]
1035 ; ZNVER1-SSE-NEXT:    sete %cl # sched: [1:0.25]
1036 ; ZNVER1-SSE-NEXT:    andb %al, %cl # sched: [1:0.25]
1037 ; ZNVER1-SSE-NEXT:    comiss (%rdi), %xmm0 # sched: [10:1.00]
1038 ; ZNVER1-SSE-NEXT:    setnp %al # sched: [1:0.25]
1039 ; ZNVER1-SSE-NEXT:    sete %dl # sched: [1:0.25]
1040 ; ZNVER1-SSE-NEXT:    andb %al, %dl # sched: [1:0.25]
1041 ; ZNVER1-SSE-NEXT:    orb %cl, %dl # sched: [1:0.25]
1042 ; ZNVER1-SSE-NEXT:    movzbl %dl, %eax # sched: [1:0.25]
1043 ; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
1044 ;
1045 ; ZNVER1-LABEL: test_comiss:
1046 ; ZNVER1:       # %bb.0:
1047 ; ZNVER1-NEXT:    vcomiss %xmm1, %xmm0 # sched: [3:1.00]
1048 ; ZNVER1-NEXT:    setnp %al # sched: [1:0.25]
1049 ; ZNVER1-NEXT:    sete %cl # sched: [1:0.25]
1050 ; ZNVER1-NEXT:    andb %al, %cl # sched: [1:0.25]
1051 ; ZNVER1-NEXT:    vcomiss (%rdi), %xmm0 # sched: [10:1.00]
1052 ; ZNVER1-NEXT:    setnp %al # sched: [1:0.25]
1053 ; ZNVER1-NEXT:    sete %dl # sched: [1:0.25]
1054 ; ZNVER1-NEXT:    andb %al, %dl # sched: [1:0.25]
1055 ; ZNVER1-NEXT:    orb %cl, %dl # sched: [1:0.25]
1056 ; ZNVER1-NEXT:    movzbl %dl, %eax # sched: [1:0.25]
1057 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
1058   %1 = call i32 @llvm.x86.sse.comieq.ss(<4 x float> %a0, <4 x float> %a1)
1059   %2 = load <4 x float>, <4 x float> *%a2, align 4
1060   %3 = call i32 @llvm.x86.sse.comieq.ss(<4 x float> %a0, <4 x float> %2)
1061   %4 = or i32 %1, %3
1062   ret i32 %4
1063 }
1064 declare i32 @llvm.x86.sse.comieq.ss(<4 x float>, <4 x float>) nounwind readnone
1065
1066 define float @test_cvtsi2ss(i32 %a0, i32 *%a1) {
1067 ; GENERIC-LABEL: test_cvtsi2ss:
1068 ; GENERIC:       # %bb.0:
1069 ; GENERIC-NEXT:    cvtsi2ssl %edi, %xmm1 # sched: [5:2.00]
1070 ; GENERIC-NEXT:    cvtsi2ssl (%rsi), %xmm0 # sched: [10:1.00]
1071 ; GENERIC-NEXT:    addss %xmm1, %xmm0 # sched: [3:1.00]
1072 ; GENERIC-NEXT:    retq # sched: [1:1.00]
1073 ;
1074 ; ATOM-LABEL: test_cvtsi2ss:
1075 ; ATOM:       # %bb.0:
1076 ; ATOM-NEXT:    cvtsi2ssl (%rsi), %xmm0 # sched: [7:3.50]
1077 ; ATOM-NEXT:    cvtsi2ssl %edi, %xmm1 # sched: [6:3.00]
1078 ; ATOM-NEXT:    addss %xmm1, %xmm0 # sched: [5:5.00]
1079 ; ATOM-NEXT:    retq # sched: [79:39.50]
1080 ;
1081 ; SLM-LABEL: test_cvtsi2ss:
1082 ; SLM:       # %bb.0:
1083 ; SLM-NEXT:    cvtsi2ssl (%rsi), %xmm0 # sched: [7:1.00]
1084 ; SLM-NEXT:    cvtsi2ssl %edi, %xmm1 # sched: [4:0.50]
1085 ; SLM-NEXT:    addss %xmm1, %xmm0 # sched: [3:1.00]
1086 ; SLM-NEXT:    retq # sched: [4:1.00]
1087 ;
1088 ; SANDY-SSE-LABEL: test_cvtsi2ss:
1089 ; SANDY-SSE:       # %bb.0:
1090 ; SANDY-SSE-NEXT:    cvtsi2ssl %edi, %xmm1 # sched: [5:2.00]
1091 ; SANDY-SSE-NEXT:    cvtsi2ssl (%rsi), %xmm0 # sched: [10:1.00]
1092 ; SANDY-SSE-NEXT:    addss %xmm1, %xmm0 # sched: [3:1.00]
1093 ; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
1094 ;
1095 ; SANDY-LABEL: test_cvtsi2ss:
1096 ; SANDY:       # %bb.0:
1097 ; SANDY-NEXT:    vcvtsi2ssl %edi, %xmm0, %xmm0 # sched: [5:2.00]
1098 ; SANDY-NEXT:    vcvtsi2ssl (%rsi), %xmm1, %xmm1 # sched: [10:1.00]
1099 ; SANDY-NEXT:    vaddss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
1100 ; SANDY-NEXT:    retq # sched: [1:1.00]
1101 ;
1102 ; HASWELL-SSE-LABEL: test_cvtsi2ss:
1103 ; HASWELL-SSE:       # %bb.0:
1104 ; HASWELL-SSE-NEXT:    cvtsi2ssl %edi, %xmm1 # sched: [4:1.00]
1105 ; HASWELL-SSE-NEXT:    cvtsi2ssl (%rsi), %xmm0 # sched: [9:1.00]
1106 ; HASWELL-SSE-NEXT:    addss %xmm1, %xmm0 # sched: [3:1.00]
1107 ; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
1108 ;
1109 ; HASWELL-LABEL: test_cvtsi2ss:
1110 ; HASWELL:       # %bb.0:
1111 ; HASWELL-NEXT:    vcvtsi2ssl %edi, %xmm0, %xmm0 # sched: [4:1.00]
1112 ; HASWELL-NEXT:    vcvtsi2ssl (%rsi), %xmm1, %xmm1 # sched: [9:1.00]
1113 ; HASWELL-NEXT:    vaddss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
1114 ; HASWELL-NEXT:    retq # sched: [7:1.00]
1115 ;
1116 ; BROADWELL-SSE-LABEL: test_cvtsi2ss:
1117 ; BROADWELL-SSE:       # %bb.0:
1118 ; BROADWELL-SSE-NEXT:    cvtsi2ssl %edi, %xmm1 # sched: [4:1.00]
1119 ; BROADWELL-SSE-NEXT:    cvtsi2ssl (%rsi), %xmm0 # sched: [9:1.00]
1120 ; BROADWELL-SSE-NEXT:    addss %xmm1, %xmm0 # sched: [3:1.00]
1121 ; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
1122 ;
1123 ; BROADWELL-LABEL: test_cvtsi2ss:
1124 ; BROADWELL:       # %bb.0:
1125 ; BROADWELL-NEXT:    vcvtsi2ssl %edi, %xmm0, %xmm0 # sched: [4:1.00]
1126 ; BROADWELL-NEXT:    vcvtsi2ssl (%rsi), %xmm1, %xmm1 # sched: [9:1.00]
1127 ; BROADWELL-NEXT:    vaddss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
1128 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
1129 ;
1130 ; SKYLAKE-SSE-LABEL: test_cvtsi2ss:
1131 ; SKYLAKE-SSE:       # %bb.0:
1132 ; SKYLAKE-SSE-NEXT:    cvtsi2ssl %edi, %xmm1 # sched: [5:1.00]
1133 ; SKYLAKE-SSE-NEXT:    cvtsi2ssl (%rsi), %xmm0 # sched: [9:1.00]
1134 ; SKYLAKE-SSE-NEXT:    addss %xmm1, %xmm0 # sched: [4:0.50]
1135 ; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
1136 ;
1137 ; SKYLAKE-LABEL: test_cvtsi2ss:
1138 ; SKYLAKE:       # %bb.0:
1139 ; SKYLAKE-NEXT:    vcvtsi2ssl %edi, %xmm0, %xmm0 # sched: [5:1.00]
1140 ; SKYLAKE-NEXT:    vcvtsi2ssl (%rsi), %xmm1, %xmm1 # sched: [9:1.00]
1141 ; SKYLAKE-NEXT:    vaddss %xmm1, %xmm0, %xmm0 # sched: [4:0.50]
1142 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
1143 ;
1144 ; SKX-SSE-LABEL: test_cvtsi2ss:
1145 ; SKX-SSE:       # %bb.0:
1146 ; SKX-SSE-NEXT:    cvtsi2ssl %edi, %xmm1 # sched: [5:1.00]
1147 ; SKX-SSE-NEXT:    cvtsi2ssl (%rsi), %xmm0 # sched: [9:1.00]
1148 ; SKX-SSE-NEXT:    addss %xmm1, %xmm0 # sched: [4:0.50]
1149 ; SKX-SSE-NEXT:    retq # sched: [7:1.00]
1150 ;
1151 ; SKX-LABEL: test_cvtsi2ss:
1152 ; SKX:       # %bb.0:
1153 ; SKX-NEXT:    vcvtsi2ssl %edi, %xmm0, %xmm0 # sched: [5:1.00]
1154 ; SKX-NEXT:    vcvtsi2ssl (%rsi), %xmm1, %xmm1 # sched: [9:1.00]
1155 ; SKX-NEXT:    vaddss %xmm1, %xmm0, %xmm0 # sched: [4:0.50]
1156 ; SKX-NEXT:    retq # sched: [7:1.00]
1157 ;
1158 ; BDVER2-SSE-LABEL: test_cvtsi2ss:
1159 ; BDVER2-SSE:       # %bb.0:
1160 ; BDVER2-SSE-NEXT:    cvtsi2ssl (%rsi), %xmm0 # sched: [9:1.00]
1161 ; BDVER2-SSE-NEXT:    cvtsi2ssl %edi, %xmm1 # sched: [14:1.00]
1162 ; BDVER2-SSE-NEXT:    addss %xmm1, %xmm0 # sched: [5:1.00]
1163 ; BDVER2-SSE-NEXT:    retq # sched: [5:1.00]
1164 ;
1165 ; BDVER2-LABEL: test_cvtsi2ss:
1166 ; BDVER2:       # %bb.0:
1167 ; BDVER2-NEXT:    vcvtsi2ssl %edi, %xmm0, %xmm0 # sched: [14:1.00]
1168 ; BDVER2-NEXT:    vcvtsi2ssl (%rsi), %xmm1, %xmm1 # sched: [9:1.00]
1169 ; BDVER2-NEXT:    vaddss %xmm1, %xmm0, %xmm0 # sched: [5:1.00]
1170 ; BDVER2-NEXT:    retq # sched: [5:1.00]
1171 ;
1172 ; BTVER2-SSE-LABEL: test_cvtsi2ss:
1173 ; BTVER2-SSE:       # %bb.0:
1174 ; BTVER2-SSE-NEXT:    cvtsi2ssl (%rsi), %xmm0 # sched: [9:1.00]
1175 ; BTVER2-SSE-NEXT:    cvtsi2ssl %edi, %xmm1 # sched: [10:1.00]
1176 ; BTVER2-SSE-NEXT:    addss %xmm1, %xmm0 # sched: [3:1.00]
1177 ; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
1178 ;
1179 ; BTVER2-LABEL: test_cvtsi2ss:
1180 ; BTVER2:       # %bb.0:
1181 ; BTVER2-NEXT:    vcvtsi2ssl %edi, %xmm0, %xmm0 # sched: [10:1.00]
1182 ; BTVER2-NEXT:    vcvtsi2ssl (%rsi), %xmm1, %xmm1 # sched: [9:1.00]
1183 ; BTVER2-NEXT:    vaddss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
1184 ; BTVER2-NEXT:    retq # sched: [4:1.00]
1185 ;
1186 ; ZNVER1-SSE-LABEL: test_cvtsi2ss:
1187 ; ZNVER1-SSE:       # %bb.0:
1188 ; ZNVER1-SSE-NEXT:    cvtsi2ssl (%rsi), %xmm0 # sched: [12:1.00]
1189 ; ZNVER1-SSE-NEXT:    cvtsi2ssl %edi, %xmm1 # sched: [5:1.00]
1190 ; ZNVER1-SSE-NEXT:    addss %xmm1, %xmm0 # sched: [3:1.00]
1191 ; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
1192 ;
1193 ; ZNVER1-LABEL: test_cvtsi2ss:
1194 ; ZNVER1:       # %bb.0:
1195 ; ZNVER1-NEXT:    vcvtsi2ssl %edi, %xmm0, %xmm0 # sched: [5:1.00]
1196 ; ZNVER1-NEXT:    vcvtsi2ssl (%rsi), %xmm1, %xmm1 # sched: [12:1.00]
1197 ; ZNVER1-NEXT:    vaddss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
1198 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
1199   %1 = sitofp i32 %a0 to float
1200   %2 = load i32, i32 *%a1, align 4
1201   %3 = sitofp i32 %2 to float
1202   %4 = fadd float %1, %3
1203   ret float %4
1204 }
1205
1206 define float @test_cvtsi2ssq(i64 %a0, i64 *%a1) {
1207 ; GENERIC-LABEL: test_cvtsi2ssq:
1208 ; GENERIC:       # %bb.0:
1209 ; GENERIC-NEXT:    cvtsi2ssq %rdi, %xmm1 # sched: [5:2.00]
1210 ; GENERIC-NEXT:    cvtsi2ssq (%rsi), %xmm0 # sched: [10:1.00]
1211 ; GENERIC-NEXT:    addss %xmm1, %xmm0 # sched: [3:1.00]
1212 ; GENERIC-NEXT:    retq # sched: [1:1.00]
1213 ;
1214 ; ATOM-LABEL: test_cvtsi2ssq:
1215 ; ATOM:       # %bb.0:
1216 ; ATOM-NEXT:    cvtsi2ssq (%rsi), %xmm0 # sched: [7:3.50]
1217 ; ATOM-NEXT:    cvtsi2ssq %rdi, %xmm1 # sched: [6:3.00]
1218 ; ATOM-NEXT:    addss %xmm1, %xmm0 # sched: [5:5.00]
1219 ; ATOM-NEXT:    retq # sched: [79:39.50]
1220 ;
1221 ; SLM-LABEL: test_cvtsi2ssq:
1222 ; SLM:       # %bb.0:
1223 ; SLM-NEXT:    cvtsi2ssq (%rsi), %xmm0 # sched: [7:1.00]
1224 ; SLM-NEXT:    cvtsi2ssq %rdi, %xmm1 # sched: [4:0.50]
1225 ; SLM-NEXT:    addss %xmm1, %xmm0 # sched: [3:1.00]
1226 ; SLM-NEXT:    retq # sched: [4:1.00]
1227 ;
1228 ; SANDY-SSE-LABEL: test_cvtsi2ssq:
1229 ; SANDY-SSE:       # %bb.0:
1230 ; SANDY-SSE-NEXT:    cvtsi2ssq %rdi, %xmm1 # sched: [5:2.00]
1231 ; SANDY-SSE-NEXT:    cvtsi2ssq (%rsi), %xmm0 # sched: [10:1.00]
1232 ; SANDY-SSE-NEXT:    addss %xmm1, %xmm0 # sched: [3:1.00]
1233 ; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
1234 ;
1235 ; SANDY-LABEL: test_cvtsi2ssq:
1236 ; SANDY:       # %bb.0:
1237 ; SANDY-NEXT:    vcvtsi2ssq %rdi, %xmm0, %xmm0 # sched: [5:2.00]
1238 ; SANDY-NEXT:    vcvtsi2ssq (%rsi), %xmm1, %xmm1 # sched: [10:1.00]
1239 ; SANDY-NEXT:    vaddss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
1240 ; SANDY-NEXT:    retq # sched: [1:1.00]
1241 ;
1242 ; HASWELL-SSE-LABEL: test_cvtsi2ssq:
1243 ; HASWELL-SSE:       # %bb.0:
1244 ; HASWELL-SSE-NEXT:    cvtsi2ssq %rdi, %xmm1 # sched: [5:2.00]
1245 ; HASWELL-SSE-NEXT:    cvtsi2ssq (%rsi), %xmm0 # sched: [9:1.00]
1246 ; HASWELL-SSE-NEXT:    addss %xmm1, %xmm0 # sched: [3:1.00]
1247 ; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
1248 ;
1249 ; HASWELL-LABEL: test_cvtsi2ssq:
1250 ; HASWELL:       # %bb.0:
1251 ; HASWELL-NEXT:    vcvtsi2ssq %rdi, %xmm0, %xmm0 # sched: [5:2.00]
1252 ; HASWELL-NEXT:    vcvtsi2ssq (%rsi), %xmm1, %xmm1 # sched: [9:1.00]
1253 ; HASWELL-NEXT:    vaddss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
1254 ; HASWELL-NEXT:    retq # sched: [7:1.00]
1255 ;
1256 ; BROADWELL-SSE-LABEL: test_cvtsi2ssq:
1257 ; BROADWELL-SSE:       # %bb.0:
1258 ; BROADWELL-SSE-NEXT:    cvtsi2ssq %rdi, %xmm1 # sched: [5:2.00]
1259 ; BROADWELL-SSE-NEXT:    cvtsi2ssq (%rsi), %xmm0 # sched: [9:1.00]
1260 ; BROADWELL-SSE-NEXT:    addss %xmm1, %xmm0 # sched: [3:1.00]
1261 ; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
1262 ;
1263 ; BROADWELL-LABEL: test_cvtsi2ssq:
1264 ; BROADWELL:       # %bb.0:
1265 ; BROADWELL-NEXT:    vcvtsi2ssq %rdi, %xmm0, %xmm0 # sched: [5:2.00]
1266 ; BROADWELL-NEXT:    vcvtsi2ssq (%rsi), %xmm1, %xmm1 # sched: [9:1.00]
1267 ; BROADWELL-NEXT:    vaddss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
1268 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
1269 ;
1270 ; SKYLAKE-SSE-LABEL: test_cvtsi2ssq:
1271 ; SKYLAKE-SSE:       # %bb.0:
1272 ; SKYLAKE-SSE-NEXT:    cvtsi2ssq %rdi, %xmm1 # sched: [6:2.00]
1273 ; SKYLAKE-SSE-NEXT:    cvtsi2ssq (%rsi), %xmm0 # sched: [9:1.00]
1274 ; SKYLAKE-SSE-NEXT:    addss %xmm1, %xmm0 # sched: [4:0.50]
1275 ; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
1276 ;
1277 ; SKYLAKE-LABEL: test_cvtsi2ssq:
1278 ; SKYLAKE:       # %bb.0:
1279 ; SKYLAKE-NEXT:    vcvtsi2ssq %rdi, %xmm0, %xmm0 # sched: [6:2.00]
1280 ; SKYLAKE-NEXT:    vcvtsi2ssq (%rsi), %xmm1, %xmm1 # sched: [9:1.00]
1281 ; SKYLAKE-NEXT:    vaddss %xmm1, %xmm0, %xmm0 # sched: [4:0.50]
1282 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
1283 ;
1284 ; SKX-SSE-LABEL: test_cvtsi2ssq:
1285 ; SKX-SSE:       # %bb.0:
1286 ; SKX-SSE-NEXT:    cvtsi2ssq %rdi, %xmm1 # sched: [6:2.00]
1287 ; SKX-SSE-NEXT:    cvtsi2ssq (%rsi), %xmm0 # sched: [9:1.00]
1288 ; SKX-SSE-NEXT:    addss %xmm1, %xmm0 # sched: [4:0.50]
1289 ; SKX-SSE-NEXT:    retq # sched: [7:1.00]
1290 ;
1291 ; SKX-LABEL: test_cvtsi2ssq:
1292 ; SKX:       # %bb.0:
1293 ; SKX-NEXT:    vcvtsi2ssq %rdi, %xmm0, %xmm0 # sched: [6:2.00]
1294 ; SKX-NEXT:    vcvtsi2ssq (%rsi), %xmm1, %xmm1 # sched: [9:1.00]
1295 ; SKX-NEXT:    vaddss %xmm1, %xmm0, %xmm0 # sched: [4:0.50]
1296 ; SKX-NEXT:    retq # sched: [7:1.00]
1297 ;
1298 ; BDVER2-SSE-LABEL: test_cvtsi2ssq:
1299 ; BDVER2-SSE:       # %bb.0:
1300 ; BDVER2-SSE-NEXT:    cvtsi2ssq %rdi, %xmm1 # sched: [13:1.00]
1301 ; BDVER2-SSE-NEXT:    cvtsi2ssq (%rsi), %xmm0 # sched: [9:1.00]
1302 ; BDVER2-SSE-NEXT:    addss %xmm1, %xmm0 # sched: [5:1.00]
1303 ; BDVER2-SSE-NEXT:    retq # sched: [5:1.00]
1304 ;
1305 ; BDVER2-LABEL: test_cvtsi2ssq:
1306 ; BDVER2:       # %bb.0:
1307 ; BDVER2-NEXT:    vcvtsi2ssq %rdi, %xmm0, %xmm0 # sched: [14:1.00]
1308 ; BDVER2-NEXT:    vcvtsi2ssq (%rsi), %xmm1, %xmm1 # sched: [9:1.00]
1309 ; BDVER2-NEXT:    vaddss %xmm1, %xmm0, %xmm0 # sched: [5:1.00]
1310 ; BDVER2-NEXT:    retq # sched: [5:1.00]
1311 ;
1312 ; BTVER2-SSE-LABEL: test_cvtsi2ssq:
1313 ; BTVER2-SSE:       # %bb.0:
1314 ; BTVER2-SSE-NEXT:    cvtsi2ssq (%rsi), %xmm0 # sched: [9:1.00]
1315 ; BTVER2-SSE-NEXT:    cvtsi2ssq %rdi, %xmm1 # sched: [10:1.00]
1316 ; BTVER2-SSE-NEXT:    addss %xmm1, %xmm0 # sched: [3:1.00]
1317 ; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
1318 ;
1319 ; BTVER2-LABEL: test_cvtsi2ssq:
1320 ; BTVER2:       # %bb.0:
1321 ; BTVER2-NEXT:    vcvtsi2ssq %rdi, %xmm0, %xmm0 # sched: [10:1.00]
1322 ; BTVER2-NEXT:    vcvtsi2ssq (%rsi), %xmm1, %xmm1 # sched: [9:1.00]
1323 ; BTVER2-NEXT:    vaddss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
1324 ; BTVER2-NEXT:    retq # sched: [4:1.00]
1325 ;
1326 ; ZNVER1-SSE-LABEL: test_cvtsi2ssq:
1327 ; ZNVER1-SSE:       # %bb.0:
1328 ; ZNVER1-SSE-NEXT:    cvtsi2ssq (%rsi), %xmm0 # sched: [12:1.00]
1329 ; ZNVER1-SSE-NEXT:    cvtsi2ssq %rdi, %xmm1 # sched: [5:1.00]
1330 ; ZNVER1-SSE-NEXT:    addss %xmm1, %xmm0 # sched: [3:1.00]
1331 ; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
1332 ;
1333 ; ZNVER1-LABEL: test_cvtsi2ssq:
1334 ; ZNVER1:       # %bb.0:
1335 ; ZNVER1-NEXT:    vcvtsi2ssq %rdi, %xmm0, %xmm0 # sched: [5:1.00]
1336 ; ZNVER1-NEXT:    vcvtsi2ssq (%rsi), %xmm1, %xmm1 # sched: [12:1.00]
1337 ; ZNVER1-NEXT:    vaddss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
1338 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
1339   %1 = sitofp i64 %a0 to float
1340   %2 = load i64, i64 *%a1, align 8
1341   %3 = sitofp i64 %2 to float
1342   %4 = fadd float %1, %3
1343   ret float %4
1344 }
1345
1346 define i32 @test_cvtss2si(float %a0, float *%a1) {
1347 ; GENERIC-LABEL: test_cvtss2si:
1348 ; GENERIC:       # %bb.0:
1349 ; GENERIC-NEXT:    cvtss2si %xmm0, %ecx # sched: [5:1.00]
1350 ; GENERIC-NEXT:    cvtss2si (%rdi), %eax # sched: [9:1.00]
1351 ; GENERIC-NEXT:    addl %ecx, %eax # sched: [1:0.33]
1352 ; GENERIC-NEXT:    retq # sched: [1:1.00]
1353 ;
1354 ; ATOM-LABEL: test_cvtss2si:
1355 ; ATOM:       # %bb.0:
1356 ; ATOM-NEXT:    cvtss2si (%rdi), %eax # sched: [9:4.50]
1357 ; ATOM-NEXT:    cvtss2si %xmm0, %ecx # sched: [8:4.00]
1358 ; ATOM-NEXT:    addl %ecx, %eax # sched: [1:0.50]
1359 ; ATOM-NEXT:    retq # sched: [79:39.50]
1360 ;
1361 ; SLM-LABEL: test_cvtss2si:
1362 ; SLM:       # %bb.0:
1363 ; SLM-NEXT:    cvtss2si (%rdi), %eax # sched: [7:1.00]
1364 ; SLM-NEXT:    cvtss2si %xmm0, %ecx # sched: [4:0.50]
1365 ; SLM-NEXT:    addl %ecx, %eax # sched: [1:0.50]
1366 ; SLM-NEXT:    retq # sched: [4:1.00]
1367 ;
1368 ; SANDY-SSE-LABEL: test_cvtss2si:
1369 ; SANDY-SSE:       # %bb.0:
1370 ; SANDY-SSE-NEXT:    cvtss2si %xmm0, %ecx # sched: [5:1.00]
1371 ; SANDY-SSE-NEXT:    cvtss2si (%rdi), %eax # sched: [9:1.00]
1372 ; SANDY-SSE-NEXT:    addl %ecx, %eax # sched: [1:0.33]
1373 ; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
1374 ;
1375 ; SANDY-LABEL: test_cvtss2si:
1376 ; SANDY:       # %bb.0:
1377 ; SANDY-NEXT:    vcvtss2si %xmm0, %ecx # sched: [5:1.00]
1378 ; SANDY-NEXT:    vcvtss2si (%rdi), %eax # sched: [10:1.00]
1379 ; SANDY-NEXT:    addl %ecx, %eax # sched: [1:0.33]
1380 ; SANDY-NEXT:    retq # sched: [1:1.00]
1381 ;
1382 ; HASWELL-SSE-LABEL: test_cvtss2si:
1383 ; HASWELL-SSE:       # %bb.0:
1384 ; HASWELL-SSE-NEXT:    cvtss2si %xmm0, %ecx # sched: [4:1.00]
1385 ; HASWELL-SSE-NEXT:    cvtss2si (%rdi), %eax # sched: [9:1.00]
1386 ; HASWELL-SSE-NEXT:    addl %ecx, %eax # sched: [1:0.25]
1387 ; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
1388 ;
1389 ; HASWELL-LABEL: test_cvtss2si:
1390 ; HASWELL:       # %bb.0:
1391 ; HASWELL-NEXT:    vcvtss2si %xmm0, %ecx # sched: [4:1.00]
1392 ; HASWELL-NEXT:    vcvtss2si (%rdi), %eax # sched: [9:1.00]
1393 ; HASWELL-NEXT:    addl %ecx, %eax # sched: [1:0.25]
1394 ; HASWELL-NEXT:    retq # sched: [7:1.00]
1395 ;
1396 ; BROADWELL-SSE-LABEL: test_cvtss2si:
1397 ; BROADWELL-SSE:       # %bb.0:
1398 ; BROADWELL-SSE-NEXT:    cvtss2si (%rdi), %eax # sched: [9:1.00]
1399 ; BROADWELL-SSE-NEXT:    cvtss2si %xmm0, %ecx # sched: [4:1.00]
1400 ; BROADWELL-SSE-NEXT:    addl %ecx, %eax # sched: [1:0.25]
1401 ; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
1402 ;
1403 ; BROADWELL-LABEL: test_cvtss2si:
1404 ; BROADWELL:       # %bb.0:
1405 ; BROADWELL-NEXT:    vcvtss2si (%rdi), %eax # sched: [9:1.00]
1406 ; BROADWELL-NEXT:    vcvtss2si %xmm0, %ecx # sched: [4:1.00]
1407 ; BROADWELL-NEXT:    addl %ecx, %eax # sched: [1:0.25]
1408 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
1409 ;
1410 ; SKYLAKE-SSE-LABEL: test_cvtss2si:
1411 ; SKYLAKE-SSE:       # %bb.0:
1412 ; SKYLAKE-SSE-NEXT:    cvtss2si %xmm0, %ecx # sched: [6:1.00]
1413 ; SKYLAKE-SSE-NEXT:    cvtss2si (%rdi), %eax # sched: [11:1.00]
1414 ; SKYLAKE-SSE-NEXT:    addl %ecx, %eax # sched: [1:0.25]
1415 ; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
1416 ;
1417 ; SKYLAKE-LABEL: test_cvtss2si:
1418 ; SKYLAKE:       # %bb.0:
1419 ; SKYLAKE-NEXT:    vcvtss2si %xmm0, %ecx # sched: [6:1.00]
1420 ; SKYLAKE-NEXT:    vcvtss2si (%rdi), %eax # sched: [11:1.00]
1421 ; SKYLAKE-NEXT:    addl %ecx, %eax # sched: [1:0.25]
1422 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
1423 ;
1424 ; SKX-SSE-LABEL: test_cvtss2si:
1425 ; SKX-SSE:       # %bb.0:
1426 ; SKX-SSE-NEXT:    cvtss2si %xmm0, %ecx # sched: [6:1.00]
1427 ; SKX-SSE-NEXT:    cvtss2si (%rdi), %eax # sched: [11:1.00]
1428 ; SKX-SSE-NEXT:    addl %ecx, %eax # sched: [1:0.25]
1429 ; SKX-SSE-NEXT:    retq # sched: [7:1.00]
1430 ;
1431 ; SKX-LABEL: test_cvtss2si:
1432 ; SKX:       # %bb.0:
1433 ; SKX-NEXT:    vcvtss2si %xmm0, %ecx # sched: [6:1.00]
1434 ; SKX-NEXT:    vcvtss2si (%rdi), %eax # sched: [11:1.00]
1435 ; SKX-NEXT:    addl %ecx, %eax # sched: [1:0.25]
1436 ; SKX-NEXT:    retq # sched: [7:1.00]
1437 ;
1438 ; BDVER2-SSE-LABEL: test_cvtss2si:
1439 ; BDVER2-SSE:       # %bb.0:
1440 ; BDVER2-SSE-NEXT:    cvtss2si (%rdi), %eax # sched: [18:1.00]
1441 ; BDVER2-SSE-NEXT:    cvtss2si %xmm0, %ecx # sched: [13:1.00]
1442 ; BDVER2-SSE-NEXT:    addl %ecx, %eax # sched: [1:0.50]
1443 ; BDVER2-SSE-NEXT:    retq # sched: [5:1.00]
1444 ;
1445 ; BDVER2-LABEL: test_cvtss2si:
1446 ; BDVER2:       # %bb.0:
1447 ; BDVER2-NEXT:    vcvtss2si (%rdi), %eax # sched: [18:1.00]
1448 ; BDVER2-NEXT:    vcvtss2si %xmm0, %ecx # sched: [13:1.00]
1449 ; BDVER2-NEXT:    addl %ecx, %eax # sched: [1:0.50]
1450 ; BDVER2-NEXT:    retq # sched: [5:1.00]
1451 ;
1452 ; BTVER2-SSE-LABEL: test_cvtss2si:
1453 ; BTVER2-SSE:       # %bb.0:
1454 ; BTVER2-SSE-NEXT:    cvtss2si (%rdi), %eax # sched: [12:1.00]
1455 ; BTVER2-SSE-NEXT:    cvtss2si %xmm0, %ecx # sched: [7:1.00]
1456 ; BTVER2-SSE-NEXT:    addl %ecx, %eax # sched: [1:0.50]
1457 ; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
1458 ;
1459 ; BTVER2-LABEL: test_cvtss2si:
1460 ; BTVER2:       # %bb.0:
1461 ; BTVER2-NEXT:    vcvtss2si (%rdi), %eax # sched: [12:1.00]
1462 ; BTVER2-NEXT:    vcvtss2si %xmm0, %ecx # sched: [7:1.00]
1463 ; BTVER2-NEXT:    addl %ecx, %eax # sched: [1:0.50]
1464 ; BTVER2-NEXT:    retq # sched: [4:1.00]
1465 ;
1466 ; ZNVER1-SSE-LABEL: test_cvtss2si:
1467 ; ZNVER1-SSE:       # %bb.0:
1468 ; ZNVER1-SSE-NEXT:    cvtss2si (%rdi), %eax # sched: [12:1.00]
1469 ; ZNVER1-SSE-NEXT:    cvtss2si %xmm0, %ecx # sched: [5:1.00]
1470 ; ZNVER1-SSE-NEXT:    addl %ecx, %eax # sched: [1:0.25]
1471 ; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
1472 ;
1473 ; ZNVER1-LABEL: test_cvtss2si:
1474 ; ZNVER1:       # %bb.0:
1475 ; ZNVER1-NEXT:    vcvtss2si (%rdi), %eax # sched: [12:1.00]
1476 ; ZNVER1-NEXT:    vcvtss2si %xmm0, %ecx # sched: [5:1.00]
1477 ; ZNVER1-NEXT:    addl %ecx, %eax # sched: [1:0.25]
1478 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
1479   %1 = insertelement <4 x float> undef, float %a0, i32 0
1480   %2 = call i32 @llvm.x86.sse.cvtss2si(<4 x float> %1)
1481   %3 = load float, float *%a1, align 4
1482   %4 = insertelement <4 x float> undef, float %3, i32 0
1483   %5 = call i32 @llvm.x86.sse.cvtss2si(<4 x float> %4)
1484   %6 = add i32 %2, %5
1485   ret i32 %6
1486 }
1487 declare i32 @llvm.x86.sse.cvtss2si(<4 x float>) nounwind readnone
1488
1489 define i64 @test_cvtss2siq(float %a0, float *%a1) {
1490 ; GENERIC-LABEL: test_cvtss2siq:
1491 ; GENERIC:       # %bb.0:
1492 ; GENERIC-NEXT:    cvtss2si %xmm0, %rcx # sched: [5:1.00]
1493 ; GENERIC-NEXT:    cvtss2si (%rdi), %rax # sched: [9:1.00]
1494 ; GENERIC-NEXT:    addq %rcx, %rax # sched: [1:0.33]
1495 ; GENERIC-NEXT:    retq # sched: [1:1.00]
1496 ;
1497 ; ATOM-LABEL: test_cvtss2siq:
1498 ; ATOM:       # %bb.0:
1499 ; ATOM-NEXT:    cvtss2si (%rdi), %rax # sched: [10:5.00]
1500 ; ATOM-NEXT:    cvtss2si %xmm0, %rcx # sched: [9:4.50]
1501 ; ATOM-NEXT:    addq %rcx, %rax # sched: [1:0.50]
1502 ; ATOM-NEXT:    retq # sched: [79:39.50]
1503 ;
1504 ; SLM-LABEL: test_cvtss2siq:
1505 ; SLM:       # %bb.0:
1506 ; SLM-NEXT:    cvtss2si (%rdi), %rax # sched: [7:1.00]
1507 ; SLM-NEXT:    cvtss2si %xmm0, %rcx # sched: [4:0.50]
1508 ; SLM-NEXT:    addq %rcx, %rax # sched: [1:0.50]
1509 ; SLM-NEXT:    retq # sched: [4:1.00]
1510 ;
1511 ; SANDY-SSE-LABEL: test_cvtss2siq:
1512 ; SANDY-SSE:       # %bb.0:
1513 ; SANDY-SSE-NEXT:    cvtss2si %xmm0, %rcx # sched: [5:1.00]
1514 ; SANDY-SSE-NEXT:    cvtss2si (%rdi), %rax # sched: [9:1.00]
1515 ; SANDY-SSE-NEXT:    addq %rcx, %rax # sched: [1:0.33]
1516 ; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
1517 ;
1518 ; SANDY-LABEL: test_cvtss2siq:
1519 ; SANDY:       # %bb.0:
1520 ; SANDY-NEXT:    vcvtss2si %xmm0, %rcx # sched: [5:1.00]
1521 ; SANDY-NEXT:    vcvtss2si (%rdi), %rax # sched: [10:1.00]
1522 ; SANDY-NEXT:    addq %rcx, %rax # sched: [1:0.33]
1523 ; SANDY-NEXT:    retq # sched: [1:1.00]
1524 ;
1525 ; HASWELL-SSE-LABEL: test_cvtss2siq:
1526 ; HASWELL-SSE:       # %bb.0:
1527 ; HASWELL-SSE-NEXT:    cvtss2si %xmm0, %rcx # sched: [4:1.00]
1528 ; HASWELL-SSE-NEXT:    cvtss2si (%rdi), %rax # sched: [9:1.00]
1529 ; HASWELL-SSE-NEXT:    addq %rcx, %rax # sched: [1:0.25]
1530 ; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
1531 ;
1532 ; HASWELL-LABEL: test_cvtss2siq:
1533 ; HASWELL:       # %bb.0:
1534 ; HASWELL-NEXT:    vcvtss2si %xmm0, %rcx # sched: [4:1.00]
1535 ; HASWELL-NEXT:    vcvtss2si (%rdi), %rax # sched: [9:1.00]
1536 ; HASWELL-NEXT:    addq %rcx, %rax # sched: [1:0.25]
1537 ; HASWELL-NEXT:    retq # sched: [7:1.00]
1538 ;
1539 ; BROADWELL-SSE-LABEL: test_cvtss2siq:
1540 ; BROADWELL-SSE:       # %bb.0:
1541 ; BROADWELL-SSE-NEXT:    cvtss2si (%rdi), %rax # sched: [9:1.00]
1542 ; BROADWELL-SSE-NEXT:    cvtss2si %xmm0, %rcx # sched: [4:1.00]
1543 ; BROADWELL-SSE-NEXT:    addq %rcx, %rax # sched: [1:0.25]
1544 ; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
1545 ;
1546 ; BROADWELL-LABEL: test_cvtss2siq:
1547 ; BROADWELL:       # %bb.0:
1548 ; BROADWELL-NEXT:    vcvtss2si (%rdi), %rax # sched: [9:1.00]
1549 ; BROADWELL-NEXT:    vcvtss2si %xmm0, %rcx # sched: [4:1.00]
1550 ; BROADWELL-NEXT:    addq %rcx, %rax # sched: [1:0.25]
1551 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
1552 ;
1553 ; SKYLAKE-SSE-LABEL: test_cvtss2siq:
1554 ; SKYLAKE-SSE:       # %bb.0:
1555 ; SKYLAKE-SSE-NEXT:    cvtss2si %xmm0, %rcx # sched: [6:1.00]
1556 ; SKYLAKE-SSE-NEXT:    cvtss2si (%rdi), %rax # sched: [11:1.00]
1557 ; SKYLAKE-SSE-NEXT:    addq %rcx, %rax # sched: [1:0.25]
1558 ; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
1559 ;
1560 ; SKYLAKE-LABEL: test_cvtss2siq:
1561 ; SKYLAKE:       # %bb.0:
1562 ; SKYLAKE-NEXT:    vcvtss2si %xmm0, %rcx # sched: [6:1.00]
1563 ; SKYLAKE-NEXT:    vcvtss2si (%rdi), %rax # sched: [11:1.00]
1564 ; SKYLAKE-NEXT:    addq %rcx, %rax # sched: [1:0.25]
1565 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
1566 ;
1567 ; SKX-SSE-LABEL: test_cvtss2siq:
1568 ; SKX-SSE:       # %bb.0:
1569 ; SKX-SSE-NEXT:    cvtss2si %xmm0, %rcx # sched: [7:1.00]
1570 ; SKX-SSE-NEXT:    cvtss2si (%rdi), %rax # sched: [11:1.00]
1571 ; SKX-SSE-NEXT:    addq %rcx, %rax # sched: [1:0.25]
1572 ; SKX-SSE-NEXT:    retq # sched: [7:1.00]
1573 ;
1574 ; SKX-LABEL: test_cvtss2siq:
1575 ; SKX:       # %bb.0:
1576 ; SKX-NEXT:    vcvtss2si %xmm0, %rcx # sched: [7:1.00]
1577 ; SKX-NEXT:    vcvtss2si (%rdi), %rax # sched: [11:1.00]
1578 ; SKX-NEXT:    addq %rcx, %rax # sched: [1:0.25]
1579 ; SKX-NEXT:    retq # sched: [7:1.00]
1580 ;
1581 ; BDVER2-SSE-LABEL: test_cvtss2siq:
1582 ; BDVER2-SSE:       # %bb.0:
1583 ; BDVER2-SSE-NEXT:    cvtss2si (%rdi), %rax # sched: [18:1.00]
1584 ; BDVER2-SSE-NEXT:    cvtss2si %xmm0, %rcx # sched: [13:1.00]
1585 ; BDVER2-SSE-NEXT:    addq %rcx, %rax # sched: [1:0.50]
1586 ; BDVER2-SSE-NEXT:    retq # sched: [5:1.00]
1587 ;
1588 ; BDVER2-LABEL: test_cvtss2siq:
1589 ; BDVER2:       # %bb.0:
1590 ; BDVER2-NEXT:    vcvtss2si (%rdi), %rax # sched: [18:1.00]
1591 ; BDVER2-NEXT:    vcvtss2si %xmm0, %rcx # sched: [13:1.00]
1592 ; BDVER2-NEXT:    addq %rcx, %rax # sched: [1:0.50]
1593 ; BDVER2-NEXT:    retq # sched: [5:1.00]
1594 ;
1595 ; BTVER2-SSE-LABEL: test_cvtss2siq:
1596 ; BTVER2-SSE:       # %bb.0:
1597 ; BTVER2-SSE-NEXT:    cvtss2si (%rdi), %rax # sched: [12:1.00]
1598 ; BTVER2-SSE-NEXT:    cvtss2si %xmm0, %rcx # sched: [7:1.00]
1599 ; BTVER2-SSE-NEXT:    addq %rcx, %rax # sched: [1:0.50]
1600 ; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
1601 ;
1602 ; BTVER2-LABEL: test_cvtss2siq:
1603 ; BTVER2:       # %bb.0:
1604 ; BTVER2-NEXT:    vcvtss2si (%rdi), %rax # sched: [12:1.00]
1605 ; BTVER2-NEXT:    vcvtss2si %xmm0, %rcx # sched: [7:1.00]
1606 ; BTVER2-NEXT:    addq %rcx, %rax # sched: [1:0.50]
1607 ; BTVER2-NEXT:    retq # sched: [4:1.00]
1608 ;
1609 ; ZNVER1-SSE-LABEL: test_cvtss2siq:
1610 ; ZNVER1-SSE:       # %bb.0:
1611 ; ZNVER1-SSE-NEXT:    cvtss2si (%rdi), %rax # sched: [12:1.00]
1612 ; ZNVER1-SSE-NEXT:    cvtss2si %xmm0, %rcx # sched: [5:1.00]
1613 ; ZNVER1-SSE-NEXT:    addq %rcx, %rax # sched: [1:0.25]
1614 ; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
1615 ;
1616 ; ZNVER1-LABEL: test_cvtss2siq:
1617 ; ZNVER1:       # %bb.0:
1618 ; ZNVER1-NEXT:    vcvtss2si (%rdi), %rax # sched: [12:1.00]
1619 ; ZNVER1-NEXT:    vcvtss2si %xmm0, %rcx # sched: [5:1.00]
1620 ; ZNVER1-NEXT:    addq %rcx, %rax # sched: [1:0.25]
1621 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
1622   %1 = insertelement <4 x float> undef, float %a0, i32 0
1623   %2 = call i64 @llvm.x86.sse.cvtss2si64(<4 x float> %1)
1624   %3 = load float, float *%a1, align 4
1625   %4 = insertelement <4 x float> undef, float %3, i32 0
1626   %5 = call i64 @llvm.x86.sse.cvtss2si64(<4 x float> %4)
1627   %6 = add i64 %2, %5
1628   ret i64 %6
1629 }
1630 declare i64 @llvm.x86.sse.cvtss2si64(<4 x float>) nounwind readnone
1631
1632 define i32 @test_cvttss2si(float %a0, float *%a1) {
1633 ; GENERIC-LABEL: test_cvttss2si:
1634 ; GENERIC:       # %bb.0:
1635 ; GENERIC-NEXT:    cvttss2si %xmm0, %ecx # sched: [5:1.00]
1636 ; GENERIC-NEXT:    cvttss2si (%rdi), %eax # sched: [9:1.00]
1637 ; GENERIC-NEXT:    addl %ecx, %eax # sched: [1:0.33]
1638 ; GENERIC-NEXT:    retq # sched: [1:1.00]
1639 ;
1640 ; ATOM-LABEL: test_cvttss2si:
1641 ; ATOM:       # %bb.0:
1642 ; ATOM-NEXT:    cvttss2si (%rdi), %eax # sched: [9:4.50]
1643 ; ATOM-NEXT:    cvttss2si %xmm0, %ecx # sched: [8:4.00]
1644 ; ATOM-NEXT:    addl %ecx, %eax # sched: [1:0.50]
1645 ; ATOM-NEXT:    retq # sched: [79:39.50]
1646 ;
1647 ; SLM-LABEL: test_cvttss2si:
1648 ; SLM:       # %bb.0:
1649 ; SLM-NEXT:    cvttss2si (%rdi), %eax # sched: [7:1.00]
1650 ; SLM-NEXT:    cvttss2si %xmm0, %ecx # sched: [4:0.50]
1651 ; SLM-NEXT:    addl %ecx, %eax # sched: [1:0.50]
1652 ; SLM-NEXT:    retq # sched: [4:1.00]
1653 ;
1654 ; SANDY-SSE-LABEL: test_cvttss2si:
1655 ; SANDY-SSE:       # %bb.0:
1656 ; SANDY-SSE-NEXT:    cvttss2si %xmm0, %ecx # sched: [5:1.00]
1657 ; SANDY-SSE-NEXT:    cvttss2si (%rdi), %eax # sched: [9:1.00]
1658 ; SANDY-SSE-NEXT:    addl %ecx, %eax # sched: [1:0.33]
1659 ; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
1660 ;
1661 ; SANDY-LABEL: test_cvttss2si:
1662 ; SANDY:       # %bb.0:
1663 ; SANDY-NEXT:    vcvttss2si %xmm0, %ecx # sched: [5:1.00]
1664 ; SANDY-NEXT:    vcvttss2si (%rdi), %eax # sched: [10:1.00]
1665 ; SANDY-NEXT:    addl %ecx, %eax # sched: [1:0.33]
1666 ; SANDY-NEXT:    retq # sched: [1:1.00]
1667 ;
1668 ; HASWELL-SSE-LABEL: test_cvttss2si:
1669 ; HASWELL-SSE:       # %bb.0:
1670 ; HASWELL-SSE-NEXT:    cvttss2si %xmm0, %ecx # sched: [4:1.00]
1671 ; HASWELL-SSE-NEXT:    cvttss2si (%rdi), %eax # sched: [9:1.00]
1672 ; HASWELL-SSE-NEXT:    addl %ecx, %eax # sched: [1:0.25]
1673 ; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
1674 ;
1675 ; HASWELL-LABEL: test_cvttss2si:
1676 ; HASWELL:       # %bb.0:
1677 ; HASWELL-NEXT:    vcvttss2si %xmm0, %ecx # sched: [4:1.00]
1678 ; HASWELL-NEXT:    vcvttss2si (%rdi), %eax # sched: [9:1.00]
1679 ; HASWELL-NEXT:    addl %ecx, %eax # sched: [1:0.25]
1680 ; HASWELL-NEXT:    retq # sched: [7:1.00]
1681 ;
1682 ; BROADWELL-SSE-LABEL: test_cvttss2si:
1683 ; BROADWELL-SSE:       # %bb.0:
1684 ; BROADWELL-SSE-NEXT:    cvttss2si (%rdi), %eax # sched: [9:1.00]
1685 ; BROADWELL-SSE-NEXT:    cvttss2si %xmm0, %ecx # sched: [4:1.00]
1686 ; BROADWELL-SSE-NEXT:    addl %ecx, %eax # sched: [1:0.25]
1687 ; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
1688 ;
1689 ; BROADWELL-LABEL: test_cvttss2si:
1690 ; BROADWELL:       # %bb.0:
1691 ; BROADWELL-NEXT:    vcvttss2si (%rdi), %eax # sched: [9:1.00]
1692 ; BROADWELL-NEXT:    vcvttss2si %xmm0, %ecx # sched: [4:1.00]
1693 ; BROADWELL-NEXT:    addl %ecx, %eax # sched: [1:0.25]
1694 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
1695 ;
1696 ; SKYLAKE-SSE-LABEL: test_cvttss2si:
1697 ; SKYLAKE-SSE:       # %bb.0:
1698 ; SKYLAKE-SSE-NEXT:    cvttss2si %xmm0, %ecx # sched: [7:1.00]
1699 ; SKYLAKE-SSE-NEXT:    cvttss2si (%rdi), %eax # sched: [11:1.00]
1700 ; SKYLAKE-SSE-NEXT:    addl %ecx, %eax # sched: [1:0.25]
1701 ; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
1702 ;
1703 ; SKYLAKE-LABEL: test_cvttss2si:
1704 ; SKYLAKE:       # %bb.0:
1705 ; SKYLAKE-NEXT:    vcvttss2si %xmm0, %ecx # sched: [7:1.00]
1706 ; SKYLAKE-NEXT:    vcvttss2si (%rdi), %eax # sched: [11:1.00]
1707 ; SKYLAKE-NEXT:    addl %ecx, %eax # sched: [1:0.25]
1708 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
1709 ;
1710 ; SKX-SSE-LABEL: test_cvttss2si:
1711 ; SKX-SSE:       # %bb.0:
1712 ; SKX-SSE-NEXT:    cvttss2si %xmm0, %ecx # sched: [6:1.00]
1713 ; SKX-SSE-NEXT:    cvttss2si (%rdi), %eax # sched: [11:1.00]
1714 ; SKX-SSE-NEXT:    addl %ecx, %eax # sched: [1:0.25]
1715 ; SKX-SSE-NEXT:    retq # sched: [7:1.00]
1716 ;
1717 ; SKX-LABEL: test_cvttss2si:
1718 ; SKX:       # %bb.0:
1719 ; SKX-NEXT:    vcvttss2si %xmm0, %ecx # sched: [6:1.00]
1720 ; SKX-NEXT:    vcvttss2si (%rdi), %eax # sched: [11:1.00]
1721 ; SKX-NEXT:    addl %ecx, %eax # sched: [1:0.25]
1722 ; SKX-NEXT:    retq # sched: [7:1.00]
1723 ;
1724 ; BDVER2-SSE-LABEL: test_cvttss2si:
1725 ; BDVER2-SSE:       # %bb.0:
1726 ; BDVER2-SSE-NEXT:    cvttss2si (%rdi), %eax # sched: [18:1.00]
1727 ; BDVER2-SSE-NEXT:    cvttss2si %xmm0, %ecx # sched: [13:1.00]
1728 ; BDVER2-SSE-NEXT:    addl %ecx, %eax # sched: [1:0.50]
1729 ; BDVER2-SSE-NEXT:    retq # sched: [5:1.00]
1730 ;
1731 ; BDVER2-LABEL: test_cvttss2si:
1732 ; BDVER2:       # %bb.0:
1733 ; BDVER2-NEXT:    vcvttss2si (%rdi), %eax # sched: [18:1.00]
1734 ; BDVER2-NEXT:    vcvttss2si %xmm0, %ecx # sched: [13:1.00]
1735 ; BDVER2-NEXT:    addl %ecx, %eax # sched: [1:0.50]
1736 ; BDVER2-NEXT:    retq # sched: [5:1.00]
1737 ;
1738 ; BTVER2-SSE-LABEL: test_cvttss2si:
1739 ; BTVER2-SSE:       # %bb.0:
1740 ; BTVER2-SSE-NEXT:    cvttss2si (%rdi), %eax # sched: [12:1.00]
1741 ; BTVER2-SSE-NEXT:    cvttss2si %xmm0, %ecx # sched: [7:1.00]
1742 ; BTVER2-SSE-NEXT:    addl %ecx, %eax # sched: [1:0.50]
1743 ; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
1744 ;
1745 ; BTVER2-LABEL: test_cvttss2si:
1746 ; BTVER2:       # %bb.0:
1747 ; BTVER2-NEXT:    vcvttss2si (%rdi), %eax # sched: [12:1.00]
1748 ; BTVER2-NEXT:    vcvttss2si %xmm0, %ecx # sched: [7:1.00]
1749 ; BTVER2-NEXT:    addl %ecx, %eax # sched: [1:0.50]
1750 ; BTVER2-NEXT:    retq # sched: [4:1.00]
1751 ;
1752 ; ZNVER1-SSE-LABEL: test_cvttss2si:
1753 ; ZNVER1-SSE:       # %bb.0:
1754 ; ZNVER1-SSE-NEXT:    cvttss2si (%rdi), %eax # sched: [12:1.00]
1755 ; ZNVER1-SSE-NEXT:    cvttss2si %xmm0, %ecx # sched: [5:1.00]
1756 ; ZNVER1-SSE-NEXT:    addl %ecx, %eax # sched: [1:0.25]
1757 ; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
1758 ;
1759 ; ZNVER1-LABEL: test_cvttss2si:
1760 ; ZNVER1:       # %bb.0:
1761 ; ZNVER1-NEXT:    vcvttss2si (%rdi), %eax # sched: [12:1.00]
1762 ; ZNVER1-NEXT:    vcvttss2si %xmm0, %ecx # sched: [5:1.00]
1763 ; ZNVER1-NEXT:    addl %ecx, %eax # sched: [1:0.25]
1764 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
1765   %1 = fptosi float %a0 to i32
1766   %2 = load float, float *%a1, align 4
1767   %3 = fptosi float %2 to i32
1768   %4 = add i32 %1, %3
1769   ret i32 %4
1770 }
1771
1772 define i64 @test_cvttss2siq(float %a0, float *%a1) {
1773 ; GENERIC-LABEL: test_cvttss2siq:
1774 ; GENERIC:       # %bb.0:
1775 ; GENERIC-NEXT:    cvttss2si %xmm0, %rcx # sched: [5:1.00]
1776 ; GENERIC-NEXT:    cvttss2si (%rdi), %rax # sched: [9:1.00]
1777 ; GENERIC-NEXT:    addq %rcx, %rax # sched: [1:0.33]
1778 ; GENERIC-NEXT:    retq # sched: [1:1.00]
1779 ;
1780 ; ATOM-LABEL: test_cvttss2siq:
1781 ; ATOM:       # %bb.0:
1782 ; ATOM-NEXT:    cvttss2si (%rdi), %rax # sched: [10:5.00]
1783 ; ATOM-NEXT:    cvttss2si %xmm0, %rcx # sched: [9:4.50]
1784 ; ATOM-NEXT:    addq %rcx, %rax # sched: [1:0.50]
1785 ; ATOM-NEXT:    retq # sched: [79:39.50]
1786 ;
1787 ; SLM-LABEL: test_cvttss2siq:
1788 ; SLM:       # %bb.0:
1789 ; SLM-NEXT:    cvttss2si (%rdi), %rax # sched: [7:1.00]
1790 ; SLM-NEXT:    cvttss2si %xmm0, %rcx # sched: [4:0.50]
1791 ; SLM-NEXT:    addq %rcx, %rax # sched: [1:0.50]
1792 ; SLM-NEXT:    retq # sched: [4:1.00]
1793 ;
1794 ; SANDY-SSE-LABEL: test_cvttss2siq:
1795 ; SANDY-SSE:       # %bb.0:
1796 ; SANDY-SSE-NEXT:    cvttss2si %xmm0, %rcx # sched: [5:1.00]
1797 ; SANDY-SSE-NEXT:    cvttss2si (%rdi), %rax # sched: [9:1.00]
1798 ; SANDY-SSE-NEXT:    addq %rcx, %rax # sched: [1:0.33]
1799 ; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
1800 ;
1801 ; SANDY-LABEL: test_cvttss2siq:
1802 ; SANDY:       # %bb.0:
1803 ; SANDY-NEXT:    vcvttss2si %xmm0, %rcx # sched: [5:1.00]
1804 ; SANDY-NEXT:    vcvttss2si (%rdi), %rax # sched: [10:1.00]
1805 ; SANDY-NEXT:    addq %rcx, %rax # sched: [1:0.33]
1806 ; SANDY-NEXT:    retq # sched: [1:1.00]
1807 ;
1808 ; HASWELL-SSE-LABEL: test_cvttss2siq:
1809 ; HASWELL-SSE:       # %bb.0:
1810 ; HASWELL-SSE-NEXT:    cvttss2si (%rdi), %rax # sched: [10:1.00]
1811 ; HASWELL-SSE-NEXT:    cvttss2si %xmm0, %rcx # sched: [4:1.00]
1812 ; HASWELL-SSE-NEXT:    addq %rcx, %rax # sched: [1:0.25]
1813 ; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
1814 ;
1815 ; HASWELL-LABEL: test_cvttss2siq:
1816 ; HASWELL:       # %bb.0:
1817 ; HASWELL-NEXT:    vcvttss2si %xmm0, %rcx # sched: [4:1.00]
1818 ; HASWELL-NEXT:    vcvttss2si (%rdi), %rax # sched: [9:1.00]
1819 ; HASWELL-NEXT:    addq %rcx, %rax # sched: [1:0.25]
1820 ; HASWELL-NEXT:    retq # sched: [7:1.00]
1821 ;
1822 ; BROADWELL-SSE-LABEL: test_cvttss2siq:
1823 ; BROADWELL-SSE:       # %bb.0:
1824 ; BROADWELL-SSE-NEXT:    cvttss2si (%rdi), %rax # sched: [10:1.00]
1825 ; BROADWELL-SSE-NEXT:    cvttss2si %xmm0, %rcx # sched: [4:1.00]
1826 ; BROADWELL-SSE-NEXT:    addq %rcx, %rax # sched: [1:0.25]
1827 ; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
1828 ;
1829 ; BROADWELL-LABEL: test_cvttss2siq:
1830 ; BROADWELL:       # %bb.0:
1831 ; BROADWELL-NEXT:    vcvttss2si (%rdi), %rax # sched: [9:1.00]
1832 ; BROADWELL-NEXT:    vcvttss2si %xmm0, %rcx # sched: [4:1.00]
1833 ; BROADWELL-NEXT:    addq %rcx, %rax # sched: [1:0.25]
1834 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
1835 ;
1836 ; SKYLAKE-SSE-LABEL: test_cvttss2siq:
1837 ; SKYLAKE-SSE:       # %bb.0:
1838 ; SKYLAKE-SSE-NEXT:    cvttss2si %xmm0, %rcx # sched: [7:1.00]
1839 ; SKYLAKE-SSE-NEXT:    cvttss2si (%rdi), %rax # sched: [12:1.00]
1840 ; SKYLAKE-SSE-NEXT:    addq %rcx, %rax # sched: [1:0.25]
1841 ; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
1842 ;
1843 ; SKYLAKE-LABEL: test_cvttss2siq:
1844 ; SKYLAKE:       # %bb.0:
1845 ; SKYLAKE-NEXT:    vcvttss2si %xmm0, %rcx # sched: [7:1.00]
1846 ; SKYLAKE-NEXT:    vcvttss2si (%rdi), %rax # sched: [11:1.00]
1847 ; SKYLAKE-NEXT:    addq %rcx, %rax # sched: [1:0.25]
1848 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
1849 ;
1850 ; SKX-SSE-LABEL: test_cvttss2siq:
1851 ; SKX-SSE:       # %bb.0:
1852 ; SKX-SSE-NEXT:    cvttss2si %xmm0, %rcx # sched: [7:1.00]
1853 ; SKX-SSE-NEXT:    cvttss2si (%rdi), %rax # sched: [12:1.00]
1854 ; SKX-SSE-NEXT:    addq %rcx, %rax # sched: [1:0.25]
1855 ; SKX-SSE-NEXT:    retq # sched: [7:1.00]
1856 ;
1857 ; SKX-LABEL: test_cvttss2siq:
1858 ; SKX:       # %bb.0:
1859 ; SKX-NEXT:    vcvttss2si %xmm0, %rcx # sched: [7:1.00]
1860 ; SKX-NEXT:    vcvttss2si (%rdi), %rax # sched: [11:1.00]
1861 ; SKX-NEXT:    addq %rcx, %rax # sched: [1:0.25]
1862 ; SKX-NEXT:    retq # sched: [7:1.00]
1863 ;
1864 ; BDVER2-SSE-LABEL: test_cvttss2siq:
1865 ; BDVER2-SSE:       # %bb.0:
1866 ; BDVER2-SSE-NEXT:    cvttss2si (%rdi), %rax # sched: [18:1.00]
1867 ; BDVER2-SSE-NEXT:    cvttss2si %xmm0, %rcx # sched: [13:1.00]
1868 ; BDVER2-SSE-NEXT:    addq %rcx, %rax # sched: [1:0.50]
1869 ; BDVER2-SSE-NEXT:    retq # sched: [5:1.00]
1870 ;
1871 ; BDVER2-LABEL: test_cvttss2siq:
1872 ; BDVER2:       # %bb.0:
1873 ; BDVER2-NEXT:    vcvttss2si (%rdi), %rax # sched: [18:1.00]
1874 ; BDVER2-NEXT:    vcvttss2si %xmm0, %rcx # sched: [13:1.00]
1875 ; BDVER2-NEXT:    addq %rcx, %rax # sched: [1:0.50]
1876 ; BDVER2-NEXT:    retq # sched: [5:1.00]
1877 ;
1878 ; BTVER2-SSE-LABEL: test_cvttss2siq:
1879 ; BTVER2-SSE:       # %bb.0:
1880 ; BTVER2-SSE-NEXT:    cvttss2si (%rdi), %rax # sched: [12:1.00]
1881 ; BTVER2-SSE-NEXT:    cvttss2si %xmm0, %rcx # sched: [7:1.00]
1882 ; BTVER2-SSE-NEXT:    addq %rcx, %rax # sched: [1:0.50]
1883 ; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
1884 ;
1885 ; BTVER2-LABEL: test_cvttss2siq:
1886 ; BTVER2:       # %bb.0:
1887 ; BTVER2-NEXT:    vcvttss2si (%rdi), %rax # sched: [12:1.00]
1888 ; BTVER2-NEXT:    vcvttss2si %xmm0, %rcx # sched: [7:1.00]
1889 ; BTVER2-NEXT:    addq %rcx, %rax # sched: [1:0.50]
1890 ; BTVER2-NEXT:    retq # sched: [4:1.00]
1891 ;
1892 ; ZNVER1-SSE-LABEL: test_cvttss2siq:
1893 ; ZNVER1-SSE:       # %bb.0:
1894 ; ZNVER1-SSE-NEXT:    cvttss2si (%rdi), %rax # sched: [12:1.00]
1895 ; ZNVER1-SSE-NEXT:    cvttss2si %xmm0, %rcx # sched: [5:1.00]
1896 ; ZNVER1-SSE-NEXT:    addq %rcx, %rax # sched: [1:0.25]
1897 ; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
1898 ;
1899 ; ZNVER1-LABEL: test_cvttss2siq:
1900 ; ZNVER1:       # %bb.0:
1901 ; ZNVER1-NEXT:    vcvttss2si (%rdi), %rax # sched: [12:1.00]
1902 ; ZNVER1-NEXT:    vcvttss2si %xmm0, %rcx # sched: [5:1.00]
1903 ; ZNVER1-NEXT:    addq %rcx, %rax # sched: [1:0.25]
1904 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
1905   %1 = fptosi float %a0 to i64
1906   %2 = load float, float *%a1, align 4
1907   %3 = fptosi float %2 to i64
1908   %4 = add i64 %1, %3
1909   ret i64 %4
1910 }
1911
1912 define <4 x float> @test_divps(<4 x float> %a0, <4 x float> %a1, <4 x float> *%a2) {
1913 ; GENERIC-LABEL: test_divps:
1914 ; GENERIC:       # %bb.0:
1915 ; GENERIC-NEXT:    divps %xmm1, %xmm0 # sched: [14:14.00]
1916 ; GENERIC-NEXT:    divps (%rdi), %xmm0 # sched: [20:14.00]
1917 ; GENERIC-NEXT:    retq # sched: [1:1.00]
1918 ;
1919 ; ATOM-LABEL: test_divps:
1920 ; ATOM:       # %bb.0:
1921 ; ATOM-NEXT:    divps %xmm1, %xmm0 # sched: [70:35.00]
1922 ; ATOM-NEXT:    divps (%rdi), %xmm0 # sched: [70:35.00]
1923 ; ATOM-NEXT:    retq # sched: [79:39.50]
1924 ;
1925 ; SLM-LABEL: test_divps:
1926 ; SLM:       # %bb.0:
1927 ; SLM-NEXT:    divps %xmm1, %xmm0 # sched: [39:39.00]
1928 ; SLM-NEXT:    divps (%rdi), %xmm0 # sched: [42:39.00]
1929 ; SLM-NEXT:    retq # sched: [4:1.00]
1930 ;
1931 ; SANDY-SSE-LABEL: test_divps:
1932 ; SANDY-SSE:       # %bb.0:
1933 ; SANDY-SSE-NEXT:    divps %xmm1, %xmm0 # sched: [14:14.00]
1934 ; SANDY-SSE-NEXT:    divps (%rdi), %xmm0 # sched: [20:14.00]
1935 ; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
1936 ;
1937 ; SANDY-LABEL: test_divps:
1938 ; SANDY:       # %bb.0:
1939 ; SANDY-NEXT:    vdivps %xmm1, %xmm0, %xmm0 # sched: [14:14.00]
1940 ; SANDY-NEXT:    vdivps (%rdi), %xmm0, %xmm0 # sched: [20:14.00]
1941 ; SANDY-NEXT:    retq # sched: [1:1.00]
1942 ;
1943 ; HASWELL-SSE-LABEL: test_divps:
1944 ; HASWELL-SSE:       # %bb.0:
1945 ; HASWELL-SSE-NEXT:    divps %xmm1, %xmm0 # sched: [13:7.00]
1946 ; HASWELL-SSE-NEXT:    divps (%rdi), %xmm0 # sched: [19:7.00]
1947 ; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
1948 ;
1949 ; HASWELL-LABEL: test_divps:
1950 ; HASWELL:       # %bb.0:
1951 ; HASWELL-NEXT:    vdivps %xmm1, %xmm0, %xmm0 # sched: [13:7.00]
1952 ; HASWELL-NEXT:    vdivps (%rdi), %xmm0, %xmm0 # sched: [19:7.00]
1953 ; HASWELL-NEXT:    retq # sched: [7:1.00]
1954 ;
1955 ; BROADWELL-SSE-LABEL: test_divps:
1956 ; BROADWELL-SSE:       # %bb.0:
1957 ; BROADWELL-SSE-NEXT:    divps %xmm1, %xmm0 # sched: [11:5.00]
1958 ; BROADWELL-SSE-NEXT:    divps (%rdi), %xmm0 # sched: [16:5.00]
1959 ; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
1960 ;
1961 ; BROADWELL-LABEL: test_divps:
1962 ; BROADWELL:       # %bb.0:
1963 ; BROADWELL-NEXT:    vdivps %xmm1, %xmm0, %xmm0 # sched: [11:5.00]
1964 ; BROADWELL-NEXT:    vdivps (%rdi), %xmm0, %xmm0 # sched: [16:5.00]
1965 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
1966 ;
1967 ; SKYLAKE-SSE-LABEL: test_divps:
1968 ; SKYLAKE-SSE:       # %bb.0:
1969 ; SKYLAKE-SSE-NEXT:    divps %xmm1, %xmm0 # sched: [11:3.00]
1970 ; SKYLAKE-SSE-NEXT:    divps (%rdi), %xmm0 # sched: [17:5.00]
1971 ; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
1972 ;
1973 ; SKYLAKE-LABEL: test_divps:
1974 ; SKYLAKE:       # %bb.0:
1975 ; SKYLAKE-NEXT:    vdivps %xmm1, %xmm0, %xmm0 # sched: [11:3.00]
1976 ; SKYLAKE-NEXT:    vdivps (%rdi), %xmm0, %xmm0 # sched: [17:5.00]
1977 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
1978 ;
1979 ; SKX-SSE-LABEL: test_divps:
1980 ; SKX-SSE:       # %bb.0:
1981 ; SKX-SSE-NEXT:    divps %xmm1, %xmm0 # sched: [11:3.00]
1982 ; SKX-SSE-NEXT:    divps (%rdi), %xmm0 # sched: [17:5.00]
1983 ; SKX-SSE-NEXT:    retq # sched: [7:1.00]
1984 ;
1985 ; SKX-LABEL: test_divps:
1986 ; SKX:       # %bb.0:
1987 ; SKX-NEXT:    vdivps %xmm1, %xmm0, %xmm0 # sched: [11:3.00]
1988 ; SKX-NEXT:    vdivps (%rdi), %xmm0, %xmm0 # sched: [17:5.00]
1989 ; SKX-NEXT:    retq # sched: [7:1.00]
1990 ;
1991 ; BDVER2-SSE-LABEL: test_divps:
1992 ; BDVER2-SSE:       # %bb.0:
1993 ; BDVER2-SSE-NEXT:    divps %xmm1, %xmm0 # sched: [9:9.50]
1994 ; BDVER2-SSE-NEXT:    divps (%rdi), %xmm0 # sched: [14:9.50]
1995 ; BDVER2-SSE-NEXT:    retq # sched: [5:1.00]
1996 ;
1997 ; BDVER2-LABEL: test_divps:
1998 ; BDVER2:       # %bb.0:
1999 ; BDVER2-NEXT:    vdivps %xmm1, %xmm0, %xmm0 # sched: [9:9.50]
2000 ; BDVER2-NEXT:    vdivps (%rdi), %xmm0, %xmm0 # sched: [14:9.50]
2001 ; BDVER2-NEXT:    retq # sched: [5:1.00]
2002 ;
2003 ; BTVER2-SSE-LABEL: test_divps:
2004 ; BTVER2-SSE:       # %bb.0:
2005 ; BTVER2-SSE-NEXT:    divps %xmm1, %xmm0 # sched: [19:19.00]
2006 ; BTVER2-SSE-NEXT:    divps (%rdi), %xmm0 # sched: [24:19.00]
2007 ; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
2008 ;
2009 ; BTVER2-LABEL: test_divps:
2010 ; BTVER2:       # %bb.0:
2011 ; BTVER2-NEXT:    vdivps %xmm1, %xmm0, %xmm0 # sched: [19:19.00]
2012 ; BTVER2-NEXT:    vdivps (%rdi), %xmm0, %xmm0 # sched: [24:19.00]
2013 ; BTVER2-NEXT:    retq # sched: [4:1.00]
2014 ;
2015 ; ZNVER1-SSE-LABEL: test_divps:
2016 ; ZNVER1-SSE:       # %bb.0:
2017 ; ZNVER1-SSE-NEXT:    divps %xmm1, %xmm0 # sched: [15:1.00]
2018 ; ZNVER1-SSE-NEXT:    divps (%rdi), %xmm0 # sched: [22:1.00]
2019 ; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
2020 ;
2021 ; ZNVER1-LABEL: test_divps:
2022 ; ZNVER1:       # %bb.0:
2023 ; ZNVER1-NEXT:    vdivps %xmm1, %xmm0, %xmm0 # sched: [15:1.00]
2024 ; ZNVER1-NEXT:    vdivps (%rdi), %xmm0, %xmm0 # sched: [22:1.00]
2025 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
2026   %1 = fdiv <4 x float> %a0, %a1
2027   %2 = load <4 x float>, <4 x float> *%a2, align 16
2028   %3 = fdiv <4 x float> %1, %2
2029   ret <4 x float> %3
2030 }
2031
2032 define float @test_divss(float %a0, float %a1, float *%a2) {
2033 ; GENERIC-LABEL: test_divss:
2034 ; GENERIC:       # %bb.0:
2035 ; GENERIC-NEXT:    divss %xmm1, %xmm0 # sched: [14:14.00]
2036 ; GENERIC-NEXT:    divss (%rdi), %xmm0 # sched: [20:14.00]
2037 ; GENERIC-NEXT:    retq # sched: [1:1.00]
2038 ;
2039 ; ATOM-LABEL: test_divss:
2040 ; ATOM:       # %bb.0:
2041 ; ATOM-NEXT:    divss %xmm1, %xmm0 # sched: [34:17.00]
2042 ; ATOM-NEXT:    divss (%rdi), %xmm0 # sched: [34:17.00]
2043 ; ATOM-NEXT:    retq # sched: [79:39.50]
2044 ;
2045 ; SLM-LABEL: test_divss:
2046 ; SLM:       # %bb.0:
2047 ; SLM-NEXT:    divss %xmm1, %xmm0 # sched: [19:17.00]
2048 ; SLM-NEXT:    divss (%rdi), %xmm0 # sched: [22:17.00]
2049 ; SLM-NEXT:    retq # sched: [4:1.00]
2050 ;
2051 ; SANDY-SSE-LABEL: test_divss:
2052 ; SANDY-SSE:       # %bb.0:
2053 ; SANDY-SSE-NEXT:    divss %xmm1, %xmm0 # sched: [14:14.00]
2054 ; SANDY-SSE-NEXT:    divss (%rdi), %xmm0 # sched: [20:14.00]
2055 ; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
2056 ;
2057 ; SANDY-LABEL: test_divss:
2058 ; SANDY:       # %bb.0:
2059 ; SANDY-NEXT:    vdivss %xmm1, %xmm0, %xmm0 # sched: [14:14.00]
2060 ; SANDY-NEXT:    vdivss (%rdi), %xmm0, %xmm0 # sched: [20:14.00]
2061 ; SANDY-NEXT:    retq # sched: [1:1.00]
2062 ;
2063 ; HASWELL-SSE-LABEL: test_divss:
2064 ; HASWELL-SSE:       # %bb.0:
2065 ; HASWELL-SSE-NEXT:    divss %xmm1, %xmm0 # sched: [13:7.00]
2066 ; HASWELL-SSE-NEXT:    divss (%rdi), %xmm0 # sched: [18:7.00]
2067 ; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
2068 ;
2069 ; HASWELL-LABEL: test_divss:
2070 ; HASWELL:       # %bb.0:
2071 ; HASWELL-NEXT:    vdivss %xmm1, %xmm0, %xmm0 # sched: [13:7.00]
2072 ; HASWELL-NEXT:    vdivss (%rdi), %xmm0, %xmm0 # sched: [18:7.00]
2073 ; HASWELL-NEXT:    retq # sched: [7:1.00]
2074 ;
2075 ; BROADWELL-SSE-LABEL: test_divss:
2076 ; BROADWELL-SSE:       # %bb.0:
2077 ; BROADWELL-SSE-NEXT:    divss %xmm1, %xmm0 # sched: [11:3.00]
2078 ; BROADWELL-SSE-NEXT:    divss (%rdi), %xmm0 # sched: [16:5.00]
2079 ; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
2080 ;
2081 ; BROADWELL-LABEL: test_divss:
2082 ; BROADWELL:       # %bb.0:
2083 ; BROADWELL-NEXT:    vdivss %xmm1, %xmm0, %xmm0 # sched: [11:3.00]
2084 ; BROADWELL-NEXT:    vdivss (%rdi), %xmm0, %xmm0 # sched: [16:5.00]
2085 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
2086 ;
2087 ; SKYLAKE-SSE-LABEL: test_divss:
2088 ; SKYLAKE-SSE:       # %bb.0:
2089 ; SKYLAKE-SSE-NEXT:    divss %xmm1, %xmm0 # sched: [11:3.00]
2090 ; SKYLAKE-SSE-NEXT:    divss (%rdi), %xmm0 # sched: [16:3.00]
2091 ; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
2092 ;
2093 ; SKYLAKE-LABEL: test_divss:
2094 ; SKYLAKE:       # %bb.0:
2095 ; SKYLAKE-NEXT:    vdivss %xmm1, %xmm0, %xmm0 # sched: [11:3.00]
2096 ; SKYLAKE-NEXT:    vdivss (%rdi), %xmm0, %xmm0 # sched: [16:3.00]
2097 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
2098 ;
2099 ; SKX-SSE-LABEL: test_divss:
2100 ; SKX-SSE:       # %bb.0:
2101 ; SKX-SSE-NEXT:    divss %xmm1, %xmm0 # sched: [11:3.00]
2102 ; SKX-SSE-NEXT:    divss (%rdi), %xmm0 # sched: [16:3.00]
2103 ; SKX-SSE-NEXT:    retq # sched: [7:1.00]
2104 ;
2105 ; SKX-LABEL: test_divss:
2106 ; SKX:       # %bb.0:
2107 ; SKX-NEXT:    vdivss %xmm1, %xmm0, %xmm0 # sched: [11:3.00]
2108 ; SKX-NEXT:    vdivss (%rdi), %xmm0, %xmm0 # sched: [16:3.00]
2109 ; SKX-NEXT:    retq # sched: [7:1.00]
2110 ;
2111 ; BDVER2-SSE-LABEL: test_divss:
2112 ; BDVER2-SSE:       # %bb.0:
2113 ; BDVER2-SSE-NEXT:    divss %xmm1, %xmm0 # sched: [9:9.50]
2114 ; BDVER2-SSE-NEXT:    divss (%rdi), %xmm0 # sched: [14:9.50]
2115 ; BDVER2-SSE-NEXT:    retq # sched: [5:1.00]
2116 ;
2117 ; BDVER2-LABEL: test_divss:
2118 ; BDVER2:       # %bb.0:
2119 ; BDVER2-NEXT:    vdivss %xmm1, %xmm0, %xmm0 # sched: [9:9.50]
2120 ; BDVER2-NEXT:    vdivss (%rdi), %xmm0, %xmm0 # sched: [14:9.50]
2121 ; BDVER2-NEXT:    retq # sched: [5:1.00]
2122 ;
2123 ; BTVER2-SSE-LABEL: test_divss:
2124 ; BTVER2-SSE:       # %bb.0:
2125 ; BTVER2-SSE-NEXT:    divss %xmm1, %xmm0 # sched: [19:19.00]
2126 ; BTVER2-SSE-NEXT:    divss (%rdi), %xmm0 # sched: [24:19.00]
2127 ; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
2128 ;
2129 ; BTVER2-LABEL: test_divss:
2130 ; BTVER2:       # %bb.0:
2131 ; BTVER2-NEXT:    vdivss %xmm1, %xmm0, %xmm0 # sched: [19:19.00]
2132 ; BTVER2-NEXT:    vdivss (%rdi), %xmm0, %xmm0 # sched: [24:19.00]
2133 ; BTVER2-NEXT:    retq # sched: [4:1.00]
2134 ;
2135 ; ZNVER1-SSE-LABEL: test_divss:
2136 ; ZNVER1-SSE:       # %bb.0:
2137 ; ZNVER1-SSE-NEXT:    divss %xmm1, %xmm0 # sched: [15:1.00]
2138 ; ZNVER1-SSE-NEXT:    divss (%rdi), %xmm0 # sched: [22:1.00]
2139 ; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
2140 ;
2141 ; ZNVER1-LABEL: test_divss:
2142 ; ZNVER1:       # %bb.0:
2143 ; ZNVER1-NEXT:    vdivss %xmm1, %xmm0, %xmm0 # sched: [15:1.00]
2144 ; ZNVER1-NEXT:    vdivss (%rdi), %xmm0, %xmm0 # sched: [22:1.00]
2145 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
2146   %1 = fdiv float %a0, %a1
2147   %2 = load float, float *%a2, align 4
2148   %3 = fdiv float %1, %2
2149   ret float %3
2150 }
2151
2152 define void @test_ldmxcsr(i32 %a0) {
2153 ; GENERIC-LABEL: test_ldmxcsr:
2154 ; GENERIC:       # %bb.0:
2155 ; GENERIC-NEXT:    movl %edi, -{{[0-9]+}}(%rsp) # sched: [1:1.00]
2156 ; GENERIC-NEXT:    ldmxcsr -{{[0-9]+}}(%rsp) # sched: [5:1.00]
2157 ; GENERIC-NEXT:    retq # sched: [1:1.00]
2158 ;
2159 ; ATOM-LABEL: test_ldmxcsr:
2160 ; ATOM:       # %bb.0:
2161 ; ATOM-NEXT:    movl %edi, -{{[0-9]+}}(%rsp) # sched: [1:1.00]
2162 ; ATOM-NEXT:    ldmxcsr -{{[0-9]+}}(%rsp) # sched: [5:2.50]
2163 ; ATOM-NEXT:    retq # sched: [79:39.50]
2164 ;
2165 ; SLM-LABEL: test_ldmxcsr:
2166 ; SLM:       # %bb.0:
2167 ; SLM-NEXT:    movl %edi, -{{[0-9]+}}(%rsp) # sched: [1:1.00]
2168 ; SLM-NEXT:    ldmxcsr -{{[0-9]+}}(%rsp) # sched: [3:1.00]
2169 ; SLM-NEXT:    retq # sched: [4:1.00]
2170 ;
2171 ; SANDY-SSE-LABEL: test_ldmxcsr:
2172 ; SANDY-SSE:       # %bb.0:
2173 ; SANDY-SSE-NEXT:    movl %edi, -{{[0-9]+}}(%rsp) # sched: [1:1.00]
2174 ; SANDY-SSE-NEXT:    ldmxcsr -{{[0-9]+}}(%rsp) # sched: [5:1.00]
2175 ; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
2176 ;
2177 ; SANDY-LABEL: test_ldmxcsr:
2178 ; SANDY:       # %bb.0:
2179 ; SANDY-NEXT:    movl %edi, -{{[0-9]+}}(%rsp) # sched: [1:1.00]
2180 ; SANDY-NEXT:    vldmxcsr -{{[0-9]+}}(%rsp) # sched: [5:1.00]
2181 ; SANDY-NEXT:    retq # sched: [1:1.00]
2182 ;
2183 ; HASWELL-SSE-LABEL: test_ldmxcsr:
2184 ; HASWELL-SSE:       # %bb.0:
2185 ; HASWELL-SSE-NEXT:    movl %edi, -{{[0-9]+}}(%rsp) # sched: [1:1.00]
2186 ; HASWELL-SSE-NEXT:    ldmxcsr -{{[0-9]+}}(%rsp) # sched: [7:1.00]
2187 ; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
2188 ;
2189 ; HASWELL-LABEL: test_ldmxcsr:
2190 ; HASWELL:       # %bb.0:
2191 ; HASWELL-NEXT:    movl %edi, -{{[0-9]+}}(%rsp) # sched: [1:1.00]
2192 ; HASWELL-NEXT:    vldmxcsr -{{[0-9]+}}(%rsp) # sched: [7:1.00]
2193 ; HASWELL-NEXT:    retq # sched: [7:1.00]
2194 ;
2195 ; BROADWELL-SSE-LABEL: test_ldmxcsr:
2196 ; BROADWELL-SSE:       # %bb.0:
2197 ; BROADWELL-SSE-NEXT:    movl %edi, -{{[0-9]+}}(%rsp) # sched: [1:1.00]
2198 ; BROADWELL-SSE-NEXT:    ldmxcsr -{{[0-9]+}}(%rsp) # sched: [7:1.00]
2199 ; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
2200 ;
2201 ; BROADWELL-LABEL: test_ldmxcsr:
2202 ; BROADWELL:       # %bb.0:
2203 ; BROADWELL-NEXT:    movl %edi, -{{[0-9]+}}(%rsp) # sched: [1:1.00]
2204 ; BROADWELL-NEXT:    vldmxcsr -{{[0-9]+}}(%rsp) # sched: [7:1.00]
2205 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
2206 ;
2207 ; SKYLAKE-SSE-LABEL: test_ldmxcsr:
2208 ; SKYLAKE-SSE:       # %bb.0:
2209 ; SKYLAKE-SSE-NEXT:    movl %edi, -{{[0-9]+}}(%rsp) # sched: [1:1.00]
2210 ; SKYLAKE-SSE-NEXT:    ldmxcsr -{{[0-9]+}}(%rsp) # sched: [7:1.00]
2211 ; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
2212 ;
2213 ; SKYLAKE-LABEL: test_ldmxcsr:
2214 ; SKYLAKE:       # %bb.0:
2215 ; SKYLAKE-NEXT:    movl %edi, -{{[0-9]+}}(%rsp) # sched: [1:1.00]
2216 ; SKYLAKE-NEXT:    vldmxcsr -{{[0-9]+}}(%rsp) # sched: [7:1.00]
2217 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
2218 ;
2219 ; SKX-SSE-LABEL: test_ldmxcsr:
2220 ; SKX-SSE:       # %bb.0:
2221 ; SKX-SSE-NEXT:    movl %edi, -{{[0-9]+}}(%rsp) # sched: [1:1.00]
2222 ; SKX-SSE-NEXT:    ldmxcsr -{{[0-9]+}}(%rsp) # sched: [7:1.00]
2223 ; SKX-SSE-NEXT:    retq # sched: [7:1.00]
2224 ;
2225 ; SKX-LABEL: test_ldmxcsr:
2226 ; SKX:       # %bb.0:
2227 ; SKX-NEXT:    movl %edi, -{{[0-9]+}}(%rsp) # sched: [1:1.00]
2228 ; SKX-NEXT:    vldmxcsr -{{[0-9]+}}(%rsp) # sched: [7:1.00]
2229 ; SKX-NEXT:    retq # sched: [7:1.00]
2230 ;
2231 ; BDVER2-SSE-LABEL: test_ldmxcsr:
2232 ; BDVER2-SSE:       # %bb.0:
2233 ; BDVER2-SSE-NEXT:    movl %edi, -{{[0-9]+}}(%rsp) # sched: [1:1.00]
2234 ; BDVER2-SSE-NEXT:    ldmxcsr -{{[0-9]+}}(%rsp) # sched: [5:0.50]
2235 ; BDVER2-SSE-NEXT:    retq # sched: [5:1.00]
2236 ;
2237 ; BDVER2-LABEL: test_ldmxcsr:
2238 ; BDVER2:       # %bb.0:
2239 ; BDVER2-NEXT:    movl %edi, -{{[0-9]+}}(%rsp) # sched: [1:1.00]
2240 ; BDVER2-NEXT:    vldmxcsr -{{[0-9]+}}(%rsp) # sched: [5:0.50]
2241 ; BDVER2-NEXT:    retq # sched: [5:1.00]
2242 ;
2243 ; BTVER2-SSE-LABEL: test_ldmxcsr:
2244 ; BTVER2-SSE:       # %bb.0:
2245 ; BTVER2-SSE-NEXT:    movl %edi, -{{[0-9]+}}(%rsp) # sched: [1:1.00]
2246 ; BTVER2-SSE-NEXT:    ldmxcsr -{{[0-9]+}}(%rsp) # sched: [3:1.00]
2247 ; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
2248 ;
2249 ; BTVER2-LABEL: test_ldmxcsr:
2250 ; BTVER2:       # %bb.0:
2251 ; BTVER2-NEXT:    movl %edi, -{{[0-9]+}}(%rsp) # sched: [1:1.00]
2252 ; BTVER2-NEXT:    vldmxcsr -{{[0-9]+}}(%rsp) # sched: [3:1.00]
2253 ; BTVER2-NEXT:    retq # sched: [4:1.00]
2254 ;
2255 ; ZNVER1-SSE-LABEL: test_ldmxcsr:
2256 ; ZNVER1-SSE:       # %bb.0:
2257 ; ZNVER1-SSE-NEXT:    movl %edi, -{{[0-9]+}}(%rsp) # sched: [1:0.50]
2258 ; ZNVER1-SSE-NEXT:    ldmxcsr -{{[0-9]+}}(%rsp) # sched: [100:0.25]
2259 ; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
2260 ;
2261 ; ZNVER1-LABEL: test_ldmxcsr:
2262 ; ZNVER1:       # %bb.0:
2263 ; ZNVER1-NEXT:    movl %edi, -{{[0-9]+}}(%rsp) # sched: [1:0.50]
2264 ; ZNVER1-NEXT:    vldmxcsr -{{[0-9]+}}(%rsp) # sched: [100:0.25]
2265 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
2266   %1 = alloca i32, align 4
2267   %2 = bitcast i32* %1 to i8*
2268   store i32 %a0, i32* %1
2269   call void @llvm.x86.sse.ldmxcsr(i8* %2)
2270   ret void
2271 }
2272 declare void @llvm.x86.sse.ldmxcsr(i8*) nounwind readnone
2273
2274 define <4 x float> @test_maxps(<4 x float> %a0, <4 x float> %a1, <4 x float> *%a2) {
2275 ; GENERIC-LABEL: test_maxps:
2276 ; GENERIC:       # %bb.0:
2277 ; GENERIC-NEXT:    maxps %xmm1, %xmm0 # sched: [3:1.00]
2278 ; GENERIC-NEXT:    maxps (%rdi), %xmm0 # sched: [9:1.00]
2279 ; GENERIC-NEXT:    retq # sched: [1:1.00]
2280 ;
2281 ; ATOM-LABEL: test_maxps:
2282 ; ATOM:       # %bb.0:
2283 ; ATOM-NEXT:    maxps %xmm1, %xmm0 # sched: [5:5.00]
2284 ; ATOM-NEXT:    maxps (%rdi), %xmm0 # sched: [5:5.00]
2285 ; ATOM-NEXT:    retq # sched: [79:39.50]
2286 ;
2287 ; SLM-LABEL: test_maxps:
2288 ; SLM:       # %bb.0:
2289 ; SLM-NEXT:    maxps %xmm1, %xmm0 # sched: [3:1.00]
2290 ; SLM-NEXT:    maxps (%rdi), %xmm0 # sched: [6:1.00]
2291 ; SLM-NEXT:    retq # sched: [4:1.00]
2292 ;
2293 ; SANDY-SSE-LABEL: test_maxps:
2294 ; SANDY-SSE:       # %bb.0:
2295 ; SANDY-SSE-NEXT:    maxps %xmm1, %xmm0 # sched: [3:1.00]
2296 ; SANDY-SSE-NEXT:    maxps (%rdi), %xmm0 # sched: [9:1.00]
2297 ; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
2298 ;
2299 ; SANDY-LABEL: test_maxps:
2300 ; SANDY:       # %bb.0:
2301 ; SANDY-NEXT:    vmaxps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
2302 ; SANDY-NEXT:    vmaxps (%rdi), %xmm0, %xmm0 # sched: [9:1.00]
2303 ; SANDY-NEXT:    retq # sched: [1:1.00]
2304 ;
2305 ; HASWELL-SSE-LABEL: test_maxps:
2306 ; HASWELL-SSE:       # %bb.0:
2307 ; HASWELL-SSE-NEXT:    maxps %xmm1, %xmm0 # sched: [3:1.00]
2308 ; HASWELL-SSE-NEXT:    maxps (%rdi), %xmm0 # sched: [9:1.00]
2309 ; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
2310 ;
2311 ; HASWELL-LABEL: test_maxps:
2312 ; HASWELL:       # %bb.0:
2313 ; HASWELL-NEXT:    vmaxps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
2314 ; HASWELL-NEXT:    vmaxps (%rdi), %xmm0, %xmm0 # sched: [9:1.00]
2315 ; HASWELL-NEXT:    retq # sched: [7:1.00]
2316 ;
2317 ; BROADWELL-SSE-LABEL: test_maxps:
2318 ; BROADWELL-SSE:       # %bb.0:
2319 ; BROADWELL-SSE-NEXT:    maxps %xmm1, %xmm0 # sched: [3:1.00]
2320 ; BROADWELL-SSE-NEXT:    maxps (%rdi), %xmm0 # sched: [8:1.00]
2321 ; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
2322 ;
2323 ; BROADWELL-LABEL: test_maxps:
2324 ; BROADWELL:       # %bb.0:
2325 ; BROADWELL-NEXT:    vmaxps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
2326 ; BROADWELL-NEXT:    vmaxps (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
2327 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
2328 ;
2329 ; SKYLAKE-SSE-LABEL: test_maxps:
2330 ; SKYLAKE-SSE:       # %bb.0:
2331 ; SKYLAKE-SSE-NEXT:    maxps %xmm1, %xmm0 # sched: [4:0.50]
2332 ; SKYLAKE-SSE-NEXT:    maxps (%rdi), %xmm0 # sched: [10:0.50]
2333 ; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
2334 ;
2335 ; SKYLAKE-LABEL: test_maxps:
2336 ; SKYLAKE:       # %bb.0:
2337 ; SKYLAKE-NEXT:    vmaxps %xmm1, %xmm0, %xmm0 # sched: [4:0.50]
2338 ; SKYLAKE-NEXT:    vmaxps (%rdi), %xmm0, %xmm0 # sched: [10:0.50]
2339 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
2340 ;
2341 ; SKX-SSE-LABEL: test_maxps:
2342 ; SKX-SSE:       # %bb.0:
2343 ; SKX-SSE-NEXT:    maxps %xmm1, %xmm0 # sched: [4:0.50]
2344 ; SKX-SSE-NEXT:    maxps (%rdi), %xmm0 # sched: [10:0.50]
2345 ; SKX-SSE-NEXT:    retq # sched: [7:1.00]
2346 ;
2347 ; SKX-LABEL: test_maxps:
2348 ; SKX:       # %bb.0:
2349 ; SKX-NEXT:    vmaxps %xmm1, %xmm0, %xmm0 # sched: [4:0.50]
2350 ; SKX-NEXT:    vmaxps (%rdi), %xmm0, %xmm0 # sched: [10:0.50]
2351 ; SKX-NEXT:    retq # sched: [7:1.00]
2352 ;
2353 ; BDVER2-SSE-LABEL: test_maxps:
2354 ; BDVER2-SSE:       # %bb.0:
2355 ; BDVER2-SSE-NEXT:    maxps %xmm1, %xmm0 # sched: [2:1.00]
2356 ; BDVER2-SSE-NEXT:    maxps (%rdi), %xmm0 # sched: [7:1.00]
2357 ; BDVER2-SSE-NEXT:    retq # sched: [5:1.00]
2358 ;
2359 ; BDVER2-LABEL: test_maxps:
2360 ; BDVER2:       # %bb.0:
2361 ; BDVER2-NEXT:    vmaxps %xmm1, %xmm0, %xmm0 # sched: [2:1.00]
2362 ; BDVER2-NEXT:    vmaxps (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
2363 ; BDVER2-NEXT:    retq # sched: [5:1.00]
2364 ;
2365 ; BTVER2-SSE-LABEL: test_maxps:
2366 ; BTVER2-SSE:       # %bb.0:
2367 ; BTVER2-SSE-NEXT:    maxps %xmm1, %xmm0 # sched: [2:1.00]
2368 ; BTVER2-SSE-NEXT:    maxps (%rdi), %xmm0 # sched: [7:1.00]
2369 ; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
2370 ;
2371 ; BTVER2-LABEL: test_maxps:
2372 ; BTVER2:       # %bb.0:
2373 ; BTVER2-NEXT:    vmaxps %xmm1, %xmm0, %xmm0 # sched: [2:1.00]
2374 ; BTVER2-NEXT:    vmaxps (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
2375 ; BTVER2-NEXT:    retq # sched: [4:1.00]
2376 ;
2377 ; ZNVER1-SSE-LABEL: test_maxps:
2378 ; ZNVER1-SSE:       # %bb.0:
2379 ; ZNVER1-SSE-NEXT:    maxps %xmm1, %xmm0 # sched: [3:1.00]
2380 ; ZNVER1-SSE-NEXT:    maxps (%rdi), %xmm0 # sched: [10:1.00]
2381 ; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
2382 ;
2383 ; ZNVER1-LABEL: test_maxps:
2384 ; ZNVER1:       # %bb.0:
2385 ; ZNVER1-NEXT:    vmaxps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
2386 ; ZNVER1-NEXT:    vmaxps (%rdi), %xmm0, %xmm0 # sched: [10:1.00]
2387 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
2388   %1 = call <4 x float> @llvm.x86.sse.max.ps(<4 x float> %a0, <4 x float> %a1)
2389   %2 = load <4 x float>, <4 x float> *%a2, align 16
2390   %3 = call <4 x float> @llvm.x86.sse.max.ps(<4 x float> %1, <4 x float> %2)
2391   ret <4 x float> %3
2392 }
2393 declare <4 x float> @llvm.x86.sse.max.ps(<4 x float>, <4 x float>) nounwind readnone
2394
2395 define <4 x float> @test_maxss(<4 x float> %a0, <4 x float> %a1, <4 x float> *%a2) {
2396 ; GENERIC-LABEL: test_maxss:
2397 ; GENERIC:       # %bb.0:
2398 ; GENERIC-NEXT:    maxss %xmm1, %xmm0 # sched: [3:1.00]
2399 ; GENERIC-NEXT:    maxss (%rdi), %xmm0 # sched: [9:1.00]
2400 ; GENERIC-NEXT:    retq # sched: [1:1.00]
2401 ;
2402 ; ATOM-LABEL: test_maxss:
2403 ; ATOM:       # %bb.0:
2404 ; ATOM-NEXT:    maxss %xmm1, %xmm0 # sched: [5:5.00]
2405 ; ATOM-NEXT:    maxss (%rdi), %xmm0 # sched: [5:5.00]
2406 ; ATOM-NEXT:    retq # sched: [79:39.50]
2407 ;
2408 ; SLM-LABEL: test_maxss:
2409 ; SLM:       # %bb.0:
2410 ; SLM-NEXT:    maxss %xmm1, %xmm0 # sched: [3:1.00]
2411 ; SLM-NEXT:    maxss (%rdi), %xmm0 # sched: [6:1.00]
2412 ; SLM-NEXT:    retq # sched: [4:1.00]
2413 ;
2414 ; SANDY-SSE-LABEL: test_maxss:
2415 ; SANDY-SSE:       # %bb.0:
2416 ; SANDY-SSE-NEXT:    maxss %xmm1, %xmm0 # sched: [3:1.00]
2417 ; SANDY-SSE-NEXT:    maxss (%rdi), %xmm0 # sched: [9:1.00]
2418 ; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
2419 ;
2420 ; SANDY-LABEL: test_maxss:
2421 ; SANDY:       # %bb.0:
2422 ; SANDY-NEXT:    vmaxss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
2423 ; SANDY-NEXT:    vmaxss (%rdi), %xmm0, %xmm0 # sched: [9:1.00]
2424 ; SANDY-NEXT:    retq # sched: [1:1.00]
2425 ;
2426 ; HASWELL-SSE-LABEL: test_maxss:
2427 ; HASWELL-SSE:       # %bb.0:
2428 ; HASWELL-SSE-NEXT:    maxss %xmm1, %xmm0 # sched: [3:1.00]
2429 ; HASWELL-SSE-NEXT:    maxss (%rdi), %xmm0 # sched: [8:1.00]
2430 ; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
2431 ;
2432 ; HASWELL-LABEL: test_maxss:
2433 ; HASWELL:       # %bb.0:
2434 ; HASWELL-NEXT:    vmaxss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
2435 ; HASWELL-NEXT:    vmaxss (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
2436 ; HASWELL-NEXT:    retq # sched: [7:1.00]
2437 ;
2438 ; BROADWELL-SSE-LABEL: test_maxss:
2439 ; BROADWELL-SSE:       # %bb.0:
2440 ; BROADWELL-SSE-NEXT:    maxss %xmm1, %xmm0 # sched: [3:1.00]
2441 ; BROADWELL-SSE-NEXT:    maxss (%rdi), %xmm0 # sched: [8:1.00]
2442 ; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
2443 ;
2444 ; BROADWELL-LABEL: test_maxss:
2445 ; BROADWELL:       # %bb.0:
2446 ; BROADWELL-NEXT:    vmaxss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
2447 ; BROADWELL-NEXT:    vmaxss (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
2448 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
2449 ;
2450 ; SKYLAKE-SSE-LABEL: test_maxss:
2451 ; SKYLAKE-SSE:       # %bb.0:
2452 ; SKYLAKE-SSE-NEXT:    maxss %xmm1, %xmm0 # sched: [4:0.50]
2453 ; SKYLAKE-SSE-NEXT:    maxss (%rdi), %xmm0 # sched: [9:0.50]
2454 ; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
2455 ;
2456 ; SKYLAKE-LABEL: test_maxss:
2457 ; SKYLAKE:       # %bb.0:
2458 ; SKYLAKE-NEXT:    vmaxss %xmm1, %xmm0, %xmm0 # sched: [4:0.50]
2459 ; SKYLAKE-NEXT:    vmaxss (%rdi), %xmm0, %xmm0 # sched: [9:0.50]
2460 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
2461 ;
2462 ; SKX-SSE-LABEL: test_maxss:
2463 ; SKX-SSE:       # %bb.0:
2464 ; SKX-SSE-NEXT:    maxss %xmm1, %xmm0 # sched: [4:0.50]
2465 ; SKX-SSE-NEXT:    maxss (%rdi), %xmm0 # sched: [9:0.50]
2466 ; SKX-SSE-NEXT:    retq # sched: [7:1.00]
2467 ;
2468 ; SKX-LABEL: test_maxss:
2469 ; SKX:       # %bb.0:
2470 ; SKX-NEXT:    vmaxss %xmm1, %xmm0, %xmm0 # sched: [4:0.50]
2471 ; SKX-NEXT:    vmaxss (%rdi), %xmm0, %xmm0 # sched: [9:0.50]
2472 ; SKX-NEXT:    retq # sched: [7:1.00]
2473 ;
2474 ; BDVER2-SSE-LABEL: test_maxss:
2475 ; BDVER2-SSE:       # %bb.0:
2476 ; BDVER2-SSE-NEXT:    maxss %xmm1, %xmm0 # sched: [2:1.00]
2477 ; BDVER2-SSE-NEXT:    maxss (%rdi), %xmm0 # sched: [7:1.00]
2478 ; BDVER2-SSE-NEXT:    retq # sched: [5:1.00]
2479 ;
2480 ; BDVER2-LABEL: test_maxss:
2481 ; BDVER2:       # %bb.0:
2482 ; BDVER2-NEXT:    vmaxss %xmm1, %xmm0, %xmm0 # sched: [2:1.00]
2483 ; BDVER2-NEXT:    vmaxss (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
2484 ; BDVER2-NEXT:    retq # sched: [5:1.00]
2485 ;
2486 ; BTVER2-SSE-LABEL: test_maxss:
2487 ; BTVER2-SSE:       # %bb.0:
2488 ; BTVER2-SSE-NEXT:    maxss %xmm1, %xmm0 # sched: [2:1.00]
2489 ; BTVER2-SSE-NEXT:    maxss (%rdi), %xmm0 # sched: [7:1.00]
2490 ; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
2491 ;
2492 ; BTVER2-LABEL: test_maxss:
2493 ; BTVER2:       # %bb.0:
2494 ; BTVER2-NEXT:    vmaxss %xmm1, %xmm0, %xmm0 # sched: [2:1.00]
2495 ; BTVER2-NEXT:    vmaxss (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
2496 ; BTVER2-NEXT:    retq # sched: [4:1.00]
2497 ;
2498 ; ZNVER1-SSE-LABEL: test_maxss:
2499 ; ZNVER1-SSE:       # %bb.0:
2500 ; ZNVER1-SSE-NEXT:    maxss %xmm1, %xmm0 # sched: [3:1.00]
2501 ; ZNVER1-SSE-NEXT:    maxss (%rdi), %xmm0 # sched: [10:1.00]
2502 ; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
2503 ;
2504 ; ZNVER1-LABEL: test_maxss:
2505 ; ZNVER1:       # %bb.0:
2506 ; ZNVER1-NEXT:    vmaxss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
2507 ; ZNVER1-NEXT:    vmaxss (%rdi), %xmm0, %xmm0 # sched: [10:1.00]
2508 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
2509   %1 = call <4 x float> @llvm.x86.sse.max.ss(<4 x float> %a0, <4 x float> %a1)
2510   %2 = load <4 x float>, <4 x float> *%a2, align 16
2511   %3 = call <4 x float> @llvm.x86.sse.max.ss(<4 x float> %1, <4 x float> %2)
2512   ret <4 x float> %3
2513 }
2514 declare <4 x float> @llvm.x86.sse.max.ss(<4 x float>, <4 x float>) nounwind readnone
2515
2516 define <4 x float> @test_minps(<4 x float> %a0, <4 x float> %a1, <4 x float> *%a2) {
2517 ; GENERIC-LABEL: test_minps:
2518 ; GENERIC:       # %bb.0:
2519 ; GENERIC-NEXT:    minps %xmm1, %xmm0 # sched: [3:1.00]
2520 ; GENERIC-NEXT:    minps (%rdi), %xmm0 # sched: [9:1.00]
2521 ; GENERIC-NEXT:    retq # sched: [1:1.00]
2522 ;
2523 ; ATOM-LABEL: test_minps:
2524 ; ATOM:       # %bb.0:
2525 ; ATOM-NEXT:    minps %xmm1, %xmm0 # sched: [5:5.00]
2526 ; ATOM-NEXT:    minps (%rdi), %xmm0 # sched: [5:5.00]
2527 ; ATOM-NEXT:    retq # sched: [79:39.50]
2528 ;
2529 ; SLM-LABEL: test_minps:
2530 ; SLM:       # %bb.0:
2531 ; SLM-NEXT:    minps %xmm1, %xmm0 # sched: [3:1.00]
2532 ; SLM-NEXT:    minps (%rdi), %xmm0 # sched: [6:1.00]
2533 ; SLM-NEXT:    retq # sched: [4:1.00]
2534 ;
2535 ; SANDY-SSE-LABEL: test_minps:
2536 ; SANDY-SSE:       # %bb.0:
2537 ; SANDY-SSE-NEXT:    minps %xmm1, %xmm0 # sched: [3:1.00]
2538 ; SANDY-SSE-NEXT:    minps (%rdi), %xmm0 # sched: [9:1.00]
2539 ; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
2540 ;
2541 ; SANDY-LABEL: test_minps:
2542 ; SANDY:       # %bb.0:
2543 ; SANDY-NEXT:    vminps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
2544 ; SANDY-NEXT:    vminps (%rdi), %xmm0, %xmm0 # sched: [9:1.00]
2545 ; SANDY-NEXT:    retq # sched: [1:1.00]
2546 ;
2547 ; HASWELL-SSE-LABEL: test_minps:
2548 ; HASWELL-SSE:       # %bb.0:
2549 ; HASWELL-SSE-NEXT:    minps %xmm1, %xmm0 # sched: [3:1.00]
2550 ; HASWELL-SSE-NEXT:    minps (%rdi), %xmm0 # sched: [9:1.00]
2551 ; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
2552 ;
2553 ; HASWELL-LABEL: test_minps:
2554 ; HASWELL:       # %bb.0:
2555 ; HASWELL-NEXT:    vminps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
2556 ; HASWELL-NEXT:    vminps (%rdi), %xmm0, %xmm0 # sched: [9:1.00]
2557 ; HASWELL-NEXT:    retq # sched: [7:1.00]
2558 ;
2559 ; BROADWELL-SSE-LABEL: test_minps:
2560 ; BROADWELL-SSE:       # %bb.0:
2561 ; BROADWELL-SSE-NEXT:    minps %xmm1, %xmm0 # sched: [3:1.00]
2562 ; BROADWELL-SSE-NEXT:    minps (%rdi), %xmm0 # sched: [8:1.00]
2563 ; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
2564 ;
2565 ; BROADWELL-LABEL: test_minps:
2566 ; BROADWELL:       # %bb.0:
2567 ; BROADWELL-NEXT:    vminps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
2568 ; BROADWELL-NEXT:    vminps (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
2569 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
2570 ;
2571 ; SKYLAKE-SSE-LABEL: test_minps:
2572 ; SKYLAKE-SSE:       # %bb.0:
2573 ; SKYLAKE-SSE-NEXT:    minps %xmm1, %xmm0 # sched: [4:0.50]
2574 ; SKYLAKE-SSE-NEXT:    minps (%rdi), %xmm0 # sched: [10:0.50]
2575 ; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
2576 ;
2577 ; SKYLAKE-LABEL: test_minps:
2578 ; SKYLAKE:       # %bb.0:
2579 ; SKYLAKE-NEXT:    vminps %xmm1, %xmm0, %xmm0 # sched: [4:0.50]
2580 ; SKYLAKE-NEXT:    vminps (%rdi), %xmm0, %xmm0 # sched: [10:0.50]
2581 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
2582 ;
2583 ; SKX-SSE-LABEL: test_minps:
2584 ; SKX-SSE:       # %bb.0:
2585 ; SKX-SSE-NEXT:    minps %xmm1, %xmm0 # sched: [4:0.50]
2586 ; SKX-SSE-NEXT:    minps (%rdi), %xmm0 # sched: [10:0.50]
2587 ; SKX-SSE-NEXT:    retq # sched: [7:1.00]
2588 ;
2589 ; SKX-LABEL: test_minps:
2590 ; SKX:       # %bb.0:
2591 ; SKX-NEXT:    vminps %xmm1, %xmm0, %xmm0 # sched: [4:0.50]
2592 ; SKX-NEXT:    vminps (%rdi), %xmm0, %xmm0 # sched: [10:0.50]
2593 ; SKX-NEXT:    retq # sched: [7:1.00]
2594 ;
2595 ; BDVER2-SSE-LABEL: test_minps:
2596 ; BDVER2-SSE:       # %bb.0:
2597 ; BDVER2-SSE-NEXT:    minps %xmm1, %xmm0 # sched: [2:1.00]
2598 ; BDVER2-SSE-NEXT:    minps (%rdi), %xmm0 # sched: [7:1.00]
2599 ; BDVER2-SSE-NEXT:    retq # sched: [5:1.00]
2600 ;
2601 ; BDVER2-LABEL: test_minps:
2602 ; BDVER2:       # %bb.0:
2603 ; BDVER2-NEXT:    vminps %xmm1, %xmm0, %xmm0 # sched: [2:1.00]
2604 ; BDVER2-NEXT:    vminps (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
2605 ; BDVER2-NEXT:    retq # sched: [5:1.00]
2606 ;
2607 ; BTVER2-SSE-LABEL: test_minps:
2608 ; BTVER2-SSE:       # %bb.0:
2609 ; BTVER2-SSE-NEXT:    minps %xmm1, %xmm0 # sched: [2:1.00]
2610 ; BTVER2-SSE-NEXT:    minps (%rdi), %xmm0 # sched: [7:1.00]
2611 ; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
2612 ;
2613 ; BTVER2-LABEL: test_minps:
2614 ; BTVER2:       # %bb.0:
2615 ; BTVER2-NEXT:    vminps %xmm1, %xmm0, %xmm0 # sched: [2:1.00]
2616 ; BTVER2-NEXT:    vminps (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
2617 ; BTVER2-NEXT:    retq # sched: [4:1.00]
2618 ;
2619 ; ZNVER1-SSE-LABEL: test_minps:
2620 ; ZNVER1-SSE:       # %bb.0:
2621 ; ZNVER1-SSE-NEXT:    minps %xmm1, %xmm0 # sched: [3:1.00]
2622 ; ZNVER1-SSE-NEXT:    minps (%rdi), %xmm0 # sched: [10:1.00]
2623 ; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
2624 ;
2625 ; ZNVER1-LABEL: test_minps:
2626 ; ZNVER1:       # %bb.0:
2627 ; ZNVER1-NEXT:    vminps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
2628 ; ZNVER1-NEXT:    vminps (%rdi), %xmm0, %xmm0 # sched: [10:1.00]
2629 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
2630   %1 = call <4 x float> @llvm.x86.sse.min.ps(<4 x float> %a0, <4 x float> %a1)
2631   %2 = load <4 x float>, <4 x float> *%a2, align 16
2632   %3 = call <4 x float> @llvm.x86.sse.min.ps(<4 x float> %1, <4 x float> %2)
2633   ret <4 x float> %3
2634 }
2635 declare <4 x float> @llvm.x86.sse.min.ps(<4 x float>, <4 x float>) nounwind readnone
2636
2637 define <4 x float> @test_minss(<4 x float> %a0, <4 x float> %a1, <4 x float> *%a2) {
2638 ; GENERIC-LABEL: test_minss:
2639 ; GENERIC:       # %bb.0:
2640 ; GENERIC-NEXT:    minss %xmm1, %xmm0 # sched: [3:1.00]
2641 ; GENERIC-NEXT:    minss (%rdi), %xmm0 # sched: [9:1.00]
2642 ; GENERIC-NEXT:    retq # sched: [1:1.00]
2643 ;
2644 ; ATOM-LABEL: test_minss:
2645 ; ATOM:       # %bb.0:
2646 ; ATOM-NEXT:    minss %xmm1, %xmm0 # sched: [5:5.00]
2647 ; ATOM-NEXT:    minss (%rdi), %xmm0 # sched: [5:5.00]
2648 ; ATOM-NEXT:    retq # sched: [79:39.50]
2649 ;
2650 ; SLM-LABEL: test_minss:
2651 ; SLM:       # %bb.0:
2652 ; SLM-NEXT:    minss %xmm1, %xmm0 # sched: [3:1.00]
2653 ; SLM-NEXT:    minss (%rdi), %xmm0 # sched: [6:1.00]
2654 ; SLM-NEXT:    retq # sched: [4:1.00]
2655 ;
2656 ; SANDY-SSE-LABEL: test_minss:
2657 ; SANDY-SSE:       # %bb.0:
2658 ; SANDY-SSE-NEXT:    minss %xmm1, %xmm0 # sched: [3:1.00]
2659 ; SANDY-SSE-NEXT:    minss (%rdi), %xmm0 # sched: [9:1.00]
2660 ; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
2661 ;
2662 ; SANDY-LABEL: test_minss:
2663 ; SANDY:       # %bb.0:
2664 ; SANDY-NEXT:    vminss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
2665 ; SANDY-NEXT:    vminss (%rdi), %xmm0, %xmm0 # sched: [9:1.00]
2666 ; SANDY-NEXT:    retq # sched: [1:1.00]
2667 ;
2668 ; HASWELL-SSE-LABEL: test_minss:
2669 ; HASWELL-SSE:       # %bb.0:
2670 ; HASWELL-SSE-NEXT:    minss %xmm1, %xmm0 # sched: [3:1.00]
2671 ; HASWELL-SSE-NEXT:    minss (%rdi), %xmm0 # sched: [8:1.00]
2672 ; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
2673 ;
2674 ; HASWELL-LABEL: test_minss:
2675 ; HASWELL:       # %bb.0:
2676 ; HASWELL-NEXT:    vminss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
2677 ; HASWELL-NEXT:    vminss (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
2678 ; HASWELL-NEXT:    retq # sched: [7:1.00]
2679 ;
2680 ; BROADWELL-SSE-LABEL: test_minss:
2681 ; BROADWELL-SSE:       # %bb.0:
2682 ; BROADWELL-SSE-NEXT:    minss %xmm1, %xmm0 # sched: [3:1.00]
2683 ; BROADWELL-SSE-NEXT:    minss (%rdi), %xmm0 # sched: [8:1.00]
2684 ; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
2685 ;
2686 ; BROADWELL-LABEL: test_minss:
2687 ; BROADWELL:       # %bb.0:
2688 ; BROADWELL-NEXT:    vminss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
2689 ; BROADWELL-NEXT:    vminss (%rdi), %xmm0, %xmm0 # sched: [8:1.00]
2690 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
2691 ;
2692 ; SKYLAKE-SSE-LABEL: test_minss:
2693 ; SKYLAKE-SSE:       # %bb.0:
2694 ; SKYLAKE-SSE-NEXT:    minss %xmm1, %xmm0 # sched: [4:0.50]
2695 ; SKYLAKE-SSE-NEXT:    minss (%rdi), %xmm0 # sched: [9:0.50]
2696 ; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
2697 ;
2698 ; SKYLAKE-LABEL: test_minss:
2699 ; SKYLAKE:       # %bb.0:
2700 ; SKYLAKE-NEXT:    vminss %xmm1, %xmm0, %xmm0 # sched: [4:0.50]
2701 ; SKYLAKE-NEXT:    vminss (%rdi), %xmm0, %xmm0 # sched: [9:0.50]
2702 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
2703 ;
2704 ; SKX-SSE-LABEL: test_minss:
2705 ; SKX-SSE:       # %bb.0:
2706 ; SKX-SSE-NEXT:    minss %xmm1, %xmm0 # sched: [4:0.50]
2707 ; SKX-SSE-NEXT:    minss (%rdi), %xmm0 # sched: [9:0.50]
2708 ; SKX-SSE-NEXT:    retq # sched: [7:1.00]
2709 ;
2710 ; SKX-LABEL: test_minss:
2711 ; SKX:       # %bb.0:
2712 ; SKX-NEXT:    vminss %xmm1, %xmm0, %xmm0 # sched: [4:0.50]
2713 ; SKX-NEXT:    vminss (%rdi), %xmm0, %xmm0 # sched: [9:0.50]
2714 ; SKX-NEXT:    retq # sched: [7:1.00]
2715 ;
2716 ; BDVER2-SSE-LABEL: test_minss:
2717 ; BDVER2-SSE:       # %bb.0:
2718 ; BDVER2-SSE-NEXT:    minss %xmm1, %xmm0 # sched: [2:1.00]
2719 ; BDVER2-SSE-NEXT:    minss (%rdi), %xmm0 # sched: [7:1.00]
2720 ; BDVER2-SSE-NEXT:    retq # sched: [5:1.00]
2721 ;
2722 ; BDVER2-LABEL: test_minss:
2723 ; BDVER2:       # %bb.0:
2724 ; BDVER2-NEXT:    vminss %xmm1, %xmm0, %xmm0 # sched: [2:1.00]
2725 ; BDVER2-NEXT:    vminss (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
2726 ; BDVER2-NEXT:    retq # sched: [5:1.00]
2727 ;
2728 ; BTVER2-SSE-LABEL: test_minss:
2729 ; BTVER2-SSE:       # %bb.0:
2730 ; BTVER2-SSE-NEXT:    minss %xmm1, %xmm0 # sched: [2:1.00]
2731 ; BTVER2-SSE-NEXT:    minss (%rdi), %xmm0 # sched: [7:1.00]
2732 ; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
2733 ;
2734 ; BTVER2-LABEL: test_minss:
2735 ; BTVER2:       # %bb.0:
2736 ; BTVER2-NEXT:    vminss %xmm1, %xmm0, %xmm0 # sched: [2:1.00]
2737 ; BTVER2-NEXT:    vminss (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
2738 ; BTVER2-NEXT:    retq # sched: [4:1.00]
2739 ;
2740 ; ZNVER1-SSE-LABEL: test_minss:
2741 ; ZNVER1-SSE:       # %bb.0:
2742 ; ZNVER1-SSE-NEXT:    minss %xmm1, %xmm0 # sched: [3:1.00]
2743 ; ZNVER1-SSE-NEXT:    minss (%rdi), %xmm0 # sched: [10:1.00]
2744 ; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
2745 ;
2746 ; ZNVER1-LABEL: test_minss:
2747 ; ZNVER1:       # %bb.0:
2748 ; ZNVER1-NEXT:    vminss %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
2749 ; ZNVER1-NEXT:    vminss (%rdi), %xmm0, %xmm0 # sched: [10:1.00]
2750 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
2751   %1 = call <4 x float> @llvm.x86.sse.min.ss(<4 x float> %a0, <4 x float> %a1)
2752   %2 = load <4 x float>, <4 x float> *%a2, align 16
2753   %3 = call <4 x float> @llvm.x86.sse.min.ss(<4 x float> %1, <4 x float> %2)
2754   ret <4 x float> %3
2755 }
2756 declare <4 x float> @llvm.x86.sse.min.ss(<4 x float>, <4 x float>) nounwind readnone
2757
2758 define void @test_movaps(<4 x float> *%a0, <4 x float> *%a1) {
2759 ; GENERIC-LABEL: test_movaps:
2760 ; GENERIC:       # %bb.0:
2761 ; GENERIC-NEXT:    movaps (%rdi), %xmm0 # sched: [6:0.50]
2762 ; GENERIC-NEXT:    addps %xmm0, %xmm0 # sched: [3:1.00]
2763 ; GENERIC-NEXT:    movaps %xmm0, (%rsi) # sched: [1:1.00]
2764 ; GENERIC-NEXT:    retq # sched: [1:1.00]
2765 ;
2766 ; ATOM-LABEL: test_movaps:
2767 ; ATOM:       # %bb.0:
2768 ; ATOM-NEXT:    movaps (%rdi), %xmm0 # sched: [1:1.00]
2769 ; ATOM-NEXT:    addps %xmm0, %xmm0 # sched: [5:5.00]
2770 ; ATOM-NEXT:    movaps %xmm0, (%rsi) # sched: [1:1.00]
2771 ; ATOM-NEXT:    retq # sched: [79:39.50]
2772 ;
2773 ; SLM-LABEL: test_movaps:
2774 ; SLM:       # %bb.0:
2775 ; SLM-NEXT:    movaps (%rdi), %xmm0 # sched: [3:1.00]
2776 ; SLM-NEXT:    addps %xmm0, %xmm0 # sched: [3:1.00]
2777 ; SLM-NEXT:    movaps %xmm0, (%rsi) # sched: [1:1.00]
2778 ; SLM-NEXT:    retq # sched: [4:1.00]
2779 ;
2780 ; SANDY-SSE-LABEL: test_movaps:
2781 ; SANDY-SSE:       # %bb.0:
2782 ; SANDY-SSE-NEXT:    movaps (%rdi), %xmm0 # sched: [6:0.50]
2783 ; SANDY-SSE-NEXT:    addps %xmm0, %xmm0 # sched: [3:1.00]
2784 ; SANDY-SSE-NEXT:    movaps %xmm0, (%rsi) # sched: [1:1.00]
2785 ; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
2786 ;
2787 ; SANDY-LABEL: test_movaps:
2788 ; SANDY:       # %bb.0:
2789 ; SANDY-NEXT:    vmovaps (%rdi), %xmm0 # sched: [6:0.50]
2790 ; SANDY-NEXT:    vaddps %xmm0, %xmm0, %xmm0 # sched: [3:1.00]
2791 ; SANDY-NEXT:    vmovaps %xmm0, (%rsi) # sched: [1:1.00]
2792 ; SANDY-NEXT:    retq # sched: [1:1.00]
2793 ;
2794 ; HASWELL-SSE-LABEL: test_movaps:
2795 ; HASWELL-SSE:       # %bb.0:
2796 ; HASWELL-SSE-NEXT:    movaps (%rdi), %xmm0 # sched: [6:0.50]
2797 ; HASWELL-SSE-NEXT:    addps %xmm0, %xmm0 # sched: [3:1.00]
2798 ; HASWELL-SSE-NEXT:    movaps %xmm0, (%rsi) # sched: [1:1.00]
2799 ; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
2800 ;
2801 ; HASWELL-LABEL: test_movaps:
2802 ; HASWELL:       # %bb.0:
2803 ; HASWELL-NEXT:    vmovaps (%rdi), %xmm0 # sched: [6:0.50]
2804 ; HASWELL-NEXT:    vaddps %xmm0, %xmm0, %xmm0 # sched: [3:1.00]
2805 ; HASWELL-NEXT:    vmovaps %xmm0, (%rsi) # sched: [1:1.00]
2806 ; HASWELL-NEXT:    retq # sched: [7:1.00]
2807 ;
2808 ; BROADWELL-SSE-LABEL: test_movaps:
2809 ; BROADWELL-SSE:       # %bb.0:
2810 ; BROADWELL-SSE-NEXT:    movaps (%rdi), %xmm0 # sched: [5:0.50]
2811 ; BROADWELL-SSE-NEXT:    addps %xmm0, %xmm0 # sched: [3:1.00]
2812 ; BROADWELL-SSE-NEXT:    movaps %xmm0, (%rsi) # sched: [1:1.00]
2813 ; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
2814 ;
2815 ; BROADWELL-LABEL: test_movaps:
2816 ; BROADWELL:       # %bb.0:
2817 ; BROADWELL-NEXT:    vmovaps (%rdi), %xmm0 # sched: [5:0.50]
2818 ; BROADWELL-NEXT:    vaddps %xmm0, %xmm0, %xmm0 # sched: [3:1.00]
2819 ; BROADWELL-NEXT:    vmovaps %xmm0, (%rsi) # sched: [1:1.00]
2820 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
2821 ;
2822 ; SKYLAKE-SSE-LABEL: test_movaps:
2823 ; SKYLAKE-SSE:       # %bb.0:
2824 ; SKYLAKE-SSE-NEXT:    movaps (%rdi), %xmm0 # sched: [6:0.50]
2825 ; SKYLAKE-SSE-NEXT:    addps %xmm0, %xmm0 # sched: [4:0.50]
2826 ; SKYLAKE-SSE-NEXT:    movaps %xmm0, (%rsi) # sched: [1:1.00]
2827 ; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
2828 ;
2829 ; SKYLAKE-LABEL: test_movaps:
2830 ; SKYLAKE:       # %bb.0:
2831 ; SKYLAKE-NEXT:    vmovaps (%rdi), %xmm0 # sched: [6:0.50]
2832 ; SKYLAKE-NEXT:    vaddps %xmm0, %xmm0, %xmm0 # sched: [4:0.50]
2833 ; SKYLAKE-NEXT:    vmovaps %xmm0, (%rsi) # sched: [1:1.00]
2834 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
2835 ;
2836 ; SKX-SSE-LABEL: test_movaps:
2837 ; SKX-SSE:       # %bb.0:
2838 ; SKX-SSE-NEXT:    movaps (%rdi), %xmm0 # sched: [6:0.50]
2839 ; SKX-SSE-NEXT:    addps %xmm0, %xmm0 # sched: [4:0.50]
2840 ; SKX-SSE-NEXT:    movaps %xmm0, (%rsi) # sched: [1:1.00]
2841 ; SKX-SSE-NEXT:    retq # sched: [7:1.00]
2842 ;
2843 ; SKX-LABEL: test_movaps:
2844 ; SKX:       # %bb.0:
2845 ; SKX-NEXT:    vmovaps (%rdi), %xmm0 # sched: [6:0.50]
2846 ; SKX-NEXT:    vaddps %xmm0, %xmm0, %xmm0 # sched: [4:0.50]
2847 ; SKX-NEXT:    vmovaps %xmm0, (%rsi) # sched: [1:1.00]
2848 ; SKX-NEXT:    retq # sched: [7:1.00]
2849 ;
2850 ; BDVER2-SSE-LABEL: test_movaps:
2851 ; BDVER2-SSE:       # %bb.0:
2852 ; BDVER2-SSE-NEXT:    movaps (%rdi), %xmm0 # sched: [5:0.50]
2853 ; BDVER2-SSE-NEXT:    addps %xmm0, %xmm0 # sched: [5:1.00]
2854 ; BDVER2-SSE-NEXT:    movaps %xmm0, (%rsi) # sched: [1:1.00]
2855 ; BDVER2-SSE-NEXT:    retq # sched: [5:1.00]
2856 ;
2857 ; BDVER2-LABEL: test_movaps:
2858 ; BDVER2:       # %bb.0:
2859 ; BDVER2-NEXT:    vmovaps (%rdi), %xmm0 # sched: [5:0.50]
2860 ; BDVER2-NEXT:    vaddps %xmm0, %xmm0, %xmm0 # sched: [5:1.00]
2861 ; BDVER2-NEXT:    vmovaps %xmm0, (%rsi) # sched: [1:1.00]
2862 ; BDVER2-NEXT:    retq # sched: [5:1.00]
2863 ;
2864 ; BTVER2-SSE-LABEL: test_movaps:
2865 ; BTVER2-SSE:       # %bb.0:
2866 ; BTVER2-SSE-NEXT:    movaps (%rdi), %xmm0 # sched: [5:1.00]
2867 ; BTVER2-SSE-NEXT:    addps %xmm0, %xmm0 # sched: [3:1.00]
2868 ; BTVER2-SSE-NEXT:    movaps %xmm0, (%rsi) # sched: [1:1.00]
2869 ; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
2870 ;
2871 ; BTVER2-LABEL: test_movaps:
2872 ; BTVER2:       # %bb.0:
2873 ; BTVER2-NEXT:    vmovaps (%rdi), %xmm0 # sched: [5:1.00]
2874 ; BTVER2-NEXT:    vaddps %xmm0, %xmm0, %xmm0 # sched: [3:1.00]
2875 ; BTVER2-NEXT:    vmovaps %xmm0, (%rsi) # sched: [1:1.00]
2876 ; BTVER2-NEXT:    retq # sched: [4:1.00]
2877 ;
2878 ; ZNVER1-SSE-LABEL: test_movaps:
2879 ; ZNVER1-SSE:       # %bb.0:
2880 ; ZNVER1-SSE-NEXT:    movaps (%rdi), %xmm0 # sched: [8:0.50]
2881 ; ZNVER1-SSE-NEXT:    addps %xmm0, %xmm0 # sched: [3:1.00]
2882 ; ZNVER1-SSE-NEXT:    movaps %xmm0, (%rsi) # sched: [1:0.50]
2883 ; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
2884 ;
2885 ; ZNVER1-LABEL: test_movaps:
2886 ; ZNVER1:       # %bb.0:
2887 ; ZNVER1-NEXT:    vmovaps (%rdi), %xmm0 # sched: [8:0.50]
2888 ; ZNVER1-NEXT:    vaddps %xmm0, %xmm0, %xmm0 # sched: [3:1.00]
2889 ; ZNVER1-NEXT:    vmovaps %xmm0, (%rsi) # sched: [1:0.50]
2890 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
2891   %1 = load <4 x float>, <4 x float> *%a0, align 16
2892   %2 = fadd <4 x float> %1, %1
2893   store <4 x float> %2, <4 x float> *%a1, align 16
2894   ret void
2895 }
2896
2897 ; TODO (v)movhlps
2898
2899 define <4 x float> @test_movhlps(<4 x float> %a0, <4 x float> %a1) {
2900 ; GENERIC-LABEL: test_movhlps:
2901 ; GENERIC:       # %bb.0:
2902 ; GENERIC-NEXT:    movhlps {{.*#+}} xmm0 = xmm1[1],xmm0[1] sched: [1:1.00]
2903 ; GENERIC-NEXT:    retq # sched: [1:1.00]
2904 ;
2905 ; ATOM-LABEL: test_movhlps:
2906 ; ATOM:       # %bb.0:
2907 ; ATOM-NEXT:    movhlps {{.*#+}} xmm0 = xmm1[1],xmm0[1] sched: [1:1.00]
2908 ; ATOM-NEXT:    nop # sched: [1:0.50]
2909 ; ATOM-NEXT:    nop # sched: [1:0.50]
2910 ; ATOM-NEXT:    nop # sched: [1:0.50]
2911 ; ATOM-NEXT:    nop # sched: [1:0.50]
2912 ; ATOM-NEXT:    nop # sched: [1:0.50]
2913 ; ATOM-NEXT:    nop # sched: [1:0.50]
2914 ; ATOM-NEXT:    retq # sched: [79:39.50]
2915 ;
2916 ; SLM-LABEL: test_movhlps:
2917 ; SLM:       # %bb.0:
2918 ; SLM-NEXT:    movhlps {{.*#+}} xmm0 = xmm1[1],xmm0[1] sched: [1:1.00]
2919 ; SLM-NEXT:    retq # sched: [4:1.00]
2920 ;
2921 ; SANDY-SSE-LABEL: test_movhlps:
2922 ; SANDY-SSE:       # %bb.0:
2923 ; SANDY-SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm1[1],xmm0[1] sched: [1:1.00]
2924 ; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
2925 ;
2926 ; SANDY-LABEL: test_movhlps:
2927 ; SANDY:       # %bb.0:
2928 ; SANDY-NEXT:    vunpckhpd {{.*#+}} xmm0 = xmm1[1],xmm0[1] sched: [1:1.00]
2929 ; SANDY-NEXT:    retq # sched: [1:1.00]
2930 ;
2931 ; HASWELL-SSE-LABEL: test_movhlps:
2932 ; HASWELL-SSE:       # %bb.0:
2933 ; HASWELL-SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm1[1],xmm0[1] sched: [1:1.00]
2934 ; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
2935 ;
2936 ; HASWELL-LABEL: test_movhlps:
2937 ; HASWELL:       # %bb.0:
2938 ; HASWELL-NEXT:    vunpckhpd {{.*#+}} xmm0 = xmm1[1],xmm0[1] sched: [1:1.00]
2939 ; HASWELL-NEXT:    retq # sched: [7:1.00]
2940 ;
2941 ; BROADWELL-SSE-LABEL: test_movhlps:
2942 ; BROADWELL-SSE:       # %bb.0:
2943 ; BROADWELL-SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm1[1],xmm0[1] sched: [1:1.00]
2944 ; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
2945 ;
2946 ; BROADWELL-LABEL: test_movhlps:
2947 ; BROADWELL:       # %bb.0:
2948 ; BROADWELL-NEXT:    vunpckhpd {{.*#+}} xmm0 = xmm1[1],xmm0[1] sched: [1:1.00]
2949 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
2950 ;
2951 ; SKYLAKE-SSE-LABEL: test_movhlps:
2952 ; SKYLAKE-SSE:       # %bb.0:
2953 ; SKYLAKE-SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm1[1],xmm0[1] sched: [1:1.00]
2954 ; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
2955 ;
2956 ; SKYLAKE-LABEL: test_movhlps:
2957 ; SKYLAKE:       # %bb.0:
2958 ; SKYLAKE-NEXT:    vunpckhpd {{.*#+}} xmm0 = xmm1[1],xmm0[1] sched: [1:1.00]
2959 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
2960 ;
2961 ; SKX-SSE-LABEL: test_movhlps:
2962 ; SKX-SSE:       # %bb.0:
2963 ; SKX-SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm1[1],xmm0[1] sched: [1:1.00]
2964 ; SKX-SSE-NEXT:    retq # sched: [7:1.00]
2965 ;
2966 ; SKX-LABEL: test_movhlps:
2967 ; SKX:       # %bb.0:
2968 ; SKX-NEXT:    vunpckhpd {{.*#+}} xmm0 = xmm1[1],xmm0[1] sched: [1:1.00]
2969 ; SKX-NEXT:    retq # sched: [7:1.00]
2970 ;
2971 ; BDVER2-SSE-LABEL: test_movhlps:
2972 ; BDVER2-SSE:       # %bb.0:
2973 ; BDVER2-SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm1[1],xmm0[1] sched: [2:0.50]
2974 ; BDVER2-SSE-NEXT:    retq # sched: [5:1.00]
2975 ;
2976 ; BDVER2-LABEL: test_movhlps:
2977 ; BDVER2:       # %bb.0:
2978 ; BDVER2-NEXT:    vunpckhpd {{.*#+}} xmm0 = xmm1[1],xmm0[1] sched: [2:0.50]
2979 ; BDVER2-NEXT:    retq # sched: [5:1.00]
2980 ;
2981 ; BTVER2-SSE-LABEL: test_movhlps:
2982 ; BTVER2-SSE:       # %bb.0:
2983 ; BTVER2-SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm1[1],xmm0[1] sched: [1:0.50]
2984 ; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
2985 ;
2986 ; BTVER2-LABEL: test_movhlps:
2987 ; BTVER2:       # %bb.0:
2988 ; BTVER2-NEXT:    vunpckhpd {{.*#+}} xmm0 = xmm1[1],xmm0[1] sched: [1:0.50]
2989 ; BTVER2-NEXT:    retq # sched: [4:1.00]
2990 ;
2991 ; ZNVER1-SSE-LABEL: test_movhlps:
2992 ; ZNVER1-SSE:       # %bb.0:
2993 ; ZNVER1-SSE-NEXT:    movhlps {{.*#+}} xmm0 = xmm1[1],xmm0[1] sched: [1:0.50]
2994 ; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
2995 ;
2996 ; ZNVER1-LABEL: test_movhlps:
2997 ; ZNVER1:       # %bb.0:
2998 ; ZNVER1-NEXT:    vunpckhpd {{.*#+}} xmm0 = xmm1[1],xmm0[1] sched: [1:0.50]
2999 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
3000   %1 = shufflevector <4 x float> %a0, <4 x float> %a1, <4 x i32> <i32 6, i32 7, i32 2, i32 3>
3001   ret <4 x float> %1
3002 }
3003
3004 ; TODO (v)movhps
3005
3006 define <4 x float> @test_movhps(<4 x float> %a0, <4 x float> %a1, x86_mmx *%a2) {
3007 ; GENERIC-LABEL: test_movhps:
3008 ; GENERIC:       # %bb.0:
3009 ; GENERIC-NEXT:    movhpd {{.*#+}} xmm1 = xmm1[0],mem[0] sched: [7:1.00]
3010 ; GENERIC-NEXT:    addps %xmm1, %xmm0 # sched: [3:1.00]
3011 ; GENERIC-NEXT:    movhps %xmm0, (%rdi) # sched: [1:1.00]
3012 ; GENERIC-NEXT:    movaps %xmm1, %xmm0 # sched: [1:1.00]
3013 ; GENERIC-NEXT:    retq # sched: [1:1.00]
3014 ;
3015 ; ATOM-LABEL: test_movhps:
3016 ; ATOM:       # %bb.0:
3017 ; ATOM-NEXT:    movaps %xmm0, %xmm2 # sched: [1:0.50]
3018 ; ATOM-NEXT:    movhpd {{.*#+}} xmm1 = xmm1[0],mem[0] sched: [1:1.00]
3019 ; ATOM-NEXT:    addps %xmm1, %xmm2 # sched: [5:5.00]
3020 ; ATOM-NEXT:    movaps %xmm1, %xmm0 # sched: [1:0.50]
3021 ; ATOM-NEXT:    movhps %xmm2, (%rdi) # sched: [1:1.00]
3022 ; ATOM-NEXT:    retq # sched: [79:39.50]
3023 ;
3024 ; SLM-LABEL: test_movhps:
3025 ; SLM:       # %bb.0:
3026 ; SLM-NEXT:    movhpd {{.*#+}} xmm1 = xmm1[0],mem[0] sched: [4:1.00]
3027 ; SLM-NEXT:    addps %xmm1, %xmm0 # sched: [3:1.00]
3028 ; SLM-NEXT:    movhps %xmm0, (%rdi) # sched: [1:1.00]
3029 ; SLM-NEXT:    movaps %xmm1, %xmm0 # sched: [1:0.50]
3030 ; SLM-NEXT:    retq # sched: [4:1.00]
3031 ;
3032 ; SANDY-SSE-LABEL: test_movhps:
3033 ; SANDY-SSE:       # %bb.0:
3034 ; SANDY-SSE-NEXT:    movhpd {{.*#+}} xmm1 = xmm1[0],mem[0] sched: [7:1.00]
3035 ; SANDY-SSE-NEXT:    addps %xmm1, %xmm0 # sched: [3:1.00]
3036 ; SANDY-SSE-NEXT:    movhps %xmm0, (%rdi) # sched: [1:1.00]
3037 ; SANDY-SSE-NEXT:    movaps %xmm1, %xmm0 # sched: [1:1.00]
3038 ; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
3039 ;
3040 ; SANDY-LABEL: test_movhps:
3041 ; SANDY:       # %bb.0:
3042 ; SANDY-NEXT:    vmovhpd {{.*#+}} xmm1 = xmm1[0],mem[0] sched: [7:1.00]
3043 ; SANDY-NEXT:    vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
3044 ; SANDY-NEXT:    vmovhpd %xmm0, (%rdi) # sched: [1:1.00]
3045 ; SANDY-NEXT:    vmovaps %xmm1, %xmm0 # sched: [1:1.00]
3046 ; SANDY-NEXT:    retq # sched: [1:1.00]
3047 ;
3048 ; HASWELL-SSE-LABEL: test_movhps:
3049 ; HASWELL-SSE:       # %bb.0:
3050 ; HASWELL-SSE-NEXT:    movhpd {{.*#+}} xmm1 = xmm1[0],mem[0] sched: [6:1.00]
3051 ; HASWELL-SSE-NEXT:    addps %xmm1, %xmm0 # sched: [3:1.00]
3052 ; HASWELL-SSE-NEXT:    movhps %xmm0, (%rdi) # sched: [1:1.00]
3053 ; HASWELL-SSE-NEXT:    movaps %xmm1, %xmm0 # sched: [1:1.00]
3054 ; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
3055 ;
3056 ; HASWELL-LABEL: test_movhps:
3057 ; HASWELL:       # %bb.0:
3058 ; HASWELL-NEXT:    vmovhpd {{.*#+}} xmm1 = xmm1[0],mem[0] sched: [6:1.00]
3059 ; HASWELL-NEXT:    vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
3060 ; HASWELL-NEXT:    vmovhpd %xmm0, (%rdi) # sched: [1:1.00]
3061 ; HASWELL-NEXT:    vmovaps %xmm1, %xmm0 # sched: [1:1.00]
3062 ; HASWELL-NEXT:    retq # sched: [7:1.00]
3063 ;
3064 ; BROADWELL-SSE-LABEL: test_movhps:
3065 ; BROADWELL-SSE:       # %bb.0:
3066 ; BROADWELL-SSE-NEXT:    movhpd {{.*#+}} xmm1 = xmm1[0],mem[0] sched: [6:1.00]
3067 ; BROADWELL-SSE-NEXT:    addps %xmm1, %xmm0 # sched: [3:1.00]
3068 ; BROADWELL-SSE-NEXT:    movhps %xmm0, (%rdi) # sched: [1:1.00]
3069 ; BROADWELL-SSE-NEXT:    movaps %xmm1, %xmm0 # sched: [1:1.00]
3070 ; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
3071 ;
3072 ; BROADWELL-LABEL: test_movhps:
3073 ; BROADWELL:       # %bb.0:
3074 ; BROADWELL-NEXT:    vmovhpd {{.*#+}} xmm1 = xmm1[0],mem[0] sched: [6:1.00]
3075 ; BROADWELL-NEXT:    vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
3076 ; BROADWELL-NEXT:    vmovhpd %xmm0, (%rdi) # sched: [1:1.00]
3077 ; BROADWELL-NEXT:    vmovaps %xmm1, %xmm0 # sched: [1:1.00]
3078 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
3079 ;
3080 ; SKYLAKE-SSE-LABEL: test_movhps:
3081 ; SKYLAKE-SSE:       # %bb.0:
3082 ; SKYLAKE-SSE-NEXT:    movhpd {{.*#+}} xmm1 = xmm1[0],mem[0] sched: [6:1.00]
3083 ; SKYLAKE-SSE-NEXT:    addps %xmm1, %xmm0 # sched: [4:0.50]
3084 ; SKYLAKE-SSE-NEXT:    movhps %xmm0, (%rdi) # sched: [1:1.00]
3085 ; SKYLAKE-SSE-NEXT:    movaps %xmm1, %xmm0 # sched: [1:0.33]
3086 ; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
3087 ;
3088 ; SKYLAKE-LABEL: test_movhps:
3089 ; SKYLAKE:       # %bb.0:
3090 ; SKYLAKE-NEXT:    vmovhpd {{.*#+}} xmm1 = xmm1[0],mem[0] sched: [6:1.00]
3091 ; SKYLAKE-NEXT:    vaddps %xmm1, %xmm0, %xmm0 # sched: [4:0.50]
3092 ; SKYLAKE-NEXT:    vmovhpd %xmm0, (%rdi) # sched: [1:1.00]
3093 ; SKYLAKE-NEXT:    vmovaps %xmm1, %xmm0 # sched: [1:0.33]
3094 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
3095 ;
3096 ; SKX-SSE-LABEL: test_movhps:
3097 ; SKX-SSE:       # %bb.0:
3098 ; SKX-SSE-NEXT:    movhpd {{.*#+}} xmm1 = xmm1[0],mem[0] sched: [6:1.00]
3099 ; SKX-SSE-NEXT:    addps %xmm1, %xmm0 # sched: [4:0.50]
3100 ; SKX-SSE-NEXT:    movhps %xmm0, (%rdi) # sched: [1:1.00]
3101 ; SKX-SSE-NEXT:    movaps %xmm1, %xmm0 # sched: [1:0.33]
3102 ; SKX-SSE-NEXT:    retq # sched: [7:1.00]
3103 ;
3104 ; SKX-LABEL: test_movhps:
3105 ; SKX:       # %bb.0:
3106 ; SKX-NEXT:    vmovhpd {{.*#+}} xmm1 = xmm1[0],mem[0] sched: [6:1.00]
3107 ; SKX-NEXT:    vaddps %xmm1, %xmm0, %xmm0 # sched: [4:0.50]
3108 ; SKX-NEXT:    vmovhpd %xmm0, (%rdi) # sched: [1:1.00]
3109 ; SKX-NEXT:    vmovaps %xmm1, %xmm0 # sched: [1:0.33]
3110 ; SKX-NEXT:    retq # sched: [7:1.00]
3111 ;
3112 ; BDVER2-SSE-LABEL: test_movhps:
3113 ; BDVER2-SSE:       # %bb.0:
3114 ; BDVER2-SSE-NEXT:    movhpd {{.*#+}} xmm1 = xmm1[0],mem[0] sched: [7:0.50]
3115 ; BDVER2-SSE-NEXT:    addps %xmm1, %xmm0 # sched: [5:1.00]
3116 ; BDVER2-SSE-NEXT:    movhps %xmm0, (%rdi) # sched: [2:1.00]
3117 ; BDVER2-SSE-NEXT:    movaps %xmm1, %xmm0 # sched: [1:0.50]
3118 ; BDVER2-SSE-NEXT:    retq # sched: [5:1.00]
3119 ;
3120 ; BDVER2-LABEL: test_movhps:
3121 ; BDVER2:       # %bb.0:
3122 ; BDVER2-NEXT:    vmovhpd {{.*#+}} xmm1 = xmm1[0],mem[0] sched: [7:0.50]
3123 ; BDVER2-NEXT:    vaddps %xmm1, %xmm0, %xmm0 # sched: [5:1.00]
3124 ; BDVER2-NEXT:    vmovhpd %xmm0, (%rdi) # sched: [2:1.00]
3125 ; BDVER2-NEXT:    vmovaps %xmm1, %xmm0 # sched: [1:0.50]
3126 ; BDVER2-NEXT:    retq # sched: [5:1.00]
3127 ;
3128 ; BTVER2-SSE-LABEL: test_movhps:
3129 ; BTVER2-SSE:       # %bb.0:
3130 ; BTVER2-SSE-NEXT:    movhpd {{.*#+}} xmm1 = xmm1[0],mem[0] sched: [6:1.00]
3131 ; BTVER2-SSE-NEXT:    addps %xmm1, %xmm0 # sched: [3:1.00]
3132 ; BTVER2-SSE-NEXT:    movhps %xmm0, (%rdi) # sched: [2:1.00]
3133 ; BTVER2-SSE-NEXT:    movaps %xmm1, %xmm0 # sched: [1:0.50]
3134 ; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
3135 ;
3136 ; BTVER2-LABEL: test_movhps:
3137 ; BTVER2:       # %bb.0:
3138 ; BTVER2-NEXT:    vmovhpd {{.*#+}} xmm1 = xmm1[0],mem[0] sched: [6:1.00]
3139 ; BTVER2-NEXT:    vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
3140 ; BTVER2-NEXT:    vmovhpd %xmm0, (%rdi) # sched: [2:1.00]
3141 ; BTVER2-NEXT:    vmovaps %xmm1, %xmm0 # sched: [1:0.50]
3142 ; BTVER2-NEXT:    retq # sched: [4:1.00]
3143 ;
3144 ; ZNVER1-SSE-LABEL: test_movhps:
3145 ; ZNVER1-SSE:       # %bb.0:
3146 ; ZNVER1-SSE-NEXT:    movhpd {{.*#+}} xmm1 = xmm1[0],mem[0] sched: [8:0.50]
3147 ; ZNVER1-SSE-NEXT:    addps %xmm1, %xmm0 # sched: [3:1.00]
3148 ; ZNVER1-SSE-NEXT:    movhps %xmm0, (%rdi) # sched: [1:0.50]
3149 ; ZNVER1-SSE-NEXT:    movaps %xmm1, %xmm0 # sched: [1:0.25]
3150 ; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
3151 ;
3152 ; ZNVER1-LABEL: test_movhps:
3153 ; ZNVER1:       # %bb.0:
3154 ; ZNVER1-NEXT:    vmovhpd {{.*#+}} xmm1 = xmm1[0],mem[0] sched: [8:0.50]
3155 ; ZNVER1-NEXT:    vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
3156 ; ZNVER1-NEXT:    vmovhpd %xmm0, (%rdi) # sched: [1:0.50]
3157 ; ZNVER1-NEXT:    vmovaps %xmm1, %xmm0 # sched: [1:0.25]
3158 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
3159   %1 = bitcast x86_mmx* %a2 to <2 x float>*
3160   %2 = load <2 x float>, <2 x float> *%1, align 8
3161   %3 = shufflevector <2 x float> %2, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
3162   %4 = shufflevector <4 x float> %a1, <4 x float> %3, <4 x i32> <i32 0, i32 1, i32 4, i32 5>
3163   %5 = fadd <4 x float> %a0, %4
3164   %6 = shufflevector <4 x float> %5, <4 x float> undef, <2 x i32> <i32 2, i32 3>
3165   store <2 x float> %6, <2 x float>* %1
3166   ret <4 x float> %4
3167 }
3168
3169 ; TODO (v)movlhps
3170
3171 define <4 x float> @test_movlhps(<4 x float> %a0, <4 x float> %a1) {
3172 ; GENERIC-LABEL: test_movlhps:
3173 ; GENERIC:       # %bb.0:
3174 ; GENERIC-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0] sched: [1:1.00]
3175 ; GENERIC-NEXT:    addps %xmm1, %xmm0 # sched: [3:1.00]
3176 ; GENERIC-NEXT:    retq # sched: [1:1.00]
3177 ;
3178 ; ATOM-LABEL: test_movlhps:
3179 ; ATOM:       # %bb.0:
3180 ; ATOM-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0] sched: [1:1.00]
3181 ; ATOM-NEXT:    addps %xmm1, %xmm0 # sched: [5:5.00]
3182 ; ATOM-NEXT:    retq # sched: [79:39.50]
3183 ;
3184 ; SLM-LABEL: test_movlhps:
3185 ; SLM:       # %bb.0:
3186 ; SLM-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0] sched: [1:1.00]
3187 ; SLM-NEXT:    addps %xmm1, %xmm0 # sched: [3:1.00]
3188 ; SLM-NEXT:    retq # sched: [4:1.00]
3189 ;
3190 ; SANDY-SSE-LABEL: test_movlhps:
3191 ; SANDY-SSE:       # %bb.0:
3192 ; SANDY-SSE-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0] sched: [1:1.00]
3193 ; SANDY-SSE-NEXT:    addps %xmm1, %xmm0 # sched: [3:1.00]
3194 ; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
3195 ;
3196 ; SANDY-LABEL: test_movlhps:
3197 ; SANDY:       # %bb.0:
3198 ; SANDY-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0] sched: [1:1.00]
3199 ; SANDY-NEXT:    vaddps %xmm0, %xmm1, %xmm0 # sched: [3:1.00]
3200 ; SANDY-NEXT:    retq # sched: [1:1.00]
3201 ;
3202 ; HASWELL-SSE-LABEL: test_movlhps:
3203 ; HASWELL-SSE:       # %bb.0:
3204 ; HASWELL-SSE-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0] sched: [1:1.00]
3205 ; HASWELL-SSE-NEXT:    addps %xmm1, %xmm0 # sched: [3:1.00]
3206 ; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
3207 ;
3208 ; HASWELL-LABEL: test_movlhps:
3209 ; HASWELL:       # %bb.0:
3210 ; HASWELL-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0] sched: [1:1.00]
3211 ; HASWELL-NEXT:    vaddps %xmm0, %xmm1, %xmm0 # sched: [3:1.00]
3212 ; HASWELL-NEXT:    retq # sched: [7:1.00]
3213 ;
3214 ; BROADWELL-SSE-LABEL: test_movlhps:
3215 ; BROADWELL-SSE:       # %bb.0:
3216 ; BROADWELL-SSE-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0] sched: [1:1.00]
3217 ; BROADWELL-SSE-NEXT:    addps %xmm1, %xmm0 # sched: [3:1.00]
3218 ; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
3219 ;
3220 ; BROADWELL-LABEL: test_movlhps:
3221 ; BROADWELL:       # %bb.0:
3222 ; BROADWELL-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0] sched: [1:1.00]
3223 ; BROADWELL-NEXT:    vaddps %xmm0, %xmm1, %xmm0 # sched: [3:1.00]
3224 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
3225 ;
3226 ; SKYLAKE-SSE-LABEL: test_movlhps:
3227 ; SKYLAKE-SSE:       # %bb.0:
3228 ; SKYLAKE-SSE-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0] sched: [1:1.00]
3229 ; SKYLAKE-SSE-NEXT:    addps %xmm1, %xmm0 # sched: [4:0.50]
3230 ; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
3231 ;
3232 ; SKYLAKE-LABEL: test_movlhps:
3233 ; SKYLAKE:       # %bb.0:
3234 ; SKYLAKE-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0] sched: [1:1.00]
3235 ; SKYLAKE-NEXT:    vaddps %xmm0, %xmm1, %xmm0 # sched: [4:0.50]
3236 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
3237 ;
3238 ; SKX-SSE-LABEL: test_movlhps:
3239 ; SKX-SSE:       # %bb.0:
3240 ; SKX-SSE-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0] sched: [1:1.00]
3241 ; SKX-SSE-NEXT:    addps %xmm1, %xmm0 # sched: [4:0.50]
3242 ; SKX-SSE-NEXT:    retq # sched: [7:1.00]
3243 ;
3244 ; SKX-LABEL: test_movlhps:
3245 ; SKX:       # %bb.0:
3246 ; SKX-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0] sched: [1:1.00]
3247 ; SKX-NEXT:    vaddps %xmm0, %xmm1, %xmm0 # sched: [4:0.50]
3248 ; SKX-NEXT:    retq # sched: [7:1.00]
3249 ;
3250 ; BDVER2-SSE-LABEL: test_movlhps:
3251 ; BDVER2-SSE:       # %bb.0:
3252 ; BDVER2-SSE-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0] sched: [2:0.50]
3253 ; BDVER2-SSE-NEXT:    addps %xmm1, %xmm0 # sched: [5:1.00]
3254 ; BDVER2-SSE-NEXT:    retq # sched: [5:1.00]
3255 ;
3256 ; BDVER2-LABEL: test_movlhps:
3257 ; BDVER2:       # %bb.0:
3258 ; BDVER2-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0] sched: [2:0.50]
3259 ; BDVER2-NEXT:    vaddps %xmm0, %xmm1, %xmm0 # sched: [5:1.00]
3260 ; BDVER2-NEXT:    retq # sched: [5:1.00]
3261 ;
3262 ; BTVER2-SSE-LABEL: test_movlhps:
3263 ; BTVER2-SSE:       # %bb.0:
3264 ; BTVER2-SSE-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0] sched: [1:0.50]
3265 ; BTVER2-SSE-NEXT:    addps %xmm1, %xmm0 # sched: [3:1.00]
3266 ; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
3267 ;
3268 ; BTVER2-LABEL: test_movlhps:
3269 ; BTVER2:       # %bb.0:
3270 ; BTVER2-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0] sched: [1:0.50]
3271 ; BTVER2-NEXT:    vaddps %xmm0, %xmm1, %xmm0 # sched: [3:1.00]
3272 ; BTVER2-NEXT:    retq # sched: [4:1.00]
3273 ;
3274 ; ZNVER1-SSE-LABEL: test_movlhps:
3275 ; ZNVER1-SSE:       # %bb.0:
3276 ; ZNVER1-SSE-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0] sched: [1:0.50]
3277 ; ZNVER1-SSE-NEXT:    addps %xmm1, %xmm0 # sched: [3:1.00]
3278 ; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
3279 ;
3280 ; ZNVER1-LABEL: test_movlhps:
3281 ; ZNVER1:       # %bb.0:
3282 ; ZNVER1-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0] sched: [1:0.50]
3283 ; ZNVER1-NEXT:    vaddps %xmm0, %xmm1, %xmm0 # sched: [3:1.00]
3284 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
3285   %1 = shufflevector <4 x float> %a0, <4 x float> %a1, <4 x i32> <i32 0, i32 1, i32 4, i32 5>
3286   %2 = fadd <4 x float> %a1, %1
3287   ret <4 x float> %2
3288 }
3289
3290 define <4 x float> @test_movlps(<4 x float> %a0, <4 x float> %a1, x86_mmx *%a2) {
3291 ; GENERIC-LABEL: test_movlps:
3292 ; GENERIC:       # %bb.0:
3293 ; GENERIC-NEXT:    movlpd {{.*#+}} xmm1 = mem[0],xmm1[1] sched: [7:1.00]
3294 ; GENERIC-NEXT:    addps %xmm1, %xmm0 # sched: [3:1.00]
3295 ; GENERIC-NEXT:    movlps %xmm0, (%rdi) # sched: [1:1.00]
3296 ; GENERIC-NEXT:    movaps %xmm1, %xmm0 # sched: [1:1.00]
3297 ; GENERIC-NEXT:    retq # sched: [1:1.00]
3298 ;
3299 ; ATOM-LABEL: test_movlps:
3300 ; ATOM:       # %bb.0:
3301 ; ATOM-NEXT:    movaps %xmm0, %xmm2 # sched: [1:0.50]
3302 ; ATOM-NEXT:    movlpd {{.*#+}} xmm1 = mem[0],xmm1[1] sched: [1:1.00]
3303 ; ATOM-NEXT:    addps %xmm1, %xmm2 # sched: [5:5.00]
3304 ; ATOM-NEXT:    movaps %xmm1, %xmm0 # sched: [1:0.50]
3305 ; ATOM-NEXT:    movlps %xmm2, (%rdi) # sched: [1:1.00]
3306 ; ATOM-NEXT:    retq # sched: [79:39.50]
3307 ;
3308 ; SLM-LABEL: test_movlps:
3309 ; SLM:       # %bb.0:
3310 ; SLM-NEXT:    movlpd {{.*#+}} xmm1 = mem[0],xmm1[1] sched: [4:1.00]
3311 ; SLM-NEXT:    addps %xmm1, %xmm0 # sched: [3:1.00]
3312 ; SLM-NEXT:    movlps %xmm0, (%rdi) # sched: [1:1.00]
3313 ; SLM-NEXT:    movaps %xmm1, %xmm0 # sched: [1:0.50]
3314 ; SLM-NEXT:    retq # sched: [4:1.00]
3315 ;
3316 ; SANDY-SSE-LABEL: test_movlps:
3317 ; SANDY-SSE:       # %bb.0:
3318 ; SANDY-SSE-NEXT:    movlpd {{.*#+}} xmm1 = mem[0],xmm1[1] sched: [7:1.00]
3319 ; SANDY-SSE-NEXT:    addps %xmm1, %xmm0 # sched: [3:1.00]
3320 ; SANDY-SSE-NEXT:    movlps %xmm0, (%rdi) # sched: [1:1.00]
3321 ; SANDY-SSE-NEXT:    movaps %xmm1, %xmm0 # sched: [1:1.00]
3322 ; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
3323 ;
3324 ; SANDY-LABEL: test_movlps:
3325 ; SANDY:       # %bb.0:
3326 ; SANDY-NEXT:    vmovlpd {{.*#+}} xmm1 = mem[0],xmm1[1] sched: [7:1.00]
3327 ; SANDY-NEXT:    vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
3328 ; SANDY-NEXT:    vmovlps %xmm0, (%rdi) # sched: [1:1.00]
3329 ; SANDY-NEXT:    vmovaps %xmm1, %xmm0 # sched: [1:1.00]
3330 ; SANDY-NEXT:    retq # sched: [1:1.00]
3331 ;
3332 ; HASWELL-SSE-LABEL: test_movlps:
3333 ; HASWELL-SSE:       # %bb.0:
3334 ; HASWELL-SSE-NEXT:    movlpd {{.*#+}} xmm1 = mem[0],xmm1[1] sched: [6:1.00]
3335 ; HASWELL-SSE-NEXT:    addps %xmm1, %xmm0 # sched: [3:1.00]
3336 ; HASWELL-SSE-NEXT:    movlps %xmm0, (%rdi) # sched: [1:1.00]
3337 ; HASWELL-SSE-NEXT:    movaps %xmm1, %xmm0 # sched: [1:1.00]
3338 ; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
3339 ;
3340 ; HASWELL-LABEL: test_movlps:
3341 ; HASWELL:       # %bb.0:
3342 ; HASWELL-NEXT:    vmovlpd {{.*#+}} xmm1 = mem[0],xmm1[1] sched: [6:1.00]
3343 ; HASWELL-NEXT:    vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
3344 ; HASWELL-NEXT:    vmovlps %xmm0, (%rdi) # sched: [1:1.00]
3345 ; HASWELL-NEXT:    vmovaps %xmm1, %xmm0 # sched: [1:1.00]
3346 ; HASWELL-NEXT:    retq # sched: [7:1.00]
3347 ;
3348 ; BROADWELL-SSE-LABEL: test_movlps:
3349 ; BROADWELL-SSE:       # %bb.0:
3350 ; BROADWELL-SSE-NEXT:    movlpd {{.*#+}} xmm1 = mem[0],xmm1[1] sched: [6:1.00]
3351 ; BROADWELL-SSE-NEXT:    addps %xmm1, %xmm0 # sched: [3:1.00]
3352 ; BROADWELL-SSE-NEXT:    movlps %xmm0, (%rdi) # sched: [1:1.00]
3353 ; BROADWELL-SSE-NEXT:    movaps %xmm1, %xmm0 # sched: [1:1.00]
3354 ; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
3355 ;
3356 ; BROADWELL-LABEL: test_movlps:
3357 ; BROADWELL:       # %bb.0:
3358 ; BROADWELL-NEXT:    vmovlpd {{.*#+}} xmm1 = mem[0],xmm1[1] sched: [6:1.00]
3359 ; BROADWELL-NEXT:    vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
3360 ; BROADWELL-NEXT:    vmovlps %xmm0, (%rdi) # sched: [1:1.00]
3361 ; BROADWELL-NEXT:    vmovaps %xmm1, %xmm0 # sched: [1:1.00]
3362 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
3363 ;
3364 ; SKYLAKE-SSE-LABEL: test_movlps:
3365 ; SKYLAKE-SSE:       # %bb.0:
3366 ; SKYLAKE-SSE-NEXT:    movlpd {{.*#+}} xmm1 = mem[0],xmm1[1] sched: [6:1.00]
3367 ; SKYLAKE-SSE-NEXT:    addps %xmm1, %xmm0 # sched: [4:0.50]
3368 ; SKYLAKE-SSE-NEXT:    movlps %xmm0, (%rdi) # sched: [1:1.00]
3369 ; SKYLAKE-SSE-NEXT:    movaps %xmm1, %xmm0 # sched: [1:0.33]
3370 ; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
3371 ;
3372 ; SKYLAKE-LABEL: test_movlps:
3373 ; SKYLAKE:       # %bb.0:
3374 ; SKYLAKE-NEXT:    vmovlpd {{.*#+}} xmm1 = mem[0],xmm1[1] sched: [6:1.00]
3375 ; SKYLAKE-NEXT:    vaddps %xmm1, %xmm0, %xmm0 # sched: [4:0.50]
3376 ; SKYLAKE-NEXT:    vmovlps %xmm0, (%rdi) # sched: [1:1.00]
3377 ; SKYLAKE-NEXT:    vmovaps %xmm1, %xmm0 # sched: [1:0.33]
3378 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
3379 ;
3380 ; SKX-SSE-LABEL: test_movlps:
3381 ; SKX-SSE:       # %bb.0:
3382 ; SKX-SSE-NEXT:    movlpd {{.*#+}} xmm1 = mem[0],xmm1[1] sched: [6:1.00]
3383 ; SKX-SSE-NEXT:    addps %xmm1, %xmm0 # sched: [4:0.50]
3384 ; SKX-SSE-NEXT:    movlps %xmm0, (%rdi) # sched: [1:1.00]
3385 ; SKX-SSE-NEXT:    movaps %xmm1, %xmm0 # sched: [1:0.33]
3386 ; SKX-SSE-NEXT:    retq # sched: [7:1.00]
3387 ;
3388 ; SKX-LABEL: test_movlps:
3389 ; SKX:       # %bb.0:
3390 ; SKX-NEXT:    vmovlpd {{.*#+}} xmm1 = mem[0],xmm1[1] sched: [6:1.00]
3391 ; SKX-NEXT:    vaddps %xmm1, %xmm0, %xmm0 # sched: [4:0.50]
3392 ; SKX-NEXT:    vmovlps %xmm0, (%rdi) # sched: [1:1.00]
3393 ; SKX-NEXT:    vmovaps %xmm1, %xmm0 # sched: [1:0.33]
3394 ; SKX-NEXT:    retq # sched: [7:1.00]
3395 ;
3396 ; BDVER2-SSE-LABEL: test_movlps:
3397 ; BDVER2-SSE:       # %bb.0:
3398 ; BDVER2-SSE-NEXT:    movlpd {{.*#+}} xmm1 = mem[0],xmm1[1] sched: [7:0.50]
3399 ; BDVER2-SSE-NEXT:    addps %xmm1, %xmm0 # sched: [5:1.00]
3400 ; BDVER2-SSE-NEXT:    movlps %xmm0, (%rdi) # sched: [2:1.00]
3401 ; BDVER2-SSE-NEXT:    movaps %xmm1, %xmm0 # sched: [1:0.50]
3402 ; BDVER2-SSE-NEXT:    retq # sched: [5:1.00]
3403 ;
3404 ; BDVER2-LABEL: test_movlps:
3405 ; BDVER2:       # %bb.0:
3406 ; BDVER2-NEXT:    vmovlpd {{.*#+}} xmm1 = mem[0],xmm1[1] sched: [7:0.50]
3407 ; BDVER2-NEXT:    vaddps %xmm1, %xmm0, %xmm0 # sched: [5:1.00]
3408 ; BDVER2-NEXT:    vmovlps %xmm0, (%rdi) # sched: [2:1.00]
3409 ; BDVER2-NEXT:    vmovaps %xmm1, %xmm0 # sched: [1:0.50]
3410 ; BDVER2-NEXT:    retq # sched: [5:1.00]
3411 ;
3412 ; BTVER2-SSE-LABEL: test_movlps:
3413 ; BTVER2-SSE:       # %bb.0:
3414 ; BTVER2-SSE-NEXT:    movlpd {{.*#+}} xmm1 = mem[0],xmm1[1] sched: [6:1.00]
3415 ; BTVER2-SSE-NEXT:    addps %xmm1, %xmm0 # sched: [3:1.00]
3416 ; BTVER2-SSE-NEXT:    movlps %xmm0, (%rdi) # sched: [2:1.00]
3417 ; BTVER2-SSE-NEXT:    movaps %xmm1, %xmm0 # sched: [1:0.50]
3418 ; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
3419 ;
3420 ; BTVER2-LABEL: test_movlps:
3421 ; BTVER2:       # %bb.0:
3422 ; BTVER2-NEXT:    vmovlpd {{.*#+}} xmm1 = mem[0],xmm1[1] sched: [6:1.00]
3423 ; BTVER2-NEXT:    vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
3424 ; BTVER2-NEXT:    vmovlps %xmm0, (%rdi) # sched: [2:1.00]
3425 ; BTVER2-NEXT:    vmovaps %xmm1, %xmm0 # sched: [1:0.50]
3426 ; BTVER2-NEXT:    retq # sched: [4:1.00]
3427 ;
3428 ; ZNVER1-SSE-LABEL: test_movlps:
3429 ; ZNVER1-SSE:       # %bb.0:
3430 ; ZNVER1-SSE-NEXT:    movlpd {{.*#+}} xmm1 = mem[0],xmm1[1] sched: [8:0.50]
3431 ; ZNVER1-SSE-NEXT:    addps %xmm1, %xmm0 # sched: [3:1.00]
3432 ; ZNVER1-SSE-NEXT:    movlps %xmm0, (%rdi) # sched: [1:0.50]
3433 ; ZNVER1-SSE-NEXT:    movaps %xmm1, %xmm0 # sched: [1:0.25]
3434 ; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
3435 ;
3436 ; ZNVER1-LABEL: test_movlps:
3437 ; ZNVER1:       # %bb.0:
3438 ; ZNVER1-NEXT:    vmovlpd {{.*#+}} xmm1 = mem[0],xmm1[1] sched: [8:0.50]
3439 ; ZNVER1-NEXT:    vaddps %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
3440 ; ZNVER1-NEXT:    vmovlps %xmm0, (%rdi) # sched: [1:0.50]
3441 ; ZNVER1-NEXT:    vmovaps %xmm1, %xmm0 # sched: [1:0.25]
3442 ; ZNVER1-NEXT:    retq # sched: [1:0.50]
3443   %1 = bitcast x86_mmx* %a2 to <2 x float>*
3444   %2 = load <2 x float>, <2 x float> *%1, align 8
3445   %3 = shufflevector <2 x float> %2, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
3446   %4 = shufflevector <4 x float> %a1, <4 x float> %3, <4 x i32> <i32 4, i32 5, i32 2, i32 3>
3447   %5 = fadd <4 x float> %a0, %4
3448   %6 = shufflevector <4 x float> %5, <4 x float> undef, <2 x i32> <i32 0, i32 1>
3449   store <2 x float> %6, <2 x float>* %1
3450   ret <4 x float> %4
3451 }
3452
3453 define i32 @test_movmskps(<4 x float> %a0) {
3454 ; GENERIC-LABEL: test_movmskps:
3455 ; GENERIC:       # %bb.0:
3456 ; GENERIC-NEXT:    movmskps %xmm0, %eax # sched: [2:1.00]
3457 ; GENERIC-NEXT:    retq # sched: [1:1.00]
3458 ;
3459 ; ATOM-LABEL: test_movmskps:
3460 ; ATOM:       # %bb.0:
3461 ; ATOM-NEXT:    movmskps %xmm0, %eax # sched: [3:3.00]
3462 ; ATOM-NEXT:    nop # sched: [1:0.50]
3463 ; ATOM-NEXT:    nop # sched: [1:0.50]
3464 ; ATOM-NEXT:    retq # sched: [79:39.50]
3465 ;
3466 ; SLM-LABEL: test_movmskps:
3467 ; SLM:       # %bb.0:
3468 ; SLM-NEXT:    movmskps %xmm0, %eax # sched: [4:1.00]
3469 ; SLM-NEXT:    retq # sched: [4:1.00]
3470 ;
3471 ; SANDY-SSE-LABEL: test_movmskps:
3472 ; SANDY-SSE:       # %bb.0:
3473 ; SANDY-SSE-NEXT:    movmskps %xmm0, %eax # sched: [2:1.00]
3474 ; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
3475 ;
3476 ; SANDY-LABEL: test_movmskps:
3477 ; SANDY:       # %bb.0:
3478 ; SANDY-NEXT:    vmovmskps %xmm0, %eax # sched: [2:1.00]
3479 ; SANDY-NEXT:    retq # sched: [1:1.00]
3480 ;
3481 ; HASWELL-SSE-LABEL: test_movmskps:
3482 ; HASWELL-SSE:       # %bb.0:
3483 ; HASWELL-SSE-NEXT:    movmskps %xmm0, %eax # sched: [3:1.00]
3484 ; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
3485 ;
3486 ; HASWELL-LABEL: test_movmskps:
3487 ; HASWELL:       # %bb.0:
3488 ; HASWELL-NEXT:    vmovmskps %xmm0, %eax # sched: [3:1.00]
3489 ; HASWELL-NEXT:    retq # sched: [7:1.00]
3490 ;
3491 ; BROADWELL-SSE-LABEL: test_movmskps:
3492 ; BROADWELL-SSE:       # %bb.0:
3493 ; BROADWELL-SSE-NEXT:    movmskps %xmm0, %eax # sched: [3:1.00]
3494 ; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
3495 ;
3496 ; BROADWELL-LABEL: test_movmskps:
3497 ; BROADWELL:       # %bb.0:
3498 ; BROADWELL-NEXT:    vmovmskps %xmm0, %eax # sched: [3:1.00]
3499 ; BROADWELL-NEXT:    retq # sched: [7:1.00]
3500 ;
3501 ; SKYLAKE-SSE-LABEL: test_movmskps:
3502 ; SKYLAKE-SSE:       # %bb.0:
3503 ; SKYLAKE-SSE-NEXT:    movmskps %xmm0, %eax # sched: [2:1.00]
3504 ; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
3505 ;
3506 ; SKYLAKE-LABEL: test_movmskps:
3507 ; SKYLAKE:       # %bb.0:
3508 ; SKYLAKE-NEXT:    vmovmskps %xmm0, %eax # sched: [2:1.00]
3509 ; SKYLAKE-NEXT:    retq # sched: [7:1.00]
3510 ;
3511 ; SKX-SSE-LABEL: test_movmskps:
3512 ; SKX-SSE:       # %bb.0:
3513 ; SKX-SSE-NEXT:    movmskps %xmm0, %eax # sched: [2:1.00]
3514 ; SKX-SSE-NEXT:    retq # sched: [7:1.00]
3515 ;
3516 ; SKX-LABEL: test_movmskps:
3517 ; SKX:       # %bb.0:
3518 ; SKX-NEXT:    vmovmskps %xmm0, %eax # sched: [2:1.00]
3519 ; SKX-NEXT:    retq # sched: [7:1.00]
3520 ;
3521 ; BDVER2-SSE-LABEL: test_movmskps:
3522 ; BDVER2-SSE:       # %bb.0: