diff options
Diffstat (limited to 'src/lj_ffrecord.c')
-rw-r--r-- | src/lj_ffrecord.c | 66 |
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. */ |
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. */ | ||
588 | 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) |
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. */ |
595 | 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) |
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. */ |
606 | 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) |
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 --------------------------------------- */ |