diff options
author | andrew <andrew@FreeBSD.org> | 2014-03-16 13:16:30 +0000 |
---|---|---|
committer | andrew <andrew@FreeBSD.org> | 2014-03-16 13:16:30 +0000 |
commit | f643cc22616cad83646f26302959d886c20c5e52 (patch) | |
tree | 62fbdbbd1a575b5f25065c97904adb9fc6317b62 /lib/libc/arm/aeabi/aeabi_float.c | |
parent | 8de9dac190c0ed381ef0edd6bfb170be288de627 (diff) | |
download | FreeBSD-src-f643cc22616cad83646f26302959d886c20c5e52.zip FreeBSD-src-f643cc22616cad83646f26302959d886c20c5e52.tar.gz |
Add an optimised version of the float and double helper functions. These
are only used on armv6 when the vfp unit is detected. They will also be
available for the upcoming armv6hf platform, however while not used by
default there will need to be defined for any software that calls them
directly.
Diffstat (limited to 'lib/libc/arm/aeabi/aeabi_float.c')
-rw-r--r-- | lib/libc/arm/aeabi/aeabi_float.c | 99 |
1 files changed, 37 insertions, 62 deletions
diff --git a/lib/libc/arm/aeabi/aeabi_float.c b/lib/libc/arm/aeabi/aeabi_float.c index 97751ad..f8d8cbc 100644 --- a/lib/libc/arm/aeabi/aeabi_float.c +++ b/lib/libc/arm/aeabi/aeabi_float.c @@ -32,70 +32,45 @@ __FBSDID("$FreeBSD$"); #include "milieu.h" #include "softfloat.h" -flag __unordsf2(float32, float32); - -int __aeabi_fcmpeq(float32 a, float32 b) -{ - return float32_eq(a, b); -} - -int __aeabi_fcmplt(float32 a, float32 b) -{ - return float32_lt(a, b); -} - -int __aeabi_fcmple(float32 a, float32 b) -{ - return float32_le(a, b); -} - -int __aeabi_fcmpge(float32 a, float32 b) -{ - return float32_le(b, a); -} - -int __aeabi_fcmpgt(float32 a, float32 b) -{ - return float32_lt(b, a); -} - -int __aeabi_fcmpun(float32 a, float32 b) -{ - return __unordsf2(a, b); -} +#include "aeabi_vfp.h" -int __aeabi_f2iz(float32 a) -{ - return float32_to_int32_round_to_zero(a); -} +extern int _libc_arm_fpu_present; -float32 __aeabi_f2d(float32 a) -{ - return float32_to_float64(a); -} - -float32 __aeabi_i2f(int a) -{ - return int32_to_float32(a); -} - -float32 __aeabi_fadd(float32 a, float32 b) -{ - return float32_add(a, b); -} - -float32 __aeabi_fdiv(float32 a, float32 b) -{ - return float32_div(a, b); -} +flag __unordsf2(float32, float32); -float32 __aeabi_fmul(float32 a, float32 b) -{ - return float32_mul(a, b); -} +/* These are written in asm and are only called from this file */ +int __aeabi_fcmpeq_vfp(float32, float32); +int __aeabi_fcmplt_vfp(float32, float32); +int __aeabi_fcmple_vfp(float32, float32); +int __aeabi_fcmpgt_vfp(float32, float32); +int __aeabi_fcmpge_vfp(float32, float32); +int __aeabi_fcmpun_vfp(float32, float32); +int __aeabi_f2iz_vfp(float32); +float64 __aeabi_f2d_vfp(float32); +float32 __aeabi_i2f_vfp(int); +float32 __aeabi_fadd_vfp(float32, float32); +float32 __aeabi_fdiv_vfp(float32, float32); +float32 __aeabi_fmul_vfp(float32, float32); +float32 __aeabi_fsub_vfp(float32, float32); -float32 __aeabi_fsub(float32 a, float32 b) -{ - return float32_sub(a, b); -} +/* + * Depending on the target these will: + * On armv6 with a vfp call the above function, or + * Call the softfloat cunstion in the 3rd argument. + */ +int AEABI_FUNC2(fcmpeq, float32, float32_eq) +int AEABI_FUNC2(fcmplt, float32, float32_lt) +int AEABI_FUNC2(fcmple, float32, float32_le) +int AEABI_FUNC2_REV(fcmpge, float32, float32_le) +int AEABI_FUNC2_REV(fcmpgt, float32, float32_lt) +int AEABI_FUNC2(fcmpun, float32, __unordsf2) + +int AEABI_FUNC(f2iz, float32, float32_to_int32_round_to_zero) +float64 AEABI_FUNC(f2d, float32, float32_to_float64) +float32 AEABI_FUNC(i2f, int, int32_to_float32) + +float32 AEABI_FUNC2(fadd, float32, float32_add) +float32 AEABI_FUNC2(fdiv, float32, float32_div) +float32 AEABI_FUNC2(fmul, float32, float32_mul) +float32 AEABI_FUNC2(fsub, float32, float32_sub) |