summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lj_opt_mem.c20
1 files changed, 9 insertions, 11 deletions
diff --git a/src/lj_opt_mem.c b/src/lj_opt_mem.c
index 400fb48e..21c861bb 100644
--- a/src/lj_opt_mem.c
+++ b/src/lj_opt_mem.c
@@ -749,21 +749,19 @@ retry:
749 case ALIAS_MUST: 749 case ALIAS_MUST:
750 /* Emit conversion if the loaded type doesn't match the forwarded type. */ 750 /* Emit conversion if the loaded type doesn't match the forwarded type. */
751 if (!irt_sametype(fins->t, IR(store->op2)->t)) { 751 if (!irt_sametype(fins->t, IR(store->op2)->t)) {
752 IRType st = irt_type(fins->t); 752 IRType dt = irt_type(fins->t), st = irt_type(IR(store->op2)->t);
753 if (st == IRT_I8 || st == IRT_I16) { /* Trunc + sign-extend. */ 753 if (dt == IRT_I8 || dt == IRT_I16) { /* Trunc + sign-extend. */
754 st |= IRCONV_SEXT; 754 st = dt | IRCONV_SEXT;
755 } else if (st == IRT_U8 || st == IRT_U16) { /* Trunc + zero-extend. */ 755 dt = IRT_INT;
756 } else if (st == IRT_INT) { 756 } else if (dt == IRT_U8 || dt == IRT_U16) { /* Trunc + zero-extend. */
757 st = irt_type(IR(store->op2)->t); /* Needs dummy CONV.int.*. */ 757 st = dt;
758 } else { /* I64/U64 are boxed, U32 is hidden behind a CONV.num.u32. */ 758 dt = IRT_INT;
759 goto store_fwd;
760 } 759 }
761 fins->ot = IRTI(IR_CONV); 760 fins->ot = IRT(IR_CONV, dt);
762 fins->op1 = store->op2; 761 fins->op1 = store->op2;
763 fins->op2 = (IRT_INT<<5)|st; 762 fins->op2 = (dt<<5)|st;
764 return RETRYFOLD; 763 return RETRYFOLD;
765 } 764 }
766 store_fwd:
767 return store->op2; /* Store forwarding. */ 765 return store->op2; /* Store forwarding. */
768 } 766 }
769 ref = store->prev; 767 ref = store->prev;