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 8 namespace v8 { 9 namespace internal { 10 11 12 // Register list in load/store instructions 13 // Note that the bit values must match those used in actual instruction encoding 14 const int kNumRegs = 32; 15 16 17 // Caller-saved/arguments registers 18 const 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 28 const 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 32 int JSCallerSavedCode(int n); 33 34 35 // Callee-saved registers preserved when switching from C to JavaScript 36 const 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 56 const int kNumCalleeSaved = 18; 57 58 const 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 73 const int kNumCallerSavedDoubles = 14; 74 75 const 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 94 const int kNumCalleeSavedDoubles = 18; 95 96 97 // Number of registers for which space is reserved in safepoints. Must be a 98 // multiple of 8. 99 const 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 // ... 114 const int kNumRequiredStackFrameSlots = 12; 115 const int kStackFrameLRSlot = 2; 116 const 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 130 const int kNumRequiredStackFrameSlots = 14; 131 #else 132 const int kNumRequiredStackFrameSlots = 16; 133 #endif 134 const int kStackFrameLRSlot = 2; 135 const int kStackFrameExtraParamSlot = 14; 136 #else 137 // [0] back chain 138 // [1] link register save area 139 // [2] Parameter9 slot (if necessary) 140 // ... 141 const int kNumRequiredStackFrameSlots = 4; 142 const int kStackFrameLRSlot = 1; 143 const int kStackFrameExtraParamSlot = 2; 144 #endif 145 146 // ---------------------------------------------------- 147 148 149 class EntryFrameConstants : public AllStatic { 150 public: 151 static const int kCallerFPOffset = 152 -(StandardFrameConstants::kFixedFrameSizeFromFp + kPointerSize); 153 }; 154 155 156 class ExitFrameConstants : public AllStatic { 157 public: 158 static const int kFrameSize = 159 FLAG_enable_embedded_constant_pool ? 3 * kPointerSize : 2 * kPointerSize; 160 161 static const int kConstantPoolOffset = 162 FLAG_enable_embedded_constant_pool ? -3 * kPointerSize : 0; 163 static const int kCodeOffset = -2 * kPointerSize; 164 static const int kSPOffset = -1 * kPointerSize; 165 166 // The caller fields are below the frame pointer on the stack. 167 static const int kCallerFPOffset = 0 * kPointerSize; 168 // The calling JS function is below FP. 169 static const int kCallerPCOffset = 1 * kPointerSize; 170 171 // FP-relative displacement of the caller's SP. It points just 172 // below the saved PC. 173 static const int kCallerSPDisplacement = 2 * kPointerSize; 174 }; 175 176 177 class JavaScriptFrameConstants : public AllStatic { 178 public: 179 // FP-relative. 180 static const int kLocal0Offset = StandardFrameConstants::kExpressionsOffset; 181 static const int kLastParameterOffset = +2 * kPointerSize; 182 static const int kFunctionOffset = StandardFrameConstants::kMarkerOffset; 183 184 // Caller SP-relative. 185 static const int kParam0Offset = -2 * kPointerSize; 186 static const int kReceiverOffset = -1 * kPointerSize; 187 }; 188 189 190 } // namespace internal 191 } // namespace v8 192 193 #endif // V8_PPC_FRAMES_PPC_H_ 194