Browse Source

ARM: Generalize machine code co-location. ARM has a +-32MB range.

Mike Pall 14 years ago
parent
commit
be73a96751
1 changed files with 26 additions and 11 deletions
  1. 26 11
      src/lj_mcode.c

+ 26 - 11
src/lj_mcode.c

@@ -156,23 +156,43 @@ static void mcode_protect(jit_State *J, int prot)
 
 /* -- MCode area allocation ----------------------------------------------- */
 
-#if LJ_64
+#if LJ_TARGET_X64
+#define mcode_validptr(p)	((p) && (uintptr_t)(p) < (uintptr_t)1<<47)
+#else
+#define mcode_validptr(p)	((p) && (uintptr_t)(p) < 0xffff0000)
+#endif
+
+#if LJ_TARGET_X64
+#define MCODE_JUMPRANGE		31
+#elif LJ_TARGET_ARM
+#define MCODE_JUMPRANGE		26
+#else
+#define MCODE_JUMPRANGE		32
+#endif
+
+#if MCODE_JUMPRANGE == 32
+
+/* All 32 bit memory addresses are reachable by relative jumps. */
+#define mcode_alloc(J, sz)	mcode_alloc_at((J), 0, (sz), MCPROT_GEN)
+
+#else
 
 /* Get memory within relative jump distance of our code in 64 bit mode. */
 static void *mcode_alloc(jit_State *J, size_t sz)
 {
   /* Target an address in the static assembler code (64K aligned).
-  ** Try addresses within a distance of target-1GB+1MB .. target+1GB-1MB.
+  ** Try addresses within a distance of target-range/2+1MB..target+range/2-1MB.
   */
   uintptr_t target = (uintptr_t)(void *)lj_vm_exit_handler & ~(uintptr_t)0xffff;
-  const uintptr_t range = (1u<<31) - (1u << 21);
+  const uintptr_t range = (1u << MCODE_JUMPRANGE) - (1u << 21);
   /* First try a contiguous area below the last one. */
-  uintptr_t hint = (uintptr_t)J->mcarea - sz;
+  uintptr_t hint = J->mcarea ? (uintptr_t)J->mcarea - sz : 0;
   int i;
   for (i = 0; i < 32; i++) {  /* 32 attempts ought to be enough ... */
-    if (hint && hint < (uintptr_t)1<<47) {
+    if (mcode_validptr(hint)) {
       void *p = mcode_alloc_at(J, hint, sz, MCPROT_GEN);
-      if (p && (uintptr_t)p < (uintptr_t)1<<47) {
+
+      if (mcode_validptr(p)) {
 	if ((uintptr_t)p + sz - target < range || target - (uintptr_t)p < range)
 	  return p;
 	mcode_free(J, p, sz);  /* Free badly placed area. */
@@ -188,11 +208,6 @@ static void *mcode_alloc(jit_State *J, size_t sz)
   return NULL;
 }
 
-#else
-
-/* All 32 bit memory addresses are reachable by relative jumps on x86. */
-#define mcode_alloc(J, sz)	mcode_alloc_at((J), 0, (sz), MCPROT_GEN)
-
 #endif
 
 /* -- MCode area management ----------------------------------------------- */