Reviewers: Jakob,

Description:
[ia32] Require SSE2 for all 32-bit Linux builds.

This way we stay in sync with what Chromium does and we reduce the
number of bugs caused by 80-to-{32,64}-bit rounding errors.

[email protected]

Please review this at https://codereview.chromium.org/864483002/

Base URL: https://chromium.googlesource.com/v8/v8.git@master

Affected files (+39, -0 lines):
  M build/toolchain.gypi


Index: build/toolchain.gypi
diff --git a/build/toolchain.gypi b/build/toolchain.gypi
index ee8efe13c4c0f8d960b8e39e354445bfd059c099..56b2e338eed352f3b2a95c408ad7fdfdb39653bf 100644
--- a/build/toolchain.gypi
+++ b/build/toolchain.gypi
@@ -811,6 +811,45 @@
       }],
       ['(OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="solaris" \
          or OS=="netbsd" or OS=="mac" or OS=="android" or OS=="qnx") and \
+        v8_target_arch=="ia32"', {
+        # All floating-point computations on x87 happens in 80-bit
+        # precision.  Because the C and C++ language standards allow
+        # the compiler to keep the floating-point values in higher
+        # precision than what's specified in the source and doing so
+        # is more efficient than constantly rounding up to 64-bit or
+        # 32-bit precision as specified in the source, the compiler,
+        # especially in the optimized mode, tries very hard to keep
+        # values in x87 floating-point stack (in 80-bit precision)
+        # as long as possible. This has important side effects, that
+        # the real value used in computation may change depending on
+        # how the compiler did the optimization - that is, the value
+        # kept in 80-bit is different than the value rounded down to
+        # 64-bit or 32-bit. There are possible compiler options to
+        # make this behavior consistent (e.g. -ffloat-store would keep
+        # all floating-values in the memory, thus force them to be
+        # rounded to its original precision) but they have significant
+        # runtime performance penalty.
+        #
+        # -mfpmath=sse -msse2 makes the compiler use SSE instructions
+        # which keep floating-point values in SSE registers in its
+        # native precision (32-bit for single precision, and 64-bit
+        # for double precision values). This means the floating-point
+        # value used during computation does not change depending on
+        # how the compiler optimized the code, since the value is
+        # always kept in its specified precision.
+        #
+        # Refer to http://crbug.com/348761 for rationale behind SSE2
+        # being a minimum requirement for 32-bit Linux builds and
+        # http://crbug.com/313032 for an example where this has "bit"
+        # us in the past.
+        'cflags': [
+          '-msse2',
+          '-mfpmath=sse',
+          '-mmmx',  # Allows mmintrin.h for MMX intrinsics.
+        ],
+      }],
+      ['(OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="solaris" \
+         or OS=="netbsd" or OS=="mac" or OS=="android" or OS=="qnx") and \
         (v8_target_arch=="arm" or v8_target_arch=="ia32" or \
          v8_target_arch=="x87" or v8_target_arch=="mips" or \
          v8_target_arch=="mipsel" or v8_target_arch=="ppc")', {


--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to