diff --git a/binutils/testsuite/binutils-all/aarch64/disas-adrp-neg-ofs.d b/binutils/testsuite/binutils-all/aarch64/disas-adrp-neg-ofs.d new file mode 100644 index 00000000000..9f2e2a5cb89 --- /dev/null +++ b/binutils/testsuite/binutils-all/aarch64/disas-adrp-neg-ofs.d @@ -0,0 +1,15 @@ +#name: disas-adrp-neg-ofs +#source: disas-adrp-neg-ofs.s +#as: -march=morello+c64 +#ld: --section-start .text=0x400000 +#objdump: -D + +.*: +file format .*aarch64.* + + +Disassembly of section .text: + +0000000000400000 <_start>: + 400000: d503201f nop + ... + 401004: f0ffffe0 adrp c0, 400000 <_start> diff --git a/binutils/testsuite/binutils-all/aarch64/disas-adrp-neg-ofs.s b/binutils/testsuite/binutils-all/aarch64/disas-adrp-neg-ofs.s new file mode 100644 index 00000000000..875a9e21a2e --- /dev/null +++ b/binutils/testsuite/binutils-all/aarch64/disas-adrp-neg-ofs.s @@ -0,0 +1,5 @@ + .global _start +_start: + nop + .zero 4096 + adrp c0, _start diff --git a/opcodes/aarch64-dis.c b/opcodes/aarch64-dis.c index a1778b4d2b4..32a40f0841c 100644 --- a/opcodes/aarch64-dis.c +++ b/opcodes/aarch64-dis.c @@ -676,6 +676,7 @@ aarch64_ext_imm (const aarch64_operand *self, aarch64_opnd_info *info, aarch64_operand_error *errors ATTRIBUTE_UNUSED) { uint64_t imm; + unsigned width_ofs = 1; imm = extract_all_fields (self, code); @@ -688,10 +689,11 @@ aarch64_ext_imm (const aarch64_operand *self, aarch64_opnd_info *info, return FALSE; imm &= (1UL << 20) - 1; + width_ofs++; } if (operand_need_sign_extension (self)) - imm = sign_extend (imm, get_operand_fields_width (self) - 1); + imm = sign_extend (imm, get_operand_fields_width (self) - width_ofs); if (operand_need_shift_by_two (self)) imm <<= 2;