src: disable fast math on arm
authorBen Noordhuis <info@bnoordhuis.nl>
Sat, 11 Apr 2015 03:04:16 +0000 (05:04 +0200)
committerBen Noordhuis <info@bnoordhuis.nl>
Sat, 11 Apr 2015 19:03:48 +0000 (21:03 +0200)
The "fast" implementation of Math.exp() and Math.tanh() emits ARMv7
movt/movw instructions on ARMv6 (notably, the original Raspberry Pi.)

Disable fast math for now.  The adventurous can enable it again with
the --fast_math switch.

PR-URL: https://github.com/iojs/io.js/pull/1398
Refs: https://github.com/iojs/io.js/issues/1376
Reviewed-By: Roman Reiss <me@silverwind.io>
V8-Bug: https://code.google.com/p/v8/issues/detail?id=4019

src/node.cc
test/parallel/test-arm-math-exp-regress-1376.js [new file with mode: 0644]

index db16e0b..85b0f88 100644 (file)
@@ -3541,6 +3541,14 @@ void Init(int* argc,
                 DispatchDebugMessagesAsyncCallback);
   uv_unref(reinterpret_cast<uv_handle_t*>(&dispatch_debug_messages_async));
 
+#if defined(__arm__)
+  // See https://github.com/iojs/io.js/issues/1376
+  // and https://code.google.com/p/v8/issues/detail?id=4019
+  // TODO(bnoordhuis): Remove test/parallel/test-arm-math-exp-regress-1376.js
+  // and this workaround when v8:4019 has been fixed and the patch back-ported.
+  V8::SetFlagsFromString("--nofast_math", sizeof("--nofast_math") - 1);
+#endif
+
 #if defined(NODE_V8_OPTIONS)
   // Should come before the call to V8::SetFlagsFromCommandLine()
   // so the user can disable a flag --foo at run-time by passing
diff --git a/test/parallel/test-arm-math-exp-regress-1376.js b/test/parallel/test-arm-math-exp-regress-1376.js
new file mode 100644 (file)
index 0000000..fa3e3bf
--- /dev/null
@@ -0,0 +1,30 @@
+// See https://github.com/iojs/io.js/issues/1376
+// and https://code.google.com/p/v8/issues/detail?id=4019
+
+Math.abs(-0.5);
+Math.acos(-0.5);
+Math.acosh(-0.5);
+Math.asin(-0.5);
+Math.asinh(-0.5);
+Math.atan(-0.5);
+Math.atanh(-0.5);
+Math.cbrt(-0.5);
+Math.ceil(-0.5);
+Math.cos(-0.5);
+Math.cosh(-0.5);
+Math.exp(-0.5);
+Math.expm1(-0.5);
+Math.floor(-0.5);
+Math.fround(-0.5);
+Math.log(-0.5);
+Math.log10(-0.5);
+Math.log1p(-0.5);
+Math.log2(-0.5);
+Math.round(-0.5);
+Math.sign(-0.5);
+Math.sin(-0.5);
+Math.sinh(-0.5);
+Math.sqrt(-0.5);
+Math.tan(-0.5);
+Math.tanh(-0.5);
+Math.trunc(-0.5);