Blame SOURCES/0003-MIPS-Use-precise-search-for-exit-jump-patching.patch

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