diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc index 2964e0e2..de3346cb 100644 --- a/src/buildvm_ppc.dasc +++ b/src/buildvm_ppc.dasc @@ -26,14 +26,12 @@ |.define LREG, r18 // Register holding lua_State (also in SAVE_L). |.define MULTRES, r19 // Size of multi-result: (nresults+1)*8. | -|// Constants for vectorized type-comparisons (hi+low GPR). C callee-save. +|// Constants for type-comparisons, stores and conversions. C callee-save. |.define TISNUM, r22 |.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. +|.define TOBIT, f30 +|.define TONUM, f31 | |// The following temporaries are not saved across C calls, except for RA. |.define RA, r20 // Callee-save. @@ -57,8 +55,8 @@ |.define CARG4, r6 // Overlaps TMP3. |.define CARG5, r7 // Overlaps INS. | -|.define CARGF1, f1 -|.define CARGF2, f2 +|.define FARG1, f1 +|.define FARG2, f2 | |.define CRET1, r3 |.define CRET2, r4 @@ -69,16 +67,23 @@ |// 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 TONUM_LO, 36(sp) +|.define TONUM_HI, 32(sp) |.define SAVE_ERRF, 28(sp) // 32 bit C frame info. |.define SAVE_NRES, 24(sp) |.define SAVE_CFRAME, 20(sp) |.define SAVE_L, 16(sp) -|.define SAVE_PC, 12(sp) -|.define SAVE_MULTRES, 8(sp) +|.define SAVE_MULTRES, 12(sp) +|.define SAVE_PC, 8(sp) |// Next frame lr: 4(sp) |// Back chain for sp: 0(sp) <-- sp while in interpreter | +|.define TMPD_LO, SAVE_MULTRES +|.define TMPD_BLO, 15(sp) +|.define TMPD_HI, SAVE_PC +|.define TMPD, SAVE_PC +|.define TONUM_D, TONUM_HI +| |.macro save_, reg | stw r..reg, SAVE_GPR_+(reg-14)*4(sp) | stfd f..reg, SAVE_FPR_+(reg-14)*8(sp) @@ -133,6 +138,30 @@ |// Trap for not-yet-implemented parts. |.macro NYI; tw 4, sp, sp; .endmacro | +|// int/FP conversions. +|.macro tonum_i, freg, reg +| xoris reg, reg, 0x8000 +| stw reg, TONUM_LO +| lfd freg, TONUM_D +| fsub freg, freg, TONUM +|.endmacro +| +|.macro tonum_u, freg, reg +| stw reg, TONUM_LO +| lfd freg, TONUM_D +| fsub freg, freg, TOBIT +|.endmacro +| +|.macro toint, reg, freg, tmpfreg +| fctiwz tmpfreg, freg +| stfd tmpfreg, TMPD +| lwz reg, TMPD_LO +|.endmacro +| +|.macro toint, reg, freg +| toint reg, freg, freg +|.endmacro +| |//----------------------------------------------------------------------- | |// Access to frame relative to BASE. @@ -218,14 +247,11 @@ | |// Macros to test operand types. |.macro checknum, reg; cmplw reg, TISNUM; .endmacro +|.macro checknum, cr, reg; cmplw cr, 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 @@ -276,7 +302,7 @@ static void build_subroutines(BuildCtx *ctx) |->vm_returnp: | // See vm_return. Also: TMP2 = previous base. | andi. TMP0, PC, FRAME_P - | evsplati TMP1, LJ_TTRUE + | li TMP1, LJ_TTRUE | beq ->cont_dispatch | | // Return from pcall or xpcall fast func. @@ -309,9 +335,9 @@ static void build_subroutines(BuildCtx *ctx) | beq >2 |1: | addic. TMP1, TMP1, -8 - | evldd TMP0, 0(RA) + | lfd f0, 0(RA) | addi RA, RA, 8 - | evstdd TMP0, 0(BASE) + | stfd f0, 0(BASE) | addi BASE, BASE, 8 | bne <1 | @@ -336,16 +362,17 @@ static void build_subroutines(BuildCtx *ctx) | lwz TMP1, L->maxstack | cmplw BASE, TMP1 | bge >8 - | evstdd TISNIL, 0(BASE) + | stw TISNIL, 0(BASE) | addi RD, RD, 8 | addi BASE, BASE, 8 | b <2 | |7: // Less results wanted. + | subfic TMP3, TMP2, 0 // LUA_MULTRET+1 case? | sub TMP0, RD, TMP2 - | cmpwi TMP2, 0 // LUA_MULTRET+1 case? - | sub TMP0, BASE, TMP0 // Subtract the difference. - | iseleq BASE, BASE, TMP0 // Either keep top or shrink it. + | subfe TMP1, TMP1, TMP1 // TMP1 = TMP2 == 0 ? 0 : -1 + | and TMP0, TMP0, TMP1 + | sub BASE, BASE, TMP0 // Either keep top or shrink it. | b <3 | |8: // Corner case: need to grow stack for filling up results. @@ -380,24 +407,25 @@ static void build_subroutines(BuildCtx *ctx) | rlwinm sp, CARG1, 0, 0, 29 |->vm_unwind_ff_eh: // Landing pad for external unwinder. | lwz L, SAVE_L - | evsplati TISNUM, LJ_TISNUM+1 // Setup type comparison constants. - | evsplati TISFUNC, LJ_TFUNC - | lus TOBIT, 0x4338 - | evsplati TISTAB, LJ_TTAB - | li TMP0, 0 + | li TISNUM, LJ_TISNUM // Setup type comparison constants. | lwz BASE, L->base - | evmergelo TOBIT, TOBIT, TMP0 + | lus TMP3, 0x59c0 // TOBIT = 2^52 + 2^51 (float). | lwz DISPATCH, L->glref // Setup pointer to dispatch table. - | evsplati TISSTR, LJ_TSTR + | li ZERO, 0 + | stw TMP3, TMPD | li TMP1, LJ_TFALSE - | evsplati TISNIL, LJ_TNIL + | ori TMP3, TMP3, 0x0004 // TONUM = 2^52 + 2^51 + 2^31 (float). + | li TISNIL, LJ_TNIL | li_vmstate INTERP + | lfs TOBIT, TMPD | lwz PC, FRAME_PC(BASE) // Fetch PC of previous frame. | la RA, -8(BASE) // Results start at BASE-8. + | stw TMP3, TMPD | addi DISPATCH, DISPATCH, GG_G2DISP | stw TMP1, 0(RA) // Prepend false to error message. | li RD, 16 // 2 results: false + error message. | st_vmstate + | lfs TONUM, TMPD | b ->vm_returnc | |//----------------------------------------------------------------------- @@ -454,22 +482,25 @@ static void build_subroutines(BuildCtx *ctx) | // Resume after yield (like a return). | mr RA, BASE | lwz BASE, L->base - | evsplati TISNUM, LJ_TISNUM+1 // Setup type comparison constants. + | li TISNUM, LJ_TISNUM // Setup type comparison constants. | lwz TMP1, L->top - | evsplati TISFUNC, LJ_TFUNC - | lus TOBIT, 0x4338 - | evsplati TISTAB, LJ_TTAB | lwz PC, FRAME_PC(BASE) - | li TMP2, 0 - | evsplati TISSTR, LJ_TSTR + | lus TMP3, 0x59c0 // TOBIT = 2^52 + 2^51 (float). | sub RD, TMP1, BASE - | evmergelo TOBIT, TOBIT, TMP2 | stb CARG3, L->status + | stw TMP3, TMPD | andi. TMP0, PC, FRAME_TYPE - | li_vmstate INTERP + | ori TMP3, TMP3, 0x0004 // TONUM = 2^52 + 2^51 + 2^31 (float). + | lfs TOBIT, TMPD + | li ZERO, 0 + | stw TMP3, TMPD | addi RD, RD, 8 - | evsplati TISNIL, LJ_TNIL + | lus TMP0, 0x4338 // Hiword of 2^52 + 2^51 (double) | mr MULTRES, RD + | stw TMP0, TONUM_HI + | li_vmstate INTERP + | lfs TONUM, TMPD + | li TISNIL, LJ_TNIL | st_vmstate | beq ->BC_RET_Z | b ->vm_return @@ -500,27 +531,29 @@ static void build_subroutines(BuildCtx *ctx) | |3: // Entry point for vm_cpcall/vm_resume (BASE = base, PC = ftype). | lwz TMP2, L->base // TMP2 = old base (used in vmeta_call). - | evsplati TISNUM, LJ_TISNUM+1 // Setup type comparison constants. + | li TISNUM, LJ_TISNUM // Setup type comparison constants. | lwz TMP1, L->top - | evsplati TISFUNC, LJ_TFUNC + | lus TMP3, 0x59c0 // TOBIT = 2^52 + 2^51 (float). | add PC, PC, BASE - | evsplati TISTAB, LJ_TTAB - | lus TOBIT, 0x4338 - | li TMP0, 0 + | stw TMP3, TMPD + | li ZERO, 0 + | ori TMP3, TMP3, 0x0004 // TONUM = 2^52 + 2^51 + 2^31 (float). + | lfs TOBIT, TMPD | sub PC, PC, TMP2 // PC = frame delta + frame type - | evsplati TISSTR, LJ_TSTR + | stw TMP3, TMPD + | lus TMP0, 0x4338 // Hiword of 2^52 + 2^51 (double) | sub NARGS8:RC, TMP1, BASE - | evmergelo TOBIT, TOBIT, TMP0 + | stw TMP0, TONUM_HI | li_vmstate INTERP - | evsplati TISNIL, LJ_TNIL + | lfs TONUM, TMPD + | li TISNIL, LJ_TNIL | st_vmstate | |->vm_call_dispatch: | // TMP2 = old base, BASE = new base, RC = nargs*8, PC = caller PC - | li TMP0, -8 - | evlddx LFUNC:RB, BASE, TMP0 - | checkfunc LFUNC:RB - | checkfail ->vmeta_call + | lwz TMP0, FRAME_PC(BASE) + | lwz LFUNC:RB, FRAME_FUNC(BASE) + | checkfunc TMP0; bne ->vmeta_call | |->vm_call_dispatch_f: | ins_call @@ -570,7 +603,7 @@ static void build_subroutines(BuildCtx *ctx) | beq >1 | subi TMP2, RD, 8 | lwz TMP1, LFUNC:TMP1->pc - | evstddx TISNIL, RA, TMP2 // Ensure one valid arg. + | stwx TISNIL, RA, TMP2 // Ensure one valid arg. | lwz KBASE, PC2PROTO(k)(TMP1) | // BASE = base, RA = resultptr, RB = meta base | mtctr TMP0 @@ -585,42 +618,45 @@ static void build_subroutines(BuildCtx *ctx) | lwz INS, -4(PC) | subi CARG2, RB, 16 | decode_RB8 SAVE0, INS - | evldd TMP0, 0(RA) + | lfd f0, 0(RA) | add TMP1, BASE, SAVE0 | stw BASE, L->base | cmplw TMP1, CARG2 | sub CARG3, CARG2, TMP1 | decode_RA8 RA, INS - | evstdd TMP0, 0(CARG2) + | stfd f0, 0(CARG2) | bne ->BC_CAT_Z - | evstddx TMP0, BASE, RA + | stfdx f0, BASE, RA | b ->cont_nop | |//-- Table indexing metamethods ----------------------------------------- | |->vmeta_tgets1: - | evmergelo STR:RC, TISSTR, STR:RC | la CARG3, DISPATCH_GL(tmptv)(DISPATCH) + | li TMP0, LJ_TSTR | decode_RB8 RB, INS - | evstdd STR:RC, 0(CARG3) + | stw STR:RC, 4(CARG3) | add CARG2, BASE, RB + | stw TMP0, 0(CARG3) | b >1 | |->vmeta_tgets: - | evmergelo TAB:RB, TISTAB, TAB:RB | la CARG2, DISPATCH_GL(tmptv)(DISPATCH) - | evmergelo STR:RC, TISSTR, STR:RC - | evstdd TAB:RB, 0(CARG2) + | li TMP0, LJ_TTAB + | stw TAB:RB, 4(CARG2) | la CARG3, DISPATCH_GL(tmptv2)(DISPATCH) - | evstdd STR:RC, 0(CARG3) + | stw TMP0, 0(CARG2) + | li TMP1, LJ_TSTR + | stw STR:RC, 4(CARG3) + | stw TMP1, 0(CARG3) | b >1 | |->vmeta_tgetb: // TMP0 = index - | efdcfsi TMP0, TMP0 + | tonum_u f0, TMP0 | decode_RB8 RB, INS | la CARG3, DISPATCH_GL(tmptv)(DISPATCH) | add CARG2, BASE, RB - | evstdd TMP0, 0(CARG3) + | stfd f0, 0(CARG3) | b >1 | |->vmeta_tgetv: @@ -636,9 +672,10 @@ static void build_subroutines(BuildCtx *ctx) | // Returns TValue * (finished) or NULL (metamethod). | cmplwi CRET1, 0 | beq >3 - | evldd TMP0, 0(CRET1) - | evstddx TMP0, BASE, RA - | ins_next + | lfd f0, 0(CRET1) + | ins_next1 + | stfdx f0, BASE, RA + | ins_next2 | |3: // Call __index metamethod. | // BASE = base, L->top = new base, stack = cont/func/t/k @@ -653,28 +690,31 @@ static void build_subroutines(BuildCtx *ctx) |//----------------------------------------------------------------------- | |->vmeta_tsets1: - | evmergelo STR:RC, TISSTR, STR:RC | la CARG3, DISPATCH_GL(tmptv)(DISPATCH) + | li TMP0, LJ_TSTR | decode_RB8 RB, INS - | evstdd STR:RC, 0(CARG3) + | stw STR:RC, 4(CARG3) | add CARG2, BASE, RB + | stw TMP0, 0(CARG3) | b >1 | |->vmeta_tsets: - | evmergelo TAB:RB, TISTAB, TAB:RB | la CARG2, DISPATCH_GL(tmptv)(DISPATCH) - | evmergelo STR:RC, TISSTR, STR:RC - | evstdd TAB:RB, 0(CARG2) + | li TMP0, LJ_TTAB + | stw TAB:RB, 4(CARG2) | la CARG3, DISPATCH_GL(tmptv2)(DISPATCH) - | evstdd STR:RC, 0(CARG3) + | stw TMP0, 0(CARG2) + | li TMP1, LJ_TSTR + | stw STR:RC, 4(CARG3) + | stw TMP1, 0(CARG3) | b >1 | |->vmeta_tsetb: // TMP0 = index - | efdcfsi TMP0, TMP0 + | tonum_u f0, TMP0 | decode_RB8 RB, INS | la CARG3, DISPATCH_GL(tmptv)(DISPATCH) | add CARG2, BASE, RB - | evstdd TMP0, 0(CARG3) + | stfd f0, 0(CARG3) | b >1 | |->vmeta_tsetv: @@ -689,11 +729,12 @@ static void build_subroutines(BuildCtx *ctx) | bl extern lj_meta_tset // (lua_State *L, TValue *o, TValue *k) | // Returns TValue * (finished) or NULL (metamethod). | cmplwi CRET1, 0 - | evlddx TMP0, BASE, RA + | lfdx f0, BASE, RA | beq >3 | // NOBARRIER: lj_meta_tset ensures the table is not black. - | evstdd TMP0, 0(CRET1) - | ins_next + | ins_next1 + | stfd f0, 0(CRET1) + | ins_next2 | |3: // Call __newindex metamethod. | // BASE = base, L->top = new base, stack = cont/func/t/k/(v) @@ -703,7 +744,7 @@ static void build_subroutines(BuildCtx *ctx) | add PC, TMP1, BASE | lwz LFUNC:RB, FRAME_FUNC(BASE) // Guaranteed to be a function here. | li NARGS8:RC, 24 // 3 args for func(t, k, v) - | evstdd TMP0, 16(BASE) // Copy value to third argument. + | stfd f0, 16(BASE) // Copy value to third argument. | b ->vm_call_dispatch_f | |//-- Comparison metamethods --------------------------------------------- @@ -721,33 +762,35 @@ static void build_subroutines(BuildCtx *ctx) |3: | cmplwi CRET1, 1 | bgt ->vmeta_binop + | subfic CRET1, CRET1, 0 |4: | lwz INS, 0(PC) | addi PC, PC, 4 | decode_RD4 TMP2, INS - | addis TMP3, PC, -(BCBIAS_J*4 >> 16) - | add TMP2, TMP2, TMP3 - | isellt PC, PC, TMP2 + | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16) + | and TMP2, TMP2, CRET1 + | add PC, PC, TMP2 |->cont_nop: | ins_next | |->cont_ra: // RA = resultptr | lwz INS, -4(PC) - | evldd TMP0, 0(RA) + | lfd f0, 0(RA) | decode_RA8 TMP1, INS - | evstddx TMP0, BASE, TMP1 + | stfdx f0, BASE, TMP1 | b ->cont_nop | |->cont_condt: // RA = resultptr | lwz TMP0, 0(RA) - | li TMP1, LJ_TTRUE - | cmplw TMP1, TMP0 // Branch if result is true. + | subfic TMP0, TMP0, LJ_TTRUE // Branch if result is true. + | subfe CRET1, CRET1, CRET1 + | not CRET1, CRET1 | b <4 | |->cont_condf: // RA = resultptr | lwz TMP0, 0(RA) - | li TMP1, LJ_TFALSE - | cmplw TMP0, TMP1 // Branch if result is false. + | subfic TMP0, TMP0, LJ_TTRUE // Branch if result is false. + | subfe CRET1, CRET1, CRET1 | b <4 | |->vmeta_equal: @@ -773,8 +816,8 @@ static void build_subroutines(BuildCtx *ctx) | b >1 | |->vmeta_unm: - | add CARG3, BASE, RD - | mr CARG4, CARG3 + | mr CARG3, RD + | mr CARG4, RD | b >1 | |->vmeta_arith_vv: @@ -796,6 +839,7 @@ static void build_subroutines(BuildCtx *ctx) | // BASE = old base, CRET1 = new base, stack = cont/func/o1/o2 | sub TMP1, CRET1, BASE | stw PC, -16(CRET1) // [cont|PC] + | mr TMP2, BASE | addi PC, TMP1, FRAME_CONT | mr BASE, CRET1 | li NARGS8:RC, 16 // 2 args for func(o1, o2). @@ -805,7 +849,7 @@ static void build_subroutines(BuildCtx *ctx) #ifdef LUAJIT_ENABLE_LUA52COMPAT | mr SAVE0, CARG1 #endif - | add CARG2, BASE, RD + | mr CARG2, RD | stw BASE, L->base | mr CARG1, L | stw PC, SAVE_PC @@ -882,29 +926,40 @@ static void build_subroutines(BuildCtx *ctx) |.macro .ffunc_1, name |->ff_ .. name: | cmplwi NARGS8:RC, 8 - | evldd CARG1, 0(BASE) + | lwz CARG3, 0(BASE) + | lwz CARG1, 4(BASE) | blt ->fff_fallback |.endmacro | |.macro .ffunc_2, name |->ff_ .. name: | cmplwi NARGS8:RC, 16 - | evldd CARG1, 0(BASE) - | evldd CARG2, 8(BASE) + | lwz CARG3, 0(BASE) + | lwz CARG4, 8(BASE) + | lwz CARG1, 4(BASE) + | lwz CARG2, 12(BASE) | blt ->fff_fallback |.endmacro | |.macro .ffunc_n, name - | .ffunc_1 name - | checknum CARG1 - | checkfail ->fff_fallback + |->ff_ .. name: + | cmplwi NARGS8:RC, 8 + | lwz CARG3, 0(BASE) + | lfd FARG1, 0(BASE) + | blt ->fff_fallback + | checknum CARG3; bge ->fff_fallback |.endmacro | |.macro .ffunc_nn, name - | .ffunc_2 name - | evmergehi TMP0, CARG1, CARG2 - | checknum TMP0 - | checkanyfail ->fff_fallback + |->ff_ .. name: + | cmplwi NARGS8:RC, 16 + | lwz CARG3, 0(BASE) + | lfd FARG1, 0(BASE) + | lwz CARG4, 8(BASE) + | lfd FARG2, 8(BASE) + | blt ->fff_fallback + | checknum CARG3; bge ->fff_fallback + | checknum CARG4; bge ->fff_fallback |.endmacro | |// Inlined GC threshold check. Caveat: uses TMP0 and TMP1. @@ -917,24 +972,22 @@ static void build_subroutines(BuildCtx *ctx) | |//-- Base library: checks ----------------------------------------------- | - |.ffunc assert - | cmplwi NARGS8:RC, 8 - | evldd TMP0, 0(BASE) - | blt ->fff_fallback - | evaddw TMP1, TISNIL, TISNIL // Synthesize LJ_TFALSE. - | la RA, -8(BASE) - | evcmpltu cr1, TMP0, TMP1 + |.ffunc_1 assert + | li TMP1, LJ_TFALSE + | la RA, -8(BASE) + | cmplw cr1, CARG3, TMP1 | lwz PC, FRAME_PC(BASE) | bge cr1, ->fff_fallback - | evstdd TMP0, 0(RA) + | stw CARG3, 0(RA) | addi RD, NARGS8:RC, 8 // Compute (nresults+1)*8. - | beq ->fff_res // Done if exactly 1 argument. + | stw CARG1, 4(RA) + | beq ->fff_res // Done if exactly 1 argument. | li TMP1, 8 | subi RC, RC, 8 |1: | cmplw TMP1, RC - | evlddx TMP0, BASE, TMP1 - | evstddx TMP0, RA, TMP1 + | lfdx f0, BASE, TMP1 + | stfdx f0, RA, TMP1 | addi TMP1, TMP1, 8 | bne <1 | b ->fff_res @@ -943,71 +996,70 @@ static void build_subroutines(BuildCtx *ctx) | cmplwi NARGS8:RC, 8 | lwz CARG1, 0(BASE) | blt ->fff_fallback - | li TMP2, ~LJ_TNUMX - | cmplw CARG1, TISNUM - | not TMP1, CARG1 - | isellt TMP1, TMP2, TMP1 + | subfc TMP0, TISNUM, CARG1 + | subfe TMP2, CARG1, CARG1 + | orc TMP1, TMP2, TMP0 + | addi TMP1, TMP1, ~LJ_TISNUM+1 | slwi TMP1, TMP1, 3 | la TMP2, CFUNC:RB->upvalue - | evlddx STR:CRET1, TMP2, TMP1 - | b ->fff_restv + | lfdx FARG1, TMP2, TMP1 + | b ->fff_resn | |//-- Base library: getters and setters --------------------------------- | |.ffunc_1 getmetatable - | checktab CARG1 - | evmergehi TMP1, CARG1, CARG1 - | checkfail >6 + | checktab CARG3; bne >6 |1: // Field metatable must be at same offset for GCtab and GCudata! - | lwz TAB:RB, TAB:CARG1->metatable + | lwz TAB:CARG1, TAB:CARG1->metatable |2: - | evmr CRET1, TISNIL - | cmplwi TAB:RB, 0 + | li CARG3, LJ_TNIL + | cmplwi TAB:CARG1, 0 | lwz STR:RC, DISPATCH_GL(gcroot[GCROOT_MMNAME+MM_metatable])(DISPATCH) | beq ->fff_restv - | lwz TMP0, TAB:RB->hmask - | evmergelo CRET1, TISTAB, TAB:RB // Use metatable as default result. + | lwz TMP0, TAB:CARG1->hmask + | li CARG3, LJ_TTAB // Use metatable as default result. | lwz TMP1, STR:RC->hash - | lwz NODE:TMP2, TAB:RB->node - | evmergelo STR:RC, TISSTR, STR:RC + | lwz NODE:TMP2, TAB:CARG1->node | and TMP1, TMP1, TMP0 // idx = str->hash & tab->hmask | slwi TMP0, TMP1, 5 | slwi TMP1, TMP1, 3 | sub TMP1, TMP0, TMP1 | add NODE:TMP2, NODE:TMP2, TMP1 // node = tab->node + (idx*32-idx*8) |3: // Rearranged logic, because we expect _not_ to find the key. - | evldd TMP0, NODE:TMP2->key - | evldd TMP1, NODE:TMP2->val - | evcmpeq TMP0, STR:RC - | lwz NODE:TMP2, NODE:TMP2->next - | checkallok >5 - | cmplwi NODE:TMP2, 0 - | beq ->fff_restv // Not found, keep default result. - | b <3 + | lwz CARG4, NODE:TMP2->key + | lwz TMP0, 4+offsetof(Node, key)(NODE:TMP2) + | lwz CARG2, NODE:TMP2->val + | lwz TMP1, 4+offsetof(Node, val)(NODE:TMP2) + | checkstr CARG4; bne >4 + | cmpw TMP0, STR:RC; beq >5 + |4: + | lwz NODE:TMP2, NODE:TMP2->next + | cmplwi NODE:TMP2, 0 + | beq ->fff_restv // Not found, keep default result. + | b <3 |5: - | checknil TMP1 - | checkok ->fff_restv // Ditto for nil value. - | evmr CRET1, TMP1 // Return value of mt.__metatable. + | checknil CARG2 + | beq ->fff_restv // Ditto for nil value. + | mr CARG3, CARG2 // Return value of mt.__metatable. + | mr CARG1, TMP1 | b ->fff_restv | |6: - | cmpwi TMP1, LJ_TUDATA - | not TMP1, TMP1 - | beq <1 - | checknum CARG1 - | slwi TMP1, TMP1, 2 - | li TMP2, 4*~LJ_TNUMX - | isellt TMP1, TMP2, TMP1 + | cmpwi CARG3, LJ_TUDATA; beq <1 + | subfc TMP0, TISNUM, CARG3 + | subfe TMP2, CARG3, CARG3 + | orc TMP1, TMP2, TMP0 + | addi TMP1, TMP1, ~LJ_TISNUM+1 + | slwi TMP1, TMP1, 2 | la TMP2, DISPATCH_GL(gcroot[GCROOT_BASEMT])(DISPATCH) - | lwzx TAB:RB, TMP2, TMP1 + | lwzx TAB:CARG1, TMP2, TMP1 | b <2 | |.ffunc_2 setmetatable | // Fast path: no mt for table yet and not clearing the mt. - | evmergehi TMP0, TAB:CARG1, TAB:CARG2 - | checktab TMP0 - | checkanyfail ->fff_fallback + | checktab CARG3; bne ->fff_fallback | lwz TAB:TMP1, TAB:CARG1->metatable + | checktab CARG4; bne ->fff_fallback | cmplwi TAB:TMP1, 0 | lbz TMP3, TAB:CARG1->marked | bne ->fff_fallback @@ -1018,60 +1070,61 @@ static void build_subroutines(BuildCtx *ctx) | b ->fff_restv | |.ffunc rawget - | cmplwi NARGS8:RC, 16 - | evldd CARG2, 0(BASE) + | cmplwi NARGS8:RC, 8 + | lwz CARG4, 0(BASE) + | lwz TAB:CARG2, 4(BASE) | blt ->fff_fallback - | checktab CARG2 + | checktab CARG4; bne ->fff_fallback | la CARG3, 8(BASE) - | checkfail ->fff_fallback | mr CARG1, L | bl extern lj_tab_get // (lua_State *L, GCtab *t, cTValue *key) | // Returns cTValue *. - | evldd CRET1, 0(CRET1) - | b ->fff_restv + | lfd FARG1, 0(CRET1) + | b ->fff_resn | |//-- Base library: conversions ------------------------------------------ | |.ffunc tonumber | // Only handles the number case inline (without a base argument). | cmplwi NARGS8:RC, 8 - | evldd CARG1, 0(BASE) + | lwz CARG1, 0(BASE) + | lfd FARG1, 0(BASE) | bne ->fff_fallback // Exactly one argument. - | checknum CARG1 - | checkok ->fff_restv - | b ->fff_fallback + | checknum CARG1; bgt ->fff_fallback + | b ->fff_resn | |.ffunc_1 tostring | // Only handles the string or number case inline. - | checkstr CARG1 + | checkstr CARG3 | // A __tostring method in the string base metatable is ignored. - | checkok ->fff_restv // String key? + | beq ->fff_restv // String key? | // Handle numbers inline, unless a number base metatable is present. | lwz TMP0, DISPATCH_GL(gcroot[GCROOT_BASEMT_NUM])(DISPATCH) - | checknum CARG1 + | checknum CARG3 | cmplwi cr1, TMP0, 0 | stw BASE, L->base // Add frame since C call can throw. - | crand 4*cr0+eq, 4*cr0+eq, 4*cr1+eq + | crorc 4*cr0+eq, 4*cr0+gt, 4*cr1+eq | stw PC, SAVE_PC // Redundant (but a defined value). - | bne ->fff_fallback + | beq ->fff_fallback | ffgccheck | mr CARG1, L | mr CARG2, BASE | bl extern lj_str_fromnum // (lua_State *L, lua_Number *np) | // Returns GCstr *. - | evmergelo STR:CRET1, TISSTR, STR:CRET1 + | li CARG3, LJ_TSTR | b ->fff_restv | |//-- Base library: iterators ------------------------------------------- | |.ffunc next | cmplwi NARGS8:RC, 8 - | evldd CARG2, 0(BASE) + | lwz CARG1, 0(BASE) + | lwz TAB:CARG2, 4(BASE) | blt ->fff_fallback - | evstddx TISNIL, BASE, NARGS8:RC // Set missing 2nd arg to nil. - | checktab TAB:CARG2 + | stwx TISNIL, BASE, NARGS8:RC // Set missing 2nd arg to nil. + | checktab CARG1 | lwz PC, FRAME_PC(BASE) - | checkfail ->fff_fallback + | bne ->fff_fallback | stw BASE, L->base // Add frame since C call can throw. | mr CARG1, L | stw BASE, L->top // Dummy frame length is ok. @@ -1080,60 +1133,69 @@ static void build_subroutines(BuildCtx *ctx) | bl extern lj_tab_next // (lua_State *L, GCtab *t, TValue *key) | // Returns 0 at end of traversal. | cmplwi CRET1, 0 - | evmr CRET1, TISNIL + | li CARG3, LJ_TNIL | beq ->fff_restv // End of traversal: return nil. - | evldd TMP0, 8(BASE) // Copy key and value to results. + | lfd f0, 8(BASE) // Copy key and value to results. | la RA, -8(BASE) - | evldd TMP1, 16(BASE) - | evstdd TMP0, 0(RA) + | lfd f1, 16(BASE) + | stfd f0, 0(RA) | li RD, (2+1)*8 - | evstdd TMP1, 8(RA) + | stfd f1, 8(RA) | b ->fff_res | |.ffunc_1 pairs - | checktab TAB:CARG1 + | checktab CARG3 | lwz PC, FRAME_PC(BASE) - | checkfail ->fff_fallback + | bne ->fff_fallback #ifdef LUAJIT_ENABLE_LUA52COMPAT | lwz TAB:TMP2, TAB:CARG1->metatable - | evldd CFUNC:TMP0, CFUNC:RB->upvalue[0] + | lfd f0, CFUNC:RB->upvalue[0] | cmplwi TAB:TMP2, 0 | la RA, -8(BASE) | bne ->fff_fallback #else - | evldd CFUNC:TMP0, CFUNC:RB->upvalue[0] + | lfd f0, CFUNC:RB->upvalue[0] | la RA, -8(BASE) #endif - | evstdd TISNIL, 8(BASE) + | stw TISNIL, 8(BASE) | li RD, (3+1)*8 - | evstdd CFUNC:TMP0, 0(RA) + | stfd f0, 0(RA) | b ->fff_res | - |.ffunc_2 ipairs_aux - | checktab TAB:CARG1 + |.ffunc ipairs_aux + | cmplwi NARGS8:RC, 16 + | lwz CARG3, 0(BASE) + | lwz TAB:CARG1, 4(BASE) + | lwz CARG4, 8(BASE) + | lfd FARG2, 8(BASE) + | blt ->fff_fallback + | checktab CARG3 + | checknum cr1, CARG4 | lwz PC, FRAME_PC(BASE) - | checkfail ->fff_fallback - | checknum CARG2 - | lus TMP3, 0x3ff0 - | checkfail ->fff_fallback - | efdctsi TMP2, CARG2 + | lus TMP0, 0x3ff0 + | stw ZERO, TMPD_LO + | bne ->fff_fallback + | stw TMP0, TMPD_HI + | bge cr1, ->fff_fallback + | lfd FARG1, TMPD + | toint TMP2, FARG2, f0 | lwz TMP0, TAB:CARG1->asize - | evmergelo TMP3, TMP3, ZERO | lwz TMP1, TAB:CARG1->array - | efdadd CARG2, CARG2, TMP3 + | fadd FARG2, FARG2, FARG1 | addi TMP2, TMP2, 1 | la RA, -8(BASE) | cmplw TMP0, TMP2 | slwi TMP3, TMP2, 3 - | evstdd CARG2, 0(RA) + | stfd FARG2, 0(RA) | ble >2 // Not in array part? - | evlddx TMP1, TMP1, TMP3 + | lwzx TMP2, TMP1, TMP3 + | lfdx f0, TMP1, TMP3 |1: - | checknil TMP1 + | checknil TMP2 | li RD, (0+1)*8 - | checkok ->fff_res // End of iteration, return 0 results. + | beq ->fff_res // End of iteration, return 0 results. | li RD, (2+1)*8 - | evstdd TMP1, 8(RA) + | stfd f0, 8(RA) | b ->fff_res |2: // Check for empty hash part first. Otherwise call C function. | lwz TMP0, TAB:CARG1->hmask @@ -1146,27 +1208,28 @@ static void build_subroutines(BuildCtx *ctx) | cmplwi CRET1, 0 | li RD, (0+1)*8 | beq ->fff_res - | evldd TMP1, 0(CRET1) + | lwz TMP2, 0(CRET1) + | lfd f0, 0(CRET1) | b <1 | |.ffunc_1 ipairs - | checktab TAB:CARG1 + | checktab CARG3 | lwz PC, FRAME_PC(BASE) - | checkfail ->fff_fallback + | bne ->fff_fallback #ifdef LUAJIT_ENABLE_LUA52COMPAT | lwz TAB:TMP2, TAB:CARG1->metatable - | evldd CFUNC:TMP0, CFUNC:RB->upvalue[0] + | lfd f0, CFUNC:RB->upvalue[0] | cmplwi TAB:TMP2, 0 | la RA, -8(BASE) | bne ->fff_fallback #else - | evldd CFUNC:TMP0, CFUNC:RB->upvalue[0] + | lfd f0, CFUNC:RB->upvalue[0] | la RA, -8(BASE) #endif - | evsplati TMP1, 0 + | stw ZERO, 8(BASE) + | stw ZERO, 12(BASE) | li RD, (3+1)*8 - | evstdd TMP1, 8(BASE) - | evstdd CFUNC:TMP0, 0(RA) + | stfd f0, 0(RA) | b ->fff_res | |//-- Base library: catch errors ---------------------------------------- @@ -1183,18 +1246,23 @@ static void build_subroutines(BuildCtx *ctx) | addi PC, TMP3, 8+FRAME_PCALL | b ->vm_call_dispatch | - |.ffunc_2 xpcall - | lbz TMP3, DISPATCH_GL(hookmask)(DISPATCH) + |.ffunc xpcall + | cmplwi NARGS8:RC, 16 + | lwz CARG4, 8(BASE) + | lfd FARG2, 8(BASE) + | lwz CARG3, 0(BASE) + | lfd FARG1, 0(BASE) + | blt ->fff_fallback + | lbz TMP1, DISPATCH_GL(hookmask)(DISPATCH) | mr TMP2, BASE - | checkfunc CARG2 // Traceback must be a function. - | checkfail ->fff_fallback + | checkfunc CARG4; bne ->fff_fallback // Traceback must be a function. | la BASE, 16(BASE) | // Remember active hook before pcall. - | rlwinm TMP3, TMP3, 32-HOOK_ACTIVE_SHIFT, 31, 31 - | evstdd CARG2, 0(TMP2) // Swap function and traceback. + | rlwinm TMP1, TMP1, 32-HOOK_ACTIVE_SHIFT, 31, 31 + | stfd FARG2, 0(TMP2) // Swap function and traceback. | subi NARGS8:RC, NARGS8:RC, 16 - | evstdd CARG1, 8(TMP2) - | addi PC, TMP3, 16+FRAME_PCALL + | stfd FARG1, 8(TMP2) + | addi PC, TMP1, 16+FRAME_PCALL | b ->vm_call_dispatch | |//-- Coroutine library -------------------------------------------------- @@ -1202,15 +1270,11 @@ static void build_subroutines(BuildCtx *ctx) |.macro coroutine_resume_wrap, resume |.if resume |.ffunc_1 coroutine_resume - | evmergehi TMP0, L:CARG1, L:CARG1 + | cmpwi CARG3, LJ_TTHREAD; bne ->fff_fallback |.else |.ffunc coroutine_wrap_aux | lwz L:CARG1, CFUNC:RB->upvalue[0].gcr |.endif - |.if resume - | cmpwi TMP0, LJ_TTHREAD - | bne ->fff_fallback - |.endif | lbz TMP0, L:CARG1->status | lwz TMP1, L:CARG1->cframe | lwz CARG2, L:CARG1->top @@ -1240,9 +1304,9 @@ static void build_subroutines(BuildCtx *ctx) | stw BASE, L->top |2: // Move args to coroutine. | cmpw TMP1, NARGS8:RC - | evlddx TMP0, BASE, TMP1 + | lfdx f0, BASE, TMP1 | beq >3 - | evstddx TMP0, CARG2, TMP1 + | stfdx f0, CARG2, TMP1 | addi TMP1, TMP1, 8 | b <2 |3: @@ -1272,8 +1336,8 @@ static void build_subroutines(BuildCtx *ctx) | stw TMP2, L:SAVE0->top // Clear coroutine stack. |5: // Move results from coroutine. | cmplw TMP1, TMP3 - | evlddx TMP0, TMP2, TMP1 - | evstddx TMP0, BASE, TMP1 + | lfdx f0, TMP2, TMP1 + | stfdx f0, BASE, TMP1 | addi TMP1, TMP1, 8 | bne <5 |6: @@ -1298,12 +1362,12 @@ static void build_subroutines(BuildCtx *ctx) | andi. TMP0, PC, FRAME_TYPE | la TMP3, -8(TMP3) | li TMP1, LJ_TFALSE - | evldd TMP0, 0(TMP3) + | lfd f0, 0(TMP3) | stw TMP3, L:SAVE0->top // Remove error from coroutine stack. | li RD, (2+1)*8 | stw TMP1, -8(BASE) // Prepend false to results. | la RA, -8(BASE) - | evstdd TMP0, 0(BASE) // Copy error message. + | stfd f0, 0(BASE) // Copy error message. | b <7 |.else | mr CARG1, L @@ -1336,15 +1400,17 @@ static void build_subroutines(BuildCtx *ctx) | |//-- Math library ------------------------------------------------------- | - |.ffunc_n math_abs - | efdabs CRET1, CARG1 + |.ffunc_1 math_abs + | checknum CARG3; bge ->fff_fallback + | rlwinm CARG3, CARG3, 0, 1, 31 | // Fallthrough. | |->fff_restv: - | // CRET1 = TValue result. + | // CARG3/CARG1 = TValue result. | lwz PC, FRAME_PC(BASE) - | la RA, -8(BASE) - | evstdd CRET1, 0(RA) + | stw CARG3, -8(BASE) + | la RA, -8(BASE) + | stw CARG1, -4(BASE) |->fff_res1: | // RA = results, PC = return. | li RD, (1+1)*8 @@ -1367,54 +1433,24 @@ static void build_subroutines(BuildCtx *ctx) |6: // Fill up results with nil. | subi TMP1, RD, 8 | addi RD, RD, 8 - | evstddx TISNIL, RA, TMP1 + | stwx TISNIL, RA, TMP1 | b <5 | |.macro math_extern, func - | .ffunc math_ .. func - | cmplwi NARGS8:RC, 8 - | evldd CARG2, 0(BASE) - | blt ->fff_fallback - | checknum CARG2 - | evmergehi CARG1, CARG2, CARG2 - | checkfail ->fff_fallback + | .ffunc_n math_ .. func | bl extern func - | evmergelo CRET1, CRET1, CRET2 - | b ->fff_restv + | b ->fff_resn |.endmacro | |.macro math_extern2, func - | .ffunc math_ .. func - | cmplwi NARGS8:RC, 16 - | evldd CARG2, 0(BASE) - | evldd CARG4, 8(BASE) - | blt ->fff_fallback - | evmergehi CARG1, CARG4, CARG2 - | checknum CARG1 - | evmergehi CARG3, CARG4, CARG4 - | checkanyfail ->fff_fallback + | .ffunc_nn math_ .. func | bl extern func - | evmergelo CRET1, CRET1, CRET2 - | b ->fff_restv + | b ->fff_resn |.endmacro | - |.macro math_round, func - | .ffunc math_ .. func - | cmplwi NARGS8:RC, 8 - | evldd CARG2, 0(BASE) - | blt ->fff_fallback - | checknum CARG2 - | evmergehi CARG1, CARG2, CARG2 - | checkfail ->fff_fallback - | lwz PC, FRAME_PC(BASE) - | bl ->vm_..func.._hilo; - | la RA, -8(BASE) - | evstdd CRET2, 0(RA) - | b ->fff_res1 - |.endmacro - | - | math_round floor - | math_round ceil + | // NYI: Use internal implementation. + | math_extern floor + | math_extern ceil | | math_extern sqrt | math_extern log @@ -1435,119 +1471,98 @@ static void build_subroutines(BuildCtx *ctx) | |->ff_math_deg: |.ffunc_n math_rad - | evldd CARG2, CFUNC:RB->upvalue[0] - | efdmul CRET1, CARG1, CARG2 - | b ->fff_restv + | lfd FARG2, CFUNC:RB->upvalue[0] + | fmul FARG1, FARG1, FARG2 + | b ->fff_resn | - |.ffunc math_ldexp - | cmplwi NARGS8:RC, 16 - | evldd CARG2, 0(BASE) - | evldd CARG4, 8(BASE) - | blt ->fff_fallback - | evmergehi CARG1, CARG4, CARG2 - | checknum CARG1 - | checkanyfail ->fff_fallback - | efdctsi CARG3, CARG4 + |.ffunc_nn math_ldexp + | toint CARG1, FARG2 | bl extern ldexp - | evmergelo CRET1, CRET1, CRET2 - | b ->fff_restv + | b ->fff_resn | - |.ffunc math_frexp - | cmplwi NARGS8:RC, 8 - | evldd CARG2, 0(BASE) - | blt ->fff_fallback - | checknum CARG2 - | evmergehi CARG1, CARG2, CARG2 - | checkfail ->fff_fallback - | la CARG3, DISPATCH_GL(tmptv)(DISPATCH) + |.ffunc_n math_frexp + | la CARG1, DISPATCH_GL(tmptv)(DISPATCH) | lwz PC, FRAME_PC(BASE) | bl extern frexp | lwz TMP1, DISPATCH_GL(tmptv)(DISPATCH) - | evmergelo CRET1, CRET1, CRET2 - | efdcfsi CRET2, TMP1 | la RA, -8(BASE) - | evstdd CRET1, 0(RA) + | tonum_i FARG2, TMP1 + | stfd FARG1, 0(RA) | li RD, (2+1)*8 - | evstdd CRET2, 8(RA) + | stfd FARG2, 8(RA) | b ->fff_res | - |.ffunc math_modf - | cmplwi NARGS8:RC, 8 - | evldd CARG2, 0(BASE) - | blt ->fff_fallback - | checknum CARG2 - | evmergehi CARG1, CARG2, CARG2 - | checkfail ->fff_fallback - | la CARG3, -8(BASE) + |.ffunc_n math_modf + | la CARG1, -8(BASE) | lwz PC, FRAME_PC(BASE) | bl extern modf - | evmergelo CRET1, CRET1, CRET2 | la RA, -8(BASE) - | evstdd CRET1, 0(BASE) + | stfd FARG1, 0(BASE) | li RD, (2+1)*8 | b ->fff_res | - |.macro math_minmax, name, cmpop - | .ffunc_1 name - | checknum CARG1 - | li TMP1, 8 - | checkfail ->fff_fallback + |.macro math_minmax, name, ismax + | .ffunc_n name + | li TMP1, 8 |1: - | evlddx CARG2, BASE, TMP1 + | lwzx CARG2, BASE, TMP1 + | lfdx FARG2, BASE, TMP1 | cmplw cr1, TMP1, NARGS8:RC | checknum CARG2 - | bge cr1, ->fff_restv // Ok, since CRET1 = CARG1. - | checkfail ->fff_fallback - | cmpop CARG2, CARG1 + | bge cr1, ->fff_resn + | bge ->fff_fallback + | fsub f0, FARG1, FARG2 | addi TMP1, TMP1, 8 - | crmove 4*cr0+lt, 4*cr0+gt - | evsel CARG1, CARG2, CARG1 + |.if ismax + | fsel FARG1, f0, FARG1, FARG2 + |.else + | fsel FARG1, f0, FARG2, FARG1 + |.endif | b <1 |.endmacro | - | math_minmax math_min, efdtstlt - | math_minmax math_max, efdtstgt + | math_minmax math_min, 0 + | math_minmax math_max, 1 | |//-- String library ----------------------------------------------------- | |.ffunc_1 string_len - | checkstr STR:CARG1 - | checkfail ->fff_fallback - | lwz TMP0, STR:CARG1->len - | efdcfsi CRET1, TMP0 - | b ->fff_restv + | checkstr CARG3; bne ->fff_fallback + | lwz CRET1, STR:CARG1->len + | b ->fff_resi | |.ffunc string_byte // Only handle the 1-arg case here. | cmplwi NARGS8:RC, 8 - | evldd STR:CARG1, 0(BASE) + | lwz CARG3, 0(BASE) + | lwz STR:CARG1, 4(BASE) | bne ->fff_fallback // Need exactly 1 argument. - | checkstr STR:CARG1 - | la RA, -8(BASE) - | checkfail ->fff_fallback + | checkstr CARG3 + | bne ->fff_fallback | lwz TMP0, STR:CARG1->len - | li RD, (0+1)*8 - | lbz TMP1, STR:CARG1[1] // Access is always ok (NUL at end). - | li TMP2, (1+1)*8 - | cmplwi TMP0, 0 - | lwz PC, FRAME_PC(BASE) - | efdcfsi CRET1, TMP1 - | iseleq RD, RD, TMP2 - | evstdd CRET1, 0(RA) + | lbz TMP1, STR:CARG1[1] // Access is always ok (NUL at end). + | addic TMP3, TMP0, -1 // RD = ((str->len != 0)+1)*8 + | subfe RD, TMP3, TMP0 + | stw TMP1, TONUM_LO // Inlined tonum_u f0, TMP1. + | addi RD, RD, 1 + | lfd f0, TONUM_D + | la RA, -8(BASE) + | lwz PC, FRAME_PC(BASE) + | fsub f0, f0, TOBIT + | slwi RD, RD, 3 + | stfd f0, 0(RA) | b ->fff_res | |.ffunc string_char // Only handle the 1-arg case here. | ffgccheck | cmplwi NARGS8:RC, 8 - | evldd CARG1, 0(BASE) + | lwz CARG3, 0(BASE) + | lfd FARG1, 0(BASE) | bne ->fff_fallback // Exactly 1 argument. - | checknum CARG1 - | la CARG2, DISPATCH_GL(tmptv)(DISPATCH) - | checkfail ->fff_fallback - | efdctsiz TMP0, CARG1 + | checknum CARG3; bge ->fff_fallback + | toint TMP0, FARG1 + | la CARG2, TMPD_BLO | li CARG3, 1 - | cmplwi TMP0, 255 - | stb TMP0, 0(CARG2) - | bgt ->fff_fallback + | cmplwi TMP0, 255; bgt ->fff_fallback |->fff_newstr: | mr CARG1, L | stw BASE, L->base @@ -1555,67 +1570,71 @@ static void build_subroutines(BuildCtx *ctx) | bl extern lj_str_new // (lua_State *L, char *str, size_t l) | // Returns GCstr *. | lwz BASE, L->base - | evmergelo STR:CRET1, TISSTR, STR:CRET1 + | li CARG3, LJ_TSTR | b ->fff_restv | |.ffunc string_sub | ffgccheck | cmplwi NARGS8:RC, 16 - | evldd CARG3, 16(BASE) - | evldd STR:CARG1, 0(BASE) + | lwz CARG3, 16(BASE) + | lfd f0, 16(BASE) + | lwz TMP0, 0(BASE) + | lwz STR:CARG1, 4(BASE) | blt ->fff_fallback - | evldd CARG2, 8(BASE) + | lwz CARG2, 8(BASE) + | lfd f1, 8(BASE) | li TMP2, -1 | beq >1 - | checknum CARG3 - | checkfail ->fff_fallback - | efdctsiz TMP2, CARG3 + | checknum CARG3; bge ->fff_fallback + | toint TMP2, f0 |1: - | checknum CARG2 - | checkfail ->fff_fallback - | checkstr STR:CARG1 - | efdctsiz TMP1, CARG2 - | checkfail ->fff_fallback + | checknum CARG2; bge ->fff_fallback + | checkstr TMP0; bne ->fff_fallback + | toint TMP1, f1 | lwz TMP0, STR:CARG1->len | cmplw TMP0, TMP2 // len < end? (unsigned compare) - | add TMP3, TMP2, TMP0 + | addi TMP3, TMP2, 1 | blt >5 |2: | cmpwi TMP1, 0 // start <= 0? | add TMP3, TMP1, TMP0 | ble >7 |3: - | sub. CARG3, TMP2, TMP1 + | sub CARG3, TMP2, TMP1 | addi CARG2, STR:CARG1, #STR-1 + | srawi TMP0, CARG3, 31 | addi CARG3, CARG3, 1 | add CARG2, CARG2, TMP1 - | isellt CARG3, r0, CARG3 + | andc CARG3, CARG3, TMP0 | b ->fff_newstr | |5: // Negative end or overflow. - | cmpw TMP0, TMP2 - | addi TMP3, TMP3, 1 - | iselgt TMP2, TMP3, TMP0 // end = end > len ? len : end+len+1 + | sub CARG2, TMP0, TMP2 + | srawi CARG2, CARG2, 31 + | andc TMP3, TMP3, CARG2 // end = end > len ? len : end+len+1 + | add TMP2, TMP0, TMP3 | b <2 | |7: // Negative start or underflow. - | cmpwi cr1, TMP3, 0 - | iseleq TMP1, r0, TMP3 - | isel TMP1, r0, TMP1, 4*cr1+lt + | addic CARG3, TMP1, -1 + | subfe CARG3, CARG3, CARG3 + | srawi CARG2, TMP3, 31 // Note: modifies carry. + | andc TMP3, TMP3, CARG3 + | andc TMP1, TMP3, CARG2 | addi TMP1, TMP1, 1 // start = 1 + (start ? start+len : 0) | b <3 | |.ffunc string_rep // Only handle the 1-char case inline. | ffgccheck | cmplwi NARGS8:RC, 16 - | evldd CARG1, 0(BASE) - | evldd CARG2, 8(BASE) + | lwz CARG3, 0(BASE) + | lwz STR:CARG1, 4(BASE) + | lwz CARG4, 8(BASE) + | lfd FARG2, 8(BASE) | blt ->fff_fallback - | checknum CARG2 - | checkfail ->fff_fallback - | checkstr STR:CARG1 - | efdctsiz CARG3, CARG2 - | checkfail ->fff_fallback + | checkstr CARG3; bne ->fff_fallback + | checknum CARG4; bge ->fff_fallback + | toint CARG3, FARG2 | lwz TMP0, STR:CARG1->len | cmpwi CARG3, 0 | lwz TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH) @@ -1635,18 +1654,19 @@ static void build_subroutines(BuildCtx *ctx) | bne <1 | b ->fff_newstr |2: // Return empty string. - | la STR:CRET1, DISPATCH_GL(strempty)(DISPATCH) - | evmergelo CRET1, TISSTR, STR:CRET1 + | la STR:CARG1, DISPATCH_GL(strempty)(DISPATCH) + | li CARG3, LJ_TSTR | b ->fff_restv | |.ffunc string_reverse | ffgccheck | cmplwi NARGS8:RC, 8 - | evldd CARG1, 0(BASE) + | lwz CARG3, 0(BASE) + | lwz STR:CARG1, 4(BASE) | blt ->fff_fallback - | checkstr STR:CARG1 + | checkstr CARG3 | lwz TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH) - | checkfail ->fff_fallback + | bne ->fff_fallback | lwz CARG3, STR:CARG1->len | la CARG1, #STR(STR:CARG1) | lwz CARG2, DISPATCH_GL(tmpbuf.buf)(DISPATCH) @@ -1667,11 +1687,12 @@ static void build_subroutines(BuildCtx *ctx) | .ffunc name | ffgccheck | cmplwi NARGS8:RC, 8 - | evldd CARG1, 0(BASE) + | lwz CARG3, 0(BASE) + | lwz STR:CARG1, 4(BASE) | blt ->fff_fallback - | checkstr STR:CARG1 + | checkstr CARG3 | lwz TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH) - | checkfail ->fff_fallback + | bne ->fff_fallback | lwz CARG3, STR:CARG1->len | la CARG1, #STR(STR:CARG1) | lwz CARG2, DISPATCH_GL(tmpbuf.buf)(DISPATCH) @@ -1684,8 +1705,10 @@ static void build_subroutines(BuildCtx *ctx) | bge ->fff_newstr | subi TMP0, TMP1, lo | xori TMP3, TMP1, 0x20 - | cmplwi TMP0, 26 - | isellt TMP1, TMP3, TMP1 + | addic TMP0, TMP0, -26 + | subfe TMP3, TMP3, TMP3 + | andi. TMP3, TMP3, 0x20 + | xor TMP1, TMP1, TMP3 | stbx TMP1, CARG2, TMP2 | addi TMP2, TMP2, 1 | b <1 @@ -1697,35 +1720,42 @@ static void build_subroutines(BuildCtx *ctx) |//-- Table library ------------------------------------------------------ | |.ffunc_1 table_getn - | checktab CARG1 - | checkfail ->fff_fallback + | checktab CARG3; bne ->fff_fallback | bl extern lj_tab_len // (GCtab *t) | // Returns uint32_t (but less than 2^31). - | efdcfsi CRET1, CRET1 - | b ->fff_restv + | b ->fff_resi | |//-- Bit library -------------------------------------------------------- | |.macro .ffunc_bit, name | .ffunc_n bit_..name - | efdadd CARG1, CARG1, TOBIT + | fadd FARG1, FARG1, TOBIT + | stfd FARG1, TMPD + | lwz CARG1, TMPD_LO |.endmacro | |.ffunc_bit tobit - |->fff_resbit: - | efdcfsi CRET1, CARG1 - | b ->fff_restv + |->fff_resi: + | tonum_i FARG1, CRET1 + |->fff_resn: + | lwz PC, FRAME_PC(BASE) + | la RA, -8(BASE) + | stfd FARG1, -8(BASE) + | b ->fff_res1 | |.macro .ffunc_bit_op, name, ins | .ffunc_bit name | li TMP1, 8 |1: - | evlddx CARG2, BASE, TMP1 - | cmplw cr1, TMP1, NARGS8:RC - | checknum CARG2 - | bge cr1, ->fff_resbit - | checkfail ->fff_fallback - | efdadd CARG2, CARG2, TOBIT + | lwzx CARG4, BASE, TMP1 + | cmplw cr1, TMP1, NARGS8:RC + | lfdx FARG1, BASE, TMP1 + | checknum CARG4 + | bge cr1, ->fff_resi + | fadd FARG1, FARG1, TOBIT + | bge ->fff_fallback + | stfd FARG1, TMPD + | lwz CARG2, TMPD_LO | ins CARG1, CARG1, CARG2 | addi TMP1, TMP1, 8 | b <1 @@ -1739,26 +1769,28 @@ static void build_subroutines(BuildCtx *ctx) | rotlwi TMP0, CARG1, 8 | rlwimi TMP0, CARG1, 24, 0, 7 | rlwimi TMP0, CARG1, 24, 16, 23 - | efdcfsi CRET1, TMP0 - | b ->fff_restv + | mr CRET1, TMP0 + | b ->fff_resi | |.ffunc_bit bnot - | not TMP0, CARG1 - | efdcfsi CRET1, TMP0 - | b ->fff_restv + | not CRET1, CARG1 + | b ->fff_resi | |.macro .ffunc_bit_sh, name, ins, shmod | .ffunc_nn bit_..name - | efdadd CARG2, CARG2, TOBIT - | efdadd CARG1, CARG1, TOBIT + | fadd FARG1, FARG1, TOBIT + | fadd FARG2, FARG2, TOBIT + | stfd FARG1, TMPD + | lwz CARG1, TMPD_LO + | stfd FARG2, TMPD + | lwz CARG2, TMPD_LO |.if shmod == 1 | rlwinm CARG2, CARG2, 0, 27, 31 |.elif shmod == 2 | neg CARG2, CARG2 |.endif - | ins TMP0, CARG1, CARG2 - | efdcfsi CRET1, TMP0 - | b ->fff_restv + | ins CRET1, CARG1, CARG2 + | b ->fff_resi |.endmacro | |.ffunc_bit_sh lshift, slw, 1 @@ -1939,93 +1971,14 @@ static void build_subroutines(BuildCtx *ctx) |//-- Math helper functions ---------------------------------------------- |//----------------------------------------------------------------------- | - |// FP value rounding. Called by math.floor/math.ceil fast functions - |// and from JIT code. - |// - |// This can be inlined if the CPU has the frin/friz/frip/frim instructions. - |// The alternative hard-float approaches have a deep dependency chain. - |// The resulting latency is at least 3x-7x the double-precision FP latency - |// (e500v2: 6cy, e600: 5cy, Cell: 10cy) or around 20-70 cycles. - |// - |// The soft-float approach is tedious, but much faster (e500v2: ~11cy/~6cy). - |// However it relies on a fast way to transfer the FP value to GPRs - |// (e500v2: 0cy for lo-word, 1cy for hi-word). - |// - |.macro vm_round, name, mode - | // Used temporaries: TMP0, TMP1, TMP2, TMP3. - |->name.._efd: // Input: CARG2, output: CRET2 - | evmergehi CARG1, CARG2, CARG2 - |->name.._hilo: - | // Input: CARG1 (hi), CARG2 (hi, lo), output: CRET2 - | rlwinm TMP2, CARG1, 12, 21, 31 - | addic. TMP2, TMP2, -1023 // exp = exponent(x) - 1023 - | li TMP1, -1 - | cmplwi cr1, TMP2, 51 // 0 <= exp <= 51? - | subfic TMP0, TMP2, 52 - | bgt cr1, >1 - | lus TMP3, 0xfff0 - | slw TMP0, TMP1, TMP0 // lomask = -1 << (52-exp) - | sraw TMP1, TMP3, TMP2 // himask = (int32_t)0xfff00000 >> exp - |.if mode == 2 // trunc(x): - | evmergelo TMP0, TMP1, TMP0 - | evand CRET2, CARG2, TMP0 // hi &= himask, lo &= lomask - |.else - | andc TMP2, CARG2, TMP0 - | andc TMP3, CARG1, TMP1 - | or TMP2, TMP2, TMP3 // ztest = (hi&~himask) | (lo&~lomask) - | srawi TMP3, CARG1, 31 // signmask = (int32_t)hi >> 31 - |.if mode == 0 // floor(x): - | and. TMP2, TMP2, TMP3 // iszero = ((ztest & signmask) == 0) - |.else // ceil(x): - | andc. TMP2, TMP2, TMP3 // iszero = ((ztest & ~signmask) == 0) - |.endif - | and CARG2, CARG2, TMP0 // lo &= lomask - | and CARG1, CARG1, TMP1 // hi &= himask - | subc TMP0, CARG2, TMP0 - | iseleq TMP0, CARG2, TMP0 // lo = iszero ? lo : lo-lomask - | sube TMP1, CARG1, TMP1 - | iseleq TMP1, CARG1, TMP1 // hi = iszero ? hi : hi-himask+carry - | evmergelo CRET2, TMP1, TMP0 - |.endif - | blr - |1: - | bgtlr // Already done if >=2^52, +-inf or nan. - |.if mode == 2 // trunc(x): - | rlwinm TMP1, CARG1, 0, 0, 0 // hi = sign(x) - | li TMP0, 0 - | evmergelo CRET2, TMP1, TMP0 - |.else - | rlwinm TMP2, CARG1, 0, 1, 31 - | srawi TMP0, CARG1, 31 // signmask = (int32_t)hi >> 31 - | or TMP2, TMP2, CARG2 // ztest = abs(hi) | lo - | lus TMP1, 0x3ff0 - |.if mode == 0 // floor(x): - | and. TMP2, TMP2, TMP0 // iszero = ((ztest & signmask) == 0) - |.else // ceil(x): - | andc. TMP2, TMP2, TMP0 // iszero = ((ztest & ~signmask) == 0) - |.endif - | li TMP0, 0 - | iseleq TMP1, r0, TMP1 - | rlwimi CARG1, TMP1, 0, 1, 31 // hi = sign(x) | (iszero ? 0.0 : 1.0) - | evmergelo CRET2, CARG1, TMP0 - |.endif - | blr - |.endmacro - | + | // NYI: Use internal implementation. |->vm_floor: - | mflr CARG3 - | bl ->vm_floor_hilo - | mtlr CARG3 - | evmergehi CRET1, CRET2, CRET2 - | blr - | - | vm_round vm_floor, 0 - | vm_round vm_ceil, 1 + | b extern floor + |->vm_ceil: + | b extern ceil + |->vm_trunc: #if LJ_HASJIT - | vm_round vm_trunc, 2 -#else - |->vm_trunc_efd: - |->vm_trunc_hilo: + | b extern trunc #endif | |->vm_powi: @@ -2042,31 +1995,38 @@ static void build_subroutines(BuildCtx *ctx) |// Compute x op y for basic arithmetic operators (+ - * / % ^ and unary -) |// and basic math functions. ORDER ARITH |->vm_foldarith: - | evmergelo CARG2, CARG1, CARG2 - | cmplwi CARG5, 1 - | evmergelo CARG4, CARG3, CARG4 - | beq >1; bgt >2 - | efdadd CRET2, CARG2, CARG4; evmergehi CRET1, CRET2, CRET2; blr + | cmplwi CARG1, 1 + | beq >1; bgt >2 + | fadd FARG1, FARG1, FARG2; blr |1: - | efdsub CRET2, CARG2, CARG4; evmergehi CRET1, CRET2, CRET2; blr + | fsub FARG1, FARG1, FARG2; blr |2: - | cmplwi CARG5, 3; beq >1; bgt >2 - | efdmul CRET2, CARG2, CARG4; evmergehi CRET1, CRET2, CRET2; blr + | cmplwi CARG1, 3; beq >1; bgt >2 + | fmul FARG1, FARG1, FARG2; blr |1: - | efddiv CRET2, CARG2, CARG4; evmergehi CRET1, CRET2, CRET2; blr + | fdiv FARG1, FARG1, FARG2; blr |2: - | cmplwi CARG5, 5; beq >1; bgt >2 - | evmr CARG3, CARG2; efddiv CRET2, CARG2, CARG4; evmr RB, CARG4 - | mflr RC; bl ->vm_floor_efd; mtlr RC - | efdmul CRET2, CRET2, RB; efdsub CRET2, CARG3, CRET2 - | evmergehi CRET1, CRET2, CRET2; blr + | cmplwi CARG1, 5; beq >1; bgt >2 + | // NYI: Use internal implementation of floor and avoid spills. + | stwu sp, -32(sp); stfd f14, 16(sp); stfd f15, 24(sp) + | mflr r0 + | fmr f14, FARG1 + | fdiv FARG1, FARG1, FARG2 + | stw r0, 36(sp) + | fmr f15, FARG2 + | bl extern floor + | lwz r0, 36(sp) + | fmul FARG1, FARG1, f15 + | mtlr r0 + | fsub FARG1, f14, FARG1; + | lfd f14, 16(sp); lfd f15, 24(sp); addi sp, sp, 32; blr |1: | b extern pow |2: - | cmplwi CARG5, 7; beq >1; bgt >2 - | xoris CARG1, CARG1, 0x8000; blr + | cmplwi CARG1, 7; beq >1; bgt >2 + | fneg FARG1, FARG1; blr |1: - | rlwinm CARG1, CARG1, 0, 1, 31; blr + | fabs FARG1, FARG1; blr |2: | NYI // Other operations only needed by JIT compiler. | @@ -2100,71 +2060,85 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT: | // RA = src1*8, RD = src2*8, JMP with RD = target - | evlddx TMP0, BASE, RA + | lwzx TMP0, BASE, RA | addi PC, PC, 4 - | evlddx TMP1, BASE, RD - | addis TMP3, PC, -(BCBIAS_J*4 >> 16) + | lfdx f0, BASE, RA + | lwzx TMP1, BASE, RD + | checknum cr0, TMP0 | lwz TMP2, -4(PC) - | evmergehi RB, TMP0, TMP1 + | lfdx f1, BASE, RD + | checknum cr1, TMP1 | decode_RD4 TMP2, TMP2 - | checknum RB - | add TMP2, TMP2, TMP3 - | checkanyfail ->vmeta_comp - | efdcmplt TMP0, TMP1 - if (op == BC_ISLE || op == BC_ISGT) { - | efdcmpeq cr1, TMP0, TMP1 - | cror 4*cr0+gt, 4*cr0+gt, 4*cr1+gt - } - if (op == BC_ISLT || op == BC_ISLE) { - | iselgt PC, TMP2, PC + | bge cr0, ->vmeta_comp + | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16) + | bge cr1, ->vmeta_comp + | fcmpu cr0, f0, f1 + if (op == BC_ISLT) { + | bge >1 + } else if (op == BC_ISGE) { + | blt >1 + } else if (op == BC_ISLE) { + | cror 4*cr0+lt, 4*cr0+lt, 4*cr0+eq + | bge >1 } else { - | iselgt PC, PC, TMP2 + | cror 4*cr0+lt, 4*cr0+lt, 4*cr0+eq + | blt >1 } + | add PC, PC, TMP2 + |1: | ins_next break; case BC_ISEQV: case BC_ISNEV: vk = op == BC_ISEQV; | // RA = src1*8, RD = src2*8, JMP with RD = target - | evlddx CARG2, BASE, RA + | lwzux TMP0, RA, BASE + | lwz TMP2, 0(PC) + | lfd f0, 0(RA) | addi PC, PC, 4 - | evlddx CARG3, BASE, RD - | addis TMP3, PC, -(BCBIAS_J*4 >> 16) - | lwz TMP2, -4(PC) - | evmergehi RB, CARG2, CARG3 + | lwzux TMP1, RD, BASE + | checknum cr0, TMP0 | decode_RD4 TMP2, TMP2 - | checknum RB - | add TMP2, TMP2, TMP3 - | checkanyfail >5 - | efdcmpeq CARG2, CARG3 + | lfd f1, 0(RD) + | checknum cr1, TMP1 + | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16) + | bge cr0, >5 + | bge cr1, >5 + | fcmpu cr0, f0, f1 if (vk) { - | iselgt PC, TMP2, PC + | bne >1 + | add PC, PC, TMP2 } else { - | iselgt PC, PC, TMP2 + | beq >1 + | add PC, PC, TMP2 } |1: | ins_next | |5: // Either or both types are not numbers. - | evcmpeq CARG2, CARG3 - | not TMP3, RB + | lwz CARG2, 4(RA) + | lwz CARG3, 4(RD) + | not TMP3, TMP0 + | cmplw TMP0, TMP1 | cmplwi cr1, TMP3, ~LJ_TISPRI // Primitive? - | crorc 4*cr7+lt, 4*cr0+so, 4*cr0+lt // 1: Same tv or different type. | cmplwi cr6, TMP3, ~LJ_TISTABUD // Table or userdata? - | crandc 4*cr7+gt, 4*cr0+lt, 4*cr1+gt // 2: Same type and primitive. + | cmplw cr5, CARG2, CARG3 + | crandc 4*cr0+gt, 4*cr0+eq, 4*cr1+gt // 2: Same type and primitive. + | crorc 4*cr0+lt, 4*cr5+eq, 4*cr0+eq // 1: Same tv or different type. + | crand 4*cr0+eq, 4*cr0+eq, 4*cr5+eq // 0: Same type and same tv. | mr SAVE0, PC + | cror 4*cr0+eq, 4*cr0+eq, 4*cr0+gt // 0 or 2. + | cror 4*cr0+lt, 4*cr0+lt, 4*cr0+gt // 1 or 2. if (vk) { - | isel PC, TMP2, PC, 4*cr7+gt + | bne cr0, >6 + | add PC, PC, TMP2 + |6: } else { - | isel TMP2, PC, TMP2, 4*cr7+gt + | beq cr0, >6 + | add PC, PC, TMP2 + |6: } - | cror 4*cr7+lt, 4*cr7+lt, 4*cr7+gt // 1 or 2. - if (vk) { - | isel PC, TMP2, PC, 4*cr0+so - } else { - | isel PC, PC, TMP2, 4*cr0+so - } - | blt cr7, <1 // Done if 1 or 2. + | blt cr0, <1 // Done if 1 or 2. | blt cr6, <1 // Done if not tab/ud. | | // Different tables or userdatas. Need to check __eq metamethod. @@ -2183,52 +2157,57 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) case BC_ISEQS: case BC_ISNES: vk = op == BC_ISEQS; | // RA = src*8, RD = str_const*8 (~), JMP with RD = target - | evlddx TMP0, BASE, RA + | lwzux TMP0, RA, BASE | srwi RD, RD, 1 + | lwz STR:TMP3, 4(RA) | lwz INS, 0(PC) | subfic RD, RD, -4 | addi PC, PC, 4 | lwzx STR:TMP1, KBASE, RD // KBASE-4-str_const*4 - | addis TMP3, PC, -(BCBIAS_J*4 >> 16) + | subfic TMP0, TMP0, LJ_TSTR + | sub TMP1, STR:TMP1, STR:TMP3 + | or TMP0, TMP0, TMP1 | decode_RD4 TMP2, INS - | evmergelo STR:TMP1, TISSTR, STR:TMP1 - | add TMP2, TMP2, TMP3 - | evcmpeq TMP0, STR:TMP1 + | subfic TMP0, TMP0, 0 + | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16) + | subfe TMP1, TMP1, TMP1 if (vk) { - | isel PC, TMP2, PC, 4*cr0+so + | andc TMP2, TMP2, TMP1 } else { - | isel PC, PC, TMP2, 4*cr0+so + | and TMP2, TMP2, TMP1 } + | add PC, PC, TMP2 | ins_next break; case BC_ISEQN: case BC_ISNEN: vk = op == BC_ISEQN; | // RA = src*8, RD = num_const*8, JMP with RD = target - | evlddx TMP0, BASE, RA + | lwzx TMP0, BASE, RA + | lfdx f0, BASE, RA | addi PC, PC, 4 - | evlddx TMP1, KBASE, RD - | addis TMP3, PC, -(BCBIAS_J*4 >> 16) + | lfdx f1, KBASE, RD | lwz INS, -4(PC) - | checknum TMP0 - | checkfail >5 - | efdcmpeq TMP0, TMP1 - |1: + | checknum TMP0; bge >5 + | fcmpu cr0, f0, f1 | decode_RD4 TMP2, INS - | add TMP2, TMP2, TMP3 + | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16) if (vk) { - | iselgt PC, TMP2, PC + | bne >5 + | add PC, PC, TMP2 |5: } else { - | iselgt PC, PC, TMP2 + | beq >2 + |1: + | add PC, PC, TMP2 + |2: } - |3: | ins_next if (!vk) { |5: | decode_RD4 TMP2, INS - | add PC, TMP2, TMP3 - | b <3 + | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16) + | b <1 } break; @@ -2238,17 +2217,19 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | lwzx TMP0, BASE, RA | srwi TMP1, RD, 3 | lwz INS, 0(PC) - | addi PC, PC, 4 | not TMP1, TMP1 - | addis TMP3, PC, -(BCBIAS_J*4 >> 16) - | cmplw TMP0, TMP1 + | addi PC, PC, 4 + | sub TMP0, TMP0, TMP1 | decode_RD4 TMP2, INS - | add TMP2, TMP2, TMP3 + | addic TMP0, TMP0, -1 + | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16) + | subfe TMP1, TMP1, TMP1 if (vk) { - | iseleq PC, TMP2, PC + | and TMP2, TMP2, TMP1 } else { - | iseleq PC, PC, TMP2 + | andc TMP2, TMP2, TMP1 } + | add PC, PC, TMP2 | ins_next break; @@ -2256,29 +2237,32 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) case BC_ISTC: case BC_ISFC: case BC_IST: case BC_ISF: | // RA = dst*8 or unused, RD = src*8, JMP with RD = target - | evlddx TMP0, BASE, RD - | evaddw TMP1, TISNIL, TISNIL // Synthesize LJ_TFALSE. + | lwzx TMP0, BASE, RD | lwz INS, 0(PC) - | evcmpltu TMP0, TMP1 | addi PC, PC, 4 if (op == BC_IST || op == BC_ISF) { - | addis TMP3, PC, -(BCBIAS_J*4 >> 16) - | decode_RD4 TMP2, INS - | add TMP2, TMP2, TMP3 + | subfic TMP0, TMP0, LJ_TTRUE + | decode_RD4 TMP2, INS + | subfe TMP1, TMP1, TMP1 + | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16) if (op == BC_IST) { - | isellt PC, TMP2, PC + | andc TMP2, TMP2, TMP1 } else { - | isellt PC, PC, TMP2 + | and TMP2, TMP2, TMP1 } + | add PC, PC, TMP2 } else { + | li TMP1, LJ_TFALSE + | lfdx f0, BASE, RD + | cmplw TMP0, TMP1 if (op == BC_ISTC) { - | checkfail >1 + | bge >1 } else { - | checkok >1 + | blt >1 } | addis PC, PC, -(BCBIAS_J*4 >> 16) | decode_RD4 TMP2, INS - | evstddx TMP0, BASE, RA + | stfdx f0, BASE, RA | add PC, PC, TMP2 |1: } @@ -2290,8 +2274,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) case BC_MOV: | // RA = dst*8, RD = src*8 | ins_next1 - | evlddx TMP0, BASE, RD - | evstddx TMP0, BASE, RA + | lfdx f0, BASE, RD + | stfdx f0, BASE, RA | ins_next2 break; case BC_NOT: @@ -2305,28 +2289,28 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) break; case BC_UNM: | // RA = dst*8, RD = src*8 - | evlddx TMP0, BASE, RD - | checknum TMP0 - | checkfail ->vmeta_unm - | efdneg TMP0, TMP0 + | lwzux TMP1, RD, BASE + | lwz TMP0, 4(RD) + | checknum TMP1; bge ->vmeta_unm + | xoris TMP1, TMP1, 0x8000 | ins_next1 - | evstddx TMP0, BASE, RA + | stwux TMP1, RA, BASE + | stw TMP0, 4(RA) | ins_next2 break; case BC_LEN: | // RA = dst*8, RD = src*8 - | evlddx CARG1, BASE, RD - | checkstr CARG1 - | checkfail >2 + | lwzux TMP0, RD, BASE + | lwz CARG1, 4(RD) + | checkstr TMP0; bne >2 | lwz CRET1, STR:CARG1->len |1: + | tonum_u f0, CRET1 // Result is a non-negative integer. | ins_next1 - | efdcfsi TMP0, CRET1 - | evstddx TMP0, BASE, RA + | stfdx f0, BASE, RA | ins_next2 |2: - | checktab CARG1 - | checkfail ->vmeta_len + | checktab TMP0; bne ->vmeta_len #ifdef LUAJIT_ENABLE_LUA52COMPAT | lwz TAB:TMP2, TAB:CARG1->metatable | cmplwi TAB:TMP2, 0 @@ -2353,72 +2337,77 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) ||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); ||switch (vk) { ||case 0: - | evlddx t0, BASE, RB - | checknum t0 - | evlddx t1, KBASE, RC - | checkfail ->vmeta_arith_vn + | lwzx CARG1, BASE, RB + | lfdx t0, BASE, RB + | lfdx t1, KBASE, RC + | checknum CARG1; bge ->vmeta_arith_vn || break; ||case 1: - | evlddx t1, BASE, RB - | checknum t1 - | evlddx t0, KBASE, RC - | checkfail ->vmeta_arith_nv + | lwzx CARG1, BASE, RB + | lfdx t1, BASE, RB + | lfdx t0, KBASE, RC + | checknum CARG1; bge ->vmeta_arith_nv || break; ||default: - | evlddx t0, BASE, RB - | evlddx t1, BASE, RC - | evmergehi TMP2, t0, t1 - | checknum TMP2 - | checkanyfail ->vmeta_arith_vv + | lwzx CARG1, BASE, RB + | lwzx CARG2, BASE, RC + | lfdx t0, BASE, RB + | lfdx t1, BASE, RC + | checknum cr0, CARG1 + | checknum cr1, CARG2 + | crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt + | bge ->vmeta_arith_vv || break; ||} |.endmacro | |.macro ins_arith, ins - | ins_arithpre TMP0, TMP1 + | ins_arithpre f0, f1 | ins_next1 - | ins TMP0, TMP0, TMP1 - | evstddx TMP0, BASE, RA + | ins f0, f0, f1 + | stfdx f0, BASE, RA | ins_next2 |.endmacro case BC_ADDVN: case BC_ADDNV: case BC_ADDVV: - | ins_arith efdadd + | ins_arith fadd break; case BC_SUBVN: case BC_SUBNV: case BC_SUBVV: - | ins_arith efdsub + | ins_arith fsub break; case BC_MULVN: case BC_MULNV: case BC_MULVV: - | ins_arith efdmul + | ins_arith fmul break; case BC_DIVVN: case BC_DIVNV: case BC_DIVVV: - | ins_arith efddiv + | ins_arith fdiv break; case BC_MODVN: - | ins_arithpre RD, SAVE0 + | ins_arithpre f14, f15 |->BC_MODVN_Z: - | efddiv CARG2, RD, SAVE0 - | bl ->vm_floor_efd // floor(b/c) - | efdmul TMP0, CRET2, SAVE0 + | fdiv FARG1, f14, f15 + | // NYI: Use internal implementation of floor. + | bl extern floor // floor(b/c) + | fmul f0, FARG1, f15 | ins_next1 - | efdsub TMP0, RD, TMP0 // b - floor(b/c)*c - | evstddx TMP0, BASE, RA + | fsub f0, f14, f0 // b - floor(b/c)*c + | stfdx f0, BASE, RA | ins_next2 break; case BC_MODNV: case BC_MODVV: - | ins_arithpre RD, SAVE0 + | ins_arithpre f14, f15 | b ->BC_MODVN_Z // Avoid 3 copies. It's slow anyway. break; case BC_POW: - | evlddx CARG2, BASE, RB - | evlddx CARG4, BASE, RC - | evmergehi CARG1, CARG4, CARG2 - | checknum CARG1 - | evmergehi CARG3, CARG4, CARG4 - | checkanyfail ->vmeta_arith_vv + | lwzx CARG1, BASE, RB + | lfdx FARG1, BASE, RB + | lwzx CARG2, BASE, RC + | lfdx FARG2, BASE, RC + | checknum cr0, CARG1 + | checknum cr1, CARG2 + | crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt + | bge ->vmeta_arith_vv | bl extern pow - | evmergelo CRET2, CRET1, CRET2 - | evstddx CRET2, BASE, RA + | stfdx FARG1, BASE, RA | ins_next break; @@ -2437,8 +2426,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | cmplwi CRET1, 0 | lwz BASE, L->base | bne ->vmeta_binop - | evlddx TMP0, BASE, SAVE0 // Copy result from RB to RA. - | evstddx TMP0, BASE, RA + | lfdx f0, BASE, SAVE0 // Copy result from RB to RA. + | stfdx f0, BASE, RA | ins_next break; @@ -2446,41 +2435,63 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) case BC_KSTR: | // RA = dst*8, RD = str_const*8 (~) - | ins_next1 | srwi TMP1, RD, 1 | subfic TMP1, TMP1, -4 | lwzx TMP0, KBASE, TMP1 // KBASE-4-str_const*4 - | evmergelo TMP0, TISSTR, TMP0 - | evstddx TMP0, BASE, RA + | li TMP2, LJ_TSTR + | ins_next1 + | stwux TMP2, RA, BASE + | stw TMP0, 4(RA) | ins_next2 break; case BC_KCDATA: #if LJ_HASFFI | // RA = dst*8, RD = cdata_const*8 (~) - | ins_next1 | srwi TMP1, RD, 1 | subfic TMP1, TMP1, -4 | lwzx TMP0, KBASE, TMP1 // KBASE-4-cdata_const*4 | li TMP2, LJ_TCDATA - | evmergelo TMP0, TMP2, TMP0 - | evstddx TMP0, BASE, RA + | ins_next1 + | stwux TMP2, RA, BASE + | stw TMP0, 4(RA) | ins_next2 #endif break; case BC_KSHORT: | // RA = dst*8, RD = int16_literal*8 - | srwi TMP1, RD, 3 - | extsh TMP1, TMP1 + | // NYI: which approach is faster? + |.if 1 + | slwi RD, RD, 13 + | srawi RD, RD, 16 + | tonum_i f0, RD | ins_next1 - | efdcfsi TMP0, TMP1 - | evstddx TMP0, BASE, RA + | stfdx f0, BASE, RA | ins_next2 + |.else + | slwi RD, RD, 13 + | srawi TMP1, RD, 31 + | xor TMP2, TMP1, RD + | sub TMP2, TMP2, TMP1 // TMP2 = abs(x) + | cntlzw TMP3, TMP2 + | subfic TMP1, TMP3, 0x40d // TMP1 = exponent-1 + | slw TMP2, TMP2, TMP3 // TMP2 = left aligned mantissa + | subfic TMP3, RD, 0 + | slwi TMP1, TMP1, 20 + | rlwimi RD, TMP2, 21, 1, 31 // hi = sign(x) | (mantissa>>11) + | subfe TMP0, TMP0, TMP0 + | add RD, RD, TMP1 // hi = hi + exponent-1 + | and RD, RD, TMP0 // hi = x == 0 ? 0 : hi + | ins_next1 + | stwux RD, RA, BASE + | stw ZERO, 4(RA) + | ins_next2 + |.endif break; case BC_KNUM: | // RA = dst*8, RD = num_const*8 - | evlddx TMP0, KBASE, RD + | lfdx f0, KBASE, RD | ins_next1 - | evstddx TMP0, BASE, RA + | stfdx f0, BASE, RA | ins_next2 break; case BC_KPRI: @@ -2493,10 +2504,10 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) break; case BC_KNIL: | // RA = base*8, RD = end*8 - | evstddx TISNIL, BASE, RA + | stwx TISNIL, BASE, RA | addi RA, RA, 8 |1: - | evstddx TISNIL, BASE, RA + | stwx TISNIL, BASE, RA | cmpw RA, RD | addi RA, RA, 8 | blt <1 @@ -2513,8 +2524,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | addi RD, RD, offsetof(GCfuncL, uvptr) | lwzx UPVAL:RB, LFUNC:RB, RD | lwz TMP1, UPVAL:RB->v - | evldd TMP0, 0(TMP1) - | evstddx TMP0, BASE, RA + | lfd f0, 0(TMP1) + | stfdx f0, BASE, RA | ins_next2 break; case BC_USETV: @@ -2522,15 +2533,16 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | lwz LFUNC:RB, FRAME_FUNC(BASE) | srwi RA, RA, 1 | addi RA, RA, offsetof(GCfuncL, uvptr) - | evlddx TMP1, BASE, RD + | lfdux f0, RD, BASE | lwzx UPVAL:RB, LFUNC:RB, RA | lbz TMP3, UPVAL:RB->marked | lwz CARG2, UPVAL:RB->v | andi. TMP3, TMP3, LJ_GC_BLACK // isblack(uv) | lbz TMP0, UPVAL:RB->closed - | evmergehi TMP2, TMP1, TMP1 - | evstdd TMP1, 0(CARG2) + | lwz TMP2, 0(RD) + | stfd f0, 0(CARG2) | cmplwi cr1, TMP0, 0 + | lwz TMP1, 4(RD) | cror 4*cr0+eq, 4*cr0+eq, 4*cr1+eq | subi TMP2, TMP2, (LJ_TISNUM+1) | bne >2 // Upvalue is closed and black? @@ -2558,13 +2570,14 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | addi RA, RA, offsetof(GCfuncL, uvptr) | lwzx STR:TMP1, KBASE, TMP1 // KBASE-4-str_const*4 | lwzx UPVAL:RB, LFUNC:RB, RA - | evmergelo STR:TMP1, TISSTR, STR:TMP1 | lbz TMP3, UPVAL:RB->marked | lwz CARG2, UPVAL:RB->v | andi. TMP3, TMP3, LJ_GC_BLACK // isblack(uv) | lbz TMP3, STR:TMP1->marked | lbz TMP2, UPVAL:RB->closed - | evstdd STR:TMP1, 0(CARG2) + | li TMP0, LJ_TSTR + | stw STR:TMP1, 4(CARG2) + | stw TMP0, 0(CARG2) | bne >2 |1: | ins_next2 @@ -2585,10 +2598,10 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | lwz LFUNC:RB, FRAME_FUNC(BASE) | srwi RA, RA, 1 | addi RA, RA, offsetof(GCfuncL, uvptr) - | evlddx TMP0, KBASE, RD + | lfdx f0, KBASE, RD | lwzx UPVAL:RB, LFUNC:RB, RA | lwz TMP1, UPVAL:RB->v - | evstdd TMP0, 0(TMP1) + | stfd f0, 0(TMP1) | ins_next2 break; case BC_USETP: @@ -2633,8 +2646,9 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | bl extern lj_func_newL_gc | // Returns GCfuncL *. | lwz BASE, L->base - | evmergelo LFUNC:CRET1, TISFUNC, LFUNC:CRET1 - | evstddx LFUNC:CRET1, BASE, RA + | li TMP0, LJ_TFUNC + | stwux TMP0, RA, BASE + | stw LFUNC:CRET1, 4(RA) | ins_next break; @@ -2654,9 +2668,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) if (op == BC_TNEW) { | rlwinm CARG2, RD, 29, 21, 31 | rlwinm CARG3, RD, 18, 27, 31 - | cmpwi CARG2, 0x7ff - | li TMP1, 0x801 - | iseleq CARG2, TMP1, CARG2 + | cmpwi CARG2, 0x7ff; beq >3 + |2: | bl extern lj_tab_new // (lua_State *L, int32_t asize, uint32_t hbits) | // Returns Table *. } else { @@ -2667,9 +2680,15 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | // Returns Table *. } | lwz BASE, L->base - | evmergelo TAB:CRET1, TISTAB, TAB:CRET1 - | evstddx TAB:CRET1, BASE, RA + | li TMP0, LJ_TTAB + | stwux TMP0, RA, BASE + | stw TAB:CRET1, 4(RA) | ins_next + if (op == BC_TNEW) { + |3: + | li CARG2, 0x801 + | b <2 + } |5: | mr SAVE0, RD | bl extern lj_gc_step_fixtop // (lua_State *L) @@ -2696,28 +2715,34 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) case BC_TGETV: | // RA = dst*8, RB = table*8, RC = key*8 - | evlddx TAB:RB, BASE, RB - | evlddx RC, BASE, RC - | checktab TAB:RB - | checkfail ->vmeta_tgetv - | checknum RC - | checkfail >5 - | // Convert number key to integer - | efdctsi TMP2, RC + | lwzux CARG1, RB, BASE + | lwzux CARG2, RC, BASE + | lwz TAB:RB, 4(RB) + | lfd f0, 0(RC) + | checktab CARG1 + | checknum cr1, CARG2 + | bne ->vmeta_tgetv + | bge cr1, >5 + | // Convert number key to integer, check for integerness and range. + | fctiwz f1, f0 + | fadd f2, f0, TOBIT + | stfd f1, TMPD | lwz TMP0, TAB:RB->asize - | efdcfsi TMP1, TMP2 - | cmplw cr0, TMP0, TMP2 - | efdcmpeq cr1, RC, TMP1 + | fsub f2, f2, TOBIT + | lwz TMP2, TMPD_LO | lwz TMP1, TAB:RB->array - | crand 4*cr0+gt, 4*cr0+gt, 4*cr1+gt + | fcmpu cr1, f0, f2 + | cmplw cr0, TMP0, TMP2 + | crand 4*cr0+gt, 4*cr0+gt, 4*cr1+eq | slwi TMP2, TMP2, 3 | ble ->vmeta_tgetv // Integer key and in array part? - | evlddx TMP1, TMP1, TMP2 - | checknil TMP1 - | checkok >2 + | lwzx TMP0, TMP1, TMP2 + | lfdx f14, TMP1, TMP2 + | checknil TMP0; beq >2 |1: - | evstddx TMP1, BASE, RA - | ins_next + | ins_next1 + | stfdx f14, BASE, RA + | ins_next2 | |2: // Check for __index if table value is nil. | lwz TAB:TMP2, TAB:RB->metatable @@ -2729,38 +2754,40 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | b ->vmeta_tgetv | |5: - | checkstr STR:RC // String key? - | checkok ->BC_TGETS_Z - | b ->vmeta_tgetv + | checkstr CARG2; bne ->vmeta_tgetv + | lwz STR:RC, 4(RC) + | b ->BC_TGETS_Z // String key? break; case BC_TGETS: | // RA = dst*8, RB = table*8, RC = str_const*8 (~) - | evlddx TAB:RB, BASE, RB + | lwzux CARG1, RB, BASE | srwi TMP1, RC, 1 - | checktab TAB:RB + | lwz TAB:RB, 4(RB) | subfic TMP1, TMP1, -4 + | checktab CARG1 | lwzx STR:RC, KBASE, TMP1 // KBASE-4-str_const*4 - | checkfail ->vmeta_tgets1 + | bne ->vmeta_tgets1 |->BC_TGETS_Z: | // TAB:RB = GCtab *, STR:RC = GCstr *, RA = dst*8 | lwz TMP0, TAB:RB->hmask | lwz TMP1, STR:RC->hash | lwz NODE:TMP2, TAB:RB->node - | evmergelo STR:RC, TISSTR, STR:RC | and TMP1, TMP1, TMP0 // idx = str->hash & tab->hmask | slwi TMP0, TMP1, 5 | slwi TMP1, TMP1, 3 | sub TMP1, TMP0, TMP1 | add NODE:TMP2, NODE:TMP2, TMP1 // node = tab->node + (idx*32-idx*8) |1: - | evldd TMP0, NODE:TMP2->key - | evldd TMP1, NODE:TMP2->val - | evcmpeq TMP0, STR:RC - | checkanyfail >4 - | checknil TMP1 - | checkok >5 // Key found, but nil value? + | lwz CARG1, NODE:TMP2->key + | lwz TMP0, 4+offsetof(Node, key)(NODE:TMP2) + | lwz CARG2, NODE:TMP2->val + | lwz TMP1, 4+offsetof(Node, val)(NODE:TMP2) + | checkstr CARG1; bne >4 + | cmpw TMP0, STR:RC; bne >4 + | checknil CARG2; beq >5 // Key found, but nil value? |3: - | evstddx TMP1, BASE, RA + | stwux CARG2, RA, BASE + | stw TMP1, 4(RA) | ins_next | |4: // Follow hash chain. @@ -2768,7 +2795,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | cmplwi NODE:TMP2, 0 | bne <1 | // End of hash chain: key not found, nil result. - | evmr TMP1, TISNIL + | li CARG2, LJ_TNIL | |5: // Check for __index if table value is nil. | lwz TAB:TMP2, TAB:RB->metatable @@ -2781,20 +2808,19 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) break; case BC_TGETB: | // RA = dst*8, RB = table*8, RC = index*8 - | evlddx TAB:RB, BASE, RB + | lwzux CARG1, RB, BASE + | lwz TAB:RB, 4(RB) | srwi TMP0, RC, 3 - | checktab TAB:RB - | checkfail ->vmeta_tgetb + | checktab CARG1; bne ->vmeta_tgetb | lwz TMP1, TAB:RB->asize | lwz TMP2, TAB:RB->array - | cmplw TMP0, TMP1 - | bge ->vmeta_tgetb - | evlddx TMP1, TMP2, RC - | checknil TMP1 - | checkok >5 + | cmplw TMP0, TMP1; bge ->vmeta_tgetb + | lwzx TMP1, TMP2, RC + | lfdx f0, TMP2, RC + | checknil TMP1; beq >5 |1: | ins_next1 - | evstddx TMP1, BASE, RA + | stfdx f0, BASE, RA | ins_next2 | |5: // Check for __index if table value is nil. @@ -2809,30 +2835,34 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) case BC_TSETV: | // RA = src*8, RB = table*8, RC = key*8 - | evlddx TAB:RB, BASE, RB - | evlddx RC, BASE, RC - | checktab TAB:RB - | checkfail ->vmeta_tsetv - | checknum RC - | checkfail >5 - | // Convert number key to integer - | efdctsi TMP2, RC - | evlddx SAVE0, BASE, RA + | lwzux CARG1, RB, BASE + | lwzux CARG2, RC, BASE + | lwz TAB:RB, 4(RB) + | lfd f0, 0(RC) + | checktab CARG1 + | checknum cr1, CARG2 + | bne ->vmeta_tsetv + | bge cr1, >5 + | // Convert number key to integer, check for integerness and range. + | fctiwz f1, f0 + | fadd f2, f0, TOBIT + | stfd f1, TMPD | lwz TMP0, TAB:RB->asize - | efdcfsi TMP1, TMP2 - | cmplw cr0, TMP0, TMP2 - | efdcmpeq cr1, RC, TMP1 + | fsub f2, f2, TOBIT + | lwz TMP2, TMPD_LO | lwz TMP1, TAB:RB->array - | crand 4*cr0+gt, 4*cr0+gt, 4*cr1+gt + | fcmpu cr1, f0, f2 + | cmplw cr0, TMP0, TMP2 + | crand 4*cr0+gt, 4*cr0+gt, 4*cr1+eq | slwi TMP0, TMP2, 3 | ble ->vmeta_tsetv // Integer key and in array part? - | lbz TMP3, TAB:RB->marked - | evlddx TMP2, TMP1, TMP0 - | checknil TMP2 - | checkok >3 + | lwzx TMP2, TMP1, TMP0 + | lbz TMP3, TAB:RB->marked + | lfdx f14, BASE, RA + | checknil TMP2; beq >3 |1: | andi. TMP2, TMP3, LJ_GC_BLACK // isblack(table) - | evstddx SAVE0, TMP1, TMP0 + | stfdx f14, TMP1, TMP0 | bne >7 |2: | ins_next @@ -2847,46 +2877,55 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | b ->vmeta_tsetv | |5: - | checkstr STR:RC // String key? - | checkok ->BC_TSETS_Z - | b ->vmeta_tsetv + | checkstr CARG2; bne ->vmeta_tsetv + | lwz STR:RC, 4(RC) + | b ->BC_TSETS_Z // String key? | |7: // Possible table write barrier for the value. Skip valiswhite check. | barrierback TAB:RB, TMP3, TMP0 | b <2 break; + |1: + | checkstr CARG1; bne >4 + | cmpw TMP0, STR:RC; bne >4 + | checknil CARG2; beq >5 // Key found, but nil value? + |3: + | stwux CARG2, RA, BASE + | stw TMP1, 4(RA) + | ins_next case BC_TSETS: | // RA = src*8, RB = table*8, RC = str_const*8 (~) - | evlddx TAB:RB, BASE, RB + | lwzux CARG1, RB, BASE | srwi TMP1, RC, 1 - | checktab TAB:RB + | lwz TAB:RB, 4(RB) | subfic TMP1, TMP1, -4 + | checktab CARG1 | lwzx STR:RC, KBASE, TMP1 // KBASE-4-str_const*4 - | checkfail ->vmeta_tsets1 + | bne ->vmeta_tsets1 |->BC_TSETS_Z: | // TAB:RB = GCtab *, STR:RC = GCstr *, RA = src*8 | lwz TMP0, TAB:RB->hmask | lwz TMP1, STR:RC->hash | lwz NODE:TMP2, TAB:RB->node - | evmergelo STR:RC, TISSTR, STR:RC | stb ZERO, TAB:RB->nomm // Clear metamethod cache. | and TMP1, TMP1, TMP0 // idx = str->hash & tab->hmask - | evlddx SAVE0, BASE, RA + | lfdx f14, BASE, RA | slwi TMP0, TMP1, 5 | slwi TMP1, TMP1, 3 | sub TMP1, TMP0, TMP1 | lbz TMP3, TAB:RB->marked | add NODE:TMP2, NODE:TMP2, TMP1 // node = tab->node + (idx*32-idx*8) |1: - | evldd TMP0, NODE:TMP2->key - | evldd TMP1, NODE:TMP2->val - | evcmpeq TMP0, STR:RC - | checkanyfail >5 - | checknil TMP1 - | checkok >4 // Key found, but nil value? + | lwz CARG1, NODE:TMP2->key + | lwz TMP0, 4+offsetof(Node, key)(NODE:TMP2) + | lwz CARG2, NODE:TMP2->val + | lwz TMP1, 4+offsetof(Node, val)(NODE:TMP2) + | checkstr CARG1; bne >5 + | cmpw TMP0, STR:RC; bne >5 + | checknil CARG2; beq >4 // Key found, but nil value? |2: | andi. TMP0, TMP3, LJ_GC_BLACK // isblack(table) - | evstdd SAVE0, NODE:TMP2->val + | stfd f14, NODE:TMP2->val | bne >7 |3: | ins_next @@ -2918,12 +2957,14 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | andi. TMP0, TMP0, 1<vmeta_tsets // 'no __newindex' flag NOT set: check. |6: - | mr CARG2, TAB:RB - | evstdd STR:RC, 0(CARG3) + | li TMP0, LJ_TSTR + | stw STR:RC, 4(CARG3) + | mr CARG2, TAB:RB + | stw TMP0, 0(CARG3) | bl extern lj_tab_newkey // (lua_State *L, GCtab *t, TValue *k) | // Returns TValue *. | lwz BASE, L->base - | evstdd SAVE0, 0(CRET1) + | stfd f14, 0(CRET1) | b <3 // No 2nd write barrier needed. | |7: // Possible table write barrier for the value. Skip valiswhite check. @@ -2932,22 +2973,21 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) break; case BC_TSETB: | // RA = src*8, RB = table*8, RC = index*8 - | evlddx TAB:RB, BASE, RB + | lwzux CARG1, RB, BASE + | lwz TAB:RB, 4(RB) | srwi TMP0, RC, 3 - | checktab TAB:RB - | checkfail ->vmeta_tsetb + | checktab CARG1; bne ->vmeta_tsetb | lwz TMP1, TAB:RB->asize | lwz TMP2, TAB:RB->array | lbz TMP3, TAB:RB->marked | cmplw TMP0, TMP1 - | evlddx SAVE0, BASE, RA + | lfdx f14, BASE, RA | bge ->vmeta_tsetb - | evlddx TMP1, TMP2, RC - | checknil TMP1 - | checkok >5 + | lwzx TMP1, TMP2, RC + | checknil TMP1; beq >5 |1: | andi. TMP0, TMP3, LJ_GC_BLACK // isblack(table) - | evstddx SAVE0, TMP2, RC + | stfdx f14, TMP2, RC | bne >7 |2: | ins_next @@ -2987,10 +3027,10 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | add TMP1, TMP1, TMP0 | andi. TMP0, TMP3, LJ_GC_BLACK // isblack(table) |3: // Copy result slots to table. - | evldd TMP0, 0(RA) + | lfd f0, 0(RA) | addi RA, RA, 8 | cmpw cr1, RA, TMP2 - | evstdd TMP0, 0(TMP1) + | stfd f0, 0(TMP1) | addi TMP1, TMP1, 8 | blt cr1, <3 | bne >7 @@ -3021,13 +3061,12 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) break; case BC_CALL: | // RA = base*8, (RB = (nresults+1)*8,) RC = (nargs+1)*8 - | evlddx LFUNC:RB, BASE, RA - | mr TMP2, BASE - | add BASE, BASE, RA + | mr TMP2, BASE + | lwzux TMP0, BASE, RA + | lwz LFUNC:RB, 4(BASE) | subi NARGS8:RC, NARGS8:RC, 8 - | checkfunc LFUNC:RB | addi BASE, BASE, 8 - | checkfail ->vmeta_call + | checkfunc TMP0; bne ->vmeta_call | ins_call break; @@ -3038,13 +3077,13 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) break; case BC_CALLT: | // RA = base*8, (RB = 0,) RC = (nargs+1)*8 - | evlddx LFUNC:RB, BASE, RA - | add RA, BASE, RA - | lwz TMP1, FRAME_PC(BASE) + | lwzux TMP0, RA, BASE + | lwz LFUNC:RB, 4(RA) | subi NARGS8:RC, NARGS8:RC, 8 - | checkfunc LFUNC:RB + | lwz TMP1, FRAME_PC(BASE) + | checkfunc TMP0 | addi RA, RA, 8 - | checkfail ->vmeta_callt + | bne ->vmeta_callt |->BC_CALLT_Z: | andi. TMP0, TMP1, FRAME_TYPE // Caveat: preserve cr0 until the crand. | lbz TMP3, LFUNC:RB->ffid @@ -3058,9 +3097,9 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | beq cr1, >3 |2: | addi TMP3, TMP2, 8 - | evlddx TMP0, RA, TMP2 + | lfdx f0, RA, TMP2 | cmplw cr1, TMP3, NARGS8:RC - | evstddx TMP0, BASE, TMP2 + | stfdx f0, BASE, TMP2 | mr TMP2, TMP3 | bne cr1, <2 |3: @@ -3089,19 +3128,19 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) case BC_ITERC: | // RA = base*8, (RB = (nresults+1)*8, RC = (nargs+1)*8 ((2+1)*8)) - | subi RA, RA, 24 // evldd doesn't support neg. offsets. - | mr TMP2, BASE - | evlddx LFUNC:RB, BASE, RA - | add BASE, BASE, RA - | evldd TMP0, 8(BASE) - | evldd TMP1, 16(BASE) - | evstdd LFUNC:RB, 24(BASE) // Copy callable. - | checkfunc LFUNC:RB - | evstdd TMP0, 32(BASE) // Copy state. + | mr TMP2, BASE + | add BASE, BASE, RA + | lwz TMP1, -24(BASE) + | lwz LFUNC:RB, -20(BASE) + | lfd f1, -8(BASE) + | lfd f0, -16(BASE) + | stw TMP1, 0(BASE) // Copy callable. + | stw LFUNC:RB, 4(BASE) + | checkfunc TMP1 + | stfd f1, 16(BASE) // Copy control var. | li NARGS8:RC, 16 // Iterators get 2 arguments. - | evstdd TMP1, 40(BASE) // Copy control var. - | addi BASE, BASE, 32 - | checkfail ->vmeta_call + | stfdu f0, 8(BASE) // Copy state. + | bne ->vmeta_call | ins_call break; @@ -3120,18 +3159,19 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | cmplw RC, TMP0 | slwi TMP3, RC, 3 | bge >5 // Index points after array part? - | evlddx TMP2, TMP1, TMP3 + | lwzx TMP2, TMP1, TMP3 + | lfdx f0, TMP1, TMP3 | checknil TMP2 | lwz INS, -4(PC) - | checkok >4 - | efdcfsi TMP0, RC + | beq >4 + | tonum_u f1, RC | addi RC, RC, 1 | addis TMP3, PC, -(BCBIAS_J*4 >> 16) - | evstdd TMP2, 8(RA) + | stfd f0, 8(RA) | decode_RD4 TMP1, INS | stw RC, -4(RA) // Update control var. | add PC, TMP1, TMP3 - | evstdd TMP0, 0(RA) + | stfd f1, 0(RA) |3: | ins_next | @@ -3149,17 +3189,18 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | bgt <3 | slwi RB, RC, 3 | sub TMP3, TMP3, RB - | evlddx RB, TMP2, TMP3 + | lwzx RB, TMP2, TMP3 + | lfdx f0, TMP2, TMP3 | add NODE:TMP3, TMP2, TMP3 | checknil RB | lwz INS, -4(PC) - | checkok >7 - | evldd TMP3, NODE:TMP3->key + | beq >7 + | lfd f1, NODE:TMP3->key | addis TMP2, PC, -(BCBIAS_J*4 >> 16) - | evstdd RB, 8(RA) + | stfd f0, 8(RA) | add RC, RC, TMP0 | decode_RD4 TMP1, INS - | evstdd TMP3, 0(RA) + | stfd f1, 0(RA) | addi RC, RC, 1 | add PC, TMP1, TMP2 | stw RC, -4(RA) // Update control var. @@ -3173,11 +3214,10 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) case BC_ISNEXT: | // RA = base*8, RD = target (points to ITERN) | add RA, BASE, RA - | li TMP2, -24 - | evlddx CFUNC:TMP1, RA, TMP2 + | lwz TMP0, -24(RA) + | lwz CFUNC:TMP1, -20(RA) | lwz TMP2, -16(RA) | lwz TMP3, -8(RA) - | evmergehi TMP0, CFUNC:TMP1, CFUNC:TMP1 | cmpwi cr0, TMP2, LJ_TTAB | cmpwi cr1, TMP0, LJ_TFUNC | cmpwi cr6, TMP3, LJ_TNIL @@ -3218,16 +3258,16 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | subi TMP2, TMP2, 16 | ble >2 // No vararg slots? |1: // Copy vararg slots to destination slots. - | evldd TMP0, 0(RC) + | lfd f0, 0(RC) | addi RC, RC, 8 - | evstdd TMP0, 0(RA) + | stfd f0, 0(RA) | cmplw RA, TMP2 | cmplw cr1, RC, TMP3 | bge >3 // All destination slots filled? | addi RA, RA, 8 | blt cr1, <1 // More vararg slots? |2: // Fill up remainder with nil. - | evstdd TISNIL, 0(RA) + | stw TISNIL, 0(RA) | cmplw RA, TMP2 | addi RA, RA, 8 | blt <2 @@ -3243,9 +3283,9 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | addi MULTRES, TMP1, 8 | bgt >7 |6: - | evldd TMP0, 0(RC) + | lfd f0, 0(RC) | addi RC, RC, 8 - | evstdd TMP0, 0(RA) + | stfd f0, 0(RA) | cmplw RC, TMP3 | addi RA, RA, 8 | blt <6 // More vararg slots? @@ -3296,14 +3336,14 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | li TMP1, 0 |2: | addi TMP3, TMP1, 8 - | evlddx TMP0, RA, TMP1 + | lfdx f0, RA, TMP1 | cmpw TMP3, RC - | evstddx TMP0, TMP2, TMP1 + | stfdx f0, TMP2, TMP1 | beq >3 | addi TMP1, TMP3, 8 - | evlddx TMP0, RA, TMP3 + | lfdx f1, RA, TMP3 | cmpw TMP1, RC - | evstddx TMP0, TMP2, TMP3 + | stfdx f1, TMP2, TMP3 | bne <2 |3: |5: @@ -3320,7 +3360,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) |6: // Fill up results with nil. | subi TMP1, RD, 8 | addi RD, RD, 8 - | evstddx TISNIL, TMP2, TMP1 + | stwx TISNIL, TMP2, TMP1 | b <5 | |->BC_RETV_Z: // Non-standard return case. @@ -3345,8 +3385,8 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | subi TMP2, BASE, 8 | decode_RB8 RB, INS if (op == BC_RET1) { - | evldd TMP0, 0(RA) - | evstdd TMP0, 0(TMP2) + | lfd f0, 0(RA) + | stfd f0, 0(TMP2) } |5: | cmplw RB, RD @@ -3362,7 +3402,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) |6: // Fill up results with nil. | subi TMP1, RD, 8 | addi RD, RD, 8 - | evstddx TISNIL, TMP2, TMP1 + | stwx TISNIL, TMP2, TMP1 | b <5 break; @@ -3384,47 +3424,62 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) case BC_IFORL: | // RA = base*8, RD = target (after end of loop or start of loop) vk = (op == BC_IFORL || op == BC_JFORL); - | add RA, BASE, RA - | evldd TMP1, FORL_IDX*8(RA) - | evldd TMP3, FORL_STEP*8(RA) - | evldd TMP2, FORL_STOP*8(RA) - if (!vk) { - | evcmpgtu cr0, TMP1, TISNUM - | evcmpgtu cr7, TMP3, TISNUM - | evcmpgtu cr1, TMP2, TISNUM - | cror 4*cr0+lt, 4*cr0+lt, 4*cr7+lt - | cror 4*cr0+lt, 4*cr0+lt, 4*cr1+lt - | blt ->vmeta_for - } if (vk) { - | efdadd TMP1, TMP1, TMP3 - | evstdd TMP1, FORL_IDX*8(RA) + | lfdux f1, RA, BASE + | lfd f3, FORL_STEP*8(RA) + | lfd f2, FORL_STOP*8(RA) + | lwz TMP3, FORL_STEP*8(RA) + | fadd f1, f1, f3 + | stfd f1, FORL_IDX*8(RA) + } else { + | lwzux TMP1, RA, BASE + | lfd f1, FORL_IDX*8(RA) + | lwz TMP3, FORL_STEP*8(RA) + | lfd f3, FORL_STEP*8(RA) + | lwz TMP2, FORL_STOP*8(RA) + | lfd f2, FORL_STOP*8(RA) + | cmplw cr0, TMP1, TISNUM + | cmplw cr7, TMP3, TISNUM + | cmplw cr1, TMP2, TISNUM + | crand 4*cr0+lt, 4*cr0+lt, 4*cr7+lt + | crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt + | bge ->vmeta_for } - | evcmpgts TMP3, TISNIL - | evstdd TMP1, FORL_EXT*8(RA) - | bge >2 - | efdcmpgt TMP1, TMP2 - |1: + | cmpwi cr3, TMP3, 0 if (op != BC_JFORL) { | srwi RD, RD, 1 - | add RD, PC, RD - if (op == BC_JFORI) { - | addis PC, RD, -(BCBIAS_J*4 >> 16) - } else { - | addis RD, RD, -(BCBIAS_J*4 >> 16) - } } + | stfd f1, FORL_EXT*8(RA) + if (op != BC_JFORL) { + | add RD, PC, RD + } + | fcmpu cr0, f1, f2 + if (op == BC_JFORI) { + | addis PC, RD, -(BCBIAS_J*4 >> 16) + } + | blt cr3, >5 if (op == BC_FORI) { - | iselgt PC, RD, PC + | bgt >3 } else if (op == BC_IFORL) { - | iselgt PC, PC, RD + | bgt >2 + |1: + | addis PC, RD, -(BCBIAS_J*4 >> 16) } else { | ble =>BC_JLOOP } - | ins_next |2: - | efdcmpgt TMP2, TMP1 - | b <1 + | ins_next + |5: // Negative step. + if (op == BC_FORI) { + | bge <2 + |3: + | addis PC, RD, -(BCBIAS_J*4 >> 16) + } else if (op == BC_IFORL) { + | bge <1 + } else { + | bge =>BC_JLOOP + } + | b <2 break; case BC_ITERL: @@ -3440,15 +3495,15 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) #endif case BC_IITERL: | // RA = base*8, RD = target - | evlddx TMP1, BASE, RA - | subi RA, RA, 8 - | checknil TMP1 - | checkok >1 // Stop if iterator returned nil. + | lwzux TMP1, RA, BASE + | lwz TMP2, 4(RA) + | checknil TMP1; beq >1 // Stop if iterator returned nil. if (op == BC_JITERL) { | NYI } else { | branch_RD // Otherwise save control var + branch. - | evstddx TMP1, BASE, RA + | stw TMP1, -8(RA) + | stw TMP2, -4(RA) } |1: | ins_next @@ -3514,7 +3569,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) } | |3: // Clear missing parameters. - | evstddx TISNIL, BASE, NARGS8:RC + | stwx TISNIL, BASE, NARGS8:RC | addi NARGS8:RC, NARGS8:RC, 8 | b <2 break; @@ -3546,20 +3601,22 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | beq >3 |1: | cmplw RA, RC // Less args than parameters? - | evldd TMP0, 0(RA) + | lwz TMP0, 0(RA) + | lwz TMP3, 4(RA) | bge >4 - | evstdd TISNIL, 0(RA) // Clear old fixarg slot (help the GC). + | stw TISNIL, 0(RA) // Clear old fixarg slot (help the GC). | addi RA, RA, 8 |2: | addic. TMP2, TMP2, -1 - | evstdd TMP0, 8(TMP1) + | stw TMP0, 8(TMP1) + | stw TMP3, 12(TMP1) | addi TMP1, TMP1, 8 | bne <1 |3: | ins_next2 | |4: // Clear missing parameters. - | evmr TMP0, TISNIL + | li TMP0, LJ_TNIL | b <2 break; diff --git a/src/buildvm_ppc.h b/src/buildvm_ppc.h index 0a33c11c..b5d80346 100644 --- a/src/buildvm_ppc.h +++ b/src/buildvm_ppc.h @@ -1 +1,6686 @@ -/* Placeholder file. */ +/* +** This file has been pre-processed with DynASM. +** http://luajit.org/dynasm.html +** DynASM version 1.3.0, DynASM ppc version 1.3.0 +** DO NOT EDIT! The original file is in "buildvm_ppc.dasc". +*/ + +#if DASM_VERSION != 10300 +#error "Version mismatch between DynASM and included encoding engine" +#endif + +#define DASM_SECTION_CODE_OP 0 +#define DASM_SECTION_CODE_SUB 1 +#define DASM_MAXSECTION 2 +static const unsigned int build_actionlist[5561] = { +0x00010001, +0x00060014, +0x72000000, +0x00090200, +0x39000000, +0x00098200, +0x41820000, +0x00050815, +0x8209fff8, +0x7d2e4b78, +0x9514fff8, +0x00060016, +0x72000000, +0x00090200, +0x398c0008, +0x7d936378, +0x41820000, +0x00050817, +0x00060018, +0x2c000000, +0x00098200, +0x56090038, +0x38000000, +0x00098200, +0x7d297050, +0x40820000, +0x00050814, +0x350cfff8, +0x91320000, +0x00098200, +0x81210018, +0x39cefff8, +0x90110000, +0x00098200, +0x55291800, +0x000900a1, +0x41820000, +0x00050802, +0x0006000b, +0x3508fff8, +0xc8140000, +0x3a940008, +0xd80e0000, +0x39ce0008, +0x40820000, +0x0005080b, +0x0006000c, +0x7c096000, +0x40820000, +0x00050806, +0x0006000d, +0x91d20000, +0x00098200, +0x00060019, +0x00000000, +0x80010014, +0x38600000, +0x90120000, +0x00098200, +0x0006001a, +0x80010104, +0x81c10000, +0x00098200, +0xc9c10000, +0x00098200, +0x81e10000, +0x00098200, +0xc9e10000, +0x00098200, +0x82010000, +0x00098200, +0xca010000, +0x00098200, +0x82210000, +0x00098200, +0xca210000, +0x00098200, +0x82410000, +0x00098200, +0xca410000, +0x00098200, +0x82610000, +0x00098200, +0xca610000, +0x00098200, +0x7c0803a6, +0x82810000, +0x00098200, +0xca810000, +0x00098200, +0x82a10000, +0x00098200, +0xcaa10000, +0x00098200, +0x82c10000, +0x00098200, +0xcac10000, +0x00098200, +0x82e10000, +0x00098200, +0xcae10000, +0x00098200, +0x00000000, +0x83010000, +0x00098200, +0xcb010000, +0x00098200, +0x83210000, +0x00098200, +0xcb210000, +0x00098200, +0x83410000, +0x00098200, +0xcb410000, +0x00098200, +0x83610000, +0x00098200, +0xcb610000, +0x00098200, +0x83810000, +0x00098200, +0xcb810000, +0x00098200, +0x83a10000, +0x00098200, +0xcba10000, +0x00098200, +0x83c10000, +0x00098200, +0xcbc10000, +0x00098200, +0x83e10000, +0x00098200, +0xcbe10000, +0x00098200, +0x38210100, +0x4e800020, +0x00060010, +0x40810000, +0x00050807, +0x81120000, +0x00098200, +0x7c0e4040, +0x40800000, +0x00050808, +0x92ee0000, +0x398c0008, +0x39ce0008, +0x48000000, +0x0005000c, +0x00060011, +0x00000000, +0x20c90000, +0x7c096050, +0x7d084110, +0x7c004038, +0x7dc07050, +0x48000000, +0x0005000d, +0x00060012, +0x91d20000, +0x00098200, +0x7d956378, +0x7d244b78, +0x7e439378, +0x48000001, +0x00030000, +0x81210018, +0x7eacab78, +0x55291800, +0x000900a1, +0x81d20000, +0x00098200, +0x48000000, +0x0005000c, +0x0006001b, +0x7c611b78, +0x7c832378, +0x0006001c, +0x82410010, +0x38000000, +0x00098200, +0x81120000, +0x00098200, +0x90080000, +0x00098200, +0x48000000, +0x0005001a, +0x0006001d, +0x5461003a, +0x0006001e, +0x82410010, +0x3ac00000, +0x00098200, +0x81d20000, +0x00098200, +0x3cc059c0, +0x82320000, +0x00098200, +0x3b000000, +0x90c10008, +0x39000000, +0x00098200, +0x60c60004, +0x3ae00000, +0x00098200, +0x38000000, +0x00098200, +0xc3c10008, +0x820efff8, +0x3a8efff8, +0x90c10008, +0x3a310000, +0x00098200, +0x00000000, +0x91140000, +0x39800010, +0x90110000, +0x00098200, +0xc3e10008, +0x48000000, +0x00050016, +0x0006001f, +0x38800000, +0x00098200, +0x48000000, +0x00050002, +0x00060020, +0x7d6e5a14, +0x7e8ea050, +0x91d20000, +0x00098200, +0x3a100004, +0x91720000, +0x00098200, +0x568400fe, +0x000900ab, +0x0006000c, +0x92010008, +0x7e439378, +0x48000001, +0x00030000, +0x81d20000, +0x00098200, +0x81720000, +0x00098200, +0x814efffc, +0x7d6e5850, +0x820a0000, +0x00098200, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54f4dd78, +0x7c11402e, +0x7e947214, +0x7c0903a6, +0x4e800420, +0x00060021, +0x9421ff00, +0x91c10000, +0x00098200, +0xd9c10000, +0x00098200, +0x91e10000, +0x00098200, +0xd9e10000, +0x00098200, +0x92010000, +0x00098200, +0xda010000, +0x00098200, +0x92210000, +0x00098200, +0x00000000, +0xda210000, +0x00098200, +0x92410000, +0x00098200, +0xda410000, +0x00098200, +0x92610000, +0x00098200, +0xda610000, +0x00098200, +0x7c0802a6, +0x92810000, +0x00098200, +0xda810000, +0x00098200, +0x92a10000, +0x00098200, +0xdaa10000, +0x00098200, +0x92c10000, +0x00098200, +0xdac10000, +0x00098200, +0x92e10000, +0x00098200, +0xdae10000, +0x00098200, +0x93010000, +0x00098200, +0xdb010000, +0x00098200, +0x93210000, +0x00098200, +0xdb210000, +0x00098200, +0x90010104, +0x93410000, +0x00098200, +0xdb410000, +0x00098200, +0x93610000, +0x00098200, +0xdb610000, +0x00098200, +0x93810000, +0x00098200, +0x00000000, +0xdb810000, +0x00098200, +0x93a10000, +0x00098200, +0xdba10000, +0x00098200, +0x93c10000, +0x00098200, +0xdbc10000, +0x00098200, +0x93e10000, +0x00098200, +0xdbe10000, +0x00098200, +0x7c721b78, +0x82320000, +0x00098200, +0x7c8e2378, +0x89120000, +0x00098200, +0x92410010, +0x3a000000, +0x00098200, +0x38010000, +0x00098200, +0x3a310000, +0x00098200, +0x90a10018, +0x28080000, +0x90a1001c, +0x90120000, +0x00098200, +0x90a10014, +0x90610008, +0x41820000, +0x00050803, +0x7dd47378, +0x81d20000, +0x00098200, +0x3ac00000, +0x00098200, +0x81120000, +0x00098200, +0x820efff8, +0x3cc059c0, +0x7d8e4050, +0x98b20000, +0x00098200, +0x90c10008, +0x72000000, +0x00090200, +0x60c60004, +0xc3c10008, +0x3b000000, +0x90c10008, +0x398c0008, +0x3c004338, +0x7d936378, +0x90010020, +0x38000000, +0x00098200, +0xc3e10008, +0x3ae00000, +0x00098200, +0x90110000, +0x00098200, +0x00000000, +0x41820000, +0x00050817, +0x48000000, +0x00050018, +0x00060022, +0x9421ff00, +0x91c10000, +0x00098200, +0xd9c10000, +0x00098200, +0x91e10000, +0x00098200, +0xd9e10000, +0x00098200, +0x92010000, +0x00098200, +0xda010000, +0x00098200, +0x92210000, +0x00098200, +0xda210000, +0x00098200, +0x92410000, +0x00098200, +0xda410000, +0x00098200, +0x92610000, +0x00098200, +0xda610000, +0x00098200, +0x7c0802a6, +0x92810000, +0x00098200, +0xda810000, +0x00098200, +0x92a10000, +0x00098200, +0xdaa10000, +0x00098200, +0x92c10000, +0x00098200, +0xdac10000, +0x00098200, +0x92e10000, +0x00098200, +0x00000000, +0xdae10000, +0x00098200, +0x93010000, +0x00098200, +0xdb010000, +0x00098200, +0x93210000, +0x00098200, +0xdb210000, +0x00098200, +0x90010104, +0x93410000, +0x00098200, +0xdb410000, +0x00098200, +0x93610000, +0x00098200, +0xdb610000, +0x00098200, +0x93810000, +0x00098200, +0xdb810000, +0x00098200, +0x93a10000, +0x00098200, +0xdba10000, +0x00098200, +0x93c10000, +0x00098200, +0xdbc10000, +0x00098200, +0x93e10000, +0x00098200, +0xdbe10000, +0x00098200, +0x3a000000, +0x00098200, +0x90c1001c, +0x48000000, +0x00050001, +0x00060023, +0x9421ff00, +0x91c10000, +0x00098200, +0xd9c10000, +0x00098200, +0x00000000, +0x91e10000, +0x00098200, +0xd9e10000, +0x00098200, +0x92010000, +0x00098200, +0xda010000, +0x00098200, +0x92210000, +0x00098200, +0xda210000, +0x00098200, +0x92410000, +0x00098200, +0xda410000, +0x00098200, +0x92610000, +0x00098200, +0xda610000, +0x00098200, +0x7c0802a6, +0x92810000, +0x00098200, +0xda810000, +0x00098200, +0x92a10000, +0x00098200, +0xdaa10000, +0x00098200, +0x92c10000, +0x00098200, +0xdac10000, +0x00098200, +0x92e10000, +0x00098200, +0xdae10000, +0x00098200, +0x93010000, +0x00098200, +0xdb010000, +0x00098200, +0x93210000, +0x00098200, +0xdb210000, +0x00098200, +0x00000000, +0x90010104, +0x93410000, +0x00098200, +0xdb410000, +0x00098200, +0x93610000, +0x00098200, +0xdb610000, +0x00098200, +0x93810000, +0x00098200, +0xdb810000, +0x00098200, +0x93a10000, +0x00098200, +0xdba10000, +0x00098200, +0x93c10000, +0x00098200, +0xdbc10000, +0x00098200, +0x93e10000, +0x00098200, +0xdbe10000, +0x00098200, +0x3a000000, +0x00098200, +0x0006000b, +0x81030000, +0x00098200, +0x90a10018, +0x7c721b78, +0x90610010, +0x7c8e2378, +0x90320000, +0x00098200, +0x82320000, +0x00098200, +0x90610008, +0x91010014, +0x3a310000, +0x00098200, +0x0006000d, +0x81320000, +0x00098200, +0x3ac00000, +0x00098200, +0x81120000, +0x00098200, +0x00000000, +0x3cc059c0, +0x7e107214, +0x90c10008, +0x3b000000, +0x60c60004, +0xc3c10008, +0x7e098050, +0x90c10008, +0x3c004338, +0x7d6e4050, +0x90010020, +0x38000000, +0x00098200, +0xc3e10008, +0x3ae00000, +0x00098200, +0x90110000, +0x00098200, +0x00060024, +0x800efff8, +0x814efffc, +0x2c000000, +0x00098200, +0x40820000, +0x00050825, +0x00060026, +0x920efff8, +0x820a0000, +0x00098200, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54f4dd78, +0x7c11402e, +0x7e947214, +0x7c0903a6, +0x4e800420, +0x00060027, +0x9421ff00, +0x91c10000, +0x00098200, +0xd9c10000, +0x00098200, +0x91e10000, +0x00098200, +0xd9e10000, +0x00098200, +0x92010000, +0x00098200, +0xda010000, +0x00098200, +0x92210000, +0x00098200, +0xda210000, +0x00098200, +0x92410000, +0x00098200, +0xda410000, +0x00098200, +0x92610000, +0x00098200, +0xda610000, +0x00098200, +0x7c0802a6, +0x92810000, +0x00098200, +0x00000000, +0xda810000, +0x00098200, +0x92a10000, +0x00098200, +0xdaa10000, +0x00098200, +0x92c10000, +0x00098200, +0xdac10000, +0x00098200, +0x92e10000, +0x00098200, +0xdae10000, +0x00098200, +0x93010000, +0x00098200, +0xdb010000, +0x00098200, +0x93210000, +0x00098200, +0xdb210000, +0x00098200, +0x90010104, +0x93410000, +0x00098200, +0xdb410000, +0x00098200, +0x93610000, +0x00098200, +0xdb610000, +0x00098200, +0x93810000, +0x00098200, +0xdb810000, +0x00098200, +0x93a10000, +0x00098200, +0xdba10000, +0x00098200, +0x93c10000, +0x00098200, +0xdbc10000, +0x00098200, +0x93e10000, +0x00098200, +0x00000000, +0xdbe10000, +0x00098200, +0x7c721b78, +0x80030000, +0x00098200, +0x90610010, +0x81120000, +0x00098200, +0x90610008, +0x7c080050, +0x81120000, +0x00098200, +0x90320000, +0x00098200, +0x39200000, +0x90010018, +0x9121001c, +0x91010014, +0x7cc903a6, +0x4e800421, +0x7c6e1b79, +0x82320000, +0x00098200, +0x3a000000, +0x00098200, +0x3a310000, +0x00098200, +0x40820000, +0x0005080d, +0x48000000, +0x00050019, +0x00060015, +0x800efff4, +0x7dca7378, +0x7d2e4b78, +0x8109fffc, +0x28000000, +0x820afff0, +0x41820000, +0x00050801, +0x392cfff8, +0x81080000, +0x00098200, +0x7ef4492e, +0x81e80000, +0x00098200, +0x7c0903a6, +0x4e800420, +0x0006000b, +0x390afff0, +0x7d6e4050, +0x48000000, +0x00050028, +0x00060029, +0x80f0fffc, +0x388afff0, +0x54f55d78, +0xc8140000, +0x7d0eaa14, +0x91d20000, +0x00098200, +0x7c082040, +0x7ca82050, +0x54f4dd78, +0xd8040000, +0x40820000, +0x0005082a, +0x7c0ea5ae, +0x48000000, +0x0005002b, +0x0006002c, +0x38b10000, +0x00098200, +0x00000000, +0x38000000, +0x00098200, +0x54ea5d78, +0x91650004, +0x7c8e5214, +0x90050000, +0x48000000, +0x00050001, +0x0006002d, +0x38910000, +0x00098200, +0x38000000, +0x00098200, +0x91440004, +0x38b10000, +0x00098200, +0x90040000, +0x39000000, +0x00098200, +0x91650004, +0x91050000, +0x48000000, +0x00050001, +0x0006002e, +0x90010024, +0xc8010020, +0xfc00f028, +0x54ea5d78, +0x38b10000, +0x00098200, +0x7c8e5214, +0xd8050000, +0x48000000, +0x00050001, +0x0006002f, +0x54ea5d78, +0x54eb9d78, +0x7c8e5214, +0x7cae5a14, +0x0006000b, +0x91d20000, +0x00098200, +0x7e439378, +0x92010008, +0x48000001, +0x00030001, +0x28030000, +0x41820000, +0x00050803, +0xc8030000, +0x80f00000, +0x3a100004, +0x7c0ea5ae, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x0006000d, +0x210e0000, +0x00098200, +0x81d20000, +0x00098200, +0x920efff0, +0x7e087214, +0x814efffc, +0x39600010, +0x48000000, +0x00050026, +0x00060030, +0x38b10000, +0x00098200, +0x00000000, +0x38000000, +0x00098200, +0x54ea5d78, +0x91650004, +0x7c8e5214, +0x90050000, +0x48000000, +0x00050001, +0x00060031, +0x38910000, +0x00098200, +0x38000000, +0x00098200, +0x91440004, +0x38b10000, +0x00098200, +0x90040000, +0x39000000, +0x00098200, +0x91650004, +0x91050000, +0x48000000, +0x00050001, +0x00060032, +0x90010024, +0xc8010020, +0xfc00f028, +0x54ea5d78, +0x38b10000, +0x00098200, +0x7c8e5214, +0xd8050000, +0x48000000, +0x00050001, +0x00060033, +0x54ea5d78, +0x54eb9d78, +0x7c8e5214, +0x7cae5a14, +0x0006000b, +0x91d20000, +0x00098200, +0x7e439378, +0x92010008, +0x48000001, +0x00030002, +0x28030000, +0x7c0ea4ae, +0x41820000, +0x00050803, +0x80f00000, +0x3a100004, +0xd8030000, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x0006000d, +0x210e0000, +0x00098200, +0x81d20000, +0x00098200, +0x920efff0, +0x7e087214, +0x814efffc, +0x39600018, +0xd80e0010, +0x48000000, +0x00050026, +0x00060034, +0x7e439378, +0x3a10fffc, +0x7c8ea214, +0x92010008, +0x7cae6214, +0x91d20000, +0x00098200, +0x00000000, +0x54e6063e, +0x48000001, +0x00030003, +0x0006000d, +0x28030001, +0x41810000, +0x00050835, +0x20630000, +0x0006000e, +0x80f00000, +0x3a100004, +0x54e993ba, +0x3d290000, +0x00098200, +0x7d291838, +0x7e104a14, +0x0006002b, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00060036, +0x80f0fffc, +0xc8140000, +0x54e8dd78, +0x7c0e45ae, +0x48000000, +0x0005002b, +0x00060037, +0x80140000, +0x20000000, +0x00098200, +0x7c631910, +0x7c6318f8, +0x48000000, +0x0005000e, +0x00060038, +0x80140000, +0x20000000, +0x00098200, +0x7c631910, +0x48000000, +0x0005000e, +0x00060039, +0x3a10fffc, +0x91d20000, +0x00098200, +0x7e439378, +0x92010008, +0x48000001, +0x00030004, +0x48000000, +0x0005000d, +0x0006003a, +0x7cae5214, +0x7ccf5a14, +0x48000000, +0x00050001, +0x0006003b, +0x7caf5a14, +0x7cce5214, +0x48000000, +0x00050001, +0x0006003c, +0x00000000, +0x7d856378, +0x7d866378, +0x48000000, +0x00050001, +0x0006003d, +0x7cae5214, +0x7cce5a14, +0x0006000b, +0x7c8ea214, +0x91d20000, +0x00098200, +0x7e439378, +0x92010008, +0x54e7063e, +0x48000001, +0x00030005, +0x28030000, +0x41820000, +0x0005082b, +0x00060035, +0x7d0e1850, +0x9203fff0, +0x7dc97378, +0x3a080000, +0x00098200, +0x7c6e1b78, +0x39600010, +0x48000000, +0x00050024, +0x0006003e, +0x00000000, +0x7c751b78, +0x00000000, +0x7d846378, +0x91d20000, +0x00098200, +0x7e439378, +0x92010008, +0x48000001, +0x00030006, +0x00000000, +0x28030000, +0x40820000, +0x00050835, +0x7ea3ab78, +0x48000000, +0x0005003f, +0x00000000, +0x48000000, +0x00050035, +0x00000000, +0x00060025, +0x7e439378, +0x91320000, +0x00098200, +0x388efff8, +0x92010008, +0x7cae5a14, +0x7d755b78, +0x48000001, +0x00030007, +0x814efffc, +0x39750008, +0x920efff8, +0x820a0000, +0x00098200, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54f4dd78, +0x7c11402e, +0x7e947214, +0x7c0903a6, +0x4e800420, +0x00060040, +0x7e439378, +0x91d20000, +0x00098200, +0x3894fff8, +0x92010008, +0x7cb45a14, +0x7d755b78, +0x48000001, +0x00030007, +0x810efff8, +0x39750008, +0x8154fffc, +0x48000000, +0x00050041, +0x00060042, +0x7e439378, +0x91d20000, +0x00098200, +0x7e84a378, +0x92010008, +0x7cf53b78, +0x48000001, +0x00030008, +0x00000000, +0x56a0063e, +0x00000000, +0x56b4dd78, +0x00000000, +0x2c000000, +0x00098200, +0x00000000, +0x56ac9b78, +0x00000000, +0x41820000, +0x00070800, +0x00000000, +0x48000000, +0x00070000, +0x00060043, +0x280b0008, +0x80ae0000, +0x806e0004, +0x41800000, +0x00050844, +0x39000000, +0x00098200, +0x3a8efff8, +0x7c854040, +0x820efff8, +0x40840000, +0x00050844, +0x90b40000, +0x398b0008, +0x90740004, +0x41820000, +0x00050845, +0x39000008, +0x396bfff8, +0x0006000b, +0x7c085840, +0x7c0e44ae, +0x7c1445ae, +0x39080008, +0x40820000, +0x0005080b, +0x48000000, +0x00050045, +0x00060046, +0x280b0008, +0x806e0000, +0x41800000, +0x00050844, +0x7c161810, +0x7d231910, +0x7d280338, +0x39080000, +0x00098200, +0x55081800, +0x000900a1, +0x392a0000, +0x00098200, +0x7c2944ae, +0x48000000, +0x00050047, +0x00060048, +0x280b0008, +0x80ae0000, +0x806e0004, +0x41800000, +0x00050844, +0x2c050000, +0x00098200, +0x40820000, +0x00050806, +0x0006000b, +0x80630000, +0x00098200, +0x0006000c, +0x00000000, +0x38a00000, +0x00098200, +0x28030000, +0x81710000, +0x00098200, +0x41820000, +0x00050849, +0x80030000, +0x00098200, +0x38a00000, +0x00098200, +0x810b0000, +0x00098200, +0x81230000, +0x00098200, +0x7d080038, +0x55002800, +0x000900a1, +0x55081800, +0x000900a1, +0x7d080050, +0x7d294214, +0x0006000d, +0x80c90000, +0x00098200, +0x80090000, +0x00098200, +0x80890000, +0x00098200, +0x81090000, +0x00098200, +0x2c060000, +0x00098200, +0x40820000, +0x00050804, +0x7c005800, +0x41820000, +0x00050805, +0x0006000e, +0x81290000, +0x00098200, +0x28090000, +0x41820000, +0x00050849, +0x48000000, +0x0005000d, +0x0006000f, +0x00000000, +0x2c040000, +0x00098200, +0x41820000, +0x00050849, +0x7c852378, +0x7d034378, +0x48000000, +0x00050049, +0x00060010, +0x2c050000, +0x00098200, +0x41820000, +0x0005080b, +0x7c162810, +0x7d252910, +0x7d280338, +0x39080000, +0x00098200, +0x55081000, +0x000900a1, +0x39310000, +0x00098200, +0x7c69402e, +0x48000000, +0x0005000c, +0x0006004a, +0x280b0010, +0x80ae0000, +0x80ce0008, +0x806e0004, +0x808e000c, +0x41800000, +0x00050844, +0x2c050000, +0x00098200, +0x40820000, +0x00050844, +0x81030000, +0x00098200, +0x2c060000, +0x00098200, +0x40820000, +0x00050844, +0x28080000, +0x88c30000, +0x00098200, +0x40820000, +0x00050844, +0x70c00000, +0x00090200, +0x90830000, +0x00098200, +0x41820000, +0x00050849, +0x00000000, +0x80110000, +0x00098200, +0x54c607b8, +0x90710000, +0x00098200, +0x98c30000, +0x00098200, +0x90030000, +0x00098200, +0x48000000, +0x00050049, +0x0006004b, +0x280b0008, +0x80ce0000, +0x808e0004, +0x41800000, +0x00050844, +0x2c060000, +0x00098200, +0x40820000, +0x00050844, +0x38ae0008, +0x7e439378, +0x48000001, +0x00030009, +0xc8230000, +0x48000000, +0x00050047, +0x0006004c, +0x280b0008, +0x806e0000, +0xc82e0000, +0x40820000, +0x00050844, +0x7c03b040, +0x41810000, +0x00050844, +0x48000000, +0x00050047, +0x0006004d, +0x280b0008, +0x80ae0000, +0x806e0004, +0x41800000, +0x00050844, +0x2c050000, +0x00098200, +0x41820000, +0x00050849, +0x80110000, +0x00098200, +0x7c05b040, +0x28800000, +0x91d20000, +0x00098200, +0x4c413342, +0x92010008, +0x41820000, +0x00050844, +0x00000000, +0x80110000, +0x00098200, +0x81110000, +0x00098200, +0x7c004040, +0x40800001, +0x0005084e, +0x7e439378, +0x7dc47378, +0x48000001, +0x0003000a, +0x38a00000, +0x00098200, +0x48000000, +0x00050049, +0x0006004f, +0x280b0008, +0x806e0000, +0x808e0004, +0x41800000, +0x00050844, +0x7eee592e, +0x2c030000, +0x00098200, +0x820efff8, +0x40820000, +0x00050844, +0x91d20000, +0x00098200, +0x7e439378, +0x91d20000, +0x00098200, +0x38ae0008, +0x92010008, +0x48000001, +0x0003000b, +0x28030000, +0x38a00000, +0x00098200, +0x41820000, +0x00050849, +0xc80e0008, +0x3a8efff8, +0xc82e0010, +0xd8140000, +0x39800000, +0x00098200, +0xd8340008, +0x48000000, +0x00050045, +0x00060050, +0x280b0008, +0x80ae0000, +0x806e0004, +0x41800000, +0x00050844, +0x2c050000, +0x00098200, +0x820efff8, +0x40820000, +0x00050844, +0x00000000, +0x81230000, +0x00098200, +0xc80a0000, +0x00098200, +0x28090000, +0x3a8efff8, +0x40820000, +0x00050844, +0x00000000, +0xc80a0000, +0x00098200, +0x3a8efff8, +0x00000000, +0x92ee0008, +0x39800000, +0x00098200, +0xd8140000, +0x48000000, +0x00050045, +0x00060051, +0x280b0010, +0x80ae0000, +0x806e0004, +0x80ce0008, +0xc84e0008, +0x41800000, +0x00050844, +0x2c050000, +0x00098200, +0x7c86b040, +0x820efff8, +0x3c003ff0, +0x9301000c, +0x40820000, +0x00050844, +0x90010008, +0x40840000, +0x00050844, +0xc8210008, +0xfc00101e, +0xd8010008, +0x8121000c, +0x80030000, +0x00098200, +0x81030000, +0x00098200, +0xfc42082a, +0x39290001, +0x3a8efff8, +0x7c004840, +0x55261800, +0x000900a1, +0xd8540000, +0x40810000, +0x00050802, +0x7d28302e, +0x7c0834ae, +0x0006000b, +0x2c090000, +0x00098200, +0x39800000, +0x00098200, +0x41820000, +0x00050845, +0x39800000, +0x00098200, +0xd8140008, +0x48000000, +0x00050045, +0x0006000c, +0x80030000, +0x00098200, +0x28000000, +0x39800000, +0x00098200, +0x41820000, +0x00050845, +0x7d244b78, +0x48000001, +0x0003000c, +0x00000000, +0x28030000, +0x39800000, +0x00098200, +0x41820000, +0x00050845, +0x81230000, +0xc8030000, +0x48000000, +0x0005000b, +0x00060052, +0x280b0008, +0x80ae0000, +0x806e0004, +0x41800000, +0x00050844, +0x2c050000, +0x00098200, +0x820efff8, +0x40820000, +0x00050844, +0x00000000, +0x81230000, +0x00098200, +0xc80a0000, +0x00098200, +0x28090000, +0x3a8efff8, +0x40820000, +0x00050844, +0x00000000, +0xc80a0000, +0x00098200, +0x3a8efff8, +0x00000000, +0x930e0008, +0x930e000c, +0x39800000, +0x00098200, +0xd8140000, +0x48000000, +0x00050045, +0x00060053, +0x280b0008, +0x88d10000, +0x00098200, +0x41800000, +0x00050844, +0x7dc97378, +0x39ce0008, +0x54c607fe, +0x000900ab, +0x396bfff8, +0x3a060000, +0x00098200, +0x48000000, +0x00050024, +0x00060054, +0x280b0010, +0x80ce0008, +0xc84e0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050844, +0x89110000, +0x00098200, +0x7dc97378, +0x2c060000, +0x00098200, +0x40820000, +0x00050844, +0x39ce0010, +0x550807fe, +0x000900ab, +0xd8490000, +0x396bfff0, +0xd8290008, +0x3a080000, +0x00098200, +0x48000000, +0x00050024, +0x00060055, +0x280b0008, +0x80ae0000, +0x806e0004, +0x41800000, +0x00050844, +0x2c050000, +0x00098200, +0x40820000, +0x00050844, +0x88030000, +0x00098200, +0x81030000, +0x00098200, +0x00000000, +0x80830000, +0x00098200, +0x28000000, +0x00090200, +0x81230000, +0x00098200, +0x28880000, +0x80030000, +0x00098200, +0x7f844840, +0x820efff8, +0x4f013342, +0x7d245a14, +0x4f3e1102, +0x7c890040, +0x4f18cb82, +0x92010008, +0x4f182b82, +0x91d20000, +0x00098200, +0x41980000, +0x00050844, +0x0006000b, +0x39ce0008, +0x396bfff8, +0x3929fff8, +0x91230000, +0x00098200, +0x39000000, +0x91d20000, +0x00098200, +0x0006000c, +0x7c085800, +0x7c0e44ae, +0x41820000, +0x00050803, +0x7c0445ae, +0x39080008, +0x48000000, +0x0005000c, +0x0006000d, +0x38a00000, +0x7c751b78, +0x38c00000, +0x48000001, +0x00050021, +0x0006000e, +0x81350000, +0x00098200, +0x28030000, +0x00090200, +0x80d50000, +0x00098200, +0x38000000, +0x00098200, +0x81d20000, +0x00098200, +0x90110000, +0x00098200, +0x41810000, +0x00050808, +0x00000000, +0x7d893050, +0x80120000, +0x00098200, +0x280c0000, +0x7d0e6214, +0x41820000, +0x00050806, +0x7c080040, +0x39000000, +0x41810000, +0x00050809, +0x38ccfff8, +0x91350000, +0x00098200, +0x0006000f, +0x7c083040, +0x7c0944ae, +0x7c0e45ae, +0x39080008, +0x40820000, +0x0005080f, +0x00060010, +0x72000000, +0x00090200, +0x39000000, +0x00098200, +0x3a8efff8, +0x910efff8, +0x398c0010, +0x00060011, +0x92010008, +0x7d936378, +0x41820000, +0x00050817, +0x48000000, +0x00050018, +0x00060012, +0x72000000, +0x00090200, +0x38c6fff8, +0x39000000, +0x00098200, +0xc8060000, +0x90d50000, +0x00098200, +0x39800000, +0x00098200, +0x910efff8, +0x3a8efff8, +0xd80e0000, +0x48000000, +0x00050011, +0x00060013, +0x7e439378, +0x558400fe, +0x000900ab, +0x48000001, +0x00030000, +0x38600000, +0x48000000, +0x0005000e, +0x00060056, +0x00000000, +0x806a0000, +0x00098200, +0x88030000, +0x00098200, +0x81030000, +0x00098200, +0x80830000, +0x00098200, +0x28000000, +0x00090200, +0x81230000, +0x00098200, +0x28880000, +0x80030000, +0x00098200, +0x7f844840, +0x820efff8, +0x4f013342, +0x7d245a14, +0x4f3e1102, +0x7c890040, +0x4f18cb82, +0x92010008, +0x4f182b82, +0x91d20000, +0x00098200, +0x41980000, +0x00050844, +0x0006000b, +0x91230000, +0x00098200, +0x39000000, +0x91d20000, +0x00098200, +0x0006000c, +0x7c085800, +0x7c0e44ae, +0x41820000, +0x00050803, +0x7c0445ae, +0x39080008, +0x48000000, +0x0005000c, +0x0006000d, +0x38a00000, +0x7c751b78, +0x38c00000, +0x48000001, +0x00050021, +0x0006000e, +0x81350000, +0x00098200, +0x28030000, +0x00090200, +0x80d50000, +0x00098200, +0x38000000, +0x00098200, +0x00000000, +0x81d20000, +0x00098200, +0x90110000, +0x00098200, +0x41810000, +0x00050808, +0x7d893050, +0x80120000, +0x00098200, +0x280c0000, +0x7d0e6214, +0x41820000, +0x00050806, +0x7c080040, +0x39000000, +0x41810000, +0x00050809, +0x38ccfff8, +0x91350000, +0x00098200, +0x0006000f, +0x7c083040, +0x7c0944ae, +0x7c0e45ae, +0x39080008, +0x40820000, +0x0005080f, +0x00060010, +0x72000000, +0x00090200, +0x7dd47378, +0x398c0008, +0x00060011, +0x92010008, +0x7d936378, +0x41820000, +0x00050817, +0x48000000, +0x00050018, +0x00060012, +0x7e439378, +0x7ea4ab78, +0x48000001, +0x0003000d, +0x00060013, +0x7e439378, +0x558400fe, +0x000900ab, +0x48000001, +0x00030000, +0x38600000, +0x48000000, +0x0005000e, +0x00060057, +0x80120000, +0x00098200, +0x00000000, +0x7d0e5a14, +0x91d20000, +0x00098200, +0x70000000, +0x00090200, +0x91120000, +0x00098200, +0x38600000, +0x00098200, +0x41820000, +0x00050844, +0x93120000, +0x00098200, +0x98720000, +0x00098200, +0x48000000, +0x0005001a, +0x00060058, +0x280b0008, +0x80ae0000, +0x806e0004, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0x54a5007e, +0x00060049, +0x820efff8, +0x90aefff8, +0x3a8efff8, +0x906efffc, +0x00060059, +0x39800000, +0x00098200, +0x00060045, +0x72000000, +0x00090200, +0x7d936378, +0x40820000, +0x00050818, +0x80f0fffc, +0x54ea5d78, +0x0006000f, +0x7c0a6040, +0x54e0dd78, +0x41810000, +0x00050806, +0x80f00000, +0x3a100004, +0x7dc0a050, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00060010, +0x390cfff8, +0x398c0008, +0x7ef4412e, +0x48000000, +0x0005000f, +0x0006005a, +0x00000000, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0x48000001, +0x0003000e, +0x48000000, +0x00050047, +0x0006005b, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0x48000001, +0x0003000f, +0x48000000, +0x00050047, +0x0006005c, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0x48000001, +0x00030010, +0x48000000, +0x00050047, +0x0006005d, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0x48000001, +0x00030011, +0x48000000, +0x00050047, +0x0006005e, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0x00000000, +0x48000001, +0x00030012, +0x48000000, +0x00050047, +0x0006005f, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0x48000001, +0x00030013, +0x48000000, +0x00050047, +0x00060060, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0x48000001, +0x00030014, +0x48000000, +0x00050047, +0x00060061, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0x48000001, +0x00030015, +0x48000000, +0x00050047, +0x00060062, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0x48000001, +0x00030016, +0x48000000, +0x00050047, +0x00060063, +0x00000000, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0x48000001, +0x00030017, +0x48000000, +0x00050047, +0x00060064, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0x48000001, +0x00030018, +0x48000000, +0x00050047, +0x00060065, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0x48000001, +0x00030019, +0x48000000, +0x00050047, +0x00060066, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0x48000001, +0x0003001a, +0x48000000, +0x00050047, +0x00060067, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0x00000000, +0x48000001, +0x0003001b, +0x48000000, +0x00050047, +0x00060068, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0x48000001, +0x0003001c, +0x48000000, +0x00050047, +0x00060069, +0x280b0010, +0x80ae0000, +0xc82e0000, +0x80ce0008, +0xc84e0008, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0x7c06b040, +0x40800000, +0x00050844, +0x48000001, +0x0003001d, +0x48000000, +0x00050047, +0x0006006a, +0x280b0010, +0x80ae0000, +0xc82e0000, +0x80ce0008, +0xc84e0008, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0x7c06b040, +0x40800000, +0x00050844, +0x48000001, +0x0003001e, +0x48000000, +0x00050047, +0x0006006b, +0x280b0010, +0x80ae0000, +0xc82e0000, +0x80ce0008, +0xc84e0008, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0x00000000, +0x7c06b040, +0x40800000, +0x00050844, +0x48000001, +0x0003001f, +0x48000000, +0x00050047, +0x0006006c, +0x0006006d, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0xc84a0000, +0x00098200, +0xfc2100b2, +0x48000000, +0x00050047, +0x0006006e, +0x280b0010, +0x80ae0000, +0xc82e0000, +0x80ce0008, +0xc84e0008, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0x7c06b040, +0x40800000, +0x00050844, +0xfc40101e, +0xd8410008, +0x8061000c, +0x48000001, +0x00030020, +0x48000000, +0x00050047, +0x0006006f, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0x38710000, +0x00098200, +0x820efff8, +0x48000001, +0x00030021, +0x81110000, +0x00098200, +0x3a8efff8, +0x6d088000, +0x91010024, +0xc8410020, +0xfc42f828, +0xd8340000, +0x39800000, +0x00098200, +0x00000000, +0xd8540008, +0x48000000, +0x00050045, +0x00060070, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0x386efff8, +0x820efff8, +0x48000001, +0x00030022, +0x3a8efff8, +0xd82e0000, +0x39800000, +0x00098200, +0x48000000, +0x00050045, +0x00060071, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0x39000008, +0x0006000b, +0x7c8e402e, +0x7c4e44ae, +0x7c885840, +0x7c04b040, +0x40840000, +0x00050847, +0x40800000, +0x00050844, +0xfc011028, +0x39080008, +0xfc2008ae, +0x48000000, +0x0005000b, +0x00060072, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0x39000008, +0x0006000b, +0x7c8e402e, +0x7c4e44ae, +0x7c885840, +0x7c04b040, +0x40840000, +0x00050847, +0x40800000, +0x00050844, +0xfc011028, +0x39080008, +0xfc20106e, +0x48000000, +0x0005000b, +0x00060073, +0x00000000, +0x280b0008, +0x80ae0000, +0x806e0004, +0x41800000, +0x00050844, +0x2c050000, +0x00098200, +0x40820000, +0x00050844, +0x80630000, +0x00098200, +0x48000000, +0x00050074, +0x00060075, +0x280b0008, +0x80ae0000, +0x806e0004, +0x40820000, +0x00050844, +0x2c050000, +0x00098200, +0x40820000, +0x00050844, +0x80030000, +0x00098200, +0x89030000, +0x00098200, +0x30c0ffff, +0x7d860110, +0x91010024, +0x398c0001, +0xc8010020, +0x3a8efff8, +0x820efff8, +0xfc00f028, +0x558c1800, +0x000900a1, +0xd8140000, +0x48000000, +0x00050045, +0x00060076, +0x80110000, +0x00098200, +0x81110000, +0x00098200, +0x7c004040, +0x40800001, +0x0005084e, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x40820000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0xfc20081e, +0xd8210008, +0x8001000c, +0x3881000f, +0x38a00001, +0x280000ff, +0x41810000, +0x00050844, +0x00060077, +0x7e439378, +0x91d20000, +0x00098200, +0x00000000, +0x92010008, +0x48000001, +0x00030023, +0x81d20000, +0x00098200, +0x38a00000, +0x00098200, +0x48000000, +0x00050049, +0x00060078, +0x80110000, +0x00098200, +0x81110000, +0x00098200, +0x7c004040, +0x40800001, +0x0005084e, +0x280b0010, +0x80ae0010, +0xc80e0010, +0x800e0000, +0x806e0004, +0x41800000, +0x00050844, +0x808e0008, +0xc82e0008, +0x3920ffff, +0x41820000, +0x00050801, +0x7c05b040, +0x40800000, +0x00050844, +0xfc00001e, +0xd8010008, +0x8121000c, +0x0006000b, +0x7c04b040, +0x40800000, +0x00050844, +0x2c000000, +0x00098200, +0x40820000, +0x00050844, +0xfc20081e, +0xd8210008, +0x8101000c, +0x80030000, +0x00098200, +0x7c004840, +0x38c90001, +0x41800000, +0x00050805, +0x0006000c, +0x2c080000, +0x7cc80214, +0x40810000, +0x00050807, +0x0006000d, +0x7ca84850, +0x38830000, +0x00098200, +0x7ca0fe70, +0x38a50001, +0x7c844214, +0x7ca50078, +0x48000000, +0x00050077, +0x0006000f, +0x00000000, +0x7c890050, +0x7c84fe70, +0x7cc62078, +0x7d203214, +0x48000000, +0x0005000c, +0x00060011, +0x30a8ffff, +0x7ca52910, +0x7cc4fe70, +0x7cc62878, +0x7cc82078, +0x39080001, +0x48000000, +0x0005000d, +0x00060079, +0x80110000, +0x00098200, +0x81110000, +0x00098200, +0x7c004040, +0x40800001, +0x0005084e, +0x280b0010, +0x80ae0000, +0x806e0004, +0x80ce0008, +0xc84e0008, +0x41800000, +0x00050844, +0x2c050000, +0x00098200, +0x40820000, +0x00050844, +0x7c06b040, +0x40800000, +0x00050844, +0xfc40101e, +0xd8410008, +0x80a1000c, +0x80030000, +0x00098200, +0x2c050000, +0x81110000, +0x00098200, +0x40810000, +0x00050802, +0x28000001, +0x3925ffff, +0x41800000, +0x00050802, +0x7c882840, +0x40820000, +0x00050844, +0x88030000, +0x00098200, +0x80910000, +0x00098200, +0x41840000, +0x00050844, +0x0006000b, +0x28090000, +0x7c0449ae, +0x3929ffff, +0x40820000, +0x0005080b, +0x48000000, +0x00050077, +0x0006000c, +0x00000000, +0x38710000, +0x00098200, +0x38a00000, +0x00098200, +0x48000000, +0x00050049, +0x0006007a, +0x80110000, +0x00098200, +0x81110000, +0x00098200, +0x7c004040, +0x40800001, +0x0005084e, +0x280b0008, +0x80ae0000, +0x806e0004, +0x41800000, +0x00050844, +0x2c050000, +0x00098200, +0x81110000, +0x00098200, +0x40820000, +0x00050844, +0x80a30000, +0x00098200, +0x38630000, +0x00098200, +0x80910000, +0x00098200, +0x39200000, +0x7c082840, +0x38c5ffff, +0x41800000, +0x00050844, +0x0006000b, +0x2c060000, +0x7d0348ae, +0x41800000, +0x00050877, +0x7d0431ae, +0x38c6ffff, +0x39290001, +0x48000000, +0x0005000b, +0x0006007b, +0x80110000, +0x00098200, +0x81110000, +0x00098200, +0x7c004040, +0x40800001, +0x0005084e, +0x00000000, +0x280b0008, +0x80ae0000, +0x806e0004, +0x41800000, +0x00050844, +0x2c050000, +0x00098200, +0x81110000, +0x00098200, +0x40820000, +0x00050844, +0x80a30000, +0x00098200, +0x38630000, +0x00098200, +0x80910000, +0x00098200, +0x7c082840, +0x39200000, +0x41800000, +0x00050844, +0x0006000b, +0x7c092840, +0x7d0348ae, +0x40800000, +0x00050877, +0x3808ffbf, +0x69060020, +0x3000ffe6, +0x7cc63110, +0x70c60020, +0x7d083278, +0x7d0449ae, +0x39290001, +0x48000000, +0x0005000b, +0x0006007c, +0x80110000, +0x00098200, +0x81110000, +0x00098200, +0x7c004040, +0x40800001, +0x0005084e, +0x280b0008, +0x80ae0000, +0x806e0004, +0x41800000, +0x00050844, +0x2c050000, +0x00098200, +0x81110000, +0x00098200, +0x40820000, +0x00050844, +0x80a30000, +0x00098200, +0x38630000, +0x00098200, +0x80910000, +0x00098200, +0x00000000, +0x7c082840, +0x39200000, +0x41800000, +0x00050844, +0x0006000b, +0x7c092840, +0x7d0348ae, +0x40800000, +0x00050877, +0x3808ff9f, +0x69060020, +0x3000ffe6, +0x7cc63110, +0x70c60020, +0x7d083278, +0x7d0449ae, +0x39290001, +0x48000000, +0x0005000b, +0x0006007d, +0x280b0008, +0x80ae0000, +0x806e0004, +0x41800000, +0x00050844, +0x2c050000, +0x00098200, +0x40820000, +0x00050844, +0x48000001, +0x00030024, +0x48000000, +0x00050074, +0x0006007e, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0xfc21f02a, +0xd8210008, +0x8061000c, +0x00060074, +0x6c638000, +0x90610024, +0xc8210020, +0xfc21f828, +0x00060047, +0x820efff8, +0x3a8efff8, +0xd82efff8, +0x48000000, +0x00050059, +0x0006007f, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0xfc21f02a, +0xd8210008, +0x8061000c, +0x39000008, +0x0006000b, +0x7cce402e, +0x7c885840, +0x7c2e44ae, +0x7c06b040, +0x40840000, +0x00050874, +0xfc21f02a, +0x40800000, +0x00050844, +0x00000000, +0xd8210008, +0x8081000c, +0x7c632038, +0x39080008, +0x48000000, +0x0005000b, +0x00060080, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0xfc21f02a, +0xd8210008, +0x8061000c, +0x39000008, +0x0006000b, +0x7cce402e, +0x7c885840, +0x7c2e44ae, +0x7c06b040, +0x40840000, +0x00050874, +0xfc21f02a, +0x40800000, +0x00050844, +0xd8210008, +0x8081000c, +0x7c632378, +0x39080008, +0x48000000, +0x0005000b, +0x00060081, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0xfc21f02a, +0xd8210008, +0x8061000c, +0x39000008, +0x0006000b, +0x7cce402e, +0x7c885840, +0x7c2e44ae, +0x7c06b040, +0x40840000, +0x00050874, +0xfc21f02a, +0x40800000, +0x00050844, +0xd8210008, +0x8081000c, +0x7c632278, +0x39080008, +0x48000000, +0x0005000b, +0x00060082, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0xfc21f02a, +0xd8210008, +0x8061000c, +0x5460403e, +0x5060c00e, +0x5060c42e, +0x7c030378, +0x48000000, +0x00050074, +0x00060083, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0x00000000, +0xfc21f02a, +0xd8210008, +0x8061000c, +0x7c6318f8, +0x48000000, +0x00050074, +0x00060084, +0x280b0010, +0x80ae0000, +0xc82e0000, +0x80ce0008, +0xc84e0008, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0x7c06b040, +0x40800000, +0x00050844, +0xfc21f02a, +0xfc42f02a, +0xd8210008, +0x8061000c, +0xd8410008, +0x8081000c, +0x548406fe, +0x7c632030, +0x48000000, +0x00050074, +0x00060085, +0x280b0010, +0x80ae0000, +0xc82e0000, +0x80ce0008, +0xc84e0008, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0x7c06b040, +0x40800000, +0x00050844, +0xfc21f02a, +0xfc42f02a, +0xd8210008, +0x8061000c, +0xd8410008, +0x8081000c, +0x548406fe, +0x7c632430, +0x48000000, +0x00050074, +0x00060086, +0x280b0010, +0x80ae0000, +0xc82e0000, +0x80ce0008, +0xc84e0008, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0x7c06b040, +0x40800000, +0x00050844, +0xfc21f02a, +0xfc42f02a, +0xd8210008, +0x8061000c, +0xd8410008, +0x8081000c, +0x548406fe, +0x7c632630, +0x48000000, +0x00050074, +0x00060087, +0x280b0010, +0x80ae0000, +0xc82e0000, +0x80ce0008, +0xc84e0008, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0x7c06b040, +0x40800000, +0x00050844, +0xfc21f02a, +0xfc42f02a, +0xd8210008, +0x8061000c, +0xd8410008, +0x8081000c, +0x5c63203e, +0x48000000, +0x00050074, +0x00060088, +0x00000000, +0x280b0010, +0x80ae0000, +0xc82e0000, +0x80ce0008, +0xc84e0008, +0x41800000, +0x00050844, +0x7c05b040, +0x40800000, +0x00050844, +0x7c06b040, +0x40800000, +0x00050844, +0xfc21f02a, +0xfc42f02a, +0xd8210008, +0x8061000c, +0xd8410008, +0x8081000c, +0x7c8400d0, +0x5c63203e, +0x48000000, +0x00050074, +0x00060044, +0x80ca0000, +0x00098200, +0x7d0e5a14, +0x820efff8, +0x38080000, +0x00098200, +0x81320000, +0x00098200, +0x92010008, +0x7c004840, +0x91d20000, +0x00098200, +0x91120000, +0x00098200, +0x7e439378, +0x41810000, +0x00050805, +0x7cc903a6, +0x4e800421, +0x81d20000, +0x00098200, +0x2c030000, +0x546c1800, +0x000900a1, +0x3a8efff8, +0x41810000, +0x00050845, +0x0006000b, +0x80120000, +0x00098200, +0x814efffc, +0x7d6e0050, +0x40820000, +0x00050828, +0x820a0000, +0x00098200, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54f4dd78, +0x7c11402e, +0x7e947214, +0x7c0903a6, +0x4e800420, +0x00060028, +0x72000000, +0x00090200, +0x56080038, +0x40820000, +0x00050803, +0x80f0fffc, +0x54e8dd78, +0x0006000d, +0x00000000, +0x7d287050, +0x48000000, +0x00050024, +0x0006000f, +0x38800000, +0x00098200, +0x48000001, +0x00030000, +0x81d20000, +0x00098200, +0x7c000000, +0x48000000, +0x0005000b, +0x0006004e, +0x7ea802a6, +0x91d20000, +0x00098200, +0x7c0e5a14, +0x92010008, +0x90120000, +0x00098200, +0x7e439378, +0x48000001, +0x00030025, +0x81d20000, +0x00098200, +0x7ea803a6, +0x80120000, +0x00098200, +0x7d6e0050, +0x814efffc, +0x4e800020, +0x00060089, +0x00000000, +0x7c810808, +0x00000000, +0x0006008a, +0x88d10000, +0x00098200, +0x70c00000, +0x00090200, +0x41820000, +0x00050801, +0x0006000f, +0x39080000, +0x00098200, +0x7c11402e, +0x7c0903a6, +0x4e800420, +0x0006008b, +0x88d10000, +0x00098200, +0x81310000, +0x00098200, +0x70c00000, +0x00090200, +0x54c007c0, +0x000900ab, +0x40820000, +0x0005080f, +0x2c800000, +0x3529ffff, +0x41860000, +0x0005080f, +0x91310000, +0x00098200, +0x41820000, +0x00050801, +0x40840000, +0x0005080f, +0x0006000b, +0x7e439378, +0x9261000c, +0x7e048378, +0x91d20000, +0x00098200, +0x48000001, +0x00030026, +0x0006000d, +0x81d20000, +0x00098200, +0x0006000e, +0x00000000, +0x80f0fffc, +0x54e815ba, +0x54ea5d78, +0x39080000, +0x00098200, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x0006008c, +0x3a100004, +0x826affec, +0x48000000, +0x0005000e, +0x0006008d, +0x00000000, +0x7c810808, +0x00000000, +0x0006008e, +0x7e048378, +0x00000000, +0x48000000, +0x00050001, +0x00000000, +0x0006008f, +0x00000000, +0x62040001, +0x0006000b, +0x00000000, +0x7c0e5a14, +0x92010008, +0x7e439378, +0x91d20000, +0x00098200, +0x7e8ea050, +0x90120000, +0x00098200, +0x48000001, +0x00030027, +0x81d20000, +0x00098200, +0x80120000, +0x00098200, +0x93010008, +0x7d6e0050, +0x7e8ea214, +0x814efffc, +0x7c6903a6, +0x4e800420, +0x00060090, +0x00000000, +0x7c810808, +0x00000000, +0x00060091, +0x00000000, +0x7c810808, +0x00000000, +0x00060092, +0x48000000, +0x0003000e, +0x00060093, +0x48000000, +0x0003000f, +0x00060094, +0x00000000, +0x48000000, +0x00030028, +0x00000000, +0x00060095, +0x00000000, +0x7c810808, +0x00000000, +0x00060096, +0x00000000, +0x7c810808, +0x00000000, +0x00060097, +0x28030001, +0x41820000, +0x00050801, +0x41810000, +0x00050802, +0xfc21102a, +0x4e800020, +0x0006000b, +0xfc211028, +0x4e800020, +0x0006000c, +0x28030003, +0x41820000, +0x00050801, +0x41810000, +0x00050802, +0xfc2100b2, +0x4e800020, +0x0006000b, +0xfc211024, +0x4e800020, +0x0006000c, +0x28030005, +0x41820000, +0x00050801, +0x41810000, +0x00050802, +0x9421ffe0, +0xd9c10010, +0xd9e10018, +0x7c0802a6, +0xfdc00890, +0xfc211024, +0x90010024, +0xfde01090, +0x48000001, +0x0003000e, +0x80010024, +0xfc2103f2, +0x7c0803a6, +0xfc2e0828, +0xc9c10010, +0xc9e10018, +0x38210020, +0x4e800020, +0x0006000b, +0x48000000, +0x0003001d, +0x0006000c, +0x28030007, +0x41820000, +0x00050801, +0x41810000, +0x00050802, +0xfc200850, +0x4e800020, +0x0006000b, +0xfc200a10, +0x4e800020, +0x0006000c, +0x7c810808, +0x00060098, +0x00000000, +0x7c810808, +0x00000000, +0x00080000, +0x00000000, +0x7c0ea02e, +0x3a100004, +0x7c0ea4ae, +0x7d0e602e, +0x7c00b040, +0x8130fffc, +0x7c2e64ae, +0x7c88b040, +0x552993ba, +0x40800000, +0x00050834, +0x3d290000, +0x00098200, +0x40840000, +0x00050834, +0xfc000800, +0x00000000, +0x40800000, +0x00050801, +0x00000000, +0x41800000, +0x00050801, +0x00000000, +0x4c001382, +0x40800000, +0x00050801, +0x00000000, +0x4c001382, +0x41800000, +0x00050801, +0x00000000, +0x7e104a14, +0x0006000b, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x7c14706e, +0x81300000, +0xc8140000, +0x3a100004, +0x7d0c706e, +0x7c00b040, +0x552993ba, +0xc82c0000, +0x7c88b040, +0x3d290000, +0x00098200, +0x40800000, +0x00050805, +0x40840000, +0x00050805, +0xfc000800, +0x00000000, +0x40820000, +0x00050801, +0x7e104a14, +0x00000000, +0x41820000, +0x00050801, +0x7e104a14, +0x00000000, +0x0006000b, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x0006000f, +0x80940004, +0x80ac0004, +0x7c0600f8, +0x7c004040, +0x28860000, +0x00090200, +0x2b060000, +0x00090200, +0x7e842840, +0x4c222902, +0x4c161342, +0x4c42b202, +0x7e158378, +0x4c420b82, +0x4c000b82, +0x00000000, +0x40820000, +0x00050806, +0x7e104a14, +0x00060010, +0x00000000, +0x41820000, +0x00050806, +0x7e104a14, +0x00060010, +0x00000000, +0x41800000, +0x0005080b, +0x41980000, +0x0005080b, +0x81240000, +0x00098200, +0x38c00000, +0x00098200, +0x28090000, +0x41820000, +0x0005080b, +0x89290000, +0x00098200, +0x71290000, +0x00090200, +0x40820000, +0x0005080b, +0x7eb0ab78, +0x48000000, +0x00050039, +0x00000000, +0x7c14706e, +0x558c007e, +0x000900ab, +0x80d40004, +0x80f00000, +0x218cfffc, +0x3a100004, +0x7d0f602e, +0x20000000, +0x00098200, +0x7d064050, +0x7c004378, +0x54e993ba, +0x20000000, +0x3d290000, +0x00098200, +0x7d084110, +0x00000000, +0x7d294078, +0x00000000, +0x7d294038, +0x00000000, +0x7e104a14, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x7c0ea02e, +0x7c0ea4ae, +0x3a100004, +0x7c2f64ae, +0x80f0fffc, +0x7c00b040, +0x40800000, +0x00050805, +0xfc000800, +0x54e993ba, +0x3d290000, +0x00098200, +0x00000000, +0x40820000, +0x00050805, +0x7e104a14, +0x0006000f, +0x00000000, +0x41820000, +0x00050802, +0x0006000b, +0x7e104a14, +0x0006000c, +0x00000000, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x0006000f, +0x54e993ba, +0x3d290000, +0x00098200, +0x48000000, +0x0005000b, +0x00000000, +0x7c0ea02e, +0x558800fe, +0x000900ab, +0x80f00000, +0x7d0840f8, +0x3a100004, +0x7c080050, +0x54e993ba, +0x3000ffff, +0x3d290000, +0x00098200, +0x7d084110, +0x00000000, +0x7d294038, +0x00000000, +0x7d294078, +0x00000000, +0x7e104a14, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x7c0e602e, +0x80f00000, +0x3a100004, +0x00000000, +0x20000000, +0x00098200, +0x54e993ba, +0x7d084110, +0x3d290000, +0x00098200, +0x00000000, +0x7d294078, +0x00000000, +0x7d294038, +0x00000000, +0x7e104a14, +0x00000000, +0x39000000, +0x00098200, +0x7c0e64ae, +0x7c004040, +0x00000000, +0x40800000, +0x00050801, +0x00000000, +0x41800000, +0x00050801, +0x00000000, +0x3e100000, +0x00098200, +0x54e993ba, +0x7c0ea5ae, +0x7e104a14, +0x0006000b, +0x00000000, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x80f00000, +0x3a100004, +0x7c0e64ae, +0x7c0ea5ae, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x80f00000, +0x3a100004, +0x7c0e602e, +0x21000000, +0x00098200, +0x7c004114, +0x7c0ea12e, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x7d0c706e, +0x800c0004, +0x7c08b040, +0x40800000, +0x0005083c, +0x6d088000, +0x80f00000, +0x3a100004, +0x7d14716e, +0x90140004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x7c0c706e, +0x806c0004, +0x2c000000, +0x00098200, +0x40820000, +0x00050802, +0x80630000, +0x00098200, +0x0006000b, +0x90610024, +0xc8010020, +0xfc00f028, +0x80f00000, +0x3a100004, +0x7c0ea5ae, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x0006000c, +0x2c000000, +0x00098200, +0x40820000, +0x0005083e, +0x00000000, +0x81230000, +0x00098200, +0x28090000, +0x40820000, +0x00050809, +0x0006000d, +0x00000000, +0x0006003f, +0x48000001, +0x00030024, +0x48000000, +0x0005000b, +0x00000000, +0x00060013, +0x88090000, +0x00098200, +0x70000000, +0x00090200, +0x40820000, +0x0005080d, +0x48000000, +0x0005003e, +0x00000000, +0x7c6e502e, +0x7c0e54ae, +0x7c2f5cae, +0x7c03b040, +0x40800000, +0x0005083a, +0x00000000, +0x7c6e502e, +0x7c2e54ae, +0x7c0f5cae, +0x7c03b040, +0x40800000, +0x0005083b, +0x00000000, +0x7c6e502e, +0x7c8e582e, +0x7c0e54ae, +0x7c2e5cae, +0x7c03b040, +0x7c84b040, +0x4c002202, +0x40800000, +0x0005083d, +0x00000000, +0x80f00000, +0x3a100004, +0xfc00082a, +0x7c0ea5ae, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x7c6e502e, +0x7c0e54ae, +0x7c2f5cae, +0x7c03b040, +0x40800000, +0x0005083a, +0x00000000, +0x7c6e502e, +0x7c2e54ae, +0x7c0f5cae, +0x7c03b040, +0x40800000, +0x0005083b, +0x00000000, +0x7c6e502e, +0x7c8e582e, +0x7c0e54ae, +0x7c2e5cae, +0x7c03b040, +0x7c84b040, +0x4c002202, +0x40800000, +0x0005083d, +0x00000000, +0x80f00000, +0x3a100004, +0xfc000828, +0x7c0ea5ae, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x7c6e502e, +0x7c0e54ae, +0x7c2f5cae, +0x7c03b040, +0x40800000, +0x0005083a, +0x00000000, +0x7c6e502e, +0x7c2e54ae, +0x7c0f5cae, +0x7c03b040, +0x40800000, +0x0005083b, +0x00000000, +0x7c6e502e, +0x7c8e582e, +0x7c0e54ae, +0x7c2e5cae, +0x7c03b040, +0x7c84b040, +0x4c002202, +0x40800000, +0x0005083d, +0x00000000, +0x80f00000, +0x3a100004, +0xfc000072, +0x7c0ea5ae, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x7c6e502e, +0x7c0e54ae, +0x7c2f5cae, +0x7c03b040, +0x40800000, +0x0005083a, +0x00000000, +0x7c6e502e, +0x7c2e54ae, +0x7c0f5cae, +0x7c03b040, +0x40800000, +0x0005083b, +0x00000000, +0x7c6e502e, +0x7c8e582e, +0x7c0e54ae, +0x7c2e5cae, +0x7c03b040, +0x7c84b040, +0x4c002202, +0x40800000, +0x0005083d, +0x00000000, +0x80f00000, +0x3a100004, +0xfc000824, +0x7c0ea5ae, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x7c6e502e, +0x7dce54ae, +0x7def5cae, +0x7c03b040, +0x40800000, +0x0005083a, +0x00000000, +0x7c6e502e, +0x7dee54ae, +0x7dcf5cae, +0x7c03b040, +0x40800000, +0x0005083b, +0x00000000, +0x7c6e502e, +0x7c8e582e, +0x7dce54ae, +0x7dee5cae, +0x7c03b040, +0x7c84b040, +0x4c002202, +0x40800000, +0x0005083d, +0x00000000, +0x00060099, +0xfc2e7824, +0x48000001, +0x0003000e, +0xfc0103f2, +0x80f00000, +0x3a100004, +0xfc0e0028, +0x7c0ea5ae, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x7c6e502e, +0x7dce54ae, +0x7def5cae, +0x7c03b040, +0x40800000, +0x0005083a, +0x00000000, +0x7c6e502e, +0x7dee54ae, +0x7dcf5cae, +0x7c03b040, +0x40800000, +0x0005083b, +0x00000000, +0x7c6e502e, +0x7c8e582e, +0x7dce54ae, +0x7dee5cae, +0x7c03b040, +0x7c84b040, +0x4c002202, +0x40800000, +0x0005083d, +0x00000000, +0x48000000, +0x00050099, +0x00000000, +0x7c6e502e, +0x7c2e54ae, +0x7c8e582e, +0x7c4e5cae, +0x7c03b040, +0x7c84b040, +0x4c002202, +0x40800000, +0x0005083d, +0x48000001, +0x0003001d, +0x7c2ea5ae, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x7caa5850, +0x91d20000, +0x00098200, +0x7c8e5a14, +0x7d555378, +0x0006002a, +0x92010008, +0x7e439378, +0x54a500fe, +0x000900ab, +0x48000001, +0x00030029, +0x28030000, +0x81d20000, +0x00098200, +0x40820000, +0x00050835, +0x7c0eacae, +0x7c0ea5ae, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x5588007e, +0x000900ab, +0x2108fffc, +0x7c0f402e, +0x39200000, +0x00098200, +0x80f00000, +0x3a100004, +0x7d34716e, +0x90140004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x5588007e, +0x000900ab, +0x2108fffc, +0x7c0f402e, +0x39200000, +0x00098200, +0x80f00000, +0x3a100004, +0x7d34716e, +0x90140004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x558c6800, +0x000900a1, +0x7d8c8670, +0x6d8c8000, +0x91810024, +0xc8010020, +0xfc00f828, +0x80f00000, +0x3a100004, +0x7c0ea5ae, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x7c0f64ae, +0x80f00000, +0x3a100004, +0x7c0ea5ae, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x558800fe, +0x000900ab, +0x7d0040f8, +0x80f00000, +0x3a100004, +0x7c0ea12e, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x7eeea12e, +0x3a940008, +0x0006000b, +0x7eeea12e, +0x7c146000, +0x3a940008, +0x41800000, +0x0005080b, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x80f00000, +0x3a100004, +0x814efffc, +0x558c007e, +0x000900ab, +0x398c0000, +0x00098200, +0x7d4a602e, +0x810a0000, +0x00098200, +0xc8080000, +0x7c0ea5ae, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x814efffc, +0x5694007e, +0x000900ab, +0x3a940000, +0x00098200, +0x7c0c74ee, +0x7d4aa02e, +0x88ca0000, +0x00098200, +0x808a0000, +0x00098200, +0x70c60000, +0x00090200, +0x880a0000, +0x00098200, +0x812c0000, +0xd8040000, +0x28800000, +0x810c0004, +0x4c423382, +0x39290000, +0x00098200, +0x40820000, +0x00050802, +0x0006000b, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x0006000c, +0x28090000, +0x00090200, +0x40800000, +0x0005080b, +0x88c80000, +0x00098200, +0x70c60000, +0x00090200, +0x38710000, +0x00098200, +0x41820000, +0x0005080b, +0x48000001, +0x0003002a, +0x48000000, +0x0005000b, +0x00000000, +0x80f00000, +0x3a100004, +0x814efffc, +0x5588007e, +0x000900ab, +0x5694007e, +0x000900ab, +0x2108fffc, +0x3a940000, +0x00098200, +0x7d0f402e, +0x7d4aa02e, +0x88ca0000, +0x00098200, +0x808a0000, +0x00098200, +0x70c60000, +0x00090200, +0x88c80000, +0x00098200, +0x892a0000, +0x00098200, +0x38000000, +0x00098200, +0x91040004, +0x90040000, +0x40820000, +0x00050802, +0x0006000b, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x0006000c, +0x70c60000, +0x00090200, +0x28890000, +0x4c423382, +0x38710000, +0x00098200, +0x41820000, +0x0005080b, +0x48000001, +0x0003002a, +0x48000000, +0x0005000b, +0x00000000, +0x80f00000, +0x3a100004, +0x814efffc, +0x5694007e, +0x000900ab, +0x3a940000, +0x00098200, +0x7c0f64ae, +0x7d4aa02e, +0x810a0000, +0x00098200, +0xd8080000, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x80f00000, +0x3a100004, +0x814efffc, +0x5694007e, +0x000900ab, +0x3a940000, +0x00098200, +0x558000fe, +0x000900ab, +0x7d4aa02e, +0x7c0000f8, +0x810a0000, +0x00098200, +0x90080000, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x81120000, +0x00098200, +0x5580007e, +0x000900ab, +0x7e100214, +0x3e100000, +0x00098200, +0x91d20000, +0x00098200, +0x28080000, +0x7e439378, +0x41820000, +0x00050801, +0x7c8ea214, +0x48000001, +0x0003002b, +0x81d20000, +0x00098200, +0x0006000b, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x5588007e, +0x000900ab, +0x91d20000, +0x00098200, +0x2108fffc, +0x92010008, +0x7c8f402e, +0x7e439378, +0x80aefffc, +0x48000001, +0x0003002c, +0x81d20000, +0x00098200, +0x38000000, +0x00098200, +0x7c14716e, +0x90740004, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x80110000, +0x00098200, +0x7e439378, +0x81110000, +0x00098200, +0x91d20000, +0x00098200, +0x7c004040, +0x92010008, +0x40800000, +0x00050805, +0x0006000b, +0x00000000, +0x5584ed7e, +0x558596fe, +0x2c0407ff, +0x41820000, +0x00050803, +0x0006000c, +0x48000001, +0x0003002d, +0x00000000, +0x5588007e, +0x000900ab, +0x2108fffc, +0x7c8f402e, +0x48000001, +0x0003002e, +0x00000000, +0x81d20000, +0x00098200, +0x38000000, +0x00098200, +0x7c14716e, +0x90740004, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x0006000d, +0x38800801, +0x48000000, +0x0005000c, +0x00000000, +0x0006000f, +0x7d956378, +0x48000001, +0x0003002f, +0x7eacab78, +0x7e439378, +0x48000000, +0x0005000b, +0x00000000, +0x812efffc, +0x5588007e, +0x000900ab, +0x81490000, +0x00098200, +0x2108fffc, +0x7d6f402e, +0x00000000, +0x48000000, +0x0005009a, +0x00000000, +0x48000000, +0x0005009b, +0x00000000, +0x7c6a706e, +0x7c8b706e, +0x814a0004, +0xc80b0000, +0x2c030000, +0x00098200, +0x7c84b040, +0x40820000, +0x0005082f, +0x40840000, +0x00050805, +0xfc20001e, +0xfc40f02a, +0xd8210008, +0x800a0000, +0x00098200, +0xfc42f028, +0x8121000c, +0x810a0000, +0x00098200, +0xfc801000, +0x7c004840, +0x4c213202, +0x55291800, +0x000900a1, +0x40810000, +0x0005082f, +0x7c08482e, +0x7dc84cae, +0x2c000000, +0x00098200, +0x41820000, +0x00050802, +0x0006000b, +0x80f00000, +0x3a100004, +0x7dcea5ae, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x0006000c, +0x812a0000, +0x00098200, +0x28090000, +0x41820000, +0x0005080b, +0x88090000, +0x00098200, +0x70000000, +0x00090200, +0x40820000, +0x0005080b, +0x48000000, +0x0005002f, +0x0006000f, +0x2c040000, +0x00098200, +0x40820000, +0x0005082f, +0x816b0004, +0x48000000, +0x0005009a, +0x00000000, +0x7c6a706e, +0x5568007e, +0x000900ab, +0x814a0004, +0x2108fffc, +0x2c030000, +0x00098200, +0x7d6f402e, +0x40820000, +0x0005082c, +0x0006009a, +0x800a0000, +0x00098200, +0x810b0000, +0x00098200, +0x812a0000, +0x00098200, +0x7d080038, +0x55002800, +0x000900a1, +0x55081800, +0x000900a1, +0x7d080050, +0x7d294214, +0x0006000b, +0x80690000, +0x00098200, +0x80090000, +0x00098200, +0x80890000, +0x00098200, +0x81090000, +0x00098200, +0x2c030000, +0x00098200, +0x40820000, +0x00050804, +0x7c005800, +0x40820000, +0x00050804, +0x2c040000, +0x00098200, +0x41820000, +0x00050805, +0x0006000d, +0x7c94716e, +0x91140004, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x0006000e, +0x81290000, +0x00098200, +0x00000000, +0x28090000, +0x40820000, +0x0005080b, +0x38800000, +0x00098200, +0x0006000f, +0x812a0000, +0x00098200, +0x28090000, +0x41820000, +0x0005080d, +0x88090000, +0x00098200, +0x70000000, +0x00090200, +0x40820000, +0x0005080d, +0x48000000, +0x0005002d, +0x00000000, +0x7c6a706e, +0x814a0004, +0x556000fe, +0x000900ab, +0x2c030000, +0x00098200, +0x40820000, +0x0005082e, +0x810a0000, +0x00098200, +0x812a0000, +0x00098200, +0x7c004040, +0x40800000, +0x0005082e, +0x7d09582e, +0x7c095cae, +0x2c080000, +0x00098200, +0x41820000, +0x00050805, +0x0006000b, +0x80f00000, +0x3a100004, +0x7c0ea5ae, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x0006000f, +0x812a0000, +0x00098200, +0x28090000, +0x41820000, +0x0005080b, +0x89290000, +0x00098200, +0x71290000, +0x00090200, +0x40820000, +0x0005080b, +0x48000000, +0x0005002e, +0x00000000, +0x7c6a706e, +0x7c8b706e, +0x814a0004, +0xc80b0000, +0x2c030000, +0x00098200, +0x7c84b040, +0x40820000, +0x00050833, +0x40840000, +0x00050805, +0xfc20001e, +0xfc40f02a, +0xd8210008, +0x800a0000, +0x00098200, +0xfc42f028, +0x8121000c, +0x810a0000, +0x00098200, +0xfc801000, +0x7c004840, +0x4c213202, +0x55201800, +0x000900a1, +0x40810000, +0x00050833, +0x7d28002e, +0x88ca0000, +0x00098200, +0x7dcea4ae, +0x2c090000, +0x00098200, +0x41820000, +0x00050803, +0x0006000b, +0x70c90000, +0x00090200, +0x7dc805ae, +0x40820000, +0x00050807, +0x0006000c, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x0006000d, +0x812a0000, +0x00098200, +0x28090000, +0x41820000, +0x0005080b, +0x89290000, +0x00098200, +0x71290000, +0x00090200, +0x40820000, +0x0005080b, +0x48000000, +0x00050033, +0x0006000f, +0x00000000, +0x2c040000, +0x00098200, +0x40820000, +0x00050833, +0x816b0004, +0x48000000, +0x0005009b, +0x00060011, +0x80110000, +0x00098200, +0x54c607b8, +0x91510000, +0x00098200, +0x98ca0000, +0x00098200, +0x900a0000, +0x00098200, +0x48000000, +0x0005000c, +0x00000000, +0x0006000b, +0x2c030000, +0x00098200, +0x40820000, +0x00050804, +0x7c005800, +0x40820000, +0x00050804, +0x2c040000, +0x00098200, +0x41820000, +0x00050805, +0x0006000d, +0x7c94716e, +0x91140004, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x7c6a706e, +0x5568007e, +0x000900ab, +0x814a0004, +0x2108fffc, +0x2c030000, +0x00098200, +0x7d6f402e, +0x40820000, +0x00050830, +0x0006009b, +0x800a0000, +0x00098200, +0x810b0000, +0x00098200, +0x812a0000, +0x00098200, +0x9b0a0000, +0x00098200, +0x7d080038, +0x7dcea4ae, +0x55002800, +0x000900a1, +0x55081800, +0x000900a1, +0x7d080050, +0x88ca0000, +0x00098200, +0x7d294214, +0x0006000b, +0x80690000, +0x00098200, +0x80090000, +0x00098200, +0x80890000, +0x00098200, +0x81090000, +0x00098200, +0x2c030000, +0x00098200, +0x40820000, +0x00050805, +0x7c005800, +0x40820000, +0x00050805, +0x2c040000, +0x00098200, +0x41820000, +0x00050804, +0x0006000c, +0x00000000, +0x70c00000, +0x00090200, +0xd9c90000, +0x00098200, +0x40820000, +0x00050807, +0x0006000d, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x0006000e, +0x810a0000, +0x00098200, +0x28080000, +0x41820000, +0x0005080c, +0x88080000, +0x00098200, +0x70000000, +0x00090200, +0x40820000, +0x0005080c, +0x48000000, +0x00050031, +0x0006000f, +0x81290000, +0x00098200, +0x28090000, +0x40820000, +0x0005080b, +0x810a0000, +0x00098200, +0x38b10000, +0x00098200, +0x92010008, +0x7e439378, +0x28080000, +0x91d20000, +0x00098200, +0x41820000, +0x00050806, +0x88080000, +0x00098200, +0x70000000, +0x00090200, +0x41820000, +0x00050831, +0x00060010, +0x00000000, +0x38000000, +0x00098200, +0x91650004, +0x7d445378, +0x90050000, +0x48000001, +0x00030030, +0x81d20000, +0x00098200, +0xd9c30000, +0x48000000, +0x0005000d, +0x00060011, +0x80110000, +0x00098200, +0x54c607b8, +0x91510000, +0x00098200, +0x98ca0000, +0x00098200, +0x900a0000, +0x00098200, +0x48000000, +0x0005000d, +0x00000000, +0x7c6a706e, +0x814a0004, +0x556000fe, +0x000900ab, +0x2c030000, +0x00098200, +0x40820000, +0x00050832, +0x810a0000, +0x00098200, +0x812a0000, +0x00098200, +0x88ca0000, +0x00098200, +0x7c004040, +0x7dcea4ae, +0x40800000, +0x00050832, +0x7d09582e, +0x2c080000, +0x00098200, +0x41820000, +0x00050805, +0x0006000b, +0x70c00000, +0x00090200, +0x7dc95dae, +0x40820000, +0x00050807, +0x0006000c, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x0006000f, +0x810a0000, +0x00098200, +0x28080000, +0x41820000, +0x0005080b, +0x89080000, +0x00098200, +0x71080000, +0x00090200, +0x40820000, +0x0005080b, +0x48000000, +0x00050032, +0x00060011, +0x80110000, +0x00098200, +0x00000000, +0x54c607b8, +0x91510000, +0x00098200, +0x98ca0000, +0x00098200, +0x900a0000, +0x00098200, +0x48000000, +0x0005000c, +0x00000000, +0x7e8ea214, +0x0006000b, +0x7ccf6214, +0x8094fffc, +0x3413fff8, +0x80c60004, +0x540500fe, +0x000900ab, +0x41820000, +0x00050804, +0x7ca53214, +0x81240000, +0x00098200, +0x54c81800, +0x000900a1, +0x88c40000, +0x00098200, +0x7c054840, +0x7d340214, +0x80040000, +0x00098200, +0x41810000, +0x00050805, +0x7d080214, +0x70c00000, +0x00090200, +0x0006000d, +0xc8140000, +0x3a940008, +0x7c944800, +0xd8080000, +0x39080008, +0x41840000, +0x0005080d, +0x40820000, +0x00050807, +0x0006000e, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x0006000f, +0x91d20000, +0x00098200, +0x7e439378, +0x92010008, +0x7d956378, +0x48000001, +0x00030031, +0x7eacab78, +0x48000000, +0x0005000b, +0x00060011, +0x80110000, +0x00098200, +0x54c607b8, +0x91510000, +0x00098200, +0x98ca0000, +0x00098200, +0x900a0000, +0x00098200, +0x00000000, +0x48000000, +0x0005000e, +0x00000000, +0x7d6b9a14, +0x00000000, +0x7dc97378, +0x7c0ea06e, +0x814e0004, +0x396bfff8, +0x39ce0008, +0x2c000000, +0x00098200, +0x40820000, +0x00050825, +0x920efff8, +0x820a0000, +0x00098200, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54f4dd78, +0x7c11402e, +0x7e947214, +0x7c0903a6, +0x4e800420, +0x00000000, +0x7d6b9a14, +0x00000000, +0x7c14706e, +0x81540004, +0x396bfff8, +0x810efff8, +0x2c000000, +0x00098200, +0x3a940008, +0x40820000, +0x00050840, +0x00060041, +0x71000000, +0x00090200, +0x88ca0000, +0x00098200, +0x69090000, +0x00090200, +0x288b0000, +0x40820000, +0x00050807, +0x0006000b, +0x914efffc, +0x39200000, +0x2b860001, +0x41860000, +0x00050803, +0x0006000c, +0x38c90008, +0x7c144cae, +0x7c865840, +0x7c0e4dae, +0x7cc93378, +0x40860000, +0x0005080c, +0x0006000d, +0x4c42ea02, +0x41820000, +0x00050805, +0x0006000e, +0x820a0000, +0x00098200, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54f4dd78, +0x7c11402e, +0x7e947214, +0x7c0903a6, +0x4e800420, +0x0006000f, +0x80e8fffc, +0x54f4dd78, +0x7d147050, +0x81080000, +0x00098200, +0x81080000, +0x00098200, +0x81e80000, +0x00098200, +0x48000000, +0x0005000e, +0x00060011, +0x71200000, +0x00090200, +0x00000000, +0x40820000, +0x0005080b, +0x7dc97050, +0x810efff8, +0x71000000, +0x00090200, +0x48000000, +0x0005000b, +0x00000000, +0x7dc97378, +0x7dcea214, +0x810effe8, +0x814effec, +0xc82efff8, +0xc80efff0, +0x910e0000, +0x914e0004, +0x2c080000, +0x00098200, +0xd82e0010, +0x39600010, +0xdc0e0008, +0x40820000, +0x00050825, +0x920efff8, +0x820a0000, +0x00098200, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54f4dd78, +0x7c11402e, +0x7e947214, +0x7c0903a6, +0x4e800420, +0x00000000, +0x7e8ea214, +0x8154fff4, +0x8174fffc, +0x800a0000, +0x00098200, +0x810a0000, +0x00098200, +0x3a100004, +0x0006000b, +0x7c0b0040, +0x55661800, +0x000900a1, +0x40800000, +0x00050805, +0x7d28302e, +0x7c0834ae, +0x2c090000, +0x00098200, +0x80f0fffc, +0x41820000, +0x00050804, +0x91610024, +0xc8210020, +0xfc21f028, +0x396b0001, +0x3cd00000, +0x00098200, +0xd8140008, +0x54e893ba, +0x9174fffc, +0x7e083214, +0xd8340000, +0x0006000d, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x0006000e, +0x396b0001, +0x48000000, +0x0005000b, +0x0006000f, +0x810a0000, +0x00098200, +0x7d605850, +0x812a0000, +0x00098200, +0x00060010, +0x7c0b4040, +0x55662800, +0x000900a1, +0x41810000, +0x0005080d, +0x556a1800, +0x000900a1, +0x7cca3050, +0x7d49302e, +0x7c0934ae, +0x7cc93214, +0x2c0a0000, +0x00098200, +0x80f0fffc, +0x41820000, +0x00050807, +0xc8260000, +0x00098200, +0x3d300000, +0x00098200, +0x00000000, +0xd8140008, +0x7d6b0214, +0x54e893ba, +0xd8340000, +0x396b0001, +0x7e084a14, +0x9174fffc, +0x48000000, +0x0005000d, +0x00060011, +0x396b0001, +0x48000000, +0x00050010, +0x00000000, +0x7e8ea214, +0x8014ffe8, +0x8114ffec, +0x8134fff0, +0x80d4fff8, +0x2c090000, +0x00098200, +0x2c800000, +0x00098200, +0x2f060000, +0x00098200, +0x40860000, +0x00050805, +0x89080000, +0x00098200, +0x4c42d202, +0x2f880000, +0x00098200, +0x5580007e, +0x000900ab, +0x4c42f202, +0x7cd00214, +0x40820000, +0x00050805, +0x9314fffc, +0x3e060000, +0x00098200, +0x0006000b, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x0006000f, +0x38000000, +0x00098200, +0x39000000, +0x00098200, +0x9810ffff, +0x3e060000, +0x00098200, +0x99100003, +0x48000000, +0x0005000b, +0x00000000, +0x800efff8, +0x7d6e5a14, +0x7e8ea214, +0x396b0000, +0x00098200, +0x7d345214, +0x38cefff8, +0x7d605850, +0x288a0000, +0x7d0b3051, +0x41860000, +0x00050805, +0x3929fff0, +0x40810000, +0x00050802, +0x0006000b, +0xc80b0000, +0x396b0008, +0xd8140000, +0x7c144840, +0x7c8b3040, +0x40800000, +0x00050803, +0x3a940008, +0x41840000, +0x0005080b, +0x0006000c, +0x92f40000, +0x7c144840, +0x3a940008, +0x41800000, +0x0005080c, +0x0006000d, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x0006000f, +0x80120000, +0x00098200, +0x3a600008, +0x40810000, +0x0005080d, +0x7d344214, +0x7c090040, +0x3a680008, +0x41810000, +0x00050807, +0x00060010, +0xc80b0000, +0x396b0008, +0xd8140000, +0x7c0b3040, +0x3a940008, +0x41800000, +0x00050810, +0x48000000, +0x0005000d, +0x00060011, +0x7e439378, +0x92920000, +0x00098200, +0x7eae5850, +0x91d20000, +0x00098200, +0x7e8ea050, +0x92010008, +0x550400fe, +0x000900ab, +0x48000001, +0x00030000, +0x81d20000, +0x00098200, +0x00000000, +0x7e8ea214, +0x7d6eaa14, +0x38cefff8, +0x48000000, +0x00050010, +0x00000000, +0x7d8c9a14, +0x00000000, +0x820efff8, +0x7e8ea214, +0x7d936378, +0x0006000b, +0x72000000, +0x00090200, +0x6a080000, +0x00090200, +0x40820000, +0x0005089c, +0x00060017, +0x80f0fffc, +0x2c0c0008, +0x392efff8, +0x396cfff8, +0x54ea5d78, +0x41820000, +0x00050803, +0x39000000, +0x0006000c, +0x38c80008, +0x7c1444ae, +0x7c065800, +0x7c0945ae, +0x41820000, +0x00050803, +0x39060008, +0x7c3434ae, +0x7c085800, +0x7c2935ae, +0x40820000, +0x0005080c, +0x0006000d, +0x0006000f, +0x7c0a6040, +0x54f4dd78, +0x41810000, +0x00050806, +0x7dd44850, +0x810efffc, +0x80f00000, +0x3a100004, +0x81080000, +0x00098200, +0x81e80000, +0x00098200, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00060010, +0x390cfff8, +0x398c0008, +0x7ee9412e, +0x48000000, +0x0005000f, +0x0006009c, +0x71090000, +0x00090200, +0x40820000, +0x00050818, +0x7dc87050, +0x820efff8, +0x48000000, +0x0005000b, +0x00000000, +0x820efff8, +0x7e8ea214, +0x7d936378, +0x72000000, +0x00090200, +0x6a080000, +0x00090200, +0x40820000, +0x0005089c, +0x80f0fffc, +0x392efff8, +0x54ea5d78, +0x00000000, +0xc8140000, +0xd8090000, +0x00000000, +0x0006000f, +0x7c0a6040, +0x54f4dd78, +0x41810000, +0x00050806, +0x7dd44850, +0x810efffc, +0x80f00000, +0x3a100004, +0x81080000, +0x00098200, +0x81e80000, +0x00098200, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00060010, +0x390cfff8, +0x398c0008, +0x7ee9412e, +0x48000000, +0x0005000f, +0x00000000, +0x7c810808, +0x00000000, +0x7c3474ee, +0xc8740000, +0x00098200, +0xc8540000, +0x00098200, +0x80d40000, +0x00098200, +0xfc21182a, +0xd8340000, +0x00098200, +0x00000000, +0x7d14706e, +0xc8340000, +0x00098200, +0x80d40000, +0x00098200, +0xc8740000, +0x00098200, +0x81340000, +0x00098200, +0xc8540000, +0x00098200, +0x7c08b040, +0x7f86b040, +0x7c89b040, +0x4c00e202, +0x4c002202, +0x40800000, +0x00050842, +0x00000000, +0x2d860000, +0x00000000, +0x558c007e, +0x000900ab, +0x00000000, +0xd8340000, +0x00098200, +0x00000000, +0x7d906214, +0x00000000, +0xfc011000, +0x00000000, +0x3e0c0000, +0x00098200, +0x00000000, +0x418c0000, +0x00050805, +0x00000000, +0x41810000, +0x00050803, +0x00000000, +0x41810000, +0x00050802, +0x0006000b, +0x3e0c0000, +0x00098200, +0x00000000, +0x40810000, +0x00070800, +0x00000000, +0x0006000c, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x0006000f, +0x00000000, +0x40800000, +0x0005080c, +0x0006000d, +0x3e0c0000, +0x00098200, +0x00000000, +0x40800000, +0x0005080b, +0x00000000, +0x40800000, +0x00070800, +0x00000000, +0x48000000, +0x0005000c, +0x00000000, +0x7c810808, +0x00000000, +0x7d14706e, +0x81340004, +0x2c080000, +0x00098200, +0x41820000, +0x00050801, +0x00000000, +0x7c810808, +0x00000000, +0x5580007e, +0x000900ab, +0x7e100214, +0x3e100000, +0x00098200, +0x9114fff8, +0x9134fffc, +0x00000000, +0x0006000b, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x7c810808, +0x00000000, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x7c810808, +0x00000000, +0x5580007e, +0x000900ab, +0x7e100214, +0x3e100000, +0x00098200, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x7c810808, +0x00000000, +0x81320000, +0x00098200, +0x89100000, +0x00098200, +0x81f00000, +0x00098200, +0x7c144840, +0x55081800, +0x000900a1, +0x41810000, +0x00050820, +0x80f00000, +0x3a100004, +0x0006000c, +0x7c0b4040, +0x40810000, +0x00050803, +0x00000000, +0x7c810808, +0x00000000, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x0006000d, +0x7eee592e, +0x396b0008, +0x48000000, +0x0005000c, +0x00000000, +0x7c810808, +0x00000000, +0x81320000, +0x00098200, +0x7d0e5a14, +0x7c145a14, +0x91480004, +0x38cb0000, +0x00098200, +0x81f00000, +0x00098200, +0x7c004840, +0x90c80000, +0x40800000, +0x00050820, +0x89300000, +0x00098200, +0x7dd47378, +0x7d0b4378, +0x80f00000, +0x3a100004, +0x2c090000, +0x39c80008, +0x41820000, +0x00050803, +0x0006000b, +0x7c145840, +0x80140000, +0x80d40004, +0x40800000, +0x00050804, +0x92f40000, +0x3a940008, +0x0006000c, +0x3529ffff, +0x90080008, +0x90c8000c, +0x39080008, +0x40820000, +0x0005080b, +0x0006000d, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x0006000e, +0x38000000, +0x00098200, +0x48000000, +0x0005000c, +0x00000000, +0x80ca0000, +0x00098200, +0x00000000, +0x80d10000, +0x00098200, +0x00000000, +0x7d145a14, +0x81320000, +0x00098200, +0x7d6e5a14, +0x91d20000, +0x00098200, +0x7c084840, +0x91720000, +0x00098200, +0x38000000, +0x00098200, +0x7cc903a6, +0x00000000, +0x808a0000, +0x00098200, +0x00000000, +0x7e439378, +0x41810000, +0x0005081f, +0x90110000, +0x00098200, +0x4e800421, +0x81120000, +0x00098200, +0x546c1800, +0x000900a1, +0x81d20000, +0x00098200, +0x38000000, +0x00098200, +0x820efff8, +0x7e8c4050, +0x90110000, +0x00098200, +0x48000000, +0x00050016, +0x00000000, +0x00010000 +}; + +enum { + GLOB_vm_returnp, + GLOB_cont_dispatch, + GLOB_vm_returnc, + GLOB_BC_RET_Z, + GLOB_vm_return, + GLOB_vm_leave_cp, + GLOB_vm_leave_unw, + GLOB_vm_unwind_c, + GLOB_vm_unwind_c_eh, + GLOB_vm_unwind_ff, + GLOB_vm_unwind_ff_eh, + GLOB_vm_growstack_c, + GLOB_vm_growstack_l, + GLOB_vm_resume, + GLOB_vm_pcall, + GLOB_vm_call, + GLOB_vm_call_dispatch, + GLOB_vmeta_call, + GLOB_vm_call_dispatch_f, + GLOB_vm_cpcall, + GLOB_vm_call_tail, + GLOB_cont_cat, + GLOB_BC_CAT_Z, + GLOB_cont_nop, + GLOB_vmeta_tgets1, + GLOB_vmeta_tgets, + GLOB_vmeta_tgetb, + GLOB_vmeta_tgetv, + GLOB_vmeta_tsets1, + GLOB_vmeta_tsets, + GLOB_vmeta_tsetb, + GLOB_vmeta_tsetv, + GLOB_vmeta_comp, + GLOB_vmeta_binop, + GLOB_cont_ra, + GLOB_cont_condt, + GLOB_cont_condf, + GLOB_vmeta_equal, + GLOB_vmeta_arith_vn, + GLOB_vmeta_arith_nv, + GLOB_vmeta_unm, + GLOB_vmeta_arith_vv, + GLOB_vmeta_len, + GLOB_BC_LEN_Z, + GLOB_vmeta_callt, + GLOB_BC_CALLT_Z, + GLOB_vmeta_for, + GLOB_ff_assert, + GLOB_fff_fallback, + GLOB_fff_res, + GLOB_ff_type, + GLOB_fff_resn, + GLOB_ff_getmetatable, + GLOB_fff_restv, + GLOB_ff_setmetatable, + GLOB_ff_rawget, + GLOB_ff_tonumber, + GLOB_ff_tostring, + GLOB_fff_gcstep, + GLOB_ff_next, + GLOB_ff_pairs, + GLOB_ff_ipairs_aux, + GLOB_ff_ipairs, + GLOB_ff_pcall, + GLOB_ff_xpcall, + GLOB_ff_coroutine_resume, + GLOB_ff_coroutine_wrap_aux, + GLOB_ff_coroutine_yield, + GLOB_ff_math_abs, + GLOB_fff_res1, + GLOB_ff_math_floor, + GLOB_ff_math_ceil, + GLOB_ff_math_sqrt, + GLOB_ff_math_log, + GLOB_ff_math_log10, + GLOB_ff_math_exp, + GLOB_ff_math_sin, + GLOB_ff_math_cos, + GLOB_ff_math_tan, + GLOB_ff_math_asin, + GLOB_ff_math_acos, + GLOB_ff_math_atan, + GLOB_ff_math_sinh, + GLOB_ff_math_cosh, + GLOB_ff_math_tanh, + GLOB_ff_math_pow, + GLOB_ff_math_atan2, + GLOB_ff_math_fmod, + GLOB_ff_math_deg, + GLOB_ff_math_rad, + GLOB_ff_math_ldexp, + GLOB_ff_math_frexp, + GLOB_ff_math_modf, + GLOB_ff_math_min, + GLOB_ff_math_max, + GLOB_ff_string_len, + GLOB_fff_resi, + GLOB_ff_string_byte, + GLOB_ff_string_char, + GLOB_fff_newstr, + GLOB_ff_string_sub, + GLOB_ff_string_rep, + GLOB_ff_string_reverse, + GLOB_ff_string_lower, + GLOB_ff_string_upper, + GLOB_ff_table_getn, + GLOB_ff_bit_tobit, + GLOB_ff_bit_band, + GLOB_ff_bit_bor, + GLOB_ff_bit_bxor, + GLOB_ff_bit_bswap, + GLOB_ff_bit_bnot, + GLOB_ff_bit_lshift, + GLOB_ff_bit_rshift, + GLOB_ff_bit_arshift, + GLOB_ff_bit_rol, + GLOB_ff_bit_ror, + GLOB_vm_record, + GLOB_vm_rethook, + GLOB_vm_inshook, + GLOB_cont_hook, + GLOB_vm_hotloop, + GLOB_vm_callhook, + GLOB_vm_hotcall, + GLOB_vm_exit_handler, + GLOB_vm_exit_interp, + GLOB_vm_floor, + GLOB_vm_ceil, + GLOB_vm_trunc, + GLOB_vm_powi, + GLOB_vm_foldfpm, + GLOB_vm_foldarith, + GLOB_vm_ffi_call, + GLOB_BC_MODVN_Z, + GLOB_BC_TGETS_Z, + GLOB_BC_TSETS_Z, + GLOB_BC_RETV_Z, + GLOB__MAX +}; +static const char *const globnames[] = { + "vm_returnp", + "cont_dispatch", + "vm_returnc", + "BC_RET_Z", + "vm_return", + "vm_leave_cp", + "vm_leave_unw", + "vm_unwind_c", + "vm_unwind_c_eh", + "vm_unwind_ff", + "vm_unwind_ff_eh", + "vm_growstack_c", + "vm_growstack_l", + "vm_resume", + "vm_pcall", + "vm_call", + "vm_call_dispatch", + "vmeta_call", + "vm_call_dispatch_f", + "vm_cpcall", + "vm_call_tail", + "cont_cat", + "BC_CAT_Z", + "cont_nop", + "vmeta_tgets1", + "vmeta_tgets", + "vmeta_tgetb", + "vmeta_tgetv", + "vmeta_tsets1", + "vmeta_tsets", + "vmeta_tsetb", + "vmeta_tsetv", + "vmeta_comp", + "vmeta_binop", + "cont_ra", + "cont_condt", + "cont_condf", + "vmeta_equal", + "vmeta_arith_vn", + "vmeta_arith_nv", + "vmeta_unm", + "vmeta_arith_vv", + "vmeta_len", + "BC_LEN_Z", + "vmeta_callt", + "BC_CALLT_Z", + "vmeta_for", + "ff_assert", + "fff_fallback", + "fff_res", + "ff_type", + "fff_resn", + "ff_getmetatable", + "fff_restv", + "ff_setmetatable", + "ff_rawget", + "ff_tonumber", + "ff_tostring", + "fff_gcstep", + "ff_next", + "ff_pairs", + "ff_ipairs_aux", + "ff_ipairs", + "ff_pcall", + "ff_xpcall", + "ff_coroutine_resume", + "ff_coroutine_wrap_aux", + "ff_coroutine_yield", + "ff_math_abs", + "fff_res1", + "ff_math_floor", + "ff_math_ceil", + "ff_math_sqrt", + "ff_math_log", + "ff_math_log10", + "ff_math_exp", + "ff_math_sin", + "ff_math_cos", + "ff_math_tan", + "ff_math_asin", + "ff_math_acos", + "ff_math_atan", + "ff_math_sinh", + "ff_math_cosh", + "ff_math_tanh", + "ff_math_pow", + "ff_math_atan2", + "ff_math_fmod", + "ff_math_deg", + "ff_math_rad", + "ff_math_ldexp", + "ff_math_frexp", + "ff_math_modf", + "ff_math_min", + "ff_math_max", + "ff_string_len", + "fff_resi", + "ff_string_byte", + "ff_string_char", + "fff_newstr", + "ff_string_sub", + "ff_string_rep", + "ff_string_reverse", + "ff_string_lower", + "ff_string_upper", + "ff_table_getn", + "ff_bit_tobit", + "ff_bit_band", + "ff_bit_bor", + "ff_bit_bxor", + "ff_bit_bswap", + "ff_bit_bnot", + "ff_bit_lshift", + "ff_bit_rshift", + "ff_bit_arshift", + "ff_bit_rol", + "ff_bit_ror", + "vm_record", + "vm_rethook", + "vm_inshook", + "cont_hook", + "vm_hotloop", + "vm_callhook", + "vm_hotcall", + "vm_exit_handler", + "vm_exit_interp", + "vm_floor", + "vm_ceil", + "vm_trunc", + "vm_powi", + "vm_foldfpm", + "vm_foldarith", + "vm_ffi_call", + "BC_MODVN_Z", + "BC_TGETS_Z", + "BC_TSETS_Z", + "BC_RETV_Z", + (const char *)0 +}; +static const char *const extnames[] = { + "lj_state_growstack", + "lj_meta_tget", + "lj_meta_tset", + "lj_meta_comp", + "lj_meta_equal", + "lj_meta_arith", + "lj_meta_len", + "lj_meta_call", + "lj_meta_for", + "lj_tab_get", + "lj_str_fromnum", + "lj_tab_next", + "lj_tab_getinth", + "lj_ffh_coroutine_wrap_err", + "floor", + "ceil", + "sqrt", + "log", + "log10", + "exp", + "sin", + "cos", + "tan", + "asin", + "acos", + "atan", + "sinh", + "cosh", + "tanh", + "pow", + "atan2", + "fmod", + "ldexp", + "frexp", + "modf", + "lj_str_new", + "lj_tab_len", + "lj_gc_step", + "lj_dispatch_ins", + "lj_dispatch_call", + "trunc", + "lj_meta_cat", + "lj_gc_barrieruv", + "lj_func_closeuv", + "lj_func_newL_gc", + "lj_tab_new", + "lj_tab_dup", + "lj_gc_step_fixtop", + "lj_tab_newkey", + "lj_tab_reasize", + (const char *)0 +}; +#define Dt1(_V) (int)(ptrdiff_t)&(((lua_State *)0)_V) +#define Dt2(_V) (int)(ptrdiff_t)&(((global_State *)0)_V) +#define Dt3(_V) (int)(ptrdiff_t)&(((TValue *)0)_V) +#define Dt4(_V) (int)(ptrdiff_t)&(((GCobj *)0)_V) +#define Dt5(_V) (int)(ptrdiff_t)&(((GCstr *)0)_V) +#define Dt6(_V) (int)(ptrdiff_t)&(((GCtab *)0)_V) +#define Dt7(_V) (int)(ptrdiff_t)&(((GCfuncL *)0)_V) +#define Dt8(_V) (int)(ptrdiff_t)&(((GCfuncC *)0)_V) +#define Dt9(_V) (int)(ptrdiff_t)&(((GCproto *)0)_V) +#define DtA(_V) (int)(ptrdiff_t)&(((GCupval *)0)_V) +#define DtB(_V) (int)(ptrdiff_t)&(((Node *)0)_V) +#define DtC(_V) (int)(ptrdiff_t)&(((int *)0)_V) +#define DtD(_V) (int)(ptrdiff_t)&(((GCtrace *)0)_V) +#define DISPATCH_GL(field) (GG_DISP2G + (int)offsetof(global_State, field)) +#define DISPATCH_J(field) (GG_DISP2J + (int)offsetof(jit_State, field)) +#define PC2PROTO(field) ((int)offsetof(GCproto, field)-(int)sizeof(GCproto)) + +/* Generate subroutines used by opcodes and other parts of the VM. */ +/* The .code_sub section should be last to help static branch prediction. */ +static void build_subroutines(BuildCtx *ctx) +{ + dasm_put(Dst, 0); + dasm_put(Dst, 1, FRAME_P, LJ_TTRUE, FRAME_TYPE, FRAME_C, ~LJ_VMST_C, Dt1(->base), DISPATCH_GL(vmstate), 31-3, Dt1(->top)); + dasm_put(Dst, 55, Dt1(->cframe), 184+(14-14)*4, 40+(14-14)*8, 184+(15-14)*4, 40+(15-14)*8, 184+(16-14)*4, 40+(16-14)*8, 184+(17-14)*4, 40+(17-14)*8, 184+(18-14)*4, 40+(18-14)*8, 184+(19-14)*4, 40+(19-14)*8, 184+(20-14)*4, 40+(20-14)*8, 184+(21-14)*4, 40+(21-14)*8, 184+(22-14)*4, 40+(22-14)*8, 184+(23-14)*4, 40+(23-14)*8); + dasm_put(Dst, 103, 184+(24-14)*4, 40+(24-14)*8, 184+(25-14)*4, 40+(25-14)*8, 184+(26-14)*4, 40+(26-14)*8, 184+(27-14)*4, 40+(27-14)*8, 184+(28-14)*4, 40+(28-14)*8, 184+(29-14)*4, 40+(29-14)*8, 184+(30-14)*4, 40+(30-14)*8, 184+(31-14)*4, 40+(31-14)*8, Dt1(->maxstack)); + dasm_put(Dst, 152, Dt1(->top), 31-3, Dt1(->top), ~LJ_VMST_C, Dt1(->glref), Dt2(->vmstate), LJ_TISNUM, Dt1(->base), Dt1(->glref), LJ_TFALSE, LJ_TNIL, ~LJ_VMST_INTERP, GG_G2DISP); + dasm_put(Dst, 215, DISPATCH_GL(vmstate), LUA_MINSTACK, Dt1(->base), Dt1(->top), 32-3, Dt1(->base), Dt1(->top), Dt7(->pc), 184+(14-14)*4, 40+(14-14)*8, 184+(15-14)*4, 40+(15-14)*8, 184+(16-14)*4, 40+(16-14)*8, 184+(17-14)*4); + dasm_put(Dst, 275, 40+(17-14)*8, 184+(18-14)*4, 40+(18-14)*8, 184+(19-14)*4, 40+(19-14)*8, 184+(20-14)*4, 40+(20-14)*8, 184+(21-14)*4, 40+(21-14)*8, 184+(22-14)*4, 40+(22-14)*8, 184+(23-14)*4, 40+(23-14)*8, 184+(24-14)*4, 40+(24-14)*8, 184+(25-14)*4, 40+(25-14)*8, 184+(26-14)*4, 40+(26-14)*8, 184+(27-14)*4, 40+(27-14)*8, 184+(28-14)*4); + dasm_put(Dst, 322, 40+(28-14)*8, 184+(29-14)*4, 40+(29-14)*8, 184+(30-14)*4, 40+(30-14)*8, 184+(31-14)*4, 40+(31-14)*8, Dt1(->glref), Dt1(->status), FRAME_CP, CFRAME_RESUME, GG_G2DISP, Dt1(->cframe), Dt1(->base), LJ_TISNUM, Dt1(->top), Dt1(->status), FRAME_TYPE, ~LJ_VMST_INTERP, LJ_TNIL, DISPATCH_GL(vmstate)); + dasm_put(Dst, 389, 184+(14-14)*4, 40+(14-14)*8, 184+(15-14)*4, 40+(15-14)*8, 184+(16-14)*4, 40+(16-14)*8, 184+(17-14)*4, 40+(17-14)*8, 184+(18-14)*4, 40+(18-14)*8, 184+(19-14)*4, 40+(19-14)*8, 184+(20-14)*4, 40+(20-14)*8, 184+(21-14)*4, 40+(21-14)*8, 184+(22-14)*4, 40+(22-14)*8, 184+(23-14)*4); + dasm_put(Dst, 435, 40+(23-14)*8, 184+(24-14)*4, 40+(24-14)*8, 184+(25-14)*4, 40+(25-14)*8, 184+(26-14)*4, 40+(26-14)*8, 184+(27-14)*4, 40+(27-14)*8, 184+(28-14)*4, 40+(28-14)*8, 184+(29-14)*4, 40+(29-14)*8, 184+(30-14)*4, 40+(30-14)*8, 184+(31-14)*4, 40+(31-14)*8, FRAME_CP, 184+(14-14)*4, 40+(14-14)*8); + dasm_put(Dst, 482, 184+(15-14)*4, 40+(15-14)*8, 184+(16-14)*4, 40+(16-14)*8, 184+(17-14)*4, 40+(17-14)*8, 184+(18-14)*4, 40+(18-14)*8, 184+(19-14)*4, 40+(19-14)*8, 184+(20-14)*4, 40+(20-14)*8, 184+(21-14)*4, 40+(21-14)*8, 184+(22-14)*4, 40+(22-14)*8, 184+(23-14)*4, 40+(23-14)*8, 184+(24-14)*4, 40+(24-14)*8, 184+(25-14)*4, 40+(25-14)*8); + dasm_put(Dst, 528, 184+(26-14)*4, 40+(26-14)*8, 184+(27-14)*4, 40+(27-14)*8, 184+(28-14)*4, 40+(28-14)*8, 184+(29-14)*4, 40+(29-14)*8, 184+(30-14)*4, 40+(30-14)*8, 184+(31-14)*4, 40+(31-14)*8, FRAME_C, Dt1(->cframe), Dt1(->cframe), Dt1(->glref), GG_G2DISP, Dt1(->base), LJ_TISNUM, Dt1(->top)); + dasm_put(Dst, 578, ~LJ_VMST_INTERP, LJ_TNIL, DISPATCH_GL(vmstate), LJ_TFUNC, Dt7(->pc), 184+(14-14)*4, 40+(14-14)*8, 184+(15-14)*4, 40+(15-14)*8, 184+(16-14)*4, 40+(16-14)*8, 184+(17-14)*4, 40+(17-14)*8, 184+(18-14)*4, 40+(18-14)*8, 184+(19-14)*4, 40+(19-14)*8, 184+(20-14)*4); + dasm_put(Dst, 645, 40+(20-14)*8, 184+(21-14)*4, 40+(21-14)*8, 184+(22-14)*4, 40+(22-14)*8, 184+(23-14)*4, 40+(23-14)*8, 184+(24-14)*4, 40+(24-14)*8, 184+(25-14)*4, 40+(25-14)*8, 184+(26-14)*4, 40+(26-14)*8, 184+(27-14)*4, 40+(27-14)*8, 184+(28-14)*4, 40+(28-14)*8, 184+(29-14)*4, 40+(29-14)*8, 184+(30-14)*4, 40+(30-14)*8, 184+(31-14)*4); + dasm_put(Dst, 691, 40+(31-14)*8, Dt1(->stack), Dt1(->top), Dt1(->cframe), Dt1(->cframe), Dt1(->glref), FRAME_CP, GG_G2DISP, Dt7(->pc), PC2PROTO(k), Dt1(->base), DISPATCH_GL(tmptv)); + dasm_put(Dst, 765, LJ_TSTR, DISPATCH_GL(tmptv), LJ_TTAB, DISPATCH_GL(tmptv2), LJ_TSTR, DISPATCH_GL(tmptv), Dt1(->base), FRAME_CONT, Dt1(->top), DISPATCH_GL(tmptv)); + dasm_put(Dst, 841, LJ_TSTR, DISPATCH_GL(tmptv), LJ_TTAB, DISPATCH_GL(tmptv2), LJ_TSTR, DISPATCH_GL(tmptv), Dt1(->base), FRAME_CONT, Dt1(->top), Dt1(->base)); + dasm_put(Dst, 923, -(BCBIAS_J*4 >> 16), LJ_TTRUE, LJ_TTRUE, Dt1(->base)); + dasm_put(Dst, 994, Dt1(->base), FRAME_CONT); +#ifdef LUAJIT_ENABLE_LUA52COMPAT + dasm_put(Dst, 1025); +#endif + dasm_put(Dst, 1027, Dt1(->base)); +#ifdef LUAJIT_ENABLE_LUA52COMPAT + dasm_put(Dst, 1035); +#else + dasm_put(Dst, 1042); +#endif + dasm_put(Dst, 1045, Dt1(->base), Dt7(->pc), Dt1(->base), Dt1(->base)); +#if LJ_HASJIT + dasm_put(Dst, 1093); +#endif + dasm_put(Dst, 1095); +#if LJ_HASJIT + dasm_put(Dst, 1097, BC_JFORI); +#endif + dasm_put(Dst, 1100); +#if LJ_HASJIT + dasm_put(Dst, 1102, BC_JFORI); +#endif + dasm_put(Dst, 1105, BC_FORI, LJ_TFALSE, ~LJ_TISNUM+1, 31-3, Dt8(->upvalue), LJ_TTAB, Dt6(->metatable)); + dasm_put(Dst, 1168, LJ_TNIL, DISPATCH_GL(gcroot[GCROOT_MMNAME+MM_metatable]), Dt6(->hmask), LJ_TTAB, Dt5(->hash), Dt6(->node), 31-5, 31-3, DtB(->key), 4+offsetof(Node, key), DtB(->val), 4+offsetof(Node, val), LJ_TSTR, DtB(->next)); + dasm_put(Dst, 1216, LJ_TNIL, LJ_TUDATA, ~LJ_TISNUM+1, 31-2, DISPATCH_GL(gcroot[GCROOT_BASEMT]), LJ_TTAB, Dt6(->metatable), LJ_TTAB, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable)); + dasm_put(Dst, 1271, DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist), LJ_TTAB, LJ_TSTR, DISPATCH_GL(gcroot[GCROOT_BASEMT_NUM]), Dt1(->base)); + dasm_put(Dst, 1331, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), LJ_TSTR, LJ_TTAB, Dt1(->base), Dt1(->top), LJ_TNIL, (2+1)*8, LJ_TTAB); +#ifdef LUAJIT_ENABLE_LUA52COMPAT + dasm_put(Dst, 1393, Dt6(->metatable), Dt8(->upvalue[0])); +#else + dasm_put(Dst, 1402, Dt8(->upvalue[0])); +#endif + dasm_put(Dst, 1406, (3+1)*8, LJ_TTAB, Dt6(->asize), Dt6(->array), 31-3, LJ_TNIL, (0+1)*8, (2+1)*8, Dt6(->hmask), (0+1)*8); + dasm_put(Dst, 1474, (0+1)*8, LJ_TTAB); +#ifdef LUAJIT_ENABLE_LUA52COMPAT + dasm_put(Dst, 1495, Dt6(->metatable), Dt8(->upvalue[0])); +#else + dasm_put(Dst, 1504, Dt8(->upvalue[0])); +#endif + dasm_put(Dst, 1508, (3+1)*8, DISPATCH_GL(hookmask), 32-HOOK_ACTIVE_SHIFT, 8+FRAME_PCALL, DISPATCH_GL(hookmask), LJ_TFUNC, 32-HOOK_ACTIVE_SHIFT, 16+FRAME_PCALL, LJ_TTHREAD, Dt1(->status), Dt1(->cframe)); + dasm_put(Dst, 1570, Dt1(->top), LUA_YIELD, Dt1(->base), Dt1(->maxstack), Dt1(->base), Dt1(->top), Dt1(->top), Dt1(->base), LUA_YIELD, Dt1(->top), ~LJ_VMST_INTERP, Dt1(->base), DISPATCH_GL(vmstate)); + dasm_put(Dst, 1632, Dt1(->maxstack), Dt1(->top), FRAME_TYPE, LJ_TTRUE, FRAME_TYPE, LJ_TFALSE, Dt1(->top), (2+1)*8, 32-3); + dasm_put(Dst, 1695, Dt8(->upvalue[0].gcr), Dt1(->status), Dt1(->cframe), Dt1(->top), LUA_YIELD, Dt1(->base), Dt1(->maxstack), Dt1(->base), Dt1(->top), Dt1(->top), Dt1(->base), LUA_YIELD, Dt1(->top), ~LJ_VMST_INTERP); + dasm_put(Dst, 1754, Dt1(->base), DISPATCH_GL(vmstate), Dt1(->maxstack), Dt1(->top), FRAME_TYPE, 32-3, Dt1(->cframe)); + dasm_put(Dst, 1811, Dt1(->base), CFRAME_RESUME, Dt1(->top), LUA_YIELD, Dt1(->cframe), Dt1(->status), (1+1)*8, FRAME_TYPE); + dasm_put(Dst, 1878); + dasm_put(Dst, 1939); + dasm_put(Dst, 1997); + dasm_put(Dst, 2058); + dasm_put(Dst, 2123, Dt8(->upvalue[0]), DISPATCH_GL(tmptv), DISPATCH_GL(tmptv), (2+1)*8); + dasm_put(Dst, 2191, (2+1)*8); + dasm_put(Dst, 2263, LJ_TSTR, Dt5(->len), LJ_TSTR, Dt5(->len), Dt5([1]), 31-3, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base)); + dasm_put(Dst, 2332, Dt1(->base), LJ_TSTR, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), LJ_TSTR, Dt5(->len), sizeof(GCstr)-1); + dasm_put(Dst, 2401, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), LJ_TSTR, Dt5(->len), DISPATCH_GL(tmpbuf.sz), Dt5([1]), DISPATCH_GL(tmpbuf.buf)); + dasm_put(Dst, 2471, DISPATCH_GL(strempty), LJ_TSTR, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), LJ_TSTR, DISPATCH_GL(tmpbuf.sz), Dt5(->len), sizeof(GCstr), DISPATCH_GL(tmpbuf.buf), DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold)); + dasm_put(Dst, 2526, LJ_TSTR, DISPATCH_GL(tmpbuf.sz), Dt5(->len), sizeof(GCstr), DISPATCH_GL(tmpbuf.buf), DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), LJ_TSTR, DISPATCH_GL(tmpbuf.sz), Dt5(->len), sizeof(GCstr), DISPATCH_GL(tmpbuf.buf)); + dasm_put(Dst, 2588, LJ_TTAB); + dasm_put(Dst, 2668); + dasm_put(Dst, 2760); + dasm_put(Dst, 2863, Dt8(->f), 8*LUA_MINSTACK, Dt1(->maxstack), Dt1(->base), Dt1(->top), Dt1(->base), 31-3, Dt1(->top), Dt7(->pc), FRAME_TYPE); + dasm_put(Dst, 2941, LUA_MINSTACK, Dt1(->base), Dt1(->base), Dt1(->top), Dt1(->base), Dt1(->top)); +#if LJ_HASJIT + dasm_put(Dst, 2975); +#endif + dasm_put(Dst, 2977, DISPATCH_GL(hookmask), HOOK_ACTIVE, GG_DISP2STATIC, DISPATCH_GL(hookmask), DISPATCH_GL(hookcount), HOOK_ACTIVE, 31-LUA_HOOKLINE, DISPATCH_GL(hookcount), Dt1(->base), Dt1(->base)); + dasm_put(Dst, 3024, GG_DISP2STATIC); +#if LJ_HASJIT + dasm_put(Dst, 3042); +#endif + dasm_put(Dst, 3044); +#if LJ_HASJIT + dasm_put(Dst, 3047); +#endif + dasm_put(Dst, 3050); +#if LJ_HASJIT + dasm_put(Dst, 3052); +#endif + dasm_put(Dst, 3055, Dt1(->base), Dt1(->top), Dt1(->base), Dt1(->top)); +#if LJ_HASJIT + dasm_put(Dst, 3077); +#endif + dasm_put(Dst, 3079); +#if LJ_HASJIT + dasm_put(Dst, 3081); +#endif + dasm_put(Dst, 3083); +#if LJ_HASJIT + dasm_put(Dst, 3091); +#endif + dasm_put(Dst, 3094); +#if LJ_HASJIT + dasm_put(Dst, 3096); +#endif + dasm_put(Dst, 3098); +#if LJ_HASJIT + dasm_put(Dst, 3100); +#endif + dasm_put(Dst, 3102); +#if LJ_HASFFI + dasm_put(Dst, 3166); +#endif +} + +/* Generate the code for a single instruction. */ +static void build_ins(BuildCtx *ctx, BCOp op, int defop) +{ + int vk = 0; + dasm_put(Dst, 3168, defop); + + switch (op) { + + /* -- Comparison ops ---------------------------------------------------- */ + + /* Remember: all ops branch for a true comparison, fall through otherwise. */ + + case BC_ISLT: case BC_ISGE: case BC_ISLE: case BC_ISGT: + dasm_put(Dst, 3170, -(BCBIAS_J*4 >> 16)); + if (op == BC_ISLT) { + dasm_put(Dst, 3187); + } else if (op == BC_ISGE) { + dasm_put(Dst, 3190); + } else if (op == BC_ISLE) { + dasm_put(Dst, 3193); + } else { + dasm_put(Dst, 3197); + } + dasm_put(Dst, 3201); + break; + + case BC_ISEQV: case BC_ISNEV: + vk = op == BC_ISEQV; + dasm_put(Dst, 3214, -(BCBIAS_J*4 >> 16)); + if (vk) { + dasm_put(Dst, 3231); + } else { + dasm_put(Dst, 3235); + } + dasm_put(Dst, 3239, ~LJ_TISPRI, ~LJ_TISTABUD); + if (vk) { + dasm_put(Dst, 3267); + } else { + dasm_put(Dst, 3272); + } + dasm_put(Dst, 3277, Dt6(->metatable), 1-vk, Dt6(->nomm), 1<> 16)); + if (vk) { + dasm_put(Dst, 3316); + } else { + dasm_put(Dst, 3318); + } + dasm_put(Dst, 3320); + break; + + case BC_ISEQN: case BC_ISNEN: + vk = op == BC_ISEQN; + dasm_put(Dst, 3332, -(BCBIAS_J*4 >> 16)); + if (vk) { + dasm_put(Dst, 3345); + } else { + dasm_put(Dst, 3350); + } + dasm_put(Dst, 3356); + if (!vk) { + dasm_put(Dst, 3367, -(BCBIAS_J*4 >> 16)); + } + break; + + case BC_ISEQP: case BC_ISNEP: + vk = op == BC_ISEQP; + dasm_put(Dst, 3374, 32-3, -(BCBIAS_J*4 >> 16)); + if (vk) { + dasm_put(Dst, 3387); + } else { + dasm_put(Dst, 3389); + } + dasm_put(Dst, 3391); + break; + + /* -- Unary test and copy ops ------------------------------------------- */ + + case BC_ISTC: case BC_ISFC: case BC_IST: case BC_ISF: + dasm_put(Dst, 3403); + if (op == BC_IST || op == BC_ISF) { + dasm_put(Dst, 3407, LJ_TTRUE, -(BCBIAS_J*4 >> 16)); + if (op == BC_IST) { + dasm_put(Dst, 3414); + } else { + dasm_put(Dst, 3416); + } + dasm_put(Dst, 3418); + } else { + dasm_put(Dst, 3420, LJ_TFALSE); + if (op == BC_ISTC) { + dasm_put(Dst, 3425); + } else { + dasm_put(Dst, 3428); + } + dasm_put(Dst, 3431, -(BCBIAS_J*4 >> 16)); + } + dasm_put(Dst, 3438); + break; + + /* -- Unary ops --------------------------------------------------------- */ + + case BC_MOV: + dasm_put(Dst, 3449); + break; + case BC_NOT: + dasm_put(Dst, 3462, LJ_TTRUE); + break; + case BC_UNM: + dasm_put(Dst, 3478); + break; + case BC_LEN: + dasm_put(Dst, 3497, LJ_TSTR, Dt5(->len), LJ_TTAB); +#ifdef LUAJIT_ENABLE_LUA52COMPAT + dasm_put(Dst, 3526, Dt6(->metatable)); +#endif + dasm_put(Dst, 3533); +#ifdef LUAJIT_ENABLE_LUA52COMPAT + dasm_put(Dst, 3539, Dt6(->nomm), 1<base), 32-3, Dt1(->base)); + break; + + /* -- Constant ops ------------------------------------------------------ */ + + case BC_KSTR: + dasm_put(Dst, 3819, 32-1, LJ_TSTR); + break; + case BC_KCDATA: +#if LJ_HASFFI + dasm_put(Dst, 3838, 32-1, LJ_TCDATA); +#endif + break; + case BC_KSHORT: + dasm_put(Dst, 3857, 31-13); + break; + case BC_KNUM: + dasm_put(Dst, 3876); + break; + case BC_KPRI: + dasm_put(Dst, 3889, 32-3); + break; + case BC_KNIL: + dasm_put(Dst, 3904); + break; + + /* -- Upvalue and function ops ------------------------------------------ */ + + case BC_UGET: + dasm_put(Dst, 3923, 32-1, offsetof(GCfuncL, uvptr), DtA(->v)); + break; + case BC_USETV: + dasm_put(Dst, 3944, 32-1, offsetof(GCfuncL, uvptr), DtA(->marked), DtA(->v), LJ_GC_BLACK, DtA(->closed), -(LJ_TISNUM+1), LJ_TISGCV - (LJ_TISNUM+1), Dt4(->gch.marked), LJ_GC_WHITES, GG_DISP2G); + break; + case BC_USETS: + dasm_put(Dst, 3997, 32-1, 32-1, offsetof(GCfuncL, uvptr), DtA(->marked), DtA(->v), LJ_GC_BLACK, Dt5(->marked), DtA(->closed), LJ_TSTR, LJ_GC_WHITES, GG_DISP2G); + break; + case BC_USETN: + dasm_put(Dst, 4048, 32-1, offsetof(GCfuncL, uvptr), DtA(->v)); + break; + case BC_USETP: + dasm_put(Dst, 4069, 32-1, offsetof(GCfuncL, uvptr), 32-3, DtA(->v)); + break; + + case BC_UCLO: + dasm_put(Dst, 4092, Dt1(->openupval), 32-1, -(BCBIAS_J*4 >> 16), Dt1(->base), Dt1(->base)); + break; + + case BC_FNEW: + dasm_put(Dst, 4122, 32-1, Dt1(->base), Dt1(->base), LJ_TFUNC); + break; + + /* -- Table ops --------------------------------------------------------- */ + + case BC_TNEW: + case BC_TDUP: + dasm_put(Dst, 4150, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base)); + if (op == BC_TNEW) { + dasm_put(Dst, 4163); + } else { + dasm_put(Dst, 4172, 32-1); + } + dasm_put(Dst, 4179, Dt1(->base), LJ_TTAB); + if (op == BC_TNEW) { + dasm_put(Dst, 4196); + } + dasm_put(Dst, 4201); + break; + + case BC_GGET: + case BC_GSET: + dasm_put(Dst, 4210, 32-1, Dt7(->env)); + if (op == BC_GGET) { + dasm_put(Dst, 4218); + } else { + dasm_put(Dst, 4221); + } + break; + + case BC_TGETV: + dasm_put(Dst, 4224, LJ_TTAB, Dt6(->asize), Dt6(->array), 31-3, LJ_TNIL, Dt6(->metatable), Dt6(->nomm), 1<hmask), Dt5(->hash), Dt6(->node), 31-5, 31-3, DtB(->key), 4+offsetof(Node, key), DtB(->val), 4+offsetof(Node, val), LJ_TSTR, LJ_TNIL, DtB(->next)); + dasm_put(Dst, 4353, LJ_TNIL, Dt6(->metatable), Dt6(->nomm), 1<asize), Dt6(->array), LJ_TNIL, Dt6(->metatable), Dt6(->nomm), 1<asize), Dt6(->array), 31-3, Dt6(->marked), LJ_TNIL, LJ_GC_BLACK, Dt6(->metatable), Dt6(->nomm), 1<marked), Dt6(->gclist)); + break; + dasm_put(Dst, 4509, LJ_TSTR, LJ_TNIL); + case BC_TSETS: + dasm_put(Dst, 4535, 32-1, LJ_TTAB, Dt6(->hmask), Dt5(->hash), Dt6(->node), Dt6(->nomm), 31-5, 31-3, Dt6(->marked), DtB(->key), 4+offsetof(Node, key), DtB(->val), 4+offsetof(Node, val), LJ_TSTR, LJ_TNIL); + dasm_put(Dst, 4586, LJ_GC_BLACK, DtB(->val), Dt6(->metatable), Dt6(->nomm), 1<next), Dt6(->metatable), DISPATCH_GL(tmptv), Dt1(->base), Dt6(->nomm), 1<base), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist)); + break; + case BC_TSETB: + dasm_put(Dst, 4667, 32-3, LJ_TTAB, Dt6(->asize), Dt6(->array), Dt6(->marked), LJ_TNIL, LJ_GC_BLACK, Dt6(->metatable), Dt6(->nomm), 1<marked), Dt6(->gclist)); + break; + + case BC_TSETM: + dasm_put(Dst, 4735, 32-3, Dt6(->asize), 31-3, Dt6(->marked), Dt6(->array), LJ_GC_BLACK, Dt1(->base), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist)); + dasm_put(Dst, 4804); + break; + + /* -- Calls and vararg handling ----------------------------------------- */ + + case BC_CALLM: + dasm_put(Dst, 4807); + break; + case BC_CALL: + dasm_put(Dst, 4809, LJ_TFUNC, Dt7(->pc)); + break; + + case BC_CALLMT: + dasm_put(Dst, 4830); + break; + case BC_CALLT: + dasm_put(Dst, 4832, LJ_TFUNC, FRAME_TYPE, Dt7(->ffid), FRAME_VARG, Dt7(->pc), -4-8, Dt7(->pc), PC2PROTO(k), FRAME_TYPEP); + dasm_put(Dst, 4896, FRAME_TYPE); + break; + + case BC_ITERC: + dasm_put(Dst, 4905, LJ_TFUNC, Dt7(->pc)); + break; + + case BC_ITERN: +#if LJ_HASJIT +#endif + dasm_put(Dst, 4932, Dt6(->asize), Dt6(->array), 31-3, LJ_TNIL, -(BCBIAS_J*4 >> 16), Dt6(->hmask), Dt6(->node), 31-5, 31-3, LJ_TNIL, DtB(->key), -(BCBIAS_J*4 >> 16)); + dasm_put(Dst, 5007); + break; + + case BC_ISNEXT: + dasm_put(Dst, 5021, LJ_TTAB, LJ_TFUNC, LJ_TNIL, Dt8(->ffid), FF_next_N, 32-1, -(BCBIAS_J*4 >> 16), BC_JMP, BC_ITERC, -(BCBIAS_J*4 >> 16)); + break; + + case BC_VARG: + dasm_put(Dst, 5071, FRAME_VARG, Dt1(->maxstack), Dt1(->top), Dt1(->base), 32-3, Dt1(->base)); + dasm_put(Dst, 5151); + break; + + /* -- Returns ----------------------------------------------------------- */ + + case BC_RETM: + dasm_put(Dst, 5157); + break; + + case BC_RET: + dasm_put(Dst, 5159, FRAME_TYPE, FRAME_VARG, Dt7(->pc), PC2PROTO(k), FRAME_TYPEP); + break; + + case BC_RET0: case BC_RET1: + dasm_put(Dst, 5229, FRAME_TYPE, FRAME_VARG); + if (op == BC_RET1) { + dasm_put(Dst, 5242); + } + dasm_put(Dst, 5245, Dt7(->pc), PC2PROTO(k)); + break; + + /* -- Loops and branches ------------------------------------------------ */ + + case BC_FORL: +#if LJ_HASJIT + dasm_put(Dst, 5273); +#endif + break; + + case BC_JFORI: + case BC_JFORL: +#if !LJ_HASJIT + break; +#endif + case BC_FORI: + case BC_IFORL: + vk = (op == BC_IFORL || op == BC_JFORL); + if (vk) { + dasm_put(Dst, 5275, FORL_STEP*8, FORL_STOP*8, FORL_STEP*8, FORL_IDX*8); + } else { + dasm_put(Dst, 5286, FORL_IDX*8, FORL_STEP*8, FORL_STEP*8, FORL_STOP*8, FORL_STOP*8); + } + dasm_put(Dst, 5305); + if (op != BC_JFORL) { + dasm_put(Dst, 5307, 32-1); + } + dasm_put(Dst, 5310, FORL_EXT*8); + if (op != BC_JFORL) { + dasm_put(Dst, 5313); + } + dasm_put(Dst, 5315); + if (op == BC_JFORI) { + dasm_put(Dst, 5317, -(BCBIAS_J*4 >> 16)); + } + dasm_put(Dst, 5320); + if (op == BC_FORI) { + dasm_put(Dst, 5323); + } else if (op == BC_IFORL) { + dasm_put(Dst, 5326, -(BCBIAS_J*4 >> 16)); + } else { + dasm_put(Dst, 5332, BC_JLOOP); + } + dasm_put(Dst, 5335); + if (op == BC_FORI) { + dasm_put(Dst, 5348, -(BCBIAS_J*4 >> 16)); + } else if (op == BC_IFORL) { + dasm_put(Dst, 5354); + } else { + dasm_put(Dst, 5357, BC_JLOOP); + } + dasm_put(Dst, 5360); + break; + + case BC_ITERL: +#if LJ_HASJIT + dasm_put(Dst, 5363); +#endif + break; + + case BC_JITERL: +#if !LJ_HASJIT + break; +#endif + case BC_IITERL: + dasm_put(Dst, 5365, LJ_TNIL); + if (op == BC_JITERL) { + dasm_put(Dst, 5372); + } else { + dasm_put(Dst, 5374, 32-1, -(BCBIAS_J*4 >> 16)); + } + dasm_put(Dst, 5382); + break; + + case BC_LOOP: +#if LJ_HASJIT + dasm_put(Dst, 5394); +#endif + break; + + case BC_ILOOP: + dasm_put(Dst, 5396); + break; + + case BC_JLOOP: +#if LJ_HASJIT + dasm_put(Dst, 5407); +#endif + break; + + case BC_JMP: + dasm_put(Dst, 5409, 32-1, -(BCBIAS_J*4 >> 16)); + break; + + /* -- Function headers -------------------------------------------------- */ + + case BC_FUNCF: +#if LJ_HASJIT + dasm_put(Dst, 5425); +#endif + case BC_FUNCV: /* NYI: compiled vararg functions. */ + break; + + case BC_JFUNCF: +#if !LJ_HASJIT + break; +#endif + case BC_IFUNCF: + dasm_put(Dst, 5427, Dt1(->maxstack), -4+PC2PROTO(numparams), -4+PC2PROTO(k), 31-3); + if (op == BC_JFUNCF) { + dasm_put(Dst, 5445); + } else { + dasm_put(Dst, 5447); + } + dasm_put(Dst, 5456); + break; + + case BC_JFUNCV: +#if !LJ_HASJIT + break; +#endif + dasm_put(Dst, 5462); + break; /* NYI: compiled vararg functions. */ + + case BC_IFUNCV: + dasm_put(Dst, 5464, Dt1(->maxstack), 8+FRAME_VARG, -4+PC2PROTO(k), -4+PC2PROTO(numparams), LJ_TNIL); + break; + + case BC_FUNCC: + case BC_FUNCCW: + if (op == BC_FUNCC) { + dasm_put(Dst, 5517, Dt8(->f)); + } else { + dasm_put(Dst, 5520, DISPATCH_GL(wrapf)); + } + dasm_put(Dst, 5523, Dt1(->maxstack), Dt1(->base), Dt1(->top), ~LJ_VMST_C); + if (op == BC_FUNCCW) { + dasm_put(Dst, 5536, Dt8(->f)); + } + dasm_put(Dst, 5539, DISPATCH_GL(vmstate), Dt1(->top), 31-3, Dt1(->base), ~LJ_VMST_INTERP, DISPATCH_GL(vmstate)); + break; + + /* ---------------------------------------------------------------------- */ + + default: + fprintf(stderr, "Error: undefined opcode BC_%s\n", bc_names[op]); + exit(2); + break; + } +} + +static int build_backend(BuildCtx *ctx) +{ + int op; + + dasm_growpc(Dst, BC__MAX); + + build_subroutines(ctx); + + dasm_put(Dst, 5560); + for (op = 0; op < BC__MAX; op++) + build_ins(ctx, (BCOp)op, op); + + return BC__MAX; +} + +/* Emit pseudo frame-info for all assembler functions. */ +static void emit_asm_debug(BuildCtx *ctx) +{ + int i; + switch (ctx->mode) { + case BUILD_elfasm: + fprintf(ctx->fp, "\t.section .debug_frame,\"\",@progbits\n"); + fprintf(ctx->fp, + ".Lframe0:\n" + "\t.long .LECIE0-.LSCIE0\n" + ".LSCIE0:\n" + "\t.long 0xffffffff\n" + "\t.byte 0x1\n" + "\t.string \"\"\n" + "\t.uleb128 0x1\n" + "\t.sleb128 -4\n" + "\t.byte 65\n" + "\t.byte 0xc\n\t.uleb128 1\n\t.uleb128 0\n" + "\t.align 2\n" + ".LECIE0:\n\n"); + fprintf(ctx->fp, + ".LSFDE0:\n" + "\t.long .LEFDE0-.LASFDE0\n" + ".LASFDE0:\n" + "\t.long .Lframe0\n" + "\t.long .Lbegin\n" + "\t.long %d\n" + "\t.byte 0xe\n\t.uleb128 %d\n" + "\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n", + (int)ctx->codesz, CFRAME_SIZE); + for (i = 14; i <= 31; i++) + fprintf(ctx->fp, + "\t.byte %d\n\t.uleb128 %d\n" + "\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"); + fprintf(ctx->fp, "\t.section .eh_frame,\"a\",@progbits\n"); + fprintf(ctx->fp, + ".Lframe1:\n" + "\t.long .LECIE1-.LSCIE1\n" + ".LSCIE1:\n" + "\t.long 0\n" + "\t.byte 0x1\n" + "\t.string \"zPR\"\n" + "\t.uleb128 0x1\n" + "\t.sleb128 -4\n" + "\t.byte 65\n" + "\t.uleb128 6\n" /* augmentation length */ + "\t.byte 0x1b\n" /* pcrel|sdata4 */ + "\t.long lj_err_unwind_dwarf-.\n" + "\t.byte 0x1b\n" /* pcrel|sdata4 */ + "\t.byte 0xc\n\t.uleb128 1\n\t.uleb128 0\n" + "\t.align 2\n" + ".LECIE1:\n\n"); + fprintf(ctx->fp, + ".LSFDE1:\n" + "\t.long .LEFDE1-.LASFDE1\n" + ".LASFDE1:\n" + "\t.long .LASFDE1-.Lframe1\n" + "\t.long .Lbegin-.\n" + "\t.long %d\n" + "\t.uleb128 0\n" /* augmentation length */ + "\t.byte 0xe\n\t.uleb128 %d\n" + "\t.byte 0x11\n\t.uleb128 65\n\t.sleb128 -1\n", + (int)ctx->codesz, CFRAME_SIZE); + for (i = 14; i <= 31; i++) + fprintf(ctx->fp, + "\t.byte %d\n\t.uleb128 %d\n" + "\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"); + break; + default: + break; + } +} + diff --git a/src/lj_arch.h b/src/lj_arch.h index 03da79a6..826c54c1 100644 --- a/src/lj_arch.h +++ b/src/lj_arch.h @@ -166,8 +166,6 @@ #define LJ_ARCH_NOFFI 1 /* NYI: comparisons, calls. */ #define LJ_ARCH_NOJIT 1 -#error "No support for plain PowerPC CPUs (yet)" - #elif LUAJIT_TARGET == LUAJIT_ARCH_PPCSPE #define LJ_ARCH_NAME "ppcspe" diff --git a/src/lj_frame.h b/src/lj_frame.h index f09b73d0..2baf44a8 100644 --- a/src/lj_frame.h +++ b/src/lj_frame.h @@ -104,8 +104,8 @@ enum { #define CFRAME_OFS_NRES 24 #define CFRAME_OFS_PREV 20 #define CFRAME_OFS_L 16 -#define CFRAME_OFS_PC 12 -#define CFRAME_OFS_MULTRES 8 +#define CFRAME_OFS_PC 8 +#define CFRAME_OFS_MULTRES 12 #define CFRAME_SIZE 256 #define CFRAME_SHIFT_MULTRES 3 #elif LJ_TARGET_PPCSPE