aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lj_crecord.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/lj_crecord.c b/src/lj_crecord.c
index b197d4b4..c7c99133 100644
--- a/src/lj_crecord.c
+++ b/src/lj_crecord.c
@@ -331,9 +331,21 @@ void LJ_FASTCALL recff_cdata_index(jit_State *J, RecordFFData *rd)
331 idx = emitir(IRT(IR_TOINT, IRT_INTP), idx, IRTOINT_ANY); 331 idx = emitir(IRT(IR_TOINT, IRT_INTP), idx, IRTOINT_ANY);
332#endif 332#endif
333 if (ctype_ispointer(ct->info)) { 333 if (ctype_ispointer(ct->info)) {
334 sid = ctype_cid(ct->info); 334 ptrdiff_t sz = (ptrdiff_t)lj_ctype_size(cts, (sid = ctype_cid(ct->info)));
335 idx = emitir(IRT(IR_MUL, IRT_INTP), idx, 335 IRIns *ir = IR(tref_ref(idx));
336 lj_ir_kintp(J, lj_ctype_size(cts, sid))); 336 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) &&
337 ir->o == IR_ADD && irref_isk(ir->op2)) {
338 /* This would be rather difficult in FOLD, so do it here:
339 ** (base+(idx+k)*sz)+ofs ==> (base+idx*sz)+(ofs+k*sz)
340 */
341 idx = ir->op1;
342#if LJ_64
343 ofs += (int64_t)ir_kint64(IR(ir->op2))->u64 * sz;
344#else
345 ofs += IR(ir->op2)->i * sz;
346#endif
347 }
348 idx = emitir(IRT(IR_MUL, IRT_INTP), idx, lj_ir_kintp(J, sz));
337 ptr = emitir(IRT(IR_ADD, IRT_PTR), idx, ptr); 349 ptr = emitir(IRT(IR_ADD, IRT_PTR), idx, ptr);
338 } 350 }
339 } else if (tref_isstr(idx)) { 351 } else if (tref_isstr(idx)) {