diff options
Diffstat (limited to 'src/lj_ffrecord.c')
-rw-r--r-- | src/lj_ffrecord.c | 114 |
1 files changed, 46 insertions, 68 deletions
diff --git a/src/lj_ffrecord.c b/src/lj_ffrecord.c index 4aa4f064..4f6aeb37 100644 --- a/src/lj_ffrecord.c +++ b/src/lj_ffrecord.c | |||
@@ -528,14 +528,6 @@ static void LJ_FASTCALL recff_math_modf(jit_State *J, RecordFFData *rd) | |||
528 | rd->nres = 2; | 528 | rd->nres = 2; |
529 | } | 529 | } |
530 | 530 | ||
531 | static void LJ_FASTCALL recff_math_degrad(jit_State *J, RecordFFData *rd) | ||
532 | { | ||
533 | TRef tr = lj_ir_tonum(J, J->base[0]); | ||
534 | TRef trm = lj_ir_knum(J, numV(&J->fn->c.upvalue[0])); | ||
535 | J->base[0] = emitir(IRTN(IR_MUL), tr, trm); | ||
536 | UNUSED(rd); | ||
537 | } | ||
538 | |||
539 | static void LJ_FASTCALL recff_math_pow(jit_State *J, RecordFFData *rd) | 531 | static void LJ_FASTCALL recff_math_pow(jit_State *J, RecordFFData *rd) |
540 | { | 532 | { |
541 | TRef tr = lj_ir_tonum(J, J->base[0]); | 533 | TRef tr = lj_ir_tonum(J, J->base[0]); |
@@ -592,40 +584,66 @@ static void LJ_FASTCALL recff_math_random(jit_State *J, RecordFFData *rd) | |||
592 | 584 | ||
593 | /* -- Bit library fast functions ------------------------------------------ */ | 585 | /* -- Bit library fast functions ------------------------------------------ */ |
594 | 586 | ||
595 | /* Record unary bit.tobit, bit.bnot, bit.bswap. */ | 587 | /* Record bit.tobit. */ |
588 | static void LJ_FASTCALL recff_bit_tobit(jit_State *J, RecordFFData *rd) | ||
589 | { | ||
590 | TRef tr = J->base[0]; | ||
591 | #if LJ_HASFFI | ||
592 | if (tref_iscdata(tr)) { recff_bit64_tobit(J, rd); return; } | ||
593 | #endif | ||
594 | J->base[0] = lj_opt_narrow_tobit(J, tr); | ||
595 | UNUSED(rd); | ||
596 | } | ||
597 | |||
598 | /* Record unary bit.bnot, bit.bswap. */ | ||
596 | static void LJ_FASTCALL recff_bit_unary(jit_State *J, RecordFFData *rd) | 599 | static void LJ_FASTCALL recff_bit_unary(jit_State *J, RecordFFData *rd) |
597 | { | 600 | { |
598 | TRef tr = lj_opt_narrow_tobit(J, J->base[0]); | 601 | #if LJ_HASFFI |
599 | J->base[0] = (rd->data == IR_TOBIT) ? tr : emitir(IRTI(rd->data), tr, 0); | 602 | if (recff_bit64_unary(J, rd)) |
603 | return; | ||
604 | #endif | ||
605 | J->base[0] = emitir(IRTI(rd->data), lj_opt_narrow_tobit(J, J->base[0]), 0); | ||
600 | } | 606 | } |
601 | 607 | ||
602 | /* Record N-ary bit.band, bit.bor, bit.bxor. */ | 608 | /* Record N-ary bit.band, bit.bor, bit.bxor. */ |
603 | static void LJ_FASTCALL recff_bit_nary(jit_State *J, RecordFFData *rd) | 609 | static void LJ_FASTCALL recff_bit_nary(jit_State *J, RecordFFData *rd) |
604 | { | 610 | { |
605 | TRef tr = lj_opt_narrow_tobit(J, J->base[0]); | 611 | #if LJ_HASFFI |
606 | uint32_t op = rd->data; | 612 | if (recff_bit64_nary(J, rd)) |
607 | BCReg i; | 613 | return; |
608 | for (i = 1; J->base[i] != 0; i++) | 614 | #endif |
609 | tr = emitir(IRTI(op), tr, lj_opt_narrow_tobit(J, J->base[i])); | 615 | { |
610 | J->base[0] = tr; | 616 | TRef tr = lj_opt_narrow_tobit(J, J->base[0]); |
617 | uint32_t ot = IRTI(rd->data); | ||
618 | BCReg i; | ||
619 | for (i = 1; J->base[i] != 0; i++) | ||
620 | tr = emitir(ot, tr, lj_opt_narrow_tobit(J, J->base[i])); | ||
621 | J->base[0] = tr; | ||
622 | } | ||
611 | } | 623 | } |
612 | 624 | ||
613 | /* Record bit shifts. */ | 625 | /* Record bit shifts. */ |
614 | static void LJ_FASTCALL recff_bit_shift(jit_State *J, RecordFFData *rd) | 626 | static void LJ_FASTCALL recff_bit_shift(jit_State *J, RecordFFData *rd) |
615 | { | 627 | { |
616 | TRef tr = lj_opt_narrow_tobit(J, J->base[0]); | 628 | #if LJ_HASFFI |
617 | TRef tsh = lj_opt_narrow_tobit(J, J->base[1]); | 629 | if (recff_bit64_shift(J, rd)) |
618 | IROp op = (IROp)rd->data; | 630 | return; |
619 | if (!(op < IR_BROL ? LJ_TARGET_MASKSHIFT : LJ_TARGET_MASKROT) && | 631 | #endif |
620 | !tref_isk(tsh)) | 632 | { |
621 | tsh = emitir(IRTI(IR_BAND), tsh, lj_ir_kint(J, 31)); | 633 | TRef tr = lj_opt_narrow_tobit(J, J->base[0]); |
634 | TRef tsh = lj_opt_narrow_tobit(J, J->base[1]); | ||
635 | IROp op = (IROp)rd->data; | ||
636 | if (!(op < IR_BROL ? LJ_TARGET_MASKSHIFT : LJ_TARGET_MASKROT) && | ||
637 | !tref_isk(tsh)) | ||
638 | tsh = emitir(IRTI(IR_BAND), tsh, lj_ir_kint(J, 31)); | ||
622 | #ifdef LJ_TARGET_UNIFYROT | 639 | #ifdef LJ_TARGET_UNIFYROT |
623 | if (op == (LJ_TARGET_UNIFYROT == 1 ? IR_BROR : IR_BROL)) { | 640 | if (op == (LJ_TARGET_UNIFYROT == 1 ? IR_BROR : IR_BROL)) { |
624 | op = LJ_TARGET_UNIFYROT == 1 ? IR_BROL : IR_BROR; | 641 | op = LJ_TARGET_UNIFYROT == 1 ? IR_BROL : IR_BROR; |
625 | tsh = emitir(IRTI(IR_NEG), tsh, tsh); | 642 | tsh = emitir(IRTI(IR_NEG), tsh, tsh); |
626 | } | 643 | } |
627 | #endif | 644 | #endif |
628 | J->base[0] = emitir(IRTI(op), tr, tsh); | 645 | J->base[0] = emitir(IRTI(op), tr, tsh); |
646 | } | ||
629 | } | 647 | } |
630 | 648 | ||
631 | /* -- String library fast functions --------------------------------------- */ | 649 | /* -- String library fast functions --------------------------------------- */ |
@@ -737,46 +755,6 @@ static void LJ_FASTCALL recff_string_range(jit_State *J, RecordFFData *rd) | |||
737 | 755 | ||
738 | /* -- Table library fast functions ---------------------------------------- */ | 756 | /* -- Table library fast functions ---------------------------------------- */ |
739 | 757 | ||
740 | static void LJ_FASTCALL recff_table_getn(jit_State *J, RecordFFData *rd) | ||
741 | { | ||
742 | if (tref_istab(J->base[0])) | ||
743 | J->base[0] = lj_ir_call(J, IRCALL_lj_tab_len, J->base[0]); | ||
744 | /* else: Interpreter will throw. */ | ||
745 | UNUSED(rd); | ||
746 | } | ||
747 | |||
748 | static void LJ_FASTCALL recff_table_remove(jit_State *J, RecordFFData *rd) | ||
749 | { | ||
750 | TRef tab = J->base[0]; | ||
751 | rd->nres = 0; | ||
752 | if (tref_istab(tab)) { | ||
753 | if (!J->base[1] || tref_isnil(J->base[1])) { /* Simple pop: t[#t] = nil */ | ||
754 | TRef trlen = lj_ir_call(J, IRCALL_lj_tab_len, tab); | ||
755 | GCtab *t = tabV(&rd->argv[0]); | ||
756 | MSize len = lj_tab_len(t); | ||
757 | emitir(IRTGI(len ? IR_NE : IR_EQ), trlen, lj_ir_kint(J, 0)); | ||
758 | if (len) { | ||
759 | RecordIndex ix; | ||
760 | ix.tab = tab; | ||
761 | ix.key = trlen; | ||
762 | settabV(J->L, &ix.tabv, t); | ||
763 | setintV(&ix.keyv, len); | ||
764 | ix.idxchain = 0; | ||
765 | if (results_wanted(J) != 0) { /* Specialize load only if needed. */ | ||
766 | ix.val = 0; | ||
767 | J->base[0] = lj_record_idx(J, &ix); /* Load previous value. */ | ||
768 | rd->nres = 1; | ||
769 | /* Assumes ix.key/ix.tab is not modified for raw lj_record_idx(). */ | ||
770 | } | ||
771 | ix.val = TREF_NIL; | ||
772 | lj_record_idx(J, &ix); /* Remove value. */ | ||
773 | } | ||
774 | } else { /* Complex case: remove in the middle. */ | ||
775 | recff_nyiu(J); | ||
776 | } | ||
777 | } /* else: Interpreter will throw. */ | ||
778 | } | ||
779 | |||
780 | static void LJ_FASTCALL recff_table_insert(jit_State *J, RecordFFData *rd) | 758 | static void LJ_FASTCALL recff_table_insert(jit_State *J, RecordFFData *rd) |
781 | { | 759 | { |
782 | RecordIndex ix; | 760 | RecordIndex ix; |