From 7ef2b55fc0e8d1058b0bdac89e3f4c46db41f553 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Thu, 23 May 2013 22:17:45 +0200 Subject: [PATCH 1/2] FFI: Fix unroll limit for ffi.fill(). --- src/lj_crecord.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/lj_crecord.c b/src/lj_crecord.c index e3973fc1..8577de2c 100644 --- a/src/lj_crecord.c +++ b/src/lj_crecord.c @@ -125,11 +125,6 @@ static IRType crec_ct2irt(CTState *cts, CType *ct) #define CREC_COPY_MAXLEN 128 #define CREC_FILL_MAXUNROLL 16 -#if LJ_TARGET_UNALIGNED -#define CREC_FILL_MAXLEN (CTSIZE_PTR * CREC_FILL_MAXUNROLL) -#else -#define CREC_FILL_MAXLEN CREC_FILL_MAXUNROLL -#endif /* Number of windowed registers used for optimized memory copy. */ #if LJ_TARGET_X86 @@ -320,9 +315,9 @@ static void crec_fill(jit_State *J, TRef trdst, TRef trlen, TRef trfill, MSize mlp; CTSize len = (CTSize)IR(tref_ref(trlen))->i; if (len == 0) return; /* Shortcut. */ - if (len > CREC_FILL_MAXLEN) goto fallback; if (LJ_TARGET_UNALIGNED || step >= CTSIZE_PTR) step = CTSIZE_PTR; + if (step * CREC_FILL_MAXUNROLL < len) goto fallback; mlp = crec_fill_unroll(ml, len, step); if (!mlp) goto fallback; if (tref_isk(trfill) || ml[0].tp != IRT_U8) From 2c3e80d4fd3dd7a81e2691c9facff594cf44de0f Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Thu, 23 May 2013 22:15:51 +0200 Subject: [PATCH 2/2] FFI: Must sink XBAR together with XSTOREs. --- src/lj_snap.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/lj_snap.c b/src/lj_snap.c index aea6102c..30ff9152 100644 --- a/src/lj_snap.c +++ b/src/lj_snap.c @@ -564,6 +564,8 @@ void lj_snap_replay(jit_State *J, GCtrace *T) continue; } tmp = emitir(irs->ot, tmp, val); + } else if (LJ_HASFFI && irs->o == IR_XBAR && ir->o == IR_CNEW) { + emitir(IRT(IR_XBAR, IRT_NIL), 0, 0); } } }