diff options
author | Mike Pall <mike> | 2013-04-26 00:32:08 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2013-04-26 00:32:08 +0200 |
commit | b6adfff8f4e388ea286ca4d7d8e0896c07f1cab8 (patch) | |
tree | 26dc6763ae0378b1f783d644eff8f4662679a1d4 /src/lj_opt_fold.c | |
parent | 61cb25b0ca19f75be49373969d6dc3daa646d3aa (diff) | |
download | luajit-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.c | 26 |
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) | |||
570 | LJFOLD(BUFSTR any any) | 571 | LJFOLD(BUFSTR any any) |
571 | LJFOLDF(bufstr_kfold_cse) | 572 | LJFOLDF(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 | ||
621 | LJFOLD(CALLS CARG IRCALL_lj_buf_putstr_reverse) | ||
622 | LJFOLD(CALLS CARG IRCALL_lj_buf_putstr_upper) | ||
623 | LJFOLD(CALLS CARG IRCALL_lj_buf_putstr_lower) | ||
624 | LJFOLDF(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 | ||
621 | LJFOLD(ADD KGC KINT) | 643 | LJFOLD(ADD KGC KINT) |