diff options
-rw-r--r-- | src/lj_asm_arm64.h | 14 |
1 files changed, 6 insertions, 8 deletions
diff --git a/src/lj_asm_arm64.h b/src/lj_asm_arm64.h index c5ebd324..68749284 100644 --- a/src/lj_asm_arm64.h +++ b/src/lj_asm_arm64.h | |||
@@ -924,18 +924,16 @@ static void asm_uref(ASMState *as, IRIns *ir) | |||
924 | MRef *v = &gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv.v; | 924 | MRef *v = &gcref(fn->l.uvptr[(ir->op2 >> 8)])->uv.v; |
925 | emit_lsptr(as, A64I_LDRx, dest, v); | 925 | emit_lsptr(as, A64I_LDRx, dest, v); |
926 | } else { | 926 | } else { |
927 | Reg uv = ra_scratch(as, RSET_GPR); | ||
928 | Reg func = ra_alloc1(as, ir->op1, RSET_GPR); | ||
929 | if (ir->o == IR_UREFC) { | 927 | if (ir->o == IR_UREFC) { |
930 | asm_guardcc(as, CC_NE); | 928 | asm_guardcnb(as, A64I_CBZ, RID_TMP); |
931 | emit_n(as, (A64I_CMPx^A64I_K12) | A64F_U12(1), RID_TMP); | 929 | emit_opk(as, A64I_ADDx, dest, dest, |
932 | emit_opk(as, A64I_ADDx, dest, uv, | ||
933 | (int32_t)offsetof(GCupval, tv), RSET_GPR); | 930 | (int32_t)offsetof(GCupval, tv), RSET_GPR); |
934 | emit_lso(as, A64I_LDRB, RID_TMP, uv, (int32_t)offsetof(GCupval, closed)); | 931 | emit_lso(as, A64I_LDRB, RID_TMP, dest, |
932 | (int32_t)offsetof(GCupval, closed)); | ||
935 | } else { | 933 | } else { |
936 | emit_lso(as, A64I_LDRx, dest, uv, (int32_t)offsetof(GCupval, v)); | 934 | emit_lso(as, A64I_LDRx, dest, dest, (int32_t)offsetof(GCupval, v)); |
937 | } | 935 | } |
938 | emit_lso(as, A64I_LDRx, uv, func, | 936 | emit_lso(as, A64I_LDRx, dest, ra_alloc1(as, ir->op1, RSET_GPR), |
939 | (int32_t)offsetof(GCfuncL, uvptr) + 8*(int32_t)(ir->op2 >> 8)); | 937 | (int32_t)offsetof(GCfuncL, uvptr) + 8*(int32_t)(ir->op2 >> 8)); |
940 | } | 938 | } |
941 | } | 939 | } |