diff options
-rw-r--r-- | src/Makefile | 5 | ||||
-rw-r--r-- | src/host/buildvm.c | 2 | ||||
-rw-r--r-- | src/host/buildvm_asm.c | 11 | ||||
-rw-r--r-- | src/lj_arch.h | 36 | ||||
-rw-r--r-- | src/lj_asm_ppc.h | 6 | ||||
-rw-r--r-- | src/lj_frame.h | 2 | ||||
-rw-r--r-- | src/lj_target_ppc.h | 2 | ||||
-rw-r--r-- | src/vm_ppc.dasc | 4 |
8 files changed, 50 insertions, 18 deletions
diff --git a/src/Makefile b/src/Makefile index 71ab6ea0..d7539fd5 100644 --- a/src/Makefile +++ b/src/Makefile | |||
@@ -421,12 +421,15 @@ ifeq (ppc,$(TARGET_LJARCH)) | |||
421 | ifneq (,$(findstring LJ_ARCH_ROUND 1,$(TARGET_TESTARCH))) | 421 | ifneq (,$(findstring LJ_ARCH_ROUND 1,$(TARGET_TESTARCH))) |
422 | DASM_AFLAGS+= -D ROUND | 422 | DASM_AFLAGS+= -D ROUND |
423 | endif | 423 | endif |
424 | ifneq (,$(findstring LJ_ARCH_PPC64 1,$(TARGET_TESTARCH))) | 424 | ifneq (,$(findstring LJ_ARCH_PPC32ON64 1,$(TARGET_TESTARCH))) |
425 | DASM_AFLAGS+= -D GPR64 | 425 | DASM_AFLAGS+= -D GPR64 |
426 | endif | 426 | endif |
427 | ifeq (PS3,$(TARGET_SYS)) | 427 | ifeq (PS3,$(TARGET_SYS)) |
428 | DASM_AFLAGS+= -D PPE -D TOC | 428 | DASM_AFLAGS+= -D PPE -D TOC |
429 | endif | 429 | endif |
430 | ifneq (,$(findstring LJ_ARCH_PPC64 ,$(TARGET_TESTARCH))) | ||
431 | DASM_ARCH= ppc64 | ||
432 | endif | ||
430 | endif | 433 | endif |
431 | endif | 434 | endif |
432 | endif | 435 | endif |
diff --git a/src/host/buildvm.c b/src/host/buildvm.c index c3e7dad2..324dd263 100644 --- a/src/host/buildvm.c +++ b/src/host/buildvm.c | |||
@@ -114,7 +114,7 @@ static const char *sym_decorate(BuildCtx *ctx, | |||
114 | else | 114 | else |
115 | *p = '\0'; | 115 | *p = '\0'; |
116 | #elif LJ_TARGET_PPC && !LJ_TARGET_CONSOLE | 116 | #elif LJ_TARGET_PPC && !LJ_TARGET_CONSOLE |
117 | /* Keep @plt. */ | 117 | /* Keep @plt etc. */ |
118 | #else | 118 | #else |
119 | *p = '\0'; | 119 | *p = '\0'; |
120 | #endif | 120 | #endif |
diff --git a/src/host/buildvm_asm.c b/src/host/buildvm_asm.c index fe1b589a..9b7ae53a 100644 --- a/src/host/buildvm_asm.c +++ b/src/host/buildvm_asm.c | |||
@@ -140,6 +140,14 @@ static void emit_asm_wordreloc(BuildCtx *ctx, uint8_t *p, int n, | |||
140 | fprintf(ctx->fp, "\t%s %d, %d, " TOCPREFIX "%s\n", | 140 | fprintf(ctx->fp, "\t%s %d, %d, " TOCPREFIX "%s\n", |
141 | (ins & 1) ? "bcl" : "bc", (ins >> 21) & 31, (ins >> 16) & 31, sym); | 141 | (ins & 1) ? "bcl" : "bc", (ins >> 21) & 31, (ins >> 16) & 31, sym); |
142 | } else if ((ins >> 26) == 18) { | 142 | } else if ((ins >> 26) == 18) { |
143 | #if LJ_ARCH_PPC64 | ||
144 | const char *suffix = strchr(sym, '@'); | ||
145 | if (suffix && suffix[1] == 'h') { | ||
146 | fprintf(ctx->fp, "\taddis 11, 2, %s\n", sym); | ||
147 | } else if (suffix && suffix[1] == 'l') { | ||
148 | fprintf(ctx->fp, "\tld 12, %s\n", sym); | ||
149 | } else | ||
150 | #endif | ||
143 | fprintf(ctx->fp, "\t%s " TOCPREFIX "%s\n", (ins & 1) ? "bl" : "b", sym); | 151 | fprintf(ctx->fp, "\t%s " TOCPREFIX "%s\n", (ins & 1) ? "bl" : "b", sym); |
144 | } else { | 152 | } else { |
145 | fprintf(stderr, | 153 | fprintf(stderr, |
@@ -237,6 +245,9 @@ void emit_asm(BuildCtx *ctx) | |||
237 | int i, rel; | 245 | int i, rel; |
238 | 246 | ||
239 | fprintf(ctx->fp, "\t.file \"buildvm_%s.dasc\"\n", ctx->dasm_arch); | 247 | fprintf(ctx->fp, "\t.file \"buildvm_%s.dasc\"\n", ctx->dasm_arch); |
248 | #if LJ_ARCH_PPC64 | ||
249 | fprintf(ctx->fp, "\t.abiversion 2\n"); | ||
250 | #endif | ||
240 | fprintf(ctx->fp, "\t.text\n"); | 251 | fprintf(ctx->fp, "\t.text\n"); |
241 | emit_asm_align(ctx, 4); | 252 | emit_asm_align(ctx, 4); |
242 | 253 | ||
diff --git a/src/lj_arch.h b/src/lj_arch.h index 54d5cd22..61c7e19f 100644 --- a/src/lj_arch.h +++ b/src/lj_arch.h | |||
@@ -210,13 +210,24 @@ | |||
210 | 210 | ||
211 | #elif LUAJIT_TARGET == LUAJIT_ARCH_PPC | 211 | #elif LUAJIT_TARGET == LUAJIT_ARCH_PPC |
212 | 212 | ||
213 | #define LJ_ARCH_NAME "ppc" | 213 | #if __BYTE_ORDER__ != __ORDER_BIG_ENDIAN__ |
214 | #define LJ_ARCH_ENDIAN LUAJIT_LE | ||
215 | #else | ||
216 | #define LJ_ARCH_ENDIAN LUAJIT_BE | ||
217 | #endif | ||
218 | |||
214 | #if _LP64 | 219 | #if _LP64 |
215 | #define LJ_ARCH_BITS 64 | 220 | #define LJ_ARCH_BITS 64 |
221 | #if LJ_ARCH_ENDIAN == LUAJIT_LE | ||
222 | #define LJ_ARCH_NAME "ppc64le" | ||
223 | #else | ||
224 | #define LJ_ARCH_NAME "ppc64" | ||
225 | #endif | ||
216 | #else | 226 | #else |
217 | #define LJ_ARCH_BITS 32 | 227 | #define LJ_ARCH_BITS 32 |
228 | #define LJ_ARCH_NAME "ppc" | ||
218 | #endif | 229 | #endif |
219 | #define LJ_ARCH_ENDIAN LUAJIT_BE | 230 | |
220 | #define LJ_TARGET_PPC 1 | 231 | #define LJ_TARGET_PPC 1 |
221 | #define LJ_TARGET_EHRETREG 3 | 232 | #define LJ_TARGET_EHRETREG 3 |
222 | #define LJ_TARGET_JUMPRANGE 25 /* +-2^25 = +-32MB */ | 233 | #define LJ_TARGET_JUMPRANGE 25 /* +-2^25 = +-32MB */ |
@@ -225,6 +236,15 @@ | |||
225 | #define LJ_TARGET_UNIFYROT 1 /* Want only IR_BROL. */ | 236 | #define LJ_TARGET_UNIFYROT 1 /* Want only IR_BROL. */ |
226 | #define LJ_ARCH_NUMMODE LJ_NUMMODE_DUAL_SINGLE | 237 | #define LJ_ARCH_NUMMODE LJ_NUMMODE_DUAL_SINGLE |
227 | 238 | ||
239 | #if LJ_TARGET_CONSOLE | ||
240 | #define LJ_ARCH_PPC32ON64 1 | ||
241 | #define LJ_ARCH_NOFFI 1 | ||
242 | #elif LJ_ARCH_BITS == 64 | ||
243 | #define LJ_ARCH_PPC64 1 | ||
244 | #define LJ_TARGET_GC64 1 | ||
245 | #define LJ_ARCH_NOJIT 1 /* NYI */ | ||
246 | #endif | ||
247 | |||
228 | #if _ARCH_PWR7 | 248 | #if _ARCH_PWR7 |
229 | #define LJ_ARCH_VERSION 70 | 249 | #define LJ_ARCH_VERSION 70 |
230 | #elif _ARCH_PWR6 | 250 | #elif _ARCH_PWR6 |
@@ -238,10 +258,6 @@ | |||
238 | #else | 258 | #else |
239 | #define LJ_ARCH_VERSION 0 | 259 | #define LJ_ARCH_VERSION 0 |
240 | #endif | 260 | #endif |
241 | #if __PPC64__ || __powerpc64__ || LJ_TARGET_CONSOLE | ||
242 | #define LJ_ARCH_PPC64 1 | ||
243 | #define LJ_ARCH_NOFFI 1 | ||
244 | #endif | ||
245 | #if _ARCH_PPCSQ | 261 | #if _ARCH_PPCSQ |
246 | #define LJ_ARCH_SQRT 1 | 262 | #define LJ_ARCH_SQRT 1 |
247 | #endif | 263 | #endif |
@@ -345,11 +361,11 @@ | |||
345 | #if defined(_SOFT_FLOAT) || defined(_SOFT_DOUBLE) | 361 | #if defined(_SOFT_FLOAT) || defined(_SOFT_DOUBLE) |
346 | #error "No support for PowerPC CPUs without double-precision FPU" | 362 | #error "No support for PowerPC CPUs without double-precision FPU" |
347 | #endif | 363 | #endif |
348 | #if defined(_LITTLE_ENDIAN) | 364 | #if !LJ_ARCH_PPC64 && LJ_ARCH_ENDIAN == LUAJIT_LE |
349 | #error "No support for little-endian PowerPC" | 365 | #error "No support for little-endian PPC32" |
350 | #endif | 366 | #endif |
351 | #if defined(_LP64) | 367 | #if LJ_ARCH_PPC64 |
352 | #error "No support for PowerPC 64 bit mode" | 368 | #error "No support for PowerPC 64 bit mode (yet)" |
353 | #endif | 369 | #endif |
354 | #ifdef __NO_FPRS__ | 370 | #ifdef __NO_FPRS__ |
355 | #error "No support for PPC/e500 anymore (use LuaJIT 2.0)" | 371 | #error "No support for PPC/e500 anymore (use LuaJIT 2.0)" |
diff --git a/src/lj_asm_ppc.h b/src/lj_asm_ppc.h index 221e221a..7deeb66e 100644 --- a/src/lj_asm_ppc.h +++ b/src/lj_asm_ppc.h | |||
@@ -323,8 +323,10 @@ static void asm_setupresult(ASMState *as, IRIns *ir, const CCallInfo *ci) | |||
323 | } else { | 323 | } else { |
324 | ra_destreg(as, ir, RID_FPRET); | 324 | ra_destreg(as, ir, RID_FPRET); |
325 | } | 325 | } |
326 | #if LJ_32 | ||
326 | } else if (hiop) { | 327 | } else if (hiop) { |
327 | ra_destpair(as, ir); | 328 | ra_destpair(as, ir); |
329 | #endif | ||
328 | } else { | 330 | } else { |
329 | ra_destreg(as, ir, RID_RET); | 331 | ra_destreg(as, ir, RID_RET); |
330 | } | 332 | } |
@@ -343,7 +345,7 @@ static void asm_callx(ASMState *as, IRIns *ir) | |||
343 | func = ir->op2; irf = IR(func); | 345 | func = ir->op2; irf = IR(func); |
344 | if (irf->o == IR_CARG) { func = irf->op1; irf = IR(func); } | 346 | if (irf->o == IR_CARG) { func = irf->op1; irf = IR(func); } |
345 | if (irref_isk(func)) { /* Call to constant address. */ | 347 | if (irref_isk(func)) { /* Call to constant address. */ |
346 | ci.func = (ASMFunction)(void *)(irf->i); | 348 | ci.func = (ASMFunction)(void *)(intptr_t)(irf->i); |
347 | } else { /* Need a non-argument register for indirect calls. */ | 349 | } else { /* Need a non-argument register for indirect calls. */ |
348 | RegSet allow = RSET_GPR & ~RSET_RANGE(RID_R0, REGARG_LASTGPR+1); | 350 | RegSet allow = RSET_GPR & ~RSET_RANGE(RID_R0, REGARG_LASTGPR+1); |
349 | Reg freg = ra_alloc1(as, func, allow); | 351 | Reg freg = ra_alloc1(as, func, allow); |
@@ -527,7 +529,7 @@ static void asm_tvptr(ASMState *as, Reg dest, IRRef ref) | |||
527 | /* Otherwise use g->tmptv to hold the TValue. */ | 529 | /* Otherwise use g->tmptv to hold the TValue. */ |
528 | RegSet allow = rset_exclude(RSET_GPR, dest); | 530 | RegSet allow = rset_exclude(RSET_GPR, dest); |
529 | Reg type; | 531 | Reg type; |
530 | emit_tai(as, PPCI_ADDI, dest, RID_JGL, offsetof(global_State, tmptv)-32768); | 532 | emit_tai(as, PPCI_ADDI, dest, RID_JGL, (int32_t)offsetof(global_State, tmptv)-32768); |
531 | if (!irt_ispri(ir->t)) { | 533 | if (!irt_ispri(ir->t)) { |
532 | Reg src = ra_alloc1(as, ref, allow); | 534 | Reg src = ra_alloc1(as, ref, allow); |
533 | emit_setgl(as, src, tmptv.gcr); | 535 | emit_setgl(as, src, tmptv.gcr); |
diff --git a/src/lj_frame.h b/src/lj_frame.h index 8fe48db1..b9595a5a 100644 --- a/src/lj_frame.h +++ b/src/lj_frame.h | |||
@@ -178,7 +178,7 @@ enum { LJ_CONT_TAILCALL, LJ_CONT_FFI_CALLBACK }; /* Special continuations. */ | |||
178 | #define CFRAME_OFS_MULTRES 408 | 178 | #define CFRAME_OFS_MULTRES 408 |
179 | #define CFRAME_SIZE 384 | 179 | #define CFRAME_SIZE 384 |
180 | #define CFRAME_SHIFT_MULTRES 3 | 180 | #define CFRAME_SHIFT_MULTRES 3 |
181 | #elif LJ_ARCH_PPC64 | 181 | #elif LJ_ARCH_PPC32ON64 |
182 | #define CFRAME_OFS_ERRF 472 | 182 | #define CFRAME_OFS_ERRF 472 |
183 | #define CFRAME_OFS_NRES 468 | 183 | #define CFRAME_OFS_NRES 468 |
184 | #define CFRAME_OFS_PREV 448 | 184 | #define CFRAME_OFS_PREV 448 |
diff --git a/src/lj_target_ppc.h b/src/lj_target_ppc.h index 2caeeb04..99867688 100644 --- a/src/lj_target_ppc.h +++ b/src/lj_target_ppc.h | |||
@@ -104,7 +104,7 @@ enum { | |||
104 | /* This definition must match with the *.dasc file(s). */ | 104 | /* This definition must match with the *.dasc file(s). */ |
105 | typedef struct { | 105 | typedef struct { |
106 | lua_Number fpr[RID_NUM_FPR]; /* Floating-point registers. */ | 106 | lua_Number fpr[RID_NUM_FPR]; /* Floating-point registers. */ |
107 | int32_t gpr[RID_NUM_GPR]; /* General-purpose registers. */ | 107 | intptr_t gpr[RID_NUM_GPR]; /* General-purpose registers. */ |
108 | int32_t spill[256]; /* Spill slots. */ | 108 | int32_t spill[256]; /* Spill slots. */ |
109 | } ExitState; | 109 | } ExitState; |
110 | 110 | ||
diff --git a/src/vm_ppc.dasc b/src/vm_ppc.dasc index df60a3be..2a7a7455 100644 --- a/src/vm_ppc.dasc +++ b/src/vm_ppc.dasc | |||
@@ -1,4 +1,4 @@ | |||
1 | |// Low-level VM code for PowerPC CPUs. | 1 | |// Low-level VM code for PowerPC 32 bit or 32on64 bit mode. |
2 | |// Bytecode interpreter, fast functions and helper functions. | 2 | |// Bytecode interpreter, fast functions and helper functions. |
3 | |// Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h | 3 | |// Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h |
4 | | | 4 | | |
@@ -18,7 +18,7 @@ | |||
18 | |// DynASM defines used by the PPC port: | 18 | |// DynASM defines used by the PPC port: |
19 | |// | 19 | |// |
20 | |// P64 64 bit pointers (only for GPR64 testing). | 20 | |// P64 64 bit pointers (only for GPR64 testing). |
21 | |// Note: a full PPC64 _LP64 port is not planned. | 21 | |// Note: see vm_ppc64.dasc for a full PPC64 _LP64 port. |
22 | |// GPR64 64 bit registers (but possibly 32 bit pointers, e.g. PS3). | 22 | |// GPR64 64 bit registers (but possibly 32 bit pointers, e.g. PS3). |
23 | |// Affects reg saves, stack layout, carry/overflow/dot flags etc. | 23 | |// Affects reg saves, stack layout, carry/overflow/dot flags etc. |
24 | |// FRAME32 Use 32 bit frame layout, even with GPR64 (Xbox 360). | 24 | |// FRAME32 Use 32 bit frame layout, even with GPR64 (Xbox 360). |