| 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 | 
|---|