Replace SSE3 check with an SSE2 check, and implement SSE2 check on windows.
authoroliver@apple.com <oliver@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 3 Oct 2008 11:11:55 +0000 (11:11 +0000)
committeroliver@apple.com <oliver@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 3 Oct 2008 11:11:55 +0000 (11:11 +0000)
Reviewed by Maciej Stachowiak

5.6% win on SunSpider on windows.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@37235 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JavaScriptCore/ChangeLog
JavaScriptCore/VM/CTI.cpp

index 99a0286..fc95912 100644 (file)
@@ -1,3 +1,16 @@
+2008-10-02  Oliver Hunt  <oliver@apple.com>
+
+        Reviewed by Maciej Stachowiak.
+
+        Replace SSE3 check with an SSE2 check, and implement SSE2 check on windows.
+
+        5.6% win on SunSpider on windows.
+
+        * VM/CTI.cpp:
+        (JSC::isSSE2Present):
+        (JSC::CTI::compileBinaryArithOp):
+        (JSC::CTI::compileBinaryArithOpSlowCase):
+
 2008-10-03  Maciej Stachowiak  <mjs@apple.com>
 
         Rubber stamped by Cameron Zwarich.
index d1f85dc..9a21521 100644 (file)
@@ -42,26 +42,35 @@ using namespace std;
 namespace JSC {
 
 #if PLATFORM(MAC)
-bool isSSE3Present()
+bool isSSE2Present()
 {
-    struct SSE3Check {
-        SSE3Check()
+    return true; // All X86 Macs are guaranteed to support at least SSE2
+}
+#else COMPILER(MSVC)
+bool isSSE2Present()
+{
+    static const int SSE2FeatureBit = 1 << 26;
+    struct SSE2Check {
+        SSE2Check()
         {
-            int hasSSE3 = 0;
-            size_t length = sizeof(hasSSE3);
-            int error = sysctlbyname("hw.optional.sse3", &hasSSE3, &length, NULL, 0);
-            present = hasSSE3 && !error;
+            int flags;
+#if COMPILER(MSVC)
+            _asm {
+                mov eax, 1 // cpuid function 1 gives us the standard feature set
+                cpuid;
+                mov flags, edx;
+            }
+#else
+            flags = 0;
+            // FIXME: Add GCC code to do above asm
+#endif
+            present = (flags & SSE2FeatureBit) != 0;
         }
         bool present;
     };
-    static SSE3Check check;
+    static SSE2Check check;
     return check.present;
 }
-#else
-bool isSSE3Present()
-{
-    return false;
-}
 #endif
 
 #if COMPILER(GCC) && PLATFORM(X86)
@@ -671,7 +680,7 @@ void CTI::compileBinaryArithOp(OpcodeID opcodeID, unsigned dst, unsigned src1, u
     emitGetArg(src1, X86::eax);
     emitGetArg(src2, X86::edx);
 
-    if (types.second().isReusable() && isSSE3Present()) {
+    if (types.second().isReusable() && isSSE2Present()) {
         ASSERT(types.second().mightBeNumber());
 
         // Check op2 is a number
@@ -718,7 +727,7 @@ void CTI::compileBinaryArithOp(OpcodeID opcodeID, unsigned dst, unsigned src1, u
         //     Two slow cases - either src1 isn't an immediate, or the subtract overflows.
         m_jit.link(op2imm, m_jit.label());
         emitJumpSlowCaseIfNotImmNum(X86::eax, i);
-    } else if (types.first().isReusable() && isSSE3Present()) {
+    } else if (types.first().isReusable() && isSSE2Present()) {
         ASSERT(types.first().mightBeNumber());
 
         // Check op1 is a number
@@ -789,11 +798,11 @@ void CTI::compileBinaryArithOp(OpcodeID opcodeID, unsigned dst, unsigned src1, u
     }
     emitPutResult(dst);
 
-    if (types.second().isReusable() && isSSE3Present()) {
+    if (types.second().isReusable() && isSSE2Present()) {
         m_jit.link(wasJSNumberCell2, m_jit.label());
         m_jit.link(wasJSNumberCell2b, m_jit.label());
     }
-    else if (types.first().isReusable() && isSSE3Present()) {
+    else if (types.first().isReusable() && isSSE2Present()) {
         m_jit.link(wasJSNumberCell1, m_jit.label());
         m_jit.link(wasJSNumberCell1b, m_jit.label());
     }
@@ -803,7 +812,7 @@ void CTI::compileBinaryArithOpSlowCase(OpcodeID opcodeID, Vector<SlowCaseEntry>:
 {
     X86Assembler::JmpDst here = m_jit.label();
     m_jit.link(iter->from, here);
-    if (types.second().isReusable() && isSSE3Present()) {
+    if (types.second().isReusable() && isSSE2Present()) {
         if (!types.first().definitelyIsNumber()) {
             m_jit.link((++iter)->from, here);
             m_jit.link((++iter)->from, here);
@@ -813,7 +822,7 @@ void CTI::compileBinaryArithOpSlowCase(OpcodeID opcodeID, Vector<SlowCaseEntry>:
             m_jit.link((++iter)->from, here);
         }
         m_jit.link((++iter)->from, here);
-    } else if (types.first().isReusable() && isSSE3Present()) {
+    } else if (types.first().isReusable() && isSSE2Present()) {
         if (!types.first().definitelyIsNumber()) {
             m_jit.link((++iter)->from, here);
             m_jit.link((++iter)->from, here);