Home | History | Annotate | Download | only in mips64
      1 // Copyright 2011 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 
      6 
      7 #ifndef V8_MIPS_FRAMES_MIPS_H_
      8 #define V8_MIPS_FRAMES_MIPS_H_
      9 
     10 namespace v8 {
     11 namespace internal {
     12 
     13 // Register lists.
     14 // Note that the bit values must match those used in actual instruction
     15 // encoding.
     16 const int kNumRegs = 32;
     17 
     18 const RegList kJSCallerSaved =
     19   1 << 2  |  // v0
     20   1 << 3  |  // v1
     21   1 << 4  |  // a0
     22   1 << 5  |  // a1
     23   1 << 6  |  // a2
     24   1 << 7  |  // a3
     25   1 << 8  |  // a4
     26   1 << 9  |  // a5
     27   1 << 10 |  // a6
     28   1 << 11 |  // a7
     29   1 << 12 |  // t0
     30   1 << 13 |  // t1
     31   1 << 14 |  // t2
     32   1 << 15;   // t3
     33 
     34 const int kNumJSCallerSaved = 14;
     35 
     36 
     37 // Return the code of the n-th caller-saved register available to JavaScript
     38 // e.g. JSCallerSavedReg(0) returns a0.code() == 4.
     39 int JSCallerSavedCode(int n);
     40 
     41 
     42 // Callee-saved registers preserved when switching from C to JavaScript.
     43 const RegList kCalleeSaved =
     44   1 << 16 |  // s0
     45   1 << 17 |  // s1
     46   1 << 18 |  // s2
     47   1 << 19 |  // s3
     48   1 << 20 |  // s4
     49   1 << 21 |  // s5
     50   1 << 22 |  // s6 (roots in Javascript code)
     51   1 << 23 |  // s7 (cp in Javascript code)
     52   1 << 30;   // fp/s8
     53 
     54 const int kNumCalleeSaved = 9;
     55 
     56 const RegList kCalleeSavedFPU =
     57   1 << 20 |  // f20
     58   1 << 22 |  // f22
     59   1 << 24 |  // f24
     60   1 << 26 |  // f26
     61   1 << 28 |  // f28
     62   1 << 30;   // f30
     63 
     64 const int kNumCalleeSavedFPU = 6;
     65 
     66 const RegList kCallerSavedFPU =
     67   1 << 0  |  // f0
     68   1 << 2  |  // f2
     69   1 << 4  |  // f4
     70   1 << 6  |  // f6
     71   1 << 8  |  // f8
     72   1 << 10 |  // f10
     73   1 << 12 |  // f12
     74   1 << 14 |  // f14
     75   1 << 16 |  // f16
     76   1 << 18;   // f18
     77 
     78 
     79 // Number of registers for which space is reserved in safepoints. Must be a
     80 // multiple of 8.
     81 const int kNumSafepointRegisters = 24;
     82 
     83 // Define the list of registers actually saved at safepoints.
     84 // Note that the number of saved registers may be smaller than the reserved
     85 // space, i.e. kNumSafepointSavedRegisters <= kNumSafepointRegisters.
     86 const RegList kSafepointSavedRegisters = kJSCallerSaved | kCalleeSaved;
     87 const int kNumSafepointSavedRegisters =
     88     kNumJSCallerSaved + kNumCalleeSaved;
     89 
     90 const int kUndefIndex = -1;
     91 // Map with indexes on stack that corresponds to codes of saved registers.
     92 const int kSafepointRegisterStackIndexMap[kNumRegs] = {
     93   kUndefIndex,  // zero_reg
     94   kUndefIndex,  // at
     95   0,   // v0
     96   1,   // v1
     97   2,   // a0
     98   3,   // a1
     99   4,   // a2
    100   5,   // a3
    101   6,   // a4
    102   7,   // a5
    103   8,   // a6
    104   9,   // a7
    105   10,  // t0
    106   11,  // t1
    107   12,  // t2
    108   13,  // t3
    109   14,  // s0
    110   15,  // s1
    111   16,  // s2
    112   17,  // s3
    113   18,  // s4
    114   19,  // s5
    115   20,  // s6
    116   21,  // s7
    117   kUndefIndex,  // t8
    118   kUndefIndex,  // t9
    119   kUndefIndex,  // k0
    120   kUndefIndex,  // k1
    121   kUndefIndex,  // gp
    122   kUndefIndex,  // sp
    123   22,  // fp
    124   kUndefIndex
    125 };
    126 
    127 
    128 // ----------------------------------------------------
    129 
    130 class EntryFrameConstants : public AllStatic {
    131  public:
    132   static const int kCallerFPOffset =
    133       -(StandardFrameConstants::kFixedFrameSizeFromFp + kPointerSize);
    134 };
    135 
    136 class ExitFrameConstants : public TypedFrameConstants {
    137  public:
    138   static const int kSPOffset = TYPED_FRAME_PUSHED_VALUE_OFFSET(0);
    139   static const int kCodeOffset = TYPED_FRAME_PUSHED_VALUE_OFFSET(1);
    140   DEFINE_TYPED_FRAME_SIZES(2);
    141 
    142   // The caller fields are below the frame pointer on the stack.
    143   static const int kCallerFPOffset = +0 * kPointerSize;
    144   // The calling JS function is between FP and PC.
    145   static const int kCallerPCOffset = +1 * kPointerSize;
    146 
    147   // MIPS-specific: a pointer to the old sp to avoid unnecessary calculations.
    148   static const int kCallerSPOffset = +2 * kPointerSize;
    149 
    150   // FP-relative displacement of the caller's SP.
    151   static const int kCallerSPDisplacement = +2 * kPointerSize;
    152 
    153   static const int kConstantPoolOffset = 0;  // Not used.
    154 };
    155 
    156 
    157 class JavaScriptFrameConstants : public AllStatic {
    158  public:
    159   // FP-relative.
    160   static const int kLocal0Offset = StandardFrameConstants::kExpressionsOffset;
    161   static const int kLastParameterOffset = +2 * kPointerSize;
    162   static const int kFunctionOffset = StandardFrameConstants::kFunctionOffset;
    163 
    164   // Caller SP-relative.
    165   static const int kParam0Offset   = -2 * kPointerSize;
    166   static const int kReceiverOffset = -1 * kPointerSize;
    167 };
    168 
    169 
    170 }  // namespace internal
    171 }  // namespace v8
    172 
    173 #endif
    174