From f6938e2b5497cce88ab7b3643ab5f3174d8bb3e7 Mon Sep 17 00:00:00 2001 From: Egor Chesakov Date: Mon, 15 Apr 2019 21:07:33 -0700 Subject: Fix an issue with literal 0xFFFFFFFFFFFFF000LL being treated as unsigned long long int (#24011) --- src/jit/emitarm64.cpp | 8 +++----- src/jit/emitarm64.h | 6 ++++++ 2 files changed, 9 insertions(+), 5 deletions(-) (limited to 'src/jit') diff --git a/src/jit/emitarm64.cpp b/src/jit/emitarm64.cpp index 0345a361c8..7f0c0df976 100644 --- a/src/jit/emitarm64.cpp +++ b/src/jit/emitarm64.cpp @@ -8422,9 +8422,8 @@ BYTE* emitter::emitOutputLoadLabel(BYTE* dst, BYTE* srcAddr, BYTE* dstAddr, inst { // adrp x, [rel page addr] -- compute page address: current page addr + rel page addr assert(fmt == IF_LARGEADR); - ssize_t relPageAddr = - (((ssize_t)dstAddr & 0xFFFFFFFFFFFFF000LL) - ((ssize_t)srcAddr & 0xFFFFFFFFFFFFF000LL)) >> 12; - dst = emitOutputShortAddress(dst, INS_adrp, IF_DI_1E, relPageAddr, dstReg); + ssize_t relPageAddr = computeRelPageAddr((size_t)dstAddr, (size_t)srcAddr); + dst = emitOutputShortAddress(dst, INS_adrp, IF_DI_1E, relPageAddr, dstReg); // add x, x, page offs -- compute address = page addr + page offs ssize_t imm12 = (ssize_t)dstAddr & 0xFFF; // 12 bits @@ -8524,8 +8523,7 @@ BYTE* emitter::emitOutputLJ(insGroup* ig, BYTE* dst, instrDesc* i) { // adrp x, [rel page addr] -- compute page address: current page addr + rel page addr assert(fmt == IF_LARGELDC); - ssize_t relPageAddr = - (((ssize_t)dstAddr & 0xFFFFFFFFFFFFF000LL) - ((ssize_t)srcAddr & 0xFFFFFFFFFFFFF000LL)) >> 12; + ssize_t relPageAddr = computeRelPageAddr((size_t)dstAddr, (size_t)srcAddr); if (isVectorRegister(dstReg)) { // Update addrReg with the reserved integer register diff --git a/src/jit/emitarm64.h b/src/jit/emitarm64.h index fefee04f34..2a24b16041 100644 --- a/src/jit/emitarm64.h +++ b/src/jit/emitarm64.h @@ -669,6 +669,12 @@ static bool isValidImmCond(ssize_t imm); static bool isValidImmCondFlags(ssize_t imm); static bool isValidImmCondFlagsImm5(ssize_t imm); +// Computes page "delta" between two addresses +inline static ssize_t computeRelPageAddr(size_t dstAddr, size_t srcAddr) +{ + return (dstAddr >> 12) - (srcAddr >> 12); +} + /************************************************************************/ /* The public entry points to output instructions */ /************************************************************************/ -- cgit v1.2.3