+2018-11-21 John Darrington <john@darrington.wattle.id.au>
+
+       * testsuite/gas/s12z/shift.s: Add new test case.
+       * testsuite/gas/s12z/shift.d: Add expected result.
+
 2018-11-21 John Darrington <john@darrington.wattle.id.au>
 
        * config/tc-s12z.c (opcodes): bhs, blo: New members.
 
 #objdump: -d
-#name:    
+#name:    Tests for shift and rotate instructions
 #source:  shift.s
 
 
   17:  10 3e 8e        lsr.p \(d6,x\), #2
   1a:  10 f4 bf        asl d7, #1
   1d:  10 bc bd        asr d1, #2
+  20:  16 de 78        asl d6, d6, #17
+  23:  16 d6 78        asl d6, d6, #16
 
+2018-11-21  John Darrington  <john@darrington.wattle.id.au>
+
+       * s12z-dis.c (print_insn_shift) [SB_REG_REG_N]: Enter special case
+       if the postbyte matches the appropriate pattern.
+
 2018-11-13  Francois H. Theron <francois.theron@netronome.com>
 
        * nfp-dis.c: Fix crc[] disassembly if operands are swapped.
 
       break;
 
     case SB_REG_REG_N:
-      if (sb & 0x08)
-       {
-         operand_separator (info);
-         if (byte & 0x10)
-           {
-             uint8_t xb;
-             read_memory (memaddr + 1, &xb, 1, info);
-             int shift = ((sb & 0x08) >> 3) | ((xb & 0x0f) << 1);
-             (*info->fprintf_func) (info->stream, "#%d", shift);
-           }
-         else
-           {
-             (*info->fprintf_func) (info->stream, "%s:%d", __FILE__, __LINE__);
-           }
-       }
-      else
-       {
-         opr_decode (memaddr + 1, info);
-       }
+      {
+        uint8_t xb;
+        read_memory (memaddr + 1, &xb, 1, info);
+        /* This case is slightly unusual.
+           If XB matches the binary pattern 0111XXXX, then instead of
+           interpreting this as a general OPR postbyte in the IMMe4 mode,
+           the XB byte is interpreted in s special way.  */
+        if ((xb & 0xF0) == 0x70)
+          {
+            operand_separator (info);
+            if (byte & 0x10)
+              {
+                int shift = ((sb & 0x08) >> 3) | ((xb & 0x0f) << 1);
+                (*info->fprintf_func) (info->stream, "#%d", shift);
+              }
+            else
+              {
+                (*info->fprintf_func) (info->stream, "%s:%d", __FILE__, __LINE__);
+              }
+          }
+        else
+          {
+            opr_decode (memaddr + 1, info);
+          }
+      }
       break;
     case SB_REG_OPR_OPR:
       {