summaryrefslogtreecommitdiff
path: root/src/lj_crecord.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_crecord.c')
-rw-r--r--src/lj_crecord.c35
1 files changed, 14 insertions, 21 deletions
diff --git a/src/lj_crecord.c b/src/lj_crecord.c
index c93cece3..9482cc18 100644
--- a/src/lj_crecord.c
+++ b/src/lj_crecord.c
@@ -185,6 +185,8 @@ static TRef crec_ct_ct(jit_State *J, CType *d, CType *s, TRef dp, TRef sp,
185 (sinfo & CTF_UNSIGNED) ? 0 : IRCONV_SEXT); 185 (sinfo & CTF_UNSIGNED) ? 0 : IRCONV_SEXT);
186 else if (dsize < 8 && ssize == 8) /* Truncate from 64 bit integer. */ 186 else if (dsize < 8 && ssize == 8) /* Truncate from 64 bit integer. */
187 sp = emitconv(sp, dsize < 4 ? IRT_INT : dt, st, 0); 187 sp = emitconv(sp, dsize < 4 ? IRT_INT : dt, st, 0);
188 else if (ssize <= 4)
189 sp = lj_opt_narrow_toint(J, sp);
188 xstore: 190 xstore:
189 if (dt == IRT_I64 || dt == IRT_U64) lj_needsplit(J); 191 if (dt == IRT_I64 || dt == IRT_U64) lj_needsplit(J);
190 if (dp == 0) return sp; 192 if (dp == 0) return sp;
@@ -355,10 +357,10 @@ static TRef crec_ct_tv(jit_State *J, CType *d, TRef dp, TRef sp, TValue *sval)
355 CType *s; 357 CType *s;
356 if (LJ_LIKELY(tref_isinteger(sp))) { 358 if (LJ_LIKELY(tref_isinteger(sp))) {
357 sid = CTID_INT32; 359 sid = CTID_INT32;
358 svisnz = (void *)(intptr_t)(numV(sval) != 0); 360 svisnz = (void *)(intptr_t)(tvisint(sval)?(intV(sval)!=0):!tviszero(sval));
359 } else if (tref_isnum(sp)) { 361 } else if (tref_isnum(sp)) {
360 sid = CTID_DOUBLE; 362 sid = CTID_DOUBLE;
361 svisnz = (void *)(intptr_t)(numV(sval) != 0); 363 svisnz = (void *)(intptr_t)(tvisint(sval)?(intV(sval)!=0):!tviszero(sval));
362 } else if (tref_isbool(sp)) { 364 } else if (tref_isbool(sp)) {
363 sp = lj_ir_kint(J, tref_istrue(sp) ? 1 : 0); 365 sp = lj_ir_kint(J, tref_istrue(sp) ? 1 : 0);
364 sid = CTID_BOOL; 366 sid = CTID_BOOL;
@@ -443,16 +445,16 @@ static CTypeID crec_constructor(jit_State *J, GCcdata *cd, TRef tr)
443static TRef crec_reassoc_ofs(jit_State *J, TRef tr, ptrdiff_t *ofsp, MSize sz) 445static TRef crec_reassoc_ofs(jit_State *J, TRef tr, ptrdiff_t *ofsp, MSize sz)
444{ 446{
445 IRIns *ir = IR(tref_ref(tr)); 447 IRIns *ir = IR(tref_ref(tr));
446 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && 448 if (LJ_LIKELY(J->flags & JIT_F_OPT_FOLD) && irref_isk(ir->op2) &&
447 ir->o == IR_ADD && irref_isk(ir->op2)) { 449 (ir->o == IR_ADD || ir->o == IR_ADDOV || ir->o == IR_SUBOV)) {
448 IRIns *irk = IR(ir->op2); 450 IRIns *irk = IR(ir->op2);
449 tr = ir->op1; 451 ptrdiff_t k;
450#if LJ_64 452 if (LJ_64 && irk->o == IR_KINT64)
451 if (irk->o == IR_KINT64) 453 k = (ptrdiff_t)ir_kint64(irk)->u64 * sz;
452 *ofsp += (ptrdiff_t)ir_kint64(irk)->u64 * sz;
453 else 454 else
454#endif 455 k = (ptrdiff_t)irk->i * sz;
455 *ofsp += (ptrdiff_t)irk->i * sz; 456 if (ir->o == IR_SUBOV) *ofsp -= k; else *ofsp += k;
457 tr = ir->op1; /* Not a TRef, but the caller doesn't care. */
456 } 458 }
457 return tr; 459 return tr;
458} 460}
@@ -477,16 +479,7 @@ void LJ_FASTCALL recff_cdata_index(jit_State *J, RecordFFData *rd)
477 479
478 idx = J->base[1]; 480 idx = J->base[1];
479 if (tref_isnumber(idx)) { 481 if (tref_isnumber(idx)) {
480 /* The size of a ptrdiff_t is target-specific. */ 482 idx = lj_opt_narrow_cindex(J, idx);
481#if LJ_64
482 if (tref_isnum(idx))
483 idx = emitconv(idx, IRT_I64, IRT_NUM, IRCONV_TRUNC|IRCONV_ANY);
484 else
485 idx = emitconv(idx, IRT_I64, IRT_INT, IRCONV_SEXT);
486#else
487 if (tref_isnum(idx))
488 idx = emitconv(idx, IRT_INT, IRT_NUM, IRCONV_TRUNC|IRCONV_ANY);
489#endif
490 integer_key: 483 integer_key:
491 if (ctype_ispointer(ct->info)) { 484 if (ctype_ispointer(ct->info)) {
492 CTSize sz; 485 CTSize sz;
@@ -635,7 +628,7 @@ static void crec_alloc(jit_State *J, RecordFFData *rd, CTypeID id)
635 TRef sp, dp; 628 TRef sp, dp;
636 TValue tv; 629 TValue tv;
637 TValue *sval = &tv; 630 TValue *sval = &tv;
638 setnumV(&tv, 0); 631 setintV(&tv, 0);
639 if (!gcref(df->name)) continue; /* Ignore unnamed fields. */ 632 if (!gcref(df->name)) continue; /* Ignore unnamed fields. */
640 dc = ctype_rawchild(cts, df); /* Field type. */ 633 dc = ctype_rawchild(cts, df); /* Field type. */
641 if (!(ctype_isnum(dc->info) || ctype_isptr(dc->info))) 634 if (!(ctype_isnum(dc->info) || ctype_isptr(dc->info)))