1// Copyright 2012 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_X64_FRAMES_X64_H_
6#define V8_X64_FRAMES_X64_H_
7
8namespace v8 {
9namespace internal {
10
11const int kNumRegs = 16;
12const RegList kJSCallerSaved =
13    1 << 0 |  // rax
14    1 << 1 |  // rcx
15    1 << 2 |  // rdx
16    1 << 3 |  // rbx - used as a caller-saved register in JavaScript code
17    1 << 7;   // rdi - callee function
18
19const int kNumJSCallerSaved = 5;
20
21// Number of registers for which space is reserved in safepoints.
22const int kNumSafepointRegisters = 16;
23
24// ----------------------------------------------------
25
26class EntryFrameConstants : public AllStatic {
27 public:
28#ifdef _WIN64
29  static const int kCalleeSaveXMMRegisters = 10;
30  static const int kXMMRegisterSize = 16;
31  static const int kXMMRegistersBlockSize =
32      kXMMRegisterSize * kCalleeSaveXMMRegisters;
33  static const int kCallerFPOffset =
34      -3 * kPointerSize + -7 * kRegisterSize - kXMMRegistersBlockSize;
35#else
36  // We have 3 Push and 5 pushq in the JSEntryStub::GenerateBody.
37  static const int kCallerFPOffset = -3 * kPointerSize + -5 * kRegisterSize;
38#endif
39  static const int kArgvOffset     = 6 * kPointerSize;
40};
41
42class ExitFrameConstants : public TypedFrameConstants {
43 public:
44  static const int kSPOffset = TYPED_FRAME_PUSHED_VALUE_OFFSET(0);
45  static const int kCodeOffset = TYPED_FRAME_PUSHED_VALUE_OFFSET(1);
46  DEFINE_TYPED_FRAME_SIZES(2);
47
48  static const int kCallerFPOffset  = +0 * kPointerSize;
49  static const int kCallerPCOffset  = kFPOnStackSize;
50
51  // FP-relative displacement of the caller's SP.  It points just
52  // below the saved PC.
53  static const int kCallerSPDisplacement = kCallerPCOffset + kPCOnStackSize;
54
55  static const int kConstantPoolOffset   = 0;  // Not used
56};
57
58
59class JavaScriptFrameConstants : public AllStatic {
60 public:
61  // FP-relative.
62  static const int kLocal0Offset = StandardFrameConstants::kExpressionsOffset;
63  static const int kLastParameterOffset = kFPOnStackSize + kPCOnStackSize;
64  static const int kFunctionOffset = StandardFrameConstants::kFunctionOffset;
65
66  // Caller SP-relative.
67  static const int kParam0Offset   = -2 * kPointerSize;
68  static const int kReceiverOffset = -1 * kPointerSize;
69};
70
71
72}  // namespace internal
73}  // namespace v8
74
75#endif  // V8_X64_FRAMES_X64_H_
76