aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--binutils/testsuite/binutils-all/aarch64/disas-adrp-neg-ofs.d15
-rw-r--r--binutils/testsuite/binutils-all/aarch64/disas-adrp-neg-ofs.s5
-rw-r--r--opcodes/aarch64-dis.c4
3 files changed, 23 insertions, 1 deletions
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 0000000..9f2e2a5
--- /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 0000000..875a9e2
--- /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 a1778b4..32a40f0 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;