From: Egor Chesakov Date: Tue, 16 Apr 2019 04:07:33 +0000 (-0700) Subject: Fix an issue with literal 0xFFFFFFFFFFFFF000LL being treated as unsigned long long... X-Git-Tag: accepted/tizen/unified/20190813.215958~46^2~58 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f6938e2b5497cce88ab7b3643ab5f3174d8bb3e7;p=platform%2Fupstream%2Fcoreclr.git Fix an issue with literal 0xFFFFFFFFFFFFF000LL being treated as unsigned long long int (#24011) --- diff --git a/src/jit/emitarm64.cpp b/src/jit/emitarm64.cpp index 0345a36..7f0c0df 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 fefee04..2a24b16 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 */ /************************************************************************/