| Index: src/platform-linux.cc
|
| ===================================================================
|
| --- src/platform-linux.cc (revision 11950)
|
| +++ src/platform-linux.cc (working copy)
|
| @@ -161,48 +161,43 @@
|
| }
|
|
|
|
|
| -// Simple helper function to detect whether the C code is compiled with
|
| -// option -mfloat-abi=hard. The register d0 is loaded with 1.0 and the register
|
| -// pair r0, r1 is loaded with 0.0. If -mfloat-abi=hard is pased to GCC then
|
| -// calling this will return 1.0 and otherwise 0.0.
|
| -static void ArmUsingHardFloatHelper() {
|
| - asm("mov r0, #0":::"r0");
|
| -#if defined(__VFP_FP__) && !defined(__SOFTFP__)
|
| - // Load 0x3ff00000 into r1 using instructions available in both ARM
|
| - // and Thumb mode.
|
| - asm("mov r1, #3":::"r1");
|
| - asm("mov r2, #255":::"r2");
|
| - asm("lsl r1, r1, #8":::"r1");
|
| - asm("orr r1, r1, r2":::"r1");
|
| - asm("lsl r1, r1, #20":::"r1");
|
| - // For vmov d0, r0, r1 use ARM mode.
|
| -#ifdef __thumb__
|
| - asm volatile(
|
| - "@ Enter ARM Mode \n\t"
|
| - " adr r3, 1f \n\t"
|
| - " bx r3 \n\t"
|
| - " .ALIGN 4 \n\t"
|
| - " .ARM \n"
|
| - "1: vmov d0, r0, r1 \n\t"
|
| - "@ Enter THUMB Mode\n\t"
|
| - " adr r3, 2f+1 \n\t"
|
| - " bx r3 \n\t"
|
| - " .THUMB \n"
|
| - "2: \n\t":::"r3");
|
| +bool OS::ArmUsingHardFloat() {
|
| + // GCC versions 4.6 and above define __ARM_PCS or __ARM_PCS_VFP to specify
|
| + // the Floating Point ABI used (PCS stands for Procedure Call Standard).
|
| + // We use these as well as a couple of other defines to statically determine
|
| + // what FP ABI used.
|
| + // GCC versions 4.4 and below don't support hard-fp.
|
| + // GCC versions 4.5 may support hard-fp without defining __ARM_PCS or
|
| + // __ARM_PCS_VFP.
|
| +
|
| +#define GCC_VERSION (__GNUC__ * 10000 \
|
| + + __GNUC_MINOR__ * 100 \
|
| + + __GNUC_PATCHLEVEL__)
|
| +#if GCC_VERSION >= 40600
|
| +#if defined(__ARM_PCS_VFP)
|
| + return true;
|
| #else
|
| - asm("vmov d0, r0, r1");
|
| -#endif // __thumb__
|
| -#endif // defined(__VFP_FP__) && !defined(__SOFTFP__)
|
| - asm("mov r1, #0":::"r1");
|
| -}
|
| + return false;
|
| +#endif
|
|
|
| +#elif GCC_VERSION < 40500
|
| + return false;
|
|
|
| -bool OS::ArmUsingHardFloat() {
|
| - // Cast helper function from returning void to returning double.
|
| - typedef double (*F)();
|
| - F f = FUNCTION_CAST<F>(FUNCTION_ADDR(ArmUsingHardFloatHelper));
|
| - return f() == 1.0;
|
| +#else
|
| +#if defined(__ARM_PCS_VFP)
|
| + return true;
|
| +#elif defined(__ARM_PCS) || defined(__SOFTFP) || !defined(__VFP_FP__)
|
| + return false;
|
| +#else
|
| +#error "Your version of GCC does not report the FP ABI compiled for." \
|
| + "Please report it on this issue" \
|
| + "http://code.google.com/p/v8/issues/detail?id=2140"
|
| +
|
| +#endif
|
| +#endif
|
| +#undef GCC_VERSION
|
| }
|
| +
|
| #endif // def __arm__
|
|
|
|
|
|
|