xref: /llvm-project/llvm/test/Transforms/InstCombine/X86/x86-sse2-inseltpoison.ll (revision acdc419c897f8a9414c7a00c8908ac32312afee2)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=instcombine -mtriple=x86_64-unknown-unknown -S | FileCheck %s
3target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
4
5define double @test_sqrt_sd_0(double %a) {
6; CHECK-LABEL: @test_sqrt_sd_0(
7; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.sqrt.f64(double [[A:%.*]])
8; CHECK-NEXT:    ret double [[TMP1]]
9;
10  %1 = insertelement <2 x double> poison, double %a, i32 0
11  %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1
12  %3 = tail call <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double> %2)
13  %4 = extractelement <2 x double> %3, i32 0
14  ret double %4
15}
16
17define double @test_sqrt_sd_1(double %a) {
18; CHECK-LABEL: @test_sqrt_sd_1(
19; CHECK-NEXT:    ret double 1.000000e+00
20;
21  %1 = insertelement <2 x double> poison, double %a, i32 0
22  %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1
23  %3 = tail call <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double> %2)
24  %4 = extractelement <2 x double> %3, i32 1
25  ret double %4
26}
27
28define double @test_add_sd_0(double %a, double %b) {
29; CHECK-LABEL: @test_add_sd_0(
30; CHECK-NEXT:    [[TMP1:%.*]] = fadd double [[A:%.*]], [[B:%.*]]
31; CHECK-NEXT:    ret double [[TMP1]]
32;
33  %1 = insertelement <2 x double> poison, double %a, i32 0
34  %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1
35  %3 = insertelement <2 x double> poison, double %b, i32 0
36  %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1
37  %5 = tail call <2 x double> @llvm.x86.sse2.add.sd(<2 x double> %2, <2 x double> %4)
38  %6 = extractelement <2 x double> %5, i32 0
39  ret double %6
40}
41
42define double @test_add_sd_1(double %a, double %b) {
43; CHECK-LABEL: @test_add_sd_1(
44; CHECK-NEXT:    ret double 1.000000e+00
45;
46  %1 = insertelement <2 x double> poison, double %a, i32 0
47  %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1
48  %3 = insertelement <2 x double> poison, double %b, i32 0
49  %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1
50  %5 = tail call <2 x double> @llvm.x86.sse2.add.sd(<2 x double> %2, <2 x double> %4)
51  %6 = extractelement <2 x double> %5, i32 1
52  ret double %6
53}
54
55define double @test_add_sd_2(double %a) {
56; CHECK-LABEL: @test_add_sd_2(
57; CHECK-NEXT:    [[TMP1:%.*]] = fadd double [[A:%.*]], [[A]]
58; CHECK-NEXT:    ret double [[TMP1]]
59;
60  %1 = insertelement <2 x double> zeroinitializer, double %a, i32 0
61  %2 = tail call <2 x double> @llvm.x86.sse2.add.sd(<2 x double> %1, <2 x double> %1)
62  %3 = extractelement <2 x double> %2, i32 0
63  ret double %3
64}
65
66define double @test_sub_sd_0(double %a, double %b) {
67; CHECK-LABEL: @test_sub_sd_0(
68; CHECK-NEXT:    [[TMP1:%.*]] = fsub double [[A:%.*]], [[B:%.*]]
69; CHECK-NEXT:    ret double [[TMP1]]
70;
71  %1 = insertelement <2 x double> poison, double %a, i32 0
72  %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1
73  %3 = insertelement <2 x double> poison, double %b, i32 0
74  %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1
75  %5 = tail call <2 x double> @llvm.x86.sse2.sub.sd(<2 x double> %2, <2 x double> %4)
76  %6 = extractelement <2 x double> %5, i32 0
77  ret double %6
78}
79
80define double @test_sub_sd_1(double %a, double %b) {
81; CHECK-LABEL: @test_sub_sd_1(
82; CHECK-NEXT:    ret double 1.000000e+00
83;
84  %1 = insertelement <2 x double> poison, double %a, i32 0
85  %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1
86  %3 = insertelement <2 x double> poison, double %b, i32 0
87  %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1
88  %5 = tail call <2 x double> @llvm.x86.sse2.sub.sd(<2 x double> %2, <2 x double> %4)
89  %6 = extractelement <2 x double> %5, i32 1
90  ret double %6
91}
92
93define double @test_sub_sd_2(double %a) {
94; CHECK-LABEL: @test_sub_sd_2(
95; CHECK-NEXT:    [[TMP1:%.*]] = fsub double [[A:%.*]], [[A]]
96; CHECK-NEXT:    ret double [[TMP1]]
97;
98  %1 = insertelement <2 x double> zeroinitializer, double %a, i32 0
99  %2 = tail call <2 x double> @llvm.x86.sse2.sub.sd(<2 x double> %1, <2 x double> %1)
100  %3 = extractelement <2 x double> %2, i32 0
101  ret double %3
102}
103
104define double @test_mul_sd_0(double %a, double %b) {
105; CHECK-LABEL: @test_mul_sd_0(
106; CHECK-NEXT:    [[TMP1:%.*]] = fmul double [[A:%.*]], [[B:%.*]]
107; CHECK-NEXT:    ret double [[TMP1]]
108;
109  %1 = insertelement <2 x double> poison, double %a, i32 0
110  %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1
111  %3 = insertelement <2 x double> poison, double %b, i32 0
112  %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1
113  %5 = tail call <2 x double> @llvm.x86.sse2.mul.sd(<2 x double> %2, <2 x double> %4)
114  %6 = extractelement <2 x double> %5, i32 0
115  ret double %6
116}
117
118define double @test_mul_sd_1(double %a, double %b) {
119; CHECK-LABEL: @test_mul_sd_1(
120; CHECK-NEXT:    ret double 1.000000e+00
121;
122  %1 = insertelement <2 x double> poison, double %a, i32 0
123  %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1
124  %3 = insertelement <2 x double> poison, double %b, i32 0
125  %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1
126  %5 = tail call <2 x double> @llvm.x86.sse2.mul.sd(<2 x double> %2, <2 x double> %4)
127  %6 = extractelement <2 x double> %5, i32 1
128  ret double %6
129}
130
131define double @test_mul_sd_2(double %a) {
132; CHECK-LABEL: @test_mul_sd_2(
133; CHECK-NEXT:    [[TMP1:%.*]] = fmul double [[A:%.*]], [[A]]
134; CHECK-NEXT:    ret double [[TMP1]]
135;
136  %1 = insertelement <2 x double> zeroinitializer, double %a, i32 0
137  %2 = tail call <2 x double> @llvm.x86.sse2.mul.sd(<2 x double> %1, <2 x double> %1)
138  %3 = extractelement <2 x double> %2, i32 0
139  ret double %3
140}
141
142define double @test_div_sd_0(double %a, double %b) {
143; CHECK-LABEL: @test_div_sd_0(
144; CHECK-NEXT:    [[TMP1:%.*]] = fdiv double [[A:%.*]], [[B:%.*]]
145; CHECK-NEXT:    ret double [[TMP1]]
146;
147  %1 = insertelement <2 x double> poison, double %a, i32 0
148  %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1
149  %3 = insertelement <2 x double> poison, double %b, i32 0
150  %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1
151  %5 = tail call <2 x double> @llvm.x86.sse2.div.sd(<2 x double> %2, <2 x double> %4)
152  %6 = extractelement <2 x double> %5, i32 0
153  ret double %6
154}
155
156define double @test_div_sd_1(double %a, double %b) {
157; CHECK-LABEL: @test_div_sd_1(
158; CHECK-NEXT:    ret double 1.000000e+00
159;
160  %1 = insertelement <2 x double> poison, double %a, i32 0
161  %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1
162  %3 = insertelement <2 x double> poison, double %b, i32 0
163  %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1
164  %5 = tail call <2 x double> @llvm.x86.sse2.div.sd(<2 x double> %2, <2 x double> %4)
165  %6 = extractelement <2 x double> %5, i32 1
166  ret double %6
167}
168
169define double @test_div_sd_2(double %a) {
170; CHECK-LABEL: @test_div_sd_2(
171; CHECK-NEXT:    [[TMP1:%.*]] = fdiv double [[A:%.*]], [[A]]
172; CHECK-NEXT:    ret double [[TMP1]]
173;
174  %1 = insertelement <2 x double> zeroinitializer, double %a, i32 0
175  %2 = tail call <2 x double> @llvm.x86.sse2.div.sd(<2 x double> %1, <2 x double> %1)
176  %3 = extractelement <2 x double> %2, i32 0
177  ret double %3
178}
179
180define <2 x double> @test_min_sd(<2 x double> %a, <2 x double> %b) {
181; CHECK-LABEL: @test_min_sd(
182; CHECK-NEXT:    [[TMP1:%.*]] = tail call <2 x double> @llvm.x86.sse2.min.sd(<2 x double> [[A:%.*]], <2 x double> [[B:%.*]])
183; CHECK-NEXT:    ret <2 x double> [[TMP1]]
184;
185  %1 = insertelement <2 x double> %b, double 2.000000e+00, i32 1
186  %2 = tail call <2 x double> @llvm.x86.sse2.min.sd(<2 x double> %a, <2 x double> %1)
187  ret <2 x double> %2
188}
189
190define double @test_min_sd_0(double %a, double %b) {
191; CHECK-LABEL: @test_min_sd_0(
192; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x double> poison, double [[A:%.*]], i64 0
193; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0
194; CHECK-NEXT:    [[TMP3:%.*]] = tail call <2 x double> @llvm.x86.sse2.min.sd(<2 x double> [[TMP1]], <2 x double> [[TMP2]])
195; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <2 x double> [[TMP3]], i64 0
196; CHECK-NEXT:    ret double [[TMP4]]
197;
198  %1 = insertelement <2 x double> poison, double %a, i32 0
199  %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1
200  %3 = insertelement <2 x double> poison, double %b, i32 0
201  %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1
202  %5 = tail call <2 x double> @llvm.x86.sse2.min.sd(<2 x double> %2, <2 x double> %4)
203  %6 = extractelement <2 x double> %5, i32 0
204  ret double %6
205}
206
207define double @test_min_sd_1(double %a, double %b) {
208; CHECK-LABEL: @test_min_sd_1(
209; CHECK-NEXT:    ret double 1.000000e+00
210;
211  %1 = insertelement <2 x double> poison, double %a, i32 0
212  %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1
213  %3 = insertelement <2 x double> poison, double %b, i32 0
214  %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1
215  %5 = tail call <2 x double> @llvm.x86.sse2.min.sd(<2 x double> %2, <2 x double> %4)
216  %6 = extractelement <2 x double> %5, i32 1
217  ret double %6
218}
219
220define double @test_min_sd_2(double %a) {
221; CHECK-LABEL: @test_min_sd_2(
222; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x double> <double poison, double 0.000000e+00>, double [[A:%.*]], i64 0
223; CHECK-NEXT:    [[TMP2:%.*]] = tail call <2 x double> @llvm.x86.sse2.min.sd(<2 x double> [[TMP1]], <2 x double> [[TMP1]])
224; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <2 x double> [[TMP2]], i64 0
225; CHECK-NEXT:    ret double [[TMP3]]
226;
227  %1 = insertelement <2 x double> zeroinitializer, double %a, i32 0
228  %2 = tail call <2 x double> @llvm.x86.sse2.min.sd(<2 x double> %1, <2 x double> %1)
229  %3 = extractelement <2 x double> %2, i32 0
230  ret double %3
231}
232
233define <2 x double> @test_max_sd(<2 x double> %a, <2 x double> %b) {
234; CHECK-LABEL: @test_max_sd(
235; CHECK-NEXT:    [[TMP1:%.*]] = tail call <2 x double> @llvm.x86.sse2.max.sd(<2 x double> [[A:%.*]], <2 x double> [[B:%.*]])
236; CHECK-NEXT:    ret <2 x double> [[TMP1]]
237;
238  %1 = insertelement <2 x double> %b, double 2.000000e+00, i32 1
239  %2 = tail call <2 x double> @llvm.x86.sse2.max.sd(<2 x double> %a, <2 x double> %1)
240  ret <2 x double> %2
241}
242
243define double @test_max_sd_0(double %a, double %b) {
244; CHECK-LABEL: @test_max_sd_0(
245; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x double> poison, double [[A:%.*]], i64 0
246; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0
247; CHECK-NEXT:    [[TMP3:%.*]] = tail call <2 x double> @llvm.x86.sse2.max.sd(<2 x double> [[TMP1]], <2 x double> [[TMP2]])
248; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <2 x double> [[TMP3]], i64 0
249; CHECK-NEXT:    ret double [[TMP4]]
250;
251  %1 = insertelement <2 x double> poison, double %a, i32 0
252  %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1
253  %3 = insertelement <2 x double> poison, double %b, i32 0
254  %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1
255  %5 = tail call <2 x double> @llvm.x86.sse2.max.sd(<2 x double> %2, <2 x double> %4)
256  %6 = extractelement <2 x double> %5, i32 0
257  ret double %6
258}
259
260define double @test_max_sd_1(double %a, double %b) {
261; CHECK-LABEL: @test_max_sd_1(
262; CHECK-NEXT:    ret double 1.000000e+00
263;
264  %1 = insertelement <2 x double> poison, double %a, i32 0
265  %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1
266  %3 = insertelement <2 x double> poison, double %b, i32 0
267  %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1
268  %5 = tail call <2 x double> @llvm.x86.sse2.max.sd(<2 x double> %2, <2 x double> %4)
269  %6 = extractelement <2 x double> %5, i32 1
270  ret double %6
271}
272
273define double @test_max_sd_2(double %a) {
274; CHECK-LABEL: @test_max_sd_2(
275; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x double> <double poison, double 0.000000e+00>, double [[A:%.*]], i64 0
276; CHECK-NEXT:    [[TMP2:%.*]] = tail call <2 x double> @llvm.x86.sse2.max.sd(<2 x double> [[TMP1]], <2 x double> [[TMP1]])
277; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <2 x double> [[TMP2]], i64 0
278; CHECK-NEXT:    ret double [[TMP3]]
279;
280  %1 = insertelement <2 x double> zeroinitializer, double %a, i32 0
281  %2 = tail call <2 x double> @llvm.x86.sse2.max.sd(<2 x double> %1, <2 x double> %1)
282  %3 = extractelement <2 x double> %2, i32 0
283  ret double %3
284}
285
286define <2 x double> @test_cmp_sd(<2 x double> %a, <2 x double> %b) {
287; CHECK-LABEL: @test_cmp_sd(
288; CHECK-NEXT:    [[TMP1:%.*]] = tail call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> [[A:%.*]], <2 x double> [[B:%.*]], i8 0)
289; CHECK-NEXT:    ret <2 x double> [[TMP1]]
290;
291  %1 = insertelement <2 x double> %b, double 2.000000e+00, i32 1
292  %2 = tail call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %a, <2 x double> %1, i8 0)
293  ret <2 x double> %2
294}
295
296define double @test_cmp_sd_0(double %a, double %b) {
297; CHECK-LABEL: @test_cmp_sd_0(
298; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x double> poison, double [[A:%.*]], i64 0
299; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0
300; CHECK-NEXT:    [[TMP3:%.*]] = tail call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> [[TMP1]], <2 x double> [[TMP2]], i8 0)
301; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <2 x double> [[TMP3]], i64 0
302; CHECK-NEXT:    ret double [[TMP4]]
303;
304  %1 = insertelement <2 x double> poison, double %a, i32 0
305  %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1
306  %3 = insertelement <2 x double> poison, double %b, i32 0
307  %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1
308  %5 = tail call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %2, <2 x double> %4, i8 0)
309  %6 = extractelement <2 x double> %5, i32 0
310  ret double %6
311}
312
313define double @test_cmp_sd_1(double %a, double %b) {
314; CHECK-LABEL: @test_cmp_sd_1(
315; CHECK-NEXT:    ret double 1.000000e+00
316;
317  %1 = insertelement <2 x double> poison, double %a, i32 0
318  %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1
319  %3 = insertelement <2 x double> poison, double %b, i32 0
320  %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1
321  %5 = tail call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %2, <2 x double> %4, i8 0)
322  %6 = extractelement <2 x double> %5, i32 1
323  ret double %6
324}
325
326define double @test_cmp_sd_2(double %a) {
327; CHECK-LABEL: @test_cmp_sd_2(
328; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x double> <double poison, double 0.000000e+00>, double [[A:%.*]], i64 0
329; CHECK-NEXT:    [[TMP2:%.*]] = tail call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> [[TMP1]], <2 x double> [[TMP1]], i8 3)
330; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <2 x double> [[TMP2]], i64 0
331; CHECK-NEXT:    ret double [[TMP3]]
332;
333  %1 = insertelement <2 x double> zeroinitializer, double %a, i32 0
334  %2 = tail call <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double> %1, <2 x double> %1, i8 3)
335  %3 = extractelement <2 x double> %2, i32 0
336  ret double %3
337}
338
339define i32 @test_comieq_sd_0(double %a, double %b) {
340; CHECK-LABEL: @test_comieq_sd_0(
341; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x double> poison, double [[A:%.*]], i64 0
342; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0
343; CHECK-NEXT:    [[TMP3:%.*]] = tail call i32 @llvm.x86.sse2.comieq.sd(<2 x double> [[TMP1]], <2 x double> [[TMP2]])
344; CHECK-NEXT:    ret i32 [[TMP3]]
345;
346  %1 = insertelement <2 x double> poison, double %a, i32 0
347  %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1
348  %3 = insertelement <2 x double> poison, double %b, i32 0
349  %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1
350  %5 = tail call i32 @llvm.x86.sse2.comieq.sd(<2 x double> %2, <2 x double> %4)
351  ret i32 %5
352}
353
354define i32 @test_comige_sd_0(double %a, double %b) {
355; CHECK-LABEL: @test_comige_sd_0(
356; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x double> poison, double [[A:%.*]], i64 0
357; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0
358; CHECK-NEXT:    [[TMP3:%.*]] = tail call i32 @llvm.x86.sse2.comige.sd(<2 x double> [[TMP1]], <2 x double> [[TMP2]])
359; CHECK-NEXT:    ret i32 [[TMP3]]
360;
361  %1 = insertelement <2 x double> poison, double %a, i32 0
362  %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1
363  %3 = insertelement <2 x double> poison, double %b, i32 0
364  %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1
365  %5 = tail call i32 @llvm.x86.sse2.comige.sd(<2 x double> %2, <2 x double> %4)
366  ret i32 %5
367}
368
369define i32 @test_comigt_sd_0(double %a, double %b) {
370; CHECK-LABEL: @test_comigt_sd_0(
371; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x double> poison, double [[A:%.*]], i64 0
372; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0
373; CHECK-NEXT:    [[TMP3:%.*]] = tail call i32 @llvm.x86.sse2.comigt.sd(<2 x double> [[TMP1]], <2 x double> [[TMP2]])
374; CHECK-NEXT:    ret i32 [[TMP3]]
375;
376  %1 = insertelement <2 x double> poison, double %a, i32 0
377  %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1
378  %3 = insertelement <2 x double> poison, double %b, i32 0
379  %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1
380  %5 = tail call i32 @llvm.x86.sse2.comigt.sd(<2 x double> %2, <2 x double> %4)
381  ret i32 %5
382}
383
384define i32 @test_comile_sd_0(double %a, double %b) {
385; CHECK-LABEL: @test_comile_sd_0(
386; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x double> poison, double [[A:%.*]], i64 0
387; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0
388; CHECK-NEXT:    [[TMP3:%.*]] = tail call i32 @llvm.x86.sse2.comile.sd(<2 x double> [[TMP1]], <2 x double> [[TMP2]])
389; CHECK-NEXT:    ret i32 [[TMP3]]
390;
391  %1 = insertelement <2 x double> poison, double %a, i32 0
392  %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1
393  %3 = insertelement <2 x double> poison, double %b, i32 0
394  %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1
395  %5 = tail call i32 @llvm.x86.sse2.comile.sd(<2 x double> %2, <2 x double> %4)
396  ret i32 %5
397}
398
399define i32 @test_comilt_sd_0(double %a, double %b) {
400; CHECK-LABEL: @test_comilt_sd_0(
401; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x double> poison, double [[A:%.*]], i64 0
402; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0
403; CHECK-NEXT:    [[TMP3:%.*]] = tail call i32 @llvm.x86.sse2.comilt.sd(<2 x double> [[TMP1]], <2 x double> [[TMP2]])
404; CHECK-NEXT:    ret i32 [[TMP3]]
405;
406  %1 = insertelement <2 x double> poison, double %a, i32 0
407  %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1
408  %3 = insertelement <2 x double> poison, double %b, i32 0
409  %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1
410  %5 = tail call i32 @llvm.x86.sse2.comilt.sd(<2 x double> %2, <2 x double> %4)
411  ret i32 %5
412}
413
414define i32 @test_comineq_sd_0(double %a, double %b) {
415; CHECK-LABEL: @test_comineq_sd_0(
416; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x double> poison, double [[A:%.*]], i64 0
417; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0
418; CHECK-NEXT:    [[TMP3:%.*]] = tail call i32 @llvm.x86.sse2.comineq.sd(<2 x double> [[TMP1]], <2 x double> [[TMP2]])
419; CHECK-NEXT:    ret i32 [[TMP3]]
420;
421  %1 = insertelement <2 x double> poison, double %a, i32 0
422  %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1
423  %3 = insertelement <2 x double> poison, double %b, i32 0
424  %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1
425  %5 = tail call i32 @llvm.x86.sse2.comineq.sd(<2 x double> %2, <2 x double> %4)
426  ret i32 %5
427}
428
429define i32 @test_ucomieq_sd_0(double %a, double %b) {
430; CHECK-LABEL: @test_ucomieq_sd_0(
431; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x double> poison, double [[A:%.*]], i64 0
432; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0
433; CHECK-NEXT:    [[TMP3:%.*]] = tail call i32 @llvm.x86.sse2.ucomieq.sd(<2 x double> [[TMP1]], <2 x double> [[TMP2]])
434; CHECK-NEXT:    ret i32 [[TMP3]]
435;
436  %1 = insertelement <2 x double> poison, double %a, i32 0
437  %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1
438  %3 = insertelement <2 x double> poison, double %b, i32 0
439  %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1
440  %5 = tail call i32 @llvm.x86.sse2.ucomieq.sd(<2 x double> %2, <2 x double> %4)
441  ret i32 %5
442}
443
444define i32 @test_ucomige_sd_0(double %a, double %b) {
445; CHECK-LABEL: @test_ucomige_sd_0(
446; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x double> poison, double [[A:%.*]], i64 0
447; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0
448; CHECK-NEXT:    [[TMP3:%.*]] = tail call i32 @llvm.x86.sse2.ucomige.sd(<2 x double> [[TMP1]], <2 x double> [[TMP2]])
449; CHECK-NEXT:    ret i32 [[TMP3]]
450;
451  %1 = insertelement <2 x double> poison, double %a, i32 0
452  %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1
453  %3 = insertelement <2 x double> poison, double %b, i32 0
454  %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1
455  %5 = tail call i32 @llvm.x86.sse2.ucomige.sd(<2 x double> %2, <2 x double> %4)
456  ret i32 %5
457}
458
459define i32 @test_ucomigt_sd_0(double %a, double %b) {
460; CHECK-LABEL: @test_ucomigt_sd_0(
461; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x double> poison, double [[A:%.*]], i64 0
462; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0
463; CHECK-NEXT:    [[TMP3:%.*]] = tail call i32 @llvm.x86.sse2.ucomigt.sd(<2 x double> [[TMP1]], <2 x double> [[TMP2]])
464; CHECK-NEXT:    ret i32 [[TMP3]]
465;
466  %1 = insertelement <2 x double> poison, double %a, i32 0
467  %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1
468  %3 = insertelement <2 x double> poison, double %b, i32 0
469  %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1
470  %5 = tail call i32 @llvm.x86.sse2.ucomigt.sd(<2 x double> %2, <2 x double> %4)
471  ret i32 %5
472}
473
474define i32 @test_ucomile_sd_0(double %a, double %b) {
475; CHECK-LABEL: @test_ucomile_sd_0(
476; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x double> poison, double [[A:%.*]], i64 0
477; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0
478; CHECK-NEXT:    [[TMP3:%.*]] = tail call i32 @llvm.x86.sse2.ucomile.sd(<2 x double> [[TMP1]], <2 x double> [[TMP2]])
479; CHECK-NEXT:    ret i32 [[TMP3]]
480;
481  %1 = insertelement <2 x double> poison, double %a, i32 0
482  %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1
483  %3 = insertelement <2 x double> poison, double %b, i32 0
484  %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1
485  %5 = tail call i32 @llvm.x86.sse2.ucomile.sd(<2 x double> %2, <2 x double> %4)
486  ret i32 %5
487}
488
489define i32 @test_ucomilt_sd_0(double %a, double %b) {
490; CHECK-LABEL: @test_ucomilt_sd_0(
491; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x double> poison, double [[A:%.*]], i64 0
492; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0
493; CHECK-NEXT:    [[TMP3:%.*]] = tail call i32 @llvm.x86.sse2.ucomilt.sd(<2 x double> [[TMP1]], <2 x double> [[TMP2]])
494; CHECK-NEXT:    ret i32 [[TMP3]]
495;
496  %1 = insertelement <2 x double> poison, double %a, i32 0
497  %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1
498  %3 = insertelement <2 x double> poison, double %b, i32 0
499  %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1
500  %5 = tail call i32 @llvm.x86.sse2.ucomilt.sd(<2 x double> %2, <2 x double> %4)
501  ret i32 %5
502}
503
504define i32 @test_ucomineq_sd_0(double %a, double %b) {
505; CHECK-LABEL: @test_ucomineq_sd_0(
506; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <2 x double> poison, double [[A:%.*]], i64 0
507; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <2 x double> poison, double [[B:%.*]], i64 0
508; CHECK-NEXT:    [[TMP3:%.*]] = tail call i32 @llvm.x86.sse2.ucomineq.sd(<2 x double> [[TMP1]], <2 x double> [[TMP2]])
509; CHECK-NEXT:    ret i32 [[TMP3]]
510;
511  %1 = insertelement <2 x double> poison, double %a, i32 0
512  %2 = insertelement <2 x double> %1, double 1.000000e+00, i32 1
513  %3 = insertelement <2 x double> poison, double %b, i32 0
514  %4 = insertelement <2 x double> %3, double 2.000000e+00, i32 1
515  %5 = tail call i32 @llvm.x86.sse2.ucomineq.sd(<2 x double> %2, <2 x double> %4)
516  ret i32 %5
517}
518
519declare <2 x double> @llvm.x86.sse2.sqrt.sd(<2 x double>) nounwind readnone
520
521declare <2 x double> @llvm.x86.sse2.add.sd(<2 x double>, <2 x double>)
522declare <2 x double> @llvm.x86.sse2.sub.sd(<2 x double>, <2 x double>)
523declare <2 x double> @llvm.x86.sse2.mul.sd(<2 x double>, <2 x double>)
524declare <2 x double> @llvm.x86.sse2.div.sd(<2 x double>, <2 x double>)
525declare <2 x double> @llvm.x86.sse2.min.sd(<2 x double>, <2 x double>)
526declare <2 x double> @llvm.x86.sse2.max.sd(<2 x double>, <2 x double>)
527declare <2 x double> @llvm.x86.sse2.cmp.sd(<2 x double>, <2 x double>, i8)
528
529declare i32 @llvm.x86.sse2.comieq.sd(<2 x double>, <2 x double>)
530declare i32 @llvm.x86.sse2.comige.sd(<2 x double>, <2 x double>)
531declare i32 @llvm.x86.sse2.comigt.sd(<2 x double>, <2 x double>)
532declare i32 @llvm.x86.sse2.comile.sd(<2 x double>, <2 x double>)
533declare i32 @llvm.x86.sse2.comilt.sd(<2 x double>, <2 x double>)
534declare i32 @llvm.x86.sse2.comineq.sd(<2 x double>, <2 x double>)
535
536declare i32 @llvm.x86.sse2.ucomieq.sd(<2 x double>, <2 x double>)
537declare i32 @llvm.x86.sse2.ucomige.sd(<2 x double>, <2 x double>)
538declare i32 @llvm.x86.sse2.ucomigt.sd(<2 x double>, <2 x double>)
539declare i32 @llvm.x86.sse2.ucomile.sd(<2 x double>, <2 x double>)
540declare i32 @llvm.x86.sse2.ucomilt.sd(<2 x double>, <2 x double>)
541declare i32 @llvm.x86.sse2.ucomineq.sd(<2 x double>, <2 x double>)
542