blob: 77b0999337c671d9f9605aac5b43164f6b2a0790 [file] [log] [blame]
Oliver Stannard51b1d462014-08-21 12:50:31 +00001; 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
Oliver Stannard37e4daa2014-10-01 09:02:17 +00003; RUN: llc < %s -mtriple=thumbv7-none-eabihf -mcpu=cortex-m7 | FileCheck %s -check-prefix=CHECK -check-prefix=HARD -check-prefix=DP
Oliver Stannard51b1d462014-08-21 12:50:31 +00004; RUN: llc < %s -mtriple=thumbv7-none-eabihf -mcpu=cortex-a8 | FileCheck %s -check-prefix=CHECK -check-prefix=HARD -check-prefix=DP
5
6
7
8define 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}
15define 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}
23define 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}
31define 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}
39define 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}
47define 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}
55define 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}
65define 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}
82define i1 @cmp_f_ugt(float %a, float %b) {
83; CHECK-LABEL: cmp_f_ugt:
Alexey Bataevb9288602015-07-15 08:39:35 +000084; NONE: bl __aeabi_fcmple
85; NONE: cmp r0, #0
86; NONE-NEXT: it eq
Oliver Stannard51b1d462014-08-21 12:50:31 +000087; HARD: vcmpe.f32
88; HARD: movhi r0, #1
89 %1 = fcmp ugt float %a, %b
90 ret i1 %1
91}
92define i1 @cmp_f_uge(float %a, float %b) {
93; CHECK-LABEL: cmp_f_uge:
Alexey Bataevb9288602015-07-15 08:39:35 +000094; NONE: bl __aeabi_fcmplt
95; NONE: cmp r0, #0
96; NONE-NEXT: it eq
Oliver Stannard51b1d462014-08-21 12:50:31 +000097; HARD: vcmpe.f32
98; HARD: movpl r0, #1
99 %1 = fcmp uge float %a, %b
100 ret i1 %1
101}
102define i1 @cmp_f_ult(float %a, float %b) {
103; CHECK-LABEL: cmp_f_ult:
Alexey Bataevb9288602015-07-15 08:39:35 +0000104; NONE: bl __aeabi_fcmpge
105; NONE: cmp r0, #0
106; NONE-NEXT: it eq
Oliver Stannard51b1d462014-08-21 12:50:31 +0000107; HARD: vcmpe.f32
108; HARD: movlt r0, #1
109 %1 = fcmp ult float %a, %b
110 ret i1 %1
111}
112define i1 @cmp_f_ule(float %a, float %b) {
113; CHECK-LABEL: cmp_f_ule:
Alexey Bataevb9288602015-07-15 08:39:35 +0000114; NONE: bl __aeabi_fcmpgt
115; NONE: cmp r0, #0
116; NONE-NEXT: it eq
Oliver Stannard51b1d462014-08-21 12:50:31 +0000117; HARD: vcmpe.f32
118; HARD: movle r0, #1
119 %1 = fcmp ule float %a, %b
120 ret i1 %1
121}
122define i1 @cmp_f_une(float %a, float %b) {
123; CHECK-LABEL: cmp_f_une:
124; NONE: bl __aeabi_fcmpeq
125; HARD: vcmpe.f32
126; HARD: movne r0, #1
127 %1 = fcmp une float %a, %b
128 ret i1 %1
129}
130define i1 @cmp_f_uno(float %a, float %b) {
131; CHECK-LABEL: cmp_f_uno:
132; NONE: bl __aeabi_fcmpun
133; HARD: vcmpe.f32
134; HARD: movvs r0, #1
135 %1 = fcmp uno float %a, %b
136 ret i1 %1
137}
138define i1 @cmp_f_true(float %a, float %b) {
139; CHECK-LABEL: cmp_f_true:
140; NONE: movs r0, #1
141; HARD: movs r0, #1
142 %1 = fcmp true float %a, %b
143 ret i1 %1
144}
145
146define i1 @cmp_d_false(double %a, double %b) {
147; CHECK-LABEL: cmp_d_false:
148; NONE: movs r0, #0
149; HARD: movs r0, #0
150 %1 = fcmp false double %a, %b
151 ret i1 %1
152}
153define i1 @cmp_d_oeq(double %a, double %b) {
154; CHECK-LABEL: cmp_d_oeq:
155; NONE: bl __aeabi_dcmpeq
156; SP: bl __aeabi_dcmpeq
157; DP: vcmpe.f64
158; DP: moveq r0, #1
159 %1 = fcmp oeq double %a, %b
160 ret i1 %1
161}
162define i1 @cmp_d_ogt(double %a, double %b) {
163; CHECK-LABEL: cmp_d_ogt:
164; NONE: bl __aeabi_dcmpgt
165; SP: bl __aeabi_dcmpgt
166; DP: vcmpe.f64
167; DP: movgt r0, #1
168 %1 = fcmp ogt double %a, %b
169 ret i1 %1
170}
171define i1 @cmp_d_oge(double %a, double %b) {
172; CHECK-LABEL: cmp_d_oge:
173; NONE: bl __aeabi_dcmpge
174; SP: bl __aeabi_dcmpge
175; DP: vcmpe.f64
176; DP: movge r0, #1
177 %1 = fcmp oge double %a, %b
178 ret i1 %1
179}
180define i1 @cmp_d_olt(double %a, double %b) {
181; CHECK-LABEL: cmp_d_olt:
182; NONE: bl __aeabi_dcmplt
183; SP: bl __aeabi_dcmplt
184; DP: vcmpe.f64
185; DP: movmi r0, #1
186 %1 = fcmp olt double %a, %b
187 ret i1 %1
188}
189define i1 @cmp_d_ole(double %a, double %b) {
190; CHECK-LABEL: cmp_d_ole:
191; NONE: bl __aeabi_dcmple
192; SP: bl __aeabi_dcmple
193; DP: vcmpe.f64
194; DP: movls r0, #1
195 %1 = fcmp ole double %a, %b
196 ret i1 %1
197}
198define i1 @cmp_d_one(double %a, double %b) {
199; CHECK-LABEL: cmp_d_one:
200; NONE: bl __aeabi_dcmpgt
201; NONE: bl __aeabi_dcmplt
202; SP: bl __aeabi_dcmpgt
203; SP: bl __aeabi_dcmplt
204; DP: vcmpe.f64
205; DP: movmi r0, #1
206; DP: movgt r0, #1
207 %1 = fcmp one double %a, %b
208 ret i1 %1
209}
210define i1 @cmp_d_ord(double %a, double %b) {
211; CHECK-LABEL: cmp_d_ord:
212; NONE: bl __aeabi_dcmpun
213; SP: bl __aeabi_dcmpun
214; DP: vcmpe.f64
215; DP: movvc r0, #1
216 %1 = fcmp ord double %a, %b
217 ret i1 %1
218}
219define i1 @cmp_d_ugt(double %a, double %b) {
220; CHECK-LABEL: cmp_d_ugt:
Alexey Bataevb9288602015-07-15 08:39:35 +0000221; NONE: bl __aeabi_dcmple
222; SP: bl __aeabi_dcmple
Oliver Stannard51b1d462014-08-21 12:50:31 +0000223; DP: vcmpe.f64
224; DP: movhi r0, #1
225 %1 = fcmp ugt double %a, %b
226 ret i1 %1
227}
228
229define i1 @cmp_d_ult(double %a, double %b) {
230; CHECK-LABEL: cmp_d_ult:
Alexey Bataevb9288602015-07-15 08:39:35 +0000231; NONE: bl __aeabi_dcmpge
232; SP: bl __aeabi_dcmpge
Oliver Stannard51b1d462014-08-21 12:50:31 +0000233; DP: vcmpe.f64
234; DP: movlt r0, #1
235 %1 = fcmp ult double %a, %b
236 ret i1 %1
237}
238
239
240define 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}
249define 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}
256define 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
269define i1 @cmp_d_uge(double %a, double %b) {
270; CHECK-LABEL: cmp_d_uge:
Alexey Bataevb9288602015-07-15 08:39:35 +0000271; NONE: bl __aeabi_dcmplt
272; SP: bl __aeabi_dcmplt
Oliver Stannard51b1d462014-08-21 12:50:31 +0000273; DP: vcmpe.f64
274; DP: movpl r0, #1
275 %1 = fcmp uge double %a, %b
276 ret i1 %1
277}
278
279define i1 @cmp_d_ule(double %a, double %b) {
280; CHECK-LABEL: cmp_d_ule:
Alexey Bataevb9288602015-07-15 08:39:35 +0000281; NONE: bl __aeabi_dcmpgt
282; SP: bl __aeabi_dcmpgt
Oliver Stannard51b1d462014-08-21 12:50:31 +0000283; DP: vcmpe.f64
284; DP: movle r0, #1
285 %1 = fcmp ule double %a, %b
286 ret i1 %1
287}
288
289define i1 @cmp_d_une(double %a, double %b) {
290; CHECK-LABEL: cmp_d_une:
291; NONE: bl __aeabi_dcmpeq
292; SP: bl __aeabi_dcmpeq
293; DP: vcmpe.f64
294; DP: movne r0, #1
295 %1 = fcmp une double %a, %b
296 ret i1 %1
297}