Browse Source

LJ_GC64: Fix HREF for pointers.

Contributed by Peter Cawley.
Mike Pall 9 years ago
parent
commit
bdcaf4bfd9
2 changed files with 11 additions and 1 deletions
  1. 11 0
      src/lj_asm_x86.h
  2. 0 1
      src/lj_tab.c

+ 11 - 0
src/lj_asm_x86.h

@@ -1246,7 +1246,18 @@ static void asm_href(ASMState *as, IRIns *ir, IROp merge)
 #endif
       } 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);
+       }
+#else
 	emit_rmro(as, XO_LEA, dest, key, HASH_BIAS);
+#endif
       }
     }
   }

+ 0 - 1
src/lj_tab.c

@@ -28,7 +28,6 @@ static LJ_AINLINE Node *hashmask(const GCtab *t, uint32_t hash)
 
 #define hashlohi(t, lo, hi)	hashmask((t), hashrot((lo), (hi)))
 #define hashnum(t, o)		hashlohi((t), (o)->u32.lo, ((o)->u32.hi << 1))
-#define hashptr(t, p)		hashlohi((t), u32ptr(p), u32ptr(p) + HASH_BIAS)
 #if LJ_GC64
 #define hashgcref(t, r) \
   hashlohi((t), (uint32_t)gcrefu(r), (uint32_t)(gcrefu(r) >> 32))