diff options
Diffstat (limited to 'src/lj_opt_fold.c')
-rw-r--r-- | src/lj_opt_fold.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c index e2ac28f2..f3abe8ea 100644 --- a/src/lj_opt_fold.c +++ b/src/lj_opt_fold.c | |||
@@ -617,6 +617,7 @@ LJFOLDF(bufstr_kfold_cse) | |||
617 | LJFOLD(CALLL CARG IRCALL_lj_buf_putstr_reverse) | 617 | LJFOLD(CALLL CARG IRCALL_lj_buf_putstr_reverse) |
618 | LJFOLD(CALLL CARG IRCALL_lj_buf_putstr_upper) | 618 | LJFOLD(CALLL CARG IRCALL_lj_buf_putstr_upper) |
619 | LJFOLD(CALLL CARG IRCALL_lj_buf_putstr_lower) | 619 | LJFOLD(CALLL CARG IRCALL_lj_buf_putstr_lower) |
620 | LJFOLD(CALLL CARG IRCALL_lj_strfmt_putquoted) | ||
620 | LJFOLDF(bufput_kfold_op) | 621 | LJFOLDF(bufput_kfold_op) |
621 | { | 622 | { |
622 | if (irref_isk(fleft->op2)) { | 623 | if (irref_isk(fleft->op2)) { |
@@ -649,6 +650,48 @@ LJFOLDF(bufput_kfold_rep) | |||
649 | return EMITFOLD; /* Always emit, CSE later. */ | 650 | return EMITFOLD; /* Always emit, CSE later. */ |
650 | } | 651 | } |
651 | 652 | ||
653 | LJFOLD(CALLL CARG IRCALL_lj_strfmt_putfxint) | ||
654 | LJFOLD(CALLL CARG IRCALL_lj_strfmt_putfnum_int) | ||
655 | LJFOLD(CALLL CARG IRCALL_lj_strfmt_putfnum_uint) | ||
656 | LJFOLD(CALLL CARG IRCALL_lj_strfmt_putfnum) | ||
657 | LJFOLD(CALLL CARG IRCALL_lj_strfmt_putfstr) | ||
658 | LJFOLD(CALLL CARG IRCALL_lj_strfmt_putfchar) | ||
659 | LJFOLDF(bufput_kfold_fmt) | ||
660 | { | ||
661 | IRIns *irc = IR(fleft->op1); | ||
662 | lua_assert(irref_isk(irc->op2)); /* SFormat must be const. */ | ||
663 | if (irref_isk(fleft->op2)) { | ||
664 | SFormat sf = (SFormat)IR(irc->op2)->i; | ||
665 | IRIns *ira = IR(fleft->op2); | ||
666 | SBuf *sb = lj_buf_tmp_(J->L); | ||
667 | switch (fins->op2) { | ||
668 | case IRCALL_lj_strfmt_putfxint: | ||
669 | sb = lj_strfmt_putfxint(sb, sf, ir_k64(ira)->u64); | ||
670 | break; | ||
671 | case IRCALL_lj_strfmt_putfstr: | ||
672 | sb = lj_strfmt_putfstr(sb, sf, ir_kstr(ira)); | ||
673 | break; | ||
674 | case IRCALL_lj_strfmt_putfchar: | ||
675 | sb = lj_strfmt_putfchar(sb, sf, ira->i); | ||
676 | break; | ||
677 | case IRCALL_lj_strfmt_putfnum_int: | ||
678 | case IRCALL_lj_strfmt_putfnum_uint: | ||
679 | case IRCALL_lj_strfmt_putfnum: | ||
680 | default: { | ||
681 | const CCallInfo *ci = &lj_ir_callinfo[fins->op2]; | ||
682 | sb = ((SBuf * (*)(SBuf *, SFormat, lua_Number))ci->func)(sb, sf, | ||
683 | ir_knum(ira)->n); | ||
684 | break; | ||
685 | } | ||
686 | } | ||
687 | fins->o = IR_BUFPUT; | ||
688 | fins->op1 = irc->op1; | ||
689 | fins->op2 = lj_ir_kstr(J, lj_buf_tostr(sb)); | ||
690 | return RETRYFOLD; | ||
691 | } | ||
692 | return EMITFOLD; /* Always emit, CSE later. */ | ||
693 | } | ||
694 | |||
652 | /* -- Constant folding of pointer arithmetic ------------------------------ */ | 695 | /* -- Constant folding of pointer arithmetic ------------------------------ */ |
653 | 696 | ||
654 | LJFOLD(ADD KGC KINT) | 697 | LJFOLD(ADD KGC KINT) |