diff options
Diffstat (limited to 'src/lj_opt_narrow.c')
-rw-r--r-- | src/lj_opt_narrow.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/src/lj_opt_narrow.c b/src/lj_opt_narrow.c index 94cce582..a381d8d8 100644 --- a/src/lj_opt_narrow.c +++ b/src/lj_opt_narrow.c | |||
@@ -372,17 +372,17 @@ static IRRef narrow_conv_emit(jit_State *J, NarrowConv *nc) | |||
372 | } else if (op == NARROW_CONV) { | 372 | } else if (op == NARROW_CONV) { |
373 | *sp++ = emitir_raw(convot, ref, convop2); /* Raw emit avoids a loop. */ | 373 | *sp++ = emitir_raw(convot, ref, convop2); /* Raw emit avoids a loop. */ |
374 | } else if (op == NARROW_SEXT) { | 374 | } else if (op == NARROW_SEXT) { |
375 | lua_assert(sp >= nc->stack+1); | 375 | lj_assertJ(sp >= nc->stack+1, "stack underflow"); |
376 | sp[-1] = emitir(IRT(IR_CONV, IRT_I64), sp[-1], | 376 | sp[-1] = emitir(IRT(IR_CONV, IRT_I64), sp[-1], |
377 | (IRT_I64<<5)|IRT_INT|IRCONV_SEXT); | 377 | (IRT_I64<<5)|IRT_INT|IRCONV_SEXT); |
378 | } else if (op == NARROW_INT) { | 378 | } else if (op == NARROW_INT) { |
379 | lua_assert(next < last); | 379 | lj_assertJ(next < last, "missing arg to NARROW_INT"); |
380 | *sp++ = nc->t == IRT_I64 ? | 380 | *sp++ = nc->t == IRT_I64 ? |
381 | lj_ir_kint64(J, (int64_t)(int32_t)*next++) : | 381 | lj_ir_kint64(J, (int64_t)(int32_t)*next++) : |
382 | lj_ir_kint(J, *next++); | 382 | lj_ir_kint(J, *next++); |
383 | } else { /* Regular IROpT. Pops two operands and pushes one result. */ | 383 | } else { /* Regular IROpT. Pops two operands and pushes one result. */ |
384 | IRRef mode = nc->mode; | 384 | IRRef mode = nc->mode; |
385 | lua_assert(sp >= nc->stack+2); | 385 | lj_assertJ(sp >= nc->stack+2, "stack underflow"); |
386 | sp--; | 386 | sp--; |
387 | /* Omit some overflow checks for array indexing. See comments above. */ | 387 | /* Omit some overflow checks for array indexing. See comments above. */ |
388 | if ((mode & IRCONV_CONVMASK) == IRCONV_INDEX) { | 388 | if ((mode & IRCONV_CONVMASK) == IRCONV_INDEX) { |
@@ -398,7 +398,7 @@ static IRRef narrow_conv_emit(jit_State *J, NarrowConv *nc) | |||
398 | narrow_bpc_set(J, narrow_ref(ref), narrow_ref(sp[-1]), mode); | 398 | narrow_bpc_set(J, narrow_ref(ref), narrow_ref(sp[-1]), mode); |
399 | } | 399 | } |
400 | } | 400 | } |
401 | lua_assert(sp == nc->stack+1); | 401 | lj_assertJ(sp == nc->stack+1, "stack misalignment"); |
402 | return nc->stack[0]; | 402 | return nc->stack[0]; |
403 | } | 403 | } |
404 | 404 | ||
@@ -452,7 +452,7 @@ static TRef narrow_stripov(jit_State *J, TRef tr, int lastop, IRRef mode) | |||
452 | TRef LJ_FASTCALL lj_opt_narrow_index(jit_State *J, TRef tr) | 452 | TRef LJ_FASTCALL lj_opt_narrow_index(jit_State *J, TRef tr) |
453 | { | 453 | { |
454 | IRIns *ir; | 454 | IRIns *ir; |
455 | lua_assert(tref_isnumber(tr)); | 455 | lj_assertJ(tref_isnumber(tr), "expected number type"); |
456 | if (tref_isnum(tr)) /* Conversion may be narrowed, too. See above. */ | 456 | if (tref_isnum(tr)) /* Conversion may be narrowed, too. See above. */ |
457 | return emitir(IRTGI(IR_CONV), tr, IRCONV_INT_NUM|IRCONV_INDEX); | 457 | return emitir(IRTGI(IR_CONV), tr, IRCONV_INT_NUM|IRCONV_INDEX); |
458 | /* Omit some overflow checks for array indexing. See comments above. */ | 458 | /* Omit some overflow checks for array indexing. See comments above. */ |
@@ -499,7 +499,7 @@ TRef LJ_FASTCALL lj_opt_narrow_tobit(jit_State *J, TRef tr) | |||
499 | /* Narrow C array index (overflow undefined). */ | 499 | /* Narrow C array index (overflow undefined). */ |
500 | TRef LJ_FASTCALL lj_opt_narrow_cindex(jit_State *J, TRef tr) | 500 | TRef LJ_FASTCALL lj_opt_narrow_cindex(jit_State *J, TRef tr) |
501 | { | 501 | { |
502 | lua_assert(tref_isnumber(tr)); | 502 | lj_assertJ(tref_isnumber(tr), "expected number type"); |
503 | if (tref_isnum(tr)) | 503 | if (tref_isnum(tr)) |
504 | return emitir(IRT(IR_CONV, IRT_INTP), tr, (IRT_INTP<<5)|IRT_NUM|IRCONV_ANY); | 504 | return emitir(IRT(IR_CONV, IRT_INTP), tr, (IRT_INTP<<5)|IRT_NUM|IRCONV_ANY); |
505 | /* Undefined overflow semantics allow stripping of ADDOV, SUBOV and MULOV. */ | 505 | /* Undefined overflow semantics allow stripping of ADDOV, SUBOV and MULOV. */ |
@@ -627,9 +627,10 @@ static int narrow_forl(jit_State *J, cTValue *o) | |||
627 | /* Narrow the FORL index type by looking at the runtime values. */ | 627 | /* Narrow the FORL index type by looking at the runtime values. */ |
628 | IRType lj_opt_narrow_forl(jit_State *J, cTValue *tv) | 628 | IRType lj_opt_narrow_forl(jit_State *J, cTValue *tv) |
629 | { | 629 | { |
630 | lua_assert(tvisnumber(&tv[FORL_IDX]) && | 630 | lj_assertJ(tvisnumber(&tv[FORL_IDX]) && |
631 | tvisnumber(&tv[FORL_STOP]) && | 631 | tvisnumber(&tv[FORL_STOP]) && |
632 | tvisnumber(&tv[FORL_STEP])); | 632 | tvisnumber(&tv[FORL_STEP]), |
633 | "expected number types"); | ||
633 | /* Narrow only if the runtime values of start/stop/step are all integers. */ | 634 | /* Narrow only if the runtime values of start/stop/step are all integers. */ |
634 | if (narrow_forl(J, &tv[FORL_IDX]) && | 635 | if (narrow_forl(J, &tv[FORL_IDX]) && |
635 | narrow_forl(J, &tv[FORL_STOP]) && | 636 | narrow_forl(J, &tv[FORL_STOP]) && |