|
|
- From 195e0be62c0aa0f6aaf63a93ee322bb0a630576c Mon Sep 17 00:00:00 2001
- From: Clint Bland <bland.cr@gmail.com>
- Date: Wed, 13 Mar 2019 19:19:16 -0700
- Subject: [PATCH] Have powerpc use fake GOT like MIPS
-
- ---
- src/lj_dispatch.c | 15 +++++++++++++++
- src/lj_dispatch.h | 29 ++++++++++++++++++++++++++++-
- src/vm_ppc.dasc | 9 ++++++++-
- 3 files changed, 51 insertions(+), 2 deletions(-)
-
- --- a/src/lj_dispatch.c
- +++ b/src/lj_dispatch.c
- @@ -56,6 +56,18 @@ static const ASMFunction dispatch_got[]
- #undef GOTFUNC
- #endif
-
- +#if LJ_TARGET_PPC
- +#include <math.h>
- +LJ_FUNCA_NORET void LJ_FASTCALL lj_ffh_coroutine_wrap_err(lua_State *L,
- + lua_State *co);
- +
- +#define GOTFUNC(name) (ASMFunction)name,
- +static const ASMFunction dispatch_got[] = {
- + GOTDEF(GOTFUNC)
- +};
- +#undef GOTFUNC
- +#endif
- +
- /* Initialize instruction dispatch table and hot counters. */
- void lj_dispatch_init(GG_State *GG)
- {
- @@ -77,6 +89,9 @@ void lj_dispatch_init(GG_State *GG)
- #if LJ_TARGET_MIPS
- memcpy(GG->got, dispatch_got, LJ_GOT__MAX*sizeof(ASMFunction *));
- #endif
- +#if LJ_TARGET_PPC
- + memcpy(GG->got, dispatch_got, LJ_GOT__MAX*4);
- +#endif
- }
-
- #if LJ_HASJIT
- --- a/src/lj_dispatch.h
- +++ b/src/lj_dispatch.h
- @@ -66,6 +66,33 @@ GOTDEF(GOTENUM)
- };
- #endif
-
- +#if LJ_TARGET_PPC
- +/* Need our own global offset table for the dreaded MIPS calling conventions. */
- +#if LJ_SOFTFP
- +#ifndef _LJ_IRCALL_H
- +extern double __ledf2(double a, double b);
- +extern double __adddf3(double a, double b);
- +extern double __subdf3(double a, double b);
- +extern double __muldf3(double a, double b);
- +extern double __divdf3(double a, double b);
- +#endif
- +#define SFGOTDEF(_) _(__ledf2) _(__adddf3) _(__subdf3) _(__muldf3) _(__divdf3)
- +#else
- +#define SFGOTDEF(_)
- +#endif
- +#define GOTDEF(_) \
- + _(floor) _(ceil) _(trunc) _(log) _(log10) _(exp) _(sin) _(cos) _(tan) \
- + _(asin) _(acos) _(atan) _(sinh) _(cosh) _(tanh) _(frexp) _(modf) _(atan2) \
- + _(pow) _(fmod) _(ldexp) _(sqrt) SFGOTDEF(_)
- +
- +enum {
- +#define GOTENUM(name) LJ_GOT_##name,
- +GOTDEF(GOTENUM)
- +#undef GOTENUM
- + LJ_GOT__MAX
- +};
- +#endif
- +
- /* Type of hot counter. Must match the code in the assembler VM. */
- /* 16 bits are sufficient. Only 0.0015% overhead with maximum slot penalty. */
- typedef uint16_t HotCount;
- @@ -89,7 +116,7 @@ typedef uint16_t HotCount;
- typedef struct GG_State {
- lua_State L; /* Main thread. */
- global_State g; /* Global state. */
- -#if LJ_TARGET_MIPS
- +#if LJ_TARGET_MIPS || LJ_TARGET_PPC
- ASMFunction got[LJ_GOT__MAX]; /* Global offset table. */
- #endif
- #if LJ_HASJIT
- --- a/src/vm_ppc.dasc
- +++ b/src/vm_ppc.dasc
- @@ -59,7 +59,12 @@
- |.define ENV_OFS, 8
- |.endif
- |.else // No TOC.
- -|.macro blex, target; bl extern target@plt; .endmacro
- +|.macro blex, target
- +| lwz TMP0, DISPATCH_GOT(target)(DISPATCH)
- +| mtctr TMP0
- +| bctrl
- +| //bl extern target@plt
- +|.endmacro
- |.macro .toc, a, b; .endmacro
- |.endif
- |.macro .tocenv, a, b; .if TOCENV; a, b; .endif; .endmacro
- @@ -482,6 +487,8 @@
- |// Assumes DISPATCH is relative to GL.
- #define DISPATCH_GL(field) (GG_DISP2G + (int)offsetof(global_State, field))
- #define DISPATCH_J(field) (GG_DISP2J + (int)offsetof(jit_State, field))
- +#define GG_DISP2GOT (GG_OFS(got) - GG_OFS(dispatch))
- +#define DISPATCH_GOT(name) (GG_DISP2GOT + 4*LJ_GOT_##name)
- |
- #define PC2PROTO(field) ((int)offsetof(GCproto, field)-(int)sizeof(GCproto))
- |
|