From 3273f9a19e69e2dcd0a92c653a3567464899a29e Mon Sep 17 00:00:00 2001 From: Christian Groessler Date: Thu, 18 Mar 2021 21:33:51 +0100 Subject: [PATCH] 2021-03-18 Christian Groessler * config/tc-z8k.c (apply_fix): Handle 7-bit relocations correctly. Problem found by Tadashi G. Takaoka . --- gas/ChangeLog | 5 +++++ gas/config/tc-z8k.c | 42 ++++++++++++++++++++++++++---------------- 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index f759c934966..2953d5dc1e1 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2021-03-18 Christian Groessler + + * config/tc-z8k.c (apply_fix): Handle 7-bit relocations correctly. + Problem found by Tadashi G. Takaoka . + 2021-03-16 Kuan-Lin Chen * 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 9cfacb1844d..d3ca8eabeff 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; } -- 2.30.2