1659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@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
289085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org#ifndef V8_X64_FRAMES_X64_H_
299085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org#define V8_X64_FRAMES_X64_H_
309085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
3171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 {
3271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal {
339085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
341b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgconst int kNumRegs = 16;
351b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgconst RegList kJSCallerSaved =
36eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    1 << 0 |  // rax
37eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    1 << 1 |  // rcx
38eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    1 << 2 |  // rdx
39eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    1 << 3 |  // rbx - used as a caller-saved register in JavaScript code
40eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org    1 << 7;   // rdi - callee function
41eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
421b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgconst int kNumJSCallerSaved = 5;
43eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org
449085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgtypedef Object* JSCallerSavedBuffer[kNumJSCallerSaved];
459085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
46a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Number of registers for which space is reserved in safepoints.
471b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.orgconst int kNumSafepointRegisters = 16;
48a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
49a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// ----------------------------------------------------
50a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
519085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgclass EntryFrameConstants : public AllStatic {
529085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org public:
5369ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org#ifdef _WIN64
54b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org  static const int kCalleeSaveXMMRegisters = 10;
55b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org  static const int kXMMRegisterSize = 16;
56b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org  static const int kXMMRegistersBlockSize =
57b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org      kXMMRegisterSize * kCalleeSaveXMMRegisters;
58b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org  static const int kCallerFPOffset =
59b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org      -10 * kPointerSize - kXMMRegistersBlockSize;
6069ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org#else
6169ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org  static const int kCallerFPOffset      = -8 * kPointerSize;
6269ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org#endif
6318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  static const int kArgvOffset          = 6 * kPointerSize;
649085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org};
659085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
669085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
679085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgclass ExitFrameConstants : public AllStatic {
689085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org public:
69c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  static const int kCodeOffset      = -2 * kPointerSize;
709085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  static const int kSPOffset        = -1 * kPointerSize;
719085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
72eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  static const int kCallerFPOffset  = +0 * kPointerSize;
73d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  static const int kCallerPCOffset  = kFPOnStackSize;
749085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
75eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  // FP-relative displacement of the caller's SP.  It points just
76eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  // below the saved PC.
77d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  static const int kCallerSPDisplacement = kCallerPCOffset + kPCOnStackSize;
789085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org};
799085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
809085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
819085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgclass JavaScriptFrameConstants : public AllStatic {
829085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org public:
8318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  // FP-relative.
849085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  static const int kLocal0Offset = StandardFrameConstants::kExpressionsOffset;
85d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  static const int kLastParameterOffset = kFPOnStackSize + kPCOnStackSize;
869085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  static const int kFunctionOffset = StandardFrameConstants::kMarkerOffset;
879085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
8818ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org  // Caller SP-relative.
89eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org  static const int kParam0Offset   = -2 * kPointerSize;
909085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  static const int kReceiverOffset = -1 * kPointerSize;
919085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org};
929085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
939085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
949085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgclass ArgumentsAdaptorFrameConstants : public AllStatic {
959085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org public:
96750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  // FP-relative.
979085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  static const int kLengthOffset = StandardFrameConstants::kExpressionsOffset;
98750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
99659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org  static const int kFrameSize =
100659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org      StandardFrameConstants::kFixedFrameSize + kPointerSize;
1019085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org};
1029085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
1039085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
104750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgclass ConstructFrameConstants : public AllStatic {
105750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org public:
106750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  // FP-relative.
107750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  static const int kImplicitReceiverOffset = -5 * kPointerSize;
108750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  static const int kConstructorOffset      = kMinInt;
109750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  static const int kLengthOffset           = -4 * kPointerSize;
110750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  static const int kCodeOffset = StandardFrameConstants::kExpressionsOffset;
111750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
112750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  static const int kFrameSize =
113750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org      StandardFrameConstants::kFixedFrameSize + 3 * kPointerSize;
114750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org};
115750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
116750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org
1179085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgclass InternalFrameConstants : public AllStatic {
1189085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org public:
119750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  // FP-relative.
1209085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  static const int kCodeOffset = StandardFrameConstants::kExpressionsOffset;
1219085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org};
1229085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
1239085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
1249085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orginline Object* JavaScriptFrame::function_slot_object() const {
1259085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  const int offset = JavaScriptFrameConstants::kFunctionOffset;
1269085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org  return Memory::Object_at(fp() + offset);
1279085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org}
1289085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
129d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
130d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orginline void StackHandler::SetFp(Address slot, Address fp) {
131d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  Memory::Address_at(slot) = fp;
132d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org}
133d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
134d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
1359085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org} }  // namespace v8::internal
1369085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org
1379085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org#endif  // V8_X64_FRAMES_X64_H_
138