• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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=+sse4.2,+pclmul | FileCheck %s --check-prefixes=CHECK,GENERIC
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=slm -mattr=-avx | FileCheck %s --check-prefixes=CHECK,SLM
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=sandybridge -mattr=-avx  | FileCheck %s --check-prefixes=CHECK,SANDY-SSE
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=sandybridge -mattr=-avx2 | FileCheck %s --check-prefixes=CHECK,SANDY
6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=ivybridge -mattr=-avx  | FileCheck %s --check-prefixes=CHECK,SANDY-SSE
7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=ivybridge -mattr=-avx2 | FileCheck %s --check-prefixes=CHECK,SANDY
8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=haswell -mattr=-avx  | FileCheck %s --check-prefixes=CHECK,HASWELL-SSE
9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=haswell -mattr=-avx2 | FileCheck %s --check-prefixes=CHECK,HASWELL
10; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=broadwell -mattr=-avx  | FileCheck %s --check-prefixes=CHECK,BROADWELL-SSE
11; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=broadwell -mattr=-avx2 | FileCheck %s --check-prefixes=CHECK,BROADWELL
12; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=skylake -mattr=-avx  | FileCheck %s --check-prefixes=CHECK,SKYLAKE-SSE
13; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=skylake -mattr=-avx2 | FileCheck %s --check-prefixes=CHECK,SKYLAKE
14; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=skx -mattr=-avx  | FileCheck %s --check-prefixes=CHECK,SKX-SSE
15; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=skx -mattr=-avx2 | FileCheck %s --check-prefixes=CHECK,SKX
16; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=btver2 -mattr=-avx  | FileCheck %s --check-prefixes=CHECK,BTVER2-SSE
17; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=btver2 -mattr=-avx2 | FileCheck %s --check-prefixes=CHECK,BTVER2
18; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=znver1 -mattr=-avx  | FileCheck %s --check-prefixes=CHECK,ZNVER1-SSE
19; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=znver1 -mattr=-avx2 | FileCheck %s --check-prefixes=CHECK,ZNVER1
20
21define i32 @crc32_32_8(i32 %a0, i8 %a1, i8 *%a2) {
22; GENERIC-LABEL: crc32_32_8:
23; GENERIC:       # %bb.0:
24; GENERIC-NEXT:    crc32b %sil, %edi # sched: [3:1.00]
25; GENERIC-NEXT:    crc32b (%rdx), %edi # sched: [8:1.00]
26; GENERIC-NEXT:    movl %edi, %eax # sched: [1:0.33]
27; GENERIC-NEXT:    retq # sched: [1:1.00]
28;
29; SLM-LABEL: crc32_32_8:
30; SLM:       # %bb.0:
31; SLM-NEXT:    crc32b %sil, %edi # sched: [3:1.00]
32; SLM-NEXT:    crc32b (%rdx), %edi # sched: [6:1.00]
33; SLM-NEXT:    movl %edi, %eax # sched: [1:0.50]
34; SLM-NEXT:    retq # sched: [4:1.00]
35;
36; SANDY-SSE-LABEL: crc32_32_8:
37; SANDY-SSE:       # %bb.0:
38; SANDY-SSE-NEXT:    crc32b %sil, %edi # sched: [3:1.00]
39; SANDY-SSE-NEXT:    crc32b (%rdx), %edi # sched: [8:1.00]
40; SANDY-SSE-NEXT:    movl %edi, %eax # sched: [1:0.33]
41; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
42;
43; SANDY-LABEL: crc32_32_8:
44; SANDY:       # %bb.0:
45; SANDY-NEXT:    crc32b %sil, %edi # sched: [3:1.00]
46; SANDY-NEXT:    crc32b (%rdx), %edi # sched: [8:1.00]
47; SANDY-NEXT:    movl %edi, %eax # sched: [1:0.33]
48; SANDY-NEXT:    retq # sched: [1:1.00]
49;
50; HASWELL-SSE-LABEL: crc32_32_8:
51; HASWELL-SSE:       # %bb.0:
52; HASWELL-SSE-NEXT:    crc32b %sil, %edi # sched: [3:1.00]
53; HASWELL-SSE-NEXT:    crc32b (%rdx), %edi # sched: [8:1.00]
54; HASWELL-SSE-NEXT:    movl %edi, %eax # sched: [1:0.25]
55; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
56;
57; HASWELL-LABEL: crc32_32_8:
58; HASWELL:       # %bb.0:
59; HASWELL-NEXT:    crc32b %sil, %edi # sched: [3:1.00]
60; HASWELL-NEXT:    crc32b (%rdx), %edi # sched: [8:1.00]
61; HASWELL-NEXT:    movl %edi, %eax # sched: [1:0.25]
62; HASWELL-NEXT:    retq # sched: [7:1.00]
63;
64; BROADWELL-SSE-LABEL: crc32_32_8:
65; BROADWELL-SSE:       # %bb.0:
66; BROADWELL-SSE-NEXT:    crc32b %sil, %edi # sched: [3:1.00]
67; BROADWELL-SSE-NEXT:    crc32b (%rdx), %edi # sched: [8:1.00]
68; BROADWELL-SSE-NEXT:    movl %edi, %eax # sched: [1:0.25]
69; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
70;
71; BROADWELL-LABEL: crc32_32_8:
72; BROADWELL:       # %bb.0:
73; BROADWELL-NEXT:    crc32b %sil, %edi # sched: [3:1.00]
74; BROADWELL-NEXT:    crc32b (%rdx), %edi # sched: [8:1.00]
75; BROADWELL-NEXT:    movl %edi, %eax # sched: [1:0.25]
76; BROADWELL-NEXT:    retq # sched: [7:1.00]
77;
78; SKYLAKE-SSE-LABEL: crc32_32_8:
79; SKYLAKE-SSE:       # %bb.0:
80; SKYLAKE-SSE-NEXT:    crc32b %sil, %edi # sched: [3:1.00]
81; SKYLAKE-SSE-NEXT:    crc32b (%rdx), %edi # sched: [8:1.00]
82; SKYLAKE-SSE-NEXT:    movl %edi, %eax # sched: [1:0.25]
83; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
84;
85; SKYLAKE-LABEL: crc32_32_8:
86; SKYLAKE:       # %bb.0:
87; SKYLAKE-NEXT:    crc32b %sil, %edi # sched: [3:1.00]
88; SKYLAKE-NEXT:    crc32b (%rdx), %edi # sched: [8:1.00]
89; SKYLAKE-NEXT:    movl %edi, %eax # sched: [1:0.25]
90; SKYLAKE-NEXT:    retq # sched: [7:1.00]
91;
92; SKX-SSE-LABEL: crc32_32_8:
93; SKX-SSE:       # %bb.0:
94; SKX-SSE-NEXT:    crc32b %sil, %edi # sched: [3:1.00]
95; SKX-SSE-NEXT:    crc32b (%rdx), %edi # sched: [8:1.00]
96; SKX-SSE-NEXT:    movl %edi, %eax # sched: [1:0.25]
97; SKX-SSE-NEXT:    retq # sched: [7:1.00]
98;
99; SKX-LABEL: crc32_32_8:
100; SKX:       # %bb.0:
101; SKX-NEXT:    crc32b %sil, %edi # sched: [3:1.00]
102; SKX-NEXT:    crc32b (%rdx), %edi # sched: [8:1.00]
103; SKX-NEXT:    movl %edi, %eax # sched: [1:0.25]
104; SKX-NEXT:    retq # sched: [7:1.00]
105;
106; BTVER2-SSE-LABEL: crc32_32_8:
107; BTVER2-SSE:       # %bb.0:
108; BTVER2-SSE-NEXT:    crc32b %sil, %edi # sched: [3:2.00]
109; BTVER2-SSE-NEXT:    crc32b (%rdx), %edi # sched: [6:2.00]
110; BTVER2-SSE-NEXT:    movl %edi, %eax # sched: [1:0.50]
111; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
112;
113; BTVER2-LABEL: crc32_32_8:
114; BTVER2:       # %bb.0:
115; BTVER2-NEXT:    crc32b %sil, %edi # sched: [3:2.00]
116; BTVER2-NEXT:    crc32b (%rdx), %edi # sched: [6:2.00]
117; BTVER2-NEXT:    movl %edi, %eax # sched: [1:0.50]
118; BTVER2-NEXT:    retq # sched: [4:1.00]
119;
120; ZNVER1-SSE-LABEL: crc32_32_8:
121; ZNVER1-SSE:       # %bb.0:
122; ZNVER1-SSE-NEXT:    crc32b %sil, %edi # sched: [3:1.00]
123; ZNVER1-SSE-NEXT:    crc32b (%rdx), %edi # sched: [10:1.00]
124; ZNVER1-SSE-NEXT:    movl %edi, %eax # sched: [1:0.25]
125; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
126;
127; ZNVER1-LABEL: crc32_32_8:
128; ZNVER1:       # %bb.0:
129; ZNVER1-NEXT:    crc32b %sil, %edi # sched: [3:1.00]
130; ZNVER1-NEXT:    crc32b (%rdx), %edi # sched: [10:1.00]
131; ZNVER1-NEXT:    movl %edi, %eax # sched: [1:0.25]
132; ZNVER1-NEXT:    retq # sched: [1:0.50]
133  %1 = call i32 @llvm.x86.sse42.crc32.32.8(i32 %a0, i8 %a1)
134  %2 = load i8, i8 *%a2
135  %3 = call i32 @llvm.x86.sse42.crc32.32.8(i32 %1, i8 %2)
136  ret i32 %3
137}
138declare i32 @llvm.x86.sse42.crc32.32.8(i32, i8) nounwind
139
140define i32 @crc32_32_16(i32 %a0, i16 %a1, i16 *%a2) {
141; GENERIC-LABEL: crc32_32_16:
142; GENERIC:       # %bb.0:
143; GENERIC-NEXT:    crc32w %si, %edi # sched: [3:1.00]
144; GENERIC-NEXT:    crc32w (%rdx), %edi # sched: [8:1.00]
145; GENERIC-NEXT:    movl %edi, %eax # sched: [1:0.33]
146; GENERIC-NEXT:    retq # sched: [1:1.00]
147;
148; SLM-LABEL: crc32_32_16:
149; SLM:       # %bb.0:
150; SLM-NEXT:    crc32w %si, %edi # sched: [3:1.00]
151; SLM-NEXT:    crc32w (%rdx), %edi # sched: [6:1.00]
152; SLM-NEXT:    movl %edi, %eax # sched: [1:0.50]
153; SLM-NEXT:    retq # sched: [4:1.00]
154;
155; SANDY-SSE-LABEL: crc32_32_16:
156; SANDY-SSE:       # %bb.0:
157; SANDY-SSE-NEXT:    crc32w %si, %edi # sched: [3:1.00]
158; SANDY-SSE-NEXT:    crc32w (%rdx), %edi # sched: [8:1.00]
159; SANDY-SSE-NEXT:    movl %edi, %eax # sched: [1:0.33]
160; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
161;
162; SANDY-LABEL: crc32_32_16:
163; SANDY:       # %bb.0:
164; SANDY-NEXT:    crc32w %si, %edi # sched: [3:1.00]
165; SANDY-NEXT:    crc32w (%rdx), %edi # sched: [8:1.00]
166; SANDY-NEXT:    movl %edi, %eax # sched: [1:0.33]
167; SANDY-NEXT:    retq # sched: [1:1.00]
168;
169; HASWELL-SSE-LABEL: crc32_32_16:
170; HASWELL-SSE:       # %bb.0:
171; HASWELL-SSE-NEXT:    crc32w %si, %edi # sched: [3:1.00]
172; HASWELL-SSE-NEXT:    crc32w (%rdx), %edi # sched: [8:1.00]
173; HASWELL-SSE-NEXT:    movl %edi, %eax # sched: [1:0.25]
174; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
175;
176; HASWELL-LABEL: crc32_32_16:
177; HASWELL:       # %bb.0:
178; HASWELL-NEXT:    crc32w %si, %edi # sched: [3:1.00]
179; HASWELL-NEXT:    crc32w (%rdx), %edi # sched: [8:1.00]
180; HASWELL-NEXT:    movl %edi, %eax # sched: [1:0.25]
181; HASWELL-NEXT:    retq # sched: [7:1.00]
182;
183; BROADWELL-SSE-LABEL: crc32_32_16:
184; BROADWELL-SSE:       # %bb.0:
185; BROADWELL-SSE-NEXT:    crc32w %si, %edi # sched: [3:1.00]
186; BROADWELL-SSE-NEXT:    crc32w (%rdx), %edi # sched: [8:1.00]
187; BROADWELL-SSE-NEXT:    movl %edi, %eax # sched: [1:0.25]
188; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
189;
190; BROADWELL-LABEL: crc32_32_16:
191; BROADWELL:       # %bb.0:
192; BROADWELL-NEXT:    crc32w %si, %edi # sched: [3:1.00]
193; BROADWELL-NEXT:    crc32w (%rdx), %edi # sched: [8:1.00]
194; BROADWELL-NEXT:    movl %edi, %eax # sched: [1:0.25]
195; BROADWELL-NEXT:    retq # sched: [7:1.00]
196;
197; SKYLAKE-SSE-LABEL: crc32_32_16:
198; SKYLAKE-SSE:       # %bb.0:
199; SKYLAKE-SSE-NEXT:    crc32w %si, %edi # sched: [3:1.00]
200; SKYLAKE-SSE-NEXT:    crc32w (%rdx), %edi # sched: [8:1.00]
201; SKYLAKE-SSE-NEXT:    movl %edi, %eax # sched: [1:0.25]
202; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
203;
204; SKYLAKE-LABEL: crc32_32_16:
205; SKYLAKE:       # %bb.0:
206; SKYLAKE-NEXT:    crc32w %si, %edi # sched: [3:1.00]
207; SKYLAKE-NEXT:    crc32w (%rdx), %edi # sched: [8:1.00]
208; SKYLAKE-NEXT:    movl %edi, %eax # sched: [1:0.25]
209; SKYLAKE-NEXT:    retq # sched: [7:1.00]
210;
211; SKX-SSE-LABEL: crc32_32_16:
212; SKX-SSE:       # %bb.0:
213; SKX-SSE-NEXT:    crc32w %si, %edi # sched: [3:1.00]
214; SKX-SSE-NEXT:    crc32w (%rdx), %edi # sched: [8:1.00]
215; SKX-SSE-NEXT:    movl %edi, %eax # sched: [1:0.25]
216; SKX-SSE-NEXT:    retq # sched: [7:1.00]
217;
218; SKX-LABEL: crc32_32_16:
219; SKX:       # %bb.0:
220; SKX-NEXT:    crc32w %si, %edi # sched: [3:1.00]
221; SKX-NEXT:    crc32w (%rdx), %edi # sched: [8:1.00]
222; SKX-NEXT:    movl %edi, %eax # sched: [1:0.25]
223; SKX-NEXT:    retq # sched: [7:1.00]
224;
225; BTVER2-SSE-LABEL: crc32_32_16:
226; BTVER2-SSE:       # %bb.0:
227; BTVER2-SSE-NEXT:    crc32w %si, %edi # sched: [3:2.00]
228; BTVER2-SSE-NEXT:    crc32w (%rdx), %edi # sched: [6:2.00]
229; BTVER2-SSE-NEXT:    movl %edi, %eax # sched: [1:0.50]
230; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
231;
232; BTVER2-LABEL: crc32_32_16:
233; BTVER2:       # %bb.0:
234; BTVER2-NEXT:    crc32w %si, %edi # sched: [3:2.00]
235; BTVER2-NEXT:    crc32w (%rdx), %edi # sched: [6:2.00]
236; BTVER2-NEXT:    movl %edi, %eax # sched: [1:0.50]
237; BTVER2-NEXT:    retq # sched: [4:1.00]
238;
239; ZNVER1-SSE-LABEL: crc32_32_16:
240; ZNVER1-SSE:       # %bb.0:
241; ZNVER1-SSE-NEXT:    crc32w %si, %edi # sched: [3:1.00]
242; ZNVER1-SSE-NEXT:    crc32w (%rdx), %edi # sched: [10:1.00]
243; ZNVER1-SSE-NEXT:    movl %edi, %eax # sched: [1:0.25]
244; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
245;
246; ZNVER1-LABEL: crc32_32_16:
247; ZNVER1:       # %bb.0:
248; ZNVER1-NEXT:    crc32w %si, %edi # sched: [3:1.00]
249; ZNVER1-NEXT:    crc32w (%rdx), %edi # sched: [10:1.00]
250; ZNVER1-NEXT:    movl %edi, %eax # sched: [1:0.25]
251; ZNVER1-NEXT:    retq # sched: [1:0.50]
252  %1 = call i32 @llvm.x86.sse42.crc32.32.16(i32 %a0, i16 %a1)
253  %2 = load i16, i16 *%a2
254  %3 = call i32 @llvm.x86.sse42.crc32.32.16(i32 %1, i16 %2)
255  ret i32 %3
256}
257declare i32 @llvm.x86.sse42.crc32.32.16(i32, i16) nounwind
258
259define i32 @crc32_32_32(i32 %a0, i32 %a1, i32 *%a2) {
260; GENERIC-LABEL: crc32_32_32:
261; GENERIC:       # %bb.0:
262; GENERIC-NEXT:    crc32l %esi, %edi # sched: [3:1.00]
263; GENERIC-NEXT:    crc32l (%rdx), %edi # sched: [8:1.00]
264; GENERIC-NEXT:    movl %edi, %eax # sched: [1:0.33]
265; GENERIC-NEXT:    retq # sched: [1:1.00]
266;
267; SLM-LABEL: crc32_32_32:
268; SLM:       # %bb.0:
269; SLM-NEXT:    crc32l %esi, %edi # sched: [3:1.00]
270; SLM-NEXT:    crc32l (%rdx), %edi # sched: [6:1.00]
271; SLM-NEXT:    movl %edi, %eax # sched: [1:0.50]
272; SLM-NEXT:    retq # sched: [4:1.00]
273;
274; SANDY-SSE-LABEL: crc32_32_32:
275; SANDY-SSE:       # %bb.0:
276; SANDY-SSE-NEXT:    crc32l %esi, %edi # sched: [3:1.00]
277; SANDY-SSE-NEXT:    crc32l (%rdx), %edi # sched: [8:1.00]
278; SANDY-SSE-NEXT:    movl %edi, %eax # sched: [1:0.33]
279; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
280;
281; SANDY-LABEL: crc32_32_32:
282; SANDY:       # %bb.0:
283; SANDY-NEXT:    crc32l %esi, %edi # sched: [3:1.00]
284; SANDY-NEXT:    crc32l (%rdx), %edi # sched: [8:1.00]
285; SANDY-NEXT:    movl %edi, %eax # sched: [1:0.33]
286; SANDY-NEXT:    retq # sched: [1:1.00]
287;
288; HASWELL-SSE-LABEL: crc32_32_32:
289; HASWELL-SSE:       # %bb.0:
290; HASWELL-SSE-NEXT:    crc32l %esi, %edi # sched: [3:1.00]
291; HASWELL-SSE-NEXT:    crc32l (%rdx), %edi # sched: [8:1.00]
292; HASWELL-SSE-NEXT:    movl %edi, %eax # sched: [1:0.25]
293; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
294;
295; HASWELL-LABEL: crc32_32_32:
296; HASWELL:       # %bb.0:
297; HASWELL-NEXT:    crc32l %esi, %edi # sched: [3:1.00]
298; HASWELL-NEXT:    crc32l (%rdx), %edi # sched: [8:1.00]
299; HASWELL-NEXT:    movl %edi, %eax # sched: [1:0.25]
300; HASWELL-NEXT:    retq # sched: [7:1.00]
301;
302; BROADWELL-SSE-LABEL: crc32_32_32:
303; BROADWELL-SSE:       # %bb.0:
304; BROADWELL-SSE-NEXT:    crc32l %esi, %edi # sched: [3:1.00]
305; BROADWELL-SSE-NEXT:    crc32l (%rdx), %edi # sched: [8:1.00]
306; BROADWELL-SSE-NEXT:    movl %edi, %eax # sched: [1:0.25]
307; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
308;
309; BROADWELL-LABEL: crc32_32_32:
310; BROADWELL:       # %bb.0:
311; BROADWELL-NEXT:    crc32l %esi, %edi # sched: [3:1.00]
312; BROADWELL-NEXT:    crc32l (%rdx), %edi # sched: [8:1.00]
313; BROADWELL-NEXT:    movl %edi, %eax # sched: [1:0.25]
314; BROADWELL-NEXT:    retq # sched: [7:1.00]
315;
316; SKYLAKE-SSE-LABEL: crc32_32_32:
317; SKYLAKE-SSE:       # %bb.0:
318; SKYLAKE-SSE-NEXT:    crc32l %esi, %edi # sched: [3:1.00]
319; SKYLAKE-SSE-NEXT:    crc32l (%rdx), %edi # sched: [8:1.00]
320; SKYLAKE-SSE-NEXT:    movl %edi, %eax # sched: [1:0.25]
321; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
322;
323; SKYLAKE-LABEL: crc32_32_32:
324; SKYLAKE:       # %bb.0:
325; SKYLAKE-NEXT:    crc32l %esi, %edi # sched: [3:1.00]
326; SKYLAKE-NEXT:    crc32l (%rdx), %edi # sched: [8:1.00]
327; SKYLAKE-NEXT:    movl %edi, %eax # sched: [1:0.25]
328; SKYLAKE-NEXT:    retq # sched: [7:1.00]
329;
330; SKX-SSE-LABEL: crc32_32_32:
331; SKX-SSE:       # %bb.0:
332; SKX-SSE-NEXT:    crc32l %esi, %edi # sched: [3:1.00]
333; SKX-SSE-NEXT:    crc32l (%rdx), %edi # sched: [8:1.00]
334; SKX-SSE-NEXT:    movl %edi, %eax # sched: [1:0.25]
335; SKX-SSE-NEXT:    retq # sched: [7:1.00]
336;
337; SKX-LABEL: crc32_32_32:
338; SKX:       # %bb.0:
339; SKX-NEXT:    crc32l %esi, %edi # sched: [3:1.00]
340; SKX-NEXT:    crc32l (%rdx), %edi # sched: [8:1.00]
341; SKX-NEXT:    movl %edi, %eax # sched: [1:0.25]
342; SKX-NEXT:    retq # sched: [7:1.00]
343;
344; BTVER2-SSE-LABEL: crc32_32_32:
345; BTVER2-SSE:       # %bb.0:
346; BTVER2-SSE-NEXT:    crc32l %esi, %edi # sched: [3:2.00]
347; BTVER2-SSE-NEXT:    crc32l (%rdx), %edi # sched: [6:2.00]
348; BTVER2-SSE-NEXT:    movl %edi, %eax # sched: [1:0.50]
349; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
350;
351; BTVER2-LABEL: crc32_32_32:
352; BTVER2:       # %bb.0:
353; BTVER2-NEXT:    crc32l %esi, %edi # sched: [3:2.00]
354; BTVER2-NEXT:    crc32l (%rdx), %edi # sched: [6:2.00]
355; BTVER2-NEXT:    movl %edi, %eax # sched: [1:0.50]
356; BTVER2-NEXT:    retq # sched: [4:1.00]
357;
358; ZNVER1-SSE-LABEL: crc32_32_32:
359; ZNVER1-SSE:       # %bb.0:
360; ZNVER1-SSE-NEXT:    crc32l %esi, %edi # sched: [3:1.00]
361; ZNVER1-SSE-NEXT:    crc32l (%rdx), %edi # sched: [10:1.00]
362; ZNVER1-SSE-NEXT:    movl %edi, %eax # sched: [1:0.25]
363; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
364;
365; ZNVER1-LABEL: crc32_32_32:
366; ZNVER1:       # %bb.0:
367; ZNVER1-NEXT:    crc32l %esi, %edi # sched: [3:1.00]
368; ZNVER1-NEXT:    crc32l (%rdx), %edi # sched: [10:1.00]
369; ZNVER1-NEXT:    movl %edi, %eax # sched: [1:0.25]
370; ZNVER1-NEXT:    retq # sched: [1:0.50]
371  %1 = call i32 @llvm.x86.sse42.crc32.32.32(i32 %a0, i32 %a1)
372  %2 = load i32, i32 *%a2
373  %3 = call i32 @llvm.x86.sse42.crc32.32.32(i32 %1, i32 %2)
374  ret i32 %3
375}
376declare i32 @llvm.x86.sse42.crc32.32.32(i32, i32) nounwind
377
378define i64 @crc32_64_8(i64 %a0, i8 %a1, i8 *%a2) nounwind {
379; GENERIC-LABEL: crc32_64_8:
380; GENERIC:       # %bb.0:
381; GENERIC-NEXT:    crc32b %sil, %edi # sched: [3:1.00]
382; GENERIC-NEXT:    crc32b (%rdx), %edi # sched: [8:1.00]
383; GENERIC-NEXT:    movq %rdi, %rax # sched: [1:0.33]
384; GENERIC-NEXT:    retq # sched: [1:1.00]
385;
386; SLM-LABEL: crc32_64_8:
387; SLM:       # %bb.0:
388; SLM-NEXT:    crc32b %sil, %edi # sched: [3:1.00]
389; SLM-NEXT:    crc32b (%rdx), %edi # sched: [6:1.00]
390; SLM-NEXT:    movq %rdi, %rax # sched: [1:0.50]
391; SLM-NEXT:    retq # sched: [4:1.00]
392;
393; SANDY-SSE-LABEL: crc32_64_8:
394; SANDY-SSE:       # %bb.0:
395; SANDY-SSE-NEXT:    crc32b %sil, %edi # sched: [3:1.00]
396; SANDY-SSE-NEXT:    crc32b (%rdx), %edi # sched: [8:1.00]
397; SANDY-SSE-NEXT:    movq %rdi, %rax # sched: [1:0.33]
398; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
399;
400; SANDY-LABEL: crc32_64_8:
401; SANDY:       # %bb.0:
402; SANDY-NEXT:    crc32b %sil, %edi # sched: [3:1.00]
403; SANDY-NEXT:    crc32b (%rdx), %edi # sched: [8:1.00]
404; SANDY-NEXT:    movq %rdi, %rax # sched: [1:0.33]
405; SANDY-NEXT:    retq # sched: [1:1.00]
406;
407; HASWELL-SSE-LABEL: crc32_64_8:
408; HASWELL-SSE:       # %bb.0:
409; HASWELL-SSE-NEXT:    crc32b %sil, %edi # sched: [3:1.00]
410; HASWELL-SSE-NEXT:    crc32b (%rdx), %edi # sched: [8:1.00]
411; HASWELL-SSE-NEXT:    movq %rdi, %rax # sched: [1:0.25]
412; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
413;
414; HASWELL-LABEL: crc32_64_8:
415; HASWELL:       # %bb.0:
416; HASWELL-NEXT:    crc32b %sil, %edi # sched: [3:1.00]
417; HASWELL-NEXT:    crc32b (%rdx), %edi # sched: [8:1.00]
418; HASWELL-NEXT:    movq %rdi, %rax # sched: [1:0.25]
419; HASWELL-NEXT:    retq # sched: [7:1.00]
420;
421; BROADWELL-SSE-LABEL: crc32_64_8:
422; BROADWELL-SSE:       # %bb.0:
423; BROADWELL-SSE-NEXT:    crc32b %sil, %edi # sched: [3:1.00]
424; BROADWELL-SSE-NEXT:    crc32b (%rdx), %edi # sched: [8:1.00]
425; BROADWELL-SSE-NEXT:    movq %rdi, %rax # sched: [1:0.25]
426; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
427;
428; BROADWELL-LABEL: crc32_64_8:
429; BROADWELL:       # %bb.0:
430; BROADWELL-NEXT:    crc32b %sil, %edi # sched: [3:1.00]
431; BROADWELL-NEXT:    crc32b (%rdx), %edi # sched: [8:1.00]
432; BROADWELL-NEXT:    movq %rdi, %rax # sched: [1:0.25]
433; BROADWELL-NEXT:    retq # sched: [7:1.00]
434;
435; SKYLAKE-SSE-LABEL: crc32_64_8:
436; SKYLAKE-SSE:       # %bb.0:
437; SKYLAKE-SSE-NEXT:    crc32b %sil, %edi # sched: [3:1.00]
438; SKYLAKE-SSE-NEXT:    crc32b (%rdx), %edi # sched: [8:1.00]
439; SKYLAKE-SSE-NEXT:    movq %rdi, %rax # sched: [1:0.25]
440; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
441;
442; SKYLAKE-LABEL: crc32_64_8:
443; SKYLAKE:       # %bb.0:
444; SKYLAKE-NEXT:    crc32b %sil, %edi # sched: [3:1.00]
445; SKYLAKE-NEXT:    crc32b (%rdx), %edi # sched: [8:1.00]
446; SKYLAKE-NEXT:    movq %rdi, %rax # sched: [1:0.25]
447; SKYLAKE-NEXT:    retq # sched: [7:1.00]
448;
449; SKX-SSE-LABEL: crc32_64_8:
450; SKX-SSE:       # %bb.0:
451; SKX-SSE-NEXT:    crc32b %sil, %edi # sched: [3:1.00]
452; SKX-SSE-NEXT:    crc32b (%rdx), %edi # sched: [8:1.00]
453; SKX-SSE-NEXT:    movq %rdi, %rax # sched: [1:0.25]
454; SKX-SSE-NEXT:    retq # sched: [7:1.00]
455;
456; SKX-LABEL: crc32_64_8:
457; SKX:       # %bb.0:
458; SKX-NEXT:    crc32b %sil, %edi # sched: [3:1.00]
459; SKX-NEXT:    crc32b (%rdx), %edi # sched: [8:1.00]
460; SKX-NEXT:    movq %rdi, %rax # sched: [1:0.25]
461; SKX-NEXT:    retq # sched: [7:1.00]
462;
463; BTVER2-SSE-LABEL: crc32_64_8:
464; BTVER2-SSE:       # %bb.0:
465; BTVER2-SSE-NEXT:    crc32b %sil, %edi # sched: [3:2.00]
466; BTVER2-SSE-NEXT:    crc32b (%rdx), %edi # sched: [6:2.00]
467; BTVER2-SSE-NEXT:    movq %rdi, %rax # sched: [1:0.50]
468; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
469;
470; BTVER2-LABEL: crc32_64_8:
471; BTVER2:       # %bb.0:
472; BTVER2-NEXT:    crc32b %sil, %edi # sched: [3:2.00]
473; BTVER2-NEXT:    crc32b (%rdx), %edi # sched: [6:2.00]
474; BTVER2-NEXT:    movq %rdi, %rax # sched: [1:0.50]
475; BTVER2-NEXT:    retq # sched: [4:1.00]
476;
477; ZNVER1-SSE-LABEL: crc32_64_8:
478; ZNVER1-SSE:       # %bb.0:
479; ZNVER1-SSE-NEXT:    crc32b %sil, %edi # sched: [3:1.00]
480; ZNVER1-SSE-NEXT:    crc32b (%rdx), %edi # sched: [10:1.00]
481; ZNVER1-SSE-NEXT:    movq %rdi, %rax # sched: [1:0.25]
482; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
483;
484; ZNVER1-LABEL: crc32_64_8:
485; ZNVER1:       # %bb.0:
486; ZNVER1-NEXT:    crc32b %sil, %edi # sched: [3:1.00]
487; ZNVER1-NEXT:    crc32b (%rdx), %edi # sched: [10:1.00]
488; ZNVER1-NEXT:    movq %rdi, %rax # sched: [1:0.25]
489; ZNVER1-NEXT:    retq # sched: [1:0.50]
490  %1 = call i64 @llvm.x86.sse42.crc32.64.8(i64 %a0, i8 %a1)
491  %2 = load i8, i8 *%a2
492  %3 = call i64 @llvm.x86.sse42.crc32.64.8(i64 %1, i8 %2)
493  ret i64 %3
494}
495declare i64 @llvm.x86.sse42.crc32.64.8(i64, i8) nounwind
496
497define i64 @crc32_64_64(i64 %a0, i64 %a1, i64 *%a2) {
498; GENERIC-LABEL: crc32_64_64:
499; GENERIC:       # %bb.0:
500; GENERIC-NEXT:    crc32q %rsi, %rdi # sched: [3:1.00]
501; GENERIC-NEXT:    crc32q (%rdx), %rdi # sched: [8:1.00]
502; GENERIC-NEXT:    movq %rdi, %rax # sched: [1:0.33]
503; GENERIC-NEXT:    retq # sched: [1:1.00]
504;
505; SLM-LABEL: crc32_64_64:
506; SLM:       # %bb.0:
507; SLM-NEXT:    crc32q %rsi, %rdi # sched: [3:1.00]
508; SLM-NEXT:    crc32q (%rdx), %rdi # sched: [6:1.00]
509; SLM-NEXT:    movq %rdi, %rax # sched: [1:0.50]
510; SLM-NEXT:    retq # sched: [4:1.00]
511;
512; SANDY-SSE-LABEL: crc32_64_64:
513; SANDY-SSE:       # %bb.0:
514; SANDY-SSE-NEXT:    crc32q %rsi, %rdi # sched: [3:1.00]
515; SANDY-SSE-NEXT:    crc32q (%rdx), %rdi # sched: [8:1.00]
516; SANDY-SSE-NEXT:    movq %rdi, %rax # sched: [1:0.33]
517; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
518;
519; SANDY-LABEL: crc32_64_64:
520; SANDY:       # %bb.0:
521; SANDY-NEXT:    crc32q %rsi, %rdi # sched: [3:1.00]
522; SANDY-NEXT:    crc32q (%rdx), %rdi # sched: [8:1.00]
523; SANDY-NEXT:    movq %rdi, %rax # sched: [1:0.33]
524; SANDY-NEXT:    retq # sched: [1:1.00]
525;
526; HASWELL-SSE-LABEL: crc32_64_64:
527; HASWELL-SSE:       # %bb.0:
528; HASWELL-SSE-NEXT:    crc32q %rsi, %rdi # sched: [3:1.00]
529; HASWELL-SSE-NEXT:    crc32q (%rdx), %rdi # sched: [8:1.00]
530; HASWELL-SSE-NEXT:    movq %rdi, %rax # sched: [1:0.25]
531; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
532;
533; HASWELL-LABEL: crc32_64_64:
534; HASWELL:       # %bb.0:
535; HASWELL-NEXT:    crc32q %rsi, %rdi # sched: [3:1.00]
536; HASWELL-NEXT:    crc32q (%rdx), %rdi # sched: [8:1.00]
537; HASWELL-NEXT:    movq %rdi, %rax # sched: [1:0.25]
538; HASWELL-NEXT:    retq # sched: [7:1.00]
539;
540; BROADWELL-SSE-LABEL: crc32_64_64:
541; BROADWELL-SSE:       # %bb.0:
542; BROADWELL-SSE-NEXT:    crc32q %rsi, %rdi # sched: [3:1.00]
543; BROADWELL-SSE-NEXT:    crc32q (%rdx), %rdi # sched: [8:1.00]
544; BROADWELL-SSE-NEXT:    movq %rdi, %rax # sched: [1:0.25]
545; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
546;
547; BROADWELL-LABEL: crc32_64_64:
548; BROADWELL:       # %bb.0:
549; BROADWELL-NEXT:    crc32q %rsi, %rdi # sched: [3:1.00]
550; BROADWELL-NEXT:    crc32q (%rdx), %rdi # sched: [8:1.00]
551; BROADWELL-NEXT:    movq %rdi, %rax # sched: [1:0.25]
552; BROADWELL-NEXT:    retq # sched: [7:1.00]
553;
554; SKYLAKE-SSE-LABEL: crc32_64_64:
555; SKYLAKE-SSE:       # %bb.0:
556; SKYLAKE-SSE-NEXT:    crc32q %rsi, %rdi # sched: [3:1.00]
557; SKYLAKE-SSE-NEXT:    crc32q (%rdx), %rdi # sched: [8:1.00]
558; SKYLAKE-SSE-NEXT:    movq %rdi, %rax # sched: [1:0.25]
559; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
560;
561; SKYLAKE-LABEL: crc32_64_64:
562; SKYLAKE:       # %bb.0:
563; SKYLAKE-NEXT:    crc32q %rsi, %rdi # sched: [3:1.00]
564; SKYLAKE-NEXT:    crc32q (%rdx), %rdi # sched: [8:1.00]
565; SKYLAKE-NEXT:    movq %rdi, %rax # sched: [1:0.25]
566; SKYLAKE-NEXT:    retq # sched: [7:1.00]
567;
568; SKX-SSE-LABEL: crc32_64_64:
569; SKX-SSE:       # %bb.0:
570; SKX-SSE-NEXT:    crc32q %rsi, %rdi # sched: [3:1.00]
571; SKX-SSE-NEXT:    crc32q (%rdx), %rdi # sched: [8:1.00]
572; SKX-SSE-NEXT:    movq %rdi, %rax # sched: [1:0.25]
573; SKX-SSE-NEXT:    retq # sched: [7:1.00]
574;
575; SKX-LABEL: crc32_64_64:
576; SKX:       # %bb.0:
577; SKX-NEXT:    crc32q %rsi, %rdi # sched: [3:1.00]
578; SKX-NEXT:    crc32q (%rdx), %rdi # sched: [8:1.00]
579; SKX-NEXT:    movq %rdi, %rax # sched: [1:0.25]
580; SKX-NEXT:    retq # sched: [7:1.00]
581;
582; BTVER2-SSE-LABEL: crc32_64_64:
583; BTVER2-SSE:       # %bb.0:
584; BTVER2-SSE-NEXT:    crc32q %rsi, %rdi # sched: [3:2.00]
585; BTVER2-SSE-NEXT:    crc32q (%rdx), %rdi # sched: [6:2.00]
586; BTVER2-SSE-NEXT:    movq %rdi, %rax # sched: [1:0.50]
587; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
588;
589; BTVER2-LABEL: crc32_64_64:
590; BTVER2:       # %bb.0:
591; BTVER2-NEXT:    crc32q %rsi, %rdi # sched: [3:2.00]
592; BTVER2-NEXT:    crc32q (%rdx), %rdi # sched: [6:2.00]
593; BTVER2-NEXT:    movq %rdi, %rax # sched: [1:0.50]
594; BTVER2-NEXT:    retq # sched: [4:1.00]
595;
596; ZNVER1-SSE-LABEL: crc32_64_64:
597; ZNVER1-SSE:       # %bb.0:
598; ZNVER1-SSE-NEXT:    crc32q %rsi, %rdi # sched: [3:1.00]
599; ZNVER1-SSE-NEXT:    crc32q (%rdx), %rdi # sched: [10:1.00]
600; ZNVER1-SSE-NEXT:    movq %rdi, %rax # sched: [1:0.25]
601; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
602;
603; ZNVER1-LABEL: crc32_64_64:
604; ZNVER1:       # %bb.0:
605; ZNVER1-NEXT:    crc32q %rsi, %rdi # sched: [3:1.00]
606; ZNVER1-NEXT:    crc32q (%rdx), %rdi # sched: [10:1.00]
607; ZNVER1-NEXT:    movq %rdi, %rax # sched: [1:0.25]
608; ZNVER1-NEXT:    retq # sched: [1:0.50]
609  %1 = call i64 @llvm.x86.sse42.crc32.64.64(i64 %a0, i64 %a1)
610  %2 = load i64, i64 *%a2
611  %3 = call i64 @llvm.x86.sse42.crc32.64.64(i64 %1, i64 %2)
612  ret i64 %3
613}
614declare i64 @llvm.x86.sse42.crc32.64.64(i64, i64) nounwind
615
616define i32 @test_pcmpestri(<16 x i8> %a0, <16 x i8> %a1, <16 x i8> *%a2) {
617; GENERIC-LABEL: test_pcmpestri:
618; GENERIC:       # %bb.0:
619; GENERIC-NEXT:    movl $7, %eax # sched: [1:0.33]
620; GENERIC-NEXT:    movl $7, %edx # sched: [1:0.33]
621; GENERIC-NEXT:    pcmpestri $7, %xmm1, %xmm0 # sched: [4:2.67]
622; GENERIC-NEXT:    movl %ecx, %esi # sched: [1:0.33]
623; GENERIC-NEXT:    movl $7, %eax # sched: [1:0.33]
624; GENERIC-NEXT:    movl $7, %edx # sched: [1:0.33]
625; GENERIC-NEXT:    pcmpestri $7, (%rdi), %xmm0 # sched: [4:2.33]
626; GENERIC-NEXT:    # kill: def $ecx killed $ecx def $rcx
627; GENERIC-NEXT:    leal (%rcx,%rsi), %eax # sched: [1:0.50]
628; GENERIC-NEXT:    retq # sched: [1:1.00]
629;
630; SLM-LABEL: test_pcmpestri:
631; SLM:       # %bb.0:
632; SLM-NEXT:    movl $7, %eax # sched: [1:0.50]
633; SLM-NEXT:    movl $7, %edx # sched: [1:0.50]
634; SLM-NEXT:    pcmpestri $7, %xmm1, %xmm0 # sched: [21:21.00]
635; SLM-NEXT:    movl $7, %eax # sched: [1:0.50]
636; SLM-NEXT:    movl $7, %edx # sched: [1:0.50]
637; SLM-NEXT:    movl %ecx, %esi # sched: [1:0.50]
638; SLM-NEXT:    pcmpestri $7, (%rdi), %xmm0 # sched: [21:21.00]
639; SLM-NEXT:    # kill: def $ecx killed $ecx def $rcx
640; SLM-NEXT:    leal (%rcx,%rsi), %eax # sched: [1:1.00]
641; SLM-NEXT:    retq # sched: [4:1.00]
642;
643; SANDY-SSE-LABEL: test_pcmpestri:
644; SANDY-SSE:       # %bb.0:
645; SANDY-SSE-NEXT:    movl $7, %eax # sched: [1:0.33]
646; SANDY-SSE-NEXT:    movl $7, %edx # sched: [1:0.33]
647; SANDY-SSE-NEXT:    pcmpestri $7, %xmm1, %xmm0 # sched: [4:2.67]
648; SANDY-SSE-NEXT:    movl %ecx, %esi # sched: [1:0.33]
649; SANDY-SSE-NEXT:    movl $7, %eax # sched: [1:0.33]
650; SANDY-SSE-NEXT:    movl $7, %edx # sched: [1:0.33]
651; SANDY-SSE-NEXT:    pcmpestri $7, (%rdi), %xmm0 # sched: [4:2.33]
652; SANDY-SSE-NEXT:    # kill: def $ecx killed $ecx def $rcx
653; SANDY-SSE-NEXT:    leal (%rcx,%rsi), %eax # sched: [1:0.50]
654; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
655;
656; SANDY-LABEL: test_pcmpestri:
657; SANDY:       # %bb.0:
658; SANDY-NEXT:    movl $7, %eax # sched: [1:0.33]
659; SANDY-NEXT:    movl $7, %edx # sched: [1:0.33]
660; SANDY-NEXT:    vpcmpestri $7, %xmm1, %xmm0 # sched: [4:2.67]
661; SANDY-NEXT:    movl %ecx, %esi # sched: [1:0.33]
662; SANDY-NEXT:    movl $7, %eax # sched: [1:0.33]
663; SANDY-NEXT:    movl $7, %edx # sched: [1:0.33]
664; SANDY-NEXT:    vpcmpestri $7, (%rdi), %xmm0 # sched: [4:2.33]
665; SANDY-NEXT:    # kill: def $ecx killed $ecx def $rcx
666; SANDY-NEXT:    leal (%rcx,%rsi), %eax # sched: [1:0.50]
667; SANDY-NEXT:    retq # sched: [1:1.00]
668;
669; HASWELL-SSE-LABEL: test_pcmpestri:
670; HASWELL-SSE:       # %bb.0:
671; HASWELL-SSE-NEXT:    movl $7, %eax # sched: [1:0.25]
672; HASWELL-SSE-NEXT:    movl $7, %edx # sched: [1:0.25]
673; HASWELL-SSE-NEXT:    pcmpestri $7, %xmm1, %xmm0 # sched: [18:4.00]
674; HASWELL-SSE-NEXT:    movl %ecx, %esi # sched: [1:0.25]
675; HASWELL-SSE-NEXT:    movl $7, %eax # sched: [1:0.25]
676; HASWELL-SSE-NEXT:    movl $7, %edx # sched: [1:0.25]
677; HASWELL-SSE-NEXT:    pcmpestri $7, (%rdi), %xmm0 # sched: [24:4.00]
678; HASWELL-SSE-NEXT:    # kill: def $ecx killed $ecx def $rcx
679; HASWELL-SSE-NEXT:    leal (%rcx,%rsi), %eax # sched: [1:0.50]
680; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
681;
682; HASWELL-LABEL: test_pcmpestri:
683; HASWELL:       # %bb.0:
684; HASWELL-NEXT:    movl $7, %eax # sched: [1:0.25]
685; HASWELL-NEXT:    movl $7, %edx # sched: [1:0.25]
686; HASWELL-NEXT:    vpcmpestri $7, %xmm1, %xmm0 # sched: [18:4.00]
687; HASWELL-NEXT:    movl %ecx, %esi # sched: [1:0.25]
688; HASWELL-NEXT:    movl $7, %eax # sched: [1:0.25]
689; HASWELL-NEXT:    movl $7, %edx # sched: [1:0.25]
690; HASWELL-NEXT:    vpcmpestri $7, (%rdi), %xmm0 # sched: [24:4.00]
691; HASWELL-NEXT:    # kill: def $ecx killed $ecx def $rcx
692; HASWELL-NEXT:    leal (%rcx,%rsi), %eax # sched: [1:0.50]
693; HASWELL-NEXT:    retq # sched: [7:1.00]
694;
695; BROADWELL-SSE-LABEL: test_pcmpestri:
696; BROADWELL-SSE:       # %bb.0:
697; BROADWELL-SSE-NEXT:    movl $7, %eax # sched: [1:0.25]
698; BROADWELL-SSE-NEXT:    movl $7, %edx # sched: [1:0.25]
699; BROADWELL-SSE-NEXT:    pcmpestri $7, %xmm1, %xmm0 # sched: [18:4.00]
700; BROADWELL-SSE-NEXT:    movl %ecx, %esi # sched: [1:0.25]
701; BROADWELL-SSE-NEXT:    movl $7, %eax # sched: [1:0.25]
702; BROADWELL-SSE-NEXT:    movl $7, %edx # sched: [1:0.25]
703; BROADWELL-SSE-NEXT:    pcmpestri $7, (%rdi), %xmm0 # sched: [23:4.00]
704; BROADWELL-SSE-NEXT:    # kill: def $ecx killed $ecx def $rcx
705; BROADWELL-SSE-NEXT:    leal (%rcx,%rsi), %eax # sched: [1:0.50]
706; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
707;
708; BROADWELL-LABEL: test_pcmpestri:
709; BROADWELL:       # %bb.0:
710; BROADWELL-NEXT:    movl $7, %eax # sched: [1:0.25]
711; BROADWELL-NEXT:    movl $7, %edx # sched: [1:0.25]
712; BROADWELL-NEXT:    vpcmpestri $7, %xmm1, %xmm0 # sched: [18:4.00]
713; BROADWELL-NEXT:    movl %ecx, %esi # sched: [1:0.25]
714; BROADWELL-NEXT:    movl $7, %eax # sched: [1:0.25]
715; BROADWELL-NEXT:    movl $7, %edx # sched: [1:0.25]
716; BROADWELL-NEXT:    vpcmpestri $7, (%rdi), %xmm0 # sched: [23:4.00]
717; BROADWELL-NEXT:    # kill: def $ecx killed $ecx def $rcx
718; BROADWELL-NEXT:    leal (%rcx,%rsi), %eax # sched: [1:0.50]
719; BROADWELL-NEXT:    retq # sched: [7:1.00]
720;
721; SKYLAKE-SSE-LABEL: test_pcmpestri:
722; SKYLAKE-SSE:       # %bb.0:
723; SKYLAKE-SSE-NEXT:    movl $7, %eax # sched: [1:0.25]
724; SKYLAKE-SSE-NEXT:    movl $7, %edx # sched: [1:0.25]
725; SKYLAKE-SSE-NEXT:    pcmpestri $7, %xmm1, %xmm0 # sched: [18:4.00]
726; SKYLAKE-SSE-NEXT:    movl %ecx, %esi # sched: [1:0.25]
727; SKYLAKE-SSE-NEXT:    movl $7, %eax # sched: [1:0.25]
728; SKYLAKE-SSE-NEXT:    movl $7, %edx # sched: [1:0.25]
729; SKYLAKE-SSE-NEXT:    pcmpestri $7, (%rdi), %xmm0 # sched: [24:4.00]
730; SKYLAKE-SSE-NEXT:    # kill: def $ecx killed $ecx def $rcx
731; SKYLAKE-SSE-NEXT:    leal (%rcx,%rsi), %eax # sched: [1:0.50]
732; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
733;
734; SKYLAKE-LABEL: test_pcmpestri:
735; SKYLAKE:       # %bb.0:
736; SKYLAKE-NEXT:    movl $7, %eax # sched: [1:0.25]
737; SKYLAKE-NEXT:    movl $7, %edx # sched: [1:0.25]
738; SKYLAKE-NEXT:    vpcmpestri $7, %xmm1, %xmm0 # sched: [18:4.00]
739; SKYLAKE-NEXT:    movl %ecx, %esi # sched: [1:0.25]
740; SKYLAKE-NEXT:    movl $7, %eax # sched: [1:0.25]
741; SKYLAKE-NEXT:    movl $7, %edx # sched: [1:0.25]
742; SKYLAKE-NEXT:    vpcmpestri $7, (%rdi), %xmm0 # sched: [24:4.00]
743; SKYLAKE-NEXT:    # kill: def $ecx killed $ecx def $rcx
744; SKYLAKE-NEXT:    leal (%rcx,%rsi), %eax # sched: [1:0.50]
745; SKYLAKE-NEXT:    retq # sched: [7:1.00]
746;
747; SKX-SSE-LABEL: test_pcmpestri:
748; SKX-SSE:       # %bb.0:
749; SKX-SSE-NEXT:    movl $7, %eax # sched: [1:0.25]
750; SKX-SSE-NEXT:    movl $7, %edx # sched: [1:0.25]
751; SKX-SSE-NEXT:    pcmpestri $7, %xmm1, %xmm0 # sched: [18:4.00]
752; SKX-SSE-NEXT:    movl %ecx, %esi # sched: [1:0.25]
753; SKX-SSE-NEXT:    movl $7, %eax # sched: [1:0.25]
754; SKX-SSE-NEXT:    movl $7, %edx # sched: [1:0.25]
755; SKX-SSE-NEXT:    pcmpestri $7, (%rdi), %xmm0 # sched: [24:4.00]
756; SKX-SSE-NEXT:    # kill: def $ecx killed $ecx def $rcx
757; SKX-SSE-NEXT:    leal (%rcx,%rsi), %eax # sched: [1:0.50]
758; SKX-SSE-NEXT:    retq # sched: [7:1.00]
759;
760; SKX-LABEL: test_pcmpestri:
761; SKX:       # %bb.0:
762; SKX-NEXT:    movl $7, %eax # sched: [1:0.25]
763; SKX-NEXT:    movl $7, %edx # sched: [1:0.25]
764; SKX-NEXT:    vpcmpestri $7, %xmm1, %xmm0 # sched: [18:4.00]
765; SKX-NEXT:    movl %ecx, %esi # sched: [1:0.25]
766; SKX-NEXT:    movl $7, %eax # sched: [1:0.25]
767; SKX-NEXT:    movl $7, %edx # sched: [1:0.25]
768; SKX-NEXT:    vpcmpestri $7, (%rdi), %xmm0 # sched: [24:4.00]
769; SKX-NEXT:    # kill: def $ecx killed $ecx def $rcx
770; SKX-NEXT:    leal (%rcx,%rsi), %eax # sched: [1:0.50]
771; SKX-NEXT:    retq # sched: [7:1.00]
772;
773; BTVER2-SSE-LABEL: test_pcmpestri:
774; BTVER2-SSE:       # %bb.0:
775; BTVER2-SSE-NEXT:    movl $7, %eax # sched: [1:0.50]
776; BTVER2-SSE-NEXT:    movl $7, %edx # sched: [1:0.50]
777; BTVER2-SSE-NEXT:    pcmpestri $7, %xmm1, %xmm0 # sched: [14:5.00]
778; BTVER2-SSE-NEXT:    movl $7, %eax # sched: [1:0.50]
779; BTVER2-SSE-NEXT:    movl $7, %edx # sched: [1:0.50]
780; BTVER2-SSE-NEXT:    movl %ecx, %esi # sched: [1:0.50]
781; BTVER2-SSE-NEXT:    pcmpestri $7, (%rdi), %xmm0 # sched: [19:5.00]
782; BTVER2-SSE-NEXT:    # kill: def $ecx killed $ecx def $rcx
783; BTVER2-SSE-NEXT:    leal (%rcx,%rsi), %eax # sched: [1:0.50]
784; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
785;
786; BTVER2-LABEL: test_pcmpestri:
787; BTVER2:       # %bb.0:
788; BTVER2-NEXT:    movl $7, %eax # sched: [1:0.50]
789; BTVER2-NEXT:    movl $7, %edx # sched: [1:0.50]
790; BTVER2-NEXT:    vpcmpestri $7, %xmm1, %xmm0 # sched: [14:5.00]
791; BTVER2-NEXT:    movl $7, %eax # sched: [1:0.50]
792; BTVER2-NEXT:    movl $7, %edx # sched: [1:0.50]
793; BTVER2-NEXT:    movl %ecx, %esi # sched: [1:0.50]
794; BTVER2-NEXT:    vpcmpestri $7, (%rdi), %xmm0 # sched: [19:5.00]
795; BTVER2-NEXT:    # kill: def $ecx killed $ecx def $rcx
796; BTVER2-NEXT:    leal (%rcx,%rsi), %eax # sched: [1:0.50]
797; BTVER2-NEXT:    retq # sched: [4:1.00]
798;
799; ZNVER1-SSE-LABEL: test_pcmpestri:
800; ZNVER1-SSE:       # %bb.0:
801; ZNVER1-SSE-NEXT:    movl $7, %eax # sched: [1:0.25]
802; ZNVER1-SSE-NEXT:    movl $7, %edx # sched: [1:0.25]
803; ZNVER1-SSE-NEXT:    pcmpestri $7, %xmm1, %xmm0 # sched: [100:0.25]
804; ZNVER1-SSE-NEXT:    movl $7, %eax # sched: [1:0.25]
805; ZNVER1-SSE-NEXT:    movl $7, %edx # sched: [1:0.25]
806; ZNVER1-SSE-NEXT:    movl %ecx, %esi # sched: [1:0.25]
807; ZNVER1-SSE-NEXT:    pcmpestri $7, (%rdi), %xmm0 # sched: [100:0.25]
808; ZNVER1-SSE-NEXT:    # kill: def $ecx killed $ecx def $rcx
809; ZNVER1-SSE-NEXT:    leal (%rcx,%rsi), %eax # sched: [1:0.25]
810; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
811;
812; ZNVER1-LABEL: test_pcmpestri:
813; ZNVER1:       # %bb.0:
814; ZNVER1-NEXT:    movl $7, %eax # sched: [1:0.25]
815; ZNVER1-NEXT:    movl $7, %edx # sched: [1:0.25]
816; ZNVER1-NEXT:    vpcmpestri $7, %xmm1, %xmm0 # sched: [100:0.25]
817; ZNVER1-NEXT:    movl $7, %eax # sched: [1:0.25]
818; ZNVER1-NEXT:    movl $7, %edx # sched: [1:0.25]
819; ZNVER1-NEXT:    movl %ecx, %esi # sched: [1:0.25]
820; ZNVER1-NEXT:    vpcmpestri $7, (%rdi), %xmm0 # sched: [100:0.25]
821; ZNVER1-NEXT:    # kill: def $ecx killed $ecx def $rcx
822; ZNVER1-NEXT:    leal (%rcx,%rsi), %eax # sched: [1:0.25]
823; ZNVER1-NEXT:    retq # sched: [1:0.50]
824  %1 = call i32 @llvm.x86.sse42.pcmpestri128(<16 x i8> %a0, i32 7, <16 x i8> %a1, i32 7, i8 7)
825  %2 = load <16 x i8>, <16 x i8> *%a2, align 16
826  %3 = call i32 @llvm.x86.sse42.pcmpestri128(<16 x i8> %a0, i32 7, <16 x i8> %2, i32 7, i8 7)
827  %4 = add i32 %1, %3
828  ret i32 %4
829}
830declare i32 @llvm.x86.sse42.pcmpestri128(<16 x i8>, i32, <16 x i8>, i32, i8) nounwind readnone
831
832define <16 x i8> @test_pcmpestrm(<16 x i8> %a0, <16 x i8> %a1, <16 x i8> *%a2) {
833; GENERIC-LABEL: test_pcmpestrm:
834; GENERIC:       # %bb.0:
835; GENERIC-NEXT:    movl $7, %eax # sched: [1:0.33]
836; GENERIC-NEXT:    movl $7, %edx # sched: [1:0.33]
837; GENERIC-NEXT:    pcmpestrm $7, %xmm1, %xmm0 # sched: [11:2.67]
838; GENERIC-NEXT:    movl $7, %eax # sched: [1:0.33]
839; GENERIC-NEXT:    movl $7, %edx # sched: [1:0.33]
840; GENERIC-NEXT:    pcmpestrm $7, (%rdi), %xmm0 # sched: [11:2.33]
841; GENERIC-NEXT:    retq # sched: [1:1.00]
842;
843; SLM-LABEL: test_pcmpestrm:
844; SLM:       # %bb.0:
845; SLM-NEXT:    movl $7, %eax # sched: [1:0.50]
846; SLM-NEXT:    movl $7, %edx # sched: [1:0.50]
847; SLM-NEXT:    pcmpestrm $7, %xmm1, %xmm0 # sched: [17:17.00]
848; SLM-NEXT:    movl $7, %eax # sched: [1:0.50]
849; SLM-NEXT:    movl $7, %edx # sched: [1:0.50]
850; SLM-NEXT:    pcmpestrm $7, (%rdi), %xmm0 # sched: [17:17.00]
851; SLM-NEXT:    retq # sched: [4:1.00]
852;
853; SANDY-SSE-LABEL: test_pcmpestrm:
854; SANDY-SSE:       # %bb.0:
855; SANDY-SSE-NEXT:    movl $7, %eax # sched: [1:0.33]
856; SANDY-SSE-NEXT:    movl $7, %edx # sched: [1:0.33]
857; SANDY-SSE-NEXT:    pcmpestrm $7, %xmm1, %xmm0 # sched: [11:2.67]
858; SANDY-SSE-NEXT:    movl $7, %eax # sched: [1:0.33]
859; SANDY-SSE-NEXT:    movl $7, %edx # sched: [1:0.33]
860; SANDY-SSE-NEXT:    pcmpestrm $7, (%rdi), %xmm0 # sched: [11:2.33]
861; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
862;
863; SANDY-LABEL: test_pcmpestrm:
864; SANDY:       # %bb.0:
865; SANDY-NEXT:    movl $7, %eax # sched: [1:0.33]
866; SANDY-NEXT:    movl $7, %edx # sched: [1:0.33]
867; SANDY-NEXT:    vpcmpestrm $7, %xmm1, %xmm0 # sched: [11:2.67]
868; SANDY-NEXT:    movl $7, %eax # sched: [1:0.33]
869; SANDY-NEXT:    movl $7, %edx # sched: [1:0.33]
870; SANDY-NEXT:    vpcmpestrm $7, (%rdi), %xmm0 # sched: [11:2.33]
871; SANDY-NEXT:    retq # sched: [1:1.00]
872;
873; HASWELL-SSE-LABEL: test_pcmpestrm:
874; HASWELL-SSE:       # %bb.0:
875; HASWELL-SSE-NEXT:    movl $7, %eax # sched: [1:0.25]
876; HASWELL-SSE-NEXT:    movl $7, %edx # sched: [1:0.25]
877; HASWELL-SSE-NEXT:    pcmpestrm $7, %xmm1, %xmm0 # sched: [19:4.00]
878; HASWELL-SSE-NEXT:    movl $7, %eax # sched: [1:0.25]
879; HASWELL-SSE-NEXT:    movl $7, %edx # sched: [1:0.25]
880; HASWELL-SSE-NEXT:    pcmpestrm $7, (%rdi), %xmm0 # sched: [25:4.00]
881; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
882;
883; HASWELL-LABEL: test_pcmpestrm:
884; HASWELL:       # %bb.0:
885; HASWELL-NEXT:    movl $7, %eax # sched: [1:0.25]
886; HASWELL-NEXT:    movl $7, %edx # sched: [1:0.25]
887; HASWELL-NEXT:    vpcmpestrm $7, %xmm1, %xmm0 # sched: [19:4.00]
888; HASWELL-NEXT:    movl $7, %eax # sched: [1:0.25]
889; HASWELL-NEXT:    movl $7, %edx # sched: [1:0.25]
890; HASWELL-NEXT:    vpcmpestrm $7, (%rdi), %xmm0 # sched: [25:4.00]
891; HASWELL-NEXT:    retq # sched: [7:1.00]
892;
893; BROADWELL-SSE-LABEL: test_pcmpestrm:
894; BROADWELL-SSE:       # %bb.0:
895; BROADWELL-SSE-NEXT:    movl $7, %eax # sched: [1:0.25]
896; BROADWELL-SSE-NEXT:    movl $7, %edx # sched: [1:0.25]
897; BROADWELL-SSE-NEXT:    pcmpestrm $7, %xmm1, %xmm0 # sched: [19:4.00]
898; BROADWELL-SSE-NEXT:    movl $7, %eax # sched: [1:0.25]
899; BROADWELL-SSE-NEXT:    movl $7, %edx # sched: [1:0.25]
900; BROADWELL-SSE-NEXT:    pcmpestrm $7, (%rdi), %xmm0 # sched: [24:4.00]
901; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
902;
903; BROADWELL-LABEL: test_pcmpestrm:
904; BROADWELL:       # %bb.0:
905; BROADWELL-NEXT:    movl $7, %eax # sched: [1:0.25]
906; BROADWELL-NEXT:    movl $7, %edx # sched: [1:0.25]
907; BROADWELL-NEXT:    vpcmpestrm $7, %xmm1, %xmm0 # sched: [19:4.00]
908; BROADWELL-NEXT:    movl $7, %eax # sched: [1:0.25]
909; BROADWELL-NEXT:    movl $7, %edx # sched: [1:0.25]
910; BROADWELL-NEXT:    vpcmpestrm $7, (%rdi), %xmm0 # sched: [24:4.00]
911; BROADWELL-NEXT:    retq # sched: [7:1.00]
912;
913; SKYLAKE-SSE-LABEL: test_pcmpestrm:
914; SKYLAKE-SSE:       # %bb.0:
915; SKYLAKE-SSE-NEXT:    movl $7, %eax # sched: [1:0.25]
916; SKYLAKE-SSE-NEXT:    movl $7, %edx # sched: [1:0.25]
917; SKYLAKE-SSE-NEXT:    pcmpestrm $7, %xmm1, %xmm0 # sched: [19:4.00]
918; SKYLAKE-SSE-NEXT:    movl $7, %eax # sched: [1:0.25]
919; SKYLAKE-SSE-NEXT:    movl $7, %edx # sched: [1:0.25]
920; SKYLAKE-SSE-NEXT:    pcmpestrm $7, (%rdi), %xmm0 # sched: [25:4.00]
921; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
922;
923; SKYLAKE-LABEL: test_pcmpestrm:
924; SKYLAKE:       # %bb.0:
925; SKYLAKE-NEXT:    movl $7, %eax # sched: [1:0.25]
926; SKYLAKE-NEXT:    movl $7, %edx # sched: [1:0.25]
927; SKYLAKE-NEXT:    vpcmpestrm $7, %xmm1, %xmm0 # sched: [19:4.00]
928; SKYLAKE-NEXT:    movl $7, %eax # sched: [1:0.25]
929; SKYLAKE-NEXT:    movl $7, %edx # sched: [1:0.25]
930; SKYLAKE-NEXT:    vpcmpestrm $7, (%rdi), %xmm0 # sched: [25:4.00]
931; SKYLAKE-NEXT:    retq # sched: [7:1.00]
932;
933; SKX-SSE-LABEL: test_pcmpestrm:
934; SKX-SSE:       # %bb.0:
935; SKX-SSE-NEXT:    movl $7, %eax # sched: [1:0.25]
936; SKX-SSE-NEXT:    movl $7, %edx # sched: [1:0.25]
937; SKX-SSE-NEXT:    pcmpestrm $7, %xmm1, %xmm0 # sched: [19:4.00]
938; SKX-SSE-NEXT:    movl $7, %eax # sched: [1:0.25]
939; SKX-SSE-NEXT:    movl $7, %edx # sched: [1:0.25]
940; SKX-SSE-NEXT:    pcmpestrm $7, (%rdi), %xmm0 # sched: [25:4.00]
941; SKX-SSE-NEXT:    retq # sched: [7:1.00]
942;
943; SKX-LABEL: test_pcmpestrm:
944; SKX:       # %bb.0:
945; SKX-NEXT:    movl $7, %eax # sched: [1:0.25]
946; SKX-NEXT:    movl $7, %edx # sched: [1:0.25]
947; SKX-NEXT:    vpcmpestrm $7, %xmm1, %xmm0 # sched: [19:4.00]
948; SKX-NEXT:    movl $7, %eax # sched: [1:0.25]
949; SKX-NEXT:    movl $7, %edx # sched: [1:0.25]
950; SKX-NEXT:    vpcmpestrm $7, (%rdi), %xmm0 # sched: [25:4.00]
951; SKX-NEXT:    retq # sched: [7:1.00]
952;
953; BTVER2-SSE-LABEL: test_pcmpestrm:
954; BTVER2-SSE:       # %bb.0:
955; BTVER2-SSE-NEXT:    movl $7, %eax # sched: [1:0.50]
956; BTVER2-SSE-NEXT:    movl $7, %edx # sched: [1:0.50]
957; BTVER2-SSE-NEXT:    pcmpestrm $7, %xmm1, %xmm0 # sched: [14:5.00]
958; BTVER2-SSE-NEXT:    movl $7, %eax # sched: [1:0.50]
959; BTVER2-SSE-NEXT:    movl $7, %edx # sched: [1:0.50]
960; BTVER2-SSE-NEXT:    pcmpestrm $7, (%rdi), %xmm0 # sched: [19:5.00]
961; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
962;
963; BTVER2-LABEL: test_pcmpestrm:
964; BTVER2:       # %bb.0:
965; BTVER2-NEXT:    movl $7, %eax # sched: [1:0.50]
966; BTVER2-NEXT:    movl $7, %edx # sched: [1:0.50]
967; BTVER2-NEXT:    vpcmpestrm $7, %xmm1, %xmm0 # sched: [14:5.00]
968; BTVER2-NEXT:    movl $7, %eax # sched: [1:0.50]
969; BTVER2-NEXT:    movl $7, %edx # sched: [1:0.50]
970; BTVER2-NEXT:    vpcmpestrm $7, (%rdi), %xmm0 # sched: [19:5.00]
971; BTVER2-NEXT:    retq # sched: [4:1.00]
972;
973; ZNVER1-SSE-LABEL: test_pcmpestrm:
974; ZNVER1-SSE:       # %bb.0:
975; ZNVER1-SSE-NEXT:    movl $7, %eax # sched: [1:0.25]
976; ZNVER1-SSE-NEXT:    movl $7, %edx # sched: [1:0.25]
977; ZNVER1-SSE-NEXT:    pcmpestrm $7, %xmm1, %xmm0 # sched: [100:0.25]
978; ZNVER1-SSE-NEXT:    movl $7, %eax # sched: [1:0.25]
979; ZNVER1-SSE-NEXT:    movl $7, %edx # sched: [1:0.25]
980; ZNVER1-SSE-NEXT:    pcmpestrm $7, (%rdi), %xmm0 # sched: [100:0.25]
981; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
982;
983; ZNVER1-LABEL: test_pcmpestrm:
984; ZNVER1:       # %bb.0:
985; ZNVER1-NEXT:    movl $7, %eax # sched: [1:0.25]
986; ZNVER1-NEXT:    movl $7, %edx # sched: [1:0.25]
987; ZNVER1-NEXT:    vpcmpestrm $7, %xmm1, %xmm0 # sched: [100:0.25]
988; ZNVER1-NEXT:    movl $7, %eax # sched: [1:0.25]
989; ZNVER1-NEXT:    movl $7, %edx # sched: [1:0.25]
990; ZNVER1-NEXT:    vpcmpestrm $7, (%rdi), %xmm0 # sched: [100:0.25]
991; ZNVER1-NEXT:    retq # sched: [1:0.50]
992  %1 = call <16 x i8> @llvm.x86.sse42.pcmpestrm128(<16 x i8> %a0, i32 7, <16 x i8> %a1, i32 7, i8 7)
993  %2 = load <16 x i8>, <16 x i8> *%a2, align 16
994  %3 = call <16 x i8> @llvm.x86.sse42.pcmpestrm128(<16 x i8> %1, i32 7, <16 x i8> %2, i32 7, i8 7)
995  ret <16 x i8> %3
996}
997declare <16 x i8> @llvm.x86.sse42.pcmpestrm128(<16 x i8>, i32, <16 x i8>, i32, i8) nounwind readnone
998
999define i32 @test_pcmpistri(<16 x i8> %a0, <16 x i8> %a1, <16 x i8> *%a2) {
1000; GENERIC-LABEL: test_pcmpistri:
1001; GENERIC:       # %bb.0:
1002; GENERIC-NEXT:    pcmpistri $7, %xmm1, %xmm0 # sched: [11:3.00]
1003; GENERIC-NEXT:    movl %ecx, %eax # sched: [1:0.33]
1004; GENERIC-NEXT:    pcmpistri $7, (%rdi), %xmm0 # sched: [17:3.00]
1005; GENERIC-NEXT:    # kill: def $ecx killed $ecx def $rcx
1006; GENERIC-NEXT:    leal (%rcx,%rax), %eax # sched: [1:0.50]
1007; GENERIC-NEXT:    retq # sched: [1:1.00]
1008;
1009; SLM-LABEL: test_pcmpistri:
1010; SLM:       # %bb.0:
1011; SLM-NEXT:    pcmpistri $7, %xmm1, %xmm0 # sched: [17:17.00]
1012; SLM-NEXT:    movl %ecx, %eax # sched: [1:0.50]
1013; SLM-NEXT:    pcmpistri $7, (%rdi), %xmm0 # sched: [17:17.00]
1014; SLM-NEXT:    # kill: def $ecx killed $ecx def $rcx
1015; SLM-NEXT:    leal (%rcx,%rax), %eax # sched: [1:1.00]
1016; SLM-NEXT:    retq # sched: [4:1.00]
1017;
1018; SANDY-SSE-LABEL: test_pcmpistri:
1019; SANDY-SSE:       # %bb.0:
1020; SANDY-SSE-NEXT:    pcmpistri $7, %xmm1, %xmm0 # sched: [11:3.00]
1021; SANDY-SSE-NEXT:    movl %ecx, %eax # sched: [1:0.33]
1022; SANDY-SSE-NEXT:    pcmpistri $7, (%rdi), %xmm0 # sched: [17:3.00]
1023; SANDY-SSE-NEXT:    # kill: def $ecx killed $ecx def $rcx
1024; SANDY-SSE-NEXT:    leal (%rcx,%rax), %eax # sched: [1:0.50]
1025; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
1026;
1027; SANDY-LABEL: test_pcmpistri:
1028; SANDY:       # %bb.0:
1029; SANDY-NEXT:    vpcmpistri $7, %xmm1, %xmm0 # sched: [11:3.00]
1030; SANDY-NEXT:    movl %ecx, %eax # sched: [1:0.33]
1031; SANDY-NEXT:    vpcmpistri $7, (%rdi), %xmm0 # sched: [17:3.00]
1032; SANDY-NEXT:    # kill: def $ecx killed $ecx def $rcx
1033; SANDY-NEXT:    leal (%rcx,%rax), %eax # sched: [1:0.50]
1034; SANDY-NEXT:    retq # sched: [1:1.00]
1035;
1036; HASWELL-SSE-LABEL: test_pcmpistri:
1037; HASWELL-SSE:       # %bb.0:
1038; HASWELL-SSE-NEXT:    pcmpistri $7, %xmm1, %xmm0 # sched: [11:3.00]
1039; HASWELL-SSE-NEXT:    movl %ecx, %eax # sched: [1:0.25]
1040; HASWELL-SSE-NEXT:    pcmpistri $7, (%rdi), %xmm0 # sched: [17:3.00]
1041; HASWELL-SSE-NEXT:    # kill: def $ecx killed $ecx def $rcx
1042; HASWELL-SSE-NEXT:    leal (%rcx,%rax), %eax # sched: [1:0.50]
1043; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
1044;
1045; HASWELL-LABEL: test_pcmpistri:
1046; HASWELL:       # %bb.0:
1047; HASWELL-NEXT:    vpcmpistri $7, %xmm1, %xmm0 # sched: [11:3.00]
1048; HASWELL-NEXT:    movl %ecx, %eax # sched: [1:0.25]
1049; HASWELL-NEXT:    vpcmpistri $7, (%rdi), %xmm0 # sched: [17:3.00]
1050; HASWELL-NEXT:    # kill: def $ecx killed $ecx def $rcx
1051; HASWELL-NEXT:    leal (%rcx,%rax), %eax # sched: [1:0.50]
1052; HASWELL-NEXT:    retq # sched: [7:1.00]
1053;
1054; BROADWELL-SSE-LABEL: test_pcmpistri:
1055; BROADWELL-SSE:       # %bb.0:
1056; BROADWELL-SSE-NEXT:    pcmpistri $7, %xmm1, %xmm0 # sched: [11:3.00]
1057; BROADWELL-SSE-NEXT:    movl %ecx, %eax # sched: [1:0.25]
1058; BROADWELL-SSE-NEXT:    pcmpistri $7, (%rdi), %xmm0 # sched: [16:3.00]
1059; BROADWELL-SSE-NEXT:    # kill: def $ecx killed $ecx def $rcx
1060; BROADWELL-SSE-NEXT:    leal (%rcx,%rax), %eax # sched: [1:0.50]
1061; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
1062;
1063; BROADWELL-LABEL: test_pcmpistri:
1064; BROADWELL:       # %bb.0:
1065; BROADWELL-NEXT:    vpcmpistri $7, %xmm1, %xmm0 # sched: [11:3.00]
1066; BROADWELL-NEXT:    movl %ecx, %eax # sched: [1:0.25]
1067; BROADWELL-NEXT:    vpcmpistri $7, (%rdi), %xmm0 # sched: [16:3.00]
1068; BROADWELL-NEXT:    # kill: def $ecx killed $ecx def $rcx
1069; BROADWELL-NEXT:    leal (%rcx,%rax), %eax # sched: [1:0.50]
1070; BROADWELL-NEXT:    retq # sched: [7:1.00]
1071;
1072; SKYLAKE-SSE-LABEL: test_pcmpistri:
1073; SKYLAKE-SSE:       # %bb.0:
1074; SKYLAKE-SSE-NEXT:    pcmpistri $7, %xmm1, %xmm0 # sched: [10:3.00]
1075; SKYLAKE-SSE-NEXT:    movl %ecx, %eax # sched: [1:0.25]
1076; SKYLAKE-SSE-NEXT:    pcmpistri $7, (%rdi), %xmm0 # sched: [16:3.00]
1077; SKYLAKE-SSE-NEXT:    # kill: def $ecx killed $ecx def $rcx
1078; SKYLAKE-SSE-NEXT:    leal (%rcx,%rax), %eax # sched: [1:0.50]
1079; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
1080;
1081; SKYLAKE-LABEL: test_pcmpistri:
1082; SKYLAKE:       # %bb.0:
1083; SKYLAKE-NEXT:    vpcmpistri $7, %xmm1, %xmm0 # sched: [10:3.00]
1084; SKYLAKE-NEXT:    movl %ecx, %eax # sched: [1:0.25]
1085; SKYLAKE-NEXT:    vpcmpistri $7, (%rdi), %xmm0 # sched: [16:3.00]
1086; SKYLAKE-NEXT:    # kill: def $ecx killed $ecx def $rcx
1087; SKYLAKE-NEXT:    leal (%rcx,%rax), %eax # sched: [1:0.50]
1088; SKYLAKE-NEXT:    retq # sched: [7:1.00]
1089;
1090; SKX-SSE-LABEL: test_pcmpistri:
1091; SKX-SSE:       # %bb.0:
1092; SKX-SSE-NEXT:    pcmpistri $7, %xmm1, %xmm0 # sched: [10:3.00]
1093; SKX-SSE-NEXT:    movl %ecx, %eax # sched: [1:0.25]
1094; SKX-SSE-NEXT:    pcmpistri $7, (%rdi), %xmm0 # sched: [16:3.00]
1095; SKX-SSE-NEXT:    # kill: def $ecx killed $ecx def $rcx
1096; SKX-SSE-NEXT:    leal (%rcx,%rax), %eax # sched: [1:0.50]
1097; SKX-SSE-NEXT:    retq # sched: [7:1.00]
1098;
1099; SKX-LABEL: test_pcmpistri:
1100; SKX:       # %bb.0:
1101; SKX-NEXT:    vpcmpistri $7, %xmm1, %xmm0 # sched: [10:3.00]
1102; SKX-NEXT:    movl %ecx, %eax # sched: [1:0.25]
1103; SKX-NEXT:    vpcmpistri $7, (%rdi), %xmm0 # sched: [16:3.00]
1104; SKX-NEXT:    # kill: def $ecx killed $ecx def $rcx
1105; SKX-NEXT:    leal (%rcx,%rax), %eax # sched: [1:0.50]
1106; SKX-NEXT:    retq # sched: [7:1.00]
1107;
1108; BTVER2-SSE-LABEL: test_pcmpistri:
1109; BTVER2-SSE:       # %bb.0:
1110; BTVER2-SSE-NEXT:    pcmpistri $7, %xmm1, %xmm0 # sched: [7:2.00]
1111; BTVER2-SSE-NEXT:    movl %ecx, %eax # sched: [1:0.50]
1112; BTVER2-SSE-NEXT:    pcmpistri $7, (%rdi), %xmm0 # sched: [12:2.00]
1113; BTVER2-SSE-NEXT:    # kill: def $ecx killed $ecx def $rcx
1114; BTVER2-SSE-NEXT:    leal (%rcx,%rax), %eax # sched: [1:0.50]
1115; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
1116;
1117; BTVER2-LABEL: test_pcmpistri:
1118; BTVER2:       # %bb.0:
1119; BTVER2-NEXT:    vpcmpistri $7, %xmm1, %xmm0 # sched: [7:2.00]
1120; BTVER2-NEXT:    movl %ecx, %eax # sched: [1:0.50]
1121; BTVER2-NEXT:    vpcmpistri $7, (%rdi), %xmm0 # sched: [12:2.00]
1122; BTVER2-NEXT:    # kill: def $ecx killed $ecx def $rcx
1123; BTVER2-NEXT:    leal (%rcx,%rax), %eax # sched: [1:0.50]
1124; BTVER2-NEXT:    retq # sched: [4:1.00]
1125;
1126; ZNVER1-SSE-LABEL: test_pcmpistri:
1127; ZNVER1-SSE:       # %bb.0:
1128; ZNVER1-SSE-NEXT:    pcmpistri $7, %xmm1, %xmm0 # sched: [100:0.25]
1129; ZNVER1-SSE-NEXT:    movl %ecx, %eax # sched: [1:0.25]
1130; ZNVER1-SSE-NEXT:    pcmpistri $7, (%rdi), %xmm0 # sched: [100:0.25]
1131; ZNVER1-SSE-NEXT:    # kill: def $ecx killed $ecx def $rcx
1132; ZNVER1-SSE-NEXT:    leal (%rcx,%rax), %eax # sched: [1:0.25]
1133; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
1134;
1135; ZNVER1-LABEL: test_pcmpistri:
1136; ZNVER1:       # %bb.0:
1137; ZNVER1-NEXT:    vpcmpistri $7, %xmm1, %xmm0 # sched: [100:0.25]
1138; ZNVER1-NEXT:    movl %ecx, %eax # sched: [1:0.25]
1139; ZNVER1-NEXT:    vpcmpistri $7, (%rdi), %xmm0 # sched: [100:0.25]
1140; ZNVER1-NEXT:    # kill: def $ecx killed $ecx def $rcx
1141; ZNVER1-NEXT:    leal (%rcx,%rax), %eax # sched: [1:0.25]
1142; ZNVER1-NEXT:    retq # sched: [1:0.50]
1143  %1 = call i32 @llvm.x86.sse42.pcmpistri128(<16 x i8> %a0, <16 x i8> %a1, i8 7)
1144  %2 = load <16 x i8>, <16 x i8> *%a2, align 16
1145  %3 = call i32 @llvm.x86.sse42.pcmpistri128(<16 x i8> %a0, <16 x i8> %2, i8 7)
1146  %4 = add i32 %1, %3
1147  ret i32 %4
1148}
1149declare i32 @llvm.x86.sse42.pcmpistri128(<16 x i8>, <16 x i8>, i8) nounwind readnone
1150
1151define <16 x i8> @test_pcmpistrm(<16 x i8> %a0, <16 x i8> %a1, <16 x i8> *%a2) {
1152; GENERIC-LABEL: test_pcmpistrm:
1153; GENERIC:       # %bb.0:
1154; GENERIC-NEXT:    pcmpistrm $7, %xmm1, %xmm0 # sched: [11:3.00]
1155; GENERIC-NEXT:    pcmpistrm $7, (%rdi), %xmm0 # sched: [17:3.00]
1156; GENERIC-NEXT:    retq # sched: [1:1.00]
1157;
1158; SLM-LABEL: test_pcmpistrm:
1159; SLM:       # %bb.0:
1160; SLM-NEXT:    pcmpistrm $7, %xmm1, %xmm0 # sched: [13:13.00]
1161; SLM-NEXT:    pcmpistrm $7, (%rdi), %xmm0 # sched: [13:13.00]
1162; SLM-NEXT:    retq # sched: [4:1.00]
1163;
1164; SANDY-SSE-LABEL: test_pcmpistrm:
1165; SANDY-SSE:       # %bb.0:
1166; SANDY-SSE-NEXT:    pcmpistrm $7, %xmm1, %xmm0 # sched: [11:3.00]
1167; SANDY-SSE-NEXT:    pcmpistrm $7, (%rdi), %xmm0 # sched: [17:3.00]
1168; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
1169;
1170; SANDY-LABEL: test_pcmpistrm:
1171; SANDY:       # %bb.0:
1172; SANDY-NEXT:    vpcmpistrm $7, %xmm1, %xmm0 # sched: [11:3.00]
1173; SANDY-NEXT:    vpcmpistrm $7, (%rdi), %xmm0 # sched: [17:3.00]
1174; SANDY-NEXT:    retq # sched: [1:1.00]
1175;
1176; HASWELL-SSE-LABEL: test_pcmpistrm:
1177; HASWELL-SSE:       # %bb.0:
1178; HASWELL-SSE-NEXT:    pcmpistrm $7, %xmm1, %xmm0 # sched: [11:3.00]
1179; HASWELL-SSE-NEXT:    pcmpistrm $7, (%rdi), %xmm0 # sched: [17:3.00]
1180; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
1181;
1182; HASWELL-LABEL: test_pcmpistrm:
1183; HASWELL:       # %bb.0:
1184; HASWELL-NEXT:    vpcmpistrm $7, %xmm1, %xmm0 # sched: [11:3.00]
1185; HASWELL-NEXT:    vpcmpistrm $7, (%rdi), %xmm0 # sched: [17:3.00]
1186; HASWELL-NEXT:    retq # sched: [7:1.00]
1187;
1188; BROADWELL-SSE-LABEL: test_pcmpistrm:
1189; BROADWELL-SSE:       # %bb.0:
1190; BROADWELL-SSE-NEXT:    pcmpistrm $7, %xmm1, %xmm0 # sched: [11:3.00]
1191; BROADWELL-SSE-NEXT:    pcmpistrm $7, (%rdi), %xmm0 # sched: [16:3.00]
1192; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
1193;
1194; BROADWELL-LABEL: test_pcmpistrm:
1195; BROADWELL:       # %bb.0:
1196; BROADWELL-NEXT:    vpcmpistrm $7, %xmm1, %xmm0 # sched: [11:3.00]
1197; BROADWELL-NEXT:    vpcmpistrm $7, (%rdi), %xmm0 # sched: [16:3.00]
1198; BROADWELL-NEXT:    retq # sched: [7:1.00]
1199;
1200; SKYLAKE-SSE-LABEL: test_pcmpistrm:
1201; SKYLAKE-SSE:       # %bb.0:
1202; SKYLAKE-SSE-NEXT:    pcmpistrm $7, %xmm1, %xmm0 # sched: [10:3.00]
1203; SKYLAKE-SSE-NEXT:    pcmpistrm $7, (%rdi), %xmm0 # sched: [16:3.00]
1204; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
1205;
1206; SKYLAKE-LABEL: test_pcmpistrm:
1207; SKYLAKE:       # %bb.0:
1208; SKYLAKE-NEXT:    vpcmpistrm $7, %xmm1, %xmm0 # sched: [10:3.00]
1209; SKYLAKE-NEXT:    vpcmpistrm $7, (%rdi), %xmm0 # sched: [16:3.00]
1210; SKYLAKE-NEXT:    retq # sched: [7:1.00]
1211;
1212; SKX-SSE-LABEL: test_pcmpistrm:
1213; SKX-SSE:       # %bb.0:
1214; SKX-SSE-NEXT:    pcmpistrm $7, %xmm1, %xmm0 # sched: [10:3.00]
1215; SKX-SSE-NEXT:    pcmpistrm $7, (%rdi), %xmm0 # sched: [16:3.00]
1216; SKX-SSE-NEXT:    retq # sched: [7:1.00]
1217;
1218; SKX-LABEL: test_pcmpistrm:
1219; SKX:       # %bb.0:
1220; SKX-NEXT:    vpcmpistrm $7, %xmm1, %xmm0 # sched: [10:3.00]
1221; SKX-NEXT:    vpcmpistrm $7, (%rdi), %xmm0 # sched: [16:3.00]
1222; SKX-NEXT:    retq # sched: [7:1.00]
1223;
1224; BTVER2-SSE-LABEL: test_pcmpistrm:
1225; BTVER2-SSE:       # %bb.0:
1226; BTVER2-SSE-NEXT:    pcmpistrm $7, %xmm1, %xmm0 # sched: [8:2.00]
1227; BTVER2-SSE-NEXT:    pcmpistrm $7, (%rdi), %xmm0 # sched: [13:2.00]
1228; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
1229;
1230; BTVER2-LABEL: test_pcmpistrm:
1231; BTVER2:       # %bb.0:
1232; BTVER2-NEXT:    vpcmpistrm $7, %xmm1, %xmm0 # sched: [8:2.00]
1233; BTVER2-NEXT:    vpcmpistrm $7, (%rdi), %xmm0 # sched: [13:2.00]
1234; BTVER2-NEXT:    retq # sched: [4:1.00]
1235;
1236; ZNVER1-SSE-LABEL: test_pcmpistrm:
1237; ZNVER1-SSE:       # %bb.0:
1238; ZNVER1-SSE-NEXT:    pcmpistrm $7, %xmm1, %xmm0 # sched: [100:0.25]
1239; ZNVER1-SSE-NEXT:    pcmpistrm $7, (%rdi), %xmm0 # sched: [100:0.25]
1240; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
1241;
1242; ZNVER1-LABEL: test_pcmpistrm:
1243; ZNVER1:       # %bb.0:
1244; ZNVER1-NEXT:    vpcmpistrm $7, %xmm1, %xmm0 # sched: [100:0.25]
1245; ZNVER1-NEXT:    vpcmpistrm $7, (%rdi), %xmm0 # sched: [100:0.25]
1246; ZNVER1-NEXT:    retq # sched: [1:0.50]
1247  %1 = call <16 x i8> @llvm.x86.sse42.pcmpistrm128(<16 x i8> %a0, <16 x i8> %a1, i8 7)
1248  %2 = load <16 x i8>, <16 x i8> *%a2, align 16
1249  %3 = call <16 x i8> @llvm.x86.sse42.pcmpistrm128(<16 x i8> %1, <16 x i8> %2, i8 7)
1250  ret <16 x i8> %3
1251}
1252declare <16 x i8> @llvm.x86.sse42.pcmpistrm128(<16 x i8>, <16 x i8>, i8) nounwind readnone
1253
1254define <2 x i64> @test_pcmpgtq(<2 x i64> %a0, <2 x i64> %a1, <2 x i64> *%a2) {
1255; GENERIC-LABEL: test_pcmpgtq:
1256; GENERIC:       # %bb.0:
1257; GENERIC-NEXT:    pcmpgtq %xmm1, %xmm0 # sched: [5:1.00]
1258; GENERIC-NEXT:    pcmpgtq (%rdi), %xmm0 # sched: [11:1.00]
1259; GENERIC-NEXT:    retq # sched: [1:1.00]
1260;
1261; SLM-LABEL: test_pcmpgtq:
1262; SLM:       # %bb.0:
1263; SLM-NEXT:    pcmpgtq %xmm1, %xmm0 # sched: [1:0.50]
1264; SLM-NEXT:    pcmpgtq (%rdi), %xmm0 # sched: [4:1.00]
1265; SLM-NEXT:    retq # sched: [4:1.00]
1266;
1267; SANDY-SSE-LABEL: test_pcmpgtq:
1268; SANDY-SSE:       # %bb.0:
1269; SANDY-SSE-NEXT:    pcmpgtq %xmm1, %xmm0 # sched: [5:1.00]
1270; SANDY-SSE-NEXT:    pcmpgtq (%rdi), %xmm0 # sched: [11:1.00]
1271; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
1272;
1273; SANDY-LABEL: test_pcmpgtq:
1274; SANDY:       # %bb.0:
1275; SANDY-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0 # sched: [5:1.00]
1276; SANDY-NEXT:    vpcmpgtq (%rdi), %xmm0, %xmm0 # sched: [11:1.00]
1277; SANDY-NEXT:    retq # sched: [1:1.00]
1278;
1279; HASWELL-SSE-LABEL: test_pcmpgtq:
1280; HASWELL-SSE:       # %bb.0:
1281; HASWELL-SSE-NEXT:    pcmpgtq %xmm1, %xmm0 # sched: [5:1.00]
1282; HASWELL-SSE-NEXT:    pcmpgtq (%rdi), %xmm0 # sched: [11:1.00]
1283; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
1284;
1285; HASWELL-LABEL: test_pcmpgtq:
1286; HASWELL:       # %bb.0:
1287; HASWELL-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0 # sched: [5:1.00]
1288; HASWELL-NEXT:    vpcmpgtq (%rdi), %xmm0, %xmm0 # sched: [11:1.00]
1289; HASWELL-NEXT:    retq # sched: [7:1.00]
1290;
1291; BROADWELL-SSE-LABEL: test_pcmpgtq:
1292; BROADWELL-SSE:       # %bb.0:
1293; BROADWELL-SSE-NEXT:    pcmpgtq %xmm1, %xmm0 # sched: [5:1.00]
1294; BROADWELL-SSE-NEXT:    pcmpgtq (%rdi), %xmm0 # sched: [10:1.00]
1295; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
1296;
1297; BROADWELL-LABEL: test_pcmpgtq:
1298; BROADWELL:       # %bb.0:
1299; BROADWELL-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0 # sched: [5:1.00]
1300; BROADWELL-NEXT:    vpcmpgtq (%rdi), %xmm0, %xmm0 # sched: [10:1.00]
1301; BROADWELL-NEXT:    retq # sched: [7:1.00]
1302;
1303; SKYLAKE-SSE-LABEL: test_pcmpgtq:
1304; SKYLAKE-SSE:       # %bb.0:
1305; SKYLAKE-SSE-NEXT:    pcmpgtq %xmm1, %xmm0 # sched: [3:1.00]
1306; SKYLAKE-SSE-NEXT:    pcmpgtq (%rdi), %xmm0 # sched: [9:1.00]
1307; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
1308;
1309; SKYLAKE-LABEL: test_pcmpgtq:
1310; SKYLAKE:       # %bb.0:
1311; SKYLAKE-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
1312; SKYLAKE-NEXT:    vpcmpgtq (%rdi), %xmm0, %xmm0 # sched: [9:1.00]
1313; SKYLAKE-NEXT:    retq # sched: [7:1.00]
1314;
1315; SKX-SSE-LABEL: test_pcmpgtq:
1316; SKX-SSE:       # %bb.0:
1317; SKX-SSE-NEXT:    pcmpgtq %xmm1, %xmm0 # sched: [3:1.00]
1318; SKX-SSE-NEXT:    pcmpgtq (%rdi), %xmm0 # sched: [9:1.00]
1319; SKX-SSE-NEXT:    retq # sched: [7:1.00]
1320;
1321; SKX-LABEL: test_pcmpgtq:
1322; SKX:       # %bb.0:
1323; SKX-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0 # sched: [3:1.00]
1324; SKX-NEXT:    vpcmpgtq (%rdi), %xmm0, %xmm0 # sched: [9:1.00]
1325; SKX-NEXT:    retq # sched: [7:1.00]
1326;
1327; BTVER2-SSE-LABEL: test_pcmpgtq:
1328; BTVER2-SSE:       # %bb.0:
1329; BTVER2-SSE-NEXT:    pcmpgtq %xmm1, %xmm0 # sched: [1:0.50]
1330; BTVER2-SSE-NEXT:    pcmpgtq (%rdi), %xmm0 # sched: [6:1.00]
1331; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
1332;
1333; BTVER2-LABEL: test_pcmpgtq:
1334; BTVER2:       # %bb.0:
1335; BTVER2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
1336; BTVER2-NEXT:    vpcmpgtq (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
1337; BTVER2-NEXT:    retq # sched: [4:1.00]
1338;
1339; ZNVER1-SSE-LABEL: test_pcmpgtq:
1340; ZNVER1-SSE:       # %bb.0:
1341; ZNVER1-SSE-NEXT:    pcmpgtq %xmm1, %xmm0 # sched: [1:0.50]
1342; ZNVER1-SSE-NEXT:    pcmpgtq (%rdi), %xmm0 # sched: [8:0.50]
1343; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
1344;
1345; ZNVER1-LABEL: test_pcmpgtq:
1346; ZNVER1:       # %bb.0:
1347; ZNVER1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
1348; ZNVER1-NEXT:    vpcmpgtq (%rdi), %xmm0, %xmm0 # sched: [8:0.50]
1349; ZNVER1-NEXT:    retq # sched: [1:0.50]
1350  %1 = icmp sgt <2 x i64> %a0, %a1
1351  %2 = sext <2 x i1> %1 to <2 x i64>
1352  %3 = load <2 x i64>, <2 x i64>*%a2, align 16
1353  %4 = icmp sgt <2 x i64> %2, %3
1354  %5 = sext <2 x i1> %4 to <2 x i64>
1355  ret <2 x i64> %5
1356}
1357
1358define <2 x i64> @test_pclmulqdq(<2 x i64> %a0, <2 x i64> %a1, <2 x i64> *%a2) {
1359; GENERIC-LABEL: test_pclmulqdq:
1360; GENERIC:       # %bb.0:
1361; GENERIC-NEXT:    pclmulqdq $0, %xmm1, %xmm0 # sched: [14:6.00]
1362; GENERIC-NEXT:    pclmulqdq $0, (%rdi), %xmm0 # sched: [14:5.67]
1363; GENERIC-NEXT:    retq # sched: [1:1.00]
1364;
1365; SLM-LABEL: test_pclmulqdq:
1366; SLM:       # %bb.0:
1367; SLM-NEXT:    pclmulqdq $0, %xmm1, %xmm0 # sched: [10:10.00]
1368; SLM-NEXT:    pclmulqdq $0, (%rdi), %xmm0 # sched: [10:10.00]
1369; SLM-NEXT:    retq # sched: [4:1.00]
1370;
1371; SANDY-SSE-LABEL: test_pclmulqdq:
1372; SANDY-SSE:       # %bb.0:
1373; SANDY-SSE-NEXT:    pclmulqdq $0, %xmm1, %xmm0 # sched: [14:6.00]
1374; SANDY-SSE-NEXT:    pclmulqdq $0, (%rdi), %xmm0 # sched: [14:5.67]
1375; SANDY-SSE-NEXT:    retq # sched: [1:1.00]
1376;
1377; SANDY-LABEL: test_pclmulqdq:
1378; SANDY:       # %bb.0:
1379; SANDY-NEXT:    vpclmulqdq $0, %xmm1, %xmm0, %xmm0 # sched: [14:6.00]
1380; SANDY-NEXT:    vpclmulqdq $0, (%rdi), %xmm0, %xmm0 # sched: [14:5.67]
1381; SANDY-NEXT:    retq # sched: [1:1.00]
1382;
1383; HASWELL-SSE-LABEL: test_pclmulqdq:
1384; HASWELL-SSE:       # %bb.0:
1385; HASWELL-SSE-NEXT:    pclmulqdq $0, %xmm1, %xmm0 # sched: [11:2.00]
1386; HASWELL-SSE-NEXT:    pclmulqdq $0, (%rdi), %xmm0 # sched: [17:2.00]
1387; HASWELL-SSE-NEXT:    retq # sched: [7:1.00]
1388;
1389; HASWELL-LABEL: test_pclmulqdq:
1390; HASWELL:       # %bb.0:
1391; HASWELL-NEXT:    vpclmulqdq $0, %xmm1, %xmm0, %xmm0 # sched: [11:2.00]
1392; HASWELL-NEXT:    vpclmulqdq $0, (%rdi), %xmm0, %xmm0 # sched: [17:2.00]
1393; HASWELL-NEXT:    retq # sched: [7:1.00]
1394;
1395; BROADWELL-SSE-LABEL: test_pclmulqdq:
1396; BROADWELL-SSE:       # %bb.0:
1397; BROADWELL-SSE-NEXT:    pclmulqdq $0, %xmm1, %xmm0 # sched: [5:1.00]
1398; BROADWELL-SSE-NEXT:    pclmulqdq $0, (%rdi), %xmm0 # sched: [10:1.00]
1399; BROADWELL-SSE-NEXT:    retq # sched: [7:1.00]
1400;
1401; BROADWELL-LABEL: test_pclmulqdq:
1402; BROADWELL:       # %bb.0:
1403; BROADWELL-NEXT:    vpclmulqdq $0, %xmm1, %xmm0, %xmm0 # sched: [5:1.00]
1404; BROADWELL-NEXT:    vpclmulqdq $0, (%rdi), %xmm0, %xmm0 # sched: [10:1.00]
1405; BROADWELL-NEXT:    retq # sched: [7:1.00]
1406;
1407; SKYLAKE-SSE-LABEL: test_pclmulqdq:
1408; SKYLAKE-SSE:       # %bb.0:
1409; SKYLAKE-SSE-NEXT:    pclmulqdq $0, %xmm1, %xmm0 # sched: [6:1.00]
1410; SKYLAKE-SSE-NEXT:    pclmulqdq $0, (%rdi), %xmm0 # sched: [12:1.00]
1411; SKYLAKE-SSE-NEXT:    retq # sched: [7:1.00]
1412;
1413; SKYLAKE-LABEL: test_pclmulqdq:
1414; SKYLAKE:       # %bb.0:
1415; SKYLAKE-NEXT:    vpclmulqdq $0, %xmm1, %xmm0, %xmm0 # sched: [6:1.00]
1416; SKYLAKE-NEXT:    vpclmulqdq $0, (%rdi), %xmm0, %xmm0 # sched: [12:1.00]
1417; SKYLAKE-NEXT:    retq # sched: [7:1.00]
1418;
1419; SKX-SSE-LABEL: test_pclmulqdq:
1420; SKX-SSE:       # %bb.0:
1421; SKX-SSE-NEXT:    pclmulqdq $0, %xmm1, %xmm0 # sched: [6:1.00]
1422; SKX-SSE-NEXT:    pclmulqdq $0, (%rdi), %xmm0 # sched: [12:1.00]
1423; SKX-SSE-NEXT:    retq # sched: [7:1.00]
1424;
1425; SKX-LABEL: test_pclmulqdq:
1426; SKX:       # %bb.0:
1427; SKX-NEXT:    vpclmulqdq $0, %xmm1, %xmm0, %xmm0 # sched: [6:1.00]
1428; SKX-NEXT:    vpclmulqdq $0, (%rdi), %xmm0, %xmm0 # sched: [12:1.00]
1429; SKX-NEXT:    retq # sched: [7:1.00]
1430;
1431; BTVER2-SSE-LABEL: test_pclmulqdq:
1432; BTVER2-SSE:       # %bb.0:
1433; BTVER2-SSE-NEXT:    pclmulqdq $0, %xmm1, %xmm0 # sched: [2:1.00]
1434; BTVER2-SSE-NEXT:    pclmulqdq $0, (%rdi), %xmm0 # sched: [7:1.00]
1435; BTVER2-SSE-NEXT:    retq # sched: [4:1.00]
1436;
1437; BTVER2-LABEL: test_pclmulqdq:
1438; BTVER2:       # %bb.0:
1439; BTVER2-NEXT:    vpclmulqdq $0, %xmm1, %xmm0, %xmm0 # sched: [2:1.00]
1440; BTVER2-NEXT:    vpclmulqdq $0, (%rdi), %xmm0, %xmm0 # sched: [7:1.00]
1441; BTVER2-NEXT:    retq # sched: [4:1.00]
1442;
1443; ZNVER1-SSE-LABEL: test_pclmulqdq:
1444; ZNVER1-SSE:       # %bb.0:
1445; ZNVER1-SSE-NEXT:    pclmulqdq $0, %xmm1, %xmm0 # sched: [100:0.25]
1446; ZNVER1-SSE-NEXT:    pclmulqdq $0, (%rdi), %xmm0 # sched: [100:0.25]
1447; ZNVER1-SSE-NEXT:    retq # sched: [1:0.50]
1448;
1449; ZNVER1-LABEL: test_pclmulqdq:
1450; ZNVER1:       # %bb.0:
1451; ZNVER1-NEXT:    vpclmulqdq $0, %xmm1, %xmm0, %xmm0 # sched: [100:0.25]
1452; ZNVER1-NEXT:    vpclmulqdq $0, (%rdi), %xmm0, %xmm0 # sched: [100:0.25]
1453; ZNVER1-NEXT:    retq # sched: [1:0.50]
1454  %1 = load <2 x i64>, <2 x i64> *%a2, align 16
1455  %2 = call <2 x i64> @llvm.x86.pclmulqdq(<2 x i64> %a0, <2 x i64> %a1, i8 0)
1456  %3 = call <2 x i64> @llvm.x86.pclmulqdq(<2 x i64> %1, <2 x i64> %2, i8 0)
1457  ret <2 x i64> %3
1458}
1459declare <2 x i64> @llvm.x86.pclmulqdq(<2 x i64>, <2 x i64>, i8)
1460