From 7381b620358c2561e8690149f1d25828fdad6675 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Wed, 7 Jun 2017 19:16:22 +0200 Subject: [PATCH] MIPS: Use precise search for exit jump patching. Contributed by Djordje Kovacevic and Stefan Pejic. --- src/lj_asm_mips.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/lj_asm_mips.h b/src/lj_asm_mips.h index 03270ccaa6..d0a1ca51dc 100644 --- a/src/lj_asm_mips.h +++ b/src/lj_asm_mips.h @@ -1933,7 +1933,11 @@ void lj_asm_patchexit(jit_State *J, GCtrace *T, ExitNo exitno, MCode *target) MCode tjump = MIPSI_J|(((uintptr_t)target>>2)&0x03ffffffu); for (p++; p < pe; p++) { if (*p == exitload) { /* Look for load of exit number. */ - if (((p[-1] ^ (px-p)) & 0xffffu) == 0) { /* Look for exitstub branch. */ + /* Look for exitstub branch. Yes, this covers all used branch variants. */ + if (((p[-1] ^ (px-p)) & 0xffffu) == 0 && + ((p[-1] & 0xf0000000u) == MIPSI_BEQ || + (p[-1] & 0xfc1e0000u) == MIPSI_BLTZ || + (p[-1] & 0xffe00000u) == MIPSI_BC1F)) { ptrdiff_t delta = target - p; if (((delta + 0x8000) >> 16) == 0) { /* Patch in-range branch. */ patchbranch: