1be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org// Copyright 2012 the V8 project authors. All rights reserved. 25ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// Redistribution and use in source and binary forms, with or without 35ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// modification, are permitted provided that the following conditions are 45ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// met: 55ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// 65ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// * Redistributions of source code must retain the above copyright 75ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// notice, this list of conditions and the following disclaimer. 85ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// * Redistributions in binary form must reproduce the above 95ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// copyright notice, this list of conditions and the following 105ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// disclaimer in the documentation and/or other materials provided 115ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// with the distribution. 125ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// * Neither the name of Google Inc. nor the names of its 135ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// contributors may be used to endorse or promote products derived 145ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// from this software without specific prior written permission. 155ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// 165ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 175ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 185ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 195ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 205ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 215ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 225ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 235ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 245ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 265ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org 28b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org// CPU specific code for x64 independent of OS goes here. 29b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 30be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org#if defined(__GNUC__) && !defined(__MINGW64__) 313811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org#include "third_party/valgrind/valgrind.h" 323811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org#endif 333811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 34b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org#include "v8.h" 35b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 3693a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org#if V8_TARGET_ARCH_X64 379dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 38b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org#include "cpu.h" 39b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org#include "macro-assembler.h" 40b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 4171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 { 4271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal { 43b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 44f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comvoid CPU::SetUp() { 45c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org CpuFeatures::Probe(); 46c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org} 47c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org 48c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org 49c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.orgbool CPU::SupportsCrankshaft() { 50c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org return true; // Yay! 51b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 52b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 53b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 54b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.orgvoid CPU::FlushICache(void* start, size_t size) { 55b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // No need to flush the instruction cache on Intel. On Intel instruction 56b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // cache flushing is only necessary when multiple cores running the same 57b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // code simultaneously. V8 (and JavaScript) is single threaded and when code 58b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // is patched on an intel CPU the core performing the patching will have its 59b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // own instruction cache updated automatically. 60b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 61b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // If flushing of the instruction cache becomes necessary Windows has the 62b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // API function FlushInstructionCache. 633811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 643811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // By default, valgrind only checks the stack for writes that might need to 653811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // invalidate already cached translated code. This leads to random 663811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // instability when code patches or moves are sometimes unnoticed. One 673811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // solution is to run valgrind with --smc-check=all, but this comes at a big 683811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // performance cost. We can notify valgrind to invalidate its cache. 693811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org#ifdef VALGRIND_DISCARD_TRANSLATIONS 709fa09679c31dd1fc79a07ed24431b6951227240aricow@chromium.org unsigned res = VALGRIND_DISCARD_TRANSLATIONS(start, size); 719fa09679c31dd1fc79a07ed24431b6951227240aricow@chromium.org USE(res); 723811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org#endif 73b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 74b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 75b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 76b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.orgvoid CPU::DebugBreak() { 77b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org#ifdef _MSC_VER 78b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // To avoid Visual Studio runtime support the following code can be used 79b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // instead 80b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org // __asm { int 3 } 81b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org __debugbreak(); 82b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org#else 83b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org asm("int $3"); 84b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org#endif 85b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} 86b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 87b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org} } // namespace v8::internal 889dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 899dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com#endif // V8_TARGET_ARCH_X64 90