diff options
Diffstat (limited to 'src/lj_crecord.c')
-rw-r--r-- | src/lj_crecord.c | 35 |
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) | |||
443 | static TRef crec_reassoc_ofs(jit_State *J, TRef tr, ptrdiff_t *ofsp, MSize sz) | 445 | static 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))) |