author | Wolfgang Rosenauer <wr@rosenauer.org> |
Fri, 13 Aug 2010 09:07:07 +0200 | |
changeset 133 | a77c32dc7ffd |
parent 79 | bc6311ee4f5e |
permissions | -rw-r--r-- |
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, ®s[0], ®s[1], ®s[2], ®s[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 |