Index: src/s390/frames-s390.h |
diff --git a/src/s390/frames-s390.h b/src/s390/frames-s390.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..54a9f2d1a31fd351e8b07610115e84a77e65938d |
--- /dev/null |
+++ b/src/s390/frames-s390.h |
@@ -0,0 +1,190 @@ |
+// Copyright 2014 the V8 project authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef V8_S390_FRAMES_S390_H_ |
+#define V8_S390_FRAMES_S390_H_ |
+ |
+namespace v8 { |
+namespace internal { |
+ |
+// Register list in load/store instructions |
+// Note that the bit values must match those used in actual instruction encoding |
+const int kNumRegs = 16; |
+ |
+// Caller-saved/arguments registers |
+const RegList kJSCallerSaved = 1 << 1 | 1 << 2 | // r2 a1 |
+ 1 << 3 | // r3 a2 |
+ 1 << 4 | // r4 a3 |
+ 1 << 5; // r5 a4 |
+ |
+const int kNumJSCallerSaved = 5; |
+ |
+// Return the code of the n-th caller-saved register available to JavaScript |
+// e.g. JSCallerSavedReg(0) returns r0.code() == 0 |
+int JSCallerSavedCode(int n); |
+ |
+// Callee-saved registers preserved when switching from C to JavaScript |
+const RegList kCalleeSaved = |
+ 1 << 6 | // r6 (argument passing in CEntryStub) |
+ // (HandleScope logic in MacroAssembler) |
+ 1 << 7 | // r7 (argument passing in CEntryStub) |
+ // (HandleScope logic in MacroAssembler) |
+ 1 << 8 | // r8 (argument passing in CEntryStub) |
+ // (HandleScope logic in MacroAssembler) |
+ 1 << 9 | // r9 (HandleScope logic in MacroAssembler) |
+ 1 << 10 | // r10 (Roots register in Javascript) |
+ 1 << 11 | // r11 (fp in Javascript) |
+ 1 << 12 | // r12 (ip in Javascript) |
+ 1 << 13; // r13 (cp in Javascript) |
+// 1 << 15; // r15 (sp in Javascript) |
+ |
+const int kNumCalleeSaved = 8; |
+ |
+#ifdef V8_TARGET_ARCH_S390X |
+ |
+const RegList kCallerSavedDoubles = 1 << 0 | // d0 |
+ 1 << 1 | // d1 |
+ 1 << 2 | // d2 |
+ 1 << 3 | // d3 |
+ 1 << 4 | // d4 |
+ 1 << 5 | // d5 |
+ 1 << 6 | // d6 |
+ 1 << 7; // d7 |
+ |
+const int kNumCallerSavedDoubles = 8; |
+ |
+const RegList kCalleeSavedDoubles = 1 << 8 | // d8 |
+ 1 << 9 | // d9 |
+ 1 << 10 | // d10 |
+ 1 << 11 | // d11 |
+ 1 << 12 | // d12 |
+ 1 << 13 | // d12 |
+ 1 << 14 | // d12 |
+ 1 << 15; // d13 |
+ |
+const int kNumCalleeSavedDoubles = 8; |
+ |
+#else |
+ |
+const RegList kCallerSavedDoubles = 1 << 14 | // d14 |
+ 1 << 15 | // d15 |
+ 1 << 0 | // d0 |
+ 1 << 1 | // d1 |
+ 1 << 2 | // d2 |
+ 1 << 3 | // d3 |
+ 1 << 5 | // d5 |
+ 1 << 7 | // d7 |
+ 1 << 8 | // d8 |
+ 1 << 9 | // d9 |
+ 1 << 10 | // d10 |
+ 1 << 11 | // d10 |
+ 1 << 12 | // d10 |
+ 1 << 13; // d11 |
+ |
+const int kNumCallerSavedDoubles = 14; |
+ |
+const RegList kCalleeSavedDoubles = 1 << 4 | // d4 |
+ 1 << 6; // d6 |
+ |
+const int kNumCalleeSavedDoubles = 2; |
+ |
+#endif |
+ |
+// Number of registers for which space is reserved in safepoints. Must be a |
+// multiple of 8. |
+// TODO(regis): Only 8 registers may actually be sufficient. Revisit. |
+const int kNumSafepointRegisters = 16; |
+ |
+// Define the list of registers actually saved at safepoints. |
+// Note that the number of saved registers may be smaller than the reserved |
+// space, i.e. kNumSafepointSavedRegisters <= kNumSafepointRegisters. |
+// const RegList kSafepointSavedRegisters = kJSCallerSaved | kCalleeSaved; |
+// const int kNumSafepointSavedRegisters = kNumJSCallerSaved + kNumCalleeSaved; |
+ |
+// The following constants describe the stack frame linkage area as |
+// defined by the ABI. |
+ |
+#if V8_TARGET_ARCH_S390X |
+// [0] Back Chain |
+// [1] Reserved for compiler use |
+// [2] GPR 2 |
+// [3] GPR 3 |
+// ... |
+// [15] GPR 15 |
+// [16] FPR 0 |
+// [17] FPR 2 |
+// [18] FPR 4 |
+// [19] FPR 6 |
+const int kNumRequiredStackFrameSlots = 20; |
+const int kStackFrameRASlot = 14; |
+const int kStackFrameSPSlot = 15; |
+const int kStackFrameExtraParamSlot = 20; |
+#else |
+// [0] Back Chain |
+// [1] Reserved for compiler use |
+// [2] GPR 2 |
+// [3] GPR 3 |
+// ... |
+// [15] GPR 15 |
+// [16..17] FPR 0 |
+// [18..19] FPR 2 |
+// [20..21] FPR 4 |
+// [22..23] FPR 6 |
+const int kNumRequiredStackFrameSlots = 24; |
+const int kStackFrameRASlot = 14; |
+const int kStackFrameSPSlot = 15; |
+const int kStackFrameExtraParamSlot = 24; |
+#endif |
+ |
+// zLinux ABI requires caller frames to include sufficient space for |
+// callee preserved register save area. |
+#if V8_TARGET_ARCH_S390X |
+const int kCalleeRegisterSaveAreaSize = 160; |
+#elif V8_TARGET_ARCH_S390 |
+const int kCalleeRegisterSaveAreaSize = 96; |
+#else |
+const int kCalleeRegisterSaveAreaSize = 0; |
+#endif |
+ |
+// ---------------------------------------------------- |
+ |
+class EntryFrameConstants : public AllStatic { |
+ public: |
+ static const int kCallerFPOffset = |
+ -(StandardFrameConstants::kFixedFrameSizeFromFp + kPointerSize); |
+}; |
+ |
+class ExitFrameConstants : public AllStatic { |
+ public: |
+ static const int kFrameSize = 2 * kPointerSize; |
+ static const int kConstantPoolOffset = 0; // Not used. |
+ static const int kCodeOffset = -2 * kPointerSize; |
+ static const int kSPOffset = -1 * kPointerSize; |
+ |
+ // The caller fields are below the frame pointer on the stack. |
+ static const int kCallerFPOffset = 0 * kPointerSize; |
+ // The calling JS function is below FP. |
+ static const int kCallerPCOffset = 1 * kPointerSize; |
+ |
+ // FP-relative displacement of the caller's SP. It points just |
+ // below the saved PC. |
+ static const int kCallerSPDisplacement = 2 * kPointerSize; |
+}; |
+ |
+class JavaScriptFrameConstants : public AllStatic { |
+ public: |
+ // FP-relative. |
+ static const int kLocal0Offset = StandardFrameConstants::kExpressionsOffset; |
+ static const int kLastParameterOffset = +2 * kPointerSize; |
+ static const int kFunctionOffset = StandardFrameConstants::kMarkerOffset; |
+ |
+ // Caller SP-relative. |
+ static const int kParam0Offset = -2 * kPointerSize; |
+ static const int kReceiverOffset = -1 * kPointerSize; |
+}; |
+ |
+} // namespace internal |
+} // namespace v8 |
+ |
+#endif // V8_S390_FRAMES_S390_H_ |