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.c66
1 files changed, 46 insertions, 20 deletions
diff --git a/src/lj_ffrecord.c b/src/lj_ffrecord.c
index 730d5c39..4f6aeb37 100644
--- a/src/lj_ffrecord.c
+++ b/src/lj_ffrecord.c
@@ -584,40 +584,66 @@ static void LJ_FASTCALL recff_math_random(jit_State *J, RecordFFData *rd)
584 584
585/* -- Bit library fast functions ------------------------------------------ */ 585/* -- Bit library fast functions ------------------------------------------ */
586 586
587/* 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. */
588static void LJ_FASTCALL recff_bit_unary(jit_State *J, RecordFFData *rd) 599static void LJ_FASTCALL recff_bit_unary(jit_State *J, RecordFFData *rd)
589{ 600{
590 TRef tr = lj_opt_narrow_tobit(J, J->base[0]); 601#if LJ_HASFFI
591 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);
592} 606}
593 607
594/* Record N-ary bit.band, bit.bor, bit.bxor. */ 608/* Record N-ary bit.band, bit.bor, bit.bxor. */
595static void LJ_FASTCALL recff_bit_nary(jit_State *J, RecordFFData *rd) 609static void LJ_FASTCALL recff_bit_nary(jit_State *J, RecordFFData *rd)
596{ 610{
597 TRef tr = lj_opt_narrow_tobit(J, J->base[0]); 611#if LJ_HASFFI
598 uint32_t op = rd->data; 612 if (recff_bit64_nary(J, rd))
599 BCReg i; 613 return;
600 for (i = 1; J->base[i] != 0; i++) 614#endif
601 tr = emitir(IRTI(op), tr, lj_opt_narrow_tobit(J, J->base[i])); 615 {
602 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 }
603} 623}
604 624
605/* Record bit shifts. */ 625/* Record bit shifts. */
606static void LJ_FASTCALL recff_bit_shift(jit_State *J, RecordFFData *rd) 626static void LJ_FASTCALL recff_bit_shift(jit_State *J, RecordFFData *rd)
607{ 627{
608 TRef tr = lj_opt_narrow_tobit(J, J->base[0]); 628#if LJ_HASFFI
609 TRef tsh = lj_opt_narrow_tobit(J, J->base[1]); 629 if (recff_bit64_shift(J, rd))
610 IROp op = (IROp)rd->data; 630 return;
611 if (!(op < IR_BROL ? LJ_TARGET_MASKSHIFT : LJ_TARGET_MASKROT) && 631#endif
612 !tref_isk(tsh)) 632 {
613 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));
614#ifdef LJ_TARGET_UNIFYROT 639#ifdef LJ_TARGET_UNIFYROT
615 if (op == (LJ_TARGET_UNIFYROT == 1 ? IR_BROR : IR_BROL)) { 640 if (op == (LJ_TARGET_UNIFYROT == 1 ? IR_BROR : IR_BROL)) {
616 op = LJ_TARGET_UNIFYROT == 1 ? IR_BROL : IR_BROR; 641 op = LJ_TARGET_UNIFYROT == 1 ? IR_BROL : IR_BROR;
617 tsh = emitir(IRTI(IR_NEG), tsh, tsh); 642 tsh = emitir(IRTI(IR_NEG), tsh, tsh);
618 } 643 }
619#endif 644#endif
620 J->base[0] = emitir(IRTI(op), tr, tsh); 645 J->base[0] = emitir(IRTI(op), tr, tsh);
646 }
621} 647}
622 648
623/* -- String library fast functions --------------------------------------- */ 649/* -- String library fast functions --------------------------------------- */