blob: adf857e12179715a9b389f00157c6b9d355e33cb [file] [log] [blame]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +00001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mattr=+sse4.2 | FileCheck %s --check-prefix=CHECK --check-prefix=GENERIC
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=slm | FileCheck %s --check-prefix=CHECK --check-prefix=SLM
4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=sandybridge | FileCheck %s --check-prefix=CHECK --check-prefix=SANDY
5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=ivybridge | FileCheck %s --check-prefix=CHECK --check-prefix=SANDY
6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=haswell | FileCheck %s --check-prefix=CHECK --check-prefix=HASWELL
7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=skylake | FileCheck %s --check-prefix=CHECK --check-prefix=HASWELL
8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=btver2 | FileCheck %s --check-prefix=CHECK --check-prefix=BTVER2
Craig Topper106b5b62017-07-19 02:45:14 +00009; RUN: llc < %s -mtriple=x86_64-unknown-unknown -print-schedule -mcpu=znver1 | FileCheck %s --check-prefix=CHECK --check-prefix=ZNVER1
Simon Pilgrim7d71ed52017-04-23 21:00:25 +000010
11define i32 @crc32_32_8(i32 %a0, i8 %a1, i8 *%a2) {
12; GENERIC-LABEL: crc32_32_8:
13; GENERIC: # BB#0:
14; GENERIC-NEXT: crc32b %sil, %edi
15; GENERIC-NEXT: crc32b (%rdx), %edi
16; GENERIC-NEXT: movl %edi, %eax
17; GENERIC-NEXT: retq
18;
19; SLM-LABEL: crc32_32_8:
20; SLM: # BB#0:
21; SLM-NEXT: crc32b %sil, %edi # sched: [3:1.00]
22; SLM-NEXT: crc32b (%rdx), %edi # sched: [6:1.00]
23; SLM-NEXT: movl %edi, %eax # sched: [1:0.50]
24; SLM-NEXT: retq # sched: [4:1.00]
25;
26; SANDY-LABEL: crc32_32_8:
27; SANDY: # BB#0:
28; SANDY-NEXT: crc32b %sil, %edi # sched: [3:1.00]
Gadi Haberf4d154c2017-07-10 09:53:16 +000029; SANDY-NEXT: crc32b (%rdx), %edi # sched: [8:1.00]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +000030; SANDY-NEXT: movl %edi, %eax # sched: [1:0.33]
Gadi Haberf4d154c2017-07-10 09:53:16 +000031; SANDY-NEXT: retq # sched: [1:1.00]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +000032;
33; HASWELL-LABEL: crc32_32_8:
34; HASWELL: # BB#0:
35; HASWELL-NEXT: crc32b %sil, %edi # sched: [3:1.00]
36; HASWELL-NEXT: crc32b (%rdx), %edi # sched: [7:1.00]
37; HASWELL-NEXT: movl %edi, %eax # sched: [1:0.25]
Michael Zuckermanf6684002017-06-28 11:23:31 +000038; HASWELL-NEXT: retq # sched: [1:1.00]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +000039;
40; BTVER2-LABEL: crc32_32_8:
41; BTVER2: # BB#0:
42; BTVER2-NEXT: crc32b %sil, %edi # sched: [3:1.00]
43; BTVER2-NEXT: crc32b (%rdx), %edi # sched: [8:1.00]
44; BTVER2-NEXT: movl %edi, %eax # sched: [1:0.17]
45; BTVER2-NEXT: retq # sched: [4:1.00]
Craig Topper106b5b62017-07-19 02:45:14 +000046;
47; ZNVER1-LABEL: crc32_32_8:
48; ZNVER1: # BB#0:
49; ZNVER1-NEXT: crc32b %sil, %edi # sched: [3:1.00]
50; ZNVER1-NEXT: crc32b (%rdx), %edi # sched: [10:1.00]
51; ZNVER1-NEXT: movl %edi, %eax # sched: [1:0.25]
52; ZNVER1-NEXT: retq # sched: [5:0.50]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +000053 %1 = call i32 @llvm.x86.sse42.crc32.32.8(i32 %a0, i8 %a1)
54 %2 = load i8, i8 *%a2
55 %3 = call i32 @llvm.x86.sse42.crc32.32.8(i32 %1, i8 %2)
56 ret i32 %3
57}
58declare i32 @llvm.x86.sse42.crc32.32.8(i32, i8) nounwind
59
60define i32 @crc32_32_16(i32 %a0, i16 %a1, i16 *%a2) {
61; GENERIC-LABEL: crc32_32_16:
62; GENERIC: # BB#0:
63; GENERIC-NEXT: crc32w %si, %edi
64; GENERIC-NEXT: crc32w (%rdx), %edi
65; GENERIC-NEXT: movl %edi, %eax
66; GENERIC-NEXT: retq
67;
68; SLM-LABEL: crc32_32_16:
69; SLM: # BB#0:
70; SLM-NEXT: crc32w %si, %edi # sched: [3:1.00]
71; SLM-NEXT: crc32w (%rdx), %edi # sched: [6:1.00]
72; SLM-NEXT: movl %edi, %eax # sched: [1:0.50]
73; SLM-NEXT: retq # sched: [4:1.00]
74;
75; SANDY-LABEL: crc32_32_16:
76; SANDY: # BB#0:
77; SANDY-NEXT: crc32w %si, %edi # sched: [3:1.00]
Gadi Haberf4d154c2017-07-10 09:53:16 +000078; SANDY-NEXT: crc32w (%rdx), %edi # sched: [8:1.00]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +000079; SANDY-NEXT: movl %edi, %eax # sched: [1:0.33]
Gadi Haberf4d154c2017-07-10 09:53:16 +000080; SANDY-NEXT: retq # sched: [1:1.00]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +000081;
82; HASWELL-LABEL: crc32_32_16:
83; HASWELL: # BB#0:
84; HASWELL-NEXT: crc32w %si, %edi # sched: [3:1.00]
85; HASWELL-NEXT: crc32w (%rdx), %edi # sched: [7:1.00]
86; HASWELL-NEXT: movl %edi, %eax # sched: [1:0.25]
Michael Zuckermanf6684002017-06-28 11:23:31 +000087; HASWELL-NEXT: retq # sched: [1:1.00]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +000088;
89; BTVER2-LABEL: crc32_32_16:
90; BTVER2: # BB#0:
91; BTVER2-NEXT: crc32w %si, %edi # sched: [3:1.00]
92; BTVER2-NEXT: crc32w (%rdx), %edi # sched: [8:1.00]
93; BTVER2-NEXT: movl %edi, %eax # sched: [1:0.17]
94; BTVER2-NEXT: retq # sched: [4:1.00]
Craig Topper106b5b62017-07-19 02:45:14 +000095;
96; ZNVER1-LABEL: crc32_32_16:
97; ZNVER1: # BB#0:
98; ZNVER1-NEXT: crc32w %si, %edi # sched: [3:1.00]
99; ZNVER1-NEXT: crc32w (%rdx), %edi # sched: [10:1.00]
100; ZNVER1-NEXT: movl %edi, %eax # sched: [1:0.25]
101; ZNVER1-NEXT: retq # sched: [5:0.50]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +0000102 %1 = call i32 @llvm.x86.sse42.crc32.32.16(i32 %a0, i16 %a1)
103 %2 = load i16, i16 *%a2
104 %3 = call i32 @llvm.x86.sse42.crc32.32.16(i32 %1, i16 %2)
105 ret i32 %3
106}
107declare i32 @llvm.x86.sse42.crc32.32.16(i32, i16) nounwind
108
109define i32 @crc32_32_32(i32 %a0, i32 %a1, i32 *%a2) {
110; GENERIC-LABEL: crc32_32_32:
111; GENERIC: # BB#0:
112; GENERIC-NEXT: crc32l %esi, %edi
113; GENERIC-NEXT: crc32l (%rdx), %edi
114; GENERIC-NEXT: movl %edi, %eax
115; GENERIC-NEXT: retq
116;
117; SLM-LABEL: crc32_32_32:
118; SLM: # BB#0:
119; SLM-NEXT: crc32l %esi, %edi # sched: [3:1.00]
120; SLM-NEXT: crc32l (%rdx), %edi # sched: [6:1.00]
121; SLM-NEXT: movl %edi, %eax # sched: [1:0.50]
122; SLM-NEXT: retq # sched: [4:1.00]
123;
124; SANDY-LABEL: crc32_32_32:
125; SANDY: # BB#0:
126; SANDY-NEXT: crc32l %esi, %edi # sched: [3:1.00]
127; SANDY-NEXT: crc32l (%rdx), %edi # sched: [7:1.00]
128; SANDY-NEXT: movl %edi, %eax # sched: [1:0.33]
Gadi Haberf4d154c2017-07-10 09:53:16 +0000129; SANDY-NEXT: retq # sched: [1:1.00]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +0000130;
131; HASWELL-LABEL: crc32_32_32:
132; HASWELL: # BB#0:
133; HASWELL-NEXT: crc32l %esi, %edi # sched: [3:1.00]
134; HASWELL-NEXT: crc32l (%rdx), %edi # sched: [7:1.00]
135; HASWELL-NEXT: movl %edi, %eax # sched: [1:0.25]
Michael Zuckermanf6684002017-06-28 11:23:31 +0000136; HASWELL-NEXT: retq # sched: [1:1.00]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +0000137;
138; BTVER2-LABEL: crc32_32_32:
139; BTVER2: # BB#0:
140; BTVER2-NEXT: crc32l %esi, %edi # sched: [3:1.00]
141; BTVER2-NEXT: crc32l (%rdx), %edi # sched: [8:1.00]
142; BTVER2-NEXT: movl %edi, %eax # sched: [1:0.17]
143; BTVER2-NEXT: retq # sched: [4:1.00]
Craig Topper106b5b62017-07-19 02:45:14 +0000144;
145; ZNVER1-LABEL: crc32_32_32:
146; ZNVER1: # BB#0:
147; ZNVER1-NEXT: crc32l %esi, %edi # sched: [3:1.00]
148; ZNVER1-NEXT: crc32l (%rdx), %edi # sched: [10:1.00]
149; ZNVER1-NEXT: movl %edi, %eax # sched: [1:0.25]
150; ZNVER1-NEXT: retq # sched: [5:0.50]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +0000151 %1 = call i32 @llvm.x86.sse42.crc32.32.32(i32 %a0, i32 %a1)
152 %2 = load i32, i32 *%a2
153 %3 = call i32 @llvm.x86.sse42.crc32.32.32(i32 %1, i32 %2)
154 ret i32 %3
155}
156declare i32 @llvm.x86.sse42.crc32.32.32(i32, i32) nounwind
157
158define i64 @crc32_64_8(i64 %a0, i8 %a1, i8 *%a2) nounwind {
159; GENERIC-LABEL: crc32_64_8:
160; GENERIC: # BB#0:
161; GENERIC-NEXT: crc32b %sil, %edi
162; GENERIC-NEXT: crc32b (%rdx), %edi
163; GENERIC-NEXT: movq %rdi, %rax
164; GENERIC-NEXT: retq
165;
166; SLM-LABEL: crc32_64_8:
167; SLM: # BB#0:
168; SLM-NEXT: crc32b %sil, %edi # sched: [3:1.00]
169; SLM-NEXT: crc32b (%rdx), %edi # sched: [6:1.00]
170; SLM-NEXT: movq %rdi, %rax # sched: [1:0.50]
171; SLM-NEXT: retq # sched: [4:1.00]
172;
173; SANDY-LABEL: crc32_64_8:
174; SANDY: # BB#0:
175; SANDY-NEXT: crc32b %sil, %edi # sched: [3:1.00]
Gadi Haberf4d154c2017-07-10 09:53:16 +0000176; SANDY-NEXT: crc32b (%rdx), %edi # sched: [8:1.00]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +0000177; SANDY-NEXT: movq %rdi, %rax # sched: [1:0.33]
Gadi Haberf4d154c2017-07-10 09:53:16 +0000178; SANDY-NEXT: retq # sched: [1:1.00]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +0000179;
180; HASWELL-LABEL: crc32_64_8:
181; HASWELL: # BB#0:
182; HASWELL-NEXT: crc32b %sil, %edi # sched: [3:1.00]
183; HASWELL-NEXT: crc32b (%rdx), %edi # sched: [7:1.00]
184; HASWELL-NEXT: movq %rdi, %rax # sched: [1:0.25]
Michael Zuckermanf6684002017-06-28 11:23:31 +0000185; HASWELL-NEXT: retq # sched: [1:1.00]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +0000186;
187; BTVER2-LABEL: crc32_64_8:
188; BTVER2: # BB#0:
189; BTVER2-NEXT: crc32b %sil, %edi # sched: [3:1.00]
190; BTVER2-NEXT: crc32b (%rdx), %edi # sched: [8:1.00]
191; BTVER2-NEXT: movq %rdi, %rax # sched: [1:0.17]
192; BTVER2-NEXT: retq # sched: [4:1.00]
Craig Topper106b5b62017-07-19 02:45:14 +0000193;
194; ZNVER1-LABEL: crc32_64_8:
195; ZNVER1: # BB#0:
196; ZNVER1-NEXT: crc32b %sil, %edi # sched: [3:1.00]
197; ZNVER1-NEXT: crc32b (%rdx), %edi # sched: [10:1.00]
198; ZNVER1-NEXT: movq %rdi, %rax # sched: [1:0.25]
199; ZNVER1-NEXT: retq # sched: [5:0.50]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +0000200 %1 = call i64 @llvm.x86.sse42.crc32.64.8(i64 %a0, i8 %a1)
201 %2 = load i8, i8 *%a2
202 %3 = call i64 @llvm.x86.sse42.crc32.64.8(i64 %1, i8 %2)
203 ret i64 %3
204}
205declare i64 @llvm.x86.sse42.crc32.64.8(i64, i8) nounwind
206
207define i64 @crc32_64_64(i64 %a0, i64 %a1, i64 *%a2) {
208; GENERIC-LABEL: crc32_64_64:
209; GENERIC: # BB#0:
210; GENERIC-NEXT: crc32q %rsi, %rdi
211; GENERIC-NEXT: crc32q (%rdx), %rdi
212; GENERIC-NEXT: movq %rdi, %rax
213; GENERIC-NEXT: retq
214;
215; SLM-LABEL: crc32_64_64:
216; SLM: # BB#0:
217; SLM-NEXT: crc32q %rsi, %rdi # sched: [3:1.00]
218; SLM-NEXT: crc32q (%rdx), %rdi # sched: [6:1.00]
219; SLM-NEXT: movq %rdi, %rax # sched: [1:0.50]
220; SLM-NEXT: retq # sched: [4:1.00]
221;
222; SANDY-LABEL: crc32_64_64:
223; SANDY: # BB#0:
224; SANDY-NEXT: crc32q %rsi, %rdi # sched: [3:1.00]
225; SANDY-NEXT: crc32q (%rdx), %rdi # sched: [7:1.00]
226; SANDY-NEXT: movq %rdi, %rax # sched: [1:0.33]
Gadi Haberf4d154c2017-07-10 09:53:16 +0000227; SANDY-NEXT: retq # sched: [1:1.00]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +0000228;
229; HASWELL-LABEL: crc32_64_64:
230; HASWELL: # BB#0:
231; HASWELL-NEXT: crc32q %rsi, %rdi # sched: [3:1.00]
232; HASWELL-NEXT: crc32q (%rdx), %rdi # sched: [7:1.00]
233; HASWELL-NEXT: movq %rdi, %rax # sched: [1:0.25]
Michael Zuckermanf6684002017-06-28 11:23:31 +0000234; HASWELL-NEXT: retq # sched: [1:1.00]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +0000235;
236; BTVER2-LABEL: crc32_64_64:
237; BTVER2: # BB#0:
238; BTVER2-NEXT: crc32q %rsi, %rdi # sched: [3:1.00]
239; BTVER2-NEXT: crc32q (%rdx), %rdi # sched: [8:1.00]
240; BTVER2-NEXT: movq %rdi, %rax # sched: [1:0.17]
241; BTVER2-NEXT: retq # sched: [4:1.00]
Craig Topper106b5b62017-07-19 02:45:14 +0000242;
243; ZNVER1-LABEL: crc32_64_64:
244; ZNVER1: # BB#0:
245; ZNVER1-NEXT: crc32q %rsi, %rdi # sched: [3:1.00]
246; ZNVER1-NEXT: crc32q (%rdx), %rdi # sched: [10:1.00]
247; ZNVER1-NEXT: movq %rdi, %rax # sched: [1:0.25]
248; ZNVER1-NEXT: retq # sched: [5:0.50]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +0000249 %1 = call i64 @llvm.x86.sse42.crc32.64.64(i64 %a0, i64 %a1)
250 %2 = load i64, i64 *%a2
251 %3 = call i64 @llvm.x86.sse42.crc32.64.64(i64 %1, i64 %2)
252 ret i64 %3
253}
254declare i64 @llvm.x86.sse42.crc32.64.64(i64, i64) nounwind
255
256define i32 @test_pcmpestri(<16 x i8> %a0, <16 x i8> %a1, <16 x i8> *%a2) {
257; GENERIC-LABEL: test_pcmpestri:
258; GENERIC: # BB#0:
259; GENERIC-NEXT: movl $7, %eax
260; GENERIC-NEXT: movl $7, %edx
261; GENERIC-NEXT: pcmpestri $7, %xmm1, %xmm0
262; GENERIC-NEXT: movl %ecx, %esi
263; GENERIC-NEXT: movl $7, %eax
264; GENERIC-NEXT: movl $7, %edx
265; GENERIC-NEXT: pcmpestri $7, (%rdi), %xmm0
266; GENERIC-NEXT: # kill: %ECX<def> %ECX<kill> %RCX<def>
267; GENERIC-NEXT: leal (%rcx,%rsi), %eax
268; GENERIC-NEXT: retq
269;
270; SLM-LABEL: test_pcmpestri:
271; SLM: # BB#0:
272; SLM-NEXT: movl $7, %eax # sched: [1:0.50]
273; SLM-NEXT: movl $7, %edx # sched: [1:0.50]
274; SLM-NEXT: pcmpestri $7, %xmm1, %xmm0 # sched: [21:21.00]
275; SLM-NEXT: movl $7, %eax # sched: [1:0.50]
276; SLM-NEXT: movl $7, %edx # sched: [1:0.50]
277; SLM-NEXT: movl %ecx, %esi # sched: [1:0.50]
278; SLM-NEXT: pcmpestri $7, (%rdi), %xmm0 # sched: [21:21.00]
279; SLM-NEXT: # kill: %ECX<def> %ECX<kill> %RCX<def>
280; SLM-NEXT: leal (%rcx,%rsi), %eax # sched: [1:1.00]
281; SLM-NEXT: retq # sched: [4:1.00]
282;
283; SANDY-LABEL: test_pcmpestri:
284; SANDY: # BB#0:
285; SANDY-NEXT: movl $7, %eax # sched: [1:0.33]
286; SANDY-NEXT: movl $7, %edx # sched: [1:0.33]
287; SANDY-NEXT: vpcmpestri $7, %xmm1, %xmm0 # sched: [4:2.67]
288; SANDY-NEXT: movl %ecx, %esi # sched: [1:0.33]
289; SANDY-NEXT: movl $7, %eax # sched: [1:0.33]
290; SANDY-NEXT: movl $7, %edx # sched: [1:0.33]
291; SANDY-NEXT: vpcmpestri $7, (%rdi), %xmm0 # sched: [4:2.33]
292; SANDY-NEXT: # kill: %ECX<def> %ECX<kill> %RCX<def>
293; SANDY-NEXT: leal (%rcx,%rsi), %eax # sched: [1:0.50]
Gadi Haberf4d154c2017-07-10 09:53:16 +0000294; SANDY-NEXT: retq # sched: [1:1.00]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +0000295;
296; HASWELL-LABEL: test_pcmpestri:
297; HASWELL: # BB#0:
298; HASWELL-NEXT: movl $7, %eax # sched: [1:0.25]
299; HASWELL-NEXT: movl $7, %edx # sched: [1:0.25]
Michael Zuckermanf6684002017-06-28 11:23:31 +0000300; HASWELL-NEXT: vpcmpestri $7, %xmm1, %xmm0 # sched: [11:3.00]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +0000301; HASWELL-NEXT: movl %ecx, %esi # sched: [1:0.25]
302; HASWELL-NEXT: movl $7, %eax # sched: [1:0.25]
303; HASWELL-NEXT: movl $7, %edx # sched: [1:0.25]
Michael Zuckermanf6684002017-06-28 11:23:31 +0000304; HASWELL-NEXT: vpcmpestri $7, (%rdi), %xmm0 # sched: [11:3.00]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +0000305; HASWELL-NEXT: # kill: %ECX<def> %ECX<kill> %RCX<def>
306; HASWELL-NEXT: leal (%rcx,%rsi), %eax # sched: [1:0.50]
Michael Zuckermanf6684002017-06-28 11:23:31 +0000307; HASWELL-NEXT: retq # sched: [1:1.00]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +0000308;
309; BTVER2-LABEL: test_pcmpestri:
310; BTVER2: # BB#0:
311; BTVER2-NEXT: movl $7, %eax # sched: [1:0.17]
312; BTVER2-NEXT: movl $7, %edx # sched: [1:0.17]
313; BTVER2-NEXT: vpcmpestri $7, %xmm1, %xmm0 # sched: [13:2.50]
314; BTVER2-NEXT: movl $7, %eax # sched: [1:0.17]
315; BTVER2-NEXT: movl $7, %edx # sched: [1:0.17]
316; BTVER2-NEXT: movl %ecx, %esi # sched: [1:0.17]
317; BTVER2-NEXT: vpcmpestri $7, (%rdi), %xmm0 # sched: [18:2.50]
318; BTVER2-NEXT: # kill: %ECX<def> %ECX<kill> %RCX<def>
319; BTVER2-NEXT: leal (%rcx,%rsi), %eax # sched: [1:0.50]
320; BTVER2-NEXT: retq # sched: [4:1.00]
Craig Topper106b5b62017-07-19 02:45:14 +0000321;
322; ZNVER1-LABEL: test_pcmpestri:
323; ZNVER1: # BB#0:
324; ZNVER1-NEXT: movl $7, %eax # sched: [1:0.25]
325; ZNVER1-NEXT: movl $7, %edx # sched: [1:0.25]
326; ZNVER1-NEXT: vpcmpestri $7, %xmm1, %xmm0 # sched: [100:0.00]
327; ZNVER1-NEXT: movl $7, %eax # sched: [1:0.25]
328; ZNVER1-NEXT: movl $7, %edx # sched: [1:0.25]
329; ZNVER1-NEXT: movl %ecx, %esi # sched: [1:0.25]
330; ZNVER1-NEXT: vpcmpestri $7, (%rdi), %xmm0 # sched: [100:0.00]
331; ZNVER1-NEXT: # kill: %ECX<def> %ECX<kill> %RCX<def>
332; ZNVER1-NEXT: leal (%rcx,%rsi), %eax # sched: [1:0.25]
333; ZNVER1-NEXT: retq # sched: [5:0.50]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +0000334 %1 = call i32 @llvm.x86.sse42.pcmpestri128(<16 x i8> %a0, i32 7, <16 x i8> %a1, i32 7, i8 7)
335 %2 = load <16 x i8>, <16 x i8> *%a2, align 16
336 %3 = call i32 @llvm.x86.sse42.pcmpestri128(<16 x i8> %a0, i32 7, <16 x i8> %2, i32 7, i8 7)
337 %4 = add i32 %1, %3
338 ret i32 %4
339}
340declare i32 @llvm.x86.sse42.pcmpestri128(<16 x i8>, i32, <16 x i8>, i32, i8) nounwind readnone
341
342define <16 x i8> @test_pcmpestrm(<16 x i8> %a0, <16 x i8> %a1, <16 x i8> *%a2) {
343; GENERIC-LABEL: test_pcmpestrm:
344; GENERIC: # BB#0:
345; GENERIC-NEXT: movl $7, %eax
346; GENERIC-NEXT: movl $7, %edx
347; GENERIC-NEXT: pcmpestrm $7, %xmm1, %xmm0
348; GENERIC-NEXT: movl $7, %eax
349; GENERIC-NEXT: movl $7, %edx
350; GENERIC-NEXT: pcmpestrm $7, (%rdi), %xmm0
351; GENERIC-NEXT: retq
352;
353; SLM-LABEL: test_pcmpestrm:
354; SLM: # BB#0:
355; SLM-NEXT: movl $7, %eax # sched: [1:0.50]
356; SLM-NEXT: movl $7, %edx # sched: [1:0.50]
357; SLM-NEXT: pcmpestrm $7, %xmm1, %xmm0 # sched: [17:17.00]
358; SLM-NEXT: movl $7, %eax # sched: [1:0.50]
359; SLM-NEXT: movl $7, %edx # sched: [1:0.50]
360; SLM-NEXT: pcmpestrm $7, (%rdi), %xmm0 # sched: [17:17.00]
361; SLM-NEXT: retq # sched: [4:1.00]
362;
363; SANDY-LABEL: test_pcmpestrm:
364; SANDY: # BB#0:
365; SANDY-NEXT: movl $7, %eax # sched: [1:0.33]
366; SANDY-NEXT: movl $7, %edx # sched: [1:0.33]
367; SANDY-NEXT: vpcmpestrm $7, %xmm1, %xmm0 # sched: [11:2.67]
368; SANDY-NEXT: movl $7, %eax # sched: [1:0.33]
369; SANDY-NEXT: movl $7, %edx # sched: [1:0.33]
370; SANDY-NEXT: vpcmpestrm $7, (%rdi), %xmm0 # sched: [11:2.33]
Gadi Haberf4d154c2017-07-10 09:53:16 +0000371; SANDY-NEXT: retq # sched: [1:1.00]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +0000372;
373; HASWELL-LABEL: test_pcmpestrm:
374; HASWELL: # BB#0:
375; HASWELL-NEXT: movl $7, %eax # sched: [1:0.25]
376; HASWELL-NEXT: movl $7, %edx # sched: [1:0.25]
Michael Zuckermanf6684002017-06-28 11:23:31 +0000377; HASWELL-NEXT: vpcmpestrm $7, %xmm1, %xmm0 # sched: [10:4.00]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +0000378; HASWELL-NEXT: movl $7, %eax # sched: [1:0.25]
379; HASWELL-NEXT: movl $7, %edx # sched: [1:0.25]
Michael Zuckermanf6684002017-06-28 11:23:31 +0000380; HASWELL-NEXT: vpcmpestrm $7, (%rdi), %xmm0 # sched: [10:3.00]
381; HASWELL-NEXT: retq # sched: [1:1.00]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +0000382;
383; BTVER2-LABEL: test_pcmpestrm:
384; BTVER2: # BB#0:
385; BTVER2-NEXT: movl $7, %eax # sched: [1:0.17]
386; BTVER2-NEXT: movl $7, %edx # sched: [1:0.17]
387; BTVER2-NEXT: vpcmpestrm $7, %xmm1, %xmm0 # sched: [13:2.50]
388; BTVER2-NEXT: movl $7, %eax # sched: [1:0.17]
389; BTVER2-NEXT: movl $7, %edx # sched: [1:0.17]
390; BTVER2-NEXT: vpcmpestrm $7, (%rdi), %xmm0 # sched: [18:2.50]
391; BTVER2-NEXT: retq # sched: [4:1.00]
Craig Topper106b5b62017-07-19 02:45:14 +0000392;
393; ZNVER1-LABEL: test_pcmpestrm:
394; ZNVER1: # BB#0:
395; ZNVER1-NEXT: movl $7, %eax # sched: [1:0.25]
396; ZNVER1-NEXT: movl $7, %edx # sched: [1:0.25]
397; ZNVER1-NEXT: vpcmpestrm $7, %xmm1, %xmm0 # sched: [100:0.00]
398; ZNVER1-NEXT: movl $7, %eax # sched: [1:0.25]
399; ZNVER1-NEXT: movl $7, %edx # sched: [1:0.25]
400; ZNVER1-NEXT: vpcmpestrm $7, (%rdi), %xmm0 # sched: [100:0.00]
401; ZNVER1-NEXT: retq # sched: [5:0.50]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +0000402 %1 = call <16 x i8> @llvm.x86.sse42.pcmpestrm128(<16 x i8> %a0, i32 7, <16 x i8> %a1, i32 7, i8 7)
403 %2 = load <16 x i8>, <16 x i8> *%a2, align 16
404 %3 = call <16 x i8> @llvm.x86.sse42.pcmpestrm128(<16 x i8> %1, i32 7, <16 x i8> %2, i32 7, i8 7)
405 ret <16 x i8> %3
406}
407declare <16 x i8> @llvm.x86.sse42.pcmpestrm128(<16 x i8>, i32, <16 x i8>, i32, i8) nounwind readnone
408
409define i32 @test_pcmpistri(<16 x i8> %a0, <16 x i8> %a1, <16 x i8> *%a2) {
410; GENERIC-LABEL: test_pcmpistri:
411; GENERIC: # BB#0:
412; GENERIC-NEXT: pcmpistri $7, %xmm1, %xmm0
413; GENERIC-NEXT: movl %ecx, %eax
414; GENERIC-NEXT: pcmpistri $7, (%rdi), %xmm0
415; GENERIC-NEXT: # kill: %ECX<def> %ECX<kill> %RCX<def>
416; GENERIC-NEXT: leal (%rcx,%rax), %eax
417; GENERIC-NEXT: retq
418;
419; SLM-LABEL: test_pcmpistri:
420; SLM: # BB#0:
421; SLM-NEXT: pcmpistri $7, %xmm1, %xmm0 # sched: [17:17.00]
422; SLM-NEXT: movl %ecx, %eax # sched: [1:0.50]
423; SLM-NEXT: pcmpistri $7, (%rdi), %xmm0 # sched: [17:17.00]
424; SLM-NEXT: # kill: %ECX<def> %ECX<kill> %RCX<def>
425; SLM-NEXT: leal (%rcx,%rax), %eax # sched: [1:1.00]
426; SLM-NEXT: retq # sched: [4:1.00]
427;
428; SANDY-LABEL: test_pcmpistri:
429; SANDY: # BB#0:
Gadi Haberf4d154c2017-07-10 09:53:16 +0000430; SANDY-NEXT: vpcmpistri $7, %xmm1, %xmm0 # sched: [11:3.00]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +0000431; SANDY-NEXT: movl %ecx, %eax # sched: [1:0.33]
Gadi Haberf4d154c2017-07-10 09:53:16 +0000432; SANDY-NEXT: vpcmpistri $7, (%rdi), %xmm0 # sched: [17:3.00]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +0000433; SANDY-NEXT: # kill: %ECX<def> %ECX<kill> %RCX<def>
434; SANDY-NEXT: leal (%rcx,%rax), %eax # sched: [1:0.50]
Gadi Haberf4d154c2017-07-10 09:53:16 +0000435; SANDY-NEXT: retq # sched: [1:1.00]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +0000436;
437; HASWELL-LABEL: test_pcmpistri:
438; HASWELL: # BB#0:
439; HASWELL-NEXT: vpcmpistri $7, %xmm1, %xmm0 # sched: [11:3.00]
440; HASWELL-NEXT: movl %ecx, %eax # sched: [1:0.25]
441; HASWELL-NEXT: vpcmpistri $7, (%rdi), %xmm0 # sched: [11:3.00]
442; HASWELL-NEXT: # kill: %ECX<def> %ECX<kill> %RCX<def>
443; HASWELL-NEXT: leal (%rcx,%rax), %eax # sched: [1:0.50]
Michael Zuckermanf6684002017-06-28 11:23:31 +0000444; HASWELL-NEXT: retq # sched: [1:1.00]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +0000445;
446; BTVER2-LABEL: test_pcmpistri:
447; BTVER2: # BB#0:
448; BTVER2-NEXT: vpcmpistri $7, %xmm1, %xmm0 # sched: [6:1.00]
449; BTVER2-NEXT: movl %ecx, %eax # sched: [1:0.17]
450; BTVER2-NEXT: vpcmpistri $7, (%rdi), %xmm0 # sched: [11:1.00]
451; BTVER2-NEXT: # kill: %ECX<def> %ECX<kill> %RCX<def>
452; BTVER2-NEXT: leal (%rcx,%rax), %eax # sched: [1:0.50]
453; BTVER2-NEXT: retq # sched: [4:1.00]
Craig Topper106b5b62017-07-19 02:45:14 +0000454;
455; ZNVER1-LABEL: test_pcmpistri:
456; ZNVER1: # BB#0:
457; ZNVER1-NEXT: vpcmpistri $7, %xmm1, %xmm0 # sched: [100:0.00]
458; ZNVER1-NEXT: movl %ecx, %eax # sched: [1:0.25]
459; ZNVER1-NEXT: vpcmpistri $7, (%rdi), %xmm0 # sched: [100:0.00]
460; ZNVER1-NEXT: # kill: %ECX<def> %ECX<kill> %RCX<def>
461; ZNVER1-NEXT: leal (%rcx,%rax), %eax # sched: [1:0.25]
462; ZNVER1-NEXT: retq # sched: [5:0.50]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +0000463 %1 = call i32 @llvm.x86.sse42.pcmpistri128(<16 x i8> %a0, <16 x i8> %a1, i8 7)
464 %2 = load <16 x i8>, <16 x i8> *%a2, align 16
465 %3 = call i32 @llvm.x86.sse42.pcmpistri128(<16 x i8> %a0, <16 x i8> %2, i8 7)
466 %4 = add i32 %1, %3
467 ret i32 %4
468}
469declare i32 @llvm.x86.sse42.pcmpistri128(<16 x i8>, <16 x i8>, i8) nounwind readnone
470
471define <16 x i8> @test_pcmpistrm(<16 x i8> %a0, <16 x i8> %a1, <16 x i8> *%a2) {
472; GENERIC-LABEL: test_pcmpistrm:
473; GENERIC: # BB#0:
474; GENERIC-NEXT: pcmpistrm $7, %xmm1, %xmm0
475; GENERIC-NEXT: pcmpistrm $7, (%rdi), %xmm0
476; GENERIC-NEXT: retq
477;
478; SLM-LABEL: test_pcmpistrm:
479; SLM: # BB#0:
480; SLM-NEXT: pcmpistrm $7, %xmm1, %xmm0 # sched: [13:13.00]
481; SLM-NEXT: pcmpistrm $7, (%rdi), %xmm0 # sched: [13:13.00]
482; SLM-NEXT: retq # sched: [4:1.00]
483;
484; SANDY-LABEL: test_pcmpistrm:
485; SANDY: # BB#0:
Gadi Haberf4d154c2017-07-10 09:53:16 +0000486; SANDY-NEXT: vpcmpistrm $7, %xmm1, %xmm0 # sched: [11:3.00]
487; SANDY-NEXT: vpcmpistrm $7, (%rdi), %xmm0 # sched: [17:3.00]
488; SANDY-NEXT: retq # sched: [1:1.00]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +0000489;
490; HASWELL-LABEL: test_pcmpistrm:
491; HASWELL: # BB#0:
Michael Zuckermanf6684002017-06-28 11:23:31 +0000492; HASWELL-NEXT: vpcmpistrm $7, %xmm1, %xmm0 # sched: [10:3.00]
493; HASWELL-NEXT: vpcmpistrm $7, (%rdi), %xmm0 # sched: [10:3.00]
494; HASWELL-NEXT: retq # sched: [1:1.00]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +0000495;
496; BTVER2-LABEL: test_pcmpistrm:
497; BTVER2: # BB#0:
498; BTVER2-NEXT: vpcmpistrm $7, %xmm1, %xmm0 # sched: [7:1.00]
499; BTVER2-NEXT: vpcmpistrm $7, (%rdi), %xmm0 # sched: [12:1.00]
500; BTVER2-NEXT: retq # sched: [4:1.00]
Craig Topper106b5b62017-07-19 02:45:14 +0000501;
502; ZNVER1-LABEL: test_pcmpistrm:
503; ZNVER1: # BB#0:
504; ZNVER1-NEXT: vpcmpistrm $7, %xmm1, %xmm0 # sched: [100:0.00]
505; ZNVER1-NEXT: vpcmpistrm $7, (%rdi), %xmm0 # sched: [100:0.00]
506; ZNVER1-NEXT: retq # sched: [5:0.50]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +0000507 %1 = call <16 x i8> @llvm.x86.sse42.pcmpistrm128(<16 x i8> %a0, <16 x i8> %a1, i8 7)
508 %2 = load <16 x i8>, <16 x i8> *%a2, align 16
509 %3 = call <16 x i8> @llvm.x86.sse42.pcmpistrm128(<16 x i8> %1, <16 x i8> %2, i8 7)
510 ret <16 x i8> %3
511}
512declare <16 x i8> @llvm.x86.sse42.pcmpistrm128(<16 x i8>, <16 x i8>, i8) nounwind readnone
513
514define <2 x i64> @test_pcmpgtq(<2 x i64> %a0, <2 x i64> %a1, <2 x i64> *%a2) {
515; GENERIC-LABEL: test_pcmpgtq:
516; GENERIC: # BB#0:
517; GENERIC-NEXT: pcmpgtq %xmm1, %xmm0
518; GENERIC-NEXT: pcmpgtq (%rdi), %xmm0
519; GENERIC-NEXT: retq
520;
521; SLM-LABEL: test_pcmpgtq:
522; SLM: # BB#0:
Simon Pilgrim06d62632017-04-23 21:23:27 +0000523; SLM-NEXT: pcmpgtq %xmm1, %xmm0 # sched: [1:0.50]
524; SLM-NEXT: pcmpgtq (%rdi), %xmm0 # sched: [4:1.00]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +0000525; SLM-NEXT: retq # sched: [4:1.00]
526;
527; SANDY-LABEL: test_pcmpgtq:
528; SANDY: # BB#0:
Gadi Haberf4d154c2017-07-10 09:53:16 +0000529; SANDY-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0 # sched: [5:1.00]
530; SANDY-NEXT: vpcmpgtq (%rdi), %xmm0, %xmm0 # sched: [11:1.00]
531; SANDY-NEXT: retq # sched: [1:1.00]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +0000532;
533; HASWELL-LABEL: test_pcmpgtq:
534; HASWELL: # BB#0:
535; HASWELL-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0 # sched: [5:1.00]
536; HASWELL-NEXT: vpcmpgtq (%rdi), %xmm0, %xmm0 # sched: [5:1.00]
Michael Zuckermanf6684002017-06-28 11:23:31 +0000537; HASWELL-NEXT: retq # sched: [1:1.00]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +0000538;
539; BTVER2-LABEL: test_pcmpgtq:
540; BTVER2: # BB#0:
Simon Pilgrim06d62632017-04-23 21:23:27 +0000541; BTVER2-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0 # sched: [1:0.50]
542; BTVER2-NEXT: vpcmpgtq (%rdi), %xmm0, %xmm0 # sched: [6:1.00]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +0000543; BTVER2-NEXT: retq # sched: [4:1.00]
Craig Topper106b5b62017-07-19 02:45:14 +0000544;
545; ZNVER1-LABEL: test_pcmpgtq:
546; ZNVER1: # BB#0:
547; ZNVER1-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0 # sched: [1:0.25]
548; ZNVER1-NEXT: vpcmpgtq (%rdi), %xmm0, %xmm0 # sched: [8:0.50]
549; ZNVER1-NEXT: retq # sched: [5:0.50]
Simon Pilgrim7d71ed52017-04-23 21:00:25 +0000550 %1 = icmp sgt <2 x i64> %a0, %a1
551 %2 = sext <2 x i1> %1 to <2 x i64>
552 %3 = load <2 x i64>, <2 x i64>*%a2, align 16
553 %4 = icmp sgt <2 x i64> %2, %3
554 %5 = sext <2 x i1> %4 to <2 x i64>
555 ret <2 x i64> %5
556}