From d50f8aa92b1022f4b4be40d8e4ff6badb0b1f336 Mon Sep 17 00:00:00 2001 From: Michael Munday Date: Tue, 22 Nov 2016 11:48:56 -0500 Subject: [PATCH] Add preliminary frame offsets. These are educated guesses at this point. We might need more stack space because we don't have many free registers available. --- src/lj_asm.c | 2 + src/lj_frame.h | 18 +++---- src/vm_s390x.dasc | 118 +++++++++++++++++++++++----------------------- 3 files changed, 70 insertions(+), 68 deletions(-) diff --git a/src/lj_asm.c b/src/lj_asm.c index 7ce58924..d427fa5b 100644 --- a/src/lj_asm.c +++ b/src/lj_asm.c @@ -1567,6 +1567,8 @@ static void asm_loop(ASMState *as) #include "lj_asm_ppc.h" #elif LJ_TARGET_MIPS #include "lj_asm_mips.h" +#elif LJ_TARGET_S390X +#include "lj_asm_s390x.h" #else #error "Missing assembler for target CPU" #endif diff --git a/src/lj_frame.h b/src/lj_frame.h index 017bdaf9..65affb5d 100644 --- a/src/lj_frame.h +++ b/src/lj_frame.h @@ -200,15 +200,6 @@ enum { LJ_CONT_TAILCALL, LJ_CONT_FFI_CALLBACK }; /* Special continuations. */ #define CFRAME_OFS_MULTRES 192 #define CFRAME_SIZE 208 #define CFRAME_SHIFT_MULTRES 3 -#elif LJ_TARGET_S390X -#define CFRAME_OFS_ERRF -#define CFRAME_OFS_NRES -#define CFRAME_OFS_PREV -#define CFRAME_OFS_L -#define CFRAME_OFS_PC -#define CFRAME_OFS_MULTRES -#define CFRAME_SIZE -#define CFRAME_SHIFT_MULTRES #elif LJ_TARGET_PPC #if LJ_TARGET_XBOX360 #define CFRAME_OFS_ERRF 424 @@ -273,6 +264,15 @@ enum { LJ_CONT_TAILCALL, LJ_CONT_FFI_CALLBACK }; /* Special continuations. */ #endif #define CFRAME_OFS_MULTRES 0 #define CFRAME_SHIFT_MULTRES 3 +#elif LJ_TARGET_S390X +#define CFRAME_OFS_ERRF 216 +#define CFRAME_OFS_NRES 208 +#define CFRAME_OFS_PREV 200 +#define CFRAME_OFS_L 192 +#define CFRAME_OFS_PC 168 +#define CFRAME_OFS_MULTRES 160 +#define CFRAME_SIZE 172 +#define CFRAME_SHIFT_MULTRES 3 #else #error "Missing CFRAME_* definitions for this architecture" #endif diff --git a/src/vm_s390x.dasc b/src/vm_s390x.dasc index a9a38355..dc30593e 100644 --- a/src/vm_s390x.dasc +++ b/src/vm_s390x.dasc @@ -2,7 +2,22 @@ |// Bytecode interpreter, fast functions and helper functions. |// Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h | - +|// ELF ABI registers: +|// r0,r1 | | volatile | +|// r2 | parameter and return value | volatile | +|// r3-r5 | parameter | volatile | +|// r6 | parameter | saved | +|// r7-r11 | | saved | +|// r12 | GOT pointer (needed?) | saved | +|// r13 | literal pool (needed?) | saved | +|// r14 | return address | volatile | +|// r15 | stack pointer | saved | +|// f0,f2,f4,f6 | parameter and return value | volatile | +|// f1,f3,f5,f7 | | volatile | +|// f8-f15 | | saved | +|// ar0,ar1 | TLS | volatile | +|// ar2-ar15 | | volatile | +| |.arch s390x |.section code_op, code_sub | @@ -13,72 +28,57 @@ | |//----------------------------------------------------------------------- | -|// Fixed register assignments for the interpreter. -|// This is very fragile and has many dependencies. Caveat emptor. -|.define BASE, gr0 -|.define KBASE, gr1 -|.define PC, gr14 -|.define GLREG, gr2 -|.define LREG, gr3 -|.define TISNUM, gr4 -|.define TISNUMhi, gr5 -|.define TISNIL, gr6 -|.define fp, gr7 +|// Fixed register assignments for the interpreter, callee-saved. +|.define BASE, r7 // Base of current Lua stack frame. +|.define KBASE, r8 // Constants of current Lua function. +|.define PC, r9 // Next PC. +|.define GLREG, r10 // Global state. +|.define LREG, r11 // Register holding lua_State (also in SAVE_L). | -|// The following temporaries are not saved across C calls, except for RA/RC. -|.define RA, -|.define RC, -|.define RB, -|.define RAw, -|.define RCw, -|.define RBw, -|.define INS, -|.define INSw, -|.define ITYPE, -|.define TMP0, -|.define TMP1, -|.define TMP2, -|.define TMP3, -|.define TMP0w, -|.define TMP1w, -|.define TMP2w, -|.define TMP3w, +|// The following temporaries are not saved across C calls, except for RD. +|.define RA, r0 // Cannot be dereferenced. +|.define RB, r1 +|.define RC, r5 // Overlaps CARG4. +|.define RD, r6 // Overlaps CARG5. Callee-saved. | |// Calling conventions. Also used as temporaries. -|.define CARG1, -|.define CARG2, -|.define CARG3, -|.define CARG4, -|.define CARG5, -|.define CARG1w, -|.define CARG2w, -|.define CARG3w, -|.define CARG4w, -|.define CARG5w, +|.define CARG1, r2 +|.define CARG2, r3 +|.define CARG3, r4 +|.define CARG4, r5 +|.define CARG5, r6 | -|.define FARG1, -|.define FARG2, +|.define FARG1, f0 +|.define FARG2, f2 +|.define FARG3, f4 +|.define FARG4, f6 +| +|.define CRET1, r2 +| +|.define SP, r15 | -|.define CRET1, -|.define CRET1w, |// Stack layout while in interpreter. Must match with lj_frame.h. +|.define CFRAME_SPACE, 176 // Delta for SP, 8 byte aligned. | -|.define CFRAME_SPACE, 208 -|//----- 16 byte aligned, <-- sp entering interpreter -|// Unused [sp, #204] // 32 bit values +|// Register save area. +|.define SAVE_FPR6, 328(SP) +|.define SAVE_FPR4, 320(SP) +|.define SAVE_FPR2, 312(SP) +|.define SAVE_FPR0, 304(SP) +|.define SAVE_GPRS, 224(SP) // Save area for r6-r15 (10*8 bytes). | -|.define SAVE_NRES, -|.define SAVE_ERRF, -|.define SAVE_MULTRES, -|.define TMPD, -|.define SAVE_L, -|.define SAVE_PC, -|.define SAVE_CFRAME, -|.define SAVE_FPR_, -|.define SAVE_GPR_, -|.define SAVE_LR, -|.define SAVE_FP, -|//----- 16 byte aligned, <-- sp while in interpreter. +|// Argument save area, each slot is 8-bytes (32-bit types are sign/zero extended). +|.define SAVE_ERRF, 216(SP) // Argument 4, in r5. +|.define SAVE_NRES, 208(SP) // Argument 3, in r4. +|.define SAVE_CFRAME, 200(SP) // Argument 2, in r3. +|.define SAVE_L, 192(SP) // Argument 1, in r2. +|.define RESERVED, 184(SP) // Reserved for compiler use. +|.define BACKCHAIN, 176(SP) // <- SP entering interpreter. +|.define SAVE_PC, 168(SP) +|.define SAVE_MULTRES, 160(SP) +| +|// Callee save area (allocated by interpreter). +|.define CALLEESAVE 000(SP) // <- SP in interpreter. | |.define TMPDofs, |