|
@@ -1577,7 +1577,7 @@ dotypecheck:
|
|
asm_guard(as, MIPSI_BEQ, RID_TMP, RID_ZERO);
|
|
asm_guard(as, MIPSI_BEQ, RID_TMP, RID_ZERO);
|
|
emit_tsi(as, MIPSI_SLTIU, RID_TMP, type, (int32_t)LJ_TISNUM);
|
|
emit_tsi(as, MIPSI_SLTIU, RID_TMP, type, (int32_t)LJ_TISNUM);
|
|
} else {
|
|
} else {
|
|
- Reg ktype = ra_allock(as, irt_toitype(t), allow);
|
|
|
|
|
|
+ Reg ktype = ra_allock(as, (ir->op2 & IRSLOAD_KEYINDEX) ? LJ_KEYINDEX : irt_toitype(t), allow);
|
|
asm_guard(as, MIPSI_BNE, type, ktype);
|
|
asm_guard(as, MIPSI_BNE, type, ktype);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -1595,6 +1595,10 @@ dotypecheck:
|
|
if (irt_ispri(t)) {
|
|
if (irt_ispri(t)) {
|
|
asm_guard(as, MIPSI_BNE, type,
|
|
asm_guard(as, MIPSI_BNE, type,
|
|
ra_allock(as, ~((int64_t)~irt_toitype(t) << 47) , allow));
|
|
ra_allock(as, ~((int64_t)~irt_toitype(t) << 47) , allow));
|
|
|
|
+ } else if ((ir->op2 & IRSLOAD_KEYINDEX)) {
|
|
|
|
+ asm_guard(as, MIPSI_BNE, RID_TMP,
|
|
|
|
+ ra_allock(as, (int32_t)LJ_KEYINDEX, allow));
|
|
|
|
+ emit_dta(as, MIPSI_DSRA32, RID_TMP, type, 0);
|
|
} else {
|
|
} else {
|
|
if (irt_isnum(t)) {
|
|
if (irt_isnum(t)) {
|
|
asm_guard(as, MIPSI_BEQ, RID_TMP, RID_ZERO);
|
|
asm_guard(as, MIPSI_BEQ, RID_TMP, RID_ZERO);
|
|
@@ -2568,7 +2572,22 @@ static void asm_stack_restore(ASMState *as, SnapShot *snap)
|
|
}
|
|
}
|
|
emit_tsi(as, MIPSI_SW, type, RID_BASE, ofs+(LJ_BE?0:4));
|
|
emit_tsi(as, MIPSI_SW, type, RID_BASE, ofs+(LJ_BE?0:4));
|
|
#else
|
|
#else
|
|
- asm_tvstore64(as, RID_BASE, ofs, ref);
|
|
|
|
|
|
+ if ((sn & SNAP_KEYINDEX)) {
|
|
|
|
+ RegSet allow = rset_exclude(RSET_GPR, RID_BASE);
|
|
|
|
+ int64_t kki = (int64_t)LJ_KEYINDEX << 32;
|
|
|
|
+ if (irref_isk(ref)) {
|
|
|
|
+ emit_tsi(as, MIPSI_SD,
|
|
|
|
+ ra_allock(as, kki | (int64_t)(uint32_t)ir->i, allow),
|
|
|
|
+ RID_BASE, ofs);
|
|
|
|
+ } else {
|
|
|
|
+ Reg src = ra_alloc1(as, ref, allow);
|
|
|
|
+ Reg rki = ra_allock(as, kki, rset_exclude(allow, src));
|
|
|
|
+ emit_tsi(as, MIPSI_SD, RID_TMP, RID_BASE, ofs);
|
|
|
|
+ emit_dst(as, MIPSI_DADDU, RID_TMP, src, rki);
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ asm_tvstore64(as, RID_BASE, ofs, ref);
|
|
|
|
+ }
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|
|
checkmclim(as);
|
|
checkmclim(as);
|