13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#ifndef V8_IA32_FRAMES_IA32_H_
6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#define V8_IA32_FRAMES_IA32_H_
7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 {
9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal {
10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Register lists
13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Note that the bit values must match those used in actual instruction encoding
143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst int kNumRegs = 8;
15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Caller-saved registers
183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst RegList kJSCallerSaved =
19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  1 << 0 |  // eax
20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  1 << 1 |  // ecx
21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  1 << 2 |  // edx
22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  1 << 3 |  // ebx - used as a caller-saved register in JavaScript code
23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  1 << 7;   // edi - callee function
24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst int kNumJSCallerSaved = 5;
26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
27b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
28b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Number of registers for which space is reserved in safepoints.
293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst int kNumSafepointRegisters = 8;
30b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int kNoAlignmentPadding = 0;
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int kAlignmentPaddingPushed = 2;
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst int kAlignmentZapValue = 0x12345678;  // Not heap object tagged.
34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// ----------------------------------------------------
36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass EntryFrameConstants : public AllStatic {
39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public:
40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const int kCallerFPOffset      = -6 * kPointerSize;
41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const int kFunctionArgOffset   = +3 * kPointerSize;
43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const int kReceiverArgOffset   = +4 * kPointerSize;
44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const int kArgcOffset          = +5 * kPointerSize;
45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const int kArgvOffset          = +6 * kPointerSize;
46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass ExitFrameConstants : public AllStatic {
50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public:
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int kFrameSize      = 2 * kPointerSize;
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
53257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  static const int kCodeOffset     = -2 * kPointerSize;
54257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  static const int kSPOffset       = -1 * kPointerSize;
55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const int kCallerFPOffset =  0 * kPointerSize;
57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const int kCallerPCOffset = +1 * kPointerSize;
58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // FP-relative displacement of the caller's SP.  It points just
60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // below the saved PC.
61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const int kCallerSPDisplacement = +2 * kPointerSize;
62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int kConstantPoolOffset   = 0;  // Not used
64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass JavaScriptFrameConstants : public AllStatic {
68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public:
69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // FP-relative.
70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const int kLocal0Offset = StandardFrameConstants::kExpressionsOffset;
718b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  static const int kLastParameterOffset = +2 * kPointerSize;
72a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const int kFunctionOffset = StandardFrameConstants::kMarkerOffset;
73a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
74a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Caller SP-relative.
75a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const int kParam0Offset   = -2 * kPointerSize;
76a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const int kReceiverOffset = -1 * kPointerSize;
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int kDynamicAlignmentStateOffset = kLocal0Offset;
79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass ArgumentsAdaptorFrameConstants : public AllStatic {
83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public:
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // FP-relative.
85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const int kLengthOffset = StandardFrameConstants::kExpressionsOffset;
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static const int kFrameSize =
883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      StandardFrameConstants::kFixedFrameSize + kPointerSize;
89a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
90a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
91a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ConstructFrameConstants : public AllStatic {
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // FP-relative.
95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int kImplicitReceiverOffset = -5 * kPointerSize;
96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int kConstructorOffset      = kMinInt;
97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int kLengthOffset           = -4 * kPointerSize;
98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int kCodeOffset = StandardFrameConstants::kExpressionsOffset;
99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  static const int kFrameSize =
101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      StandardFrameConstants::kFixedFrameSize + 3 * kPointerSize;
102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockclass InternalFrameConstants : public AllStatic {
106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block public:
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  // FP-relative.
108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  static const int kCodeOffset = StandardFrameConstants::kExpressionsOffset;
109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockinline Object* JavaScriptFrame::function_slot_object() const {
113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  const int offset = JavaScriptFrameConstants::kFunctionOffset;
114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return Memory::Object_at(fp() + offset);
115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline void StackHandler::SetFp(Address slot, Address fp) {
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Memory::Address_at(slot) = fp;
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
123a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} }  // namespace v8::internal
124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#endif  // V8_IA32_FRAMES_IA32_H_
126