PPC: Add build rules for PPC interpreter (non-functional, yet).

This commit is contained in:
Mike Pall
2011-07-03 15:15:11 +02:00
parent 161f1a5eb0
commit 0239a56d37
6 changed files with 87 additions and 75 deletions

View File

@@ -10,10 +10,6 @@
|.globalnames globnames
|.externnames extnames
|
|.if not SPE
|.error "No support for plain PowerPC CPUs (yet)"
|.endif
|
|// Note: The ragged indentation of the instructions is intentional.
|// The starting columns indicate data dependencies.
|
@@ -32,14 +28,12 @@
|
|// Constants for vectorized type-comparisons (hi+low GPR). C callee-save.
|.define TISNUM, r22
|.if SPE
|.define TISSTR, r23
|.define TISTAB, r24
|.define TISFUNC, r25
|.define TISNIL, r26
|.define TOBIT, r27
|.define ZERO, TOBIT // Zero in lo word.
|.endif
|.define TISNIL, r23
|.define ZERO, r24
|.define TISSTR, r25 // NYI: remove.
|.define TISTAB, r26 // NYI: remove.
|.define TISFUNC, r27 // NYI: remove.
|.define TOBIT, r28 // NYI: use FP reg.
|
|// The following temporaries are not saved across C calls, except for RA.
|.define RA, r20 // Callee-save.
@@ -63,32 +57,19 @@
|.define CARG4, r6 // Overlaps TMP3.
|.define CARG5, r7 // Overlaps INS.
|
|.define CARGF1, f1
|.define CARGF2, f2
|
|.define CRET1, r3
|.define CRET2, r4
|
|// Stack layout while in interpreter. Must match with lj_frame.h.
|.if SPE
|.define SAVE_LR, 180(sp)
|.define CFRAME_SPACE, 176 // Delta for sp.
|// Back chain for sp: 176(sp) <-- sp entering interpreter
|.define SAVE_r31, 168(sp) // 64 bit register saves.
|.define SAVE_r30, 160(sp)
|.define SAVE_r29, 152(sp)
|.define SAVE_r28, 144(sp)
|.define SAVE_r27, 136(sp)
|.define SAVE_r26, 128(sp)
|.define SAVE_r25, 120(sp)
|.define SAVE_r24, 112(sp)
|.define SAVE_r23, 104(sp)
|.define SAVE_r22, 96(sp)
|.define SAVE_r21, 88(sp)
|.define SAVE_r20, 80(sp)
|.define SAVE_r19, 72(sp)
|.define SAVE_r18, 64(sp)
|.define SAVE_r17, 56(sp)
|.define SAVE_r16, 48(sp)
|.define SAVE_r15, 40(sp)
|.define SAVE_r14, 32(sp)
|.define SAVE_LR, 260(sp)
|.define CFRAME_SPACE, 256 // Delta for sp.
|// Back chain for sp: 256(sp) <-- sp entering interpreter
|.define SAVE_GPR_, 184 // .. 184+18*4: 32 bit GPR saves.
|.define SAVE_FPR_, 40 // .. 40+18*8: 64 bit FPR saves.
|.define SAVE_UNUSED, 32(sp) // 8 unused bytes for alignment.
|.define SAVE_ERRF, 28(sp) // 32 bit C frame info.
|.define SAVE_NRES, 24(sp)
|.define SAVE_CFRAME, 20(sp)
@@ -98,25 +79,30 @@
|// Next frame lr: 4(sp)
|// Back chain for sp: 0(sp) <-- sp while in interpreter
|
|.macro save_, reg; evstdd reg, SAVE_..reg; .endmacro
|.macro rest_, reg; evldd reg, SAVE_..reg; .endmacro
|.endif
|.macro save_, reg
| stw r..reg, SAVE_GPR_+(reg-14)*4(sp)
| stfd f..reg, SAVE_FPR_+(reg-14)*8(sp)
|.endmacro
|.macro rest_, reg
| lwz r..reg, SAVE_GPR_+(reg-14)*4(sp)
| lfd f..reg, SAVE_FPR_+(reg-14)*8(sp)
|.endmacro
|
|.macro saveregs
| stwu sp, -CFRAME_SPACE(sp)
| save_ r14; save_ r15; save_ r16; save_ r17; save_ r18; save_ r19
| save_ 14; save_ 15; save_ 16; save_ 17; save_ 18; save_ 19
| mflr r0
| save_ r20; save_ r21; save_ r22; save_ r23; save_ r24; save_ r25
| save_ 20; save_ 21; save_ 22; save_ 23; save_ 24; save_ 25
| stw r0, SAVE_LR
| save_ r26; save_ r27; save_ r28; save_ r29; save_ r30; save_ r31
| save_ 26; save_ 27; save_ 28; save_ 29; save_ 30; save_ 31
|.endmacro
|
|.macro restoreregs
| lwz r0, SAVE_LR
| rest_ r14; rest_ r15; rest_ r16; rest_ r17; rest_ r18; rest_ r19
| rest_ 14; rest_ 15; rest_ 16; rest_ 17; rest_ 18; rest_ 19
| mtlr r0
| rest_ r20; rest_ r21; rest_ r22; rest_ r23; rest_ r24; rest_ r25
| rest_ r26; rest_ r27; rest_ r28; rest_ r29; rest_ r30; rest_ r31
| rest_ 20; rest_ 21; rest_ 22; rest_ 23; rest_ 24; rest_ 25
| rest_ 26; rest_ 27; rest_ 28; rest_ 29; rest_ 30; rest_ 31
| addi sp, sp, CFRAME_SPACE
|.endmacro
|
@@ -231,17 +217,15 @@
|//-----------------------------------------------------------------------
|
|// Macros to test operand types.
|.if SPE
|.macro checknum, reg; evcmpltu reg, TISNUM; .endmacro
|.macro checkstr, reg; evcmpeq reg, TISSTR; .endmacro
|.macro checktab, reg; evcmpeq reg, TISTAB; .endmacro
|.macro checkfunc, reg; evcmpeq reg, TISFUNC; .endmacro
|.macro checknil, reg; evcmpeq reg, TISNIL; .endmacro
|.macro checkok, label; blt label; .endmacro
|.macro checkfail, label; bge label; .endmacro
|.macro checkanyfail, label; bns label; .endmacro
|.macro checkallok, label; bso label; .endmacro
|.endif
|.macro checknum, reg; cmplw reg, TISNUM; .endmacro
|.macro checkstr, reg; cmpwi reg, LJ_TSTR; .endmacro
|.macro checktab, reg; cmpwi reg, LJ_TTAB; .endmacro
|.macro checkfunc, reg; cmpwi reg, LJ_TFUNC; .endmacro
|.macro checknil, reg; cmpwi reg, LJ_TNIL; .endmacro
|.macro checkok, label; beq label; .endmacro // NYI: remove.
|.macro checkfail, label; bne label; .endmacro // NYI: remove.
|.macro checkanyfail, label; bns label; .endmacro // NYI: remove.
|.macro checkallok, label; bso label; .endmacro // NYI: remove.
|
|.macro branch_RD
| srwi TMP0, RD, 1
@@ -1067,11 +1051,7 @@ static void build_subroutines(BuildCtx *ctx)
| checknum CARG1
| cmplwi cr1, TMP0, 0
| stw BASE, L->base // Add frame since C call can throw.
|.if SPE
| crand 4*cr0+eq, 4*cr0+lt, 4*cr1+eq
|.else
|.error "NYI"
|.endif
| crand 4*cr0+eq, 4*cr0+eq, 4*cr1+eq
| stw PC, SAVE_PC // Redundant (but a defined value).
| bne ->fff_fallback
| ffgccheck
@@ -3672,14 +3652,10 @@ static void emit_asm_debug(BuildCtx *ctx)
"\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n",
(int)ctx->codesz, CFRAME_SIZE);
for (i = 14; i <= 31; i++)
#if LJ_TARGET_PPCSPE
fprintf(ctx->fp,
"\t.byte %d\n\t.uleb128 %d\n"
"\t.byte 5\n\t.uleb128 %d\n\t.uleb128 %d\n",
0x80+i, 1+2*(31-i), 1200+i, 2+2*(31-i));
#else
#error "missing frame info for saved registers"
#endif
"\t.byte %d\n\t.uleb128 %d\n",
0x80+i, 37+(31-i), 0x80+32+i, 2+2*(31-i));
fprintf(ctx->fp,
"\t.align 2\n"
".LEFDE0:\n\n");
@@ -3713,14 +3689,10 @@ static void emit_asm_debug(BuildCtx *ctx)
"\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n",
(int)ctx->codesz, CFRAME_SIZE);
for (i = 14; i <= 31; i++)
#if LJ_TARGET_PPCSPE
fprintf(ctx->fp,
"\t.byte %d\n\t.uleb128 %d\n"
"\t.byte 5\n\t.uleb128 %d\n\t.uleb128 %d\n",
0x80+i, 1+2*(31-i), 1200+i, 2+2*(31-i));
#else
#error "missing frame info for saved registers"
#endif
"\t.byte %d\n\t.uleb128 %d\n",
0x80+i, 37+(31-i), 0x80+32+i, 2+2*(31-i));
fprintf(ctx->fp,
"\t.align 2\n"
".LEFDE1:\n\n");