frames-x64.h 2.33 KB
Newer Older
1
// Copyright 2012 the V8 project authors. All rights reserved.
2 3
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
4

5 6 7
#ifndef V8_X64_FRAMES_X64_H_
#define V8_X64_FRAMES_X64_H_

8 9
namespace v8 {
namespace internal {
10

11 12
const int kNumRegs = 16;
const RegList kJSCallerSaved =
13 14 15 16 17 18
    1 << 0 |  // rax
    1 << 1 |  // rcx
    1 << 2 |  // rdx
    1 << 3 |  // rbx - used as a caller-saved register in JavaScript code
    1 << 7;   // rdi - callee function

19
const int kNumJSCallerSaved = 5;
20

21
// Number of registers for which space is reserved in safepoints.
22
const int kNumSafepointRegisters = 16;
23 24 25

// ----------------------------------------------------

26 27
class EntryFrameConstants : public AllStatic {
 public:
28
#ifdef _WIN64
29 30 31 32 33
  static const int kCalleeSaveXMMRegisters = 10;
  static const int kXMMRegisterSize = 16;
  static const int kXMMRegistersBlockSize =
      kXMMRegisterSize * kCalleeSaveXMMRegisters;
  static const int kCallerFPOffset =
34
      -3 * kPointerSize + -7 * kRegisterSize - kXMMRegistersBlockSize;
35
#else
36 37
  // We have 3 Push and 5 pushq in the JSEntryStub::GenerateBody.
  static const int kCallerFPOffset = -3 * kPointerSize + -5 * kRegisterSize;
38
#endif
39
  static const int kArgvOffset     = 6 * kPointerSize;
40 41
};

42
class ExitFrameConstants : public TypedFrameConstants {
43
 public:
44 45 46
  static const int kSPOffset = TYPED_FRAME_PUSHED_VALUE_OFFSET(0);
  static const int kCodeOffset = TYPED_FRAME_PUSHED_VALUE_OFFSET(1);
  DEFINE_TYPED_FRAME_SIZES(2);
47

48
  static const int kCallerFPOffset  = +0 * kPointerSize;
49
  static const int kCallerPCOffset  = kFPOnStackSize;
50 51 52

  // FP-relative displacement of the caller's SP.  It points just
  // below the saved PC.
53
  static const int kCallerSPDisplacement = kCallerPCOffset + kPCOnStackSize;
54 55

  static const int kConstantPoolOffset   = 0;  // Not used
56 57 58 59 60
};


class JavaScriptFrameConstants : public AllStatic {
 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 69 70 71
  static const int kReceiverOffset = -1 * kPointerSize;
};


72 73
}  // namespace internal
}  // namespace v8
74 75

#endif  // V8_X64_FRAMES_X64_H_