瀏覽代碼

LJ_GC64: Various followup fixes.

Contributed by Peter Cawley.
Mike Pall 9 年之前
父節點
當前提交
716f2daef8
共有 2 個文件被更改,包括 11 次插入8 次删除
  1. 9 8
      src/lj_asm_x86.h
  2. 2 0
      src/lj_record.c

+ 9 - 8
src/lj_asm_x86.h

@@ -1247,14 +1247,15 @@ static void asm_href(ASMState *as, IRIns *ir, IROp merge)
       } else {
 	emit_rr(as, XO_MOV, tmp, key);
 #if LJ_GC64
-       emit_gri(as, XG_ARITHi(XOg_XOR), dest, irt_toitype(kt) << 15);
-       if ((as->flags & JIT_F_BMI2)) {
-	 emit_i8(as, 32);
-	 emit_mrm(as, XV_RORX|VEX_64, dest, key);
-       } else {
-	 emit_shifti(as, XOg_SHR|REX_64, dest, 32);
-	 emit_rr(as, XO_MOV, dest|REX_64, key|REX_64);
-       }
+	checkmclim(as);
+	emit_gri(as, XG_ARITHi(XOg_XOR), dest, irt_toitype(kt) << 15);
+	if ((as->flags & JIT_F_BMI2)) {
+	  emit_i8(as, 32);
+	  emit_mrm(as, XV_RORX|VEX_64, dest, key);
+	} else {
+	  emit_shifti(as, XOg_SHR|REX_64, dest, 32);
+	  emit_rr(as, XO_MOV, dest|REX_64, key|REX_64);
+	}
 #else
 	emit_rmro(as, XO_LEA, dest, key, HASH_BIAS);
 #endif

+ 2 - 0
src/lj_record.c

@@ -2263,6 +2263,8 @@ void lj_record_ins(jit_State *J)
     rc = lj_ir_kint(J, (int32_t)(int16_t)rc);
     break;
   case BC_KNIL:
+    if (LJ_FR2 && ra > J->maxslot)
+      J->base[ra-1] = 0;
     while (ra <= rc)
       J->base[ra++] = TREF_NIL;
     if (rc >= J->maxslot) J->maxslot = rc+1;