OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/base/cpu.h" | 5 #include "src/base/cpu.h" |
6 | 6 |
7 #if V8_LIBC_MSVCRT | 7 #if V8_LIBC_MSVCRT |
8 #include <intrin.h> // __cpuid() | 8 #include <intrin.h> // __cpuid() |
9 #endif | 9 #endif |
10 #if V8_OS_POSIX | 10 #if V8_OS_POSIX |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
112 } | 112 } |
113 return result; | 113 return result; |
114 } | 114 } |
115 | 115 |
116 #endif // V8_HOST_ARCH_ARM | 116 #endif // V8_HOST_ARCH_ARM |
117 | 117 |
118 #if V8_HOST_ARCH_MIPS | 118 #if V8_HOST_ARCH_MIPS |
119 int __detect_fp64_mode(void) { | 119 int __detect_fp64_mode(void) { |
120 double result = 0; | 120 double result = 0; |
121 // Bit representation of (double)1 is 0x3FF0000000000000. | 121 // Bit representation of (double)1 is 0x3FF0000000000000. |
122 asm( | 122 __asm__ volatile( |
123 "lui $t0, 0x3FF0\n\t" | 123 ".set push\n\t" |
124 "ldc1 $f0, %0\n\t" | 124 ".set noreorder\n\t" |
125 "mtc1 $t0, $f1\n\t" | 125 ".set oddspreg\n\t" |
126 "sdc1 $f0, %0\n\t" | 126 "lui $t0, 0x3FF0\n\t" |
127 : "+m" (result) | 127 "ldc1 $f0, %0\n\t" |
128 : : "t0", "$f0", "$f1", "memory"); | 128 "mtc1 $t0, $f1\n\t" |
| 129 "sdc1 $f0, %0\n\t" |
| 130 ".set pop\n\t" |
| 131 : "+m"(result) |
| 132 : |
| 133 : "t0", "$f0", "$f1", "memory"); |
129 | 134 |
130 return !(result == 1); | 135 return !(result == 1); |
131 } | 136 } |
132 | 137 |
133 | 138 |
134 int __detect_mips_arch_revision(void) { | 139 int __detect_mips_arch_revision(void) { |
135 // TODO(dusmil): Do the specific syscall as soon as it is implemented in mips | 140 // TODO(dusmil): Do the specific syscall as soon as it is implemented in mips |
136 // kernel. Currently fail-back to the least common denominator which is | 141 // kernel. |
137 // mips32 revision 1. | 142 uint32_t result = 0; |
138 return 1; | 143 __asm__ volatile( |
| 144 "move $v0, $zero\n\t" |
| 145 // Encoding for "addi $v0, $v0, 1" on non-r6, |
| 146 // which is encoding for "bovc $v0, %v0, 1" on r6. |
| 147 // Use machine code directly to avoid compilation errors with different |
| 148 // toolchains and maintain compatibility. |
| 149 ".word 0x20420001\n\t" |
| 150 "sw $v0, %0\n\t" |
| 151 : "=m"(result) |
| 152 : |
| 153 : "v0", "memory"); |
| 154 // Result is 0 on r6 architectures, 1 on other architecture revisions. |
| 155 // Fall-back to the least common denominator which is mips32 revision 1. |
| 156 return result ? 1 : 6; |
139 } | 157 } |
140 #endif | 158 #endif |
141 | 159 |
142 // Extract the information exposed by the kernel via /proc/cpuinfo. | 160 // Extract the information exposed by the kernel via /proc/cpuinfo. |
143 class CPUInfo FINAL { | 161 class CPUInfo FINAL { |
144 public: | 162 public: |
145 CPUInfo() : datalen_(0) { | 163 CPUInfo() : datalen_(0) { |
146 // Get the size of the cpuinfo file by reading it until the end. This is | 164 // Get the size of the cpuinfo file by reading it until the end. This is |
147 // required because files under /proc do not always return a valid size | 165 // required because files under /proc do not always return a valid size |
148 // when using fseek(0, SEEK_END) + ftell(). Nor can the be mmap()-ed. | 166 // when using fseek(0, SEEK_END) + ftell(). Nor can the be mmap()-ed. |
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
519 if (end == part) { | 537 if (end == part) { |
520 part_ = 0; | 538 part_ = 0; |
521 } | 539 } |
522 delete[] part; | 540 delete[] part; |
523 } | 541 } |
524 | 542 |
525 #endif | 543 #endif |
526 } | 544 } |
527 | 545 |
528 } } // namespace v8::base | 546 } } // namespace v8::base |
OLD | NEW |