aboutsummaryrefslogtreecommitdiff
path: root/src/lj_opt_fold.c
diff options
context:
space:
mode:
authorMike Pall <mike>2013-04-26 00:32:08 +0200
committerMike Pall <mike>2013-04-26 00:32:08 +0200
commitb6adfff8f4e388ea286ca4d7d8e0896c07f1cab8 (patch)
tree26dc6763ae0378b1f783d644eff8f4662679a1d4 /src/lj_opt_fold.c
parent61cb25b0ca19f75be49373969d6dc3daa646d3aa (diff)
downloadluajit-b6adfff8f4e388ea286ca4d7d8e0896c07f1cab8.tar.gz
luajit-b6adfff8f4e388ea286ca4d7d8e0896c07f1cab8.tar.bz2
luajit-b6adfff8f4e388ea286ca4d7d8e0896c07f1cab8.zip
Compile string.reverse(), string.lower(), string.upper().
Diffstat (limited to 'src/lj_opt_fold.c')
-rw-r--r--src/lj_opt_fold.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c
index 2ed0bc93..91e9655a 100644
--- a/src/lj_opt_fold.c
+++ b/src/lj_opt_fold.c
@@ -19,6 +19,7 @@
19#include "lj_tab.h" 19#include "lj_tab.h"
20#include "lj_ir.h" 20#include "lj_ir.h"
21#include "lj_jit.h" 21#include "lj_jit.h"
22#include "lj_ircall.h"
22#include "lj_iropt.h" 23#include "lj_iropt.h"
23#include "lj_trace.h" 24#include "lj_trace.h"
24#if LJ_HASFFI 25#if LJ_HASFFI
@@ -570,7 +571,8 @@ LJFOLDF(bufput_kgc)
570LJFOLD(BUFSTR any any) 571LJFOLD(BUFSTR any any)
571LJFOLDF(bufstr_kfold_cse) 572LJFOLDF(bufstr_kfold_cse)
572{ 573{
573 lua_assert(fright->o == IR_BUFHDR || fright->o == IR_BUFPUT); 574 lua_assert(fright->o == IR_BUFHDR || fright->o == IR_BUFPUT ||
575 fright->o == IR_CALLS);
574 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD)) { 576 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD)) {
575 if (fright->o == IR_BUFHDR) { /* No put operations? */ 577 if (fright->o == IR_BUFHDR) { /* No put operations? */
576 if (!(fright->op2 & IRBUFHDR_APPEND)) { /* Empty buffer? */ 578 if (!(fright->op2 & IRBUFHDR_APPEND)) { /* Empty buffer? */
@@ -579,7 +581,7 @@ LJFOLDF(bufstr_kfold_cse)
579 } 581 }
580 fins->op2 = fright->prev; /* Relies on checks in bufput_append. */ 582 fins->op2 = fright->prev; /* Relies on checks in bufput_append. */
581 return CSEFOLD; 583 return CSEFOLD;
582 } else { 584 } else if (fright->o == IR_BUFPUT) {
583 IRIns *irb = IR(fright->op1); 585 IRIns *irb = IR(fright->op1);
584 if (irb->o == IR_BUFHDR && !(irb->op2 & IRBUFHDR_APPEND)) { 586 if (irb->o == IR_BUFHDR && !(irb->op2 & IRBUFHDR_APPEND)) {
585 lj_ir_rollback(J, fins->op1); /* Eliminate the current chain. */ 587 lj_ir_rollback(J, fins->op1); /* Eliminate the current chain. */
@@ -616,6 +618,26 @@ LJFOLDF(bufstr_kfold_cse)
616 return EMITFOLD; /* No CSE possible. */ 618 return EMITFOLD; /* No CSE possible. */
617} 619}
618 620
621LJFOLD(CALLS CARG IRCALL_lj_buf_putstr_reverse)
622LJFOLD(CALLS CARG IRCALL_lj_buf_putstr_upper)
623LJFOLD(CALLS CARG IRCALL_lj_buf_putstr_lower)
624LJFOLDF(bufput_kfold_op)
625{
626 if (irref_isk(fleft->op2)) {
627 const CCallInfo *ci = &lj_ir_callinfo[fins->op2];
628 SBuf *sb = &J2G(J)->tmpbuf;
629 setsbufL(sb, J->L);
630 lj_buf_reset(sb);
631 sb = ((SBuf * LJ_FASTCALL (*)(SBuf *, GCstr *))ci->func)(sb,
632 ir_kstr(IR(fleft->op2)));
633 fins->op2 = lj_ir_kstr(J, lj_buf_tostr(sb));
634 fins->op1 = fleft->op1;
635 fins->o = IR_BUFPUT;
636 return RETRYFOLD;
637 }
638 return EMITFOLD; /* This is a store and always emitted. */
639}
640
619/* -- Constant folding of pointer arithmetic ------------------------------ */ 641/* -- Constant folding of pointer arithmetic ------------------------------ */
620 642
621LJFOLD(ADD KGC KINT) 643LJFOLD(ADD KGC KINT)