From 7da4d16faa5009f181b24c17d6fb73830f52fea7 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Mon, 11 Jun 2012 00:50:22 +0200 Subject: [PATCH] PPC: Cleanup interpreter. Use DynASM defines instead of C defines. --- src/vm_ppc.dasc | 1482 +++++++++++++++++++++++------------------------ 1 file changed, 741 insertions(+), 741 deletions(-) diff --git a/src/vm_ppc.dasc b/src/vm_ppc.dasc index 7dcdf987..d2d10b3e 100644 --- a/src/vm_ppc.dasc +++ b/src/vm_ppc.dasc @@ -613,29 +613,29 @@ static void build_subroutines(BuildCtx *ctx) | mr RB, BASE | mr BASE, TMP2 // Restore caller BASE. | lwz LFUNC:TMP1, FRAME_FUNC(TMP2) -#if LJ_HASFFI + |.if FFI | cmplwi TMP0, 1 -#endif + |.endif | lwz PC, -16(RB) // Restore PC from [cont|PC]. | subi TMP2, RD, 8 | lwz TMP1, LFUNC:TMP1->pc | stwx TISNIL, RA, TMP2 // Ensure one valid arg. -#if LJ_HASFFI + |.if FFI | ble >1 -#endif + |.endif | lwz KBASE, PC2PROTO(k)(TMP1) | // BASE = base, RA = resultptr, RB = meta base | mtctr TMP0 | bctr // Jump to continuation. | -#if LJ_HASFFI + |.if FFI |1: | beq ->cont_ffi_callback // cont = 1: return from FFI callback. | // cont = 0: tailcall from C function. | subi TMP1, RB, 16 | sub RC, TMP1, BASE | b ->vm_call_tail -#endif + |.endif | |->cont_cat: // RA = resultptr, RB = meta base | lwz INS, -4(PC) @@ -675,18 +675,18 @@ static void build_subroutines(BuildCtx *ctx) | b >1 | |->vmeta_tgetb: // TMP0 = index - if (!LJ_DUALNUM) { - | tonum_u f0, TMP0 - } + |.if not DUALNUM + | tonum_u f0, TMP0 + |.endif | decode_RB8 RB, INS | la CARG3, DISPATCH_GL(tmptv)(DISPATCH) | add CARG2, BASE, RB - if (LJ_DUALNUM) { - | stw TISNUM, 0(CARG3) - | stw TMP0, 4(CARG3) - } else { - | stfd f0, 0(CARG3) - } + |.if DUALNUM + | stw TISNUM, 0(CARG3) + | stw TMP0, 4(CARG3) + |.else + | stfd f0, 0(CARG3) + |.endif | b >1 | |->vmeta_tgetv: @@ -740,18 +740,18 @@ static void build_subroutines(BuildCtx *ctx) | b >1 | |->vmeta_tsetb: // TMP0 = index - if (!LJ_DUALNUM) { - | tonum_u f0, TMP0 - } + |.if not DUALNUM + | tonum_u f0, TMP0 + |.endif | decode_RB8 RB, INS | la CARG3, DISPATCH_GL(tmptv)(DISPATCH) | add CARG2, BASE, RB - if (LJ_DUALNUM) { - | stw TISNUM, 0(CARG3) - | stw TMP0, 4(CARG3) - } else { - | stfd f0, 0(CARG3) - } + |.if DUALNUM + | stw TISNUM, 0(CARG3) + | stw TMP0, 4(CARG3) + |.else + | stfd f0, 0(CARG3) + |.endif | b >1 | |->vmeta_tsetv: @@ -789,17 +789,17 @@ static void build_subroutines(BuildCtx *ctx) |->vmeta_comp: | mr CARG1, L | subi PC, PC, 4 - if (LJ_DUALNUM) { - | mr CARG2, RA - } else { - | add CARG2, BASE, RA - } + |.if DUALNUM + | mr CARG2, RA + |.else + | add CARG2, BASE, RA + |.endif | stw PC, SAVE_PC - if (LJ_DUALNUM) { - | mr CARG3, RD - } else { - | add CARG3, BASE, RD - } + |.if DUALNUM + | mr CARG3, RD + |.else + | add CARG3, BASE, RD + |.endif | stw BASE, L->base | decode_OP1 CARG4, INS | bl extern lj_meta_comp // (lua_State *L, TValue *o1, *o2, int op) @@ -849,7 +849,7 @@ static void build_subroutines(BuildCtx *ctx) | b <3 | |->vmeta_equal_cd: -#if LJ_HASFFI + |.if FFI | mr CARG2, INS | subi PC, PC, 4 | stw BASE, L->base @@ -858,7 +858,7 @@ static void build_subroutines(BuildCtx *ctx) | bl extern lj_meta_equal_cd // (lua_State *L, BCIns op) | // Returns 0/1 or TValue * (metamethod). | b <3 -#endif + |.endif | |//-- Arithmetic metamethods --------------------------------------------- | @@ -867,11 +867,11 @@ static void build_subroutines(BuildCtx *ctx) | add CARG4, BASE, RB | b >1 |->vmeta_arith_nv2: - if (LJ_DUALNUM) { - | mr CARG3, RC - | mr CARG4, RB - | b >1 - } + |.if DUALNUM + | mr CARG3, RC + | mr CARG4, RB + | b >1 + |.endif | |->vmeta_unm: | mr CARG3, RD @@ -886,15 +886,15 @@ static void build_subroutines(BuildCtx *ctx) |->vmeta_arith_vv: | add CARG3, BASE, RB | add CARG4, BASE, RC - if (LJ_DUALNUM) { - | b >1 - } + |.if DUALNUM + | b >1 + |.endif |->vmeta_arith_vn2: |->vmeta_arith_vv2: - if (LJ_DUALNUM) { - | mr CARG3, RB - | mr CARG4, RC - } + |.if DUALNUM + | mr CARG3, RB + | mr CARG4, RC + |.endif |1: | add CARG2, BASE, RA | stw BASE, L->base @@ -974,17 +974,17 @@ static void build_subroutines(BuildCtx *ctx) | stw PC, SAVE_PC | mr SAVE0, INS | bl extern lj_meta_for // (lua_State *L, TValue *base) -#if LJ_HASJIT + |.if JIT | decode_OP1 TMP0, SAVE0 -#endif + |.endif | decode_RA8 RA, SAVE0 -#if LJ_HASJIT + |.if JIT | cmpwi TMP0, BC_JFORI -#endif + |.endif | decode_RD8 RD, SAVE0 -#if LJ_HASJIT + |.if JIT | beqy =>BC_JFORI -#endif + |.endif | b =>BC_FORI | |//----------------------------------------------------------------------- @@ -1181,11 +1181,11 @@ static void build_subroutines(BuildCtx *ctx) | ffgccheck | mr CARG1, L | mr CARG2, BASE - 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) - } + |.if DUALNUM + | bl extern lj_str_fromnumber // (lua_State *L, cTValue *o) + |.else + | bl extern lj_str_fromnum // (lua_State *L, lua_Number *np) + |.endif | // Returns GCstr *. | li CARG3, LJ_TSTR | b ->fff_restv @@ -1243,43 +1243,43 @@ static void build_subroutines(BuildCtx *ctx) | lwz CARG3, 0(BASE) | lwz TAB:CARG1, 4(BASE) | lwz CARG4, 8(BASE) - if (LJ_DUALNUM) { - | lwz TMP2, 12(BASE) - } else { - | lfd FARG2, 8(BASE) - } + |.if DUALNUM + | lwz TMP2, 12(BASE) + |.else + | lfd FARG2, 8(BASE) + |.endif | blt ->fff_fallback | checktab CARG3 | checknum cr1, CARG4 | lwz PC, FRAME_PC(BASE) - 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 - } + |.if 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 + |.endif | lwz TMP0, TAB:CARG1->asize | lwz TMP1, TAB:CARG1->array - if (!LJ_DUALNUM) { - | fadd FARG2, FARG2, FARG1 - } + |.if not DUALNUM + | fadd FARG2, FARG2, FARG1 + |.endif | addi TMP2, TMP2, 1 | la RA, -8(BASE) | cmplw TMP0, TMP2 - if (LJ_DUALNUM) { - | stw TISNUM, 0(RA) - | slwi TMP3, TMP2, 3 - | stw TMP2, 4(RA) - } else { - | slwi TMP3, TMP2, 3 - | stfd FARG2, 0(RA) - } + |.if DUALNUM + | stw TISNUM, 0(RA) + | slwi TMP3, TMP2, 3 + | stw TMP2, 4(RA) + |.else + | slwi TMP3, TMP2, 3 + | stfd FARG2, 0(RA) + |.endif | ble >2 // Not in array part? | lwzx TMP2, TMP1, TMP3 | lfdx f0, TMP1, TMP3 @@ -1319,11 +1319,11 @@ static void build_subroutines(BuildCtx *ctx) | lfd f0, CFUNC:RB->upvalue[0] | la RA, -8(BASE) #endif - if (LJ_DUALNUM) { - | stw TISNUM, 8(BASE) - } else { - | stw ZERO, 8(BASE) - } + |.if DUALNUM + | stw TISNUM, 8(BASE) + |.else + | stw ZERO, 8(BASE) + |.endif | stw ZERO, 12(BASE) | li RD, (3+1)*8 | stfd f0, 0(RA) @@ -1498,24 +1498,24 @@ static void build_subroutines(BuildCtx *ctx) | |.ffunc_1 math_abs | 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: - } + |.if 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: + |.endif | bge ->fff_fallback | rlwinm CARG3, CARG3, 0, 1, 31 | // Fallthrough. @@ -1635,14 +1635,14 @@ static void build_subroutines(BuildCtx *ctx) | b ->fff_resn |.endmacro | - if (LJ_DUALNUM) { - | math_round floor - | math_round ceil - } else { - | // NYI: use internal implementation. - | math_extern floor - | math_extern ceil - } + |.if DUALNUM + | math_round floor + | math_round ceil + |.else + | // NYI: use internal implementation. + | math_extern floor + | math_extern ceil + |.endif | | math_extern sqrt | math_extern log @@ -1667,20 +1667,20 @@ static void build_subroutines(BuildCtx *ctx) | fmul FARG1, FARG1, FARG2 | b ->fff_resn | - 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 - } + |.if 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 + |.endif | bl extern ldexp | b ->fff_resn | @@ -1690,17 +1690,17 @@ static void build_subroutines(BuildCtx *ctx) | bl extern frexp | lwz TMP1, DISPATCH_GL(tmptv)(DISPATCH) | la RA, -8(BASE) - if (!LJ_DUALNUM) { - | tonum_i FARG2, TMP1 - } + |.if not DUALNUM + | tonum_i FARG2, TMP1 + |.endif | stfd FARG1, 0(RA) | li RD, (2+1)*8 - if (LJ_DUALNUM) { - | stw TISNUM, 8(RA) - | stw TMP1, 12(RA) - } else { - | stfd FARG2, 8(RA) - } + |.if DUALNUM + | stw TISNUM, 8(RA) + | stw TMP1, 12(RA) + |.else + | stfd FARG2, 8(RA) + |.endif | b ->fff_res | |.ffunc_n math_modf @@ -1713,7 +1713,7 @@ static void build_subroutines(BuildCtx *ctx) | b ->fff_res | |.macro math_minmax, name, ismax - ||if (LJ_DUALNUM) { + |.if DUALNUM | .ffunc_1 name | checknum CARG3 | addi TMP1, BASE, 8 @@ -1767,7 +1767,7 @@ static void build_subroutines(BuildCtx *ctx) | bne ->fff_fallback | tonum_i FARG2, CARG2 | b <6 - ||} else { + |.else | .ffunc_n name | li TMP1, 8 |1: @@ -1785,7 +1785,7 @@ static void build_subroutines(BuildCtx *ctx) | fsel FARG1, f0, FARG2, FARG1 |.endif | b <1 - ||} + |.endif |.endmacro | | math_minmax math_min, 0 @@ -1806,45 +1806,45 @@ static void build_subroutines(BuildCtx *ctx) | checkstr CARG3 | bne ->fff_fallback | lwz TMP0, STR:CARG1->len - 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) - | beqy ->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 - } + |.if 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) + | beqy ->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 + |.endif | |.ffunc string_char // Only handle the 1-arg case here. | ffgccheck | cmplwi NARGS8:RC, 8 | lwz CARG3, 0(BASE) - 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 - } + |.if 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 + |.endif | li CARG3, 1 | cmplwi TMP0, 255; bgt ->fff_fallback |->fff_newstr: @@ -1861,36 +1861,36 @@ static void build_subroutines(BuildCtx *ctx) | ffgccheck | cmplwi NARGS8:RC, 16 | lwz CARG3, 16(BASE) - if (!LJ_DUALNUM) { - | lfd f0, 16(BASE) - } + |.if not DUALNUM + | lfd f0, 16(BASE) + |.endif | lwz TMP0, 0(BASE) | lwz STR:CARG1, 4(BASE) | blt ->fff_fallback | lwz CARG2, 8(BASE) - if (LJ_DUALNUM) { - | lwz TMP1, 12(BASE) - } else { - | lfd f1, 8(BASE) - } + |.if DUALNUM + | lwz TMP1, 12(BASE) + |.else + | lfd f1, 8(BASE) + |.endif | li TMP2, -1 | beq >1 - 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 - } + |.if 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 + |.endif | checkstr TMP0; bne ->fff_fallback - if (!LJ_DUALNUM) { - | toint TMP1, f1 - } + |.if not DUALNUM + | toint TMP1, f1 + |.endif | lwz TMP0, STR:CARG1->len | cmplw TMP0, TMP2 // len < end? (unsigned compare) | addi TMP3, TMP2, 1 @@ -1930,19 +1930,19 @@ static void build_subroutines(BuildCtx *ctx) | lwz TMP0, 0(BASE) | lwz STR:CARG1, 4(BASE) | lwz CARG4, 8(BASE) - if (LJ_DUALNUM) { - | lwz CARG3, 12(BASE) - } else { - | lfd FARG2, 8(BASE) - } + |.if DUALNUM + | lwz CARG3, 12(BASE) + |.else + | lfd FARG2, 8(BASE) + |.endif | blt ->fff_fallback | checkstr TMP0; bne ->fff_fallback - if (LJ_DUALNUM) { - | checknum CARG4; bne ->fff_fallback - } else { - | checknum CARG4; bge ->fff_fallback - | toint CARG3, FARG2 - } + |.if DUALNUM + | checknum CARG4; bne ->fff_fallback + |.else + | checknum CARG4; bge ->fff_fallback + | toint CARG3, FARG2 + |.endif | lwz TMP0, STR:CARG1->len | cmpwi CARG3, 0 | lwz TMP1, DISPATCH_GL(tmpbuf.sz)(DISPATCH) @@ -2036,15 +2036,15 @@ static void build_subroutines(BuildCtx *ctx) |//-- Bit library -------------------------------------------------------- | |.macro .ffunc_bit, name - ||if (LJ_DUALNUM) { + |.if DUALNUM | .ffunc_1 bit_..name | checknum CARG3; bnel ->fff_tobit_fb - ||} else { + |.else | .ffunc_n bit_..name | fadd FARG1, FARG1, TOBIT | stfd FARG1, TMPD | lwz CARG1, TMPD_LO - ||} + |.endif |.endmacro | |.macro .ffunc_bit_op, name, ins @@ -2054,21 +2054,21 @@ static void build_subroutines(BuildCtx *ctx) |1: | lwz CARG4, 0(TMP1) | cmplw cr1, TMP1, TMP2 - ||if (LJ_DUALNUM) { + |.if DUALNUM | lwz CARG2, 4(TMP1) - ||} else { + |.else | lfd FARG1, 0(TMP1) - ||} + |.endif | bgey cr1, ->fff_resi | checknum CARG4 - ||if (LJ_DUALNUM) { + |.if DUALNUM | bnel ->fff_bitop_fb - ||} else { + |.else | fadd FARG1, FARG1, TOBIT | bge ->fff_fallback | stfd FARG1, TMPD | lwz CARG2, TMPD_LO - ||} + |.endif | ins CARG1, CARG1, CARG2 | addi TMP1, TMP1, 8 | b <1 @@ -2090,12 +2090,12 @@ static void build_subroutines(BuildCtx *ctx) | b ->fff_resi | |.macro .ffunc_bit_sh, name, ins, shmod - ||if (LJ_DUALNUM) { + |.if 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 { + |.else | .ffunc_nn bit_..name | fadd FARG1, FARG1, TOBIT | fadd FARG2, FARG2, TOBIT @@ -2103,7 +2103,7 @@ static void build_subroutines(BuildCtx *ctx) | lwz CARG1, TMPD_LO | stfd FARG2, TMPD | lwz CARG2, TMPD_LO - ||} + |.endif |.if shmod == 1 | rlwinm CARG2, CARG2, 0, 27, 31 |.elif shmod == 2 @@ -2120,12 +2120,12 @@ static void build_subroutines(BuildCtx *ctx) |.ffunc_bit_sh ror, rotlw, 2 | |.ffunc_bit tobit - if (LJ_DUALNUM) { - | b ->fff_resi - } else { - |->fff_resi: - | tonum_i FARG1, CRET1 - } + |.if DUALNUM + | b ->fff_resi + |.else + |->fff_resi: + | tonum_i FARG1, CRET1 + |.endif |->fff_resn: | lwz PC, FRAME_PC(BASE) | la RA, -8(BASE) @@ -2134,23 +2134,23 @@ static void build_subroutines(BuildCtx *ctx) | |// 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 - } + |.if DUALNUM + | lfd FARG1, 0(BASE) + | bgt ->fff_fallback + | fadd FARG1, FARG1, TOBIT + | stfd FARG1, TMPD + | lwz CARG1, TMPD_LO + | blr + |.endif |->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 - } + |.if DUALNUM + | lfd FARG1, 0(TMP1) + | bgt ->fff_fallback + | fadd FARG1, FARG1, TOBIT + | stfd FARG1, TMPD + | lwz CARG2, TMPD_LO + | blr + |.endif | |//----------------------------------------------------------------------- | @@ -2222,7 +2222,7 @@ static void build_subroutines(BuildCtx *ctx) |//----------------------------------------------------------------------- | |->vm_record: // Dispatch target for recording phase. -#if LJ_HASJIT + |.if JIT | lbz TMP3, DISPATCH_GL(hookmask)(DISPATCH) | andi. TMP0, TMP3, HOOK_VMEVENT // No recording while in vmevent. | bne >5 @@ -2235,7 +2235,7 @@ static void build_subroutines(BuildCtx *ctx) | beqy >1 | stw TMP2, DISPATCH_GL(hookcount)(DISPATCH) | b >1 -#endif + |.endif | |->vm_rethook: // Dispatch target for return hooks. | lbz TMP3, DISPATCH_GL(hookmask)(DISPATCH) @@ -2287,7 +2287,7 @@ static void build_subroutines(BuildCtx *ctx) | b <4 | |->vm_hotloop: // Hot loop counter underflow. -#if LJ_HASJIT + |.if JIT | lwz LFUNC:TMP1, FRAME_FUNC(BASE) | addi CARG1, DISPATCH, GG_DISP2J | stw PC, SAVE_PC @@ -2301,19 +2301,19 @@ static void build_subroutines(BuildCtx *ctx) | stw TMP1, L->top | bl extern lj_trace_hot // (jit_State *J, const BCIns *pc) | b <3 -#endif + |.endif | |->vm_callhook: // Dispatch target for call hooks. | mr CARG2, PC -#if LJ_HASJIT + |.if JIT | b >1 -#endif + |.endif | |->vm_hotcall: // Hot call counter underflow. -#if LJ_HASJIT + |.if JIT | ori CARG2, PC, 1 |1: -#endif + |.endif | add TMP0, BASE, RC | stw PC, SAVE_PC | mr CARG1, L @@ -2344,7 +2344,7 @@ static void build_subroutines(BuildCtx *ctx) |.endmacro | |->vm_exit_handler: -#if LJ_HASJIT + |.if JIT | addi sp, sp, -(16+32*8+32*4) | stmw r2, 16+32*8+2*4(sp) | addi DISPATCH, JGL, -GG_DISP2G-32768 @@ -2389,9 +2389,9 @@ static void build_subroutines(BuildCtx *ctx) | stw TMP2, 0(sp) | stw L, SAVE_L // Set SAVE_L (on-trace resume/yield). | b >1 -#endif + |.endif |->vm_exit_interp: -#if LJ_HASJIT + |.if JIT | // CARG1 = MULTRES or negated error code, BASE, PC and JGL set. | lwz L, SAVE_L | addi DISPATCH, JGL, -GG_DISP2G-32768 @@ -2441,7 +2441,7 @@ static void build_subroutines(BuildCtx *ctx) | neg CARG2, CARG1 | mr CARG1, L | bl extern lj_err_throw // (lua_State *L, int errcode) -#endif + |.endif | |//----------------------------------------------------------------------- |//-- Math helper functions ---------------------------------------------- @@ -2453,9 +2453,9 @@ static void build_subroutines(BuildCtx *ctx) |->vm_ceil: | b extern ceil |->vm_trunc: -#if LJ_HASJIT + |.if JIT | b extern trunc -#endif + |.endif | |->vm_modi: | divwo. TMP0, CARG1, CARG2 @@ -2511,7 +2511,7 @@ static void build_subroutines(BuildCtx *ctx) |1: | fabs FARG1, FARG1; blr |2: -#if LJ_HASJIT + |.if JIT | cmplwi CARG1, 9; beq >9; bgt >2 | b extern atan2 | // No support needed for IR_LDEXP. @@ -2526,9 +2526,9 @@ static void build_subroutines(BuildCtx *ctx) | blr |9: | NYI // Bad op. -#else + |.else | NYI // Other operations only needed by JIT compiler. -#endif + |.endif | |//----------------------------------------------------------------------- |//-- Miscellaneous functions -------------------------------------------- @@ -2565,7 +2565,7 @@ static void build_subroutines(BuildCtx *ctx) | |// Handler for callback functions. Callback slot number in r11, g in r12. |->vm_ffi_callback: -#if LJ_HASFFI + |.if FFI |.type CTSTATE, CTState, PC | saveregs | lwz CTSTATE, GL:r12->ctype_state @@ -2613,10 +2613,10 @@ static void build_subroutines(BuildCtx *ctx) | st_vmstate | lfs TONUM, TMPD | ins_callt -#endif + |.endif | |->cont_ffi_callback: // Return from FFI callback. -#if LJ_HASFFI + |.if FFI | lwz CTSTATE, DISPATCH_GL(ctype_state)(DISPATCH) | stw BASE, L->base | stw RB, L->top @@ -2628,11 +2628,11 @@ static void build_subroutines(BuildCtx *ctx) | lfd FARG1, CTSTATE->cb.fpr[0] | lwz CRET2, CTSTATE->cb.gpr[1] | b ->vm_leave_unw -#endif + |.endif | |->vm_ffi_call: // Call C function via FFI. | // Caveat: needs special frame unwinding, see below. -#if LJ_HASFFI + |.if FFI | .type CCSTATE, CCallState, CARG1 | lwz TMP1, CCSTATE->spadj | mflr TMP0 @@ -2691,7 +2691,7 @@ static void build_subroutines(BuildCtx *ctx) | stw CARG4, CCSTATE:TMP1->gpr[3] | mr r14, TMP2 | blr -#endif + |.endif |// Note: vm_ffi_call must be the last function in this object file! | |//----------------------------------------------------------------------- @@ -2711,158 +2711,158 @@ 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 - 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 not an integer. - | bgt cr1, ->vmeta_comp - | // 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 + |.if 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 { - | 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 + | 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 not an integer. + | bgt cr1, ->vmeta_comp + | // 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 + | 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 + |.endif break; case BC_ISEQV: case BC_ISNEV: vk = op == BC_ISEQV; | // RA = src1*8, RD = src2*8, JMP with RD = target - if (LJ_DUALNUM) { - | lwzux TMP0, RA, BASE - | addi PC, PC, 4 - | lwz CARG2, 4(RA) - | lwzux TMP1, RD, BASE - | checknum cr0, TMP0 - | lwz TMP2, -4(PC) - | checknum cr1, TMP1 - | decode_RD4 TMP2, TMP2 - | 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 - } + |.if DUALNUM + | lwzux TMP0, RA, BASE + | addi PC, PC, 4 + | lwz CARG2, 4(RA) + | lwzux TMP1, RD, BASE + | checknum cr0, TMP0 + | lwz TMP2, -4(PC) + | checknum cr1, TMP1 + | decode_RD4 TMP2, TMP2 + | 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 { - | 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 + | ble cr7, ->BC_ISNEN_Z } + |.else + | 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 + |.endif |5: // Either or both types are not numbers. - if (!LJ_DUALNUM) { - | lwz CARG2, 4(RA) - | lwz CARG3, 4(RD) - } - if (LJ_HASFFI) { - | cmpwi cr7, TMP0, LJ_TCDATA - | cmpwi cr5, TMP1, LJ_TCDATA - } + |.if not DUALNUM + | lwz CARG2, 4(RA) + | lwz CARG3, 4(RD) + |.endif + |.if FFI + | cmpwi cr7, TMP0, LJ_TCDATA + | cmpwi cr5, TMP1, LJ_TCDATA + |.endif | not TMP3, TMP0 | cmplw TMP0, TMP1 | cmplwi cr1, TMP3, ~LJ_TISPRI // Primitive? - if (LJ_HASFFI) { - | cror 4*cr7+eq, 4*cr7+eq, 4*cr5+eq - } + |.if FFI + | cror 4*cr7+eq, 4*cr7+eq, 4*cr5+eq + |.endif | cmplwi cr6, TMP3, ~LJ_TISTABUD // Table or userdata? - if (LJ_HASFFI) { - | beq cr7, ->vmeta_equal_cd - } + |.if FFI + | beq cr7, ->vmeta_equal_cd + |.endif | cmplw cr5, CARG2, CARG3 | crandc 4*cr0+gt, 4*cr0+eq, 4*cr1+gt // 2: Same type and primitive. | crorc 4*cr0+lt, 4*cr5+eq, 4*cr0+eq // 1: Same tv or different type. @@ -2879,14 +2879,14 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | add PC, PC, TMP2 |6: } - if (LJ_DUALNUM) { - | bge cr0, >2 // Done if 1 or 2. - |1: - | ins_next - |2: - } else { - | blt cr0, <1 // Done if 1 or 2. - } + |.if DUALNUM + | bge cr0, >2 // Done if 1 or 2. + |1: + | ins_next + |2: + |.else + | blt cr0, <1 // Done if 1 or 2. + |.endif | blt cr6, <1 // Done if not tab/ud. | | // Different tables or userdatas. Need to check __eq metamethod. @@ -2911,14 +2911,14 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | lwz TMP2, 0(PC) | subfic RD, RD, -4 | addi PC, PC, 4 - if (LJ_HASFFI) { - | cmpwi TMP0, LJ_TCDATA - } + |.if FFI + | cmpwi TMP0, LJ_TCDATA + |.endif | lwzx STR:TMP1, KBASE, RD // KBASE-4-str_const*4 | subfic TMP0, TMP0, LJ_TSTR - if (LJ_HASFFI) { - | beq ->vmeta_equal_cd - } + |.if FFI + | beq ->vmeta_equal_cd + |.endif | sub TMP1, STR:TMP1, STR:TMP3 | or TMP0, TMP0, TMP1 | decode_RD4 TMP2, TMP2 @@ -2937,84 +2937,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 - if (LJ_DUALNUM) { - | lwzux TMP0, RA, BASE - | addi PC, PC, 4 - | lwz CARG2, 4(RA) - | lwzux TMP1, RD, KBASE - | checknum cr0, TMP0 - | lwz TMP2, -4(PC) - | checknum cr1, TMP1 - | decode_RD4 TMP2, TMP2 - | 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: + |.if DUALNUM + | lwzux TMP0, RA, BASE + | addi PC, PC, 4 + | lwz CARG2, 4(RA) + | lwzux TMP1, RD, KBASE + | checknum cr0, TMP0 + | lwz TMP2, -4(PC) + | checknum cr1, TMP1 + | decode_RD4 TMP2, TMP2 + | lwz CARG3, 4(RD) + | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16) + if (vk) { + |->BC_ISEQN_Z: } 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 TMP2, -4(PC) - | lfdx f1, KBASE, RD - | decode_RD4 TMP2, TMP2 - | checknum TMP0 - | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16) - | bge >3 - | fcmpu cr0, f0, f1 + |->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 TMP2, -4(PC) + | lfdx f1, KBASE, RD + | decode_RD4 TMP2, TMP2 + | checknum TMP0 + | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16) + | bge >3 + | fcmpu cr0, f0, f1 + |.endif if (vk) { | bne >1 | add PC, PC, TMP2 |1: - if (!LJ_HASFFI) { - |3: - } + |.if not FFI + |3: + |.endif } else { | beq >2 |1: - if (!LJ_HASFFI) { - |3: - } + |.if not FFI + |3: + |.endif | add PC, PC, TMP2 |2: } | ins_next - 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 - } + |.if FFI + |3: + | cmpwi TMP0, LJ_TCDATA + | beq ->vmeta_equal_cd + | b <1 + |.endif + |.if 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 + |.endif break; case BC_ISEQP: case BC_ISNEP: @@ -3025,13 +3025,13 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | lwz TMP2, 0(PC) | not TMP1, TMP1 | addi PC, PC, 4 - if (LJ_HASFFI) { - | cmpwi TMP0, LJ_TCDATA - } + |.if FFI + | cmpwi TMP0, LJ_TCDATA + |.endif | sub TMP0, TMP0, TMP1 - if (LJ_HASFFI) { - | beq ->vmeta_equal_cd - } + |.if FFI + | beq ->vmeta_equal_cd + |.endif | decode_RD4 TMP2, TMP2 | addic TMP0, TMP0, -1 | addis TMP2, TMP2, -(BCBIAS_J*4 >> 16) @@ -3104,22 +3104,22 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | lwzux TMP1, RD, BASE | lwz TMP0, 4(RD) | 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; bley <1 // Ignore unrelated overflow. - | lus TMP1, 0x41e0 // 2^31. - | li TMP0, 0 - | b >7 - } + |.if 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; bley <1 // Ignore unrelated overflow. + | lus TMP1, 0x41e0 // 2^31. + | li TMP0, 0 + | b >7 + |.endif |5: | bge ->vmeta_unm | xoris TMP1, TMP1, 0x8000 @@ -3127,11 +3127,11 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | ins_next1 | stwux TMP1, RA, BASE | stw TMP0, 4(RA) - if (LJ_DUALNUM) { - | b <3 - } else { - | ins_next2 - } + |.if DUALNUM + | b <3 + |.else + | ins_next2 + |.endif break; case BC_LEN: | // RA = dst*8, RD = src*8 @@ -3140,15 +3140,15 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | checkstr TMP0; bne >2 | lwz CRET1, STR:CARG1->len |1: - 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 - } + |.if 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 + |.endif | ins_next2 |2: | checktab TMP0; bne ->vmeta_len @@ -3179,35 +3179,35 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) ||switch (vk) { ||case 0: | lwzx TMP1, BASE, RB - ||if (LJ_DUALNUM) { - | lwzx TMP2, KBASE, RC - ||} + | .if DUALNUM + | lwzx TMP2, KBASE, RC + | .endif | 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 - ||} + | .if 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 + | .endif || break; ||case 1: | lwzx TMP1, BASE, RB - ||if (LJ_DUALNUM) { - | lwzx TMP2, KBASE, RC - ||} + | .if DUALNUM + | lwzx TMP2, KBASE, RC + | .endif | 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 - ||} + | .if 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 + | .endif || break; ||default: | lwzx TMP1, BASE, RB @@ -3323,11 +3323,11 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) |.endmacro | |.macro ins_arith, intins, fpins - ||if (LJ_DUALNUM) { + |.if DUALNUM | ins_arithdn intins, fpins - ||} else { + |.else | ins_arithfp fpins - ||} + |.endif |.endmacro case BC_ADDVN: case BC_ADDNV: case BC_ADDVV: @@ -3399,7 +3399,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | ins_next2 break; case BC_KCDATA: -#if LJ_HASFFI + |.if FFI | // RA = dst*8, RD = cdata_const*8 (~) | srwi TMP1, RD, 1 | subfic TMP1, TMP1, -4 @@ -3409,37 +3409,37 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | stwux TMP2, RA, BASE | stw TMP0, 4(RA) | ins_next2 -#endif + |.endif break; case BC_KSHORT: | // RA = dst*8, RD = int16_literal*8 - if (LJ_DUALNUM) { - | slwi RD, RD, 13 - | srawi RD, RD, 16 - | ins_next1 - | stwux TISNUM, RA, BASE - | stw RD, 4(RA) - | ins_next2 - } else { - | // The soft-float approach is faster. - | 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 - } + |.if DUALNUM + | slwi RD, RD, 13 + | srawi RD, RD, 16 + | ins_next1 + | stwux TISNUM, RA, BASE + | stw RD, 4(RA) + | ins_next2 + |.else + | // The soft-float approach is faster. + | 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 @@ -3671,35 +3671,35 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | lwzux CARG1, RB, BASE | lwzux CARG2, RC, BASE | lwz TAB:RB, 4(RB) - if (LJ_DUALNUM) { - | lwz RC, 4(RC) - } else { - | lfd f0, 0(RC) - } + |.if DUALNUM + | lwz RC, 4(RC) + |.else + | lfd f0, 0(RC) + |.endif | checktab CARG1 | checknum cr1, CARG2 | bne ->vmeta_tgetv - 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 - } + |.if 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 + |.endif | ble ->vmeta_tgetv // Integer key and in array part? | lwzx TMP0, TMP1, TMP2 | lfdx f14, TMP1, TMP2 @@ -3720,9 +3720,9 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |5: | checkstr CARG2; bne ->vmeta_tgetv - if (!LJ_DUALNUM) { - | lwz STR:RC, 4(RC) - } + |.if not DUALNUM + | lwz STR:RC, 4(RC) + |.endif | b ->BC_TGETS_Z // String key? break; case BC_TGETS: @@ -3805,35 +3805,35 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | lwzux CARG1, RB, BASE | lwzux CARG2, RC, BASE | lwz TAB:RB, 4(RB) - if (LJ_DUALNUM) { - | lwz RC, 4(RC) - } else { - | lfd f0, 0(RC) - } + |.if DUALNUM + | lwz RC, 4(RC) + |.else + | lfd f0, 0(RC) + |.endif | checktab CARG1 | checknum cr1, CARG2 | bne ->vmeta_tsetv - 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 - } + |.if 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 + |.endif | ble ->vmeta_tsetv // Integer key and in array part? | lwzx TMP2, TMP1, TMP0 | lbz TMP3, TAB:RB->marked @@ -3857,9 +3857,9 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |5: | checkstr CARG2; bne ->vmeta_tsetv - if (!LJ_DUALNUM) { - | lwz STR:RC, 4(RC) - } + |.if not DUALNUM + | lwz STR:RC, 4(RC) + |.endif | b ->BC_TSETS_Z // String key? | |7: // Possible table write barrier for the value. Skip valiswhite check. @@ -4119,9 +4119,9 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) case BC_ITERN: | // RA = base*8, (RB = (nresults+1)*8, RC = (nargs+1)*8 (2+1)*8) -#if LJ_HASJIT + |.if JIT | // NYI: add hotloop, record BC_ITERN. -#endif + |.endif | add RA, BASE, RA | lwz TAB:RB, -12(RA) | lwz RC, -4(RA) // Get index from control var. @@ -4137,21 +4137,21 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | checknil TMP2 | lwz INS, -4(PC) | beq >4 - if (LJ_DUALNUM) { - | stw RC, 4(RA) - | stw TISNUM, 0(RA) - } else { - | tonum_u f1, RC - } + |.if DUALNUM + | stw RC, 4(RA) + | stw TISNUM, 0(RA) + |.else + | tonum_u f1, RC + |.endif | 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 - if (!LJ_DUALNUM) { - | stfd f1, 0(RA) - } + |.if not DUALNUM + | stfd f1, 0(RA) + |.endif |3: | ins_next | @@ -4389,9 +4389,9 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) /* -- Loops and branches ------------------------------------------------ */ case BC_FORL: -#if LJ_HASJIT + |.if JIT | hotloop -#endif + |.endif | // Fall through. Assumes BC_IFORL follows. break; @@ -4404,88 +4404,88 @@ 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) - | bley >7 - } else if (op == BC_IFORL) { - | bgt >2 - | addis PC, RD, -(BCBIAS_J*4 >> 16) - } else { - | bley =>BC_JLOOP - } - |2: - | ins_next - |5: // Invert check for negative step. - | cmpw CARG2, CARG1 - | b <1 - if (vk) { - |6: // Potential overflow. - | mcrxr cr0; bley <4 // Ignore unrelated overflow. - | b <2 - } - } + |.if DUALNUM + | // Integer loop. + | lwzux TMP1, RA, BASE + | lwz CARG1, FORL_IDX*8+4(RA) + | cmplw cr0, TMP1, TISNUM if (vk) { - if (LJ_DUALNUM) { - |9: // FP loop. - | lfd f1, FORL_IDX*8(RA) - } else { - | lfdux f1, RA, BASE - } + | 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) + | bley >7 + } else if (op == BC_IFORL) { + | bgt >2 + | addis PC, RD, -(BCBIAS_J*4 >> 16) + } else { + | bley =>BC_JLOOP + } + |2: + | ins_next + |5: // Invert check for negative step. + | cmpw CARG2, CARG1 + | b <1 + if (vk) { + |6: // Potential overflow. + | mcrxr cr0; bley <4 // Ignore unrelated overflow. + | b <2 + } + |.endif + if (vk) { + |.if DUALNUM + |9: // FP loop. + | lfd f1, FORL_IDX*8(RA) + |.else + | lfdux f1, RA, BASE + |.endif | 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 { - 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 - } + |.if 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 + |.endif | lfd f1, FORL_IDX*8(RA) | crand 4*cr0+lt, 4*cr0+lt, 4*cr7+lt | crand 4*cr0+lt, 4*cr0+lt, 4*cr1+lt @@ -4508,11 +4508,11 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) if (op == BC_FORI) { | bgt >3 } else if (op == BC_IFORL) { - if (LJ_DUALNUM) { - | bgty <2 - } else { - | bgt >2 - } + |.if DUALNUM + | bgty <2 + |.else + | bgt >2 + |.endif |1: | addis PC, RD, -(BCBIAS_J*4 >> 16) } else if (op == BC_JFORI) { @@ -4520,12 +4520,12 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) } else { | bley =>BC_JLOOP } - if (LJ_DUALNUM) { - | b <2 - } else { - |2: - | ins_next - } + |.if DUALNUM + | b <2 + |.else + |2: + | ins_next + |.endif |5: // Negative step. if (op == BC_FORI) { | bge <2 @@ -4548,9 +4548,9 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) break; case BC_ITERL: -#if LJ_HASJIT + |.if JIT | hotloop -#endif + |.endif | // Fall through. Assumes BC_IITERL follows. break; @@ -4580,9 +4580,9 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | // RA = base*8, RD = target (loop extent) | // Note: RA/RD is only used by trace recorder to determine scope/extent | // This opcode does NOT jump, it's only purpose is to detect a hot loop. -#if LJ_HASJIT + |.if JIT | hotloop -#endif + |.endif | // Fall through. Assumes BC_ILOOP follows. break; @@ -4592,7 +4592,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) break; case BC_JLOOP: -#if LJ_HASJIT + |.if JIT | // RA = base*8 (ignored), RD = traceno*8 | lwz TMP1, DISPATCH_J(trace)(DISPATCH) | srwi RD, RD, 1 @@ -4606,7 +4606,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | stw L, DISPATCH_GL(jit_L)(DISPATCH) | addi JGL, DISPATCH, GG_DISP2G+32768 | bctr -#endif + |.endif break; case BC_JMP: @@ -4618,9 +4618,9 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) /* -- Function headers -------------------------------------------------- */ case BC_FUNCF: -#if LJ_HASJIT + |.if JIT | hotcall -#endif + |.endif case BC_FUNCV: /* NYI: compiled vararg functions. */ | // Fall through. Assumes BC_IFUNCF/BC_IFUNCV follow. break;