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