Index: src/platform-linux.cc |
diff --git a/src/platform-linux.cc b/src/platform-linux.cc |
index d857cd90590dd74db84a6df1bebc2bffad42f930..db6c80ed5df1e22cbdbd0e9d40f7e88e3b3885fd 100644 |
--- a/src/platform-linux.cc |
+++ b/src/platform-linux.cc |
@@ -1,4 +1,4 @@ |
-// Copyright 2006-2008 the V8 project authors. All rights reserved. |
+// Copyright 2011 the V8 project authors. All rights reserved. |
// Redistribution and use in source and binary forms, with or without |
// modification, are permitted provided that the following conditions are |
// met: |
@@ -205,10 +205,32 @@ bool OS::ArmCpuHasFeature(CpuFeature feature) { |
// calling this will return 1.0 and otherwise 0.0. |
static void ArmUsingHardFloatHelper() { |
asm("mov r0, #0"); |
- asm("mov r1, #0"); |
- asm("movt r1, #16368"); |
+#if defined(__VFP_FP__) && !defined(__SOFTFP__) |
+ // Load 0x3ff00000 into r1 using instructions available in both ARM |
+ // and Thumb mode. |
+ asm("mov r1, #3"); |
+ asm("mov r2, #255"); |
+ asm("lsl r1, r1, #8"); |
+ asm("orr r1, r1, r2"); |
+ asm("lsl r1, r1, #16"); |
+ // 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"); |
+#else |
asm("vmov d0, r0, r1"); |
- asm("mov r0, #0"); |
+#endif // __thumb__ |
+#endif // defined(__VFP_FP__) && !defined(__SOFTFP__) |
asm("mov r1, #0"); |
} |