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