diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc index de3346cb..9130ee41 100644 --- a/src/buildvm_ppc.dasc +++ b/src/buildvm_ppc.dasc @@ -30,8 +30,8 @@ |.define TISNUM, r22 |.define TISNIL, r23 |.define ZERO, r24 -|.define TOBIT, f30 -|.define TONUM, f31 +|.define TOBIT, f30 // 2^52 + 2^51. +|.define TONUM, f31 // 2^52 + 2^51 + 2^31. | |// The following temporaries are not saved across C calls, except for RA. |.define RA, r20 // Callee-save. @@ -652,11 +652,18 @@ static void build_subroutines(BuildCtx *ctx) | b >1 | |->vmeta_tgetb: // TMP0 = index - | tonum_u f0, TMP0 + if (!LJ_DUALNUM) { + | tonum_u f0, TMP0 + } | decode_RB8 RB, INS | la CARG3, DISPATCH_GL(tmptv)(DISPATCH) | add CARG2, BASE, RB - | stfd f0, 0(CARG3) + if (LJ_DUALNUM) { + | stw TISNUM, 0(CARG3) + | stw TMP0, 4(CARG3) + } else { + | stfd f0, 0(CARG3) + } | b >1 | |->vmeta_tgetv: @@ -710,11 +717,18 @@ static void build_subroutines(BuildCtx *ctx) | b >1 | |->vmeta_tsetb: // TMP0 = index - | tonum_u f0, TMP0 + if (!LJ_DUALNUM) { + | tonum_u f0, TMP0 + } | decode_RB8 RB, INS | la CARG3, DISPATCH_GL(tmptv)(DISPATCH) | add CARG2, BASE, RB - | stfd f0, 0(CARG3) + if (LJ_DUALNUM) { + | stw TISNUM, 0(CARG3) + | stw TMP0, 4(CARG3) + } else { + | stfd f0, 0(CARG3) + } | b >1 | |->vmeta_tsetv: @@ -752,9 +766,17 @@ static void build_subroutines(BuildCtx *ctx) |->vmeta_comp: | mr CARG1, L | subi PC, PC, 4 - | add CARG2, BASE, RA + if (LJ_DUALNUM) { + | mr CARG2, RA + } else { + | add CARG2, BASE, RA + } | stw PC, SAVE_PC - | add CARG3, BASE, RD + if (LJ_DUALNUM) { + | mr CARG3, RD + } else { + | add CARG3, BASE, RD + } | stw BASE, L->base | decode_OP1 CARG4, INS | bl extern lj_meta_comp // (lua_State *L, TValue *o1, *o2, int op) @@ -803,26 +825,53 @@ static void build_subroutines(BuildCtx *ctx) | // Returns 0/1 or TValue * (metamethod). | b <3 | - |//-- Arithmetic metamethods --------------------------------------------- + |->vmeta_equal_cd: +#if LJ_HASFFI + | mr CARG2, INS + | subi PC, PC, 4 + | stw BASE, L->base + | mr CARG1, L + | stw PC, SAVE_PC + | bl extern lj_meta_equal_cd // (lua_State *L, BCIns op) + | // Returns 0/1 or TValue * (metamethod). + | b <3 +#endif | - |->vmeta_arith_vn: - | add CARG3, BASE, RB - | add CARG4, KBASE, RC - | b >1 + |//-- Arithmetic metamethods --------------------------------------------- | |->vmeta_arith_nv: | add CARG3, KBASE, RC | add CARG4, BASE, RB | b >1 + |->vmeta_arith_nv2: + if (LJ_DUALNUM) { + | mr CARG3, RC + | mr CARG4, RB + | b >1 + } | |->vmeta_unm: | mr CARG3, RD | mr CARG4, RD | b >1 | + |->vmeta_arith_vn: + | add CARG3, BASE, RB + | add CARG4, KBASE, RC + | b >1 + | |->vmeta_arith_vv: | add CARG3, BASE, RB | add CARG4, BASE, RC + if (LJ_DUALNUM) { + | b >1 + } + |->vmeta_arith_vn2: + |->vmeta_arith_vv2: + if (LJ_DUALNUM) { + | mr CARG3, RB + | mr CARG4, RC + } |1: | add CARG2, BASE, RA | stw BASE, L->base @@ -1109,7 +1158,11 @@ static void build_subroutines(BuildCtx *ctx) | ffgccheck | mr CARG1, L | mr CARG2, BASE - | bl extern lj_str_fromnum // (lua_State *L, lua_Number *np) + if (LJ_DUALNUM) { + | bl extern lj_str_fromnumber // (lua_State *L, cTValue *o) + } else { + | bl extern lj_str_fromnum // (lua_State *L, lua_Number *np) + } | // Returns GCstr *. | li CARG3, LJ_TSTR | b ->fff_restv @@ -1167,26 +1220,43 @@ static void build_subroutines(BuildCtx *ctx) | lwz CARG3, 0(BASE) | lwz TAB:CARG1, 4(BASE) | lwz CARG4, 8(BASE) - | lfd FARG2, 8(BASE) + if (LJ_DUALNUM) { + | lwz TMP2, 12(BASE) + } else { + | lfd FARG2, 8(BASE) + } | blt ->fff_fallback | checktab CARG3 | checknum cr1, CARG4 | lwz PC, FRAME_PC(BASE) - | 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 + if (LJ_DUALNUM) { + | bne ->fff_fallback + | bne cr1, ->fff_fallback + } else { + | 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 | lwz TMP1, TAB:CARG1->array - | fadd FARG2, FARG2, FARG1 + if (!LJ_DUALNUM) { + | fadd FARG2, FARG2, FARG1 + } | addi TMP2, TMP2, 1 | la RA, -8(BASE) | cmplw TMP0, TMP2 - | slwi TMP3, TMP2, 3 - | stfd FARG2, 0(RA) + if (LJ_DUALNUM) { + | stw TISNUM, 0(RA) + | slwi TMP3, TMP2, 3 + | stw TMP2, 4(RA) + } else { + | slwi TMP3, TMP2, 3 + | stfd FARG2, 0(RA) + } | ble >2 // Not in array part? | lwzx TMP2, TMP1, TMP3 | lfdx f0, TMP1, TMP3 @@ -1226,7 +1296,11 @@ static void build_subroutines(BuildCtx *ctx) | lfd f0, CFUNC:RB->upvalue[0] | la RA, -8(BASE) #endif - | stw ZERO, 8(BASE) + if (LJ_DUALNUM) { + | stw TISNUM, 8(BASE) + } else { + | stw ZERO, 8(BASE) + } | stw ZERO, 12(BASE) | li RD, (3+1)*8 | stfd f0, 0(RA) @@ -1401,7 +1475,26 @@ static void build_subroutines(BuildCtx *ctx) |//-- Math library ------------------------------------------------------- | |.ffunc_1 math_abs - | checknum CARG3; bge ->fff_fallback + | checknum CARG3 + if (LJ_DUALNUM) { + | bne >2 + | srawi TMP1, CARG1, 31 + | xor TMP2, TMP1, CARG1 + | sub. CARG1, TMP2, TMP1 + | blt >1 + |->fff_resi: + | lwz PC, FRAME_PC(BASE) + | la RA, -8(BASE) + | stw TISNUM, -8(BASE) + | stw CRET1, -4(BASE) + | b ->fff_res1 + |1: + | lus CARG3, 0x41e0 // 2^31. + | li CARG1, 0 + | b ->fff_restv + |2: + } + | bge ->fff_fallback | rlwinm CARG3, CARG3, 0, 1, 31 | // Fallthrough. | @@ -1448,9 +1541,85 @@ static void build_subroutines(BuildCtx *ctx) | b ->fff_resn |.endmacro | - | // NYI: Use internal implementation. - | math_extern floor - | math_extern ceil + |.macro math_round, func + | .ffunc_1 math_ .. func + | checknum CARG3; beq ->fff_restv + | rlwinm TMP2, CARG3, 12, 21, 31 + | bge ->fff_fallback + | addic. TMP2, TMP2, -1023 // exp = exponent(x) - 1023 + | cmplwi cr1, TMP2, 31 // 0 <= exp < 31? + | subfic TMP0, TMP2, 31 + | blt >3 + | slwi TMP1, CARG3, 11 + | srwi TMP3, CARG1, 21 + | oris TMP1, TMP1, 0x8000 + | addi TMP2, TMP2, 1 + | or TMP1, TMP1, TMP3 + | slwi CARG2, CARG1, 11 + | bge cr1, >4 + | slw TMP3, TMP1, TMP2 + | srw CARG1, TMP1, TMP0 + | or TMP3, TMP3, CARG2 + | srawi TMP2, CARG3, 31 + |.if "func" == "floor" + | and TMP1, TMP3, TMP2 + | addic TMP0, TMP1, -1 + | subfe TMP1, TMP0, TMP1 + | add CARG1, CARG1, TMP1 + | xor CARG1, CARG1, TMP2 + | sub CARG1, CARG1, TMP2 + | b ->fff_resi + |.else + | andc TMP1, TMP3, TMP2 + | addic TMP0, TMP1, -1 + | subfe TMP1, TMP0, TMP1 + | addo. CARG1, CARG1, TMP1 + | xor CARG1, CARG1, TMP2 + | sub CARG1, CARG1, TMP2 + | bns ->fff_resi + | // Potential overflow. + | mcrxr cr0; ble ->fff_resi // Ignore unrelated overflow. + | lus CARG3, 0x41e0 // 2^31. + | li CARG1, 0 + | b ->fff_restv + |.endif + |3: // |x| < 1 + | add TMP2, CARG3, CARG3 + | srawi TMP1, CARG3, 31 + | or TMP2, CARG1, TMP2 // ztest = (hi+hi) | lo + |.if "func" == "floor" + | and TMP1, TMP2, TMP1 // (ztest & sign) == 0 ? 0 : -1 + | subfic TMP2, TMP1, 0 + | subfe CARG1, CARG1, CARG1 + |.else + | andc TMP1, TMP2, TMP1 // (ztest & ~sign) == 0 ? 0 : 1 + | addic TMP2, TMP1, -1 + | subfe CARG1, TMP2, TMP1 + |.endif + | b ->fff_resi + |4: // exp >= 31. Check for -(2^31). + | xoris TMP1, TMP1, 0x8000 + | srawi TMP2, CARG3, 31 + |.if "func" == "floor" + | or TMP1, TMP1, CARG2 + |.endif + | orc. TMP1, TMP1, TMP2 + | crand 4*cr0+eq, 4*cr0+eq, 4*cr1+eq + | lus CARG1, 0x8000 // -(2^31). + | beq ->fff_resi + |5: + | bl extern func + | b ->fff_resn + |.endmacro + | + if (LJ_DUALNUM) { + | math_round floor + | math_round ceil + } else { + | // NYI: use internal implementation. + | math_extern floor + | math_extern ceil + } | | math_extern sqrt | math_extern log @@ -1475,8 +1644,20 @@ static void build_subroutines(BuildCtx *ctx) | fmul FARG1, FARG1, FARG2 | b ->fff_resn | - |.ffunc_nn math_ldexp - | toint CARG1, FARG2 + if (LJ_DUALNUM) { + |.ffunc math_ldexp + | cmplwi NARGS8:RC, 16 + | lwz CARG3, 0(BASE) + | lfd FARG1, 0(BASE) + | lwz CARG4, 8(BASE) + | lwz CARG1, 12(BASE) + | blt ->fff_fallback + | checknum CARG3; bge ->fff_fallback + | checknum CARG4; bne ->fff_fallback + } else { + |.ffunc_nn math_ldexp + | toint CARG1, FARG2 + } | bl extern ldexp | b ->fff_resn | @@ -1486,10 +1667,17 @@ static void build_subroutines(BuildCtx *ctx) | bl extern frexp | lwz TMP1, DISPATCH_GL(tmptv)(DISPATCH) | la RA, -8(BASE) - | tonum_i FARG2, TMP1 + if (!LJ_DUALNUM) { + | tonum_i FARG2, TMP1 + } | stfd FARG1, 0(RA) | li RD, (2+1)*8 - | stfd FARG2, 8(RA) + if (LJ_DUALNUM) { + | stw TISNUM, 8(RA) + | stw TMP1, 12(RA) + } else { + | stfd FARG2, 8(RA) + } | b ->fff_res | |.ffunc_n math_modf @@ -1502,6 +1690,61 @@ static void build_subroutines(BuildCtx *ctx) | b ->fff_res | |.macro math_minmax, name, ismax + ||if (LJ_DUALNUM) { + | .ffunc_1 name + | checknum CARG3 + | addi TMP1, BASE, 8 + | add TMP2, BASE, NARGS8:RC + | bne >4 + |1: // Handle integers. + | lwz CARG4, 0(TMP1) + | cmplw cr1, TMP1, TMP2 + | lwz CARG2, 4(TMP1) + | bge cr1, ->fff_resi + | checknum CARG4 + | xoris TMP0, CARG1, 0x8000 + | xoris TMP3, CARG2, 0x8000 + | bne >3 + | subfc TMP3, TMP3, TMP0 + | subfe TMP0, TMP0, TMP0 + |.if ismax + | andc TMP3, TMP3, TMP0 + |.else + | and TMP3, TMP3, TMP0 + |.endif + | add CARG1, TMP3, CARG2 + | addi TMP1, TMP1, 8 + | b <1 + |3: + | bge ->fff_fallback + | // Convert intermediate result to number and continue below. + | tonum_i FARG1, CARG1 + | lfd FARG2, 0(TMP1) + | b >6 + |4: + | lfd FARG1, 0(BASE) + | bge ->fff_fallback + |5: // Handle numbers. + | lwz CARG4, 0(TMP1) + | cmplw cr1, TMP1, TMP2 + | lfd FARG2, 0(TMP1) + | bge cr1, ->fff_resn + | checknum CARG4; bge >7 + |6: + | fsub f0, FARG1, FARG2 + | addi TMP1, TMP1, 8 + |.if ismax + | fsel FARG1, f0, FARG1, FARG2 + |.else + | fsel FARG1, f0, FARG2, FARG1 + |.endif + | b <5 + |7: // Convert integer to number and continue above. + | lwz CARG2, 4(TMP1) + | bne ->fff_fallback + | tonum_i FARG2, CARG2 + | b <6 + ||} else { | .ffunc_n name | li TMP1, 8 |1: @@ -1519,6 +1762,7 @@ static void build_subroutines(BuildCtx *ctx) | fsel FARG1, f0, FARG2, FARG1 |.endif | b <1 + ||} |.endmacro | | math_minmax math_min, 0 @@ -1539,28 +1783,45 @@ static void build_subroutines(BuildCtx *ctx) | checkstr CARG3 | bne ->fff_fallback | lwz TMP0, STR:CARG1->len - | 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 + if (LJ_DUALNUM) { + | lbz CARG1, STR:CARG1[1] // Access is always ok (NUL at end). + | li RD, (0+1)*8 + | lwz PC, FRAME_PC(BASE) + | cmplwi TMP0, 0 + | la RA, -8(BASE) + | beq ->fff_res + | b ->fff_resi + } else { + | 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 | lwz CARG3, 0(BASE) - | lfd FARG1, 0(BASE) - | bne ->fff_fallback // Exactly 1 argument. - | checknum CARG3; bge ->fff_fallback - | toint TMP0, FARG1 - | la CARG2, TMPD_BLO + if (LJ_DUALNUM) { + | lwz TMP0, 4(BASE) + | bne ->fff_fallback // Exactly 1 argument. + | checknum CARG3; bne ->fff_fallback + | la CARG2, 7(BASE) + } else { + | lfd FARG1, 0(BASE) + | bne ->fff_fallback // Exactly 1 argument. + | checknum CARG3; bge ->fff_fallback + | toint TMP0, FARG1 + | la CARG2, TMPD_BLO + } | li CARG3, 1 | cmplwi TMP0, 255; bgt ->fff_fallback |->fff_newstr: @@ -1577,20 +1838,36 @@ static void build_subroutines(BuildCtx *ctx) | ffgccheck | cmplwi NARGS8:RC, 16 | lwz CARG3, 16(BASE) - | lfd f0, 16(BASE) + if (!LJ_DUALNUM) { + | lfd f0, 16(BASE) + } | lwz TMP0, 0(BASE) | lwz STR:CARG1, 4(BASE) | blt ->fff_fallback | lwz CARG2, 8(BASE) - | lfd f1, 8(BASE) + if (LJ_DUALNUM) { + | lwz TMP1, 12(BASE) + } else { + | lfd f1, 8(BASE) + } | li TMP2, -1 | beq >1 - | checknum CARG3; bge ->fff_fallback - | toint TMP2, f0 - |1: - | checknum CARG2; bge ->fff_fallback + if (LJ_DUALNUM) { + | checknum CARG3 + | lwz TMP2, 20(BASE) + | bne ->fff_fallback + |1: + | checknum CARG2; bne ->fff_fallback + } else { + | checknum CARG3; bge ->fff_fallback + | toint TMP2, f0 + |1: + | checknum CARG2; bge ->fff_fallback + } | checkstr TMP0; bne ->fff_fallback - | toint TMP1, f1 + if (!LJ_DUALNUM) { + | toint TMP1, f1 + } | lwz TMP0, STR:CARG1->len | cmplw TMP0, TMP2 // len < end? (unsigned compare) | addi TMP3, TMP2, 1 @@ -1627,14 +1904,22 @@ static void build_subroutines(BuildCtx *ctx) |.ffunc string_rep // Only handle the 1-char case inline. | ffgccheck | cmplwi NARGS8:RC, 16 - | lwz CARG3, 0(BASE) + | lwz TMP0, 0(BASE) | lwz STR:CARG1, 4(BASE) | lwz CARG4, 8(BASE) - | lfd FARG2, 8(BASE) + if (LJ_DUALNUM) { + | lwz CARG3, 12(BASE) + } else { + | lfd FARG2, 8(BASE) + } | blt ->fff_fallback - | checkstr CARG3; bne ->fff_fallback - | checknum CARG4; bge ->fff_fallback - | toint CARG3, FARG2 + | checkstr TMP0; bne ->fff_fallback + if (LJ_DUALNUM) { + | checknum CARG4; bne ->fff_fallback + } else { + | checknum CARG4; bge ->fff_fallback + | toint CARG3, FARG2 + } | lwz TMP0, STR:CARG1->len | cmpwi CARG3, 0 | lwz TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH) @@ -1728,34 +2013,39 @@ static void build_subroutines(BuildCtx *ctx) |//-- Bit library -------------------------------------------------------- | |.macro .ffunc_bit, name + ||if (LJ_DUALNUM) { + | .ffunc_1 bit_..name + | checknum CARG3; bnel ->fff_tobit_fb + ||} else { | .ffunc_n bit_..name | fadd FARG1, FARG1, TOBIT | stfd FARG1, TMPD | lwz CARG1, TMPD_LO + ||} |.endmacro | - |.ffunc_bit tobit - |->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 + | addi TMP1, BASE, 8 + | add TMP2, BASE, NARGS8:RC |1: - | lwzx CARG4, BASE, TMP1 - | cmplw cr1, TMP1, NARGS8:RC - | lfdx FARG1, BASE, TMP1 - | checknum CARG4 + | lwz CARG4, 0(TMP1) + | cmplw cr1, TMP1, TMP2 + ||if (LJ_DUALNUM) { + | lwz CARG2, 4(TMP1) + ||} else { + | lfd FARG1, 0(TMP1) + ||} | bge cr1, ->fff_resi + | checknum CARG4 + ||if (LJ_DUALNUM) { + | bnel ->fff_bitop_fb + ||} else { | fadd FARG1, FARG1, TOBIT | bge ->fff_fallback | stfd FARG1, TMPD | lwz CARG2, TMPD_LO + ||} | ins CARG1, CARG1, CARG2 | addi TMP1, TMP1, 8 | b <1 @@ -1777,6 +2067,12 @@ static void build_subroutines(BuildCtx *ctx) | b ->fff_resi | |.macro .ffunc_bit_sh, name, ins, shmod + ||if (LJ_DUALNUM) { + | .ffunc_2 bit_..name + | checknum CARG3; bnel ->fff_tobit_fb + | // Note: no inline conversion from number for 2nd argument! + | checknum CARG4; bne ->fff_fallback + ||} else { | .ffunc_nn bit_..name | fadd FARG1, FARG1, TOBIT | fadd FARG2, FARG2, TOBIT @@ -1784,6 +2080,7 @@ static void build_subroutines(BuildCtx *ctx) | lwz CARG1, TMPD_LO | stfd FARG2, TMPD | lwz CARG2, TMPD_LO + ||} |.if shmod == 1 | rlwinm CARG2, CARG2, 0, 27, 31 |.elif shmod == 2 @@ -1799,6 +2096,39 @@ static void build_subroutines(BuildCtx *ctx) |.ffunc_bit_sh rol, rotlw, 0 |.ffunc_bit_sh ror, rotlw, 2 | + |.ffunc_bit tobit + if (LJ_DUALNUM) { + | b ->fff_resi + } else { + |->fff_resi: + | tonum_i FARG1, CRET1 + } + |->fff_resn: + | lwz PC, FRAME_PC(BASE) + | la RA, -8(BASE) + | stfd FARG1, -8(BASE) + | b ->fff_res1 + | + |// Fallback FP number to bit conversion. + |->fff_tobit_fb: + if (LJ_DUALNUM) { + | lfd FARG1, 0(BASE) + | bgt ->fff_fallback + | fadd FARG1, FARG1, TOBIT + | stfd FARG1, TMPD + | lwz CARG1, TMPD_LO + | blr + } + |->fff_bitop_fb: + if (LJ_DUALNUM) { + | lfd FARG1, 0(TMP1) + | bgt ->fff_fallback + | fadd FARG1, FARG1, TOBIT + | stfd FARG1, TMPD + | lwz CARG2, TMPD_LO + | blr + } + | |//----------------------------------------------------------------------- | |->fff_fallback: // Call fast function fallback handler. @@ -1980,6 +2310,17 @@ static void build_subroutines(BuildCtx *ctx) #if LJ_HASJIT | b extern trunc #endif + | + |->vm_modi: + | divwo. TMP0, CARG1, CARG2 + | bsolr + | xor. CARG3, CARG1, CARG2 + | mullw TMP0, TMP0, CARG2 + | sub CARG1, CARG1, TMP0 + | bgelr + | cmpwi CARG1, 0; beqlr + | add CARG1, CARG1, CARG2 + | blr | |->vm_powi: #if LJ_HASJIT @@ -2060,64 +2401,142 @@ 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 - | lwzx TMP0, BASE, RA - | addi PC, PC, 4 - | lfdx f0, BASE, RA - | lwzx TMP1, BASE, RD - | checknum cr0, TMP0 - | lwz TMP2, -4(PC) - | lfdx f1, BASE, RD - | checknum cr1, TMP1 - | decode_RD4 TMP2, TMP2 - | 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 + if (LJ_DUALNUM) { + | lwzux TMP0, RA, BASE + | addi PC, PC, 4 + | lwz CARG2, 4(RA) + | lwzux TMP1, RD, BASE + | lwz TMP2, -4(PC) + | checknum cr0, TMP0 + | lwz CARG3, 4(RD) + | decode_RD4 TMP2, TMP2 + | checknum cr1, TMP1 + | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16) + | bne cr0, >7 + | bne cr1, >8 + | cmpw CARG2, CARG3 + if (op == BC_ISLT) { + | bge >2 + } else if (op == BC_ISGE) { + | blt >2 + } else if (op == BC_ISLE) { + | bgt >2 + } else { + | ble >2 + } + |1: + | add PC, PC, TMP2 + |2: + | ins_next + | + |7: // RA is not an integer. + | bgt cr0, ->vmeta_comp + | // RA is a number. + | lfd f0, 0(RA) + | bgt cr1, ->vmeta_comp + | blt cr1, >4 + | // RA is a number, RD is an integer. + | tonum_i f1, CARG3 + | b >5 + | + |8: // RA is an integer, RD is a number. + | tonum_i f0, CARG2 + |4: + | lfd f1, 0(RD) + |5: + | fcmpu cr0, f0, f1 + if (op == BC_ISLT) { + | bge <2 + } else if (op == BC_ISGE) { + | blt <2 + } else if (op == BC_ISLE) { + | cror 4*cr0+lt, 4*cr0+lt, 4*cr0+eq + | bge <2 + } else { + | cror 4*cr0+lt, 4*cr0+lt, 4*cr0+eq + | blt <2 + } + | b <1 } else { - | cror 4*cr0+lt, 4*cr0+lt, 4*cr0+eq - | blt >1 + | lwzx TMP0, BASE, RA + | addi PC, PC, 4 + | lfdx f0, BASE, RA + | lwzx TMP1, BASE, RD + | checknum cr0, TMP0 + | lwz TMP2, -4(PC) + | lfdx f1, BASE, RD + | checknum cr1, TMP1 + | decode_RD4 TMP2, TMP2 + | 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 { + | cror 4*cr0+lt, 4*cr0+lt, 4*cr0+eq + | blt >1 + } + | add PC, PC, TMP2 + |1: + | ins_next } - | 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 - | lwzux TMP0, RA, BASE - | lwz TMP2, 0(PC) - | lfd f0, 0(RA) - | addi PC, PC, 4 - | lwzux TMP1, RD, BASE - | checknum cr0, TMP0 - | decode_RD4 TMP2, TMP2 - | 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) { - | bne >1 - | add PC, PC, TMP2 + if (LJ_DUALNUM) { + | lwzux TMP0, RA, BASE + | addi PC, PC, 4 + | lwz CARG2, 4(RA) + | lwzux TMP1, RD, BASE + | checknum cr0, TMP0 + | lwz INS, -4(PC) + | checknum cr1, TMP1 + | decode_RD4 TMP2, INS + | lwz CARG3, 4(RD) + | cror 4*cr7+gt, 4*cr0+gt, 4*cr1+gt + | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16) + if (vk) { + | ble cr7, ->BC_ISEQN_Z + } else { + | ble cr7, ->BC_ISNEN_Z + } } else { - | beq >1 - | add PC, PC, TMP2 + | lwzux TMP0, RA, BASE + | lwz TMP2, 0(PC) + | lfd f0, 0(RA) + | addi PC, PC, 4 + | lwzux TMP1, RD, BASE + | checknum cr0, TMP0 + | decode_RD4 TMP2, TMP2 + | 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) { + | bne >1 + | add PC, PC, TMP2 + } else { + | beq >1 + | add PC, PC, TMP2 + } + |1: + | ins_next } - |1: - | ins_next - | |5: // Either or both types are not numbers. - | lwz CARG2, 4(RA) - | lwz CARG3, 4(RD) + if (!LJ_DUALNUM) { + | lwz CARG2, 4(RA) + | lwz CARG3, 4(RD) + } | not TMP3, TMP0 | cmplw TMP0, TMP1 | cmplwi cr1, TMP3, ~LJ_TISPRI // Primitive? @@ -2138,7 +2557,14 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | add PC, PC, TMP2 |6: } - | blt cr0, <1 // Done if 1 or 2. + if (LJ_DUALNUM) { + | bge cr0, >2 // Done if 1 or 2. + |1: + | ins_next + |2: + } else { + | 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,32 +2609,84 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) case BC_ISEQN: case BC_ISNEN: vk = op == BC_ISEQN; | // RA = src*8, RD = num_const*8, JMP with RD = target - | lwzx TMP0, BASE, RA - | lfdx f0, BASE, RA - | addi PC, PC, 4 - | lfdx f1, KBASE, RD - | lwz INS, -4(PC) - | checknum TMP0; bge >5 - | fcmpu cr0, f0, f1 - | decode_RD4 TMP2, INS - | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16) + if (LJ_DUALNUM) { + | lwzux TMP0, RA, BASE + | addi PC, PC, 4 + | lwz CARG2, 4(RA) + | lwzux TMP1, RD, KBASE + | checknum cr0, TMP0 + | lwz INS, -4(PC) + | checknum cr1, TMP1 + | decode_RD4 TMP2, INS + | lwz CARG3, 4(RD) + | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16) + if (vk) { + |->BC_ISEQN_Z: + } else { + |->BC_ISNEN_Z: + } + | bne cr0, >7 + | bne cr1, >8 + | cmpw CARG2, CARG3 + |4: + } else { + if (vk) { + |->BC_ISEQN_Z: // Dummy label. + } else { + |->BC_ISNEN_Z: // Dummy label. + } + | lwzx TMP0, BASE, RA + | addi PC, PC, 4 + | lfdx f0, BASE, RA + | lwz INS, -4(PC) + | lfdx f1, KBASE, RD + | decode_RD4 TMP2, INS + | checknum TMP0 + | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16) + | bge >3 + | fcmpu cr0, f0, f1 + } if (vk) { - | bne >5 + | bne >1 | add PC, PC, TMP2 - |5: + |1: + if (!LJ_HASFFI) { + |3: + } } else { | beq >2 |1: + if (!LJ_HASFFI) { + |3: + } | add PC, PC, TMP2 |2: } | ins_next - if (!vk) { - |5: - | decode_RD4 TMP2, INS - | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16) + if (LJ_HASFFI) { + |3: + | cmpwi TMP0, LJ_TCDATA + | beq ->vmeta_equal_cd | b <1 } + if (LJ_DUALNUM) { + |7: // RA is not an integer. + | bge cr0, <3 + | // RA is a number. + | lfd f0, 0(RA) + | blt cr1, >1 + | // RA is a number, RD is an integer. + | tonum_i f1, CARG3 + | b >2 + | + |8: // RA is an integer, RD is a number. + | tonum_i f0, CARG2 + |1: + | lfd f1, 0(RD) + |2: + | fcmpu cr0, f0, f1 + | b <4 + } break; case BC_ISEQP: case BC_ISNEP: @@ -2291,12 +2769,35 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | // RA = dst*8, RD = src*8 | lwzux TMP1, RD, BASE | lwz TMP0, 4(RD) - | checknum TMP1; bge ->vmeta_unm + | checknum TMP1 + if (LJ_DUALNUM) { + | bne >5 + | nego. TMP0, TMP0 + | bso >4 + |1: + | ins_next1 + | stwux TISNUM, RA, BASE + | stw TMP0, 4(RA) + |3: + | ins_next2 + |4: // Potential overflow. + | mcrxr cr0; ble <1 // Ignore unrelated overflow. + | lus TMP1, 0x41e0 // 2^31. + | li TMP0, 0 + | b >7 + } + |5: + | bge ->vmeta_unm | xoris TMP1, TMP1, 0x8000 + |7: | ins_next1 | stwux TMP1, RA, BASE | stw TMP0, 4(RA) - | ins_next2 + if (LJ_DUALNUM) { + | b <3 + } else { + | ins_next2 + } break; case BC_LEN: | // RA = dst*8, RD = src*8 @@ -2305,9 +2806,15 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | checkstr TMP0; bne >2 | lwz CRET1, STR:CARG1->len |1: - | tonum_u f0, CRET1 // Result is a non-negative integer. - | ins_next1 - | stfdx f0, BASE, RA + if (LJ_DUALNUM) { + | ins_next1 + | stwux TISNUM, RA, BASE + | stw CRET1, 4(RA) + } else { + | tonum_u f0, CRET1 // Result is a non-negative integer. + | ins_next1 + | stfdx f0, BASE, RA + } | ins_next2 |2: | checktab TMP0; bne ->vmeta_len @@ -2332,78 +2839,197 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) /* -- Binary ops -------------------------------------------------------- */ - |.macro ins_arithpre, t0, t1 + |.macro ins_arithpre | // RA = dst*8, RB = src1*8, RC = src2*8 | num_const*8 ||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); ||switch (vk) { ||case 0: - | lwzx CARG1, BASE, RB - | lfdx t0, BASE, RB - | lfdx t1, KBASE, RC - | checknum CARG1; bge ->vmeta_arith_vn + | lwzx TMP1, BASE, RB + ||if (LJ_DUALNUM) { + | lwzx TMP2, KBASE, RC + ||} + | lfdx f14, BASE, RB + | lfdx f15, KBASE, RC + ||if (LJ_DUALNUM) { + | checknum cr0, TMP1 + | checknum cr1, TMP2 + | crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt + | bge ->vmeta_arith_vn + ||} else { + | checknum TMP1; bge ->vmeta_arith_vn + ||} || break; ||case 1: - | lwzx CARG1, BASE, RB - | lfdx t1, BASE, RB - | lfdx t0, KBASE, RC - | checknum CARG1; bge ->vmeta_arith_nv + | lwzx TMP1, BASE, RB + ||if (LJ_DUALNUM) { + | lwzx TMP2, KBASE, RC + ||} + | lfdx f15, BASE, RB + | lfdx f14, KBASE, RC + ||if (LJ_DUALNUM) { + | checknum cr0, TMP1 + | checknum cr1, TMP2 + | crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt + | bge ->vmeta_arith_nv + ||} else { + | checknum TMP1; bge ->vmeta_arith_nv + ||} || break; ||default: - | lwzx CARG1, BASE, RB - | lwzx CARG2, BASE, RC - | lfdx t0, BASE, RB - | lfdx t1, BASE, RC - | checknum cr0, CARG1 - | checknum cr1, CARG2 + | lwzx TMP1, BASE, RB + | lwzx TMP2, BASE, RC + | lfdx f14, BASE, RB + | lfdx f15, BASE, RC + | checknum cr0, TMP1 + | checknum cr1, TMP2 | crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt | bge ->vmeta_arith_vv || break; ||} |.endmacro | - |.macro ins_arith, ins - | ins_arithpre f0, f1 + |.macro ins_arithfallback, ins + ||switch (vk) { + ||case 0: + | ins ->vmeta_arith_vn2 + || break; + ||case 1: + | ins ->vmeta_arith_nv2 + || break; + ||default: + | ins ->vmeta_arith_vv2 + || break; + ||} + |.endmacro + | + |.macro intmod, a, b, c + |->BC_MODVNI_Z: + | bl ->vm_modi + |.endmacro + | + |.macro fpmod, a, b, c + ||if (!LJ_DUALNUM) { + |->BC_MODVNI_Z: + ||} + |->BC_MODVN_Z: + | fdiv FARG1, b, c + | // NYI: Use internal implementation of floor. + | bl extern floor // floor(b/c) + | fmul a, FARG1, c + | fsub a, b, a // b - floor(b/c)*c + |.endmacro + | + |.macro ins_arithfp, fpins + | ins_arithpre + |.if "fpins" == "fpmod_" + | b ->BC_MODVN_Z // Avoid 3 copies. It's slow anyway. + |.else + | fpins f0, f14, f15 | ins_next1 - | ins f0, f0, f1 | stfdx f0, BASE, RA | ins_next2 + |.endif + |.endmacro + | + |.macro ins_arithdn, intins, fpins + | // RA = dst*8, RB = src1*8, RC = src2*8 | num_const*8 + ||vk = ((int)op - BC_ADDVN) / (BC_ADDNV-BC_ADDVN); + ||switch (vk) { + ||case 0: + | lwzux TMP1, RB, BASE + | lwzux TMP2, RC, KBASE + | lwz CARG1, 4(RB) + | checknum cr0, TMP1 + | lwz CARG2, 4(RC) + || break; + ||case 1: + | lwzux TMP1, RB, BASE + | lwzux TMP2, RC, KBASE + | lwz CARG2, 4(RB) + | checknum cr0, TMP1 + | lwz CARG1, 4(RC) + || break; + ||default: + | lwzux TMP1, RB, BASE + | lwzux TMP2, RC, BASE + | lwz CARG1, 4(RB) + | checknum cr0, TMP1 + | lwz CARG2, 4(RC) + || break; + ||} + | checknum cr1, TMP2 + | crand 4*cr0+eq, 4*cr0+eq, 4*cr1+eq + | bne >5 + |.if "intins" == "intmod_" + | b ->BC_MODVNI_Z // Avoid 3 copies. It's slow anyway. + |.else + | intins CARG1, CARG1, CARG2 + | bso >4 + |1: + | ins_next1 + | stwux TISNUM, RA, BASE + | stw CARG1, 4(RA) + |2: + | ins_next2 + |4: // Overflow. + | mcrxr cr0; ble <1 // Ignore unrelated overflow. + | ins_arithfallback b + |.endif + |5: // FP variant. + ||if (vk == 1) { + | lfd f15, 0(RB) + | crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt + | lfd f14, 0(RC) + ||} else { + | lfd f14, 0(RB) + | crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt + | lfd f15, 0(RC) + ||} + | ins_arithfallback bge + |.if "fpins" == "fpmod_" + | b ->BC_MODVN_Z // Avoid 3 copies. It's slow anyway. + |.else + | fpins f0, f14, f15 + | ins_next1 + | stfdx f0, BASE, RA + | b <2 + |.endif + |.endmacro + | + |.macro ins_arith, intins, fpins + ||if (LJ_DUALNUM) { + | ins_arithdn intins, fpins + ||} else { + | ins_arithfp fpins + ||} |.endmacro case BC_ADDVN: case BC_ADDNV: case BC_ADDVV: - | ins_arith fadd + | ins_arith addo., fadd break; case BC_SUBVN: case BC_SUBNV: case BC_SUBVV: - | ins_arith fsub + | ins_arith subo., fsub break; case BC_MULVN: case BC_MULNV: case BC_MULVV: - | ins_arith fmul + | ins_arith mullwo., fmul break; case BC_DIVVN: case BC_DIVNV: case BC_DIVVV: - | ins_arith fdiv + | ins_arithfp fdiv break; case BC_MODVN: - | ins_arithpre f14, f15 - |->BC_MODVN_Z: - | fdiv FARG1, f14, f15 - | // NYI: Use internal implementation of floor. - | bl extern floor // floor(b/c) - | fmul f0, FARG1, f15 - | ins_next1 - | fsub f0, f14, f0 // b - floor(b/c)*c - | stfdx f0, BASE, RA - | ins_next2 + | ins_arith intmod, fpmod break; case BC_MODNV: case BC_MODVV: - | ins_arithpre f14, f15 - | b ->BC_MODVN_Z // Avoid 3 copies. It's slow anyway. + | ins_arith intmod_, fpmod_ break; case BC_POW: - | lwzx CARG1, BASE, RB + | // NYI: (partial) integer arithmetic. + | lwzx TMP1, BASE, RB | lfdx FARG1, BASE, RB - | lwzx CARG2, BASE, RC + | lwzx TMP2, BASE, RC | lfdx FARG2, BASE, RC - | checknum cr0, CARG1 - | checknum cr1, CARG2 + | checknum cr0, TMP1 + | checknum cr1, TMP2 | crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt | bge ->vmeta_arith_vv | bl extern pow @@ -2459,33 +3085,42 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) break; case BC_KSHORT: | // RA = dst*8, RD = int16_literal*8 - | // NYI: which approach is faster? - |.if 1 - | slwi RD, RD, 13 - | srawi RD, RD, 16 - | tonum_i f0, RD - | ins_next1 - | 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 + if (LJ_DUALNUM) { + | slwi RD, RD, 13 + | srawi RD, RD, 16 + | ins_next1 + | stwux TISNUM, RA, BASE + | stw RD, 4(RA) + | ins_next2 + } else { + | // NYI: which approach is faster? + |.if 1 + | slwi RD, RD, 13 + | srawi RD, RD, 16 + | tonum_i f0, RD + | ins_next1 + | 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 @@ -2718,23 +3353,35 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | lwzux CARG1, RB, BASE | lwzux CARG2, RC, BASE | lwz TAB:RB, 4(RB) - | lfd f0, 0(RC) + if (LJ_DUALNUM) { + | lwz RC, 4(RC) + } else { + | lfd f0, 0(RC) + } | checktab CARG1 - | checknum cr1, CARG2 + | 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 - | fsub f2, f2, TOBIT - | lwz TMP2, TMPD_LO - | lwz TMP1, TAB:RB->array - | fcmpu cr1, f0, f2 - | cmplw cr0, TMP0, TMP2 - | crand 4*cr0+gt, 4*cr0+gt, 4*cr1+eq - | slwi TMP2, TMP2, 3 + if (LJ_DUALNUM) { + | lwz TMP0, TAB:RB->asize + | bne cr1, >5 + | lwz TMP1, TAB:RB->array + | cmplw TMP0, RC + | slwi TMP2, RC, 3 + } else { + | 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 + | fsub f2, f2, TOBIT + | lwz TMP2, TMPD_LO + | lwz TMP1, TAB:RB->array + | 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? | lwzx TMP0, TMP1, TMP2 | lfdx f14, TMP1, TMP2 @@ -2755,7 +3402,9 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |5: | checkstr CARG2; bne ->vmeta_tgetv - | lwz STR:RC, 4(RC) + if (!LJ_DUALNUM) { + | lwz STR:RC, 4(RC) + } | b ->BC_TGETS_Z // String key? break; case BC_TGETS: @@ -2838,23 +3487,35 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | lwzux CARG1, RB, BASE | lwzux CARG2, RC, BASE | lwz TAB:RB, 4(RB) - | lfd f0, 0(RC) + if (LJ_DUALNUM) { + | lwz RC, 4(RC) + } else { + | lfd f0, 0(RC) + } | checktab CARG1 - | checknum cr1, CARG2 + | 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 - | fsub f2, f2, TOBIT - | lwz TMP2, TMPD_LO - | lwz TMP1, TAB:RB->array - | fcmpu cr1, f0, f2 - | cmplw cr0, TMP0, TMP2 - | crand 4*cr0+gt, 4*cr0+gt, 4*cr1+eq - | slwi TMP0, TMP2, 3 + if (LJ_DUALNUM) { + | lwz TMP0, TAB:RB->asize + | bne cr1, >5 + | lwz TMP1, TAB:RB->array + | cmplw TMP0, RC + | slwi TMP0, RC, 3 + } else { + | 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 + | fsub f2, f2, TOBIT + | lwz TMP2, TMPD_LO + | lwz TMP1, TAB:RB->array + | 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? | lwzx TMP2, TMP1, TMP0 | lbz TMP3, TAB:RB->marked @@ -2878,7 +3539,9 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |5: | checkstr CARG2; bne ->vmeta_tsetv - | lwz STR:RC, 4(RC) + if (!LJ_DUALNUM) { + | lwz STR:RC, 4(RC) + } | b ->BC_TSETS_Z // String key? | |7: // Possible table write barrier for the value. Skip valiswhite check. @@ -3164,14 +3827,21 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | checknil TMP2 | lwz INS, -4(PC) | beq >4 - | tonum_u f1, RC + if (LJ_DUALNUM) { + | stw RC, 4(RA) + | stw TISNUM, 0(RA) + } else { + | tonum_u f1, RC + } | addi RC, RC, 1 | addis TMP3, PC, -(BCBIAS_J*4 >> 16) | stfd f0, 8(RA) | decode_RD4 TMP1, INS | stw RC, -4(RA) // Update control var. | add PC, TMP1, TMP3 - | stfd f1, 0(RA) + if (!LJ_DUALNUM) { + | stfd f1, 0(RA) + } |3: | ins_next | @@ -3424,28 +4094,96 @@ 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); + if (LJ_DUALNUM) { + | // Integer loop. + | lwzux TMP1, RA, BASE + | lwz CARG1, FORL_IDX*8+4(RA) + | cmplw cr0, TMP1, TISNUM + if (vk) { + | lwz CARG3, FORL_STEP*8+4(RA) + | bne >9 + | addo. CARG1, CARG1, CARG3 + | cmpwi cr6, CARG3, 0 + | lwz CARG2, FORL_STOP*8+4(RA) + | bso >6 + |4: + | stw CARG1, FORL_IDX*8+4(RA) + } else { + | lwz TMP3, FORL_STEP*8(RA) + | lwz CARG3, FORL_STEP*8+4(RA) + | lwz TMP2, FORL_STOP*8(RA) + | lwz CARG2, FORL_STOP*8+4(RA) + | cmplw cr7, TMP3, TISNUM + | cmplw cr1, TMP2, TISNUM + | crand 4*cr0+eq, 4*cr0+eq, 4*cr7+eq + | crand 4*cr0+eq, 4*cr0+eq, 4*cr1+eq + | cmpwi cr6, CARG3, 0 + | bne >9 + } + | blt cr6, >5 + | cmpw CARG1, CARG2 + |1: + | stw TISNUM, FORL_EXT*8(RA) + if (op != BC_JFORL) { + | srwi RD, RD, 1 + } + | stw CARG1, FORL_EXT*8+4(RA) + if (op != BC_JFORL) { + | add RD, PC, RD + } + if (op == BC_FORI) { + | bgt >3 // See FP loop below. + } else if (op == BC_JFORI) { + | addis PC, RD, -(BCBIAS_J*4 >> 16) + | ble =>BC_JLOOP + } else if (op == BC_IFORL) { + | bgt >2 + | addis PC, RD, -(BCBIAS_J*4 >> 16) + } else { + | ble =>BC_JLOOP + } + |2: + | ins_next + |5: // Invert check for negative step. + | cmpw CARG2, CARG1 + | b <1 + if (vk) { + |6: // Potential overflow. + | mcrxr cr0; ble <4 // Ignore unrelated overflow. + | b <2 + } + } if (vk) { - | lfdux f1, RA, BASE + if (LJ_DUALNUM) { + |9: // FP loop. + | lfd f1, FORL_IDX*8(RA) + } else { + | 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 + if (LJ_DUALNUM) { + |9: // FP loop. + } else { + | lwzux TMP1, RA, BASE + | lwz TMP3, FORL_STEP*8(RA) + | lwz TMP2, FORL_STOP*8(RA) + | cmplw cr0, TMP1, TISNUM + | cmplw cr7, TMP3, TISNUM + | cmplw cr1, TMP2, TISNUM + } | 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 + | lfd f3, FORL_STEP*8(RA) | crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt + | lfd f2, FORL_STOP*8(RA) | bge ->vmeta_for } - | cmpwi cr3, TMP3, 0 + | cmpwi cr6, TMP3, 0 if (op != BC_JFORL) { | srwi RD, RD, 1 } @@ -3457,22 +4195,30 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) if (op == BC_JFORI) { | addis PC, RD, -(BCBIAS_J*4 >> 16) } - | blt cr3, >5 + | blt cr6, >5 if (op == BC_FORI) { | bgt >3 } else if (op == BC_IFORL) { - | bgt >2 + if (LJ_DUALNUM) { + | bgt <2 + } else { + | bgt >2 + } |1: | addis PC, RD, -(BCBIAS_J*4 >> 16) } else { | ble =>BC_JLOOP } - |2: - | ins_next + if (LJ_DUALNUM) { + | b <2 + } else { + |2: + | ins_next + } |5: // Negative step. if (op == BC_FORI) { | bge <2 - |3: + |3: // Used by integer loop, too. | addis PC, RD, -(BCBIAS_J*4 >> 16) } else if (op == BC_IFORL) { | bge <1 diff --git a/src/buildvm_ppc.h b/src/buildvm_ppc.h index b5d80346..ba8d2862 100644 --- a/src/buildvm_ppc.h +++ b/src/buildvm_ppc.h @@ -12,7 +12,7 @@ #define DASM_SECTION_CODE_OP 0 #define DASM_SECTION_CODE_SUB 1 #define DASM_MAXSECTION 2 -static const unsigned int build_actionlist[5561] = { +static const unsigned int build_actionlist[7101] = { 0x00010001, 0x00060014, 0x72000000, @@ -802,14 +802,21 @@ static const unsigned int build_actionlist[5561] = { 0x48000000, 0x00050001, 0x0006002e, +0x00000000, 0x90010024, 0xc8010020, 0xfc00f028, +0x00000000, 0x54ea5d78, 0x38b10000, 0x00098200, 0x7c8e5214, +0x00000000, +0x92c50000, +0x90050004, +0x00000000, 0xd8050000, +0x00000000, 0x48000000, 0x00050001, 0x0006002f, @@ -853,7 +860,6 @@ static const unsigned int build_actionlist[5561] = { 0x00060030, 0x38b10000, 0x00098200, -0x00000000, 0x38000000, 0x00098200, 0x54ea5d78, @@ -878,14 +884,21 @@ static const unsigned int build_actionlist[5561] = { 0x48000000, 0x00050001, 0x00060032, +0x00000000, 0x90010024, 0xc8010020, 0xfc00f028, +0x00000000, 0x54ea5d78, 0x38b10000, 0x00098200, 0x7c8e5214, +0x00000000, +0x92c50000, +0x90050004, +0x00000000, 0xd8050000, +0x00000000, 0x48000000, 0x00050001, 0x00060033, @@ -930,12 +943,19 @@ static const unsigned int build_actionlist[5561] = { 0x00060034, 0x7e439378, 0x3a10fffc, +0x00000000, +0x7e84a378, +0x00000000, 0x7c8ea214, +0x00000000, 0x92010008, +0x00000000, +0x7d856378, +0x00000000, 0x7cae6214, +0x00000000, 0x91d20000, 0x00098200, -0x00000000, 0x54e6063e, 0x48000001, 0x00030003, @@ -996,10 +1016,18 @@ static const unsigned int build_actionlist[5561] = { 0x48000000, 0x0005000d, 0x0006003a, -0x7cae5214, -0x7ccf5a14, +0x00000000, +0x7ce43b78, +0x3a10fffc, +0x91d20000, +0x00098200, +0x7e439378, +0x92010008, +0x48000001, +0x00030005, 0x48000000, -0x00050001, +0x0005000d, +0x00000000, 0x0006003b, 0x7caf5a14, 0x7cce5214, @@ -1007,13 +1035,34 @@ static const unsigned int build_actionlist[5561] = { 0x00050001, 0x0006003c, 0x00000000, +0x7d655b78, +0x7d465378, +0x48000000, +0x00050001, +0x00000000, +0x0006003d, 0x7d856378, 0x7d866378, 0x48000000, 0x00050001, -0x0006003d, +0x0006003e, +0x7cae5214, +0x7ccf5a14, +0x48000000, +0x00050001, +0x0006003f, 0x7cae5214, 0x7cce5a14, +0x00000000, +0x48000000, +0x00050001, +0x00000000, +0x00060040, +0x00060041, +0x00000000, +0x7d455378, +0x7d665b78, +0x00000000, 0x0006000b, 0x7c8ea214, 0x91d20000, @@ -1022,7 +1071,7 @@ static const unsigned int build_actionlist[5561] = { 0x92010008, 0x54e7063e, 0x48000001, -0x00030005, +0x00030006, 0x28030000, 0x41820000, 0x0005082b, @@ -1036,7 +1085,7 @@ static const unsigned int build_actionlist[5561] = { 0x39600010, 0x48000000, 0x00050024, -0x0006003e, +0x00060042, 0x00000000, 0x7c751b78, 0x00000000, @@ -1046,14 +1095,14 @@ static const unsigned int build_actionlist[5561] = { 0x7e439378, 0x92010008, 0x48000001, -0x00030006, +0x00030007, 0x00000000, 0x28030000, 0x40820000, 0x00050835, 0x7ea3ab78, 0x48000000, -0x0005003f, +0x00050043, 0x00000000, 0x48000000, 0x00050035, @@ -1067,7 +1116,7 @@ static const unsigned int build_actionlist[5561] = { 0x7cae5a14, 0x7d755b78, 0x48000001, -0x00030007, +0x00030008, 0x814efffc, 0x39750008, 0x920efff8, @@ -1081,7 +1130,7 @@ static const unsigned int build_actionlist[5561] = { 0x7e947214, 0x7c0903a6, 0x4e800420, -0x00060040, +0x00060044, 0x7e439378, 0x91d20000, 0x00098200, @@ -1090,13 +1139,13 @@ static const unsigned int build_actionlist[5561] = { 0x7cb45a14, 0x7d755b78, 0x48000001, -0x00030007, +0x00030008, 0x810efff8, 0x39750008, 0x8154fffc, 0x48000000, -0x00050041, -0x00060042, +0x00050045, +0x00060046, 0x7e439378, 0x91d20000, 0x00098200, @@ -1104,7 +1153,7 @@ static const unsigned int build_actionlist[5561] = { 0x92010008, 0x7cf53b78, 0x48000001, -0x00030008, +0x00030009, 0x00000000, 0x56a0063e, 0x00000000, @@ -1120,24 +1169,24 @@ static const unsigned int build_actionlist[5561] = { 0x00000000, 0x48000000, 0x00070000, -0x00060043, +0x00060047, 0x280b0008, 0x80ae0000, 0x806e0004, 0x41800000, -0x00050844, +0x00050848, 0x39000000, 0x00098200, 0x3a8efff8, 0x7c854040, 0x820efff8, 0x40840000, -0x00050844, +0x00050848, 0x90b40000, 0x398b0008, 0x90740004, 0x41820000, -0x00050845, +0x00050849, 0x39000008, 0x396bfff8, 0x0006000b, @@ -1148,12 +1197,12 @@ static const unsigned int build_actionlist[5561] = { 0x40820000, 0x0005080b, 0x48000000, -0x00050045, -0x00060046, +0x00050049, +0x0006004a, 0x280b0008, 0x806e0000, 0x41800000, -0x00050844, +0x00050848, 0x7c161810, 0x7d231910, 0x7d280338, @@ -1165,13 +1214,13 @@ static const unsigned int build_actionlist[5561] = { 0x00098200, 0x7c2944ae, 0x48000000, -0x00050047, -0x00060048, +0x0005004b, +0x0006004c, 0x280b0008, 0x80ae0000, 0x806e0004, 0x41800000, -0x00050844, +0x00050848, 0x2c050000, 0x00098200, 0x40820000, @@ -1187,7 +1236,7 @@ static const unsigned int build_actionlist[5561] = { 0x81710000, 0x00098200, 0x41820000, -0x00050849, +0x0005084d, 0x80030000, 0x00098200, 0x38a00000, @@ -1224,7 +1273,7 @@ static const unsigned int build_actionlist[5561] = { 0x00098200, 0x28090000, 0x41820000, -0x00050849, +0x0005084d, 0x48000000, 0x0005000d, 0x0006000f, @@ -1232,11 +1281,11 @@ static const unsigned int build_actionlist[5561] = { 0x2c040000, 0x00098200, 0x41820000, -0x00050849, +0x0005084d, 0x7c852378, 0x7d034378, 0x48000000, -0x00050049, +0x0005004d, 0x00060010, 0x2c050000, 0x00098200, @@ -1254,35 +1303,35 @@ static const unsigned int build_actionlist[5561] = { 0x7c69402e, 0x48000000, 0x0005000c, -0x0006004a, +0x0006004e, 0x280b0010, 0x80ae0000, 0x80ce0008, 0x806e0004, 0x808e000c, 0x41800000, -0x00050844, +0x00050848, 0x2c050000, 0x00098200, 0x40820000, -0x00050844, +0x00050848, 0x81030000, 0x00098200, 0x2c060000, 0x00098200, 0x40820000, -0x00050844, +0x00050848, 0x28080000, 0x88c30000, 0x00098200, 0x40820000, -0x00050844, +0x00050848, 0x70c00000, 0x00090200, 0x90830000, 0x00098200, 0x41820000, -0x00050849, +0x0005084d, 0x00000000, 0x80110000, 0x00098200, @@ -1294,45 +1343,45 @@ static const unsigned int build_actionlist[5561] = { 0x90030000, 0x00098200, 0x48000000, -0x00050049, -0x0006004b, +0x0005004d, +0x0006004f, 0x280b0008, 0x80ce0000, 0x808e0004, 0x41800000, -0x00050844, +0x00050848, 0x2c060000, 0x00098200, 0x40820000, -0x00050844, +0x00050848, 0x38ae0008, 0x7e439378, 0x48000001, -0x00030009, +0x0003000a, 0xc8230000, 0x48000000, -0x00050047, -0x0006004c, +0x0005004b, +0x00060050, 0x280b0008, 0x806e0000, 0xc82e0000, 0x40820000, -0x00050844, +0x00050848, 0x7c03b040, 0x41810000, -0x00050844, +0x00050848, 0x48000000, -0x00050047, -0x0006004d, +0x0005004b, +0x00060051, 0x280b0008, 0x80ae0000, 0x806e0004, 0x41800000, -0x00050844, +0x00050848, 0x2c050000, 0x00098200, 0x41820000, -0x00050849, +0x0005084d, 0x80110000, 0x00098200, 0x7c05b040, @@ -1342,7 +1391,7 @@ static const unsigned int build_actionlist[5561] = { 0x4c413342, 0x92010008, 0x41820000, -0x00050844, +0x00050848, 0x00000000, 0x80110000, 0x00098200, @@ -1350,27 +1399,32 @@ static const unsigned int build_actionlist[5561] = { 0x00098200, 0x7c004040, 0x40800001, -0x0005084e, +0x00050852, 0x7e439378, 0x7dc47378, +0x00000000, 0x48000001, -0x0003000a, +0x0003000b, +0x00000000, +0x48000001, +0x0003000c, +0x00000000, 0x38a00000, 0x00098200, 0x48000000, -0x00050049, -0x0006004f, +0x0005004d, +0x00060053, 0x280b0008, 0x806e0000, 0x808e0004, 0x41800000, -0x00050844, +0x00050848, 0x7eee592e, 0x2c030000, 0x00098200, 0x820efff8, 0x40820000, -0x00050844, +0x00050848, 0x91d20000, 0x00098200, 0x7e439378, @@ -1379,12 +1433,12 @@ static const unsigned int build_actionlist[5561] = { 0x38ae0008, 0x92010008, 0x48000001, -0x0003000b, +0x0003000d, 0x28030000, 0x38a00000, 0x00098200, 0x41820000, -0x00050849, +0x0005084d, 0xc80e0008, 0x3a8efff8, 0xc82e0010, @@ -1393,18 +1447,18 @@ static const unsigned int build_actionlist[5561] = { 0x00098200, 0xd8340008, 0x48000000, -0x00050045, -0x00060050, +0x00050049, +0x00060054, 0x280b0008, 0x80ae0000, 0x806e0004, 0x41800000, -0x00050844, +0x00050848, 0x2c050000, 0x00098200, 0x820efff8, 0x40820000, -0x00050844, +0x00050848, 0x00000000, 0x81230000, 0x00098200, @@ -1413,7 +1467,7 @@ static const unsigned int build_actionlist[5561] = { 0x28090000, 0x3a8efff8, 0x40820000, -0x00050844, +0x00050848, 0x00000000, 0xc80a0000, 0x00098200, @@ -1424,41 +1478,61 @@ static const unsigned int build_actionlist[5561] = { 0x00098200, 0xd8140000, 0x48000000, -0x00050045, -0x00060051, +0x00050049, +0x00060055, 0x280b0010, 0x80ae0000, 0x806e0004, 0x80ce0008, +0x00000000, +0x812e000c, +0x00000000, 0xc84e0008, +0x00000000, 0x41800000, -0x00050844, +0x00050848, 0x2c050000, 0x00098200, 0x7c86b040, 0x820efff8, +0x00000000, +0x40820000, +0x00050848, +0x40860000, +0x00050848, +0x00000000, 0x3c003ff0, 0x9301000c, 0x40820000, -0x00050844, +0x00050848, 0x90010008, 0x40840000, -0x00050844, +0x00050848, 0xc8210008, 0xfc00101e, 0xd8010008, 0x8121000c, +0x00000000, 0x80030000, 0x00098200, 0x81030000, 0x00098200, +0x00000000, 0xfc42082a, +0x00000000, 0x39290001, 0x3a8efff8, 0x7c004840, +0x00000000, +0x92d40000, +0x55261800, +0x000900a1, +0x91340004, +0x00000000, 0x55261800, 0x000900a1, 0xd8540000, +0x00000000, 0x40810000, 0x00050802, 0x7d28302e, @@ -1469,12 +1543,12 @@ static const unsigned int build_actionlist[5561] = { 0x39800000, 0x00098200, 0x41820000, -0x00050845, +0x00050849, 0x39800000, 0x00098200, 0xd8140008, 0x48000000, -0x00050045, +0x00050049, 0x0006000c, 0x80030000, 0x00098200, @@ -1482,31 +1556,30 @@ static const unsigned int build_actionlist[5561] = { 0x39800000, 0x00098200, 0x41820000, -0x00050845, +0x00050849, 0x7d244b78, 0x48000001, -0x0003000c, -0x00000000, +0x0003000e, 0x28030000, 0x39800000, 0x00098200, 0x41820000, -0x00050845, +0x00050849, 0x81230000, 0xc8030000, 0x48000000, 0x0005000b, -0x00060052, +0x00060056, 0x280b0008, 0x80ae0000, 0x806e0004, 0x41800000, -0x00050844, +0x00050848, 0x2c050000, 0x00098200, 0x820efff8, 0x40820000, -0x00050844, +0x00050848, 0x00000000, 0x81230000, 0x00098200, @@ -1515,25 +1588,28 @@ static const unsigned int build_actionlist[5561] = { 0x28090000, 0x3a8efff8, 0x40820000, -0x00050844, +0x00050848, 0x00000000, 0xc80a0000, 0x00098200, 0x3a8efff8, 0x00000000, +0x92ce0008, +0x00000000, 0x930e0008, +0x00000000, 0x930e000c, 0x39800000, 0x00098200, 0xd8140000, 0x48000000, -0x00050045, -0x00060053, +0x00050049, +0x00060057, 0x280b0008, 0x88d10000, 0x00098200, 0x41800000, -0x00050844, +0x00050848, 0x7dc97378, 0x39ce0008, 0x54c607fe, @@ -1543,21 +1619,21 @@ static const unsigned int build_actionlist[5561] = { 0x00098200, 0x48000000, 0x00050024, -0x00060054, +0x00060058, 0x280b0010, 0x80ce0008, 0xc84e0008, 0x80ae0000, 0xc82e0000, 0x41800000, -0x00050844, +0x00050848, 0x89110000, 0x00098200, 0x7dc97378, 0x2c060000, 0x00098200, 0x40820000, -0x00050844, +0x00050848, 0x39ce0010, 0x550807fe, 0x000900ab, @@ -1568,16 +1644,16 @@ static const unsigned int build_actionlist[5561] = { 0x00098200, 0x48000000, 0x00050024, -0x00060055, +0x00060059, 0x280b0008, 0x80ae0000, 0x806e0004, 0x41800000, -0x00050844, +0x00050848, 0x2c050000, 0x00098200, 0x40820000, -0x00050844, +0x00050848, 0x88030000, 0x00098200, 0x81030000, @@ -1604,7 +1680,7 @@ static const unsigned int build_actionlist[5561] = { 0x91d20000, 0x00098200, 0x41980000, -0x00050844, +0x00050848, 0x0006000b, 0x39ce0008, 0x396bfff8, @@ -1706,7 +1782,7 @@ static const unsigned int build_actionlist[5561] = { 0x38600000, 0x48000000, 0x0005000e, -0x00060056, +0x0006005a, 0x00000000, 0x806a0000, 0x00098200, @@ -1735,7 +1811,7 @@ static const unsigned int build_actionlist[5561] = { 0x91d20000, 0x00098200, 0x41980000, -0x00050844, +0x00050848, 0x0006000b, 0x91230000, 0x00098200, @@ -1810,7 +1886,7 @@ static const unsigned int build_actionlist[5561] = { 0x7e439378, 0x7ea4ab78, 0x48000001, -0x0003000d, +0x0003000f, 0x00060013, 0x7e439378, 0x558400fe, @@ -1820,7 +1896,7 @@ static const unsigned int build_actionlist[5561] = { 0x38600000, 0x48000000, 0x0005000e, -0x00060057, +0x0006005b, 0x80120000, 0x00098200, 0x00000000, @@ -1834,32 +1910,54 @@ static const unsigned int build_actionlist[5561] = { 0x38600000, 0x00098200, 0x41820000, -0x00050844, +0x00050848, 0x93120000, 0x00098200, 0x98720000, 0x00098200, 0x48000000, 0x0005001a, -0x00060058, +0x0006005c, 0x280b0008, 0x80ae0000, 0x806e0004, 0x41800000, -0x00050844, +0x00050848, 0x7c05b040, +0x00000000, +0x40820000, +0x00050802, +0x7c68fe70, +0x7d091a78, +0x7c684851, +0x41800000, +0x00050801, +0x0006005d, +0x820efff8, +0x3a8efff8, +0x92cefff8, +0x906efffc, +0x48000000, +0x0005005e, +0x0006000b, +0x3ca041e0, +0x38600000, +0x48000000, +0x0005004d, +0x0006000c, +0x00000000, 0x40800000, -0x00050844, +0x00050848, 0x54a5007e, -0x00060049, +0x0006004d, 0x820efff8, 0x90aefff8, 0x3a8efff8, 0x906efffc, -0x00060059, +0x0006005e, 0x39800000, 0x00098200, -0x00060045, +0x00060049, 0x72000000, 0x00090200, 0x7d936378, @@ -1889,376 +1987,580 @@ static const unsigned int build_actionlist[5561] = { 0x7ef4412e, 0x48000000, 0x0005000f, -0x0006005a, 0x00000000, +0x0006005f, 0x280b0008, 0x80ae0000, -0xc82e0000, +0x806e0004, 0x41800000, -0x00050844, +0x00050848, 0x7c05b040, +0x41820000, +0x0005084d, +0x54a9657e, 0x40800000, -0x00050844, -0x48000001, -0x0003000e, +0x00050848, +0x3529fc01, +0x2889001f, +0x2009001f, +0x41800000, +0x00050803, +0x54a85800, +0x000900a1, +0x5466057e, +0x000900ab, +0x65088000, +0x39290001, +0x7d083378, +0x54645800, +0x000900a1, +0x40840000, +0x00050804, +0x7d064830, +0x7d030430, +0x7cc62378, +0x7ca9fe70, +0x7cc84838, +0x3008ffff, +0x7d004110, +0x7c634214, +0x7c634a78, +0x7c691850, 0x48000000, -0x00050047, -0x0006005b, -0x280b0008, -0x80ae0000, -0xc82e0000, -0x41800000, -0x00050844, -0x7c05b040, -0x40800000, -0x00050844, -0x48000001, -0x0003000f, +0x0005005d, +0x0006000d, +0x7d252a14, +0x7ca8fe70, +0x7c694b78, +0x7d284038, +0x21280000, +0x7c631910, 0x48000000, -0x00050047, -0x0006005c, -0x280b0008, -0x80ae0000, -0xc82e0000, -0x41800000, -0x00050844, -0x7c05b040, -0x40800000, -0x00050844, +0x0005005d, +0x0006000e, +0x6d088000, +0x7ca9fe70, +0x7d082378, +0x7d084b39, +0x4c423202, +0x3c608000, +0x41820000, +0x0005085d, +0x0006000f, 0x48000001, 0x00030010, 0x48000000, -0x00050047, -0x0006005d, +0x0005004b, +0x00060060, 0x280b0008, 0x80ae0000, -0xc82e0000, +0x806e0004, 0x41800000, -0x00050844, +0x00050848, 0x7c05b040, +0x41820000, +0x0005084d, +0x54a9657e, 0x40800000, -0x00050844, +0x00050848, +0x3529fc01, +0x2889001f, +0x2009001f, +0x41800000, +0x00050803, +0x00000000, +0x54a85800, +0x000900a1, +0x5466057e, +0x000900ab, +0x65088000, +0x39290001, +0x7d083378, +0x54645800, +0x000900a1, +0x40840000, +0x00050804, +0x7d064830, +0x7d030430, +0x7cc62378, +0x7ca9fe70, +0x7cc84878, +0x3008ffff, +0x7d004110, +0x7c634615, +0x7c634a78, +0x7c691850, +0x40830000, +0x0005085d, +0x7c000400, +0x40810000, +0x0005085d, +0x3ca041e0, +0x38600000, +0x48000000, +0x0005004d, +0x0006000d, +0x7d252a14, +0x7ca8fe70, +0x7c694b78, +0x7d284078, +0x3128ffff, +0x7c694110, +0x48000000, +0x0005005d, +0x0006000e, +0x6d088000, +0x7ca9fe70, +0x7d084b39, +0x4c423202, +0x3c608000, +0x41820000, +0x0005085d, +0x0006000f, 0x48000001, 0x00030011, 0x48000000, -0x00050047, -0x0006005e, -0x280b0008, -0x80ae0000, -0xc82e0000, -0x41800000, -0x00050844, -0x7c05b040, -0x40800000, -0x00050844, +0x0005004b, 0x00000000, -0x48000001, -0x00030012, -0x48000000, -0x00050047, 0x0006005f, 0x280b0008, 0x80ae0000, 0xc82e0000, 0x41800000, -0x00050844, +0x00050848, 0x7c05b040, 0x40800000, -0x00050844, +0x00050848, 0x48000001, -0x00030013, +0x00030010, 0x48000000, -0x00050047, +0x0005004b, 0x00060060, 0x280b0008, 0x80ae0000, 0xc82e0000, 0x41800000, -0x00050844, +0x00050848, 0x7c05b040, 0x40800000, -0x00050844, +0x00050848, 0x48000001, -0x00030014, +0x00030011, 0x48000000, -0x00050047, +0x0005004b, +0x00000000, 0x00060061, 0x280b0008, 0x80ae0000, 0xc82e0000, 0x41800000, -0x00050844, +0x00050848, 0x7c05b040, 0x40800000, -0x00050844, +0x00050848, 0x48000001, -0x00030015, +0x00030012, 0x48000000, -0x00050047, +0x0005004b, 0x00060062, 0x280b0008, 0x80ae0000, 0xc82e0000, 0x41800000, -0x00050844, +0x00050848, 0x7c05b040, 0x40800000, -0x00050844, +0x00050848, 0x48000001, -0x00030016, +0x00030013, 0x48000000, -0x00050047, +0x0005004b, 0x00060063, -0x00000000, 0x280b0008, 0x80ae0000, 0xc82e0000, 0x41800000, -0x00050844, +0x00050848, 0x7c05b040, 0x40800000, -0x00050844, +0x00050848, 0x48000001, -0x00030017, +0x00030014, 0x48000000, -0x00050047, +0x0005004b, 0x00060064, 0x280b0008, 0x80ae0000, 0xc82e0000, 0x41800000, -0x00050844, +0x00050848, 0x7c05b040, 0x40800000, -0x00050844, +0x00050848, 0x48000001, -0x00030018, +0x00030015, 0x48000000, -0x00050047, +0x0005004b, 0x00060065, 0x280b0008, 0x80ae0000, 0xc82e0000, 0x41800000, -0x00050844, +0x00050848, +0x00000000, 0x7c05b040, 0x40800000, -0x00050844, +0x00050848, 0x48000001, -0x00030019, +0x00030016, 0x48000000, -0x00050047, +0x0005004b, 0x00060066, 0x280b0008, 0x80ae0000, 0xc82e0000, 0x41800000, -0x00050844, +0x00050848, 0x7c05b040, 0x40800000, -0x00050844, +0x00050848, 0x48000001, -0x0003001a, +0x00030017, 0x48000000, -0x00050047, +0x0005004b, 0x00060067, 0x280b0008, 0x80ae0000, 0xc82e0000, 0x41800000, -0x00050844, +0x00050848, 0x7c05b040, 0x40800000, -0x00050844, -0x00000000, +0x00050848, 0x48000001, -0x0003001b, +0x00030018, 0x48000000, -0x00050047, +0x0005004b, 0x00060068, 0x280b0008, 0x80ae0000, 0xc82e0000, 0x41800000, -0x00050844, +0x00050848, 0x7c05b040, 0x40800000, -0x00050844, +0x00050848, +0x48000001, +0x00030019, +0x48000000, +0x0005004b, +0x00060069, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050848, +0x7c05b040, +0x40800000, +0x00050848, +0x48000001, +0x0003001a, +0x00000000, +0x48000000, +0x0005004b, +0x0006006a, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050848, +0x7c05b040, +0x40800000, +0x00050848, +0x48000001, +0x0003001b, +0x48000000, +0x0005004b, +0x0006006b, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050848, +0x7c05b040, +0x40800000, +0x00050848, 0x48000001, 0x0003001c, 0x48000000, -0x00050047, -0x00060069, -0x280b0010, +0x0005004b, +0x0006006c, +0x280b0008, 0x80ae0000, 0xc82e0000, -0x80ce0008, -0xc84e0008, 0x41800000, -0x00050844, +0x00050848, 0x7c05b040, 0x40800000, -0x00050844, -0x7c06b040, -0x40800000, -0x00050844, +0x00050848, 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, +0x0005004b, 0x0006006d, 0x280b0008, 0x80ae0000, 0xc82e0000, 0x41800000, -0x00050844, +0x00050848, 0x7c05b040, 0x40800000, -0x00050844, -0xc84a0000, -0x00098200, -0xfc2100b2, +0x00050848, +0x48000001, +0x0003001e, 0x48000000, -0x00050047, +0x0005004b, 0x0006006e, +0x00000000, 0x280b0010, 0x80ae0000, 0xc82e0000, 0x80ce0008, 0xc84e0008, 0x41800000, -0x00050844, +0x00050848, 0x7c05b040, 0x40800000, -0x00050844, +0x00050848, 0x7c06b040, 0x40800000, -0x00050844, -0xfc40101e, -0xd8410008, -0x8061000c, +0x00050848, +0x48000001, +0x0003001f, +0x48000000, +0x0005004b, +0x0006006f, +0x280b0010, +0x80ae0000, +0xc82e0000, +0x80ce0008, +0xc84e0008, +0x41800000, +0x00050848, +0x7c05b040, +0x40800000, +0x00050848, +0x7c06b040, +0x40800000, +0x00050848, 0x48000001, 0x00030020, 0x48000000, -0x00050047, -0x0006006f, -0x280b0008, +0x0005004b, +0x00060070, +0x280b0010, 0x80ae0000, 0xc82e0000, +0x80ce0008, +0xc84e0008, 0x41800000, -0x00050844, +0x00050848, 0x7c05b040, 0x40800000, -0x00050844, -0x38710000, -0x00098200, -0x820efff8, +0x00050848, +0x7c06b040, +0x40800000, +0x00050848, 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, +0x0005004b, 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, +0x00050848, 0x7c05b040, 0x40800000, -0x00050844, +0x00050848, +0xc84a0000, +0x00098200, +0x00000000, +0xfc2100b2, +0x48000000, +0x0005004b, +0x00000000, +0x00060073, +0x280b0010, +0x80ae0000, +0xc82e0000, +0x80ce0008, +0x806e000c, +0x41800000, +0x00050848, +0x7c05b040, +0x40800000, +0x00050848, +0x7c06b040, +0x40820000, +0x00050848, +0x00000000, +0x00060073, +0x280b0010, +0x80ae0000, +0xc82e0000, +0x80ce0008, +0xc84e0008, +0x41800000, +0x00050848, +0x7c05b040, +0x40800000, +0x00050848, +0x7c06b040, +0x40800000, +0x00050848, +0xfc40101e, +0xd8410008, +0x8061000c, +0x00000000, +0x48000001, +0x00030022, +0x48000000, +0x0005004b, +0x00060074, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050848, +0x7c05b040, +0x40800000, +0x00050848, +0x38710000, +0x00098200, +0x820efff8, +0x48000001, +0x00030023, +0x81110000, +0x00098200, +0x3a8efff8, +0x00000000, +0x6d088000, +0x91010024, +0xc8410020, +0xfc42f828, +0x00000000, +0xd8340000, +0x39800000, +0x00098200, +0x00000000, +0x92d40008, +0x9114000c, +0x00000000, +0xd8540008, +0x00000000, +0x48000000, +0x00050049, +0x00060075, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050848, +0x7c05b040, +0x40800000, +0x00050848, +0x386efff8, +0x820efff8, +0x48000001, +0x00030024, +0x3a8efff8, +0xd82e0000, +0x39800000, +0x00098200, +0x48000000, +0x00050049, +0x00000000, +0x00060076, +0x280b0008, +0x80ae0000, +0x806e0004, +0x41800000, +0x00050848, +0x7c05b040, +0x390e0008, +0x7d2e5a14, +0x40820000, +0x00050804, +0x0006000b, +0x80c80000, +0x7c884840, +0x80880004, +0x40840000, +0x0005085d, +0x7c06b040, +0x6c608000, +0x6c868000, +0x40820000, +0x00050803, +0x7cc60010, +0x7c000110, +0x7cc60038, +0x7c662214, +0x39080008, +0x48000000, +0x0005000b, +0x0006000d, +0x40800000, +0x00050848, +0x6c638000, +0x90610024, +0xc8210020, +0xfc21f828, +0xc8480000, +0x48000000, +0x00050006, +0x0006000e, +0xc82e0000, +0x40800000, +0x00050848, +0x0006000f, +0x80c80000, +0x7c884840, +0xc8480000, +0x40840000, +0x0005084b, +0x7c06b040, +0x40800000, +0x00050807, +0x00060010, +0xfc011028, +0x39080008, +0xfc2008ae, +0x48000000, +0x0005000f, +0x00060011, +0x80880004, +0x40820000, +0x00050848, +0x6c848000, +0x90810024, +0xc8410020, +0xfc42f828, +0x48000000, +0x00050010, +0x00000000, +0x00060076, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050848, +0x7c05b040, +0x40800000, +0x00050848, 0x39000008, 0x0006000b, 0x7c8e402e, @@ -2266,41 +2568,148 @@ static const unsigned int build_actionlist[5561] = { 0x7c885840, 0x7c04b040, 0x40840000, -0x00050847, +0x0005084b, 0x40800000, -0x00050844, +0x00050848, +0xfc011028, +0x39080008, +0xfc2008ae, +0x48000000, +0x0005000b, +0x00000000, +0x00060077, +0x280b0008, +0x80ae0000, +0x806e0004, +0x41800000, +0x00050848, +0x7c05b040, +0x390e0008, +0x7d2e5a14, +0x40820000, +0x00050804, +0x0006000b, +0x80c80000, +0x7c884840, +0x80880004, +0x40840000, +0x0005085d, +0x7c06b040, +0x6c608000, +0x6c868000, +0x40820000, +0x00050803, +0x7cc60010, +0x7c000110, +0x7cc60078, +0x7c662214, +0x39080008, +0x48000000, +0x0005000b, +0x0006000d, +0x40800000, +0x00050848, +0x6c638000, +0x90610024, +0xc8210020, +0xfc21f828, +0xc8480000, +0x48000000, +0x00050006, +0x0006000e, +0xc82e0000, +0x40800000, +0x00050848, +0x0006000f, +0x80c80000, +0x7c884840, +0xc8480000, +0x40840000, +0x0005084b, +0x7c06b040, +0x40800000, +0x00050807, +0x00060010, +0xfc011028, +0x39080008, +0xfc20106e, +0x48000000, +0x0005000f, +0x00060011, +0x80880004, +0x40820000, +0x00050848, +0x6c848000, +0x90810024, +0xc8410020, +0xfc42f828, +0x48000000, +0x00050010, +0x00000000, +0x00060077, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050848, +0x7c05b040, +0x40800000, +0x00050848, +0x39000008, +0x0006000b, +0x7c8e402e, +0x7c4e44ae, +0x7c885840, +0x7c04b040, +0x40840000, +0x0005084b, +0x40800000, +0x00050848, 0xfc011028, 0x39080008, 0xfc20106e, 0x48000000, 0x0005000b, -0x00060073, 0x00000000, +0x00060078, 0x280b0008, 0x80ae0000, 0x806e0004, 0x41800000, -0x00050844, +0x00050848, 0x2c050000, 0x00098200, 0x40820000, -0x00050844, +0x00050848, 0x80630000, 0x00098200, 0x48000000, -0x00050074, -0x00060075, +0x0005005d, +0x00060079, 0x280b0008, 0x80ae0000, 0x806e0004, 0x40820000, -0x00050844, +0x00050848, 0x2c050000, 0x00098200, 0x40820000, -0x00050844, +0x00050848, 0x80030000, 0x00098200, +0x00000000, +0x88630000, +0x00098200, +0x39800000, +0x00098200, +0x820efff8, +0x28000000, +0x3a8efff8, +0x41820000, +0x00050849, +0x48000000, +0x0005005d, +0x00000000, 0x89030000, 0x00098200, 0x30c0ffff, @@ -2315,82 +2724,111 @@ static const unsigned int build_actionlist[5561] = { 0x000900a1, 0xd8140000, 0x48000000, -0x00050045, -0x00060076, +0x00050049, +0x00000000, +0x0006007a, 0x80110000, 0x00098200, 0x81110000, 0x00098200, 0x7c004040, 0x40800001, -0x0005084e, +0x00050852, 0x280b0008, 0x80ae0000, +0x00000000, +0x800e0004, +0x40820000, +0x00050848, +0x7c05b040, +0x40820000, +0x00050848, +0x388e0007, +0x00000000, 0xc82e0000, 0x40820000, -0x00050844, +0x00050848, 0x7c05b040, 0x40800000, -0x00050844, +0x00050848, 0xfc20081e, 0xd8210008, 0x8001000c, 0x3881000f, +0x00000000, 0x38a00001, 0x280000ff, 0x41810000, -0x00050844, -0x00060077, +0x00050848, +0x0006007b, 0x7e439378, 0x91d20000, 0x00098200, -0x00000000, 0x92010008, 0x48000001, -0x00030023, +0x00030025, 0x81d20000, 0x00098200, 0x38a00000, 0x00098200, 0x48000000, -0x00050049, -0x00060078, +0x0005004d, +0x0006007c, 0x80110000, 0x00098200, 0x81110000, 0x00098200, 0x7c004040, 0x40800001, -0x0005084e, +0x00050852, 0x280b0010, 0x80ae0010, +0x00000000, 0xc80e0010, +0x00000000, 0x800e0000, 0x806e0004, 0x41800000, -0x00050844, +0x00050848, 0x808e0008, +0x00000000, +0x810e000c, +0x00000000, 0xc82e0008, +0x00000000, 0x3920ffff, 0x41820000, 0x00050801, +0x00000000, +0x7c05b040, +0x812e0014, +0x40820000, +0x00050848, +0x0006000b, +0x7c04b040, +0x40820000, +0x00050848, +0x00000000, 0x7c05b040, 0x40800000, -0x00050844, +0x00050848, 0xfc00001e, 0xd8010008, 0x8121000c, 0x0006000b, 0x7c04b040, 0x40800000, -0x00050844, +0x00050848, +0x00000000, 0x2c000000, 0x00098200, 0x40820000, -0x00050844, +0x00050848, +0x00000000, 0xfc20081e, 0xd8210008, 0x8101000c, +0x00000000, 0x80030000, 0x00098200, 0x7c004840, @@ -2411,9 +2849,8 @@ static const unsigned int build_actionlist[5561] = { 0x7c844214, 0x7ca50078, 0x48000000, -0x00050077, +0x0005007b, 0x0006000f, -0x00000000, 0x7c890050, 0x7c84fe70, 0x7cc62078, @@ -2429,31 +2866,41 @@ static const unsigned int build_actionlist[5561] = { 0x39080001, 0x48000000, 0x0005000d, -0x00060079, +0x0006007d, 0x80110000, 0x00098200, 0x81110000, 0x00098200, 0x7c004040, 0x40800001, -0x0005084e, +0x00050852, 0x280b0010, -0x80ae0000, +0x800e0000, 0x806e0004, 0x80ce0008, +0x00000000, +0x80ae000c, +0x00000000, 0xc84e0008, +0x00000000, 0x41800000, -0x00050844, -0x2c050000, +0x00050848, +0x2c000000, 0x00098200, 0x40820000, -0x00050844, +0x00050848, +0x00000000, +0x7c06b040, +0x40820000, +0x00050848, +0x00000000, 0x7c06b040, 0x40800000, -0x00050844, +0x00050848, 0xfc40101e, 0xd8410008, 0x80a1000c, +0x00000000, 0x80030000, 0x00098200, 0x2c050000, @@ -2467,13 +2914,13 @@ static const unsigned int build_actionlist[5561] = { 0x00050802, 0x7c882840, 0x40820000, -0x00050844, +0x00050848, 0x88030000, 0x00098200, 0x80910000, 0x00098200, 0x41840000, -0x00050844, +0x00050848, 0x0006000b, 0x28090000, 0x7c0449ae, @@ -2481,34 +2928,34 @@ static const unsigned int build_actionlist[5561] = { 0x40820000, 0x0005080b, 0x48000000, -0x00050077, +0x0005007b, 0x0006000c, -0x00000000, 0x38710000, 0x00098200, 0x38a00000, 0x00098200, 0x48000000, -0x00050049, -0x0006007a, +0x0005004d, +0x0006007e, 0x80110000, 0x00098200, 0x81110000, 0x00098200, 0x7c004040, 0x40800001, -0x0005084e, +0x00050852, 0x280b0008, 0x80ae0000, 0x806e0004, 0x41800000, -0x00050844, +0x00050848, 0x2c050000, 0x00098200, 0x81110000, 0x00098200, +0x00000000, 0x40820000, -0x00050844, +0x00050848, 0x80a30000, 0x00098200, 0x38630000, @@ -2519,37 +2966,36 @@ static const unsigned int build_actionlist[5561] = { 0x7c082840, 0x38c5ffff, 0x41800000, -0x00050844, +0x00050848, 0x0006000b, 0x2c060000, 0x7d0348ae, 0x41800000, -0x00050877, +0x0005087b, 0x7d0431ae, 0x38c6ffff, 0x39290001, 0x48000000, 0x0005000b, -0x0006007b, +0x0006007f, 0x80110000, 0x00098200, 0x81110000, 0x00098200, 0x7c004040, 0x40800001, -0x0005084e, -0x00000000, +0x00050852, 0x280b0008, 0x80ae0000, 0x806e0004, 0x41800000, -0x00050844, +0x00050848, 0x2c050000, 0x00098200, 0x81110000, 0x00098200, 0x40820000, -0x00050844, +0x00050848, 0x80a30000, 0x00098200, 0x38630000, @@ -2559,12 +3005,13 @@ static const unsigned int build_actionlist[5561] = { 0x7c082840, 0x39200000, 0x41800000, -0x00050844, +0x00050848, 0x0006000b, 0x7c092840, 0x7d0348ae, 0x40800000, -0x00050877, +0x0005087b, +0x00000000, 0x3808ffbf, 0x69060020, 0x3000ffe6, @@ -2575,41 +3022,40 @@ static const unsigned int build_actionlist[5561] = { 0x39290001, 0x48000000, 0x0005000b, -0x0006007c, +0x00060080, 0x80110000, 0x00098200, 0x81110000, 0x00098200, 0x7c004040, 0x40800001, -0x0005084e, +0x00050852, 0x280b0008, 0x80ae0000, 0x806e0004, 0x41800000, -0x00050844, +0x00050848, 0x2c050000, 0x00098200, 0x81110000, 0x00098200, 0x40820000, -0x00050844, +0x00050848, 0x80a30000, 0x00098200, 0x38630000, 0x00098200, 0x80910000, 0x00098200, -0x00000000, 0x7c082840, 0x39200000, 0x41800000, -0x00050844, +0x00050848, 0x0006000b, 0x7c092840, 0x7d0348ae, 0x40800000, -0x00050877, +0x0005087b, 0x3808ff9f, 0x69060020, 0x3000ffe6, @@ -2620,286 +3066,494 @@ static const unsigned int build_actionlist[5561] = { 0x39290001, 0x48000000, 0x0005000b, -0x0006007d, +0x00060081, 0x280b0008, 0x80ae0000, 0x806e0004, 0x41800000, -0x00050844, +0x00050848, 0x2c050000, 0x00098200, 0x40820000, -0x00050844, +0x00050848, 0x48000001, -0x00030024, +0x00030026, 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, +0x0005005d, 0x00000000, -0xd8210008, -0x8081000c, -0x7c632038, -0x39080008, -0x48000000, -0x0005000b, -0x00060080, +0x00060082, 0x280b0008, 0x80ae0000, -0xc82e0000, +0x806e0004, 0x41800000, -0x00050844, +0x00050848, 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, +0x40820001, +0x00050883, +0x00000000, 0x00060082, 0x280b0008, 0x80ae0000, 0xc82e0000, 0x41800000, -0x00050844, +0x00050848, 0x7c05b040, 0x40800000, -0x00050844, +0x00050848, 0xfc21f02a, 0xd8210008, 0x8061000c, +0x00000000, +0x390e0008, +0x7d2e5a14, +0x0006000b, +0x80c80000, +0x7c884840, +0x00000000, +0x80880004, +0x00000000, +0xc8280000, +0x00000000, +0x40840000, +0x0005085d, +0x7c06b040, +0x00000000, +0x40820001, +0x00050884, +0x00000000, +0xfc21f02a, +0x40800000, +0x00050848, +0xd8210008, +0x8081000c, +0x00000000, +0x7c632038, +0x39080008, +0x48000000, +0x0005000b, +0x00000000, +0x00060085, +0x280b0008, +0x80ae0000, +0x806e0004, +0x41800000, +0x00050848, +0x7c05b040, +0x40820001, +0x00050883, +0x00000000, +0x00060085, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050848, +0x7c05b040, +0x40800000, +0x00050848, +0xfc21f02a, +0xd8210008, +0x8061000c, +0x00000000, +0x390e0008, +0x7d2e5a14, +0x0006000b, +0x80c80000, +0x7c884840, +0x00000000, +0x80880004, +0x00000000, +0xc8280000, +0x00000000, +0x40840000, +0x0005085d, +0x7c06b040, +0x00000000, +0x40820001, +0x00050884, +0x00000000, +0xfc21f02a, +0x40800000, +0x00050848, +0xd8210008, +0x8081000c, +0x00000000, +0x7c632378, +0x39080008, +0x48000000, +0x0005000b, +0x00000000, +0x00060086, +0x280b0008, +0x80ae0000, +0x806e0004, +0x41800000, +0x00050848, +0x7c05b040, +0x40820001, +0x00050883, +0x00000000, +0x00060086, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050848, +0x7c05b040, +0x40800000, +0x00050848, +0xfc21f02a, +0xd8210008, +0x8061000c, +0x00000000, +0x390e0008, +0x7d2e5a14, +0x0006000b, +0x80c80000, +0x7c884840, +0x00000000, +0x80880004, +0x00000000, +0xc8280000, +0x00000000, +0x40840000, +0x0005085d, +0x7c06b040, +0x00000000, +0x40820001, +0x00050884, +0x00000000, +0xfc21f02a, +0x40800000, +0x00050848, +0xd8210008, +0x8081000c, +0x00000000, +0x7c632278, +0x39080008, +0x48000000, +0x0005000b, +0x00000000, +0x00060087, +0x280b0008, +0x80ae0000, +0x806e0004, +0x41800000, +0x00050848, +0x7c05b040, +0x40820001, +0x00050883, +0x00000000, +0x00060087, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050848, +0x7c05b040, +0x40800000, +0x00050848, +0xfc21f02a, +0xd8210008, +0x8061000c, +0x00000000, 0x5460403e, 0x5060c00e, 0x5060c42e, 0x7c030378, 0x48000000, -0x00050074, -0x00060083, +0x0005005d, +0x00000000, +0x00060088, +0x280b0008, +0x80ae0000, +0x806e0004, +0x41800000, +0x00050848, +0x7c05b040, +0x40820001, +0x00050883, +0x00000000, +0x00060088, 0x280b0008, 0x80ae0000, 0xc82e0000, 0x41800000, -0x00050844, +0x00050848, 0x7c05b040, 0x40800000, -0x00050844, -0x00000000, +0x00050848, 0xfc21f02a, 0xd8210008, 0x8061000c, +0x00000000, 0x7c6318f8, 0x48000000, -0x00050074, -0x00060084, +0x0005005d, +0x00000000, +0x00060089, +0x280b0010, +0x80ae0000, +0x80ce0008, +0x806e0004, +0x808e000c, +0x41800000, +0x00050848, +0x7c05b040, +0x40820001, +0x00050883, +0x7c06b040, +0x40820000, +0x00050848, +0x00000000, +0x00060089, 0x280b0010, 0x80ae0000, 0xc82e0000, 0x80ce0008, 0xc84e0008, 0x41800000, -0x00050844, +0x00050848, 0x7c05b040, 0x40800000, -0x00050844, +0x00050848, 0x7c06b040, 0x40800000, -0x00050844, +0x00050848, 0xfc21f02a, 0xfc42f02a, 0xd8210008, 0x8061000c, 0xd8410008, 0x8081000c, +0x00000000, 0x548406fe, 0x7c632030, 0x48000000, -0x00050074, -0x00060085, +0x0005005d, +0x00000000, +0x0006008a, +0x280b0010, +0x80ae0000, +0x80ce0008, +0x806e0004, +0x808e000c, +0x41800000, +0x00050848, +0x7c05b040, +0x40820001, +0x00050883, +0x7c06b040, +0x40820000, +0x00050848, +0x00000000, +0x0006008a, 0x280b0010, 0x80ae0000, 0xc82e0000, 0x80ce0008, 0xc84e0008, 0x41800000, -0x00050844, +0x00050848, 0x7c05b040, 0x40800000, -0x00050844, +0x00050848, 0x7c06b040, 0x40800000, -0x00050844, +0x00050848, 0xfc21f02a, 0xfc42f02a, 0xd8210008, 0x8061000c, 0xd8410008, 0x8081000c, +0x00000000, 0x548406fe, 0x7c632430, 0x48000000, -0x00050074, -0x00060086, +0x0005005d, +0x00000000, +0x0006008b, +0x280b0010, +0x80ae0000, +0x80ce0008, +0x806e0004, +0x808e000c, +0x41800000, +0x00050848, +0x7c05b040, +0x40820001, +0x00050883, +0x7c06b040, +0x40820000, +0x00050848, +0x00000000, +0x0006008b, 0x280b0010, 0x80ae0000, 0xc82e0000, 0x80ce0008, 0xc84e0008, 0x41800000, -0x00050844, +0x00050848, 0x7c05b040, 0x40800000, -0x00050844, +0x00050848, 0x7c06b040, 0x40800000, -0x00050844, +0x00050848, 0xfc21f02a, 0xfc42f02a, 0xd8210008, 0x8061000c, 0xd8410008, 0x8081000c, +0x00000000, 0x548406fe, 0x7c632630, 0x48000000, -0x00050074, -0x00060087, +0x0005005d, +0x00000000, +0x0006008c, +0x280b0010, +0x80ae0000, +0x80ce0008, +0x806e0004, +0x808e000c, +0x41800000, +0x00050848, +0x7c05b040, +0x40820001, +0x00050883, +0x7c06b040, +0x40820000, +0x00050848, +0x00000000, +0x0006008c, 0x280b0010, 0x80ae0000, 0xc82e0000, 0x80ce0008, 0xc84e0008, 0x41800000, -0x00050844, +0x00050848, 0x7c05b040, 0x40800000, -0x00050844, +0x00050848, 0x7c06b040, 0x40800000, -0x00050844, +0x00050848, 0xfc21f02a, 0xfc42f02a, 0xd8210008, 0x8061000c, 0xd8410008, 0x8081000c, +0x00000000, 0x5c63203e, 0x48000000, -0x00050074, -0x00060088, +0x0005005d, 0x00000000, +0x0006008d, +0x280b0010, +0x80ae0000, +0x80ce0008, +0x806e0004, +0x808e000c, +0x41800000, +0x00050848, +0x7c05b040, +0x40820001, +0x00050883, +0x7c06b040, +0x40820000, +0x00050848, +0x00000000, +0x0006008d, 0x280b0010, 0x80ae0000, 0xc82e0000, 0x80ce0008, 0xc84e0008, 0x41800000, -0x00050844, +0x00050848, 0x7c05b040, 0x40800000, -0x00050844, +0x00050848, 0x7c06b040, 0x40800000, -0x00050844, +0x00050848, 0xfc21f02a, 0xfc42f02a, 0xd8210008, 0x8061000c, 0xd8410008, 0x8081000c, +0x00000000, 0x7c8400d0, 0x5c63203e, 0x48000000, -0x00050074, -0x00060044, +0x0005005d, +0x00000000, +0x0006008e, +0x280b0008, +0x80ae0000, +0x806e0004, +0x41800000, +0x00050848, +0x7c05b040, +0x40820001, +0x00050883, +0x00000000, +0x0006008e, +0x280b0008, +0x80ae0000, +0xc82e0000, +0x41800000, +0x00050848, +0x7c05b040, +0x40800000, +0x00050848, +0xfc21f02a, +0xd8210008, +0x8061000c, +0x00000000, +0x48000000, +0x0005005d, +0x00000000, +0x0006005d, +0x6c638000, +0x90610024, +0xc8210020, +0xfc21f828, +0x00000000, +0x0006004b, +0x820efff8, +0x3a8efff8, +0xd82efff8, +0x48000000, +0x0005005e, +0x00060083, +0x00000000, +0xc82e0000, +0x41810000, +0x00050848, +0xfc21f02a, +0xd8210008, +0x8061000c, +0x4e800020, +0x00000000, +0x00060084, +0x00000000, +0xc8280000, +0x41810000, +0x00050848, +0xfc21f02a, +0xd8210008, +0x8081000c, +0x4e800020, +0x00000000, +0x00060048, 0x80ca0000, 0x00098200, 0x7d0e5a14, @@ -2926,7 +3580,7 @@ static const unsigned int build_actionlist[5561] = { 0x000900a1, 0x3a8efff8, 0x41810000, -0x00050845, +0x00050849, 0x0006000b, 0x80120000, 0x00098200, @@ -2953,7 +3607,6 @@ static const unsigned int build_actionlist[5561] = { 0x80f0fffc, 0x54e8dd78, 0x0006000d, -0x00000000, 0x7d287050, 0x48000000, 0x00050024, @@ -2962,12 +3615,13 @@ static const unsigned int build_actionlist[5561] = { 0x00098200, 0x48000001, 0x00030000, +0x00000000, 0x81d20000, 0x00098200, 0x7c000000, 0x48000000, 0x0005000b, -0x0006004e, +0x00060052, 0x7ea802a6, 0x91d20000, 0x00098200, @@ -2977,7 +3631,7 @@ static const unsigned int build_actionlist[5561] = { 0x00098200, 0x7e439378, 0x48000001, -0x00030025, +0x00030027, 0x81d20000, 0x00098200, 0x7ea803a6, @@ -2986,11 +3640,11 @@ static const unsigned int build_actionlist[5561] = { 0x7d6e0050, 0x814efffc, 0x4e800020, -0x00060089, +0x0006008f, 0x00000000, 0x7c810808, 0x00000000, -0x0006008a, +0x00060090, 0x88d10000, 0x00098200, 0x70c00000, @@ -3003,7 +3657,7 @@ static const unsigned int build_actionlist[5561] = { 0x7c11402e, 0x7c0903a6, 0x4e800420, -0x0006008b, +0x00060091, 0x88d10000, 0x00098200, 0x81310000, @@ -3031,7 +3685,7 @@ static const unsigned int build_actionlist[5561] = { 0x91d20000, 0x00098200, 0x48000001, -0x00030026, +0x00030028, 0x0006000d, 0x81d20000, 0x00098200, @@ -3048,22 +3702,22 @@ static const unsigned int build_actionlist[5561] = { 0x54eb9d78, 0x7c0903a6, 0x4e800420, -0x0006008c, +0x00060092, 0x3a100004, 0x826affec, 0x48000000, 0x0005000e, -0x0006008d, +0x00060093, 0x00000000, 0x7c810808, 0x00000000, -0x0006008e, +0x00060094, 0x7e048378, 0x00000000, 0x48000000, 0x00050001, 0x00000000, -0x0006008f, +0x00060095, 0x00000000, 0x62040001, 0x0006000b, @@ -3077,7 +3731,7 @@ static const unsigned int build_actionlist[5561] = { 0x90120000, 0x00098200, 0x48000001, -0x00030027, +0x00030029, 0x81d20000, 0x00098200, 0x80120000, @@ -3088,34 +3742,45 @@ static const unsigned int build_actionlist[5561] = { 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, +0x00000000, +0x7c810808, +0x00000000, +0x00060098, +0x48000000, +0x00030010, +0x00060099, +0x48000000, +0x00030011, +0x0006009a, +0x00000000, +0x48000000, +0x0003002a, +0x00000000, +0x0006009b, +0x7c0327d7, +0x4d830020, +0x7c652279, +0x7c0021d6, +0x7c601850, +0x4c800020, +0x2c030000, +0x4d820020, +0x7c632214, +0x4e800020, +0x0006009c, +0x00000000, +0x7c810808, +0x00000000, +0x0006009d, +0x00000000, +0x7c810808, +0x00000000, +0x0006009e, 0x28030001, 0x41820000, 0x00050801, @@ -3152,7 +3817,7 @@ static const unsigned int build_actionlist[5561] = { 0x90010024, 0xfde01090, 0x48000001, -0x0003000e, +0x00030010, 0x80010024, 0xfc2103f2, 0x7c0803a6, @@ -3163,7 +3828,7 @@ static const unsigned int build_actionlist[5561] = { 0x4e800020, 0x0006000b, 0x48000000, -0x0003001d, +0x0003001f, 0x0006000c, 0x28030007, 0x41820000, @@ -3177,12 +3842,95 @@ static const unsigned int build_actionlist[5561] = { 0x4e800020, 0x0006000c, 0x7c810808, -0x00060098, +0x0006009f, 0x00000000, 0x7c810808, 0x00000000, 0x00080000, 0x00000000, +0x7c14706e, +0x3a100004, +0x80940004, +0x7d0c706e, +0x8130fffc, +0x7c00b040, +0x80ac0004, +0x552993ba, +0x7c88b040, +0x3d290000, +0x00098200, +0x40820000, +0x00050807, +0x40860000, +0x00050808, +0x7c042800, +0x00000000, +0x40800000, +0x00050802, +0x00000000, +0x41800000, +0x00050802, +0x00000000, +0x41810000, +0x00050802, +0x00000000, +0x40810000, +0x00050802, +0x00000000, +0x0006000b, +0x7e104a14, +0x0006000c, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00060011, +0x41810000, +0x00050834, +0xc8140000, +0x41850000, +0x00050834, +0x41840000, +0x00050804, +0x6ca58000, +0x90a10024, +0xc8210020, +0xfc21f828, +0x48000000, +0x00050005, +0x00060012, +0x6c848000, +0x90810024, +0xc8010020, +0xfc00f828, +0x0006000e, +0xc82c0000, +0x0006000f, +0xfc000800, +0x00000000, +0x40800000, +0x0005080c, +0x00000000, +0x41800000, +0x0005080c, +0x00000000, +0x4c001382, +0x40800000, +0x0005080c, +0x00000000, +0x4c001382, +0x41800000, +0x0005080c, +0x00000000, +0x48000000, +0x0005000b, +0x00000000, 0x7c0ea02e, 0x3a100004, 0x7c0ea4ae, @@ -3228,6 +3976,25 @@ static const unsigned int build_actionlist[5561] = { 0x4e800420, 0x00000000, 0x7c14706e, +0x3a100004, +0x80940004, +0x7d0c706e, +0x7c00b040, +0x80f0fffc, +0x7c88b040, +0x54e993ba, +0x80ac0004, +0x4fa12b82, +0x3d290000, +0x00098200, +0x00000000, +0x409d0000, +0x000508a0, +0x00000000, +0x409d0000, +0x000508a1, +0x00000000, +0x7c14706e, 0x81300000, 0xc8140000, 0x3a100004, @@ -3263,9 +4030,12 @@ static const unsigned int build_actionlist[5561] = { 0x54eb9d78, 0x7c0903a6, 0x4e800420, +0x00000000, 0x0006000f, +0x00000000, 0x80940004, 0x80ac0004, +0x00000000, 0x7c0600f8, 0x7c004040, 0x28860000, @@ -3290,8 +4060,24 @@ static const unsigned int build_actionlist[5561] = { 0x7e104a14, 0x00060010, 0x00000000, +0x40800000, +0x00050802, +0x0006000b, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x0006000c, +0x00000000, 0x41800000, 0x0005080b, +0x00000000, 0x41980000, 0x0005080b, 0x81240000, @@ -3345,27 +4131,59 @@ static const unsigned int build_actionlist[5561] = { 0x7c0903a6, 0x4e800420, 0x00000000, -0x7c0ea02e, -0x7c0ea4ae, +0x7c14706e, 0x3a100004, -0x7c2f64ae, -0x80f0fffc, +0x80940004, +0x7d0c786e, 0x7c00b040, -0x40800000, -0x00050805, -0xfc000800, +0x80f0fffc, +0x7c88b040, 0x54e993ba, +0x80ac0004, 0x3d290000, 0x00098200, 0x00000000, +0x000600a0, +0x00000000, +0x000600a1, +0x00000000, 0x40820000, -0x00050805, +0x00050807, +0x40860000, +0x00050808, +0x7c042800, +0x0006000e, +0x00000000, +0x000600a0, +0x00000000, +0x000600a1, +0x00000000, +0x7c0ea02e, +0x3a100004, +0x7c0ea4ae, +0x80f0fffc, +0x7c2f64ae, +0x54e993ba, +0x7c00b040, +0x3d290000, +0x00098200, +0x40800000, +0x00050803, +0xfc000800, +0x00000000, +0x40820000, +0x00050801, 0x7e104a14, -0x0006000f, +0x0006000b, +0x00000000, +0x0006000d, 0x00000000, 0x41820000, 0x00050802, 0x0006000b, +0x00000000, +0x0006000d, +0x00000000, 0x7e104a14, 0x0006000c, 0x00000000, @@ -3380,13 +4198,38 @@ static const unsigned int build_actionlist[5561] = { 0x7c0903a6, 0x4e800420, 0x00000000, -0x0006000f, -0x54e993ba, -0x3d290000, +0x0006000d, +0x2c000000, 0x00098200, +0x41820000, +0x0005083a, 0x48000000, 0x0005000b, 0x00000000, +0x00060011, +0x40800000, +0x0005080d, +0xc8140000, +0x41840000, +0x00050801, +0x6ca58000, +0x90a10024, +0xc8210020, +0xfc21f828, +0x48000000, +0x00050002, +0x00060012, +0x6c848000, +0x90810024, +0xc8010020, +0xfc00f828, +0x0006000b, +0xc82c0000, +0x0006000c, +0xfc000800, +0x48000000, +0x0005000e, +0x00000000, 0x7c0ea02e, 0x558800fe, 0x000900ab, @@ -3494,13 +4337,48 @@ static const unsigned int build_actionlist[5561] = { 0x7d0c706e, 0x800c0004, 0x7c08b040, +0x00000000, +0x40820000, +0x00050805, +0x7c0004d1, +0x41830000, +0x00050804, +0x0006000b, +0x80f00000, +0x3a100004, +0x7ed4716e, +0x90140004, +0x0006000d, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x0006000e, +0x7c000400, +0x40810000, +0x0005080b, +0x3d0041e0, +0x38000000, +0x48000000, +0x00050007, +0x00000000, +0x0006000f, 0x40800000, -0x0005083c, +0x0005083d, 0x6d088000, +0x00060011, 0x80f00000, 0x3a100004, 0x7d14716e, 0x90140004, +0x00000000, +0x48000000, +0x0005000d, +0x00000000, 0x54e815ba, 0x54ea5d78, 0x54ec9b78, @@ -3519,12 +4397,19 @@ static const unsigned int build_actionlist[5561] = { 0x80630000, 0x00098200, 0x0006000b, +0x00000000, +0x80f00000, +0x3a100004, +0x7ed4716e, +0x90740004, +0x00000000, 0x90610024, 0xc8010020, 0xfc00f028, 0x80f00000, 0x3a100004, 0x7c0ea5ae, +0x00000000, 0x54e815ba, 0x54ea5d78, 0x54ec9b78, @@ -3537,7 +4422,7 @@ static const unsigned int build_actionlist[5561] = { 0x2c000000, 0x00098200, 0x40820000, -0x0005083e, +0x00050842, 0x00000000, 0x81230000, 0x00098200, @@ -3546,9 +4431,9 @@ static const unsigned int build_actionlist[5561] = { 0x00050809, 0x0006000d, 0x00000000, -0x0006003f, +0x00060043, 0x48000001, -0x00030024, +0x00030026, 0x48000000, 0x0005000b, 0x00000000, @@ -3560,36 +4445,39 @@ static const unsigned int build_actionlist[5561] = { 0x40820000, 0x0005080d, 0x48000000, -0x0005003e, +0x00050042, 0x00000000, -0x7c6e502e, -0x7c0e54ae, -0x7c2f5cae, -0x7c03b040, -0x40800000, -0x0005083a, +0x7d0a706e, +0x7d2b786e, +0x806a0004, +0x7c08b040, +0x808b0004, 0x00000000, -0x7c6e502e, -0x7c2e54ae, -0x7c0f5cae, -0x7c03b040, -0x40800000, -0x0005083b, +0x7d0a706e, +0x7d2b786e, +0x808a0004, +0x7c08b040, +0x806b0004, 0x00000000, -0x7c6e502e, -0x7c8e582e, -0x7c0e54ae, -0x7c2e5cae, -0x7c03b040, -0x7c84b040, -0x4c002202, -0x40800000, -0x0005083d, +0x7d0a706e, +0x7d2b706e, +0x806a0004, +0x7c08b040, +0x808b0004, 0x00000000, +0x7c89b040, +0x4c423202, +0x40820000, +0x00050805, +0x7c632615, +0x41830000, +0x00050804, +0x0006000b, 0x80f00000, 0x3a100004, -0xfc00082a, -0x7c0ea5ae, +0x7ed4716e, +0x90740004, +0x0006000c, 0x54e815ba, 0x54ea5d78, 0x54ec9b78, @@ -3598,198 +4486,688 @@ static const unsigned int build_actionlist[5561] = { 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, +0x0006000e, +0x7c000400, +0x40810000, +0x0005080b, 0x00000000, 0x48000000, -0x00050099, +0x00050040, 0x00000000, -0x7c6e502e, -0x7c2e54ae, -0x7c8e582e, -0x7c4e5cae, -0x7c03b040, -0x7c84b040, +0x48000000, +0x0005003c, +0x00000000, +0x48000000, +0x00050041, +0x00000000, +0x0006000f, +0x00000000, +0xc9ea0000, +0x4c002202, +0xc9cb0000, +0x00000000, +0xc9ca0000, +0x4c002202, +0xc9eb0000, +0x00000000, +0x40800000, +0x00050840, +0x00000000, +0x40800000, +0x0005083c, +0x00000000, +0x40800000, +0x00050841, +0x00000000, +0xfc0e782a, +0x80f00000, +0x3a100004, +0x7c0ea5ae, +0x48000000, +0x0005000c, +0x00000000, +0x7d0e502e, +0x00000000, +0x7d2f582e, +0x00000000, +0x7dce54ae, +0x7def5cae, +0x00000000, +0x7c08b040, +0x7c89b040, 0x4c002202, 0x40800000, -0x0005083d, +0x0005083e, +0x00000000, +0x7c08b040, +0x40800000, +0x0005083e, +0x00000000, +0x7d0e502e, +0x00000000, +0x7d2f582e, +0x00000000, +0x7dee54ae, +0x7dcf5cae, +0x00000000, +0x7c08b040, +0x7c89b040, +0x4c002202, +0x40800000, +0x0005083b, +0x00000000, +0x7c08b040, +0x40800000, +0x0005083b, +0x00000000, +0x7d0e502e, +0x7d2e582e, +0x7dce54ae, +0x7dee5cae, +0x7c08b040, +0x7c89b040, +0x4c002202, +0x40800000, +0x0005083f, +0x00000000, +0xfc0e782a, +0x80f00000, +0x3a100004, +0x7c0ea5ae, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x7d0a706e, +0x7d2b786e, +0x806a0004, +0x7c08b040, +0x808b0004, +0x00000000, +0x7d0a706e, +0x7d2b786e, +0x808a0004, +0x7c08b040, +0x806b0004, +0x00000000, +0x7d0a706e, +0x7d2b706e, +0x806a0004, +0x7c08b040, +0x808b0004, +0x00000000, +0x7c89b040, +0x4c423202, +0x40820000, +0x00050805, +0x7c641c51, +0x41830000, +0x00050804, +0x0006000b, +0x80f00000, +0x3a100004, +0x7ed4716e, +0x90740004, +0x0006000c, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x0006000e, +0x7c000400, +0x40810000, +0x0005080b, +0x00000000, +0x48000000, +0x00050040, +0x00000000, +0x48000000, +0x0005003c, +0x00000000, +0x48000000, +0x00050041, +0x00000000, +0x0006000f, +0x00000000, +0xc9ea0000, +0x4c002202, +0xc9cb0000, +0x00000000, +0xc9ca0000, +0x4c002202, +0xc9eb0000, +0x00000000, +0x40800000, +0x00050840, +0x00000000, +0x40800000, +0x0005083c, +0x00000000, +0x40800000, +0x00050841, +0x00000000, +0xfc0e7828, +0x80f00000, +0x3a100004, +0x7c0ea5ae, +0x48000000, +0x0005000c, +0x00000000, +0x7d0e502e, +0x00000000, +0x7d2f582e, +0x00000000, +0x7dce54ae, +0x7def5cae, +0x00000000, +0x7c08b040, +0x7c89b040, +0x4c002202, +0x40800000, +0x0005083e, +0x00000000, +0x7c08b040, +0x40800000, +0x0005083e, +0x00000000, +0x7d0e502e, +0x00000000, +0x7d2f582e, +0x00000000, +0x7dee54ae, +0x7dcf5cae, +0x00000000, +0x7c08b040, +0x7c89b040, +0x4c002202, +0x40800000, +0x0005083b, +0x00000000, +0x7c08b040, +0x40800000, +0x0005083b, +0x00000000, +0x7d0e502e, +0x7d2e582e, +0x7dce54ae, +0x7dee5cae, +0x7c08b040, +0x7c89b040, +0x4c002202, +0x40800000, +0x0005083f, +0x00000000, +0xfc0e7828, +0x80f00000, +0x3a100004, +0x7c0ea5ae, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x7d0a706e, +0x7d2b786e, +0x806a0004, +0x7c08b040, +0x808b0004, +0x00000000, +0x7d0a706e, +0x7d2b786e, +0x808a0004, +0x7c08b040, +0x806b0004, +0x00000000, +0x7d0a706e, +0x7d2b706e, +0x806a0004, +0x7c08b040, +0x808b0004, +0x00000000, +0x7c89b040, +0x4c423202, +0x40820000, +0x00050805, +0x7c6325d7, +0x41830000, +0x00050804, +0x0006000b, +0x80f00000, +0x3a100004, +0x7ed4716e, +0x90740004, +0x0006000c, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x0006000e, +0x7c000400, +0x40810000, +0x0005080b, +0x00000000, +0x48000000, +0x00050040, +0x00000000, +0x48000000, +0x0005003c, +0x00000000, +0x48000000, +0x00050041, +0x00000000, +0x0006000f, +0x00000000, +0xc9ea0000, +0x4c002202, +0xc9cb0000, +0x00000000, +0xc9ca0000, +0x4c002202, +0xc9eb0000, +0x00000000, +0x40800000, +0x00050840, +0x00000000, +0x40800000, +0x0005083c, +0x00000000, +0x40800000, +0x00050841, +0x00000000, +0xfc0e03f2, +0x80f00000, +0x3a100004, +0x7c0ea5ae, +0x48000000, +0x0005000c, +0x00000000, +0x7d0e502e, +0x00000000, +0x7d2f582e, +0x00000000, +0x7dce54ae, +0x7def5cae, +0x00000000, +0x7c08b040, +0x7c89b040, +0x4c002202, +0x40800000, +0x0005083e, +0x00000000, +0x7c08b040, +0x40800000, +0x0005083e, +0x00000000, +0x7d0e502e, +0x00000000, +0x7d2f582e, +0x00000000, +0x7dee54ae, +0x7dcf5cae, +0x00000000, +0x7c08b040, +0x7c89b040, +0x4c002202, +0x40800000, +0x0005083b, +0x00000000, +0x7c08b040, +0x40800000, +0x0005083b, +0x00000000, +0x7d0e502e, +0x7d2e582e, +0x7dce54ae, +0x7dee5cae, +0x7c08b040, +0x7c89b040, +0x4c002202, +0x40800000, +0x0005083f, +0x00000000, +0xfc0e03f2, +0x80f00000, +0x3a100004, +0x7c0ea5ae, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x7d0e502e, +0x00000000, +0x7d2f582e, +0x00000000, +0x7dce54ae, +0x7def5cae, +0x00000000, +0x7c08b040, +0x7c89b040, +0x4c002202, +0x40800000, +0x0005083e, +0x00000000, +0x7c08b040, +0x40800000, +0x0005083e, +0x00000000, +0x7d0e502e, +0x00000000, +0x7d2f582e, +0x00000000, +0x7dee54ae, +0x7dcf5cae, +0x00000000, +0x7c08b040, +0x7c89b040, +0x4c002202, +0x40800000, +0x0005083b, +0x00000000, +0x7c08b040, +0x40800000, +0x0005083b, +0x00000000, +0x7d0e502e, +0x7d2e582e, +0x7dce54ae, +0x7dee5cae, +0x7c08b040, +0x7c89b040, +0x4c002202, +0x40800000, +0x0005083f, +0x00000000, +0xfc0e7824, +0x80f00000, +0x3a100004, +0x7c0ea5ae, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x7d0a706e, +0x7d2b786e, +0x806a0004, +0x7c08b040, +0x808b0004, +0x00000000, +0x7d0a706e, +0x7d2b786e, +0x808a0004, +0x7c08b040, +0x806b0004, +0x00000000, +0x7d0a706e, +0x7d2b706e, +0x806a0004, +0x7c08b040, +0x808b0004, +0x00000000, +0x7c89b040, +0x4c423202, +0x40820000, +0x00050805, +0x000600a2, 0x48000001, -0x0003001d, +0x0005009b, +0x41830000, +0x00050804, +0x0006000b, +0x80f00000, +0x3a100004, +0x7ed4716e, +0x90740004, +0x0006000c, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x0006000e, +0x7c000400, +0x40810000, +0x0005080b, +0x00000000, +0x48000000, +0x00050040, +0x00000000, +0x48000000, +0x0005003c, +0x00000000, +0x48000000, +0x00050041, +0x00000000, +0x0006000f, +0x00000000, +0xc9ea0000, +0x4c002202, +0xc9cb0000, +0x00000000, +0xc9ca0000, +0x4c002202, +0xc9eb0000, +0x00000000, +0x40800000, +0x00050840, +0x00000000, +0x40800000, +0x0005083c, +0x00000000, +0x40800000, +0x00050841, +0x00000000, +0x000600a2, +0x00000000, +0x000600a3, +0xfc2e7824, +0x48000001, +0x00030010, +0xfc0103f2, +0xfc0e0028, +0x80f00000, +0x3a100004, +0x7c0ea5ae, +0x48000000, +0x0005000c, +0x00000000, +0x7d0e502e, +0x00000000, +0x7d2f582e, +0x00000000, +0x7dce54ae, +0x7def5cae, +0x00000000, +0x7c08b040, +0x7c89b040, +0x4c002202, +0x40800000, +0x0005083e, +0x00000000, +0x7c08b040, +0x40800000, +0x0005083e, +0x00000000, +0x7d0e502e, +0x00000000, +0x7d2f582e, +0x00000000, +0x7dee54ae, +0x7dcf5cae, +0x00000000, +0x7c08b040, +0x7c89b040, +0x4c002202, +0x40800000, +0x0005083b, +0x00000000, +0x7c08b040, +0x40800000, +0x0005083b, +0x00000000, +0x7d0e502e, +0x7d2e582e, +0x7dce54ae, +0x7dee5cae, +0x7c08b040, +0x7c89b040, +0x4c002202, +0x40800000, +0x0005083f, +0x00000000, +0x000600a2, +0x00000000, +0x000600a3, +0xfc2e7824, +0x48000001, +0x00030010, +0xfc0103f2, +0xfc0e0028, +0x80f00000, +0x3a100004, +0x7c0ea5ae, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x7d0a706e, +0x7d2b786e, +0x806a0004, +0x7c08b040, +0x808b0004, +0x00000000, +0x7d0a706e, +0x7d2b786e, +0x808a0004, +0x7c08b040, +0x806b0004, +0x00000000, +0x7d0a706e, +0x7d2b706e, +0x806a0004, +0x7c08b040, +0x808b0004, +0x00000000, +0x7c89b040, +0x4c423202, +0x40820000, +0x00050805, +0x48000000, +0x000500a2, +0x0006000f, +0x00000000, +0xc9ea0000, +0x4c002202, +0xc9cb0000, +0x00000000, +0xc9ca0000, +0x4c002202, +0xc9eb0000, +0x00000000, +0x40800000, +0x00050840, +0x00000000, +0x40800000, +0x0005083c, +0x00000000, +0x40800000, +0x00050841, +0x00000000, +0x48000000, +0x000500a3, +0x00000000, +0x7d0e502e, +0x00000000, +0x7d2f582e, +0x00000000, +0x7dce54ae, +0x7def5cae, +0x00000000, +0x7c08b040, +0x7c89b040, +0x4c002202, +0x40800000, +0x0005083e, +0x00000000, +0x7c08b040, +0x40800000, +0x0005083e, +0x00000000, +0x7d0e502e, +0x00000000, +0x7d2f582e, +0x00000000, +0x7dee54ae, +0x7dcf5cae, +0x00000000, +0x7c08b040, +0x7c89b040, +0x4c002202, +0x40800000, +0x0005083b, +0x00000000, +0x7c08b040, +0x40800000, +0x0005083b, +0x00000000, +0x7d0e502e, +0x7d2e582e, +0x7dce54ae, +0x7dee5cae, +0x7c08b040, +0x7c89b040, +0x4c002202, +0x40800000, +0x0005083f, +0x00000000, +0x48000000, +0x000500a3, +0x00000000, +0x7d0e502e, +0x7c2e54ae, +0x7d2e582e, +0x7c4e5cae, +0x7c08b040, +0x7c89b040, +0x4c002202, +0x40800000, +0x0005083f, +0x48000001, +0x0003001f, 0x7c2ea5ae, 0x80f00000, 0x3a100004, @@ -3813,7 +5191,7 @@ static const unsigned int build_actionlist[5561] = { 0x54a500fe, 0x000900ab, 0x48000001, -0x00030029, +0x0003002b, 0x28030000, 0x81d20000, 0x00098200, @@ -3873,6 +5251,22 @@ static const unsigned int build_actionlist[5561] = { 0x558c6800, 0x000900a1, 0x7d8c8670, +0x80f00000, +0x3a100004, +0x7ed4716e, +0x91940004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x558c6800, +0x000900a1, +0x7d8c8670, 0x6d8c8000, 0x91810024, 0xc8010020, @@ -4006,7 +5400,7 @@ static const unsigned int build_actionlist[5561] = { 0x41820000, 0x0005080b, 0x48000001, -0x0003002a, +0x0003002c, 0x48000000, 0x0005000b, 0x00000000, @@ -4057,7 +5451,7 @@ static const unsigned int build_actionlist[5561] = { 0x41820000, 0x0005080b, 0x48000001, -0x0003002a, +0x0003002c, 0x48000000, 0x0005000b, 0x00000000, @@ -4120,7 +5514,7 @@ static const unsigned int build_actionlist[5561] = { 0x00050801, 0x7c8ea214, 0x48000001, -0x0003002b, +0x0003002d, 0x81d20000, 0x00098200, 0x0006000b, @@ -4145,7 +5539,7 @@ static const unsigned int build_actionlist[5561] = { 0x7e439378, 0x80aefffc, 0x48000001, -0x0003002c, +0x0003002e, 0x81d20000, 0x00098200, 0x38000000, @@ -4183,14 +5577,14 @@ static const unsigned int build_actionlist[5561] = { 0x00050803, 0x0006000c, 0x48000001, -0x0003002d, +0x0003002f, 0x00000000, 0x5588007e, 0x000900ab, 0x2108fffc, 0x7c8f402e, 0x48000001, -0x0003002e, +0x00030030, 0x00000000, 0x81d20000, 0x00098200, @@ -4217,7 +5611,7 @@ static const unsigned int build_actionlist[5561] = { 0x0006000f, 0x7d956378, 0x48000001, -0x0003002f, +0x00030031, 0x7eacab78, 0x7e439378, 0x48000000, @@ -4232,20 +5626,35 @@ static const unsigned int build_actionlist[5561] = { 0x7d6f402e, 0x00000000, 0x48000000, -0x0005009a, +0x000500a4, 0x00000000, 0x48000000, -0x0005009b, +0x000500a5, 0x00000000, 0x7c6a706e, 0x7c8b706e, 0x814a0004, +0x00000000, +0x816b0004, +0x00000000, 0xc80b0000, +0x00000000, 0x2c030000, 0x00098200, 0x7c84b040, 0x40820000, 0x0005082f, +0x00000000, +0x800a0000, +0x00098200, +0x40860000, +0x00050805, +0x810a0000, +0x00098200, +0x7c005840, +0x55691800, +0x000900a1, +0x00000000, 0x40840000, 0x00050805, 0xfc20001e, @@ -4262,6 +5671,7 @@ static const unsigned int build_actionlist[5561] = { 0x4c213202, 0x55291800, 0x000900a1, +0x00000000, 0x40810000, 0x0005082f, 0x7c08482e, @@ -4301,9 +5711,11 @@ static const unsigned int build_actionlist[5561] = { 0x00098200, 0x40820000, 0x0005082f, +0x00000000, 0x816b0004, +0x00000000, 0x48000000, -0x0005009a, +0x000500a4, 0x00000000, 0x7c6a706e, 0x5568007e, @@ -4315,7 +5727,7 @@ static const unsigned int build_actionlist[5561] = { 0x7d6f402e, 0x40820000, 0x0005082c, -0x0006009a, +0x000600a4, 0x800a0000, 0x00098200, 0x810b0000, @@ -4437,12 +5849,27 @@ static const unsigned int build_actionlist[5561] = { 0x7c6a706e, 0x7c8b706e, 0x814a0004, +0x00000000, +0x816b0004, +0x00000000, 0xc80b0000, +0x00000000, 0x2c030000, 0x00098200, 0x7c84b040, 0x40820000, 0x00050833, +0x00000000, +0x800a0000, +0x00098200, +0x40860000, +0x00050805, +0x810a0000, +0x00098200, +0x7c005840, +0x55601800, +0x000900a1, +0x00000000, 0x40840000, 0x00050805, 0xfc20001e, @@ -4459,6 +5886,7 @@ static const unsigned int build_actionlist[5561] = { 0x4c213202, 0x55201800, 0x000900a1, +0x00000000, 0x40810000, 0x00050833, 0x7d28002e, @@ -4501,14 +5929,15 @@ static const unsigned int build_actionlist[5561] = { 0x48000000, 0x00050033, 0x0006000f, -0x00000000, 0x2c040000, 0x00098200, 0x40820000, 0x00050833, +0x00000000, 0x816b0004, +0x00000000, 0x48000000, -0x0005009b, +0x000500a5, 0x00060011, 0x80110000, 0x00098200, @@ -4558,7 +5987,7 @@ static const unsigned int build_actionlist[5561] = { 0x7d6f402e, 0x40820000, 0x00050830, -0x0006009b, +0x000600a5, 0x800a0000, 0x00098200, 0x810b0000, @@ -4661,7 +6090,7 @@ static const unsigned int build_actionlist[5561] = { 0x7d445378, 0x90050000, 0x48000001, -0x00030030, +0x00030032, 0x81d20000, 0x00098200, 0xd9c30000, @@ -4802,7 +6231,7 @@ static const unsigned int build_actionlist[5561] = { 0x92010008, 0x7d956378, 0x48000001, -0x00030031, +0x00030033, 0x7eacab78, 0x48000000, 0x0005000b, @@ -4853,8 +6282,8 @@ static const unsigned int build_actionlist[5561] = { 0x00098200, 0x3a940008, 0x40820000, -0x00050840, -0x00060041, +0x00050844, +0x00060045, 0x71000000, 0x00090200, 0x88ca0000, @@ -4966,9 +6395,14 @@ static const unsigned int build_actionlist[5561] = { 0x80f0fffc, 0x41820000, 0x00050804, +0x00000000, +0x91740004, +0x92d40000, +0x00000000, 0x91610024, 0xc8210020, 0xfc21f028, +0x00000000, 0x396b0001, 0x3cd00000, 0x00098200, @@ -4976,7 +6410,9 @@ static const unsigned int build_actionlist[5561] = { 0x54e893ba, 0x9174fffc, 0x7e083214, +0x00000000, 0xd8340000, +0x00000000, 0x0006000d, 0x80f00000, 0x3a100004, @@ -5019,7 +6455,6 @@ static const unsigned int build_actionlist[5561] = { 0x00098200, 0x3d300000, 0x00098200, -0x00000000, 0xd8140008, 0x7d6b0214, 0x54e893ba, @@ -5181,7 +6616,7 @@ static const unsigned int build_actionlist[5561] = { 0x6a080000, 0x00090200, 0x40820000, -0x0005089c, +0x000508a6, 0x00060017, 0x80f0fffc, 0x2c0c0008, @@ -5232,7 +6667,7 @@ static const unsigned int build_actionlist[5561] = { 0x7ee9412e, 0x48000000, 0x0005000f, -0x0006009c, +0x000600a6, 0x71090000, 0x00090200, 0x40820000, @@ -5250,7 +6685,7 @@ static const unsigned int build_actionlist[5561] = { 0x6a080000, 0x00090200, 0x40820000, -0x0005089c, +0x000508a6, 0x80f0fffc, 0x392efff8, 0x54ea5d78, @@ -5288,60 +6723,66 @@ static const unsigned int build_actionlist[5561] = { 0x00000000, 0x7c810808, 0x00000000, -0x7c3474ee, -0xc8740000, +0x7d14706e, +0x80740000, 0x00098200, -0xc8540000, +0x7c08b040, +0x00000000, +0x80b40000, 0x00098200, -0x80d40000, +0x40820000, +0x00050809, +0x7c632e15, +0x2f050000, +0x80940000, 0x00098200, -0xfc21182a, -0xd8340000, +0x41830000, +0x00050806, +0x0006000e, +0x90740000, 0x00098200, 0x00000000, -0x7d14706e, -0xc8340000, -0x00098200, 0x80d40000, 0x00098200, -0xc8740000, +0x80b40000, 0x00098200, 0x81340000, 0x00098200, -0xc8540000, +0x80940000, 0x00098200, -0x7c08b040, 0x7f86b040, 0x7c89b040, -0x4c00e202, -0x4c002202, -0x40800000, -0x00050842, +0x4c42f202, +0x4c423202, +0x2f050000, +0x40820000, +0x00050809, 0x00000000, -0x2d860000, +0x41980000, +0x00050805, +0x7c032000, +0x0006000b, +0x92d40000, +0x00098200, 0x00000000, 0x558c007e, 0x000900ab, 0x00000000, -0xd8340000, +0x90740000, 0x00098200, 0x00000000, 0x7d906214, 0x00000000, -0xfc011000, -0x00000000, -0x3e0c0000, -0x00098200, -0x00000000, -0x418c0000, -0x00050805, -0x00000000, 0x41810000, 0x00050803, 0x00000000, +0x3e0c0000, +0x00098200, +0x40810000, +0x00070800, +0x00000000, 0x41810000, 0x00050802, -0x0006000b, 0x3e0c0000, 0x00098200, 0x00000000, @@ -5360,6 +6801,105 @@ static const unsigned int build_actionlist[5561] = { 0x7c0903a6, 0x4e800420, 0x0006000f, +0x7c041800, +0x48000000, +0x0005000b, +0x00000000, +0x00060010, +0x7c000400, +0x40810000, +0x0005080e, +0x48000000, +0x0005000c, +0x00000000, +0x00060013, +0xc8340000, +0x00098200, +0x00000000, +0x7c3474ee, +0x00000000, +0xc8740000, +0x00098200, +0xc8540000, +0x00098200, +0x80d40000, +0x00098200, +0xfc21182a, +0xd8340000, +0x00098200, +0x00000000, +0x00060013, +0x00000000, +0x7d14706e, +0x80d40000, +0x00098200, +0x81340000, +0x00098200, +0x7c08b040, +0x7f86b040, +0x7c89b040, +0x00000000, +0xc8340000, +0x00098200, +0x4c00e202, +0xc8740000, +0x00098200, +0x4c002202, +0xc8540000, +0x00098200, +0x40800000, +0x00050846, +0x00000000, +0x2f060000, +0x00000000, +0x558c007e, +0x000900ab, +0x00000000, +0xd8340000, +0x00098200, +0x00000000, +0x7d906214, +0x00000000, +0xfc011000, +0x00000000, +0x3e0c0000, +0x00098200, +0x00000000, +0x41980000, +0x00050805, +0x00000000, +0x41810000, +0x00050803, +0x00000000, +0x41810000, +0x0005080c, +0x00000000, +0x41810000, +0x00050802, +0x00000000, +0x0006000b, +0x3e0c0000, +0x00098200, +0x00000000, +0x40810000, +0x00070800, +0x00000000, +0x48000000, +0x0005000c, +0x00000000, +0x0006000c, +0x80f00000, +0x3a100004, +0x54e815ba, +0x54ea5d78, +0x54ec9b78, +0x7c11402e, +0x54f4dd78, +0x54eb9d78, +0x7c0903a6, +0x4e800420, +0x00000000, +0x0006000f, 0x00000000, 0x40800000, 0x0005080c, @@ -5615,10 +7155,14 @@ enum { GLOB_cont_condt, GLOB_cont_condf, GLOB_vmeta_equal, - GLOB_vmeta_arith_vn, + GLOB_vmeta_equal_cd, GLOB_vmeta_arith_nv, + GLOB_vmeta_arith_nv2, GLOB_vmeta_unm, + GLOB_vmeta_arith_vn, GLOB_vmeta_arith_vv, + GLOB_vmeta_arith_vn2, + GLOB_vmeta_arith_vv2, GLOB_vmeta_len, GLOB_BC_LEN_Z, GLOB_vmeta_callt, @@ -5646,6 +7190,7 @@ enum { GLOB_ff_coroutine_wrap_aux, GLOB_ff_coroutine_yield, GLOB_ff_math_abs, + GLOB_fff_resi, GLOB_fff_res1, GLOB_ff_math_floor, GLOB_ff_math_ceil, @@ -5673,7 +7218,6 @@ enum { 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, @@ -5683,8 +7227,9 @@ enum { GLOB_ff_string_lower, GLOB_ff_string_upper, GLOB_ff_table_getn, - GLOB_ff_bit_tobit, GLOB_ff_bit_band, + GLOB_fff_tobit_fb, + GLOB_fff_bitop_fb, GLOB_ff_bit_bor, GLOB_ff_bit_bxor, GLOB_ff_bit_bswap, @@ -5694,6 +7239,7 @@ enum { GLOB_ff_bit_arshift, GLOB_ff_bit_rol, GLOB_ff_bit_ror, + GLOB_ff_bit_tobit, GLOB_vm_record, GLOB_vm_rethook, GLOB_vm_inshook, @@ -5706,10 +7252,14 @@ enum { GLOB_vm_floor, GLOB_vm_ceil, GLOB_vm_trunc, + GLOB_vm_modi, GLOB_vm_powi, GLOB_vm_foldfpm, GLOB_vm_foldarith, GLOB_vm_ffi_call, + GLOB_BC_ISEQN_Z, + GLOB_BC_ISNEN_Z, + GLOB_BC_MODVNI_Z, GLOB_BC_MODVN_Z, GLOB_BC_TGETS_Z, GLOB_BC_TSETS_Z, @@ -5755,10 +7305,14 @@ static const char *const globnames[] = { "cont_condt", "cont_condf", "vmeta_equal", - "vmeta_arith_vn", + "vmeta_equal_cd", "vmeta_arith_nv", + "vmeta_arith_nv2", "vmeta_unm", + "vmeta_arith_vn", "vmeta_arith_vv", + "vmeta_arith_vn2", + "vmeta_arith_vv2", "vmeta_len", "BC_LEN_Z", "vmeta_callt", @@ -5786,6 +7340,7 @@ static const char *const globnames[] = { "ff_coroutine_wrap_aux", "ff_coroutine_yield", "ff_math_abs", + "fff_resi", "fff_res1", "ff_math_floor", "ff_math_ceil", @@ -5813,7 +7368,6 @@ static const char *const globnames[] = { "ff_math_min", "ff_math_max", "ff_string_len", - "fff_resi", "ff_string_byte", "ff_string_char", "fff_newstr", @@ -5823,8 +7377,9 @@ static const char *const globnames[] = { "ff_string_lower", "ff_string_upper", "ff_table_getn", - "ff_bit_tobit", "ff_bit_band", + "fff_tobit_fb", + "fff_bitop_fb", "ff_bit_bor", "ff_bit_bxor", "ff_bit_bswap", @@ -5834,6 +7389,7 @@ static const char *const globnames[] = { "ff_bit_arshift", "ff_bit_rol", "ff_bit_ror", + "ff_bit_tobit", "vm_record", "vm_rethook", "vm_inshook", @@ -5846,10 +7402,14 @@ static const char *const globnames[] = { "vm_floor", "vm_ceil", "vm_trunc", + "vm_modi", "vm_powi", "vm_foldfpm", "vm_foldarith", "vm_ffi_call", + "BC_ISEQN_Z", + "BC_ISNEN_Z", + "BC_MODVNI_Z", "BC_MODVN_Z", "BC_TGETS_Z", "BC_TSETS_Z", @@ -5862,11 +7422,13 @@ static const char *const extnames[] = { "lj_meta_tset", "lj_meta_comp", "lj_meta_equal", + "lj_meta_equal_cd", "lj_meta_arith", "lj_meta_len", "lj_meta_call", "lj_meta_for", "lj_tab_get", + "lj_str_fromnumber", "lj_str_fromnum", "lj_tab_next", "lj_tab_getinth", @@ -5945,109 +7507,374 @@ static void build_subroutines(BuildCtx *ctx) 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); + dasm_put(Dst, 765, LJ_TSTR, DISPATCH_GL(tmptv), LJ_TTAB, DISPATCH_GL(tmptv2), LJ_TSTR); + if (!LJ_DUALNUM) { + dasm_put(Dst, 790); + } + dasm_put(Dst, 794, DISPATCH_GL(tmptv)); + if (LJ_DUALNUM) { + dasm_put(Dst, 799); + } else { + dasm_put(Dst, 802); + } + dasm_put(Dst, 804, Dt1(->base), FRAME_CONT, Dt1(->top), DISPATCH_GL(tmptv), LJ_TSTR, DISPATCH_GL(tmptv), LJ_TTAB, DISPATCH_GL(tmptv2), LJ_TSTR); + if (!LJ_DUALNUM) { + dasm_put(Dst, 872); + } + dasm_put(Dst, 876, DISPATCH_GL(tmptv)); + if (LJ_DUALNUM) { + dasm_put(Dst, 881); + } else { + dasm_put(Dst, 884); + } + dasm_put(Dst, 886, Dt1(->base), FRAME_CONT, Dt1(->top)); + if (LJ_DUALNUM) { + dasm_put(Dst, 931); + } else { + dasm_put(Dst, 933); + } + dasm_put(Dst, 935); + if (LJ_DUALNUM) { + dasm_put(Dst, 937); + } else { + dasm_put(Dst, 939); + } + dasm_put(Dst, 941, Dt1(->base), -(BCBIAS_J*4 >> 16), LJ_TTRUE, LJ_TTRUE, Dt1(->base)); #if LJ_HASFFI - dasm_put(Dst, 3166); + dasm_put(Dst, 1004, Dt1(->base)); +#endif + dasm_put(Dst, 1015); + if (LJ_DUALNUM) { + dasm_put(Dst, 1022); + } + dasm_put(Dst, 1027); + if (LJ_DUALNUM) { + dasm_put(Dst, 1041); + } + dasm_put(Dst, 1044); + if (LJ_DUALNUM) { + dasm_put(Dst, 1047); + } + dasm_put(Dst, 1050, Dt1(->base), FRAME_CONT); +#ifdef LUAJIT_ENABLE_LUA52COMPAT + dasm_put(Dst, 1074); +#endif + dasm_put(Dst, 1076, Dt1(->base)); +#ifdef LUAJIT_ENABLE_LUA52COMPAT + dasm_put(Dst, 1084); +#else + dasm_put(Dst, 1091); +#endif + dasm_put(Dst, 1094, Dt1(->base), Dt7(->pc), Dt1(->base), Dt1(->base)); +#if LJ_HASJIT + dasm_put(Dst, 1142); +#endif + dasm_put(Dst, 1144); +#if LJ_HASJIT + dasm_put(Dst, 1146, BC_JFORI); +#endif + dasm_put(Dst, 1149); +#if LJ_HASJIT + dasm_put(Dst, 1151, BC_JFORI); +#endif + dasm_put(Dst, 1154, BC_FORI, LJ_TFALSE, ~LJ_TISNUM+1, 31-3, Dt8(->upvalue), LJ_TTAB, Dt6(->metatable)); + dasm_put(Dst, 1217, 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, 1265, 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, 1320, 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, 1380, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold)); + if (LJ_DUALNUM) { + dasm_put(Dst, 1390); + } else { + dasm_put(Dst, 1393); + } + dasm_put(Dst, 1396, LJ_TSTR, LJ_TTAB, Dt1(->base), Dt1(->top), LJ_TNIL, (2+1)*8, LJ_TTAB); +#ifdef LUAJIT_ENABLE_LUA52COMPAT + dasm_put(Dst, 1447, Dt6(->metatable), Dt8(->upvalue[0])); +#else + dasm_put(Dst, 1456, Dt8(->upvalue[0])); +#endif + dasm_put(Dst, 1460, (3+1)*8); + if (LJ_DUALNUM) { + dasm_put(Dst, 1472); + } else { + dasm_put(Dst, 1474); + } + dasm_put(Dst, 1476, LJ_TTAB); + if (LJ_DUALNUM) { + dasm_put(Dst, 1483); + } else { + dasm_put(Dst, 1488); + } + dasm_put(Dst, 1500, Dt6(->asize), Dt6(->array)); + if (!LJ_DUALNUM) { + dasm_put(Dst, 1505); + } + dasm_put(Dst, 1507); + if (LJ_DUALNUM) { + dasm_put(Dst, 1511, 31-3); + } else { + dasm_put(Dst, 1516, 31-3); + } + dasm_put(Dst, 1520, LJ_TNIL, (0+1)*8, (2+1)*8, Dt6(->hmask), (0+1)*8, (0+1)*8, LJ_TTAB); +#ifdef LUAJIT_ENABLE_LUA52COMPAT + dasm_put(Dst, 1568, Dt6(->metatable), Dt8(->upvalue[0])); +#else + dasm_put(Dst, 1577, Dt8(->upvalue[0])); +#endif + if (LJ_DUALNUM) { + dasm_put(Dst, 1581); + } else { + dasm_put(Dst, 1583); + } + dasm_put(Dst, 1585, (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, 1646, 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, 1708, Dt1(->maxstack), Dt1(->top), FRAME_TYPE, LJ_TTRUE, FRAME_TYPE, LJ_TFALSE, Dt1(->top), (2+1)*8, 32-3); + dasm_put(Dst, 1771, 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, 1830, Dt1(->base), DISPATCH_GL(vmstate), Dt1(->maxstack), Dt1(->top), FRAME_TYPE, 32-3, Dt1(->cframe)); + dasm_put(Dst, 1887, Dt1(->base), CFRAME_RESUME, Dt1(->top), LUA_YIELD, Dt1(->cframe), Dt1(->status)); + if (LJ_DUALNUM) { + dasm_put(Dst, 1912); + } + dasm_put(Dst, 1933, (1+1)*8, FRAME_TYPE); + if (LJ_DUALNUM) { + dasm_put(Dst, 1975, 31-11, 32-21, 31-11); + dasm_put(Dst, 2056, 31-11, 32-21, 31-11); + } else { + dasm_put(Dst, 2109); + } + dasm_put(Dst, 2136); + dasm_put(Dst, 2195); + dasm_put(Dst, 2253); + dasm_put(Dst, 2309, Dt8(->upvalue[0])); + dasm_put(Dst, 2375); + if (LJ_DUALNUM) { + dasm_put(Dst, 2379); + } else { + dasm_put(Dst, 2394); + } + dasm_put(Dst, 2412, DISPATCH_GL(tmptv), DISPATCH_GL(tmptv)); + if (!LJ_DUALNUM) { + dasm_put(Dst, 2434); + } + dasm_put(Dst, 2439, (2+1)*8); + if (LJ_DUALNUM) { + dasm_put(Dst, 2443); + } else { + dasm_put(Dst, 2446); + } + dasm_put(Dst, 2448, (2+1)*8); + if (LJ_DUALNUM) { + dasm_put(Dst, 2470); + } else { + dasm_put(Dst, 2539); + } + if (LJ_DUALNUM) { + dasm_put(Dst, 2564); + } else { + dasm_put(Dst, 2633); + } + dasm_put(Dst, 2658, LJ_TSTR, Dt5(->len), LJ_TSTR, Dt5(->len)); + if (LJ_DUALNUM) { + dasm_put(Dst, 2685, Dt5([1]), (0+1)*8); + } else { + dasm_put(Dst, 2697, Dt5([1]), 31-3); + } + dasm_put(Dst, 2713, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold)); + if (LJ_DUALNUM) { + dasm_put(Dst, 2724); + } else { + dasm_put(Dst, 2732); + } + dasm_put(Dst, 2743, Dt1(->base), Dt1(->base), LJ_TSTR, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold)); + if (!LJ_DUALNUM) { + dasm_put(Dst, 2771); + } + dasm_put(Dst, 2773); + if (LJ_DUALNUM) { + dasm_put(Dst, 2779); + } else { + dasm_put(Dst, 2781); + } + dasm_put(Dst, 2783); + if (LJ_DUALNUM) { + dasm_put(Dst, 2787); + } else { + dasm_put(Dst, 2796); + } + dasm_put(Dst, 2807, LJ_TSTR); + if (!LJ_DUALNUM) { + dasm_put(Dst, 2812); + } + dasm_put(Dst, 2816, Dt5(->len), sizeof(GCstr)-1, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold)); + if (LJ_DUALNUM) { + dasm_put(Dst, 2866); + } else { + dasm_put(Dst, 2868); + } + dasm_put(Dst, 2870, LJ_TSTR); + if (LJ_DUALNUM) { + dasm_put(Dst, 2877); + } else { + dasm_put(Dst, 2881); + } + dasm_put(Dst, 2888, Dt5(->len), DISPATCH_GL(tmpbuf.sz), Dt5([1]), DISPATCH_GL(tmpbuf.buf), DISPATCH_GL(strempty), LJ_TSTR, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), LJ_TSTR, DISPATCH_GL(tmpbuf.sz)); + dasm_put(Dst, 2941, 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, 2999, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), LJ_TSTR, DISPATCH_GL(tmpbuf.sz), Dt5(->len), sizeof(GCstr), DISPATCH_GL(tmpbuf.buf), LJ_TTAB); + if (LJ_DUALNUM) { + dasm_put(Dst, 3068); + } else { + dasm_put(Dst, 3078); + } + dasm_put(Dst, 3091); + if (LJ_DUALNUM) { + dasm_put(Dst, 3097); + } else { + dasm_put(Dst, 3099); + } + dasm_put(Dst, 3101); + if (LJ_DUALNUM) { + dasm_put(Dst, 3105); + } else { + dasm_put(Dst, 3108); + } + dasm_put(Dst, 3114); + if (LJ_DUALNUM) { + dasm_put(Dst, 3119); + } else { + dasm_put(Dst, 3129); + } + dasm_put(Dst, 3142); + if (LJ_DUALNUM) { + dasm_put(Dst, 3148); + } else { + dasm_put(Dst, 3150); + } + dasm_put(Dst, 3152); + if (LJ_DUALNUM) { + dasm_put(Dst, 3156); + } else { + dasm_put(Dst, 3159); + } + dasm_put(Dst, 3165); + if (LJ_DUALNUM) { + dasm_put(Dst, 3170); + } else { + dasm_put(Dst, 3180); + } + dasm_put(Dst, 3193); + if (LJ_DUALNUM) { + dasm_put(Dst, 3199); + } else { + dasm_put(Dst, 3201); + } + dasm_put(Dst, 3203); + if (LJ_DUALNUM) { + dasm_put(Dst, 3207); + } else { + dasm_put(Dst, 3210); + } + dasm_put(Dst, 3216); + if (LJ_DUALNUM) { + dasm_put(Dst, 3221); + } else { + dasm_put(Dst, 3231); + } + dasm_put(Dst, 3244); + if (LJ_DUALNUM) { + dasm_put(Dst, 3251); + } else { + dasm_put(Dst, 3261); + } + dasm_put(Dst, 3274); + if (LJ_DUALNUM) { + dasm_put(Dst, 3278); + } else { + dasm_put(Dst, 3293); + } + dasm_put(Dst, 3314); + if (LJ_DUALNUM) { + dasm_put(Dst, 3319); + } else { + dasm_put(Dst, 3334); + } + dasm_put(Dst, 3355); + if (LJ_DUALNUM) { + dasm_put(Dst, 3360); + } else { + dasm_put(Dst, 3375); + } + dasm_put(Dst, 3396); + if (LJ_DUALNUM) { + dasm_put(Dst, 3401); + } else { + dasm_put(Dst, 3416); + } + dasm_put(Dst, 3437); + if (LJ_DUALNUM) { + dasm_put(Dst, 3441); + } else { + dasm_put(Dst, 3456); + } + dasm_put(Dst, 3477); + if (LJ_DUALNUM) { + dasm_put(Dst, 3482); + } else { + dasm_put(Dst, 3492); + } + if (LJ_DUALNUM) { + dasm_put(Dst, 3505); + } else { + dasm_put(Dst, 3508); + } + dasm_put(Dst, 3514); + if (LJ_DUALNUM) { + dasm_put(Dst, 3522); + } + dasm_put(Dst, 3530); + if (LJ_DUALNUM) { + dasm_put(Dst, 3532); + } + dasm_put(Dst, 3540, Dt8(->f), 8*LUA_MINSTACK, Dt1(->maxstack), Dt1(->base), Dt1(->top), Dt1(->base), 31-3, Dt1(->top), Dt7(->pc), FRAME_TYPE, LUA_MINSTACK); + dasm_put(Dst, 3603, Dt1(->base), Dt1(->base), Dt1(->top), Dt1(->base), Dt1(->top)); +#if LJ_HASJIT + dasm_put(Dst, 3629); +#endif + dasm_put(Dst, 3631, 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, 3678, GG_DISP2STATIC); +#if LJ_HASJIT + dasm_put(Dst, 3696); +#endif + dasm_put(Dst, 3698); +#if LJ_HASJIT + dasm_put(Dst, 3701); +#endif + dasm_put(Dst, 3704); +#if LJ_HASJIT + dasm_put(Dst, 3706); +#endif + dasm_put(Dst, 3709, Dt1(->base), Dt1(->top), Dt1(->base), Dt1(->top)); +#if LJ_HASJIT + dasm_put(Dst, 3731); +#endif + dasm_put(Dst, 3733); +#if LJ_HASJIT + dasm_put(Dst, 3735); +#endif + dasm_put(Dst, 3737); +#if LJ_HASJIT + dasm_put(Dst, 3745); +#endif + dasm_put(Dst, 3748); +#if LJ_HASJIT + dasm_put(Dst, 3761); +#endif + dasm_put(Dst, 3763); +#if LJ_HASJIT + dasm_put(Dst, 3765); +#endif + dasm_put(Dst, 3767); +#if LJ_HASFFI + dasm_put(Dst, 3831); #endif } @@ -6055,7 +7882,7 @@ static void build_subroutines(BuildCtx *ctx) static void build_ins(BuildCtx *ctx, BCOp op, int defop) { int vk = 0; - dasm_put(Dst, 3168, defop); + dasm_put(Dst, 3833, defop); switch (op) { @@ -6064,115 +7891,198 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) /* 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); + if (LJ_DUALNUM) { + dasm_put(Dst, 3835, -(BCBIAS_J*4 >> 16)); + if (op == BC_ISLT) { + dasm_put(Dst, 3852); + } else if (op == BC_ISGE) { + dasm_put(Dst, 3855); + } else if (op == BC_ISLE) { + dasm_put(Dst, 3858); + } else { + dasm_put(Dst, 3861); + } + dasm_put(Dst, 3864); + if (op == BC_ISLT) { + dasm_put(Dst, 3901); + } else if (op == BC_ISGE) { + dasm_put(Dst, 3904); + } else if (op == BC_ISLE) { + dasm_put(Dst, 3907); + } else { + dasm_put(Dst, 3911); + } + dasm_put(Dst, 3915); } else { - dasm_put(Dst, 3197); + dasm_put(Dst, 3918, -(BCBIAS_J*4 >> 16)); + if (op == BC_ISLT) { + dasm_put(Dst, 3935); + } else if (op == BC_ISGE) { + dasm_put(Dst, 3938); + } else if (op == BC_ISLE) { + dasm_put(Dst, 3941); + } else { + dasm_put(Dst, 3945); + } + dasm_put(Dst, 3949); } - 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); + if (LJ_DUALNUM) { + dasm_put(Dst, 3962, -(BCBIAS_J*4 >> 16)); + if (vk) { + dasm_put(Dst, 3975); + } else { + dasm_put(Dst, 3978); + } } else { - dasm_put(Dst, 3235); + dasm_put(Dst, 3981, -(BCBIAS_J*4 >> 16)); + if (vk) { + dasm_put(Dst, 3998); + } else { + dasm_put(Dst, 4002); + } + dasm_put(Dst, 4006); } - dasm_put(Dst, 3239, ~LJ_TISPRI, ~LJ_TISTABUD); + dasm_put(Dst, 4018); + if (!LJ_DUALNUM) { + dasm_put(Dst, 4020); + } + dasm_put(Dst, 4023, ~LJ_TISPRI, ~LJ_TISTABUD); if (vk) { - dasm_put(Dst, 3267); + dasm_put(Dst, 4037); } else { - dasm_put(Dst, 3272); + dasm_put(Dst, 4042); } - dasm_put(Dst, 3277, Dt6(->metatable), 1-vk, Dt6(->nomm), 1<metatable), 1-vk, Dt6(->nomm), 1<> 16)); + dasm_put(Dst, 4084, 32-1, LJ_TSTR, -(BCBIAS_J*4 >> 16)); if (vk) { - dasm_put(Dst, 3316); + dasm_put(Dst, 4102); } else { - dasm_put(Dst, 3318); + dasm_put(Dst, 4104); } - dasm_put(Dst, 3320); + dasm_put(Dst, 4106); 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); + if (LJ_DUALNUM) { + dasm_put(Dst, 4118, -(BCBIAS_J*4 >> 16)); + if (vk) { + dasm_put(Dst, 4130); + } else { + dasm_put(Dst, 4132); + } + dasm_put(Dst, 4134); } else { - dasm_put(Dst, 3350); + if (vk) { + dasm_put(Dst, 4141); + } else { + dasm_put(Dst, 4143); + } + dasm_put(Dst, 4145, -(BCBIAS_J*4 >> 16)); } - dasm_put(Dst, 3356); - if (!vk) { - dasm_put(Dst, 3367, -(BCBIAS_J*4 >> 16)); + if (vk) { + dasm_put(Dst, 4158); + if (!LJ_HASFFI) { + dasm_put(Dst, 4163); + } + } else { + dasm_put(Dst, 4165); + if (!LJ_HASFFI) { + dasm_put(Dst, 4169); + } + dasm_put(Dst, 4171); + } + dasm_put(Dst, 4174); + if (LJ_HASFFI) { + dasm_put(Dst, 4185, LJ_TCDATA); + } + if (LJ_DUALNUM) { + dasm_put(Dst, 4193); } break; case BC_ISEQP: case BC_ISNEP: vk = op == BC_ISEQP; - dasm_put(Dst, 3374, 32-3, -(BCBIAS_J*4 >> 16)); + dasm_put(Dst, 4217, 32-3, -(BCBIAS_J*4 >> 16)); if (vk) { - dasm_put(Dst, 3387); + dasm_put(Dst, 4230); } else { - dasm_put(Dst, 3389); + dasm_put(Dst, 4232); } - dasm_put(Dst, 3391); + dasm_put(Dst, 4234); break; /* -- Unary test and copy ops ------------------------------------------- */ case BC_ISTC: case BC_ISFC: case BC_IST: case BC_ISF: - dasm_put(Dst, 3403); + dasm_put(Dst, 4246); if (op == BC_IST || op == BC_ISF) { - dasm_put(Dst, 3407, LJ_TTRUE, -(BCBIAS_J*4 >> 16)); + dasm_put(Dst, 4250, LJ_TTRUE, -(BCBIAS_J*4 >> 16)); if (op == BC_IST) { - dasm_put(Dst, 3414); + dasm_put(Dst, 4257); } else { - dasm_put(Dst, 3416); + dasm_put(Dst, 4259); } - dasm_put(Dst, 3418); + dasm_put(Dst, 4261); } else { - dasm_put(Dst, 3420, LJ_TFALSE); + dasm_put(Dst, 4263, LJ_TFALSE); if (op == BC_ISTC) { - dasm_put(Dst, 3425); + dasm_put(Dst, 4268); } else { - dasm_put(Dst, 3428); + dasm_put(Dst, 4271); } - dasm_put(Dst, 3431, -(BCBIAS_J*4 >> 16)); + dasm_put(Dst, 4274, -(BCBIAS_J*4 >> 16)); } - dasm_put(Dst, 3438); + dasm_put(Dst, 4281); break; /* -- Unary ops --------------------------------------------------------- */ case BC_MOV: - dasm_put(Dst, 3449); + dasm_put(Dst, 4292); break; case BC_NOT: - dasm_put(Dst, 3462, LJ_TTRUE); + dasm_put(Dst, 4305, LJ_TTRUE); break; case BC_UNM: - dasm_put(Dst, 3478); + dasm_put(Dst, 4321); + if (LJ_DUALNUM) { + dasm_put(Dst, 4325); + } + dasm_put(Dst, 4353); + if (LJ_DUALNUM) { + dasm_put(Dst, 4363); + } else { + dasm_put(Dst, 4366); + } break; case BC_LEN: - dasm_put(Dst, 3497, LJ_TSTR, Dt5(->len), LJ_TTAB); + dasm_put(Dst, 4375, LJ_TSTR, Dt5(->len)); + if (LJ_DUALNUM) { + dasm_put(Dst, 4385); + } else { + dasm_put(Dst, 4390); + } + dasm_put(Dst, 4397, LJ_TTAB); #ifdef LUAJIT_ENABLE_LUA52COMPAT - dasm_put(Dst, 3526, Dt6(->metatable)); + dasm_put(Dst, 4411, Dt6(->metatable)); #endif - dasm_put(Dst, 3533); + dasm_put(Dst, 4418); #ifdef LUAJIT_ENABLE_LUA52COMPAT - dasm_put(Dst, 3539, Dt6(->nomm), 1<nomm), 1<base), 32-3, Dt1(->base)); + dasm_put(Dst, 5167, Dt1(->base), 32-3, Dt1(->base)); break; /* -- Constant ops ------------------------------------------------------ */ case BC_KSTR: - dasm_put(Dst, 3819, 32-1, LJ_TSTR); + dasm_put(Dst, 5197, 32-1, LJ_TSTR); break; case BC_KCDATA: #if LJ_HASFFI - dasm_put(Dst, 3838, 32-1, LJ_TCDATA); + dasm_put(Dst, 5216, 32-1, LJ_TCDATA); #endif break; case BC_KSHORT: - dasm_put(Dst, 3857, 31-13); + if (LJ_DUALNUM) { + dasm_put(Dst, 5235, 31-13); + } else { + dasm_put(Dst, 5251, 31-13); + } break; case BC_KNUM: - dasm_put(Dst, 3876); + dasm_put(Dst, 5270); break; case BC_KPRI: - dasm_put(Dst, 3889, 32-3); + dasm_put(Dst, 5283, 32-3); break; case BC_KNIL: - dasm_put(Dst, 3904); + dasm_put(Dst, 5298); break; /* -- Upvalue and function ops ------------------------------------------ */ case BC_UGET: - dasm_put(Dst, 3923, 32-1, offsetof(GCfuncL, uvptr), DtA(->v)); + dasm_put(Dst, 5317, 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); + dasm_put(Dst, 5338, 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); + dasm_put(Dst, 5391, 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)); + dasm_put(Dst, 5442, 32-1, offsetof(GCfuncL, uvptr), DtA(->v)); break; case BC_USETP: - dasm_put(Dst, 4069, 32-1, offsetof(GCfuncL, uvptr), 32-3, DtA(->v)); + dasm_put(Dst, 5463, 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)); + dasm_put(Dst, 5486, 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); + dasm_put(Dst, 5516, 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)); + dasm_put(Dst, 5544, DISPATCH_GL(gc.total), DISPATCH_GL(gc.threshold), Dt1(->base)); if (op == BC_TNEW) { - dasm_put(Dst, 4163); + dasm_put(Dst, 5557); } else { - dasm_put(Dst, 4172, 32-1); + dasm_put(Dst, 5566, 32-1); } - dasm_put(Dst, 4179, Dt1(->base), LJ_TTAB); + dasm_put(Dst, 5573, Dt1(->base), LJ_TTAB); if (op == BC_TNEW) { - dasm_put(Dst, 4196); + dasm_put(Dst, 5590); } - dasm_put(Dst, 4201); + dasm_put(Dst, 5595); break; case BC_GGET: case BC_GSET: - dasm_put(Dst, 4210, 32-1, Dt7(->env)); + dasm_put(Dst, 5604, 32-1, Dt7(->env)); if (op == BC_GGET) { - dasm_put(Dst, 4218); + dasm_put(Dst, 5612); } else { - dasm_put(Dst, 4221); + dasm_put(Dst, 5615); } break; case BC_TGETV: - dasm_put(Dst, 4224, LJ_TTAB, Dt6(->asize), Dt6(->array), 31-3, LJ_TNIL, Dt6(->metatable), Dt6(->nomm), 1<asize), Dt6(->array), 31-3); + } else { + dasm_put(Dst, 5642, Dt6(->asize), Dt6(->array), 31-3); + } + dasm_put(Dst, 5659, 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<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, 5765, LJ_TNIL, Dt6(->metatable), Dt6(->nomm), 1<asize), Dt6(->array), 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)); + dasm_put(Dst, 5833); + if (LJ_DUALNUM) { + dasm_put(Dst, 5837); + } else { + dasm_put(Dst, 5839); + } + dasm_put(Dst, 5841, LJ_TTAB); + if (LJ_DUALNUM) { + dasm_put(Dst, 5847, Dt6(->asize), Dt6(->array), 31-3); + } else { + dasm_put(Dst, 5857, Dt6(->asize), Dt6(->array), 31-3); + } + dasm_put(Dst, 5874, Dt6(->marked), LJ_TNIL, LJ_GC_BLACK, Dt6(->metatable), Dt6(->nomm), 1<marked), Dt6(->gclist)); break; - dasm_put(Dst, 4509, LJ_TSTR, LJ_TNIL); + dasm_put(Dst, 5938, 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)); + dasm_put(Dst, 5964, 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, 6015, 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)); + dasm_put(Dst, 6096, 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); + dasm_put(Dst, 6164, 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, 6233); break; /* -- Calls and vararg handling ----------------------------------------- */ case BC_CALLM: - dasm_put(Dst, 4807); + dasm_put(Dst, 6236); break; case BC_CALL: - dasm_put(Dst, 4809, LJ_TFUNC, Dt7(->pc)); + dasm_put(Dst, 6238, LJ_TFUNC, Dt7(->pc)); break; case BC_CALLMT: - dasm_put(Dst, 4830); + dasm_put(Dst, 6259); 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); + dasm_put(Dst, 6261, LJ_TFUNC, FRAME_TYPE, Dt7(->ffid), FRAME_VARG, Dt7(->pc), -4-8, Dt7(->pc), PC2PROTO(k), FRAME_TYPEP); + dasm_put(Dst, 6325, FRAME_TYPE); break; case BC_ITERC: - dasm_put(Dst, 4905, LJ_TFUNC, Dt7(->pc)); + dasm_put(Dst, 6334, 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); + dasm_put(Dst, 6361, Dt6(->asize), Dt6(->array), 31-3, LJ_TNIL); + if (LJ_DUALNUM) { + dasm_put(Dst, 6383); + } else { + dasm_put(Dst, 6386); + } + dasm_put(Dst, 6390, -(BCBIAS_J*4 >> 16)); + if (!LJ_DUALNUM) { + dasm_put(Dst, 6398); + } + dasm_put(Dst, 6400, Dt6(->hmask), Dt6(->node), 31-5, 31-3, LJ_TNIL, DtB(->key), -(BCBIAS_J*4 >> 16)); 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)); + dasm_put(Dst, 6456, 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); + dasm_put(Dst, 6506, FRAME_VARG, Dt1(->maxstack), Dt1(->top), Dt1(->base), 32-3, Dt1(->base)); + dasm_put(Dst, 6586); break; /* -- Returns ----------------------------------------------------------- */ case BC_RETM: - dasm_put(Dst, 5157); + dasm_put(Dst, 6592); break; case BC_RET: - dasm_put(Dst, 5159, FRAME_TYPE, FRAME_VARG, Dt7(->pc), PC2PROTO(k), FRAME_TYPEP); + dasm_put(Dst, 6594, 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); + dasm_put(Dst, 6664, FRAME_TYPE, FRAME_VARG); if (op == BC_RET1) { - dasm_put(Dst, 5242); + dasm_put(Dst, 6677); } - dasm_put(Dst, 5245, Dt7(->pc), PC2PROTO(k)); + dasm_put(Dst, 6680, Dt7(->pc), PC2PROTO(k)); break; /* -- Loops and branches ------------------------------------------------ */ case BC_FORL: #if LJ_HASJIT - dasm_put(Dst, 5273); + dasm_put(Dst, 6708); #endif break; @@ -6455,45 +8736,94 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) case BC_FORI: case BC_IFORL: vk = (op == BC_IFORL || op == BC_JFORL); + if (LJ_DUALNUM) { + dasm_put(Dst, 6710, FORL_IDX*8+4); + if (vk) { + dasm_put(Dst, 6715, FORL_STEP*8+4, FORL_STOP*8+4, FORL_IDX*8+4); + } else { + dasm_put(Dst, 6729, FORL_STEP*8, FORL_STEP*8+4, FORL_STOP*8, FORL_STOP*8+4); + } + dasm_put(Dst, 6745, FORL_EXT*8); + if (op != BC_JFORL) { + dasm_put(Dst, 6752, 32-1); + } + dasm_put(Dst, 6755, FORL_EXT*8+4); + if (op != BC_JFORL) { + dasm_put(Dst, 6758); + } + if (op == BC_FORI) { + dasm_put(Dst, 6760); + } else if (op == BC_JFORI) { + dasm_put(Dst, 6763, -(BCBIAS_J*4 >> 16), BC_JLOOP); + } else if (op == BC_IFORL) { + dasm_put(Dst, 6768, -(BCBIAS_J*4 >> 16)); + } else { + dasm_put(Dst, 6773, BC_JLOOP); + } + dasm_put(Dst, 6776); + if (vk) { + dasm_put(Dst, 6792); + } + } if (vk) { - dasm_put(Dst, 5275, FORL_STEP*8, FORL_STOP*8, FORL_STEP*8, FORL_IDX*8); + if (LJ_DUALNUM) { + dasm_put(Dst, 6799, FORL_IDX*8); + } else { + dasm_put(Dst, 6803); + } + dasm_put(Dst, 6805, 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); + if (LJ_DUALNUM) { + dasm_put(Dst, 6815); + } else { + dasm_put(Dst, 6817, FORL_STEP*8, FORL_STOP*8); + } + dasm_put(Dst, 6826, FORL_IDX*8, FORL_STEP*8, FORL_STOP*8); } - dasm_put(Dst, 5305); + dasm_put(Dst, 6837); if (op != BC_JFORL) { - dasm_put(Dst, 5307, 32-1); + dasm_put(Dst, 6839, 32-1); } - dasm_put(Dst, 5310, FORL_EXT*8); + dasm_put(Dst, 6842, FORL_EXT*8); if (op != BC_JFORL) { - dasm_put(Dst, 5313); + dasm_put(Dst, 6845); } - dasm_put(Dst, 5315); + dasm_put(Dst, 6847); if (op == BC_JFORI) { - dasm_put(Dst, 5317, -(BCBIAS_J*4 >> 16)); + dasm_put(Dst, 6849, -(BCBIAS_J*4 >> 16)); } - dasm_put(Dst, 5320); + dasm_put(Dst, 6852); if (op == BC_FORI) { - dasm_put(Dst, 5323); + dasm_put(Dst, 6855); } else if (op == BC_IFORL) { - dasm_put(Dst, 5326, -(BCBIAS_J*4 >> 16)); + if (LJ_DUALNUM) { + dasm_put(Dst, 6858); + } else { + dasm_put(Dst, 6861); + } + dasm_put(Dst, 6864, -(BCBIAS_J*4 >> 16)); } else { - dasm_put(Dst, 5332, BC_JLOOP); + dasm_put(Dst, 6868, BC_JLOOP); } - dasm_put(Dst, 5335); + if (LJ_DUALNUM) { + dasm_put(Dst, 6871); + } else { + dasm_put(Dst, 6874); + } + dasm_put(Dst, 6886); if (op == BC_FORI) { - dasm_put(Dst, 5348, -(BCBIAS_J*4 >> 16)); + dasm_put(Dst, 6888, -(BCBIAS_J*4 >> 16)); } else if (op == BC_IFORL) { - dasm_put(Dst, 5354); + dasm_put(Dst, 6894); } else { - dasm_put(Dst, 5357, BC_JLOOP); + dasm_put(Dst, 6897, BC_JLOOP); } - dasm_put(Dst, 5360); + dasm_put(Dst, 6900); break; case BC_ITERL: #if LJ_HASJIT - dasm_put(Dst, 5363); + dasm_put(Dst, 6903); #endif break; @@ -6502,40 +8832,40 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) break; #endif case BC_IITERL: - dasm_put(Dst, 5365, LJ_TNIL); + dasm_put(Dst, 6905, LJ_TNIL); if (op == BC_JITERL) { - dasm_put(Dst, 5372); + dasm_put(Dst, 6912); } else { - dasm_put(Dst, 5374, 32-1, -(BCBIAS_J*4 >> 16)); + dasm_put(Dst, 6914, 32-1, -(BCBIAS_J*4 >> 16)); } - dasm_put(Dst, 5382); + dasm_put(Dst, 6922); break; case BC_LOOP: #if LJ_HASJIT - dasm_put(Dst, 5394); + dasm_put(Dst, 6934); #endif break; case BC_ILOOP: - dasm_put(Dst, 5396); + dasm_put(Dst, 6936); break; case BC_JLOOP: #if LJ_HASJIT - dasm_put(Dst, 5407); + dasm_put(Dst, 6947); #endif break; case BC_JMP: - dasm_put(Dst, 5409, 32-1, -(BCBIAS_J*4 >> 16)); + dasm_put(Dst, 6949, 32-1, -(BCBIAS_J*4 >> 16)); break; /* -- Function headers -------------------------------------------------- */ case BC_FUNCF: #if LJ_HASJIT - dasm_put(Dst, 5425); + dasm_put(Dst, 6965); #endif case BC_FUNCV: /* NYI: compiled vararg functions. */ break; @@ -6545,38 +8875,38 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) break; #endif case BC_IFUNCF: - dasm_put(Dst, 5427, Dt1(->maxstack), -4+PC2PROTO(numparams), -4+PC2PROTO(k), 31-3); + dasm_put(Dst, 6967, Dt1(->maxstack), -4+PC2PROTO(numparams), -4+PC2PROTO(k), 31-3); if (op == BC_JFUNCF) { - dasm_put(Dst, 5445); + dasm_put(Dst, 6985); } else { - dasm_put(Dst, 5447); + dasm_put(Dst, 6987); } - dasm_put(Dst, 5456); + dasm_put(Dst, 6996); break; case BC_JFUNCV: #if !LJ_HASJIT break; #endif - dasm_put(Dst, 5462); + dasm_put(Dst, 7002); 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); + dasm_put(Dst, 7004, 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)); + dasm_put(Dst, 7057, Dt8(->f)); } else { - dasm_put(Dst, 5520, DISPATCH_GL(wrapf)); + dasm_put(Dst, 7060, DISPATCH_GL(wrapf)); } - dasm_put(Dst, 5523, Dt1(->maxstack), Dt1(->base), Dt1(->top), ~LJ_VMST_C); + dasm_put(Dst, 7063, Dt1(->maxstack), Dt1(->base), Dt1(->top), ~LJ_VMST_C); if (op == BC_FUNCCW) { - dasm_put(Dst, 5536, Dt8(->f)); + dasm_put(Dst, 7076, Dt8(->f)); } - dasm_put(Dst, 5539, DISPATCH_GL(vmstate), Dt1(->top), 31-3, Dt1(->base), ~LJ_VMST_INTERP, DISPATCH_GL(vmstate)); + dasm_put(Dst, 7079, DISPATCH_GL(vmstate), Dt1(->top), 31-3, Dt1(->base), ~LJ_VMST_INTERP, DISPATCH_GL(vmstate)); break; /* ---------------------------------------------------------------------- */ @@ -6596,7 +8926,7 @@ static int build_backend(BuildCtx *ctx) build_subroutines(ctx); - dasm_put(Dst, 5560); + dasm_put(Dst, 7100); for (op = 0; op < BC__MAX; op++) build_ins(ctx, (BCOp)op, op); diff --git a/src/lj_arch.h b/src/lj_arch.h index 826c54c1..ceaee6e7 100644 --- a/src/lj_arch.h +++ b/src/lj_arch.h @@ -162,7 +162,7 @@ #define LJ_TARGET_MASKSHIFT 0 #define LJ_TARGET_MASKROT 1 #define LJ_TARGET_UNIFYROT 1 /* Want only IR_BROL. */ -#define LJ_ARCH_NUMMODE LJ_NUMMODE_SINGLE /* NYI: dual-num. */ +#define LJ_ARCH_NUMMODE LJ_NUMMODE_DUAL_SINGLE #define LJ_ARCH_NOFFI 1 /* NYI: comparisons, calls. */ #define LJ_ARCH_NOJIT 1