aboutsummaryrefslogtreecommitdiff
path: root/src/lj_ffrecord.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_ffrecord.c')
-rw-r--r--src/lj_ffrecord.c114
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
531static 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
539static void LJ_FASTCALL recff_math_pow(jit_State *J, RecordFFData *rd) 531static 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. */
588static 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. */
596static void LJ_FASTCALL recff_bit_unary(jit_State *J, RecordFFData *rd) 599static 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. */
603static void LJ_FASTCALL recff_bit_nary(jit_State *J, RecordFFData *rd) 609static 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. */
614static void LJ_FASTCALL recff_bit_shift(jit_State *J, RecordFFData *rd) 626static 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
740static 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
748static 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
780static void LJ_FASTCALL recff_table_insert(jit_State *J, RecordFFData *rd) 758static void LJ_FASTCALL recff_table_insert(jit_State *J, RecordFFData *rd)
781{ 759{
782 RecordIndex ix; 760 RecordIndex ix;