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  <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 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;
 }