1// Copyright 2014 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_PPC_FRAMES_PPC_H_ 6#define V8_PPC_FRAMES_PPC_H_ 7 8namespace v8 { 9namespace internal { 10 11 12// Register list in load/store instructions 13// Note that the bit values must match those used in actual instruction encoding 14const int kNumRegs = 32; 15 16 17// Caller-saved/arguments registers 18const RegList kJSCallerSaved = 1 << 3 | // r3 a1 19 1 << 4 | // r4 a2 20 1 << 5 | // r5 a3 21 1 << 6 | // r6 a4 22 1 << 7 | // r7 a5 23 1 << 8 | // r8 a6 24 1 << 9 | // r9 a7 25 1 << 10 | // r10 a8 26 1 << 11; 27 28const int kNumJSCallerSaved = 9; 29 30// Return the code of the n-th caller-saved register available to JavaScript 31// e.g. JSCallerSavedReg(0) returns r0.code() == 0 32int JSCallerSavedCode(int n); 33 34 35// Callee-saved registers preserved when switching from C to JavaScript 36const RegList kCalleeSaved = 1 << 14 | // r14 37 1 << 15 | // r15 38 1 << 16 | // r16 39 1 << 17 | // r17 40 1 << 18 | // r18 41 1 << 19 | // r19 42 1 << 20 | // r20 43 1 << 21 | // r21 44 1 << 22 | // r22 45 1 << 23 | // r23 46 1 << 24 | // r24 47 1 << 25 | // r25 48 1 << 26 | // r26 49 1 << 27 | // r27 50 1 << 28 | // r28 51 1 << 29 | // r29 52 1 << 30 | // r20 53 1 << 31; // r31 54 55 56const int kNumCalleeSaved = 18; 57 58const RegList kCallerSavedDoubles = 1 << 0 | // d0 59 1 << 1 | // d1 60 1 << 2 | // d2 61 1 << 3 | // d3 62 1 << 4 | // d4 63 1 << 5 | // d5 64 1 << 6 | // d6 65 1 << 7 | // d7 66 1 << 8 | // d8 67 1 << 9 | // d9 68 1 << 10 | // d10 69 1 << 11 | // d11 70 1 << 12 | // d12 71 1 << 13; // d13 72 73const int kNumCallerSavedDoubles = 14; 74 75const RegList kCalleeSavedDoubles = 1 << 14 | // d14 76 1 << 15 | // d15 77 1 << 16 | // d16 78 1 << 17 | // d17 79 1 << 18 | // d18 80 1 << 19 | // d19 81 1 << 20 | // d20 82 1 << 21 | // d21 83 1 << 22 | // d22 84 1 << 23 | // d23 85 1 << 24 | // d24 86 1 << 25 | // d25 87 1 << 26 | // d26 88 1 << 27 | // d27 89 1 << 28 | // d28 90 1 << 29 | // d29 91 1 << 30 | // d30 92 1 << 31; // d31 93 94const int kNumCalleeSavedDoubles = 18; 95 96 97// Number of registers for which space is reserved in safepoints. Must be a 98// multiple of 8. 99const int kNumSafepointRegisters = 32; 100 101// The following constants describe the stack frame linkage area as 102// defined by the ABI. Note that kNumRequiredStackFrameSlots must 103// satisfy alignment requirements (rounding up if required). 104#if V8_TARGET_ARCH_PPC64 && V8_TARGET_LITTLE_ENDIAN 105// [0] back chain 106// [1] condition register save area 107// [2] link register save area 108// [3] TOC save area 109// [4] Parameter1 save area 110// ... 111// [11] Parameter8 save area 112// [12] Parameter9 slot (if necessary) 113// ... 114const int kNumRequiredStackFrameSlots = 12; 115const int kStackFrameLRSlot = 2; 116const int kStackFrameExtraParamSlot = 12; 117#elif V8_OS_AIX || V8_TARGET_ARCH_PPC64 118// [0] back chain 119// [1] condition register save area 120// [2] link register save area 121// [3] reserved for compiler 122// [4] reserved by binder 123// [5] TOC save area 124// [6] Parameter1 save area 125// ... 126// [13] Parameter8 save area 127// [14] Parameter9 slot (if necessary) 128// ... 129#if V8_TARGET_ARCH_PPC64 130const int kNumRequiredStackFrameSlots = 14; 131#else 132const int kNumRequiredStackFrameSlots = 16; 133#endif 134const int kStackFrameLRSlot = 2; 135const int kStackFrameExtraParamSlot = 14; 136#else 137// [0] back chain 138// [1] link register save area 139// [2] Parameter9 slot (if necessary) 140// ... 141const int kNumRequiredStackFrameSlots = 4; 142const int kStackFrameLRSlot = 1; 143const int kStackFrameExtraParamSlot = 2; 144#endif 145 146// ---------------------------------------------------- 147 148 149class EntryFrameConstants : public AllStatic { 150 public: 151 static const int kCallerFPOffset = 152 -(StandardFrameConstants::kFixedFrameSizeFromFp + kPointerSize); 153}; 154 155class ExitFrameConstants : public TypedFrameConstants { 156 public: 157 static const int kSPOffset = TYPED_FRAME_PUSHED_VALUE_OFFSET(0); 158 static const int kCodeOffset = TYPED_FRAME_PUSHED_VALUE_OFFSET(1); 159 DEFINE_TYPED_FRAME_SIZES(2); 160 161 // The caller fields are below the frame pointer on the stack. 162 static const int kCallerFPOffset = 0 * kPointerSize; 163 // The calling JS function is below FP. 164 static const int kCallerPCOffset = 1 * kPointerSize; 165 166 // FP-relative displacement of the caller's SP. It points just 167 // below the saved PC. 168 static const int kCallerSPDisplacement = 2 * kPointerSize; 169}; 170 171 172class JavaScriptFrameConstants : public AllStatic { 173 public: 174 // FP-relative. 175 static const int kLocal0Offset = StandardFrameConstants::kExpressionsOffset; 176 static const int kLastParameterOffset = +2 * kPointerSize; 177 static const int kFunctionOffset = StandardFrameConstants::kFunctionOffset; 178 179 // Caller SP-relative. 180 static const int kParam0Offset = -2 * kPointerSize; 181 static const int kReceiverOffset = -1 * kPointerSize; 182}; 183 184 185} // namespace internal 186} // namespace v8 187 188#endif // V8_PPC_FRAMES_PPC_H_ 189