ARM64: initial backend import
[oota-llvm.git] / test / CodeGen / ARM64 / fcmp-opt.ll
1 ; RUN: llc < %s -march=arm64 -mcpu=cyclone | FileCheck %s
2 ; rdar://10263824
3
4 define i1 @fcmp_float1(float %a) nounwind ssp {
5 entry:
6 ; CHECK: @fcmp_float1
7 ; CHECK: fcmp s0, #0.0
8 ; CHECK: csinc w0, wzr, wzr, eq
9   %cmp = fcmp une float %a, 0.000000e+00
10   ret i1 %cmp
11 }
12
13 define i1 @fcmp_float2(float %a, float %b) nounwind ssp {
14 entry:
15 ; CHECK: @fcmp_float2
16 ; CHECK: fcmp s0, s1
17 ; CHECK: csinc w0, wzr, wzr, eq
18   %cmp = fcmp une float %a, %b
19   ret i1 %cmp
20 }
21
22 define i1 @fcmp_double1(double %a) nounwind ssp {
23 entry:
24 ; CHECK: @fcmp_double1
25 ; CHECK: fcmp d0, #0.0
26 ; CHECK: csinc w0, wzr, wzr, eq
27   %cmp = fcmp une double %a, 0.000000e+00
28   ret i1 %cmp
29 }
30
31 define i1 @fcmp_double2(double %a, double %b) nounwind ssp {
32 entry:
33 ; CHECK: @fcmp_double2
34 ; CHECK: fcmp d0, d1
35 ; CHECK: csinc w0, wzr, wzr, eq
36   %cmp = fcmp une double %a, %b
37   ret i1 %cmp
38 }
39
40 ; Check each fcmp condition
41 define float @fcmp_oeq(float %a, float %b) nounwind ssp {
42 ; CHECK: @fcmp_oeq
43 ; CHECK: fcmp s0, s1
44 ; CHECK: csinc w{{[0-9]+}}, wzr, wzr, ne
45   %cmp = fcmp oeq float %a, %b
46   %conv = uitofp i1 %cmp to float
47   ret float %conv
48 }
49
50 define float @fcmp_ogt(float %a, float %b) nounwind ssp {
51 ; CHECK: @fcmp_ogt
52 ; CHECK: fcmp s0, s1
53 ; CHECK: csinc w{{[0-9]+}}, wzr, wzr, le
54   %cmp = fcmp ogt float %a, %b
55   %conv = uitofp i1 %cmp to float
56   ret float %conv
57 }
58
59 define float @fcmp_oge(float %a, float %b) nounwind ssp {
60 ; CHECK: @fcmp_oge
61 ; CHECK: fcmp s0, s1
62 ; CHECK: csinc w{{[0-9]+}}, wzr, wzr, lt
63   %cmp = fcmp oge float %a, %b
64   %conv = uitofp i1 %cmp to float
65   ret float %conv
66 }
67
68 define float @fcmp_olt(float %a, float %b) nounwind ssp {
69 ; CHECK: @fcmp_olt
70 ; CHECK: fcmp s0, s1
71 ; CHECK: csinc w{{[0-9]+}}, wzr, wzr, pl
72   %cmp = fcmp olt float %a, %b
73   %conv = uitofp i1 %cmp to float
74   ret float %conv
75 }
76
77 define float @fcmp_ole(float %a, float %b) nounwind ssp {
78 ; CHECK: @fcmp_ole
79 ; CHECK: fcmp s0, s1
80 ; CHECK: csinc w{{[0-9]+}}, wzr, wzr, hi
81   %cmp = fcmp ole float %a, %b
82   %conv = uitofp i1 %cmp to float
83   ret float %conv
84 }
85
86 define float @fcmp_ord(float %a, float %b) nounwind ssp {
87 ; CHECK: @fcmp_ord
88 ; CHECK: fcmp s0, s1
89 ; CHECK: csinc w{{[0-9]+}}, wzr, wzr, vs
90   %cmp = fcmp ord float %a, %b
91   %conv = uitofp i1 %cmp to float
92   ret float %conv
93 }
94
95 define float @fcmp_uno(float %a, float %b) nounwind ssp {
96 ; CHECK: @fcmp_uno
97 ; CHECK: fcmp s0, s1
98 ; CHECK: csinc w{{[0-9]+}}, wzr, wzr, vc
99   %cmp = fcmp uno float %a, %b
100   %conv = uitofp i1 %cmp to float
101   ret float %conv
102 }
103
104 define float @fcmp_ugt(float %a, float %b) nounwind ssp {
105 ; CHECK: @fcmp_ugt
106 ; CHECK: fcmp s0, s1
107 ; CHECK: csinc w{{[0-9]+}}, wzr, wzr, ls
108   %cmp = fcmp ugt float %a, %b
109   %conv = uitofp i1 %cmp to float
110   ret float %conv
111 }
112
113 define float @fcmp_uge(float %a, float %b) nounwind ssp {
114 ; CHECK: @fcmp_uge
115 ; CHECK: fcmp s0, s1
116 ; CHECK: csinc w{{[0-9]+}}, wzr, wzr, mi
117   %cmp = fcmp uge float %a, %b
118   %conv = uitofp i1 %cmp to float
119   ret float %conv
120 }
121
122 define float @fcmp_ult(float %a, float %b) nounwind ssp {
123 ; CHECK: @fcmp_ult
124 ; CHECK: fcmp s0, s1
125 ; CHECK: csinc w{{[0-9]+}}, wzr, wzr, ge
126   %cmp = fcmp ult float %a, %b
127   %conv = uitofp i1 %cmp to float
128   ret float %conv
129 }
130
131 define float @fcmp_ule(float %a, float %b) nounwind ssp {
132 ; CHECK: @fcmp_ule
133 ; CHECK: fcmp s0, s1
134 ; CHECK: csinc w{{[0-9]+}}, wzr, wzr, gt
135   %cmp = fcmp ule float %a, %b
136   %conv = uitofp i1 %cmp to float
137   ret float %conv
138 }
139
140 define float @fcmp_une(float %a, float %b) nounwind ssp {
141 ; CHECK: @fcmp_une
142 ; CHECK: fcmp s0, s1
143 ; CHECK: csinc w{{[0-9]+}}, wzr, wzr, eq
144   %cmp = fcmp une float %a, %b
145   %conv = uitofp i1 %cmp to float
146   ret float %conv
147 }
148
149 ; Possible opportunity for improvement.  See comment in
150 ; ARM64TargetLowering::LowerSETCC()
151 define float @fcmp_one(float %a, float %b) nounwind ssp {
152 ; CHECK: @fcmp_one
153 ;       fcmp    s0, s1
154 ;       orr     w0, wzr, #0x1
155 ;       csel    w1, w0, wzr, mi
156 ;       csel    w0, w0, wzr, gt
157   %cmp = fcmp one float %a, %b
158   %conv = uitofp i1 %cmp to float
159   ret float %conv
160 }
161
162 ; Possible opportunity for improvement.  See comment in
163 ; ARM64TargetLowering::LowerSETCC()
164 define float @fcmp_ueq(float %a, float %b) nounwind ssp {
165 ; CHECK: @fcmp_ueq
166 ; CHECK: fcmp s0, s1
167 ;        orr w0, wzr, #0x1
168 ; CHECK: csel [[REG1:w[0-9]]], [[REG2:w[0-9]+]], wzr, eq
169 ; CHECK: csel {{w[0-9]+}}, [[REG2]], [[REG1]], vs
170   %cmp = fcmp ueq float %a, %b
171   %conv = uitofp i1 %cmp to float
172   ret float %conv
173 }