Reapply "R600: Add new intrinsic to read work dimensions"
[oota-llvm.git] / test / CodeGen / Thumb2 / float-cmp.ll
1 ; RUN: llc < %s -mtriple=thumbv7-none-eabi   -mcpu=cortex-m3 | FileCheck %s -check-prefix=CHECK -check-prefix=NONE
2 ; RUN: llc < %s -mtriple=thumbv7-none-eabihf -mcpu=cortex-m4 | FileCheck %s -check-prefix=CHECK -check-prefix=HARD -check-prefix=SP
3 ; RUN: llc < %s -mtriple=thumbv7-none-eabihf -mcpu=cortex-m7 | FileCheck %s -check-prefix=CHECK -check-prefix=HARD -check-prefix=DP
4 ; RUN: llc < %s -mtriple=thumbv7-none-eabihf -mcpu=cortex-a8 | FileCheck %s -check-prefix=CHECK -check-prefix=HARD -check-prefix=DP
5
6
7
8 define i1 @cmp_f_false(float %a, float %b) {
9 ; CHECK-LABEL: cmp_f_false:
10 ; NONE: movs r0, #0
11 ; HARD: movs r0, #0
12   %1 = fcmp false float %a, %b
13   ret i1 %1
14 }
15 define i1 @cmp_f_oeq(float %a, float %b) {
16 ; CHECK-LABEL: cmp_f_oeq:
17 ; NONE: bl __aeabi_fcmpeq
18 ; HARD: vcmpe.f32
19 ; HARD: moveq r0, #1
20   %1 = fcmp oeq float %a, %b
21   ret i1 %1
22 }
23 define i1 @cmp_f_ogt(float %a, float %b) {
24 ; CHECK-LABEL: cmp_f_ogt:
25 ; NONE: bl __aeabi_fcmpgt
26 ; HARD: vcmpe.f32
27 ; HARD: movgt r0, #1
28   %1 = fcmp ogt float %a, %b
29   ret i1 %1
30 }
31 define i1 @cmp_f_oge(float %a, float %b) {
32 ; CHECK-LABEL: cmp_f_oge:
33 ; NONE: bl __aeabi_fcmpge
34 ; HARD: vcmpe.f32
35 ; HARD: movge r0, #1
36   %1 = fcmp oge float %a, %b
37   ret i1 %1
38 }
39 define i1 @cmp_f_olt(float %a, float %b) {
40 ; CHECK-LABEL: cmp_f_olt:
41 ; NONE: bl __aeabi_fcmplt
42 ; HARD: vcmpe.f32
43 ; HARD: movmi r0, #1
44   %1 = fcmp olt float %a, %b
45   ret i1 %1
46 }
47 define i1 @cmp_f_ole(float %a, float %b) {
48 ; CHECK-LABEL: cmp_f_ole:
49 ; NONE: bl __aeabi_fcmple
50 ; HARD: vcmpe.f32
51 ; HARD: movls r0, #1
52   %1 = fcmp ole float %a, %b
53   ret i1 %1
54 }
55 define i1 @cmp_f_one(float %a, float %b) {
56 ; CHECK-LABEL: cmp_f_one:
57 ; NONE: bl __aeabi_fcmpgt
58 ; NONE: bl __aeabi_fcmplt
59 ; HARD: vcmpe.f32
60 ; HARD: movmi r0, #1
61 ; HARD: movgt r0, #1
62   %1 = fcmp one float %a, %b
63   ret i1 %1
64 }
65 define i1 @cmp_f_ord(float %a, float %b) {
66 ; CHECK-LABEL: cmp_f_ord:
67 ; NONE: bl __aeabi_fcmpun
68 ; HARD: vcmpe.f32
69 ; HARD: movvc r0, #1
70   %1 = fcmp ord float %a, %b
71   ret i1 %1
72 }define i1 @cmp_f_ueq(float %a, float %b) {
73 ; CHECK-LABEL: cmp_f_ueq:
74 ; NONE: bl __aeabi_fcmpeq
75 ; NONE: bl __aeabi_fcmpun
76 ; HARD: vcmpe.f32
77 ; HARD: moveq r0, #1
78 ; HARD: movvs r0, #1
79   %1 = fcmp ueq float %a, %b
80   ret i1 %1
81 }
82 define i1 @cmp_f_ugt(float %a, float %b) {
83 ; CHECK-LABEL: cmp_f_ugt:
84 ; NONE: bl __aeabi_fcmpgt
85 ; NONE: bl __aeabi_fcmpun
86 ; HARD: vcmpe.f32
87 ; HARD: movhi r0, #1
88   %1 = fcmp ugt float %a, %b
89   ret i1 %1
90 }
91 define i1 @cmp_f_uge(float %a, float %b) {
92 ; CHECK-LABEL: cmp_f_uge:
93 ; NONE: bl __aeabi_fcmpge
94 ; NONE: bl __aeabi_fcmpun
95 ; HARD: vcmpe.f32
96 ; HARD: movpl r0, #1
97   %1 = fcmp uge float %a, %b
98   ret i1 %1
99 }
100 define i1 @cmp_f_ult(float %a, float %b) {
101 ; CHECK-LABEL: cmp_f_ult:
102 ; NONE: bl __aeabi_fcmplt
103 ; NONE: bl __aeabi_fcmpun
104 ; HARD: vcmpe.f32
105 ; HARD: movlt r0, #1
106   %1 = fcmp ult float %a, %b
107   ret i1 %1
108 }
109 define i1 @cmp_f_ule(float %a, float %b) {
110 ; CHECK-LABEL: cmp_f_ule:
111 ; NONE: bl __aeabi_fcmple
112 ; NONE: bl __aeabi_fcmpun
113 ; HARD: vcmpe.f32
114 ; HARD: movle r0, #1
115   %1 = fcmp ule float %a, %b
116   ret i1 %1
117 }
118 define i1 @cmp_f_une(float %a, float %b) {
119 ; CHECK-LABEL: cmp_f_une:
120 ; NONE: bl __aeabi_fcmpeq
121 ; HARD: vcmpe.f32
122 ; HARD: movne r0, #1
123   %1 = fcmp une float %a, %b
124   ret i1 %1
125 }
126 define i1 @cmp_f_uno(float %a, float %b) {
127 ; CHECK-LABEL: cmp_f_uno:
128 ; NONE: bl __aeabi_fcmpun
129 ; HARD: vcmpe.f32
130 ; HARD: movvs r0, #1
131   %1 = fcmp uno float %a, %b
132   ret i1 %1
133 }
134 define i1 @cmp_f_true(float %a, float %b) {
135 ; CHECK-LABEL: cmp_f_true:
136 ; NONE: movs r0, #1
137 ; HARD: movs r0, #1
138   %1 = fcmp true float %a, %b
139   ret i1 %1
140 }
141
142 define i1 @cmp_d_false(double %a, double %b) {
143 ; CHECK-LABEL: cmp_d_false:
144 ; NONE: movs r0, #0
145 ; HARD: movs r0, #0
146   %1 = fcmp false double %a, %b
147   ret i1 %1
148 }
149 define i1 @cmp_d_oeq(double %a, double %b) {
150 ; CHECK-LABEL: cmp_d_oeq:
151 ; NONE: bl __aeabi_dcmpeq
152 ; SP: bl __aeabi_dcmpeq
153 ; DP: vcmpe.f64
154 ; DP: moveq r0, #1
155   %1 = fcmp oeq double %a, %b
156   ret i1 %1
157 }
158 define i1 @cmp_d_ogt(double %a, double %b) {
159 ; CHECK-LABEL: cmp_d_ogt:
160 ; NONE: bl __aeabi_dcmpgt
161 ; SP: bl __aeabi_dcmpgt
162 ; DP: vcmpe.f64
163 ; DP: movgt r0, #1
164   %1 = fcmp ogt double %a, %b
165   ret i1 %1
166 }
167 define i1 @cmp_d_oge(double %a, double %b) {
168 ; CHECK-LABEL: cmp_d_oge:
169 ; NONE: bl __aeabi_dcmpge
170 ; SP: bl __aeabi_dcmpge
171 ; DP: vcmpe.f64
172 ; DP: movge r0, #1
173   %1 = fcmp oge double %a, %b
174   ret i1 %1
175 }
176 define i1 @cmp_d_olt(double %a, double %b) {
177 ; CHECK-LABEL: cmp_d_olt:
178 ; NONE: bl __aeabi_dcmplt
179 ; SP: bl __aeabi_dcmplt
180 ; DP: vcmpe.f64
181 ; DP: movmi r0, #1
182   %1 = fcmp olt double %a, %b
183   ret i1 %1
184 }
185 define i1 @cmp_d_ole(double %a, double %b) {
186 ; CHECK-LABEL: cmp_d_ole:
187 ; NONE: bl __aeabi_dcmple
188 ; SP: bl __aeabi_dcmple
189 ; DP: vcmpe.f64
190 ; DP: movls r0, #1
191   %1 = fcmp ole double %a, %b
192   ret i1 %1
193 }
194 define i1 @cmp_d_one(double %a, double %b) {
195 ; CHECK-LABEL: cmp_d_one:
196 ; NONE: bl __aeabi_dcmpgt
197 ; NONE: bl __aeabi_dcmplt
198 ; SP: bl __aeabi_dcmpgt
199 ; SP: bl __aeabi_dcmplt
200 ; DP: vcmpe.f64
201 ; DP: movmi r0, #1
202 ; DP: movgt r0, #1
203   %1 = fcmp one double %a, %b
204   ret i1 %1
205 }
206 define i1 @cmp_d_ord(double %a, double %b) {
207 ; CHECK-LABEL: cmp_d_ord:
208 ; NONE: bl __aeabi_dcmpun
209 ; SP: bl __aeabi_dcmpun
210 ; DP: vcmpe.f64
211 ; DP: movvc r0, #1
212   %1 = fcmp ord double %a, %b
213   ret i1 %1
214 }
215 define i1 @cmp_d_ugt(double %a, double %b) {
216 ; CHECK-LABEL: cmp_d_ugt:
217 ; NONE: bl __aeabi_dcmpgt
218 ; NONE: bl __aeabi_dcmpun
219 ; SP: bl __aeabi_dcmpgt
220 ; SP: bl __aeabi_dcmpun
221 ; DP: vcmpe.f64
222 ; DP: movhi r0, #1
223   %1 = fcmp ugt double %a, %b
224   ret i1 %1
225 }
226
227 define i1 @cmp_d_ult(double %a, double %b) {
228 ; CHECK-LABEL: cmp_d_ult:
229 ; NONE: bl __aeabi_dcmplt
230 ; NONE: bl __aeabi_dcmpun
231 ; SP: bl __aeabi_dcmplt
232 ; SP: bl __aeabi_dcmpun
233 ; DP: vcmpe.f64
234 ; DP: movlt r0, #1
235   %1 = fcmp ult double %a, %b
236   ret i1 %1
237 }
238
239
240 define i1 @cmp_d_uno(double %a, double %b) {
241 ; CHECK-LABEL: cmp_d_uno:
242 ; NONE: bl __aeabi_dcmpun
243 ; SP: bl __aeabi_dcmpun
244 ; DP: vcmpe.f64
245 ; DP: movvs r0, #1
246   %1 = fcmp uno double %a, %b
247   ret i1 %1
248 }
249 define i1 @cmp_d_true(double %a, double %b) {
250 ; CHECK-LABEL: cmp_d_true:
251 ; NONE: movs r0, #1
252 ; HARD: movs r0, #1
253   %1 = fcmp true double %a, %b
254   ret i1 %1
255 }
256 define i1 @cmp_d_ueq(double %a, double %b) {
257 ; CHECK-LABEL: cmp_d_ueq:
258 ; NONE: bl __aeabi_dcmpeq
259 ; NONE: bl __aeabi_dcmpun
260 ; SP: bl __aeabi_dcmpeq
261 ; SP: bl __aeabi_dcmpun
262 ; DP: vcmpe.f64
263 ; DP: moveq r0, #1
264 ; DP: movvs r0, #1
265   %1 = fcmp ueq double %a, %b
266   ret i1 %1
267 }
268
269 define i1 @cmp_d_uge(double %a, double %b) {
270 ; CHECK-LABEL: cmp_d_uge:
271 ; NONE: bl __aeabi_dcmpge
272 ; NONE: bl __aeabi_dcmpun
273 ; SP: bl __aeabi_dcmpge
274 ; SP: bl __aeabi_dcmpun
275 ; DP: vcmpe.f64
276 ; DP: movpl r0, #1
277   %1 = fcmp uge double %a, %b
278   ret i1 %1
279 }
280
281 define i1 @cmp_d_ule(double %a, double %b) {
282 ; CHECK-LABEL: cmp_d_ule:
283 ; NONE: bl __aeabi_dcmple
284 ; NONE: bl __aeabi_dcmpun
285 ; SP: bl __aeabi_dcmple
286 ; SP: bl __aeabi_dcmpun
287 ; DP: vcmpe.f64
288 ; DP: movle r0, #1
289   %1 = fcmp ule double %a, %b
290   ret i1 %1
291 }
292
293 define i1 @cmp_d_une(double %a, double %b) {
294 ; CHECK-LABEL: cmp_d_une:
295 ; NONE: bl __aeabi_dcmpeq
296 ; SP: bl __aeabi_dcmpeq
297 ; DP: vcmpe.f64
298 ; DP: movne r0, #1
299   %1 = fcmp une double %a, %b
300   ret i1 %1
301 }