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