Home | History | Annotate | Download | only in ppc
      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 class 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 
    172 class 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