aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2013-04-23 12:25:18 +0200
committerMike Pall <mike>2013-04-23 12:40:07 +0200
commit39e53e8c4c4b6151c53e384d411ae48026e5567d (patch)
tree94c4ed448eaf38ccadea216c2c3257dc2320fd56
parent255326afb6fd428d62cf66e4e90a459b917a76a1 (diff)
downloadluajit-39e53e8c4c4b6151c53e384d411ae48026e5567d.tar.gz
luajit-39e53e8c4c4b6151c53e384d411ae48026e5567d.tar.bz2
luajit-39e53e8c4c4b6151c53e384d411ae48026e5567d.zip
Compile string.char().
-rw-r--r--src/lib_string.c2
-rw-r--r--src/lj_ffrecord.c25
-rw-r--r--src/lj_opt_fold.c8
3 files changed, 33 insertions, 2 deletions
diff --git a/src/lib_string.c b/src/lib_string.c
index eb2ae226..27e0d594 100644
--- a/src/lib_string.c
+++ b/src/lib_string.c
@@ -62,7 +62,7 @@ LJLIB_ASM(string_byte) LJLIB_REC(string_range 0)
62 return FFH_RES(n); 62 return FFH_RES(n);
63} 63}
64 64
65LJLIB_ASM(string_char) 65LJLIB_ASM(string_char) LJLIB_REC(.)
66{ 66{
67 int i, nargs = (int)(L->top - L->base); 67 int i, nargs = (int)(L->top - L->base);
68 char *buf = lj_buf_tmp(L, (size_t)nargs); 68 char *buf = lj_buf_tmp(L, (size_t)nargs);
diff --git a/src/lj_ffrecord.c b/src/lj_ffrecord.c
index 929dbb55..191974ea 100644
--- a/src/lj_ffrecord.c
+++ b/src/lj_ffrecord.c
@@ -751,6 +751,26 @@ static void LJ_FASTCALL recff_string_range(jit_State *J, RecordFFData *rd)
751 } 751 }
752} 752}
753 753
754static void LJ_FASTCALL recff_string_char(jit_State *J, RecordFFData *rd)
755{
756 TRef k255 = lj_ir_kint(J, 255);
757 BCReg i;
758 for (i = 0; J->base[i] != 0; i++) { /* Convert char values to strings. */
759 TRef tr = lj_opt_narrow_toint(J, J->base[i]);
760 emitir(IRTGI(IR_ULE), tr, k255);
761 J->base[i] = emitir(IRT(IR_TOSTR, IRT_STR), tr, IRTOSTR_CHAR);
762 }
763 if (i > 1) { /* Concatenate the strings, if there's more than one. */
764 TRef hdr = emitir(IRT(IR_BUFHDR, IRT_P32),
765 lj_ir_kptr(J, &J2G(J)->tmpbuf), IRBUFHDR_RESET);
766 TRef tr = hdr;
767 for (i = 0; J->base[i] != 0; i++)
768 tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr, J->base[i]);
769 J->base[0] = emitir(IRT(IR_BUFSTR, IRT_STR), hdr, tr);
770 }
771 UNUSED(rd);
772}
773
754/* -- Table library fast functions ---------------------------------------- */ 774/* -- Table library fast functions ---------------------------------------- */
755 775
756static void LJ_FASTCALL recff_table_insert(jit_State *J, RecordFFData *rd) 776static void LJ_FASTCALL recff_table_insert(jit_State *J, RecordFFData *rd)
@@ -809,7 +829,10 @@ static void LJ_FASTCALL recff_io_write(jit_State *J, RecordFFData *rd)
809 TRef buf = emitir(IRT(IR_STRREF, IRT_P32), str, zero); 829 TRef buf = emitir(IRT(IR_STRREF, IRT_P32), str, zero);
810 TRef len = emitir(IRTI(IR_FLOAD), str, IRFL_STR_LEN); 830 TRef len = emitir(IRTI(IR_FLOAD), str, IRFL_STR_LEN);
811 if (tref_isk(len) && IR(tref_ref(len))->i == 1) { 831 if (tref_isk(len) && IR(tref_ref(len))->i == 1) {
812 TRef tr = emitir(IRT(IR_XLOAD, IRT_U8), buf, IRXLOAD_READONLY); 832 IRIns *irs = IR(tref_ref(str));
833 TRef tr = (irs->o == IR_TOSTR && irs->op2 == IRTOSTR_CHAR) ?
834 irs->op1 :
835 emitir(IRT(IR_XLOAD, IRT_U8), buf, IRXLOAD_READONLY);
813 tr = lj_ir_call(J, IRCALL_fputc, tr, fp); 836 tr = lj_ir_call(J, IRCALL_fputc, tr, fp);
814 if (results_wanted(J) != 0) /* Check result only if not ignored. */ 837 if (results_wanted(J) != 0) /* Check result only if not ignored. */
815 emitir(IRTGI(IR_NE), tr, lj_ir_kint(J, -1)); 838 emitir(IRTGI(IR_NE), tr, lj_ir_kint(J, -1));
diff --git a/src/lj_opt_fold.c b/src/lj_opt_fold.c
index 06e0e783..75b8e174 100644
--- a/src/lj_opt_fold.c
+++ b/src/lj_opt_fold.c
@@ -2074,6 +2074,14 @@ LJFOLDF(fload_str_len_snew)
2074 return NEXTFOLD; 2074 return NEXTFOLD;
2075} 2075}
2076 2076
2077LJFOLD(FLOAD TOSTR IRFL_STR_LEN)
2078LJFOLDF(fload_str_len_tostr)
2079{
2080 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && fleft->op2 == IRTOSTR_CHAR)
2081 return INTFOLD(1);
2082 return NEXTFOLD;
2083}
2084
2077/* The C type ID of cdata objects is immutable. */ 2085/* The C type ID of cdata objects is immutable. */
2078LJFOLD(FLOAD KGC IRFL_CDATA_CTYPEID) 2086LJFOLD(FLOAD KGC IRFL_CDATA_CTYPEID)
2079LJFOLDF(fload_cdata_typeid_kgc) 2087LJFOLDF(fload_cdata_typeid_kgc)