| OLD | NEW |
| 1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 73 XMMRegister xmm15 = { 15 }; | 73 XMMRegister xmm15 = { 15 }; |
| 74 | 74 |
| 75 | 75 |
| 76 // ----------------------------------------------------------------------------- | 76 // ----------------------------------------------------------------------------- |
| 77 // Implementation of CpuFeatures | 77 // Implementation of CpuFeatures |
| 78 | 78 |
| 79 // The required user mode extensions in X64 are (from AMD64 ABI Table A.1): | 79 // The required user mode extensions in X64 are (from AMD64 ABI Table A.1): |
| 80 // fpu, tsc, cx8, cmov, mmx, sse, sse2, fxsr, syscall | 80 // fpu, tsc, cx8, cmov, mmx, sse, sse2, fxsr, syscall |
| 81 uint64_t CpuFeatures::supported_ = kDefaultCpuFeatures; | 81 uint64_t CpuFeatures::supported_ = kDefaultCpuFeatures; |
| 82 uint64_t CpuFeatures::enabled_ = 0; | 82 uint64_t CpuFeatures::enabled_ = 0; |
| 83 uint64_t CpuFeatures::found_by_runtime_probing_ = 0; |
| 83 | 84 |
| 84 void CpuFeatures::Probe() { | 85 void CpuFeatures::Probe() { |
| 85 ASSERT(Heap::HasBeenSetup()); | 86 ASSERT(Heap::HasBeenSetup()); |
| 86 ASSERT(supported_ == kDefaultCpuFeatures); | 87 ASSERT(supported_ == kDefaultCpuFeatures); |
| 87 if (Serializer::enabled()) return; // No features if we might serialize. | 88 if (Serializer::enabled()) { |
| 89 supported_ |= OS::CpuFeaturesImpliedByPlatform(); |
| 90 return; // No features if we might serialize. |
| 91 } |
| 88 | 92 |
| 89 Assembler assm(NULL, 0); | 93 Assembler assm(NULL, 0); |
| 90 Label cpuid, done; | 94 Label cpuid, done; |
| 91 #define __ assm. | 95 #define __ assm. |
| 92 // Save old rsp, since we are going to modify the stack. | 96 // Save old rsp, since we are going to modify the stack. |
| 93 __ push(rbp); | 97 __ push(rbp); |
| 94 __ pushfq(); | 98 __ pushfq(); |
| 95 __ push(rcx); | 99 __ push(rcx); |
| 96 __ push(rbx); | 100 __ push(rbx); |
| 97 __ movq(rbp, rsp); | 101 __ movq(rbp, rsp); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 153 CodeDesc desc; | 157 CodeDesc desc; |
| 154 assm.GetCode(&desc); | 158 assm.GetCode(&desc); |
| 155 Object* code = | 159 Object* code = |
| 156 Heap::CreateCode(desc, NULL, Code::ComputeFlags(Code::STUB), NULL); | 160 Heap::CreateCode(desc, NULL, Code::ComputeFlags(Code::STUB), NULL); |
| 157 if (!code->IsCode()) return; | 161 if (!code->IsCode()) return; |
| 158 LOG(CodeCreateEvent(Logger::BUILTIN_TAG, | 162 LOG(CodeCreateEvent(Logger::BUILTIN_TAG, |
| 159 Code::cast(code), "CpuFeatures::Probe")); | 163 Code::cast(code), "CpuFeatures::Probe")); |
| 160 typedef uint64_t (*F0)(); | 164 typedef uint64_t (*F0)(); |
| 161 F0 probe = FUNCTION_CAST<F0>(Code::cast(code)->entry()); | 165 F0 probe = FUNCTION_CAST<F0>(Code::cast(code)->entry()); |
| 162 supported_ = probe(); | 166 supported_ = probe(); |
| 167 found_by_runtime_probing_ = supported_; |
| 168 found_by_runtime_probing_ &= ~kDefaultCpuFeatures; |
| 169 uint64_t os_guarantees = OS::CpuFeaturesImpliedByPlatform(); |
| 170 supported_ |= os_guarantees; |
| 171 found_by_runtime_probing_ &= ~os_guarantees; |
| 163 // SSE2 and CMOV must be available on an X64 CPU. | 172 // SSE2 and CMOV must be available on an X64 CPU. |
| 164 ASSERT(IsSupported(CPUID)); | 173 ASSERT(IsSupported(CPUID)); |
| 165 ASSERT(IsSupported(SSE2)); | 174 ASSERT(IsSupported(SSE2)); |
| 166 ASSERT(IsSupported(CMOV)); | 175 ASSERT(IsSupported(CMOV)); |
| 167 } | 176 } |
| 168 | 177 |
| 169 | 178 |
| 170 // ----------------------------------------------------------------------------- | 179 // ----------------------------------------------------------------------------- |
| 171 // Implementation of RelocInfo | 180 // Implementation of RelocInfo |
| 172 | 181 |
| (...skipping 709 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 882 void Assembler::cmpb_al(Immediate imm8) { | 891 void Assembler::cmpb_al(Immediate imm8) { |
| 883 ASSERT(is_int8(imm8.value_) || is_uint8(imm8.value_)); | 892 ASSERT(is_int8(imm8.value_) || is_uint8(imm8.value_)); |
| 884 EnsureSpace ensure_space(this); | 893 EnsureSpace ensure_space(this); |
| 885 last_pc_ = pc_; | 894 last_pc_ = pc_; |
| 886 emit(0x3c); | 895 emit(0x3c); |
| 887 emit(imm8.value_); | 896 emit(imm8.value_); |
| 888 } | 897 } |
| 889 | 898 |
| 890 | 899 |
| 891 void Assembler::cpuid() { | 900 void Assembler::cpuid() { |
| 892 ASSERT(CpuFeatures::IsEnabled(CpuFeatures::CPUID)); | 901 ASSERT(CpuFeatures::IsEnabled(CPUID)); |
| 893 EnsureSpace ensure_space(this); | 902 EnsureSpace ensure_space(this); |
| 894 last_pc_ = pc_; | 903 last_pc_ = pc_; |
| 895 emit(0x0F); | 904 emit(0x0F); |
| 896 emit(0xA2); | 905 emit(0xA2); |
| 897 } | 906 } |
| 898 | 907 |
| 899 | 908 |
| 900 void Assembler::cqo() { | 909 void Assembler::cqo() { |
| 901 EnsureSpace ensure_space(this); | 910 EnsureSpace ensure_space(this); |
| 902 last_pc_ = pc_; | 911 last_pc_ = pc_; |
| (...skipping 1137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2040 void Assembler::fistp_s(const Operand& adr) { | 2049 void Assembler::fistp_s(const Operand& adr) { |
| 2041 EnsureSpace ensure_space(this); | 2050 EnsureSpace ensure_space(this); |
| 2042 last_pc_ = pc_; | 2051 last_pc_ = pc_; |
| 2043 emit_optional_rex_32(adr); | 2052 emit_optional_rex_32(adr); |
| 2044 emit(0xDB); | 2053 emit(0xDB); |
| 2045 emit_operand(3, adr); | 2054 emit_operand(3, adr); |
| 2046 } | 2055 } |
| 2047 | 2056 |
| 2048 | 2057 |
| 2049 void Assembler::fisttp_s(const Operand& adr) { | 2058 void Assembler::fisttp_s(const Operand& adr) { |
| 2050 ASSERT(CpuFeatures::IsEnabled(CpuFeatures::SSE3)); | 2059 ASSERT(CpuFeatures::IsEnabled(SSE3)); |
| 2051 EnsureSpace ensure_space(this); | 2060 EnsureSpace ensure_space(this); |
| 2052 last_pc_ = pc_; | 2061 last_pc_ = pc_; |
| 2053 emit_optional_rex_32(adr); | 2062 emit_optional_rex_32(adr); |
| 2054 emit(0xDB); | 2063 emit(0xDB); |
| 2055 emit_operand(1, adr); | 2064 emit_operand(1, adr); |
| 2056 } | 2065 } |
| 2057 | 2066 |
| 2058 | 2067 |
| 2059 void Assembler::fist_s(const Operand& adr) { | 2068 void Assembler::fist_s(const Operand& adr) { |
| 2060 EnsureSpace ensure_space(this); | 2069 EnsureSpace ensure_space(this); |
| (...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2521 written_position_ = current_position_; | 2530 written_position_ = current_position_; |
| 2522 } | 2531 } |
| 2523 } | 2532 } |
| 2524 | 2533 |
| 2525 | 2534 |
| 2526 const int RelocInfo::kApplyMask = RelocInfo::kCodeTargetMask | | 2535 const int RelocInfo::kApplyMask = RelocInfo::kCodeTargetMask | |
| 2527 1 << RelocInfo::INTERNAL_REFERENCE | | 2536 1 << RelocInfo::INTERNAL_REFERENCE | |
| 2528 1 << RelocInfo::JS_RETURN; | 2537 1 << RelocInfo::JS_RETURN; |
| 2529 | 2538 |
| 2530 } } // namespace v8::internal | 2539 } } // namespace v8::internal |
| OLD | NEW |