1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse4.2 | FileCheck %s
3
4define double @test1(double %a, double %b, double %eps) {
5; CHECK-LABEL: test1:
6; CHECK:       # BB#0:
7; CHECK-NEXT:    cmpltsd %xmm2, %xmm0
8; CHECK-NEXT:    andps %xmm1, %xmm0
9; CHECK-NEXT:    retq
10;
11  %cmp = fcmp olt double %a, %eps
12  %cond = select i1 %cmp, double %b, double 0.000000e+00
13  ret double %cond
14}
15
16define double @test2(double %a, double %b, double %eps) {
17; CHECK-LABEL: test2:
18; CHECK:       # BB#0:
19; CHECK-NEXT:    cmplesd %xmm2, %xmm0
20; CHECK-NEXT:    andps %xmm1, %xmm0
21; CHECK-NEXT:    retq
22;
23  %cmp = fcmp ole double %a, %eps
24  %cond = select i1 %cmp, double %b, double 0.000000e+00
25  ret double %cond
26}
27
28define double @test3(double %a, double %b, double %eps) {
29; CHECK-LABEL: test3:
30; CHECK:       # BB#0:
31; CHECK-NEXT:    cmpltsd %xmm0, %xmm2
32; CHECK-NEXT:    andps %xmm1, %xmm2
33; CHECK-NEXT:    movaps %xmm2, %xmm0
34; CHECK-NEXT:    retq
35;
36  %cmp = fcmp ogt double %a, %eps
37  %cond = select i1 %cmp, double %b, double 0.000000e+00
38  ret double %cond
39}
40
41define double @test4(double %a, double %b, double %eps) {
42; CHECK-LABEL: test4:
43; CHECK:       # BB#0:
44; CHECK-NEXT:    cmplesd %xmm0, %xmm2
45; CHECK-NEXT:    andps %xmm1, %xmm2
46; CHECK-NEXT:    movaps %xmm2, %xmm0
47; CHECK-NEXT:    retq
48;
49  %cmp = fcmp oge double %a, %eps
50  %cond = select i1 %cmp, double %b, double 0.000000e+00
51  ret double %cond
52}
53
54define double @test5(double %a, double %b, double %eps) {
55; CHECK-LABEL: test5:
56; CHECK:       # BB#0:
57; CHECK-NEXT:    cmpltsd %xmm2, %xmm0
58; CHECK-NEXT:    andnps %xmm1, %xmm0
59; CHECK-NEXT:    retq
60;
61  %cmp = fcmp olt double %a, %eps
62  %cond = select i1 %cmp, double 0.000000e+00, double %b
63  ret double %cond
64}
65
66define double @test6(double %a, double %b, double %eps) {
67; CHECK-LABEL: test6:
68; CHECK:       # BB#0:
69; CHECK-NEXT:    cmplesd %xmm2, %xmm0
70; CHECK-NEXT:    andnps %xmm1, %xmm0
71; CHECK-NEXT:    retq
72;
73  %cmp = fcmp ole double %a, %eps
74  %cond = select i1 %cmp, double 0.000000e+00, double %b
75  ret double %cond
76}
77
78define double @test7(double %a, double %b, double %eps) {
79; CHECK-LABEL: test7:
80; CHECK:       # BB#0:
81; CHECK-NEXT:    cmpltsd %xmm0, %xmm2
82; CHECK-NEXT:    andnps %xmm1, %xmm2
83; CHECK-NEXT:    movaps %xmm2, %xmm0
84; CHECK-NEXT:    retq
85;
86  %cmp = fcmp ogt double %a, %eps
87  %cond = select i1 %cmp, double 0.000000e+00, double %b
88  ret double %cond
89}
90
91define double @test8(double %a, double %b, double %eps) {
92; CHECK-LABEL: test8:
93; CHECK:       # BB#0:
94; CHECK-NEXT:    cmplesd %xmm0, %xmm2
95; CHECK-NEXT:    andnps %xmm1, %xmm2
96; CHECK-NEXT:    movaps %xmm2, %xmm0
97; CHECK-NEXT:    retq
98;
99  %cmp = fcmp oge double %a, %eps
100  %cond = select i1 %cmp, double 0.000000e+00, double %b
101  ret double %cond
102}
103
104define float @test9(float %a, float %b, float %eps) {
105; CHECK-LABEL: test9:
106; CHECK:       # BB#0:
107; CHECK-NEXT:    cmpltss %xmm2, %xmm0
108; CHECK-NEXT:    andps %xmm1, %xmm0
109; CHECK-NEXT:    retq
110;
111  %cmp = fcmp olt float %a, %eps
112  %cond = select i1 %cmp, float %b, float 0.000000e+00
113  ret float %cond
114}
115
116define float @test10(float %a, float %b, float %eps) {
117; CHECK-LABEL: test10:
118; CHECK:       # BB#0:
119; CHECK-NEXT:    cmpless %xmm2, %xmm0
120; CHECK-NEXT:    andps %xmm1, %xmm0
121; CHECK-NEXT:    retq
122;
123  %cmp = fcmp ole float %a, %eps
124  %cond = select i1 %cmp, float %b, float 0.000000e+00
125  ret float %cond
126}
127
128define float @test11(float %a, float %b, float %eps) {
129; CHECK-LABEL: test11:
130; CHECK:       # BB#0:
131; CHECK-NEXT:    cmpltss %xmm0, %xmm2
132; CHECK-NEXT:    andps %xmm1, %xmm2
133; CHECK-NEXT:    movaps %xmm2, %xmm0
134; CHECK-NEXT:    retq
135;
136  %cmp = fcmp ogt float %a, %eps
137  %cond = select i1 %cmp, float %b, float 0.000000e+00
138  ret float %cond
139}
140
141define float @test12(float %a, float %b, float %eps) {
142; CHECK-LABEL: test12:
143; CHECK:       # BB#0:
144; CHECK-NEXT:    cmpless %xmm0, %xmm2
145; CHECK-NEXT:    andps %xmm1, %xmm2
146; CHECK-NEXT:    movaps %xmm2, %xmm0
147; CHECK-NEXT:    retq
148;
149  %cmp = fcmp oge float %a, %eps
150  %cond = select i1 %cmp, float %b, float 0.000000e+00
151  ret float %cond
152}
153
154define float @test13(float %a, float %b, float %eps) {
155; CHECK-LABEL: test13:
156; CHECK:       # BB#0:
157; CHECK-NEXT:    cmpltss %xmm2, %xmm0
158; CHECK-NEXT:    andnps %xmm1, %xmm0
159; CHECK-NEXT:    retq
160;
161  %cmp = fcmp olt float %a, %eps
162  %cond = select i1 %cmp, float 0.000000e+00, float %b
163  ret float %cond
164}
165
166define float @test14(float %a, float %b, float %eps) {
167; CHECK-LABEL: test14:
168; CHECK:       # BB#0:
169; CHECK-NEXT:    cmpless %xmm2, %xmm0
170; CHECK-NEXT:    andnps %xmm1, %xmm0
171; CHECK-NEXT:    retq
172;
173  %cmp = fcmp ole float %a, %eps
174  %cond = select i1 %cmp, float 0.000000e+00, float %b
175  ret float %cond
176}
177
178define float @test15(float %a, float %b, float %eps) {
179; CHECK-LABEL: test15:
180; CHECK:       # BB#0:
181; CHECK-NEXT:    cmpltss %xmm0, %xmm2
182; CHECK-NEXT:    andnps %xmm1, %xmm2
183; CHECK-NEXT:    movaps %xmm2, %xmm0
184; CHECK-NEXT:    retq
185;
186  %cmp = fcmp ogt float %a, %eps
187  %cond = select i1 %cmp, float 0.000000e+00, float %b
188  ret float %cond
189}
190
191define float @test16(float %a, float %b, float %eps) {
192; CHECK-LABEL: test16:
193; CHECK:       # BB#0:
194; CHECK-NEXT:    cmpless %xmm0, %xmm2
195; CHECK-NEXT:    andnps %xmm1, %xmm2
196; CHECK-NEXT:    movaps %xmm2, %xmm0
197; CHECK-NEXT:    retq
198;
199  %cmp = fcmp oge float %a, %eps
200  %cond = select i1 %cmp, float 0.000000e+00, float %b
201  ret float %cond
202}
203
204define float @test17(float %a, float %b, float %c, float %eps) {
205; CHECK-LABEL: test17:
206; CHECK:       # BB#0:
207; CHECK-NEXT:    cmpless %xmm0, %xmm3
208; CHECK-NEXT:    andps %xmm3, %xmm2
209; CHECK-NEXT:    andnps %xmm1, %xmm3
210; CHECK-NEXT:    orps %xmm2, %xmm3
211; CHECK-NEXT:    movaps %xmm3, %xmm0
212; CHECK-NEXT:    retq
213;
214  %cmp = fcmp oge float %a, %eps
215  %cond = select i1 %cmp, float %c, float %b
216  ret float %cond
217}
218
219define double @test18(double %a, double %b, double %c, double %eps) {
220; CHECK-LABEL: test18:
221; CHECK:       # BB#0:
222; CHECK-NEXT:    cmplesd %xmm0, %xmm3
223; CHECK-NEXT:    andps %xmm3, %xmm2
224; CHECK-NEXT:    andnps %xmm1, %xmm3
225; CHECK-NEXT:    orps %xmm2, %xmm3
226; CHECK-NEXT:    movaps %xmm3, %xmm0
227; CHECK-NEXT:    retq
228;
229  %cmp = fcmp oge double %a, %eps
230  %cond = select i1 %cmp, double %c, double %b
231  ret double %cond
232}
233
234