Collection of VFP intrinsics
Nothing really exciting here. LLVM on hard-float target use native instructions for all listed VFP intrinsics and so resulting implementation is really trivial. Implemented intrinsics: __gesf2vfp __gedf2vfp __gtsf2vfp __gtdf2vfp __ltsf2vfp __ltdf2vfp __nesf2vfp __nedf2vfp __eqsf2vfp __eqdf2vfp __extendsfdf2vfp
This commit is contained in:
@@ -212,4 +212,47 @@ intrinsics! {
|
||||
pub extern "aapcs" fn __aeabi_dcmpgt(a: f64, b: f64) -> i32 {
|
||||
(__gtdf2(a, b) > 0) as i32
|
||||
}
|
||||
|
||||
// On hard-float targets LLVM will use native instructions
|
||||
// for all VFP intrinsics below
|
||||
|
||||
pub extern "C" fn __gesf2vfp(a: f32, b: f32) -> i32 {
|
||||
(a >= b) as i32
|
||||
}
|
||||
|
||||
pub extern "C" fn __gedf2vfp(a: f64, b: f64) -> i32 {
|
||||
(a >= b) as i32
|
||||
}
|
||||
|
||||
pub extern "C" fn __gtsf2vfp(a: f32, b: f32) -> i32 {
|
||||
(a > b) as i32
|
||||
}
|
||||
|
||||
pub extern "C" fn __gtdf2vfp(a: f64, b: f64) -> i32 {
|
||||
(a > b) as i32
|
||||
}
|
||||
|
||||
pub extern "C" fn __ltsf2vfp(a: f32, b: f32) -> i32 {
|
||||
(a < b) as i32
|
||||
}
|
||||
|
||||
pub extern "C" fn __ltdf2vfp(a: f64, b: f64) -> i32 {
|
||||
(a < b) as i32
|
||||
}
|
||||
|
||||
pub extern "C" fn __nesf2vfp(a: f32, b: f32) -> i32 {
|
||||
(a != b) as i32
|
||||
}
|
||||
|
||||
pub extern "C" fn __nedf2vfp(a: f64, b: f64) -> i32 {
|
||||
(a != b) as i32
|
||||
}
|
||||
|
||||
pub extern "C" fn __eqsf2vfp(a: f32, b: f32) -> i32 {
|
||||
(a == b) as i32
|
||||
}
|
||||
|
||||
pub extern "C" fn __eqdf2vfp(a: f64, b: f64) -> i32 {
|
||||
(a == b) as i32
|
||||
}
|
||||
}
|
||||
|
||||
@@ -74,4 +74,9 @@ intrinsics! {
|
||||
pub extern "C" fn __extendsfdf2(a: f32) -> f64 {
|
||||
extend(a)
|
||||
}
|
||||
|
||||
#[cfg(target_arch = "arm")]
|
||||
pub extern "C" fn __extendsfdf2vfp(a: f32) -> f64 {
|
||||
a as f64 // LLVM generate 'fcvtds'
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user