Skip to content

Commit 2d8f137

Browse files
authored
Merge pull request #227 from paoloteti/softfloat
Fix __aeabi_fcmple and add test cases
2 parents 1129b62 + 73884ae commit 2d8f137

File tree

2 files changed

+93
-1
lines changed

2 files changed

+93
-1
lines changed

src/float/cmp.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ intrinsics! {
174174
#[cfg(target_arch = "arm")]
175175
intrinsics! {
176176
pub extern "aapcs" fn __aeabi_fcmple(a: f32, b: f32) -> i32 {
177-
(__lesf2(a, b) < 0) as i32
177+
(__lesf2(a, b) <= 0) as i32
178178
}
179179

180180
pub extern "aapcs" fn __aeabi_fcmpge(a: f32, b: f32) -> i32 {

testcrate/build.rs

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,98 @@ fn main() {
121121
},
122122
"compiler_builtins::float::cmp::__lesf2(a, b)");
123123

124+
if target_arch_arm {
125+
gen(|(a, b): (MyF32, MyF32)| {
126+
if a.0.is_nan() || b.0.is_nan() {
127+
return None;
128+
}
129+
let c = (a.0 <= b.0) as i32;
130+
Some(c)
131+
},
132+
"compiler_builtins::float::cmp::__aeabi_fcmple(a, b)");
133+
134+
gen(|(a, b): (MyF32, MyF32)| {
135+
if a.0.is_nan() || b.0.is_nan() {
136+
return None;
137+
}
138+
let c = (a.0 >= b.0) as i32;
139+
Some(c)
140+
},
141+
"compiler_builtins::float::cmp::__aeabi_fcmpge(a, b)");
142+
143+
gen(|(a, b): (MyF32, MyF32)| {
144+
if a.0.is_nan() || b.0.is_nan() {
145+
return None;
146+
}
147+
let c = (a.0 == b.0) as i32;
148+
Some(c)
149+
},
150+
"compiler_builtins::float::cmp::__aeabi_fcmpeq(a, b)");
151+
152+
gen(|(a, b): (MyF32, MyF32)| {
153+
if a.0.is_nan() || b.0.is_nan() {
154+
return None;
155+
}
156+
let c = (a.0 < b.0) as i32;
157+
Some(c)
158+
},
159+
"compiler_builtins::float::cmp::__aeabi_fcmplt(a, b)");
160+
161+
gen(|(a, b): (MyF32, MyF32)| {
162+
if a.0.is_nan() || b.0.is_nan() {
163+
return None;
164+
}
165+
let c = (a.0 > b.0) as i32;
166+
Some(c)
167+
},
168+
"compiler_builtins::float::cmp::__aeabi_fcmpgt(a, b)");
169+
170+
gen(|(a, b): (MyF64, MyF64)| {
171+
if a.0.is_nan() || b.0.is_nan() {
172+
return None;
173+
}
174+
let c = (a.0 <= b.0) as i32;
175+
Some(c)
176+
},
177+
"compiler_builtins::float::cmp::__aeabi_dcmple(a, b)");
178+
179+
gen(|(a, b): (MyF64, MyF64)| {
180+
if a.0.is_nan() || b.0.is_nan() {
181+
return None;
182+
}
183+
let c = (a.0 >= b.0) as i32;
184+
Some(c)
185+
},
186+
"compiler_builtins::float::cmp::__aeabi_dcmpge(a, b)");
187+
188+
gen(|(a, b): (MyF64, MyF64)| {
189+
if a.0.is_nan() || b.0.is_nan() {
190+
return None;
191+
}
192+
let c = (a.0 == b.0) as i32;
193+
Some(c)
194+
},
195+
"compiler_builtins::float::cmp::__aeabi_dcmpeq(a, b)");
196+
197+
gen(|(a, b): (MyF64, MyF64)| {
198+
if a.0.is_nan() || b.0.is_nan() {
199+
return None;
200+
}
201+
let c = (a.0 < b.0) as i32;
202+
Some(c)
203+
},
204+
"compiler_builtins::float::cmp::__aeabi_dcmplt(a, b)");
205+
206+
gen(|(a, b): (MyF64, MyF64)| {
207+
if a.0.is_nan() || b.0.is_nan() {
208+
return None;
209+
}
210+
let c = (a.0 > b.0) as i32;
211+
Some(c)
212+
},
213+
"compiler_builtins::float::cmp::__aeabi_dcmpgt(a, b)");
214+
}
215+
124216
// float/conv.rs
125217
gen(|a: MyF64| i64(a.0).ok(),
126218
"compiler_builtins::float::conv::__fixdfdi(a)");

0 commit comments

Comments
 (0)