aboutsummaryrefslogtreecommitdiff
path: root/src/lj_opt_fold.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_opt_fold.c')
-rw-r--r--src/lj_opt_fold.c43
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)
617LJFOLD(CALLL CARG IRCALL_lj_buf_putstr_reverse) 617LJFOLD(CALLL CARG IRCALL_lj_buf_putstr_reverse)
618LJFOLD(CALLL CARG IRCALL_lj_buf_putstr_upper) 618LJFOLD(CALLL CARG IRCALL_lj_buf_putstr_upper)
619LJFOLD(CALLL CARG IRCALL_lj_buf_putstr_lower) 619LJFOLD(CALLL CARG IRCALL_lj_buf_putstr_lower)
620LJFOLD(CALLL CARG IRCALL_lj_strfmt_putquoted)
620LJFOLDF(bufput_kfold_op) 621LJFOLDF(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
653LJFOLD(CALLL CARG IRCALL_lj_strfmt_putfxint)
654LJFOLD(CALLL CARG IRCALL_lj_strfmt_putfnum_int)
655LJFOLD(CALLL CARG IRCALL_lj_strfmt_putfnum_uint)
656LJFOLD(CALLL CARG IRCALL_lj_strfmt_putfnum)
657LJFOLD(CALLL CARG IRCALL_lj_strfmt_putfstr)
658LJFOLD(CALLL CARG IRCALL_lj_strfmt_putfchar)
659LJFOLDF(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
654LJFOLD(ADD KGC KINT) 697LJFOLD(ADD KGC KINT)