aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gas/ChangeLog5
-rw-r--r--gas/config/tc-z8k.c42
2 files changed, 31 insertions, 16 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index f759c93..2953d5d 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,8 @@
+2021-03-18 Christian Groessler <chris@groessler.org>
+
+ * config/tc-z8k.c (apply_fix): Handle 7-bit relocations correctly.
+ Problem found by Tadashi G. Takaoka <tadashi.g.takaoka@gmail.com>.
+
2021-03-16 Kuan-Lin Chen <kuanlinchentw@gmail.com>
* config/tc-riscv.c (ext_version_table): Add b, zba, zbb and zbc.
diff --git a/gas/config/tc-z8k.c b/gas/config/tc-z8k.c
index 9cfacb1..d3ca8ea 100644
--- a/gas/config/tc-z8k.c
+++ b/gas/config/tc-z8k.c
@@ -993,24 +993,34 @@ apply_fix (unsigned char *ptr, bfd_reloc_code_real_type type,
/* size is in nibbles. */
newfix ((ptr - buffer) / 2, type, size + 1, operand);
- switch (size)
+
+ if (type == BFD_RELOC_Z8K_DISP7)
{
- case 8: /* 8 nibbles == 32 bits. */
- *ptr++ = n >> 28;
- *ptr++ = n >> 24;
- *ptr++ = n >> 20;
- *ptr++ = n >> 16;
- /* Fall through. */
- case 4: /* 4 nibbles == 16 bits. */
- *ptr++ = n >> 12;
- *ptr++ = n >> 8;
- /* Fall through. */
- case 2:
- *ptr++ = n >> 4;
- /* Fall through. */
- case 1:
+ /* 2 nibbles, but most significant bit is part of the opcode == 7 bits. */
+ *ptr++ = (n >> 4) & 7;
*ptr++ = n >> 0;
- break;
+ }
+ else
+ {
+ switch (size)
+ {
+ case 8: /* 8 nibbles == 32 bits. */
+ *ptr++ = n >> 28;
+ *ptr++ = n >> 24;
+ *ptr++ = n >> 20;
+ *ptr++ = n >> 16;
+ /* Fall through. */
+ case 4: /* 4 nibbles == 16 bits. */
+ *ptr++ = n >> 12;
+ *ptr++ = n >> 8;
+ /* Fall through. */
+ case 2:
+ *ptr++ = n >> 4;
+ /* Fall through. */
+ case 1:
+ *ptr++ = n >> 0;
+ break;
+ }
}
return ptr;
}