summaryrefslogtreecommitdiff
path: root/src/jit
diff options
context:
space:
mode:
authorEgor Chesakov <Egor.Chesakov@microsoft.com>2019-04-15 21:07:33 -0700
committerGitHub <noreply@github.com>2019-04-15 21:07:33 -0700
commitf6938e2b5497cce88ab7b3643ab5f3174d8bb3e7 (patch)
treef0bd3e147c82840430bccf778a0dec2f4c1ae1a5 /src/jit
parentee2c5d63810de5c663f644821751ecc6f56c5149 (diff)
downloadcoreclr-f6938e2b5497cce88ab7b3643ab5f3174d8bb3e7.tar.gz
coreclr-f6938e2b5497cce88ab7b3643ab5f3174d8bb3e7.tar.bz2
coreclr-f6938e2b5497cce88ab7b3643ab5f3174d8bb3e7.zip
Fix an issue with literal 0xFFFFFFFFFFFFF000LL being treated as unsigned long long int (#24011)
Diffstat (limited to 'src/jit')
-rw-r--r--src/jit/emitarm64.cpp8
-rw-r--r--src/jit/emitarm64.h6
2 files changed, 9 insertions, 5 deletions
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 */
/************************************************************************/