From 21fe61eac6bf74d90ff8329e12bbfb2b8fb2b5ff Mon Sep 17 00:00:00 2001 From: MerryMage Date: Sat, 13 Jan 2018 18:02:19 +0000 Subject: [PATCH] A64/data_processing_pcrel: bug: ADR{,P} instructions sign extend their immediate --- src/frontend/A64/translate/impl/data_processing_pcrel.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/frontend/A64/translate/impl/data_processing_pcrel.cpp b/src/frontend/A64/translate/impl/data_processing_pcrel.cpp index c599fdd0..b8b6ea37 100644 --- a/src/frontend/A64/translate/impl/data_processing_pcrel.cpp +++ b/src/frontend/A64/translate/impl/data_processing_pcrel.cpp @@ -10,14 +10,14 @@ namespace Dynarmic { namespace A64 { bool TranslatorVisitor::ADR(Imm<2> immlo, Imm<19> immhi, Reg Rd) { - u64 imm = concatenate(immhi, immlo).ZeroExtend(); + u64 imm = concatenate(immhi, immlo).SignExtend(); u64 base = ir.PC(); X(64, Rd, ir.Imm64(base + imm)); return true; } bool TranslatorVisitor::ADRP(Imm<2> immlo, Imm<19> immhi, Reg Rd) { - u64 imm = concatenate(immhi, immlo).ZeroExtend() << 12; + u64 imm = concatenate(immhi, immlo).SignExtend() << 12; u64 base = ir.PC() & ~u64(0xFFF); X(64, Rd, ir.Imm64(base + imm)); return true;