mozilla-cpuid.patch
author Wolfgang Rosenauer <wr@rosenauer.org>
Wed, 01 Sep 2010 10:56:36 +0200
changeset 153 46ee28dc7145
parent 79 bc6311ee4f5e
permissions -rw-r--r--
Update to 4.0b5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
79
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     1
References:
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     2
https://bugzilla.mozilla.org/show_bug.cgi?id=513422
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     3
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     4
diff --git a/xpcom/glue/SSE.h b/xpcom/glue/SSE.h
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     5
--- a/xpcom/glue/SSE.h
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     6
+++ b/xpcom/glue/SSE.h
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     7
@@ -234,32 +234,73 @@
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     8
 #endif
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     9
 #ifdef __SSE4_2__
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    10
   // It's ok to use SSE4.2 instructions based on the -march option.
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    11
   #define MOZILLA_PRESUME_SSE4_2 1
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    12
 #endif
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    13
 
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    14
 #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    15
 
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    16
-// cpuid.h is available on gcc 4.3 and higher on i386 and x86_64
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    17
-#include <cpuid.h>
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    18
 #define MOZILLA_SSE_HAVE_CPUID_DETECTION
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    19
 
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    20
 namespace mozilla {
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    21
 
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    22
   namespace sse_private {
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    23
 
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    24
     enum CPUIDRegister { eax = 0, ebx = 1, ecx = 2, edx = 3 };
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    25
 
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    26
+    inline void my__cpuid(unsigned int* regs, unsigned int level)
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    27
+    {
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    28
+      regs[0] = level;
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    29
+#     if defined(__i386__)
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    30
+      __asm__ __volatile__(
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    31
+        "pushl %%ebx"             "\n\t"
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    32
+        "movl  %0, %%edi"         "\n\t"
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    33
+        "movl  0(%%edi), %%eax"   "\n\t"
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    34
+        "cpuid"                   "\n\t"
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    35
+        "movl  %%eax, 0(%%edi)"   "\n\t"
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    36
+        "movl  %%ebx, 4(%%edi)"   "\n\t"
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    37
+        "movl  %%ecx, 8(%%edi)"   "\n\t"
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    38
+        "movl  %%edx, 12(%%edi)"  "\n\t"
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    39
+        "popl  %%ebx"             "\n"
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    40
+        : /*out*/
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    41
+        : /*in*/"r"(regs)
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    42
+        : /*trash*/"edi","eax","ecx","edx","memory","cc"
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    43
+      );
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    44
+#     elif defined(__x86_64__)
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    45
+      __asm__ __volatile__(
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    46
+        "pushq %%rbx"             "\n\t"
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    47
+        "movq  %0, %%rdi"         "\n\t"
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    48
+        "movl  0(%%rdi), %%eax"   "\n\t"
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    49
+        "cpuid"                   "\n\t"
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    50
+        "movl  %%eax, 0(%%rdi)"   "\n\t"
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    51
+        "movl  %%ebx, 4(%%rdi)"   "\n\t"
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    52
+        "movl  %%ecx, 8(%%rdi)"   "\n\t"
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    53
+        "movl  %%edx, 12(%%rdi)"  "\n\t"
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    54
+        "popq  %%rbx"             "\n"
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    55
+        : /*out*/
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    56
+        : /*in*/"r"(regs)
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    57
+        : /*trash*/"rdi","rax","rcx","rdx","memory","cc"
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    58
+      );
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    59
+#     else
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    60
+#       error "Hmm, unsupported x86-esque platform"
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    61
+#     endif
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    62
+    }
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    63
+
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    64
     inline bool
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    65
     has_cpuid_bit(unsigned int level, CPUIDRegister reg, unsigned int bit)
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    66
     {
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    67
+      // Check that the level in question is supported.
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    68
       unsigned int regs[4];
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    69
-      return __get_cpuid(level, &regs[0], &regs[1], &regs[2], &regs[3]) &&
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    70
-             (regs[reg] & bit);
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    71
+      my__cpuid(regs, level & 0x80000000u);
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    72
+      if (unsigned(regs[0]) < level)
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    73
+        return false;
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    74
+
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    75
+      my__cpuid(regs, level);
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    76
+      return !!(unsigned(regs[reg]) & bit);
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    77
     }
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    78
 
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    79
   }
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    80
 
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    81
 }
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    82
 
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    83
 #endif
bc6311ee4f5e use mozilla-cpuid.patch for 11.1 and older
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    84