Skip to content

Commit 9aa463c

Browse files
committed
DynASM/ARM64: Add abiulity to plug-in generation of veneers to perform long jumps.
1 parent dc89a2d commit 9aa463c

File tree

1 file changed

+15
-6
lines changed

1 file changed

+15
-6
lines changed

ext/opcache/jit/dynasm/dasm_arm64.h

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,15 @@ int dasm_link(Dst_DECL, size_t *szp)
404404
return DASM_S_OK;
405405
}
406406

407+
#ifdef DASM_ADD_VENEER
408+
#define CK_REL(x, o) \
409+
do { if (!(x) && !(n = DASM_ADD_VENEER(D, buffer, ins, b, cp, o))) \
410+
return DASM_S_RANGE_REL|(p-D->actionlist-1); \
411+
} while (0)
412+
#else
413+
#define CK_REL(x, o) CK(x, RANGE_REL)
414+
#endif
415+
407416
#ifdef DASM_CHECKS
408417
#define CK(x, st) \
409418
do { if (!(x)) return DASM_S_##st|(p-D->actionlist-1); } while (0)
@@ -444,7 +453,7 @@ int dasm_encode(Dst_DECL, void *buffer)
444453
if (n < 0) {
445454
ptrdiff_t na = (ptrdiff_t)D->globals[-n] - (ptrdiff_t)cp + 4;
446455
n = (int)na;
447-
CK((ptrdiff_t)n == na, RANGE_REL);
456+
CK_REL((ptrdiff_t)n == na, na);
448457
goto patchrel;
449458
}
450459
/* fallthrough */
@@ -453,18 +462,18 @@ int dasm_encode(Dst_DECL, void *buffer)
453462
n = *DASM_POS2PTR(D, n) - (int)((char *)cp - base) + 4;
454463
patchrel:
455464
if (!(ins & 0xf800)) { /* B, BL */
456-
CK((n & 3) == 0 && ((n+0x08000000) >> 28) == 0, RANGE_REL);
465+
CK_REL((n & 3) == 0 && ((n+0x08000000) >> 28) == 0, n);
457466
cp[-1] |= ((n >> 2) & 0x03ffffff);
458467
} else if ((ins & 0x800)) { /* B.cond, CBZ, CBNZ, LDR* literal */
459-
CK((n & 3) == 0 && ((n+0x00100000) >> 21) == 0, RANGE_REL);
468+
CK_REL((n & 3) == 0 && ((n+0x00100000) >> 21) == 0, n);
460469
cp[-1] |= ((n << 3) & 0x00ffffe0);
461470
} else if ((ins & 0x3000) == 0x2000) { /* ADR */
462-
CK(((n+0x00100000) >> 21) == 0, RANGE_REL);
471+
CK_REL(((n+0x00100000) >> 21) == 0, n);
463472
cp[-1] |= ((n << 3) & 0x00ffffe0) | ((n & 3) << 29);
464473
} else if ((ins & 0x3000) == 0x3000) { /* ADRP */
465474
cp[-1] |= ((n >> 9) & 0x00ffffe0) | (((n >> 12) & 3) << 29);
466475
} else if ((ins & 0x1000)) { /* TBZ, TBNZ */
467-
CK((n & 3) == 0 && ((n+0x00008000) >> 16) == 0, RANGE_REL);
476+
CK_REL((n & 3) == 0 && ((n+0x00008000) >> 16) == 0, n);
468477
cp[-1] |= ((n << 3) & 0x0007ffe0);
469478
} else if ((ins & 0x8000)) { /* absolute */
470479
cp[0] = (unsigned int)((ptrdiff_t)cp - 4 + n);
@@ -475,7 +484,7 @@ int dasm_encode(Dst_DECL, void *buffer)
475484
case DASM_REL_A: {
476485
ptrdiff_t na = (((ptrdiff_t)(*b++) << 32) | (unsigned int)n) - (ptrdiff_t)cp + 4;
477486
n = (int)na;
478-
CK((ptrdiff_t)n == na, RANGE_REL);
487+
CK_REL((ptrdiff_t)n == na, na);
479488
goto patchrel;
480489
}
481490
case DASM_LABEL_LG:

0 commit comments

Comments
 (0)