[llvm] [M68k][MC] Generate some encoding tests for MOVE (PR #194269)

Peter Mackay via llvm-commits llvm-commits at lists.llvm.org
Wed May 6 15:46:50 PDT 2026


https://github.com/petmac updated https://github.com/llvm/llvm-project/pull/194269

>From 54e1478661399a268b4fd6c5e6984e1d422f9d6e Mon Sep 17 00:00:00 2001
From: Peter Mackay <git at petmac.dev>
Date: Thu, 15 May 2025 22:22:01 +0100
Subject: [PATCH 1/8] Generate encoding tests for MOVE register-to-register

---
 llvm/test/MC/M68k/Generated/MOVE.s  | 1284 +++++++++++++++++++++++++++
 llvm/test/MC/M68k/generate_tests.py |  233 +++++
 2 files changed, 1517 insertions(+)
 create mode 100644 llvm/test/MC/M68k/Generated/MOVE.s
 create mode 100755 llvm/test/MC/M68k/generate_tests.py

diff --git a/llvm/test/MC/M68k/Generated/MOVE.s b/llvm/test/MC/M68k/Generated/MOVE.s
new file mode 100644
index 0000000000000..0d936526ace0c
--- /dev/null
+++ b/llvm/test/MC/M68k/Generated/MOVE.s
@@ -0,0 +1,1284 @@
+; Generated by llvm/test/MC/M68k/generate_tests.py
+; Please do not edit this file by hand.
+
+; RUN: llvm-mc -triple=m68k -mcpu=M68040 -show-encoding < %s | FileCheck %s
+
+; CHECK:      move.b %d0, %d0
+; CHECK-SAME: encoding: [0x10,0x00]
+move.b %d0, %d0
+
+; CHECK:      move.b %d0, %d1
+; CHECK-SAME: encoding: [0x12,0x00]
+move.b %d0, %d1
+
+; CHECK:      move.b %d0, %d2
+; CHECK-SAME: encoding: [0x14,0x00]
+move.b %d0, %d2
+
+; CHECK:      move.b %d0, %d3
+; CHECK-SAME: encoding: [0x16,0x00]
+move.b %d0, %d3
+
+; CHECK:      move.b %d0, %d4
+; CHECK-SAME: encoding: [0x18,0x00]
+move.b %d0, %d4
+
+; CHECK:      move.b %d0, %d5
+; CHECK-SAME: encoding: [0x1a,0x00]
+move.b %d0, %d5
+
+; CHECK:      move.b %d0, %d6
+; CHECK-SAME: encoding: [0x1c,0x00]
+move.b %d0, %d6
+
+; CHECK:      move.b %d0, %d7
+; CHECK-SAME: encoding: [0x1e,0x00]
+move.b %d0, %d7
+
+; CHECK:      move.b %d1, %d0
+; CHECK-SAME: encoding: [0x10,0x01]
+move.b %d1, %d0
+
+; CHECK:      move.b %d1, %d1
+; CHECK-SAME: encoding: [0x12,0x01]
+move.b %d1, %d1
+
+; CHECK:      move.b %d1, %d2
+; CHECK-SAME: encoding: [0x14,0x01]
+move.b %d1, %d2
+
+; CHECK:      move.b %d1, %d3
+; CHECK-SAME: encoding: [0x16,0x01]
+move.b %d1, %d3
+
+; CHECK:      move.b %d1, %d4
+; CHECK-SAME: encoding: [0x18,0x01]
+move.b %d1, %d4
+
+; CHECK:      move.b %d1, %d5
+; CHECK-SAME: encoding: [0x1a,0x01]
+move.b %d1, %d5
+
+; CHECK:      move.b %d1, %d6
+; CHECK-SAME: encoding: [0x1c,0x01]
+move.b %d1, %d6
+
+; CHECK:      move.b %d1, %d7
+; CHECK-SAME: encoding: [0x1e,0x01]
+move.b %d1, %d7
+
+; CHECK:      move.b %d2, %d0
+; CHECK-SAME: encoding: [0x10,0x02]
+move.b %d2, %d0
+
+; CHECK:      move.b %d2, %d1
+; CHECK-SAME: encoding: [0x12,0x02]
+move.b %d2, %d1
+
+; CHECK:      move.b %d2, %d2
+; CHECK-SAME: encoding: [0x14,0x02]
+move.b %d2, %d2
+
+; CHECK:      move.b %d2, %d3
+; CHECK-SAME: encoding: [0x16,0x02]
+move.b %d2, %d3
+
+; CHECK:      move.b %d2, %d4
+; CHECK-SAME: encoding: [0x18,0x02]
+move.b %d2, %d4
+
+; CHECK:      move.b %d2, %d5
+; CHECK-SAME: encoding: [0x1a,0x02]
+move.b %d2, %d5
+
+; CHECK:      move.b %d2, %d6
+; CHECK-SAME: encoding: [0x1c,0x02]
+move.b %d2, %d6
+
+; CHECK:      move.b %d2, %d7
+; CHECK-SAME: encoding: [0x1e,0x02]
+move.b %d2, %d7
+
+; CHECK:      move.b %d3, %d0
+; CHECK-SAME: encoding: [0x10,0x03]
+move.b %d3, %d0
+
+; CHECK:      move.b %d3, %d1
+; CHECK-SAME: encoding: [0x12,0x03]
+move.b %d3, %d1
+
+; CHECK:      move.b %d3, %d2
+; CHECK-SAME: encoding: [0x14,0x03]
+move.b %d3, %d2
+
+; CHECK:      move.b %d3, %d3
+; CHECK-SAME: encoding: [0x16,0x03]
+move.b %d3, %d3
+
+; CHECK:      move.b %d3, %d4
+; CHECK-SAME: encoding: [0x18,0x03]
+move.b %d3, %d4
+
+; CHECK:      move.b %d3, %d5
+; CHECK-SAME: encoding: [0x1a,0x03]
+move.b %d3, %d5
+
+; CHECK:      move.b %d3, %d6
+; CHECK-SAME: encoding: [0x1c,0x03]
+move.b %d3, %d6
+
+; CHECK:      move.b %d3, %d7
+; CHECK-SAME: encoding: [0x1e,0x03]
+move.b %d3, %d7
+
+; CHECK:      move.b %d4, %d0
+; CHECK-SAME: encoding: [0x10,0x04]
+move.b %d4, %d0
+
+; CHECK:      move.b %d4, %d1
+; CHECK-SAME: encoding: [0x12,0x04]
+move.b %d4, %d1
+
+; CHECK:      move.b %d4, %d2
+; CHECK-SAME: encoding: [0x14,0x04]
+move.b %d4, %d2
+
+; CHECK:      move.b %d4, %d3
+; CHECK-SAME: encoding: [0x16,0x04]
+move.b %d4, %d3
+
+; CHECK:      move.b %d4, %d4
+; CHECK-SAME: encoding: [0x18,0x04]
+move.b %d4, %d4
+
+; CHECK:      move.b %d4, %d5
+; CHECK-SAME: encoding: [0x1a,0x04]
+move.b %d4, %d5
+
+; CHECK:      move.b %d4, %d6
+; CHECK-SAME: encoding: [0x1c,0x04]
+move.b %d4, %d6
+
+; CHECK:      move.b %d4, %d7
+; CHECK-SAME: encoding: [0x1e,0x04]
+move.b %d4, %d7
+
+; CHECK:      move.b %d5, %d0
+; CHECK-SAME: encoding: [0x10,0x05]
+move.b %d5, %d0
+
+; CHECK:      move.b %d5, %d1
+; CHECK-SAME: encoding: [0x12,0x05]
+move.b %d5, %d1
+
+; CHECK:      move.b %d5, %d2
+; CHECK-SAME: encoding: [0x14,0x05]
+move.b %d5, %d2
+
+; CHECK:      move.b %d5, %d3
+; CHECK-SAME: encoding: [0x16,0x05]
+move.b %d5, %d3
+
+; CHECK:      move.b %d5, %d4
+; CHECK-SAME: encoding: [0x18,0x05]
+move.b %d5, %d4
+
+; CHECK:      move.b %d5, %d5
+; CHECK-SAME: encoding: [0x1a,0x05]
+move.b %d5, %d5
+
+; CHECK:      move.b %d5, %d6
+; CHECK-SAME: encoding: [0x1c,0x05]
+move.b %d5, %d6
+
+; CHECK:      move.b %d5, %d7
+; CHECK-SAME: encoding: [0x1e,0x05]
+move.b %d5, %d7
+
+; CHECK:      move.b %d6, %d0
+; CHECK-SAME: encoding: [0x10,0x06]
+move.b %d6, %d0
+
+; CHECK:      move.b %d6, %d1
+; CHECK-SAME: encoding: [0x12,0x06]
+move.b %d6, %d1
+
+; CHECK:      move.b %d6, %d2
+; CHECK-SAME: encoding: [0x14,0x06]
+move.b %d6, %d2
+
+; CHECK:      move.b %d6, %d3
+; CHECK-SAME: encoding: [0x16,0x06]
+move.b %d6, %d3
+
+; CHECK:      move.b %d6, %d4
+; CHECK-SAME: encoding: [0x18,0x06]
+move.b %d6, %d4
+
+; CHECK:      move.b %d6, %d5
+; CHECK-SAME: encoding: [0x1a,0x06]
+move.b %d6, %d5
+
+; CHECK:      move.b %d6, %d6
+; CHECK-SAME: encoding: [0x1c,0x06]
+move.b %d6, %d6
+
+; CHECK:      move.b %d6, %d7
+; CHECK-SAME: encoding: [0x1e,0x06]
+move.b %d6, %d7
+
+; CHECK:      move.b %d7, %d0
+; CHECK-SAME: encoding: [0x10,0x07]
+move.b %d7, %d0
+
+; CHECK:      move.b %d7, %d1
+; CHECK-SAME: encoding: [0x12,0x07]
+move.b %d7, %d1
+
+; CHECK:      move.b %d7, %d2
+; CHECK-SAME: encoding: [0x14,0x07]
+move.b %d7, %d2
+
+; CHECK:      move.b %d7, %d3
+; CHECK-SAME: encoding: [0x16,0x07]
+move.b %d7, %d3
+
+; CHECK:      move.b %d7, %d4
+; CHECK-SAME: encoding: [0x18,0x07]
+move.b %d7, %d4
+
+; CHECK:      move.b %d7, %d5
+; CHECK-SAME: encoding: [0x1a,0x07]
+move.b %d7, %d5
+
+; CHECK:      move.b %d7, %d6
+; CHECK-SAME: encoding: [0x1c,0x07]
+move.b %d7, %d6
+
+; CHECK:      move.b %d7, %d7
+; CHECK-SAME: encoding: [0x1e,0x07]
+move.b %d7, %d7
+
+; CHECK:      move.w %d0, %d0
+; CHECK-SAME: encoding: [0x30,0x00]
+move.w %d0, %d0
+
+; CHECK:      move.w %d0, %d1
+; CHECK-SAME: encoding: [0x32,0x00]
+move.w %d0, %d1
+
+; CHECK:      move.w %d0, %d2
+; CHECK-SAME: encoding: [0x34,0x00]
+move.w %d0, %d2
+
+; CHECK:      move.w %d0, %d3
+; CHECK-SAME: encoding: [0x36,0x00]
+move.w %d0, %d3
+
+; CHECK:      move.w %d0, %d4
+; CHECK-SAME: encoding: [0x38,0x00]
+move.w %d0, %d4
+
+; CHECK:      move.w %d0, %d5
+; CHECK-SAME: encoding: [0x3a,0x00]
+move.w %d0, %d5
+
+; CHECK:      move.w %d0, %d6
+; CHECK-SAME: encoding: [0x3c,0x00]
+move.w %d0, %d6
+
+; CHECK:      move.w %d0, %d7
+; CHECK-SAME: encoding: [0x3e,0x00]
+move.w %d0, %d7
+
+; CHECK:      move.w %d1, %d0
+; CHECK-SAME: encoding: [0x30,0x01]
+move.w %d1, %d0
+
+; CHECK:      move.w %d1, %d1
+; CHECK-SAME: encoding: [0x32,0x01]
+move.w %d1, %d1
+
+; CHECK:      move.w %d1, %d2
+; CHECK-SAME: encoding: [0x34,0x01]
+move.w %d1, %d2
+
+; CHECK:      move.w %d1, %d3
+; CHECK-SAME: encoding: [0x36,0x01]
+move.w %d1, %d3
+
+; CHECK:      move.w %d1, %d4
+; CHECK-SAME: encoding: [0x38,0x01]
+move.w %d1, %d4
+
+; CHECK:      move.w %d1, %d5
+; CHECK-SAME: encoding: [0x3a,0x01]
+move.w %d1, %d5
+
+; CHECK:      move.w %d1, %d6
+; CHECK-SAME: encoding: [0x3c,0x01]
+move.w %d1, %d6
+
+; CHECK:      move.w %d1, %d7
+; CHECK-SAME: encoding: [0x3e,0x01]
+move.w %d1, %d7
+
+; CHECK:      move.w %d2, %d0
+; CHECK-SAME: encoding: [0x30,0x02]
+move.w %d2, %d0
+
+; CHECK:      move.w %d2, %d1
+; CHECK-SAME: encoding: [0x32,0x02]
+move.w %d2, %d1
+
+; CHECK:      move.w %d2, %d2
+; CHECK-SAME: encoding: [0x34,0x02]
+move.w %d2, %d2
+
+; CHECK:      move.w %d2, %d3
+; CHECK-SAME: encoding: [0x36,0x02]
+move.w %d2, %d3
+
+; CHECK:      move.w %d2, %d4
+; CHECK-SAME: encoding: [0x38,0x02]
+move.w %d2, %d4
+
+; CHECK:      move.w %d2, %d5
+; CHECK-SAME: encoding: [0x3a,0x02]
+move.w %d2, %d5
+
+; CHECK:      move.w %d2, %d6
+; CHECK-SAME: encoding: [0x3c,0x02]
+move.w %d2, %d6
+
+; CHECK:      move.w %d2, %d7
+; CHECK-SAME: encoding: [0x3e,0x02]
+move.w %d2, %d7
+
+; CHECK:      move.w %d3, %d0
+; CHECK-SAME: encoding: [0x30,0x03]
+move.w %d3, %d0
+
+; CHECK:      move.w %d3, %d1
+; CHECK-SAME: encoding: [0x32,0x03]
+move.w %d3, %d1
+
+; CHECK:      move.w %d3, %d2
+; CHECK-SAME: encoding: [0x34,0x03]
+move.w %d3, %d2
+
+; CHECK:      move.w %d3, %d3
+; CHECK-SAME: encoding: [0x36,0x03]
+move.w %d3, %d3
+
+; CHECK:      move.w %d3, %d4
+; CHECK-SAME: encoding: [0x38,0x03]
+move.w %d3, %d4
+
+; CHECK:      move.w %d3, %d5
+; CHECK-SAME: encoding: [0x3a,0x03]
+move.w %d3, %d5
+
+; CHECK:      move.w %d3, %d6
+; CHECK-SAME: encoding: [0x3c,0x03]
+move.w %d3, %d6
+
+; CHECK:      move.w %d3, %d7
+; CHECK-SAME: encoding: [0x3e,0x03]
+move.w %d3, %d7
+
+; CHECK:      move.w %d4, %d0
+; CHECK-SAME: encoding: [0x30,0x04]
+move.w %d4, %d0
+
+; CHECK:      move.w %d4, %d1
+; CHECK-SAME: encoding: [0x32,0x04]
+move.w %d4, %d1
+
+; CHECK:      move.w %d4, %d2
+; CHECK-SAME: encoding: [0x34,0x04]
+move.w %d4, %d2
+
+; CHECK:      move.w %d4, %d3
+; CHECK-SAME: encoding: [0x36,0x04]
+move.w %d4, %d3
+
+; CHECK:      move.w %d4, %d4
+; CHECK-SAME: encoding: [0x38,0x04]
+move.w %d4, %d4
+
+; CHECK:      move.w %d4, %d5
+; CHECK-SAME: encoding: [0x3a,0x04]
+move.w %d4, %d5
+
+; CHECK:      move.w %d4, %d6
+; CHECK-SAME: encoding: [0x3c,0x04]
+move.w %d4, %d6
+
+; CHECK:      move.w %d4, %d7
+; CHECK-SAME: encoding: [0x3e,0x04]
+move.w %d4, %d7
+
+; CHECK:      move.w %d5, %d0
+; CHECK-SAME: encoding: [0x30,0x05]
+move.w %d5, %d0
+
+; CHECK:      move.w %d5, %d1
+; CHECK-SAME: encoding: [0x32,0x05]
+move.w %d5, %d1
+
+; CHECK:      move.w %d5, %d2
+; CHECK-SAME: encoding: [0x34,0x05]
+move.w %d5, %d2
+
+; CHECK:      move.w %d5, %d3
+; CHECK-SAME: encoding: [0x36,0x05]
+move.w %d5, %d3
+
+; CHECK:      move.w %d5, %d4
+; CHECK-SAME: encoding: [0x38,0x05]
+move.w %d5, %d4
+
+; CHECK:      move.w %d5, %d5
+; CHECK-SAME: encoding: [0x3a,0x05]
+move.w %d5, %d5
+
+; CHECK:      move.w %d5, %d6
+; CHECK-SAME: encoding: [0x3c,0x05]
+move.w %d5, %d6
+
+; CHECK:      move.w %d5, %d7
+; CHECK-SAME: encoding: [0x3e,0x05]
+move.w %d5, %d7
+
+; CHECK:      move.w %d6, %d0
+; CHECK-SAME: encoding: [0x30,0x06]
+move.w %d6, %d0
+
+; CHECK:      move.w %d6, %d1
+; CHECK-SAME: encoding: [0x32,0x06]
+move.w %d6, %d1
+
+; CHECK:      move.w %d6, %d2
+; CHECK-SAME: encoding: [0x34,0x06]
+move.w %d6, %d2
+
+; CHECK:      move.w %d6, %d3
+; CHECK-SAME: encoding: [0x36,0x06]
+move.w %d6, %d3
+
+; CHECK:      move.w %d6, %d4
+; CHECK-SAME: encoding: [0x38,0x06]
+move.w %d6, %d4
+
+; CHECK:      move.w %d6, %d5
+; CHECK-SAME: encoding: [0x3a,0x06]
+move.w %d6, %d5
+
+; CHECK:      move.w %d6, %d6
+; CHECK-SAME: encoding: [0x3c,0x06]
+move.w %d6, %d6
+
+; CHECK:      move.w %d6, %d7
+; CHECK-SAME: encoding: [0x3e,0x06]
+move.w %d6, %d7
+
+; CHECK:      move.w %d7, %d0
+; CHECK-SAME: encoding: [0x30,0x07]
+move.w %d7, %d0
+
+; CHECK:      move.w %d7, %d1
+; CHECK-SAME: encoding: [0x32,0x07]
+move.w %d7, %d1
+
+; CHECK:      move.w %d7, %d2
+; CHECK-SAME: encoding: [0x34,0x07]
+move.w %d7, %d2
+
+; CHECK:      move.w %d7, %d3
+; CHECK-SAME: encoding: [0x36,0x07]
+move.w %d7, %d3
+
+; CHECK:      move.w %d7, %d4
+; CHECK-SAME: encoding: [0x38,0x07]
+move.w %d7, %d4
+
+; CHECK:      move.w %d7, %d5
+; CHECK-SAME: encoding: [0x3a,0x07]
+move.w %d7, %d5
+
+; CHECK:      move.w %d7, %d6
+; CHECK-SAME: encoding: [0x3c,0x07]
+move.w %d7, %d6
+
+; CHECK:      move.w %d7, %d7
+; CHECK-SAME: encoding: [0x3e,0x07]
+move.w %d7, %d7
+
+; CHECK:      move.w %a0, %d0
+; CHECK-SAME: encoding: [0x30,0x08]
+move.w %a0, %d0
+
+; CHECK:      move.w %a0, %d1
+; CHECK-SAME: encoding: [0x32,0x08]
+move.w %a0, %d1
+
+; CHECK:      move.w %a0, %d2
+; CHECK-SAME: encoding: [0x34,0x08]
+move.w %a0, %d2
+
+; CHECK:      move.w %a0, %d3
+; CHECK-SAME: encoding: [0x36,0x08]
+move.w %a0, %d3
+
+; CHECK:      move.w %a0, %d4
+; CHECK-SAME: encoding: [0x38,0x08]
+move.w %a0, %d4
+
+; CHECK:      move.w %a0, %d5
+; CHECK-SAME: encoding: [0x3a,0x08]
+move.w %a0, %d5
+
+; CHECK:      move.w %a0, %d6
+; CHECK-SAME: encoding: [0x3c,0x08]
+move.w %a0, %d6
+
+; CHECK:      move.w %a0, %d7
+; CHECK-SAME: encoding: [0x3e,0x08]
+move.w %a0, %d7
+
+; CHECK:      move.w %a1, %d0
+; CHECK-SAME: encoding: [0x30,0x09]
+move.w %a1, %d0
+
+; CHECK:      move.w %a1, %d1
+; CHECK-SAME: encoding: [0x32,0x09]
+move.w %a1, %d1
+
+; CHECK:      move.w %a1, %d2
+; CHECK-SAME: encoding: [0x34,0x09]
+move.w %a1, %d2
+
+; CHECK:      move.w %a1, %d3
+; CHECK-SAME: encoding: [0x36,0x09]
+move.w %a1, %d3
+
+; CHECK:      move.w %a1, %d4
+; CHECK-SAME: encoding: [0x38,0x09]
+move.w %a1, %d4
+
+; CHECK:      move.w %a1, %d5
+; CHECK-SAME: encoding: [0x3a,0x09]
+move.w %a1, %d5
+
+; CHECK:      move.w %a1, %d6
+; CHECK-SAME: encoding: [0x3c,0x09]
+move.w %a1, %d6
+
+; CHECK:      move.w %a1, %d7
+; CHECK-SAME: encoding: [0x3e,0x09]
+move.w %a1, %d7
+
+; CHECK:      move.w %a2, %d0
+; CHECK-SAME: encoding: [0x30,0x0a]
+move.w %a2, %d0
+
+; CHECK:      move.w %a2, %d1
+; CHECK-SAME: encoding: [0x32,0x0a]
+move.w %a2, %d1
+
+; CHECK:      move.w %a2, %d2
+; CHECK-SAME: encoding: [0x34,0x0a]
+move.w %a2, %d2
+
+; CHECK:      move.w %a2, %d3
+; CHECK-SAME: encoding: [0x36,0x0a]
+move.w %a2, %d3
+
+; CHECK:      move.w %a2, %d4
+; CHECK-SAME: encoding: [0x38,0x0a]
+move.w %a2, %d4
+
+; CHECK:      move.w %a2, %d5
+; CHECK-SAME: encoding: [0x3a,0x0a]
+move.w %a2, %d5
+
+; CHECK:      move.w %a2, %d6
+; CHECK-SAME: encoding: [0x3c,0x0a]
+move.w %a2, %d6
+
+; CHECK:      move.w %a2, %d7
+; CHECK-SAME: encoding: [0x3e,0x0a]
+move.w %a2, %d7
+
+; CHECK:      move.w %a3, %d0
+; CHECK-SAME: encoding: [0x30,0x0b]
+move.w %a3, %d0
+
+; CHECK:      move.w %a3, %d1
+; CHECK-SAME: encoding: [0x32,0x0b]
+move.w %a3, %d1
+
+; CHECK:      move.w %a3, %d2
+; CHECK-SAME: encoding: [0x34,0x0b]
+move.w %a3, %d2
+
+; CHECK:      move.w %a3, %d3
+; CHECK-SAME: encoding: [0x36,0x0b]
+move.w %a3, %d3
+
+; CHECK:      move.w %a3, %d4
+; CHECK-SAME: encoding: [0x38,0x0b]
+move.w %a3, %d4
+
+; CHECK:      move.w %a3, %d5
+; CHECK-SAME: encoding: [0x3a,0x0b]
+move.w %a3, %d5
+
+; CHECK:      move.w %a3, %d6
+; CHECK-SAME: encoding: [0x3c,0x0b]
+move.w %a3, %d6
+
+; CHECK:      move.w %a3, %d7
+; CHECK-SAME: encoding: [0x3e,0x0b]
+move.w %a3, %d7
+
+; CHECK:      move.w %a4, %d0
+; CHECK-SAME: encoding: [0x30,0x0c]
+move.w %a4, %d0
+
+; CHECK:      move.w %a4, %d1
+; CHECK-SAME: encoding: [0x32,0x0c]
+move.w %a4, %d1
+
+; CHECK:      move.w %a4, %d2
+; CHECK-SAME: encoding: [0x34,0x0c]
+move.w %a4, %d2
+
+; CHECK:      move.w %a4, %d3
+; CHECK-SAME: encoding: [0x36,0x0c]
+move.w %a4, %d3
+
+; CHECK:      move.w %a4, %d4
+; CHECK-SAME: encoding: [0x38,0x0c]
+move.w %a4, %d4
+
+; CHECK:      move.w %a4, %d5
+; CHECK-SAME: encoding: [0x3a,0x0c]
+move.w %a4, %d5
+
+; CHECK:      move.w %a4, %d6
+; CHECK-SAME: encoding: [0x3c,0x0c]
+move.w %a4, %d6
+
+; CHECK:      move.w %a4, %d7
+; CHECK-SAME: encoding: [0x3e,0x0c]
+move.w %a4, %d7
+
+; CHECK:      move.w %a5, %d0
+; CHECK-SAME: encoding: [0x30,0x0d]
+move.w %a5, %d0
+
+; CHECK:      move.w %a5, %d1
+; CHECK-SAME: encoding: [0x32,0x0d]
+move.w %a5, %d1
+
+; CHECK:      move.w %a5, %d2
+; CHECK-SAME: encoding: [0x34,0x0d]
+move.w %a5, %d2
+
+; CHECK:      move.w %a5, %d3
+; CHECK-SAME: encoding: [0x36,0x0d]
+move.w %a5, %d3
+
+; CHECK:      move.w %a5, %d4
+; CHECK-SAME: encoding: [0x38,0x0d]
+move.w %a5, %d4
+
+; CHECK:      move.w %a5, %d5
+; CHECK-SAME: encoding: [0x3a,0x0d]
+move.w %a5, %d5
+
+; CHECK:      move.w %a5, %d6
+; CHECK-SAME: encoding: [0x3c,0x0d]
+move.w %a5, %d6
+
+; CHECK:      move.w %a5, %d7
+; CHECK-SAME: encoding: [0x3e,0x0d]
+move.w %a5, %d7
+
+; CHECK:      move.w %a6, %d0
+; CHECK-SAME: encoding: [0x30,0x0e]
+move.w %a6, %d0
+
+; CHECK:      move.w %a6, %d1
+; CHECK-SAME: encoding: [0x32,0x0e]
+move.w %a6, %d1
+
+; CHECK:      move.w %a6, %d2
+; CHECK-SAME: encoding: [0x34,0x0e]
+move.w %a6, %d2
+
+; CHECK:      move.w %a6, %d3
+; CHECK-SAME: encoding: [0x36,0x0e]
+move.w %a6, %d3
+
+; CHECK:      move.w %a6, %d4
+; CHECK-SAME: encoding: [0x38,0x0e]
+move.w %a6, %d4
+
+; CHECK:      move.w %a6, %d5
+; CHECK-SAME: encoding: [0x3a,0x0e]
+move.w %a6, %d5
+
+; CHECK:      move.w %a6, %d6
+; CHECK-SAME: encoding: [0x3c,0x0e]
+move.w %a6, %d6
+
+; CHECK:      move.w %a6, %d7
+; CHECK-SAME: encoding: [0x3e,0x0e]
+move.w %a6, %d7
+
+; CHECK:      move.w %sp, %d0
+; CHECK-SAME: encoding: [0x30,0x0f]
+move.w %sp, %d0
+
+; CHECK:      move.w %sp, %d1
+; CHECK-SAME: encoding: [0x32,0x0f]
+move.w %sp, %d1
+
+; CHECK:      move.w %sp, %d2
+; CHECK-SAME: encoding: [0x34,0x0f]
+move.w %sp, %d2
+
+; CHECK:      move.w %sp, %d3
+; CHECK-SAME: encoding: [0x36,0x0f]
+move.w %sp, %d3
+
+; CHECK:      move.w %sp, %d4
+; CHECK-SAME: encoding: [0x38,0x0f]
+move.w %sp, %d4
+
+; CHECK:      move.w %sp, %d5
+; CHECK-SAME: encoding: [0x3a,0x0f]
+move.w %sp, %d5
+
+; CHECK:      move.w %sp, %d6
+; CHECK-SAME: encoding: [0x3c,0x0f]
+move.w %sp, %d6
+
+; CHECK:      move.w %sp, %d7
+; CHECK-SAME: encoding: [0x3e,0x0f]
+move.w %sp, %d7
+
+; CHECK:      move.l %d0, %d0
+; CHECK-SAME: encoding: [0x20,0x00]
+move.l %d0, %d0
+
+; CHECK:      move.l %d0, %d1
+; CHECK-SAME: encoding: [0x22,0x00]
+move.l %d0, %d1
+
+; CHECK:      move.l %d0, %d2
+; CHECK-SAME: encoding: [0x24,0x00]
+move.l %d0, %d2
+
+; CHECK:      move.l %d0, %d3
+; CHECK-SAME: encoding: [0x26,0x00]
+move.l %d0, %d3
+
+; CHECK:      move.l %d0, %d4
+; CHECK-SAME: encoding: [0x28,0x00]
+move.l %d0, %d4
+
+; CHECK:      move.l %d0, %d5
+; CHECK-SAME: encoding: [0x2a,0x00]
+move.l %d0, %d5
+
+; CHECK:      move.l %d0, %d6
+; CHECK-SAME: encoding: [0x2c,0x00]
+move.l %d0, %d6
+
+; CHECK:      move.l %d0, %d7
+; CHECK-SAME: encoding: [0x2e,0x00]
+move.l %d0, %d7
+
+; CHECK:      move.l %d1, %d0
+; CHECK-SAME: encoding: [0x20,0x01]
+move.l %d1, %d0
+
+; CHECK:      move.l %d1, %d1
+; CHECK-SAME: encoding: [0x22,0x01]
+move.l %d1, %d1
+
+; CHECK:      move.l %d1, %d2
+; CHECK-SAME: encoding: [0x24,0x01]
+move.l %d1, %d2
+
+; CHECK:      move.l %d1, %d3
+; CHECK-SAME: encoding: [0x26,0x01]
+move.l %d1, %d3
+
+; CHECK:      move.l %d1, %d4
+; CHECK-SAME: encoding: [0x28,0x01]
+move.l %d1, %d4
+
+; CHECK:      move.l %d1, %d5
+; CHECK-SAME: encoding: [0x2a,0x01]
+move.l %d1, %d5
+
+; CHECK:      move.l %d1, %d6
+; CHECK-SAME: encoding: [0x2c,0x01]
+move.l %d1, %d6
+
+; CHECK:      move.l %d1, %d7
+; CHECK-SAME: encoding: [0x2e,0x01]
+move.l %d1, %d7
+
+; CHECK:      move.l %d2, %d0
+; CHECK-SAME: encoding: [0x20,0x02]
+move.l %d2, %d0
+
+; CHECK:      move.l %d2, %d1
+; CHECK-SAME: encoding: [0x22,0x02]
+move.l %d2, %d1
+
+; CHECK:      move.l %d2, %d2
+; CHECK-SAME: encoding: [0x24,0x02]
+move.l %d2, %d2
+
+; CHECK:      move.l %d2, %d3
+; CHECK-SAME: encoding: [0x26,0x02]
+move.l %d2, %d3
+
+; CHECK:      move.l %d2, %d4
+; CHECK-SAME: encoding: [0x28,0x02]
+move.l %d2, %d4
+
+; CHECK:      move.l %d2, %d5
+; CHECK-SAME: encoding: [0x2a,0x02]
+move.l %d2, %d5
+
+; CHECK:      move.l %d2, %d6
+; CHECK-SAME: encoding: [0x2c,0x02]
+move.l %d2, %d6
+
+; CHECK:      move.l %d2, %d7
+; CHECK-SAME: encoding: [0x2e,0x02]
+move.l %d2, %d7
+
+; CHECK:      move.l %d3, %d0
+; CHECK-SAME: encoding: [0x20,0x03]
+move.l %d3, %d0
+
+; CHECK:      move.l %d3, %d1
+; CHECK-SAME: encoding: [0x22,0x03]
+move.l %d3, %d1
+
+; CHECK:      move.l %d3, %d2
+; CHECK-SAME: encoding: [0x24,0x03]
+move.l %d3, %d2
+
+; CHECK:      move.l %d3, %d3
+; CHECK-SAME: encoding: [0x26,0x03]
+move.l %d3, %d3
+
+; CHECK:      move.l %d3, %d4
+; CHECK-SAME: encoding: [0x28,0x03]
+move.l %d3, %d4
+
+; CHECK:      move.l %d3, %d5
+; CHECK-SAME: encoding: [0x2a,0x03]
+move.l %d3, %d5
+
+; CHECK:      move.l %d3, %d6
+; CHECK-SAME: encoding: [0x2c,0x03]
+move.l %d3, %d6
+
+; CHECK:      move.l %d3, %d7
+; CHECK-SAME: encoding: [0x2e,0x03]
+move.l %d3, %d7
+
+; CHECK:      move.l %d4, %d0
+; CHECK-SAME: encoding: [0x20,0x04]
+move.l %d4, %d0
+
+; CHECK:      move.l %d4, %d1
+; CHECK-SAME: encoding: [0x22,0x04]
+move.l %d4, %d1
+
+; CHECK:      move.l %d4, %d2
+; CHECK-SAME: encoding: [0x24,0x04]
+move.l %d4, %d2
+
+; CHECK:      move.l %d4, %d3
+; CHECK-SAME: encoding: [0x26,0x04]
+move.l %d4, %d3
+
+; CHECK:      move.l %d4, %d4
+; CHECK-SAME: encoding: [0x28,0x04]
+move.l %d4, %d4
+
+; CHECK:      move.l %d4, %d5
+; CHECK-SAME: encoding: [0x2a,0x04]
+move.l %d4, %d5
+
+; CHECK:      move.l %d4, %d6
+; CHECK-SAME: encoding: [0x2c,0x04]
+move.l %d4, %d6
+
+; CHECK:      move.l %d4, %d7
+; CHECK-SAME: encoding: [0x2e,0x04]
+move.l %d4, %d7
+
+; CHECK:      move.l %d5, %d0
+; CHECK-SAME: encoding: [0x20,0x05]
+move.l %d5, %d0
+
+; CHECK:      move.l %d5, %d1
+; CHECK-SAME: encoding: [0x22,0x05]
+move.l %d5, %d1
+
+; CHECK:      move.l %d5, %d2
+; CHECK-SAME: encoding: [0x24,0x05]
+move.l %d5, %d2
+
+; CHECK:      move.l %d5, %d3
+; CHECK-SAME: encoding: [0x26,0x05]
+move.l %d5, %d3
+
+; CHECK:      move.l %d5, %d4
+; CHECK-SAME: encoding: [0x28,0x05]
+move.l %d5, %d4
+
+; CHECK:      move.l %d5, %d5
+; CHECK-SAME: encoding: [0x2a,0x05]
+move.l %d5, %d5
+
+; CHECK:      move.l %d5, %d6
+; CHECK-SAME: encoding: [0x2c,0x05]
+move.l %d5, %d6
+
+; CHECK:      move.l %d5, %d7
+; CHECK-SAME: encoding: [0x2e,0x05]
+move.l %d5, %d7
+
+; CHECK:      move.l %d6, %d0
+; CHECK-SAME: encoding: [0x20,0x06]
+move.l %d6, %d0
+
+; CHECK:      move.l %d6, %d1
+; CHECK-SAME: encoding: [0x22,0x06]
+move.l %d6, %d1
+
+; CHECK:      move.l %d6, %d2
+; CHECK-SAME: encoding: [0x24,0x06]
+move.l %d6, %d2
+
+; CHECK:      move.l %d6, %d3
+; CHECK-SAME: encoding: [0x26,0x06]
+move.l %d6, %d3
+
+; CHECK:      move.l %d6, %d4
+; CHECK-SAME: encoding: [0x28,0x06]
+move.l %d6, %d4
+
+; CHECK:      move.l %d6, %d5
+; CHECK-SAME: encoding: [0x2a,0x06]
+move.l %d6, %d5
+
+; CHECK:      move.l %d6, %d6
+; CHECK-SAME: encoding: [0x2c,0x06]
+move.l %d6, %d6
+
+; CHECK:      move.l %d6, %d7
+; CHECK-SAME: encoding: [0x2e,0x06]
+move.l %d6, %d7
+
+; CHECK:      move.l %d7, %d0
+; CHECK-SAME: encoding: [0x20,0x07]
+move.l %d7, %d0
+
+; CHECK:      move.l %d7, %d1
+; CHECK-SAME: encoding: [0x22,0x07]
+move.l %d7, %d1
+
+; CHECK:      move.l %d7, %d2
+; CHECK-SAME: encoding: [0x24,0x07]
+move.l %d7, %d2
+
+; CHECK:      move.l %d7, %d3
+; CHECK-SAME: encoding: [0x26,0x07]
+move.l %d7, %d3
+
+; CHECK:      move.l %d7, %d4
+; CHECK-SAME: encoding: [0x28,0x07]
+move.l %d7, %d4
+
+; CHECK:      move.l %d7, %d5
+; CHECK-SAME: encoding: [0x2a,0x07]
+move.l %d7, %d5
+
+; CHECK:      move.l %d7, %d6
+; CHECK-SAME: encoding: [0x2c,0x07]
+move.l %d7, %d6
+
+; CHECK:      move.l %d7, %d7
+; CHECK-SAME: encoding: [0x2e,0x07]
+move.l %d7, %d7
+
+; CHECK:      move.l %a0, %d0
+; CHECK-SAME: encoding: [0x20,0x08]
+move.l %a0, %d0
+
+; CHECK:      move.l %a0, %d1
+; CHECK-SAME: encoding: [0x22,0x08]
+move.l %a0, %d1
+
+; CHECK:      move.l %a0, %d2
+; CHECK-SAME: encoding: [0x24,0x08]
+move.l %a0, %d2
+
+; CHECK:      move.l %a0, %d3
+; CHECK-SAME: encoding: [0x26,0x08]
+move.l %a0, %d3
+
+; CHECK:      move.l %a0, %d4
+; CHECK-SAME: encoding: [0x28,0x08]
+move.l %a0, %d4
+
+; CHECK:      move.l %a0, %d5
+; CHECK-SAME: encoding: [0x2a,0x08]
+move.l %a0, %d5
+
+; CHECK:      move.l %a0, %d6
+; CHECK-SAME: encoding: [0x2c,0x08]
+move.l %a0, %d6
+
+; CHECK:      move.l %a0, %d7
+; CHECK-SAME: encoding: [0x2e,0x08]
+move.l %a0, %d7
+
+; CHECK:      move.l %a1, %d0
+; CHECK-SAME: encoding: [0x20,0x09]
+move.l %a1, %d0
+
+; CHECK:      move.l %a1, %d1
+; CHECK-SAME: encoding: [0x22,0x09]
+move.l %a1, %d1
+
+; CHECK:      move.l %a1, %d2
+; CHECK-SAME: encoding: [0x24,0x09]
+move.l %a1, %d2
+
+; CHECK:      move.l %a1, %d3
+; CHECK-SAME: encoding: [0x26,0x09]
+move.l %a1, %d3
+
+; CHECK:      move.l %a1, %d4
+; CHECK-SAME: encoding: [0x28,0x09]
+move.l %a1, %d4
+
+; CHECK:      move.l %a1, %d5
+; CHECK-SAME: encoding: [0x2a,0x09]
+move.l %a1, %d5
+
+; CHECK:      move.l %a1, %d6
+; CHECK-SAME: encoding: [0x2c,0x09]
+move.l %a1, %d6
+
+; CHECK:      move.l %a1, %d7
+; CHECK-SAME: encoding: [0x2e,0x09]
+move.l %a1, %d7
+
+; CHECK:      move.l %a2, %d0
+; CHECK-SAME: encoding: [0x20,0x0a]
+move.l %a2, %d0
+
+; CHECK:      move.l %a2, %d1
+; CHECK-SAME: encoding: [0x22,0x0a]
+move.l %a2, %d1
+
+; CHECK:      move.l %a2, %d2
+; CHECK-SAME: encoding: [0x24,0x0a]
+move.l %a2, %d2
+
+; CHECK:      move.l %a2, %d3
+; CHECK-SAME: encoding: [0x26,0x0a]
+move.l %a2, %d3
+
+; CHECK:      move.l %a2, %d4
+; CHECK-SAME: encoding: [0x28,0x0a]
+move.l %a2, %d4
+
+; CHECK:      move.l %a2, %d5
+; CHECK-SAME: encoding: [0x2a,0x0a]
+move.l %a2, %d5
+
+; CHECK:      move.l %a2, %d6
+; CHECK-SAME: encoding: [0x2c,0x0a]
+move.l %a2, %d6
+
+; CHECK:      move.l %a2, %d7
+; CHECK-SAME: encoding: [0x2e,0x0a]
+move.l %a2, %d7
+
+; CHECK:      move.l %a3, %d0
+; CHECK-SAME: encoding: [0x20,0x0b]
+move.l %a3, %d0
+
+; CHECK:      move.l %a3, %d1
+; CHECK-SAME: encoding: [0x22,0x0b]
+move.l %a3, %d1
+
+; CHECK:      move.l %a3, %d2
+; CHECK-SAME: encoding: [0x24,0x0b]
+move.l %a3, %d2
+
+; CHECK:      move.l %a3, %d3
+; CHECK-SAME: encoding: [0x26,0x0b]
+move.l %a3, %d3
+
+; CHECK:      move.l %a3, %d4
+; CHECK-SAME: encoding: [0x28,0x0b]
+move.l %a3, %d4
+
+; CHECK:      move.l %a3, %d5
+; CHECK-SAME: encoding: [0x2a,0x0b]
+move.l %a3, %d5
+
+; CHECK:      move.l %a3, %d6
+; CHECK-SAME: encoding: [0x2c,0x0b]
+move.l %a3, %d6
+
+; CHECK:      move.l %a3, %d7
+; CHECK-SAME: encoding: [0x2e,0x0b]
+move.l %a3, %d7
+
+; CHECK:      move.l %a4, %d0
+; CHECK-SAME: encoding: [0x20,0x0c]
+move.l %a4, %d0
+
+; CHECK:      move.l %a4, %d1
+; CHECK-SAME: encoding: [0x22,0x0c]
+move.l %a4, %d1
+
+; CHECK:      move.l %a4, %d2
+; CHECK-SAME: encoding: [0x24,0x0c]
+move.l %a4, %d2
+
+; CHECK:      move.l %a4, %d3
+; CHECK-SAME: encoding: [0x26,0x0c]
+move.l %a4, %d3
+
+; CHECK:      move.l %a4, %d4
+; CHECK-SAME: encoding: [0x28,0x0c]
+move.l %a4, %d4
+
+; CHECK:      move.l %a4, %d5
+; CHECK-SAME: encoding: [0x2a,0x0c]
+move.l %a4, %d5
+
+; CHECK:      move.l %a4, %d6
+; CHECK-SAME: encoding: [0x2c,0x0c]
+move.l %a4, %d6
+
+; CHECK:      move.l %a4, %d7
+; CHECK-SAME: encoding: [0x2e,0x0c]
+move.l %a4, %d7
+
+; CHECK:      move.l %a5, %d0
+; CHECK-SAME: encoding: [0x20,0x0d]
+move.l %a5, %d0
+
+; CHECK:      move.l %a5, %d1
+; CHECK-SAME: encoding: [0x22,0x0d]
+move.l %a5, %d1
+
+; CHECK:      move.l %a5, %d2
+; CHECK-SAME: encoding: [0x24,0x0d]
+move.l %a5, %d2
+
+; CHECK:      move.l %a5, %d3
+; CHECK-SAME: encoding: [0x26,0x0d]
+move.l %a5, %d3
+
+; CHECK:      move.l %a5, %d4
+; CHECK-SAME: encoding: [0x28,0x0d]
+move.l %a5, %d4
+
+; CHECK:      move.l %a5, %d5
+; CHECK-SAME: encoding: [0x2a,0x0d]
+move.l %a5, %d5
+
+; CHECK:      move.l %a5, %d6
+; CHECK-SAME: encoding: [0x2c,0x0d]
+move.l %a5, %d6
+
+; CHECK:      move.l %a5, %d7
+; CHECK-SAME: encoding: [0x2e,0x0d]
+move.l %a5, %d7
+
+; CHECK:      move.l %a6, %d0
+; CHECK-SAME: encoding: [0x20,0x0e]
+move.l %a6, %d0
+
+; CHECK:      move.l %a6, %d1
+; CHECK-SAME: encoding: [0x22,0x0e]
+move.l %a6, %d1
+
+; CHECK:      move.l %a6, %d2
+; CHECK-SAME: encoding: [0x24,0x0e]
+move.l %a6, %d2
+
+; CHECK:      move.l %a6, %d3
+; CHECK-SAME: encoding: [0x26,0x0e]
+move.l %a6, %d3
+
+; CHECK:      move.l %a6, %d4
+; CHECK-SAME: encoding: [0x28,0x0e]
+move.l %a6, %d4
+
+; CHECK:      move.l %a6, %d5
+; CHECK-SAME: encoding: [0x2a,0x0e]
+move.l %a6, %d5
+
+; CHECK:      move.l %a6, %d6
+; CHECK-SAME: encoding: [0x2c,0x0e]
+move.l %a6, %d6
+
+; CHECK:      move.l %a6, %d7
+; CHECK-SAME: encoding: [0x2e,0x0e]
+move.l %a6, %d7
+
+; CHECK:      move.l %sp, %d0
+; CHECK-SAME: encoding: [0x20,0x0f]
+move.l %sp, %d0
+
+; CHECK:      move.l %sp, %d1
+; CHECK-SAME: encoding: [0x22,0x0f]
+move.l %sp, %d1
+
+; CHECK:      move.l %sp, %d2
+; CHECK-SAME: encoding: [0x24,0x0f]
+move.l %sp, %d2
+
+; CHECK:      move.l %sp, %d3
+; CHECK-SAME: encoding: [0x26,0x0f]
+move.l %sp, %d3
+
+; CHECK:      move.l %sp, %d4
+; CHECK-SAME: encoding: [0x28,0x0f]
+move.l %sp, %d4
+
+; CHECK:      move.l %sp, %d5
+; CHECK-SAME: encoding: [0x2a,0x0f]
+move.l %sp, %d5
+
+; CHECK:      move.l %sp, %d6
+; CHECK-SAME: encoding: [0x2c,0x0f]
+move.l %sp, %d6
+
+; CHECK:      move.l %sp, %d7
+; CHECK-SAME: encoding: [0x2e,0x0f]
+move.l %sp, %d7
diff --git a/llvm/test/MC/M68k/generate_tests.py b/llvm/test/MC/M68k/generate_tests.py
new file mode 100755
index 0000000000000..5fe7c4cb1e9c0
--- /dev/null
+++ b/llvm/test/MC/M68k/generate_tests.py
@@ -0,0 +1,233 @@
+#!/usr/bin/env python3
+
+from abc import ABC, abstractmethod
+from dataclasses import dataclass
+from typing import Generator
+
+
+# Utility functions:
+
+
+# https://stackoverflow.com/a/952952
+def flatten(xss):
+    """Flattens a list of lists into a single list"""
+    return [x for xs in xss for x in xs]
+
+
+def word_to_bytes(word: int) -> bytes:
+    """Converts a 16-bit word value to a pair of bytes"""
+    return word.to_bytes(2, byteorder="big")
+
+
+def words_to_bytes(words: list[int]) -> bytes:
+    """Converts a list of words to a list of bytes"""
+    return flatten(map(word_to_bytes, words))
+
+
+# Size field
+# https://m680x0.github.io/ref/M68000PM_AD_Rev_1_Programmers_Reference_Manual_1992.html#pf230
+
+
+class Size(ABC):
+    @abstractmethod
+    def asm() -> str:
+        pass
+
+    @abstractmethod
+    def sizeField() -> int:
+        pass
+
+
+ at dataclass
+class Byte(Size):
+    def asm() -> str:
+        return "b"
+
+    def sizeField() -> int:
+        return 0b01
+
+
+ at dataclass
+class Word(Size):
+    def asm() -> str:
+        return "w"
+
+    def sizeField() -> int:
+        return 0b11
+
+
+ at dataclass
+class Long(Size):
+    def asm() -> str:
+        return "l"
+
+    def sizeField() -> int:
+        return 0b10
+
+
+# Effective addressing modes
+# https://m680x0.github.io/ref/M68000PM_AD_Rev_1_Programmers_Reference_Manual_1992.html#pf3c
+
+
+class EffectiveAddressingMode(ABC):
+    @abstractmethod
+    def permutations() -> Generator["EffectiveAddressingMode", None, None]:
+        """Returns all the permutations of this addressing mode"""
+        pass
+
+    @abstractmethod
+    def asm(self) -> str:
+        pass
+
+    @abstractmethod
+    def modeField(self) -> int:
+        pass
+
+    @abstractmethod
+    def registerField(self) -> int:
+        pass
+
+
+# https://m680x0.github.io/ref/M68000PM_AD_Rev_1_Programmers_Reference_Manual_1992.html#pf2e
+# Dn
+ at dataclass
+class DataRegisterDirect(EffectiveAddressingMode):
+    registerNumber: int
+
+    def permutations() -> Generator["DataRegisterDirect", None, None]:
+        for registerNumber in range(8):
+            yield DataRegisterDirect(registerNumber)
+
+    def asm(self) -> str:
+        return f"%d{self.registerNumber}"
+
+    def modeField(self) -> int:
+        return 0b000
+
+    def registerField(self) -> int:
+        return self.registerNumber
+
+
+# https://m680x0.github.io/ref/M68000PM_AD_Rev_1_Programmers_Reference_Manual_1992.html#pf2e
+# An
+ at dataclass
+class AddressRegisterDirect(EffectiveAddressingMode):
+    registerNumber: int
+
+    def permutations() -> Generator["AddressRegisterDirect", None, None]:
+        for registerNumber in range(8):
+            yield AddressRegisterDirect(registerNumber)
+
+    def asm(self) -> str:
+        if self.registerNumber == 7:
+            return "%sp"
+        else:
+            return f"%a{self.registerNumber}"
+
+    def modeField(self) -> int:
+        return 0b001
+
+    def registerField(self) -> int:
+        return self.registerNumber
+
+
+# Instructions
+
+
+class Instruction(ABC):
+    @abstractmethod
+    def permutations() -> Generator["Instruction", None, None]:
+        pass
+
+    @abstractmethod
+    def asm(self) -> str:
+        pass
+
+    @abstractmethod
+    def words(self) -> list[int]:
+        pass
+
+    def bytes(self) -> bytes:
+        """Encodes the instruction as a byte array"""
+        words = self.words()
+        lists_of_bytes = words_to_bytes(words)
+        return lists_of_bytes
+
+
+# https://m680x0.github.io/ref/integer-instructions.html#pfdc
+ at dataclass
+class MOVE(Instruction):
+    size: Size
+    destination: EffectiveAddressingMode
+    source: EffectiveAddressingMode
+
+    def permutations() -> Generator["MOVE", None, None]:
+        sourceModes = [DataRegisterDirect, AddressRegisterDirect]
+        destinationModes = [DataRegisterDirect]
+
+        for size in [Byte, Word, Long]:
+            for sourceMode in sourceModes:
+                # For byte size operation, address register direct is not allowed
+                if (size is not Byte) or (sourceMode is not AddressRegisterDirect):
+                    for source in sourceMode.permutations():
+                        for destinationMode in destinationModes:
+                            for destination in destinationMode.permutations():
+                                yield MOVE(size, destination, source)
+
+    def asm(self) -> str:
+        return f"move.{self.size.asm()} {self.source.asm()}, {self.destination.asm()}"
+
+    def words(self) -> list[int]:
+        return [
+            (
+                (0b00 << 14)
+                | (self.size.sizeField() << 12)
+                | (self.destination.registerField() << 9)
+                | (self.destination.modeField() << 6)
+                | (self.source.modeField() << 3)
+                | self.source.registerField()
+            )
+        ]
+
+
+# Utility functions
+
+
+def byte_to_hex(byte: int) -> str:
+    """Returns hexadecimal representation of a number with 0x prefix"""
+    return f"{byte:#04x}"
+
+
+# Encoding tests
+
+
+def write_encoding_tests_header(f):
+    header: list[str] = [
+        "; Generated by llvm/test/MC/M68k/generate_tests.py\n",
+        "; Please do not edit this file by hand.\n",
+        "\n",
+        "; RUN: llvm-mc -triple=m68k -mcpu=M68040 -show-encoding < %s | FileCheck %s\n",
+    ]
+
+    for line in header:
+        f.write(line)
+
+
+def write_encoding_test(f, instruction: Instruction):
+    bytes = ",".join(map(byte_to_hex, instruction.bytes()))
+    f.write(f"; CHECK:      {instruction.asm()}\n")
+    f.write(f"; CHECK-SAME: encoding: [{bytes}]\n")
+    f.write(f"{instruction.asm()}\n")
+
+
+def write_encoding_tests(cls):
+    name = cls.__name__
+    with open(f"Generated/{name}.s", "w") as f:
+        write_encoding_tests_header(f)
+        for instruction in cls.permutations():
+            f.write("\n")
+            write_encoding_test(f, instruction)
+
+
+for cls in [MOVE]:
+    write_encoding_tests(cls)

>From 3457787e5ad841049d1934257364232a527dfc75 Mon Sep 17 00:00:00 2001
From: Peter Mackay <git at petmac.dev>
Date: Sun, 26 Apr 2026 17:44:55 +0100
Subject: [PATCH 2/8] Remove duplicate tests

---
 llvm/test/MC/M68k/Data/Classes/MxMove_RR.s | 20 --------------------
 1 file changed, 20 deletions(-)
 delete mode 100644 llvm/test/MC/M68k/Data/Classes/MxMove_RR.s

diff --git a/llvm/test/MC/M68k/Data/Classes/MxMove_RR.s b/llvm/test/MC/M68k/Data/Classes/MxMove_RR.s
deleted file mode 100644
index f16729760d259..0000000000000
--- a/llvm/test/MC/M68k/Data/Classes/MxMove_RR.s
+++ /dev/null
@@ -1,20 +0,0 @@
-; RUN: llvm-mc -triple=m68k -show-encoding %s | FileCheck %s
-
-; CHECK:      move.b  %d0, %d1
-; CHECK-SAME: encoding: [0x12,0x00]
-move.b	%d0, %d1
-; CHECK:      move.w  %a2, %d3
-; CHECK-SAME: encoding: [0x36,0x0a]
-move.w	%a2, %d3
-; CHECK:      move.w  %a2, %a6
-; CHECK-SAME: encoding: [0x3c,0x4a]
-move.w	%a2, %a6
-; CHECK:      move.w  %a2, %d1
-; CHECK-SAME: encoding: [0x32,0x0a]
-move.w	%a2, %d1
-; CHECK:      move.l  %d2, %d1
-; CHECK-SAME: encoding: [0x22,0x02]
-move.l	%d2, %d1
-; CHECK:      move.l  %a2, %a1
-; CHECK-SAME: encoding: [0x22,0x4a]
-move.l	%a2, %a1

>From 01e6cc621d1f9d3b6f17e1b1e4229c7df9a15042 Mon Sep 17 00:00:00 2001
From: Peter Mackay <git at petmac.dev>
Date: Mon, 27 Apr 2026 00:04:26 +0100
Subject: [PATCH 3/8] Move `byte_to_hex` with the other utility functions

---
 llvm/test/MC/M68k/generate_tests.py | 13 +++++--------
 1 file changed, 5 insertions(+), 8 deletions(-)

diff --git a/llvm/test/MC/M68k/generate_tests.py b/llvm/test/MC/M68k/generate_tests.py
index 5fe7c4cb1e9c0..c8471f3edbfdd 100755
--- a/llvm/test/MC/M68k/generate_tests.py
+++ b/llvm/test/MC/M68k/generate_tests.py
@@ -24,6 +24,11 @@ def words_to_bytes(words: list[int]) -> bytes:
     return flatten(map(word_to_bytes, words))
 
 
+def byte_to_hex(byte: int) -> str:
+    """Returns hexadecimal representation of a number with 0x prefix"""
+    return f"{byte:#04x}"
+
+
 # Size field
 # https://m680x0.github.io/ref/M68000PM_AD_Rev_1_Programmers_Reference_Manual_1992.html#pf230
 
@@ -190,14 +195,6 @@ def words(self) -> list[int]:
         ]
 
 
-# Utility functions
-
-
-def byte_to_hex(byte: int) -> str:
-    """Returns hexadecimal representation of a number with 0x prefix"""
-    return f"{byte:#04x}"
-
-
 # Encoding tests
 
 

>From 773cbcf8a83fd1959cb806c24b0f6cad00776971 Mon Sep 17 00:00:00 2001
From: Peter Mackay <git at petmac.dev>
Date: Mon, 27 Apr 2026 00:28:59 +0100
Subject: [PATCH 4/8] Add docstrings

---
 llvm/test/MC/M68k/generate_tests.py | 46 ++++++++++++++++++++---------
 1 file changed, 32 insertions(+), 14 deletions(-)

diff --git a/llvm/test/MC/M68k/generate_tests.py b/llvm/test/MC/M68k/generate_tests.py
index c8471f3edbfdd..c38337d5b331f 100755
--- a/llvm/test/MC/M68k/generate_tests.py
+++ b/llvm/test/MC/M68k/generate_tests.py
@@ -10,17 +10,17 @@
 
 # https://stackoverflow.com/a/952952
 def flatten(xss):
-    """Flattens a list of lists into a single list"""
+    """Flattens a list of lists into a single list."""
     return [x for xs in xss for x in xs]
 
 
 def word_to_bytes(word: int) -> bytes:
-    """Converts a 16-bit word value to a pair of bytes"""
+    """Converts a 16-bit word value to a pair of bytes."""
     return word.to_bytes(2, byteorder="big")
 
 
 def words_to_bytes(words: list[int]) -> bytes:
-    """Converts a list of words to a list of bytes"""
+    """Converts a list of words to a list of bytes."""
     return flatten(map(word_to_bytes, words))
 
 
@@ -34,17 +34,21 @@ def byte_to_hex(byte: int) -> str:
 
 
 class Size(ABC):
+    """Represents the amount of data being operated on."""
+
     @abstractmethod
     def asm() -> str:
-        pass
+        """Returns the size suffix in assembly language."""
 
     @abstractmethod
     def sizeField() -> int:
-        pass
+        """Returns the encoded value of the instruction's "size" field."""
 
 
 @dataclass
 class Byte(Size):
+    """Indicates that an 8-bit value is being operated on."""
+
     def asm() -> str:
         return "b"
 
@@ -54,6 +58,8 @@ def sizeField() -> int:
 
 @dataclass
 class Word(Size):
+    """Indicates that a 16-bit value is being operated on."""
+
     def asm() -> str:
         return "w"
 
@@ -63,6 +69,8 @@ def sizeField() -> int:
 
 @dataclass
 class Long(Size):
+    """Indicates that a 32-bit value is being operated on."""
+
     def asm() -> str:
         return "l"
 
@@ -75,28 +83,31 @@ def sizeField() -> int:
 
 
 class EffectiveAddressingMode(ABC):
+    """Represents a mechanism for addressing source or destination data."""
+
     @abstractmethod
     def permutations() -> Generator["EffectiveAddressingMode", None, None]:
-        """Returns all the permutations of this addressing mode"""
-        pass
+        """Returns all the permutations of this addressing mode."""
 
     @abstractmethod
     def asm(self) -> str:
-        pass
+        """Returns the assembly language for the operand being addressed."""
 
     @abstractmethod
     def modeField(self) -> int:
-        pass
+        """Returns the encoded value of the instruction's "mode" field."""
 
     @abstractmethod
     def registerField(self) -> int:
-        pass
+        """Returns the encoded value of the instruction's "register" field."""
 
 
 # https://m680x0.github.io/ref/M68000PM_AD_Rev_1_Programmers_Reference_Manual_1992.html#pf2e
 # Dn
 @dataclass
 class DataRegisterDirect(EffectiveAddressingMode):
+    """Represents the contents of a particular data register."""
+
     registerNumber: int
 
     def permutations() -> Generator["DataRegisterDirect", None, None]:
@@ -117,6 +128,8 @@ def registerField(self) -> int:
 # An
 @dataclass
 class AddressRegisterDirect(EffectiveAddressingMode):
+    """Represents the contents of a particular address register."""
+
     registerNumber: int
 
     def permutations() -> Generator["AddressRegisterDirect", None, None]:
@@ -140,20 +153,22 @@ def registerField(self) -> int:
 
 
 class Instruction(ABC):
+    """An abstract class to represent a machine instruction."""
+
     @abstractmethod
     def permutations() -> Generator["Instruction", None, None]:
-        pass
+        """Returns all permutations of this instruction and its operands."""
 
     @abstractmethod
     def asm(self) -> str:
-        pass
+        """Returns the assembly language of this instruction."""
 
     @abstractmethod
     def words(self) -> list[int]:
-        pass
+        """Returns the encoded 16-bit words of this instruction."""
 
     def bytes(self) -> bytes:
-        """Encodes the instruction as a byte array"""
+        """Encodes the words of the instruction as a byte array."""
         words = self.words()
         lists_of_bytes = words_to_bytes(words)
         return lists_of_bytes
@@ -199,6 +214,7 @@ def words(self) -> list[int]:
 
 
 def write_encoding_tests_header(f):
+    """Writes the comments at the top of the encoding test file."""
     header: list[str] = [
         "; Generated by llvm/test/MC/M68k/generate_tests.py\n",
         "; Please do not edit this file by hand.\n",
@@ -211,6 +227,7 @@ def write_encoding_tests_header(f):
 
 
 def write_encoding_test(f, instruction: Instruction):
+    """Writes a single instruction's encoding test to a file."""
     bytes = ",".join(map(byte_to_hex, instruction.bytes()))
     f.write(f"; CHECK:      {instruction.asm()}\n")
     f.write(f"; CHECK-SAME: encoding: [{bytes}]\n")
@@ -218,6 +235,7 @@ def write_encoding_test(f, instruction: Instruction):
 
 
 def write_encoding_tests(cls):
+    """Writes tests for all permutations of an instruction to a new file."""
     name = cls.__name__
     with open(f"Generated/{name}.s", "w") as f:
         write_encoding_tests_header(f)

>From bdd182900a19b7671dd49e182e410f3eee2f4385 Mon Sep 17 00:00:00 2001
From: Peter Mackay <git at petmac.dev>
Date: Sun, 3 May 2026 13:36:16 +0100
Subject: [PATCH 5/8] Move generated tests to M68k folder

---
 llvm/test/MC/M68k/{Generated => }/MOVE.s | 0
 llvm/test/MC/M68k/generate_tests.py      | 2 +-
 2 files changed, 1 insertion(+), 1 deletion(-)
 rename llvm/test/MC/M68k/{Generated => }/MOVE.s (100%)

diff --git a/llvm/test/MC/M68k/Generated/MOVE.s b/llvm/test/MC/M68k/MOVE.s
similarity index 100%
rename from llvm/test/MC/M68k/Generated/MOVE.s
rename to llvm/test/MC/M68k/MOVE.s
diff --git a/llvm/test/MC/M68k/generate_tests.py b/llvm/test/MC/M68k/generate_tests.py
index c38337d5b331f..d113adf0d4c96 100755
--- a/llvm/test/MC/M68k/generate_tests.py
+++ b/llvm/test/MC/M68k/generate_tests.py
@@ -237,7 +237,7 @@ def write_encoding_test(f, instruction: Instruction):
 def write_encoding_tests(cls):
     """Writes tests for all permutations of an instruction to a new file."""
     name = cls.__name__
-    with open(f"Generated/{name}.s", "w") as f:
+    with open(f"{name}.s", "w") as f:
         write_encoding_tests_header(f)
         for instruction in cls.permutations():
             f.write("\n")

>From 9b23c49e60149e7fef07faa353b9ba3879fee3e5 Mon Sep 17 00:00:00 2001
From: Peter Mackay <git at petmac.dev>
Date: Sun, 3 May 2026 13:55:48 +0100
Subject: [PATCH 6/8] Generate fewer permutations of registers

---
 llvm/test/MC/M68k/MOVE.s            | 1100 ---------------------------
 llvm/test/MC/M68k/generate_tests.py |   12 +-
 2 files changed, 10 insertions(+), 1102 deletions(-)

diff --git a/llvm/test/MC/M68k/MOVE.s b/llvm/test/MC/M68k/MOVE.s
index 0d936526ace0c..2fa35d531f02e 100644
--- a/llvm/test/MC/M68k/MOVE.s
+++ b/llvm/test/MC/M68k/MOVE.s
@@ -11,26 +11,6 @@ move.b %d0, %d0
 ; CHECK-SAME: encoding: [0x12,0x00]
 move.b %d0, %d1
 
-; CHECK:      move.b %d0, %d2
-; CHECK-SAME: encoding: [0x14,0x00]
-move.b %d0, %d2
-
-; CHECK:      move.b %d0, %d3
-; CHECK-SAME: encoding: [0x16,0x00]
-move.b %d0, %d3
-
-; CHECK:      move.b %d0, %d4
-; CHECK-SAME: encoding: [0x18,0x00]
-move.b %d0, %d4
-
-; CHECK:      move.b %d0, %d5
-; CHECK-SAME: encoding: [0x1a,0x00]
-move.b %d0, %d5
-
-; CHECK:      move.b %d0, %d6
-; CHECK-SAME: encoding: [0x1c,0x00]
-move.b %d0, %d6
-
 ; CHECK:      move.b %d0, %d7
 ; CHECK-SAME: encoding: [0x1e,0x00]
 move.b %d0, %d7
@@ -43,190 +23,10 @@ move.b %d1, %d0
 ; CHECK-SAME: encoding: [0x12,0x01]
 move.b %d1, %d1
 
-; CHECK:      move.b %d1, %d2
-; CHECK-SAME: encoding: [0x14,0x01]
-move.b %d1, %d2
-
-; CHECK:      move.b %d1, %d3
-; CHECK-SAME: encoding: [0x16,0x01]
-move.b %d1, %d3
-
-; CHECK:      move.b %d1, %d4
-; CHECK-SAME: encoding: [0x18,0x01]
-move.b %d1, %d4
-
-; CHECK:      move.b %d1, %d5
-; CHECK-SAME: encoding: [0x1a,0x01]
-move.b %d1, %d5
-
-; CHECK:      move.b %d1, %d6
-; CHECK-SAME: encoding: [0x1c,0x01]
-move.b %d1, %d6
-
 ; CHECK:      move.b %d1, %d7
 ; CHECK-SAME: encoding: [0x1e,0x01]
 move.b %d1, %d7
 
-; CHECK:      move.b %d2, %d0
-; CHECK-SAME: encoding: [0x10,0x02]
-move.b %d2, %d0
-
-; CHECK:      move.b %d2, %d1
-; CHECK-SAME: encoding: [0x12,0x02]
-move.b %d2, %d1
-
-; CHECK:      move.b %d2, %d2
-; CHECK-SAME: encoding: [0x14,0x02]
-move.b %d2, %d2
-
-; CHECK:      move.b %d2, %d3
-; CHECK-SAME: encoding: [0x16,0x02]
-move.b %d2, %d3
-
-; CHECK:      move.b %d2, %d4
-; CHECK-SAME: encoding: [0x18,0x02]
-move.b %d2, %d4
-
-; CHECK:      move.b %d2, %d5
-; CHECK-SAME: encoding: [0x1a,0x02]
-move.b %d2, %d5
-
-; CHECK:      move.b %d2, %d6
-; CHECK-SAME: encoding: [0x1c,0x02]
-move.b %d2, %d6
-
-; CHECK:      move.b %d2, %d7
-; CHECK-SAME: encoding: [0x1e,0x02]
-move.b %d2, %d7
-
-; CHECK:      move.b %d3, %d0
-; CHECK-SAME: encoding: [0x10,0x03]
-move.b %d3, %d0
-
-; CHECK:      move.b %d3, %d1
-; CHECK-SAME: encoding: [0x12,0x03]
-move.b %d3, %d1
-
-; CHECK:      move.b %d3, %d2
-; CHECK-SAME: encoding: [0x14,0x03]
-move.b %d3, %d2
-
-; CHECK:      move.b %d3, %d3
-; CHECK-SAME: encoding: [0x16,0x03]
-move.b %d3, %d3
-
-; CHECK:      move.b %d3, %d4
-; CHECK-SAME: encoding: [0x18,0x03]
-move.b %d3, %d4
-
-; CHECK:      move.b %d3, %d5
-; CHECK-SAME: encoding: [0x1a,0x03]
-move.b %d3, %d5
-
-; CHECK:      move.b %d3, %d6
-; CHECK-SAME: encoding: [0x1c,0x03]
-move.b %d3, %d6
-
-; CHECK:      move.b %d3, %d7
-; CHECK-SAME: encoding: [0x1e,0x03]
-move.b %d3, %d7
-
-; CHECK:      move.b %d4, %d0
-; CHECK-SAME: encoding: [0x10,0x04]
-move.b %d4, %d0
-
-; CHECK:      move.b %d4, %d1
-; CHECK-SAME: encoding: [0x12,0x04]
-move.b %d4, %d1
-
-; CHECK:      move.b %d4, %d2
-; CHECK-SAME: encoding: [0x14,0x04]
-move.b %d4, %d2
-
-; CHECK:      move.b %d4, %d3
-; CHECK-SAME: encoding: [0x16,0x04]
-move.b %d4, %d3
-
-; CHECK:      move.b %d4, %d4
-; CHECK-SAME: encoding: [0x18,0x04]
-move.b %d4, %d4
-
-; CHECK:      move.b %d4, %d5
-; CHECK-SAME: encoding: [0x1a,0x04]
-move.b %d4, %d5
-
-; CHECK:      move.b %d4, %d6
-; CHECK-SAME: encoding: [0x1c,0x04]
-move.b %d4, %d6
-
-; CHECK:      move.b %d4, %d7
-; CHECK-SAME: encoding: [0x1e,0x04]
-move.b %d4, %d7
-
-; CHECK:      move.b %d5, %d0
-; CHECK-SAME: encoding: [0x10,0x05]
-move.b %d5, %d0
-
-; CHECK:      move.b %d5, %d1
-; CHECK-SAME: encoding: [0x12,0x05]
-move.b %d5, %d1
-
-; CHECK:      move.b %d5, %d2
-; CHECK-SAME: encoding: [0x14,0x05]
-move.b %d5, %d2
-
-; CHECK:      move.b %d5, %d3
-; CHECK-SAME: encoding: [0x16,0x05]
-move.b %d5, %d3
-
-; CHECK:      move.b %d5, %d4
-; CHECK-SAME: encoding: [0x18,0x05]
-move.b %d5, %d4
-
-; CHECK:      move.b %d5, %d5
-; CHECK-SAME: encoding: [0x1a,0x05]
-move.b %d5, %d5
-
-; CHECK:      move.b %d5, %d6
-; CHECK-SAME: encoding: [0x1c,0x05]
-move.b %d5, %d6
-
-; CHECK:      move.b %d5, %d7
-; CHECK-SAME: encoding: [0x1e,0x05]
-move.b %d5, %d7
-
-; CHECK:      move.b %d6, %d0
-; CHECK-SAME: encoding: [0x10,0x06]
-move.b %d6, %d0
-
-; CHECK:      move.b %d6, %d1
-; CHECK-SAME: encoding: [0x12,0x06]
-move.b %d6, %d1
-
-; CHECK:      move.b %d6, %d2
-; CHECK-SAME: encoding: [0x14,0x06]
-move.b %d6, %d2
-
-; CHECK:      move.b %d6, %d3
-; CHECK-SAME: encoding: [0x16,0x06]
-move.b %d6, %d3
-
-; CHECK:      move.b %d6, %d4
-; CHECK-SAME: encoding: [0x18,0x06]
-move.b %d6, %d4
-
-; CHECK:      move.b %d6, %d5
-; CHECK-SAME: encoding: [0x1a,0x06]
-move.b %d6, %d5
-
-; CHECK:      move.b %d6, %d6
-; CHECK-SAME: encoding: [0x1c,0x06]
-move.b %d6, %d6
-
-; CHECK:      move.b %d6, %d7
-; CHECK-SAME: encoding: [0x1e,0x06]
-move.b %d6, %d7
-
 ; CHECK:      move.b %d7, %d0
 ; CHECK-SAME: encoding: [0x10,0x07]
 move.b %d7, %d0
@@ -235,26 +35,6 @@ move.b %d7, %d0
 ; CHECK-SAME: encoding: [0x12,0x07]
 move.b %d7, %d1
 
-; CHECK:      move.b %d7, %d2
-; CHECK-SAME: encoding: [0x14,0x07]
-move.b %d7, %d2
-
-; CHECK:      move.b %d7, %d3
-; CHECK-SAME: encoding: [0x16,0x07]
-move.b %d7, %d3
-
-; CHECK:      move.b %d7, %d4
-; CHECK-SAME: encoding: [0x18,0x07]
-move.b %d7, %d4
-
-; CHECK:      move.b %d7, %d5
-; CHECK-SAME: encoding: [0x1a,0x07]
-move.b %d7, %d5
-
-; CHECK:      move.b %d7, %d6
-; CHECK-SAME: encoding: [0x1c,0x07]
-move.b %d7, %d6
-
 ; CHECK:      move.b %d7, %d7
 ; CHECK-SAME: encoding: [0x1e,0x07]
 move.b %d7, %d7
@@ -267,26 +47,6 @@ move.w %d0, %d0
 ; CHECK-SAME: encoding: [0x32,0x00]
 move.w %d0, %d1
 
-; CHECK:      move.w %d0, %d2
-; CHECK-SAME: encoding: [0x34,0x00]
-move.w %d0, %d2
-
-; CHECK:      move.w %d0, %d3
-; CHECK-SAME: encoding: [0x36,0x00]
-move.w %d0, %d3
-
-; CHECK:      move.w %d0, %d4
-; CHECK-SAME: encoding: [0x38,0x00]
-move.w %d0, %d4
-
-; CHECK:      move.w %d0, %d5
-; CHECK-SAME: encoding: [0x3a,0x00]
-move.w %d0, %d5
-
-; CHECK:      move.w %d0, %d6
-; CHECK-SAME: encoding: [0x3c,0x00]
-move.w %d0, %d6
-
 ; CHECK:      move.w %d0, %d7
 ; CHECK-SAME: encoding: [0x3e,0x00]
 move.w %d0, %d7
@@ -299,190 +59,10 @@ move.w %d1, %d0
 ; CHECK-SAME: encoding: [0x32,0x01]
 move.w %d1, %d1
 
-; CHECK:      move.w %d1, %d2
-; CHECK-SAME: encoding: [0x34,0x01]
-move.w %d1, %d2
-
-; CHECK:      move.w %d1, %d3
-; CHECK-SAME: encoding: [0x36,0x01]
-move.w %d1, %d3
-
-; CHECK:      move.w %d1, %d4
-; CHECK-SAME: encoding: [0x38,0x01]
-move.w %d1, %d4
-
-; CHECK:      move.w %d1, %d5
-; CHECK-SAME: encoding: [0x3a,0x01]
-move.w %d1, %d5
-
-; CHECK:      move.w %d1, %d6
-; CHECK-SAME: encoding: [0x3c,0x01]
-move.w %d1, %d6
-
 ; CHECK:      move.w %d1, %d7
 ; CHECK-SAME: encoding: [0x3e,0x01]
 move.w %d1, %d7
 
-; CHECK:      move.w %d2, %d0
-; CHECK-SAME: encoding: [0x30,0x02]
-move.w %d2, %d0
-
-; CHECK:      move.w %d2, %d1
-; CHECK-SAME: encoding: [0x32,0x02]
-move.w %d2, %d1
-
-; CHECK:      move.w %d2, %d2
-; CHECK-SAME: encoding: [0x34,0x02]
-move.w %d2, %d2
-
-; CHECK:      move.w %d2, %d3
-; CHECK-SAME: encoding: [0x36,0x02]
-move.w %d2, %d3
-
-; CHECK:      move.w %d2, %d4
-; CHECK-SAME: encoding: [0x38,0x02]
-move.w %d2, %d4
-
-; CHECK:      move.w %d2, %d5
-; CHECK-SAME: encoding: [0x3a,0x02]
-move.w %d2, %d5
-
-; CHECK:      move.w %d2, %d6
-; CHECK-SAME: encoding: [0x3c,0x02]
-move.w %d2, %d6
-
-; CHECK:      move.w %d2, %d7
-; CHECK-SAME: encoding: [0x3e,0x02]
-move.w %d2, %d7
-
-; CHECK:      move.w %d3, %d0
-; CHECK-SAME: encoding: [0x30,0x03]
-move.w %d3, %d0
-
-; CHECK:      move.w %d3, %d1
-; CHECK-SAME: encoding: [0x32,0x03]
-move.w %d3, %d1
-
-; CHECK:      move.w %d3, %d2
-; CHECK-SAME: encoding: [0x34,0x03]
-move.w %d3, %d2
-
-; CHECK:      move.w %d3, %d3
-; CHECK-SAME: encoding: [0x36,0x03]
-move.w %d3, %d3
-
-; CHECK:      move.w %d3, %d4
-; CHECK-SAME: encoding: [0x38,0x03]
-move.w %d3, %d4
-
-; CHECK:      move.w %d3, %d5
-; CHECK-SAME: encoding: [0x3a,0x03]
-move.w %d3, %d5
-
-; CHECK:      move.w %d3, %d6
-; CHECK-SAME: encoding: [0x3c,0x03]
-move.w %d3, %d6
-
-; CHECK:      move.w %d3, %d7
-; CHECK-SAME: encoding: [0x3e,0x03]
-move.w %d3, %d7
-
-; CHECK:      move.w %d4, %d0
-; CHECK-SAME: encoding: [0x30,0x04]
-move.w %d4, %d0
-
-; CHECK:      move.w %d4, %d1
-; CHECK-SAME: encoding: [0x32,0x04]
-move.w %d4, %d1
-
-; CHECK:      move.w %d4, %d2
-; CHECK-SAME: encoding: [0x34,0x04]
-move.w %d4, %d2
-
-; CHECK:      move.w %d4, %d3
-; CHECK-SAME: encoding: [0x36,0x04]
-move.w %d4, %d3
-
-; CHECK:      move.w %d4, %d4
-; CHECK-SAME: encoding: [0x38,0x04]
-move.w %d4, %d4
-
-; CHECK:      move.w %d4, %d5
-; CHECK-SAME: encoding: [0x3a,0x04]
-move.w %d4, %d5
-
-; CHECK:      move.w %d4, %d6
-; CHECK-SAME: encoding: [0x3c,0x04]
-move.w %d4, %d6
-
-; CHECK:      move.w %d4, %d7
-; CHECK-SAME: encoding: [0x3e,0x04]
-move.w %d4, %d7
-
-; CHECK:      move.w %d5, %d0
-; CHECK-SAME: encoding: [0x30,0x05]
-move.w %d5, %d0
-
-; CHECK:      move.w %d5, %d1
-; CHECK-SAME: encoding: [0x32,0x05]
-move.w %d5, %d1
-
-; CHECK:      move.w %d5, %d2
-; CHECK-SAME: encoding: [0x34,0x05]
-move.w %d5, %d2
-
-; CHECK:      move.w %d5, %d3
-; CHECK-SAME: encoding: [0x36,0x05]
-move.w %d5, %d3
-
-; CHECK:      move.w %d5, %d4
-; CHECK-SAME: encoding: [0x38,0x05]
-move.w %d5, %d4
-
-; CHECK:      move.w %d5, %d5
-; CHECK-SAME: encoding: [0x3a,0x05]
-move.w %d5, %d5
-
-; CHECK:      move.w %d5, %d6
-; CHECK-SAME: encoding: [0x3c,0x05]
-move.w %d5, %d6
-
-; CHECK:      move.w %d5, %d7
-; CHECK-SAME: encoding: [0x3e,0x05]
-move.w %d5, %d7
-
-; CHECK:      move.w %d6, %d0
-; CHECK-SAME: encoding: [0x30,0x06]
-move.w %d6, %d0
-
-; CHECK:      move.w %d6, %d1
-; CHECK-SAME: encoding: [0x32,0x06]
-move.w %d6, %d1
-
-; CHECK:      move.w %d6, %d2
-; CHECK-SAME: encoding: [0x34,0x06]
-move.w %d6, %d2
-
-; CHECK:      move.w %d6, %d3
-; CHECK-SAME: encoding: [0x36,0x06]
-move.w %d6, %d3
-
-; CHECK:      move.w %d6, %d4
-; CHECK-SAME: encoding: [0x38,0x06]
-move.w %d6, %d4
-
-; CHECK:      move.w %d6, %d5
-; CHECK-SAME: encoding: [0x3a,0x06]
-move.w %d6, %d5
-
-; CHECK:      move.w %d6, %d6
-; CHECK-SAME: encoding: [0x3c,0x06]
-move.w %d6, %d6
-
-; CHECK:      move.w %d6, %d7
-; CHECK-SAME: encoding: [0x3e,0x06]
-move.w %d6, %d7
-
 ; CHECK:      move.w %d7, %d0
 ; CHECK-SAME: encoding: [0x30,0x07]
 move.w %d7, %d0
@@ -491,26 +71,6 @@ move.w %d7, %d0
 ; CHECK-SAME: encoding: [0x32,0x07]
 move.w %d7, %d1
 
-; CHECK:      move.w %d7, %d2
-; CHECK-SAME: encoding: [0x34,0x07]
-move.w %d7, %d2
-
-; CHECK:      move.w %d7, %d3
-; CHECK-SAME: encoding: [0x36,0x07]
-move.w %d7, %d3
-
-; CHECK:      move.w %d7, %d4
-; CHECK-SAME: encoding: [0x38,0x07]
-move.w %d7, %d4
-
-; CHECK:      move.w %d7, %d5
-; CHECK-SAME: encoding: [0x3a,0x07]
-move.w %d7, %d5
-
-; CHECK:      move.w %d7, %d6
-; CHECK-SAME: encoding: [0x3c,0x07]
-move.w %d7, %d6
-
 ; CHECK:      move.w %d7, %d7
 ; CHECK-SAME: encoding: [0x3e,0x07]
 move.w %d7, %d7
@@ -523,26 +83,6 @@ move.w %a0, %d0
 ; CHECK-SAME: encoding: [0x32,0x08]
 move.w %a0, %d1
 
-; CHECK:      move.w %a0, %d2
-; CHECK-SAME: encoding: [0x34,0x08]
-move.w %a0, %d2
-
-; CHECK:      move.w %a0, %d3
-; CHECK-SAME: encoding: [0x36,0x08]
-move.w %a0, %d3
-
-; CHECK:      move.w %a0, %d4
-; CHECK-SAME: encoding: [0x38,0x08]
-move.w %a0, %d4
-
-; CHECK:      move.w %a0, %d5
-; CHECK-SAME: encoding: [0x3a,0x08]
-move.w %a0, %d5
-
-; CHECK:      move.w %a0, %d6
-; CHECK-SAME: encoding: [0x3c,0x08]
-move.w %a0, %d6
-
 ; CHECK:      move.w %a0, %d7
 ; CHECK-SAME: encoding: [0x3e,0x08]
 move.w %a0, %d7
@@ -555,190 +95,10 @@ move.w %a1, %d0
 ; CHECK-SAME: encoding: [0x32,0x09]
 move.w %a1, %d1
 
-; CHECK:      move.w %a1, %d2
-; CHECK-SAME: encoding: [0x34,0x09]
-move.w %a1, %d2
-
-; CHECK:      move.w %a1, %d3
-; CHECK-SAME: encoding: [0x36,0x09]
-move.w %a1, %d3
-
-; CHECK:      move.w %a1, %d4
-; CHECK-SAME: encoding: [0x38,0x09]
-move.w %a1, %d4
-
-; CHECK:      move.w %a1, %d5
-; CHECK-SAME: encoding: [0x3a,0x09]
-move.w %a1, %d5
-
-; CHECK:      move.w %a1, %d6
-; CHECK-SAME: encoding: [0x3c,0x09]
-move.w %a1, %d6
-
 ; CHECK:      move.w %a1, %d7
 ; CHECK-SAME: encoding: [0x3e,0x09]
 move.w %a1, %d7
 
-; CHECK:      move.w %a2, %d0
-; CHECK-SAME: encoding: [0x30,0x0a]
-move.w %a2, %d0
-
-; CHECK:      move.w %a2, %d1
-; CHECK-SAME: encoding: [0x32,0x0a]
-move.w %a2, %d1
-
-; CHECK:      move.w %a2, %d2
-; CHECK-SAME: encoding: [0x34,0x0a]
-move.w %a2, %d2
-
-; CHECK:      move.w %a2, %d3
-; CHECK-SAME: encoding: [0x36,0x0a]
-move.w %a2, %d3
-
-; CHECK:      move.w %a2, %d4
-; CHECK-SAME: encoding: [0x38,0x0a]
-move.w %a2, %d4
-
-; CHECK:      move.w %a2, %d5
-; CHECK-SAME: encoding: [0x3a,0x0a]
-move.w %a2, %d5
-
-; CHECK:      move.w %a2, %d6
-; CHECK-SAME: encoding: [0x3c,0x0a]
-move.w %a2, %d6
-
-; CHECK:      move.w %a2, %d7
-; CHECK-SAME: encoding: [0x3e,0x0a]
-move.w %a2, %d7
-
-; CHECK:      move.w %a3, %d0
-; CHECK-SAME: encoding: [0x30,0x0b]
-move.w %a3, %d0
-
-; CHECK:      move.w %a3, %d1
-; CHECK-SAME: encoding: [0x32,0x0b]
-move.w %a3, %d1
-
-; CHECK:      move.w %a3, %d2
-; CHECK-SAME: encoding: [0x34,0x0b]
-move.w %a3, %d2
-
-; CHECK:      move.w %a3, %d3
-; CHECK-SAME: encoding: [0x36,0x0b]
-move.w %a3, %d3
-
-; CHECK:      move.w %a3, %d4
-; CHECK-SAME: encoding: [0x38,0x0b]
-move.w %a3, %d4
-
-; CHECK:      move.w %a3, %d5
-; CHECK-SAME: encoding: [0x3a,0x0b]
-move.w %a3, %d5
-
-; CHECK:      move.w %a3, %d6
-; CHECK-SAME: encoding: [0x3c,0x0b]
-move.w %a3, %d6
-
-; CHECK:      move.w %a3, %d7
-; CHECK-SAME: encoding: [0x3e,0x0b]
-move.w %a3, %d7
-
-; CHECK:      move.w %a4, %d0
-; CHECK-SAME: encoding: [0x30,0x0c]
-move.w %a4, %d0
-
-; CHECK:      move.w %a4, %d1
-; CHECK-SAME: encoding: [0x32,0x0c]
-move.w %a4, %d1
-
-; CHECK:      move.w %a4, %d2
-; CHECK-SAME: encoding: [0x34,0x0c]
-move.w %a4, %d2
-
-; CHECK:      move.w %a4, %d3
-; CHECK-SAME: encoding: [0x36,0x0c]
-move.w %a4, %d3
-
-; CHECK:      move.w %a4, %d4
-; CHECK-SAME: encoding: [0x38,0x0c]
-move.w %a4, %d4
-
-; CHECK:      move.w %a4, %d5
-; CHECK-SAME: encoding: [0x3a,0x0c]
-move.w %a4, %d5
-
-; CHECK:      move.w %a4, %d6
-; CHECK-SAME: encoding: [0x3c,0x0c]
-move.w %a4, %d6
-
-; CHECK:      move.w %a4, %d7
-; CHECK-SAME: encoding: [0x3e,0x0c]
-move.w %a4, %d7
-
-; CHECK:      move.w %a5, %d0
-; CHECK-SAME: encoding: [0x30,0x0d]
-move.w %a5, %d0
-
-; CHECK:      move.w %a5, %d1
-; CHECK-SAME: encoding: [0x32,0x0d]
-move.w %a5, %d1
-
-; CHECK:      move.w %a5, %d2
-; CHECK-SAME: encoding: [0x34,0x0d]
-move.w %a5, %d2
-
-; CHECK:      move.w %a5, %d3
-; CHECK-SAME: encoding: [0x36,0x0d]
-move.w %a5, %d3
-
-; CHECK:      move.w %a5, %d4
-; CHECK-SAME: encoding: [0x38,0x0d]
-move.w %a5, %d4
-
-; CHECK:      move.w %a5, %d5
-; CHECK-SAME: encoding: [0x3a,0x0d]
-move.w %a5, %d5
-
-; CHECK:      move.w %a5, %d6
-; CHECK-SAME: encoding: [0x3c,0x0d]
-move.w %a5, %d6
-
-; CHECK:      move.w %a5, %d7
-; CHECK-SAME: encoding: [0x3e,0x0d]
-move.w %a5, %d7
-
-; CHECK:      move.w %a6, %d0
-; CHECK-SAME: encoding: [0x30,0x0e]
-move.w %a6, %d0
-
-; CHECK:      move.w %a6, %d1
-; CHECK-SAME: encoding: [0x32,0x0e]
-move.w %a6, %d1
-
-; CHECK:      move.w %a6, %d2
-; CHECK-SAME: encoding: [0x34,0x0e]
-move.w %a6, %d2
-
-; CHECK:      move.w %a6, %d3
-; CHECK-SAME: encoding: [0x36,0x0e]
-move.w %a6, %d3
-
-; CHECK:      move.w %a6, %d4
-; CHECK-SAME: encoding: [0x38,0x0e]
-move.w %a6, %d4
-
-; CHECK:      move.w %a6, %d5
-; CHECK-SAME: encoding: [0x3a,0x0e]
-move.w %a6, %d5
-
-; CHECK:      move.w %a6, %d6
-; CHECK-SAME: encoding: [0x3c,0x0e]
-move.w %a6, %d6
-
-; CHECK:      move.w %a6, %d7
-; CHECK-SAME: encoding: [0x3e,0x0e]
-move.w %a6, %d7
-
 ; CHECK:      move.w %sp, %d0
 ; CHECK-SAME: encoding: [0x30,0x0f]
 move.w %sp, %d0
@@ -747,26 +107,6 @@ move.w %sp, %d0
 ; CHECK-SAME: encoding: [0x32,0x0f]
 move.w %sp, %d1
 
-; CHECK:      move.w %sp, %d2
-; CHECK-SAME: encoding: [0x34,0x0f]
-move.w %sp, %d2
-
-; CHECK:      move.w %sp, %d3
-; CHECK-SAME: encoding: [0x36,0x0f]
-move.w %sp, %d3
-
-; CHECK:      move.w %sp, %d4
-; CHECK-SAME: encoding: [0x38,0x0f]
-move.w %sp, %d4
-
-; CHECK:      move.w %sp, %d5
-; CHECK-SAME: encoding: [0x3a,0x0f]
-move.w %sp, %d5
-
-; CHECK:      move.w %sp, %d6
-; CHECK-SAME: encoding: [0x3c,0x0f]
-move.w %sp, %d6
-
 ; CHECK:      move.w %sp, %d7
 ; CHECK-SAME: encoding: [0x3e,0x0f]
 move.w %sp, %d7
@@ -779,26 +119,6 @@ move.l %d0, %d0
 ; CHECK-SAME: encoding: [0x22,0x00]
 move.l %d0, %d1
 
-; CHECK:      move.l %d0, %d2
-; CHECK-SAME: encoding: [0x24,0x00]
-move.l %d0, %d2
-
-; CHECK:      move.l %d0, %d3
-; CHECK-SAME: encoding: [0x26,0x00]
-move.l %d0, %d3
-
-; CHECK:      move.l %d0, %d4
-; CHECK-SAME: encoding: [0x28,0x00]
-move.l %d0, %d4
-
-; CHECK:      move.l %d0, %d5
-; CHECK-SAME: encoding: [0x2a,0x00]
-move.l %d0, %d5
-
-; CHECK:      move.l %d0, %d6
-; CHECK-SAME: encoding: [0x2c,0x00]
-move.l %d0, %d6
-
 ; CHECK:      move.l %d0, %d7
 ; CHECK-SAME: encoding: [0x2e,0x00]
 move.l %d0, %d7
@@ -811,190 +131,10 @@ move.l %d1, %d0
 ; CHECK-SAME: encoding: [0x22,0x01]
 move.l %d1, %d1
 
-; CHECK:      move.l %d1, %d2
-; CHECK-SAME: encoding: [0x24,0x01]
-move.l %d1, %d2
-
-; CHECK:      move.l %d1, %d3
-; CHECK-SAME: encoding: [0x26,0x01]
-move.l %d1, %d3
-
-; CHECK:      move.l %d1, %d4
-; CHECK-SAME: encoding: [0x28,0x01]
-move.l %d1, %d4
-
-; CHECK:      move.l %d1, %d5
-; CHECK-SAME: encoding: [0x2a,0x01]
-move.l %d1, %d5
-
-; CHECK:      move.l %d1, %d6
-; CHECK-SAME: encoding: [0x2c,0x01]
-move.l %d1, %d6
-
 ; CHECK:      move.l %d1, %d7
 ; CHECK-SAME: encoding: [0x2e,0x01]
 move.l %d1, %d7
 
-; CHECK:      move.l %d2, %d0
-; CHECK-SAME: encoding: [0x20,0x02]
-move.l %d2, %d0
-
-; CHECK:      move.l %d2, %d1
-; CHECK-SAME: encoding: [0x22,0x02]
-move.l %d2, %d1
-
-; CHECK:      move.l %d2, %d2
-; CHECK-SAME: encoding: [0x24,0x02]
-move.l %d2, %d2
-
-; CHECK:      move.l %d2, %d3
-; CHECK-SAME: encoding: [0x26,0x02]
-move.l %d2, %d3
-
-; CHECK:      move.l %d2, %d4
-; CHECK-SAME: encoding: [0x28,0x02]
-move.l %d2, %d4
-
-; CHECK:      move.l %d2, %d5
-; CHECK-SAME: encoding: [0x2a,0x02]
-move.l %d2, %d5
-
-; CHECK:      move.l %d2, %d6
-; CHECK-SAME: encoding: [0x2c,0x02]
-move.l %d2, %d6
-
-; CHECK:      move.l %d2, %d7
-; CHECK-SAME: encoding: [0x2e,0x02]
-move.l %d2, %d7
-
-; CHECK:      move.l %d3, %d0
-; CHECK-SAME: encoding: [0x20,0x03]
-move.l %d3, %d0
-
-; CHECK:      move.l %d3, %d1
-; CHECK-SAME: encoding: [0x22,0x03]
-move.l %d3, %d1
-
-; CHECK:      move.l %d3, %d2
-; CHECK-SAME: encoding: [0x24,0x03]
-move.l %d3, %d2
-
-; CHECK:      move.l %d3, %d3
-; CHECK-SAME: encoding: [0x26,0x03]
-move.l %d3, %d3
-
-; CHECK:      move.l %d3, %d4
-; CHECK-SAME: encoding: [0x28,0x03]
-move.l %d3, %d4
-
-; CHECK:      move.l %d3, %d5
-; CHECK-SAME: encoding: [0x2a,0x03]
-move.l %d3, %d5
-
-; CHECK:      move.l %d3, %d6
-; CHECK-SAME: encoding: [0x2c,0x03]
-move.l %d3, %d6
-
-; CHECK:      move.l %d3, %d7
-; CHECK-SAME: encoding: [0x2e,0x03]
-move.l %d3, %d7
-
-; CHECK:      move.l %d4, %d0
-; CHECK-SAME: encoding: [0x20,0x04]
-move.l %d4, %d0
-
-; CHECK:      move.l %d4, %d1
-; CHECK-SAME: encoding: [0x22,0x04]
-move.l %d4, %d1
-
-; CHECK:      move.l %d4, %d2
-; CHECK-SAME: encoding: [0x24,0x04]
-move.l %d4, %d2
-
-; CHECK:      move.l %d4, %d3
-; CHECK-SAME: encoding: [0x26,0x04]
-move.l %d4, %d3
-
-; CHECK:      move.l %d4, %d4
-; CHECK-SAME: encoding: [0x28,0x04]
-move.l %d4, %d4
-
-; CHECK:      move.l %d4, %d5
-; CHECK-SAME: encoding: [0x2a,0x04]
-move.l %d4, %d5
-
-; CHECK:      move.l %d4, %d6
-; CHECK-SAME: encoding: [0x2c,0x04]
-move.l %d4, %d6
-
-; CHECK:      move.l %d4, %d7
-; CHECK-SAME: encoding: [0x2e,0x04]
-move.l %d4, %d7
-
-; CHECK:      move.l %d5, %d0
-; CHECK-SAME: encoding: [0x20,0x05]
-move.l %d5, %d0
-
-; CHECK:      move.l %d5, %d1
-; CHECK-SAME: encoding: [0x22,0x05]
-move.l %d5, %d1
-
-; CHECK:      move.l %d5, %d2
-; CHECK-SAME: encoding: [0x24,0x05]
-move.l %d5, %d2
-
-; CHECK:      move.l %d5, %d3
-; CHECK-SAME: encoding: [0x26,0x05]
-move.l %d5, %d3
-
-; CHECK:      move.l %d5, %d4
-; CHECK-SAME: encoding: [0x28,0x05]
-move.l %d5, %d4
-
-; CHECK:      move.l %d5, %d5
-; CHECK-SAME: encoding: [0x2a,0x05]
-move.l %d5, %d5
-
-; CHECK:      move.l %d5, %d6
-; CHECK-SAME: encoding: [0x2c,0x05]
-move.l %d5, %d6
-
-; CHECK:      move.l %d5, %d7
-; CHECK-SAME: encoding: [0x2e,0x05]
-move.l %d5, %d7
-
-; CHECK:      move.l %d6, %d0
-; CHECK-SAME: encoding: [0x20,0x06]
-move.l %d6, %d0
-
-; CHECK:      move.l %d6, %d1
-; CHECK-SAME: encoding: [0x22,0x06]
-move.l %d6, %d1
-
-; CHECK:      move.l %d6, %d2
-; CHECK-SAME: encoding: [0x24,0x06]
-move.l %d6, %d2
-
-; CHECK:      move.l %d6, %d3
-; CHECK-SAME: encoding: [0x26,0x06]
-move.l %d6, %d3
-
-; CHECK:      move.l %d6, %d4
-; CHECK-SAME: encoding: [0x28,0x06]
-move.l %d6, %d4
-
-; CHECK:      move.l %d6, %d5
-; CHECK-SAME: encoding: [0x2a,0x06]
-move.l %d6, %d5
-
-; CHECK:      move.l %d6, %d6
-; CHECK-SAME: encoding: [0x2c,0x06]
-move.l %d6, %d6
-
-; CHECK:      move.l %d6, %d7
-; CHECK-SAME: encoding: [0x2e,0x06]
-move.l %d6, %d7
-
 ; CHECK:      move.l %d7, %d0
 ; CHECK-SAME: encoding: [0x20,0x07]
 move.l %d7, %d0
@@ -1003,26 +143,6 @@ move.l %d7, %d0
 ; CHECK-SAME: encoding: [0x22,0x07]
 move.l %d7, %d1
 
-; CHECK:      move.l %d7, %d2
-; CHECK-SAME: encoding: [0x24,0x07]
-move.l %d7, %d2
-
-; CHECK:      move.l %d7, %d3
-; CHECK-SAME: encoding: [0x26,0x07]
-move.l %d7, %d3
-
-; CHECK:      move.l %d7, %d4
-; CHECK-SAME: encoding: [0x28,0x07]
-move.l %d7, %d4
-
-; CHECK:      move.l %d7, %d5
-; CHECK-SAME: encoding: [0x2a,0x07]
-move.l %d7, %d5
-
-; CHECK:      move.l %d7, %d6
-; CHECK-SAME: encoding: [0x2c,0x07]
-move.l %d7, %d6
-
 ; CHECK:      move.l %d7, %d7
 ; CHECK-SAME: encoding: [0x2e,0x07]
 move.l %d7, %d7
@@ -1035,26 +155,6 @@ move.l %a0, %d0
 ; CHECK-SAME: encoding: [0x22,0x08]
 move.l %a0, %d1
 
-; CHECK:      move.l %a0, %d2
-; CHECK-SAME: encoding: [0x24,0x08]
-move.l %a0, %d2
-
-; CHECK:      move.l %a0, %d3
-; CHECK-SAME: encoding: [0x26,0x08]
-move.l %a0, %d3
-
-; CHECK:      move.l %a0, %d4
-; CHECK-SAME: encoding: [0x28,0x08]
-move.l %a0, %d4
-
-; CHECK:      move.l %a0, %d5
-; CHECK-SAME: encoding: [0x2a,0x08]
-move.l %a0, %d5
-
-; CHECK:      move.l %a0, %d6
-; CHECK-SAME: encoding: [0x2c,0x08]
-move.l %a0, %d6
-
 ; CHECK:      move.l %a0, %d7
 ; CHECK-SAME: encoding: [0x2e,0x08]
 move.l %a0, %d7
@@ -1067,190 +167,10 @@ move.l %a1, %d0
 ; CHECK-SAME: encoding: [0x22,0x09]
 move.l %a1, %d1
 
-; CHECK:      move.l %a1, %d2
-; CHECK-SAME: encoding: [0x24,0x09]
-move.l %a1, %d2
-
-; CHECK:      move.l %a1, %d3
-; CHECK-SAME: encoding: [0x26,0x09]
-move.l %a1, %d3
-
-; CHECK:      move.l %a1, %d4
-; CHECK-SAME: encoding: [0x28,0x09]
-move.l %a1, %d4
-
-; CHECK:      move.l %a1, %d5
-; CHECK-SAME: encoding: [0x2a,0x09]
-move.l %a1, %d5
-
-; CHECK:      move.l %a1, %d6
-; CHECK-SAME: encoding: [0x2c,0x09]
-move.l %a1, %d6
-
 ; CHECK:      move.l %a1, %d7
 ; CHECK-SAME: encoding: [0x2e,0x09]
 move.l %a1, %d7
 
-; CHECK:      move.l %a2, %d0
-; CHECK-SAME: encoding: [0x20,0x0a]
-move.l %a2, %d0
-
-; CHECK:      move.l %a2, %d1
-; CHECK-SAME: encoding: [0x22,0x0a]
-move.l %a2, %d1
-
-; CHECK:      move.l %a2, %d2
-; CHECK-SAME: encoding: [0x24,0x0a]
-move.l %a2, %d2
-
-; CHECK:      move.l %a2, %d3
-; CHECK-SAME: encoding: [0x26,0x0a]
-move.l %a2, %d3
-
-; CHECK:      move.l %a2, %d4
-; CHECK-SAME: encoding: [0x28,0x0a]
-move.l %a2, %d4
-
-; CHECK:      move.l %a2, %d5
-; CHECK-SAME: encoding: [0x2a,0x0a]
-move.l %a2, %d5
-
-; CHECK:      move.l %a2, %d6
-; CHECK-SAME: encoding: [0x2c,0x0a]
-move.l %a2, %d6
-
-; CHECK:      move.l %a2, %d7
-; CHECK-SAME: encoding: [0x2e,0x0a]
-move.l %a2, %d7
-
-; CHECK:      move.l %a3, %d0
-; CHECK-SAME: encoding: [0x20,0x0b]
-move.l %a3, %d0
-
-; CHECK:      move.l %a3, %d1
-; CHECK-SAME: encoding: [0x22,0x0b]
-move.l %a3, %d1
-
-; CHECK:      move.l %a3, %d2
-; CHECK-SAME: encoding: [0x24,0x0b]
-move.l %a3, %d2
-
-; CHECK:      move.l %a3, %d3
-; CHECK-SAME: encoding: [0x26,0x0b]
-move.l %a3, %d3
-
-; CHECK:      move.l %a3, %d4
-; CHECK-SAME: encoding: [0x28,0x0b]
-move.l %a3, %d4
-
-; CHECK:      move.l %a3, %d5
-; CHECK-SAME: encoding: [0x2a,0x0b]
-move.l %a3, %d5
-
-; CHECK:      move.l %a3, %d6
-; CHECK-SAME: encoding: [0x2c,0x0b]
-move.l %a3, %d6
-
-; CHECK:      move.l %a3, %d7
-; CHECK-SAME: encoding: [0x2e,0x0b]
-move.l %a3, %d7
-
-; CHECK:      move.l %a4, %d0
-; CHECK-SAME: encoding: [0x20,0x0c]
-move.l %a4, %d0
-
-; CHECK:      move.l %a4, %d1
-; CHECK-SAME: encoding: [0x22,0x0c]
-move.l %a4, %d1
-
-; CHECK:      move.l %a4, %d2
-; CHECK-SAME: encoding: [0x24,0x0c]
-move.l %a4, %d2
-
-; CHECK:      move.l %a4, %d3
-; CHECK-SAME: encoding: [0x26,0x0c]
-move.l %a4, %d3
-
-; CHECK:      move.l %a4, %d4
-; CHECK-SAME: encoding: [0x28,0x0c]
-move.l %a4, %d4
-
-; CHECK:      move.l %a4, %d5
-; CHECK-SAME: encoding: [0x2a,0x0c]
-move.l %a4, %d5
-
-; CHECK:      move.l %a4, %d6
-; CHECK-SAME: encoding: [0x2c,0x0c]
-move.l %a4, %d6
-
-; CHECK:      move.l %a4, %d7
-; CHECK-SAME: encoding: [0x2e,0x0c]
-move.l %a4, %d7
-
-; CHECK:      move.l %a5, %d0
-; CHECK-SAME: encoding: [0x20,0x0d]
-move.l %a5, %d0
-
-; CHECK:      move.l %a5, %d1
-; CHECK-SAME: encoding: [0x22,0x0d]
-move.l %a5, %d1
-
-; CHECK:      move.l %a5, %d2
-; CHECK-SAME: encoding: [0x24,0x0d]
-move.l %a5, %d2
-
-; CHECK:      move.l %a5, %d3
-; CHECK-SAME: encoding: [0x26,0x0d]
-move.l %a5, %d3
-
-; CHECK:      move.l %a5, %d4
-; CHECK-SAME: encoding: [0x28,0x0d]
-move.l %a5, %d4
-
-; CHECK:      move.l %a5, %d5
-; CHECK-SAME: encoding: [0x2a,0x0d]
-move.l %a5, %d5
-
-; CHECK:      move.l %a5, %d6
-; CHECK-SAME: encoding: [0x2c,0x0d]
-move.l %a5, %d6
-
-; CHECK:      move.l %a5, %d7
-; CHECK-SAME: encoding: [0x2e,0x0d]
-move.l %a5, %d7
-
-; CHECK:      move.l %a6, %d0
-; CHECK-SAME: encoding: [0x20,0x0e]
-move.l %a6, %d0
-
-; CHECK:      move.l %a6, %d1
-; CHECK-SAME: encoding: [0x22,0x0e]
-move.l %a6, %d1
-
-; CHECK:      move.l %a6, %d2
-; CHECK-SAME: encoding: [0x24,0x0e]
-move.l %a6, %d2
-
-; CHECK:      move.l %a6, %d3
-; CHECK-SAME: encoding: [0x26,0x0e]
-move.l %a6, %d3
-
-; CHECK:      move.l %a6, %d4
-; CHECK-SAME: encoding: [0x28,0x0e]
-move.l %a6, %d4
-
-; CHECK:      move.l %a6, %d5
-; CHECK-SAME: encoding: [0x2a,0x0e]
-move.l %a6, %d5
-
-; CHECK:      move.l %a6, %d6
-; CHECK-SAME: encoding: [0x2c,0x0e]
-move.l %a6, %d6
-
-; CHECK:      move.l %a6, %d7
-; CHECK-SAME: encoding: [0x2e,0x0e]
-move.l %a6, %d7
-
 ; CHECK:      move.l %sp, %d0
 ; CHECK-SAME: encoding: [0x20,0x0f]
 move.l %sp, %d0
@@ -1259,26 +179,6 @@ move.l %sp, %d0
 ; CHECK-SAME: encoding: [0x22,0x0f]
 move.l %sp, %d1
 
-; CHECK:      move.l %sp, %d2
-; CHECK-SAME: encoding: [0x24,0x0f]
-move.l %sp, %d2
-
-; CHECK:      move.l %sp, %d3
-; CHECK-SAME: encoding: [0x26,0x0f]
-move.l %sp, %d3
-
-; CHECK:      move.l %sp, %d4
-; CHECK-SAME: encoding: [0x28,0x0f]
-move.l %sp, %d4
-
-; CHECK:      move.l %sp, %d5
-; CHECK-SAME: encoding: [0x2a,0x0f]
-move.l %sp, %d5
-
-; CHECK:      move.l %sp, %d6
-; CHECK-SAME: encoding: [0x2c,0x0f]
-move.l %sp, %d6
-
 ; CHECK:      move.l %sp, %d7
 ; CHECK-SAME: encoding: [0x2e,0x0f]
 move.l %sp, %d7
diff --git a/llvm/test/MC/M68k/generate_tests.py b/llvm/test/MC/M68k/generate_tests.py
index d113adf0d4c96..103396fabacc0 100755
--- a/llvm/test/MC/M68k/generate_tests.py
+++ b/llvm/test/MC/M68k/generate_tests.py
@@ -111,7 +111,11 @@ class DataRegisterDirect(EffectiveAddressingMode):
     registerNumber: int
 
     def permutations() -> Generator["DataRegisterDirect", None, None]:
-        for registerNumber in range(8):
+        # d0, d1 and d7 are considered representative permutations, in order to test:
+        # - all bits 0
+        # - all bits 1
+        # - the bit ordering
+        for registerNumber in [0, 1, 7]:
             yield DataRegisterDirect(registerNumber)
 
     def asm(self) -> str:
@@ -133,7 +137,11 @@ class AddressRegisterDirect(EffectiveAddressingMode):
     registerNumber: int
 
     def permutations() -> Generator["AddressRegisterDirect", None, None]:
-        for registerNumber in range(8):
+        # a0, a1 and a7 (sp) are considered representative permutations, in order to test:
+        # - all bits 0
+        # - all bits 1
+        # - the bit ordering
+        for registerNumber in [0, 1, 7]:
             yield AddressRegisterDirect(registerNumber)
 
     def asm(self) -> str:

>From 15c030f317eeadcac53c26abefa5f251d59c136e Mon Sep 17 00:00:00 2001
From: Peter Mackay <git at petmac.dev>
Date: Sun, 3 May 2026 14:56:56 +0100
Subject: [PATCH 7/8] Split register types from modes

To facilitate adding new modes
---
 llvm/test/MC/M68k/generate_tests.py | 85 ++++++++++++++++++++++-------
 1 file changed, 64 insertions(+), 21 deletions(-)

diff --git a/llvm/test/MC/M68k/generate_tests.py b/llvm/test/MC/M68k/generate_tests.py
index 103396fabacc0..13a1dd28e06ce 100755
--- a/llvm/test/MC/M68k/generate_tests.py
+++ b/llvm/test/MC/M68k/generate_tests.py
@@ -2,6 +2,7 @@
 
 from abc import ABC, abstractmethod
 from dataclasses import dataclass
+from enum import IntEnum
 from typing import Generator
 
 
@@ -78,6 +79,59 @@ def sizeField() -> int:
         return 0b10
 
 
+# Data registers
+
+
+class DataRegister(IntEnum):
+    D0 = 0
+    D1 = 1
+    D2 = 2
+    D3 = 3
+    D4 = 4
+    D5 = 5
+    D6 = 6
+    D7 = 7
+
+    def permutations() -> Generator["DataRegister", None, None]:
+        # d0, d1 and d7 are considered representative permutations, in order to test:
+        # - all bits 0
+        # - all bits 1
+        # - the bit ordering
+        for register in [DataRegister.D0, DataRegister.D1, DataRegister.D7]:
+            yield register
+
+    def asm(self) -> str:
+        return f"%d{self}"
+
+
+# Address registers
+
+
+class AddressRegister(IntEnum):
+    A0 = 0
+    A1 = 1
+    A2 = 2
+    A3 = 3
+    A4 = 4
+    A5 = 5
+    A6 = 6
+    SP = 7
+
+    def permutations() -> Generator["AddressRegister", None, None]:
+        # a0, a1 and a7 (sp) are considered representative permutations, in order to test:
+        # - all bits 0
+        # - all bits 1
+        # - the bit ordering
+        for register in [AddressRegister.A0, AddressRegister.A1, AddressRegister.SP]:
+            yield register
+
+    def asm(self) -> str:
+        if self is AddressRegister.SP:
+            return "%sp"
+        else:
+            return f"%a{self}"
+
+
 # Effective addressing modes
 # https://m680x0.github.io/ref/M68000PM_AD_Rev_1_Programmers_Reference_Manual_1992.html#pf3c
 
@@ -108,24 +162,20 @@ def registerField(self) -> int:
 class DataRegisterDirect(EffectiveAddressingMode):
     """Represents the contents of a particular data register."""
 
-    registerNumber: int
+    register: DataRegister
 
     def permutations() -> Generator["DataRegisterDirect", None, None]:
-        # d0, d1 and d7 are considered representative permutations, in order to test:
-        # - all bits 0
-        # - all bits 1
-        # - the bit ordering
-        for registerNumber in [0, 1, 7]:
-            yield DataRegisterDirect(registerNumber)
+        for register in DataRegister.permutations():
+            yield DataRegisterDirect(register)
 
     def asm(self) -> str:
-        return f"%d{self.registerNumber}"
+        return self.register.asm()
 
     def modeField(self) -> int:
         return 0b000
 
     def registerField(self) -> int:
-        return self.registerNumber
+        return self.register
 
 
 # https://m680x0.github.io/ref/M68000PM_AD_Rev_1_Programmers_Reference_Manual_1992.html#pf2e
@@ -134,27 +184,20 @@ def registerField(self) -> int:
 class AddressRegisterDirect(EffectiveAddressingMode):
     """Represents the contents of a particular address register."""
 
-    registerNumber: int
+    register: AddressRegister
 
     def permutations() -> Generator["AddressRegisterDirect", None, None]:
-        # a0, a1 and a7 (sp) are considered representative permutations, in order to test:
-        # - all bits 0
-        # - all bits 1
-        # - the bit ordering
-        for registerNumber in [0, 1, 7]:
-            yield AddressRegisterDirect(registerNumber)
+        for register in AddressRegister.permutations():
+            yield AddressRegisterDirect(register)
 
     def asm(self) -> str:
-        if self.registerNumber == 7:
-            return "%sp"
-        else:
-            return f"%a{self.registerNumber}"
+        return self.register.asm()
 
     def modeField(self) -> int:
         return 0b001
 
     def registerField(self) -> int:
-        return self.registerNumber
+        return self.register
 
 
 # Instructions

>From 39427c50b5fc14b865a34135ba26cf2c7ad48969 Mon Sep 17 00:00:00 2001
From: Peter Mackay <git at petmac.dev>
Date: Wed, 6 May 2026 23:46:33 +0100
Subject: [PATCH 8/8] Add Address Register Indirect addressing mode

---
 llvm/test/MC/M68k/MOVE.s            | 396 ++++++++++++++++++++++++++++
 llvm/test/MC/M68k/generate_tests.py |  34 ++-
 2 files changed, 426 insertions(+), 4 deletions(-)

diff --git a/llvm/test/MC/M68k/MOVE.s b/llvm/test/MC/M68k/MOVE.s
index 2fa35d531f02e..82dc6141c3863 100644
--- a/llvm/test/MC/M68k/MOVE.s
+++ b/llvm/test/MC/M68k/MOVE.s
@@ -15,6 +15,18 @@ move.b %d0, %d1
 ; CHECK-SAME: encoding: [0x1e,0x00]
 move.b %d0, %d7
 
+; CHECK:      move.b %d0, (%a0)
+; CHECK-SAME: encoding: [0x10,0x80]
+move.b %d0, (%a0)
+
+; CHECK:      move.b %d0, (%a1)
+; CHECK-SAME: encoding: [0x12,0x80]
+move.b %d0, (%a1)
+
+; CHECK:      move.b %d0, (%sp)
+; CHECK-SAME: encoding: [0x1e,0x80]
+move.b %d0, (%sp)
+
 ; CHECK:      move.b %d1, %d0
 ; CHECK-SAME: encoding: [0x10,0x01]
 move.b %d1, %d0
@@ -27,6 +39,18 @@ move.b %d1, %d1
 ; CHECK-SAME: encoding: [0x1e,0x01]
 move.b %d1, %d7
 
+; CHECK:      move.b %d1, (%a0)
+; CHECK-SAME: encoding: [0x10,0x81]
+move.b %d1, (%a0)
+
+; CHECK:      move.b %d1, (%a1)
+; CHECK-SAME: encoding: [0x12,0x81]
+move.b %d1, (%a1)
+
+; CHECK:      move.b %d1, (%sp)
+; CHECK-SAME: encoding: [0x1e,0x81]
+move.b %d1, (%sp)
+
 ; CHECK:      move.b %d7, %d0
 ; CHECK-SAME: encoding: [0x10,0x07]
 move.b %d7, %d0
@@ -39,6 +63,90 @@ move.b %d7, %d1
 ; CHECK-SAME: encoding: [0x1e,0x07]
 move.b %d7, %d7
 
+; CHECK:      move.b %d7, (%a0)
+; CHECK-SAME: encoding: [0x10,0x87]
+move.b %d7, (%a0)
+
+; CHECK:      move.b %d7, (%a1)
+; CHECK-SAME: encoding: [0x12,0x87]
+move.b %d7, (%a1)
+
+; CHECK:      move.b %d7, (%sp)
+; CHECK-SAME: encoding: [0x1e,0x87]
+move.b %d7, (%sp)
+
+; CHECK:      move.b (%a0), %d0
+; CHECK-SAME: encoding: [0x10,0x10]
+move.b (%a0), %d0
+
+; CHECK:      move.b (%a0), %d1
+; CHECK-SAME: encoding: [0x12,0x10]
+move.b (%a0), %d1
+
+; CHECK:      move.b (%a0), %d7
+; CHECK-SAME: encoding: [0x1e,0x10]
+move.b (%a0), %d7
+
+; CHECK:      move.b (%a0), (%a0)
+; CHECK-SAME: encoding: [0x10,0x90]
+move.b (%a0), (%a0)
+
+; CHECK:      move.b (%a0), (%a1)
+; CHECK-SAME: encoding: [0x12,0x90]
+move.b (%a0), (%a1)
+
+; CHECK:      move.b (%a0), (%sp)
+; CHECK-SAME: encoding: [0x1e,0x90]
+move.b (%a0), (%sp)
+
+; CHECK:      move.b (%a1), %d0
+; CHECK-SAME: encoding: [0x10,0x11]
+move.b (%a1), %d0
+
+; CHECK:      move.b (%a1), %d1
+; CHECK-SAME: encoding: [0x12,0x11]
+move.b (%a1), %d1
+
+; CHECK:      move.b (%a1), %d7
+; CHECK-SAME: encoding: [0x1e,0x11]
+move.b (%a1), %d7
+
+; CHECK:      move.b (%a1), (%a0)
+; CHECK-SAME: encoding: [0x10,0x91]
+move.b (%a1), (%a0)
+
+; CHECK:      move.b (%a1), (%a1)
+; CHECK-SAME: encoding: [0x12,0x91]
+move.b (%a1), (%a1)
+
+; CHECK:      move.b (%a1), (%sp)
+; CHECK-SAME: encoding: [0x1e,0x91]
+move.b (%a1), (%sp)
+
+; CHECK:      move.b (%sp), %d0
+; CHECK-SAME: encoding: [0x10,0x17]
+move.b (%sp), %d0
+
+; CHECK:      move.b (%sp), %d1
+; CHECK-SAME: encoding: [0x12,0x17]
+move.b (%sp), %d1
+
+; CHECK:      move.b (%sp), %d7
+; CHECK-SAME: encoding: [0x1e,0x17]
+move.b (%sp), %d7
+
+; CHECK:      move.b (%sp), (%a0)
+; CHECK-SAME: encoding: [0x10,0x97]
+move.b (%sp), (%a0)
+
+; CHECK:      move.b (%sp), (%a1)
+; CHECK-SAME: encoding: [0x12,0x97]
+move.b (%sp), (%a1)
+
+; CHECK:      move.b (%sp), (%sp)
+; CHECK-SAME: encoding: [0x1e,0x97]
+move.b (%sp), (%sp)
+
 ; CHECK:      move.w %d0, %d0
 ; CHECK-SAME: encoding: [0x30,0x00]
 move.w %d0, %d0
@@ -51,6 +159,18 @@ move.w %d0, %d1
 ; CHECK-SAME: encoding: [0x3e,0x00]
 move.w %d0, %d7
 
+; CHECK:      move.w %d0, (%a0)
+; CHECK-SAME: encoding: [0x30,0x80]
+move.w %d0, (%a0)
+
+; CHECK:      move.w %d0, (%a1)
+; CHECK-SAME: encoding: [0x32,0x80]
+move.w %d0, (%a1)
+
+; CHECK:      move.w %d0, (%sp)
+; CHECK-SAME: encoding: [0x3e,0x80]
+move.w %d0, (%sp)
+
 ; CHECK:      move.w %d1, %d0
 ; CHECK-SAME: encoding: [0x30,0x01]
 move.w %d1, %d0
@@ -63,6 +183,18 @@ move.w %d1, %d1
 ; CHECK-SAME: encoding: [0x3e,0x01]
 move.w %d1, %d7
 
+; CHECK:      move.w %d1, (%a0)
+; CHECK-SAME: encoding: [0x30,0x81]
+move.w %d1, (%a0)
+
+; CHECK:      move.w %d1, (%a1)
+; CHECK-SAME: encoding: [0x32,0x81]
+move.w %d1, (%a1)
+
+; CHECK:      move.w %d1, (%sp)
+; CHECK-SAME: encoding: [0x3e,0x81]
+move.w %d1, (%sp)
+
 ; CHECK:      move.w %d7, %d0
 ; CHECK-SAME: encoding: [0x30,0x07]
 move.w %d7, %d0
@@ -75,6 +207,18 @@ move.w %d7, %d1
 ; CHECK-SAME: encoding: [0x3e,0x07]
 move.w %d7, %d7
 
+; CHECK:      move.w %d7, (%a0)
+; CHECK-SAME: encoding: [0x30,0x87]
+move.w %d7, (%a0)
+
+; CHECK:      move.w %d7, (%a1)
+; CHECK-SAME: encoding: [0x32,0x87]
+move.w %d7, (%a1)
+
+; CHECK:      move.w %d7, (%sp)
+; CHECK-SAME: encoding: [0x3e,0x87]
+move.w %d7, (%sp)
+
 ; CHECK:      move.w %a0, %d0
 ; CHECK-SAME: encoding: [0x30,0x08]
 move.w %a0, %d0
@@ -87,6 +231,18 @@ move.w %a0, %d1
 ; CHECK-SAME: encoding: [0x3e,0x08]
 move.w %a0, %d7
 
+; CHECK:      move.w %a0, (%a0)
+; CHECK-SAME: encoding: [0x30,0x88]
+move.w %a0, (%a0)
+
+; CHECK:      move.w %a0, (%a1)
+; CHECK-SAME: encoding: [0x32,0x88]
+move.w %a0, (%a1)
+
+; CHECK:      move.w %a0, (%sp)
+; CHECK-SAME: encoding: [0x3e,0x88]
+move.w %a0, (%sp)
+
 ; CHECK:      move.w %a1, %d0
 ; CHECK-SAME: encoding: [0x30,0x09]
 move.w %a1, %d0
@@ -99,6 +255,18 @@ move.w %a1, %d1
 ; CHECK-SAME: encoding: [0x3e,0x09]
 move.w %a1, %d7
 
+; CHECK:      move.w %a1, (%a0)
+; CHECK-SAME: encoding: [0x30,0x89]
+move.w %a1, (%a0)
+
+; CHECK:      move.w %a1, (%a1)
+; CHECK-SAME: encoding: [0x32,0x89]
+move.w %a1, (%a1)
+
+; CHECK:      move.w %a1, (%sp)
+; CHECK-SAME: encoding: [0x3e,0x89]
+move.w %a1, (%sp)
+
 ; CHECK:      move.w %sp, %d0
 ; CHECK-SAME: encoding: [0x30,0x0f]
 move.w %sp, %d0
@@ -111,6 +279,90 @@ move.w %sp, %d1
 ; CHECK-SAME: encoding: [0x3e,0x0f]
 move.w %sp, %d7
 
+; CHECK:      move.w %sp, (%a0)
+; CHECK-SAME: encoding: [0x30,0x8f]
+move.w %sp, (%a0)
+
+; CHECK:      move.w %sp, (%a1)
+; CHECK-SAME: encoding: [0x32,0x8f]
+move.w %sp, (%a1)
+
+; CHECK:      move.w %sp, (%sp)
+; CHECK-SAME: encoding: [0x3e,0x8f]
+move.w %sp, (%sp)
+
+; CHECK:      move.w (%a0), %d0
+; CHECK-SAME: encoding: [0x30,0x10]
+move.w (%a0), %d0
+
+; CHECK:      move.w (%a0), %d1
+; CHECK-SAME: encoding: [0x32,0x10]
+move.w (%a0), %d1
+
+; CHECK:      move.w (%a0), %d7
+; CHECK-SAME: encoding: [0x3e,0x10]
+move.w (%a0), %d7
+
+; CHECK:      move.w (%a0), (%a0)
+; CHECK-SAME: encoding: [0x30,0x90]
+move.w (%a0), (%a0)
+
+; CHECK:      move.w (%a0), (%a1)
+; CHECK-SAME: encoding: [0x32,0x90]
+move.w (%a0), (%a1)
+
+; CHECK:      move.w (%a0), (%sp)
+; CHECK-SAME: encoding: [0x3e,0x90]
+move.w (%a0), (%sp)
+
+; CHECK:      move.w (%a1), %d0
+; CHECK-SAME: encoding: [0x30,0x11]
+move.w (%a1), %d0
+
+; CHECK:      move.w (%a1), %d1
+; CHECK-SAME: encoding: [0x32,0x11]
+move.w (%a1), %d1
+
+; CHECK:      move.w (%a1), %d7
+; CHECK-SAME: encoding: [0x3e,0x11]
+move.w (%a1), %d7
+
+; CHECK:      move.w (%a1), (%a0)
+; CHECK-SAME: encoding: [0x30,0x91]
+move.w (%a1), (%a0)
+
+; CHECK:      move.w (%a1), (%a1)
+; CHECK-SAME: encoding: [0x32,0x91]
+move.w (%a1), (%a1)
+
+; CHECK:      move.w (%a1), (%sp)
+; CHECK-SAME: encoding: [0x3e,0x91]
+move.w (%a1), (%sp)
+
+; CHECK:      move.w (%sp), %d0
+; CHECK-SAME: encoding: [0x30,0x17]
+move.w (%sp), %d0
+
+; CHECK:      move.w (%sp), %d1
+; CHECK-SAME: encoding: [0x32,0x17]
+move.w (%sp), %d1
+
+; CHECK:      move.w (%sp), %d7
+; CHECK-SAME: encoding: [0x3e,0x17]
+move.w (%sp), %d7
+
+; CHECK:      move.w (%sp), (%a0)
+; CHECK-SAME: encoding: [0x30,0x97]
+move.w (%sp), (%a0)
+
+; CHECK:      move.w (%sp), (%a1)
+; CHECK-SAME: encoding: [0x32,0x97]
+move.w (%sp), (%a1)
+
+; CHECK:      move.w (%sp), (%sp)
+; CHECK-SAME: encoding: [0x3e,0x97]
+move.w (%sp), (%sp)
+
 ; CHECK:      move.l %d0, %d0
 ; CHECK-SAME: encoding: [0x20,0x00]
 move.l %d0, %d0
@@ -123,6 +375,18 @@ move.l %d0, %d1
 ; CHECK-SAME: encoding: [0x2e,0x00]
 move.l %d0, %d7
 
+; CHECK:      move.l %d0, (%a0)
+; CHECK-SAME: encoding: [0x20,0x80]
+move.l %d0, (%a0)
+
+; CHECK:      move.l %d0, (%a1)
+; CHECK-SAME: encoding: [0x22,0x80]
+move.l %d0, (%a1)
+
+; CHECK:      move.l %d0, (%sp)
+; CHECK-SAME: encoding: [0x2e,0x80]
+move.l %d0, (%sp)
+
 ; CHECK:      move.l %d1, %d0
 ; CHECK-SAME: encoding: [0x20,0x01]
 move.l %d1, %d0
@@ -135,6 +399,18 @@ move.l %d1, %d1
 ; CHECK-SAME: encoding: [0x2e,0x01]
 move.l %d1, %d7
 
+; CHECK:      move.l %d1, (%a0)
+; CHECK-SAME: encoding: [0x20,0x81]
+move.l %d1, (%a0)
+
+; CHECK:      move.l %d1, (%a1)
+; CHECK-SAME: encoding: [0x22,0x81]
+move.l %d1, (%a1)
+
+; CHECK:      move.l %d1, (%sp)
+; CHECK-SAME: encoding: [0x2e,0x81]
+move.l %d1, (%sp)
+
 ; CHECK:      move.l %d7, %d0
 ; CHECK-SAME: encoding: [0x20,0x07]
 move.l %d7, %d0
@@ -147,6 +423,18 @@ move.l %d7, %d1
 ; CHECK-SAME: encoding: [0x2e,0x07]
 move.l %d7, %d7
 
+; CHECK:      move.l %d7, (%a0)
+; CHECK-SAME: encoding: [0x20,0x87]
+move.l %d7, (%a0)
+
+; CHECK:      move.l %d7, (%a1)
+; CHECK-SAME: encoding: [0x22,0x87]
+move.l %d7, (%a1)
+
+; CHECK:      move.l %d7, (%sp)
+; CHECK-SAME: encoding: [0x2e,0x87]
+move.l %d7, (%sp)
+
 ; CHECK:      move.l %a0, %d0
 ; CHECK-SAME: encoding: [0x20,0x08]
 move.l %a0, %d0
@@ -159,6 +447,18 @@ move.l %a0, %d1
 ; CHECK-SAME: encoding: [0x2e,0x08]
 move.l %a0, %d7
 
+; CHECK:      move.l %a0, (%a0)
+; CHECK-SAME: encoding: [0x20,0x88]
+move.l %a0, (%a0)
+
+; CHECK:      move.l %a0, (%a1)
+; CHECK-SAME: encoding: [0x22,0x88]
+move.l %a0, (%a1)
+
+; CHECK:      move.l %a0, (%sp)
+; CHECK-SAME: encoding: [0x2e,0x88]
+move.l %a0, (%sp)
+
 ; CHECK:      move.l %a1, %d0
 ; CHECK-SAME: encoding: [0x20,0x09]
 move.l %a1, %d0
@@ -171,6 +471,18 @@ move.l %a1, %d1
 ; CHECK-SAME: encoding: [0x2e,0x09]
 move.l %a1, %d7
 
+; CHECK:      move.l %a1, (%a0)
+; CHECK-SAME: encoding: [0x20,0x89]
+move.l %a1, (%a0)
+
+; CHECK:      move.l %a1, (%a1)
+; CHECK-SAME: encoding: [0x22,0x89]
+move.l %a1, (%a1)
+
+; CHECK:      move.l %a1, (%sp)
+; CHECK-SAME: encoding: [0x2e,0x89]
+move.l %a1, (%sp)
+
 ; CHECK:      move.l %sp, %d0
 ; CHECK-SAME: encoding: [0x20,0x0f]
 move.l %sp, %d0
@@ -182,3 +494,87 @@ move.l %sp, %d1
 ; CHECK:      move.l %sp, %d7
 ; CHECK-SAME: encoding: [0x2e,0x0f]
 move.l %sp, %d7
+
+; CHECK:      move.l %sp, (%a0)
+; CHECK-SAME: encoding: [0x20,0x8f]
+move.l %sp, (%a0)
+
+; CHECK:      move.l %sp, (%a1)
+; CHECK-SAME: encoding: [0x22,0x8f]
+move.l %sp, (%a1)
+
+; CHECK:      move.l %sp, (%sp)
+; CHECK-SAME: encoding: [0x2e,0x8f]
+move.l %sp, (%sp)
+
+; CHECK:      move.l (%a0), %d0
+; CHECK-SAME: encoding: [0x20,0x10]
+move.l (%a0), %d0
+
+; CHECK:      move.l (%a0), %d1
+; CHECK-SAME: encoding: [0x22,0x10]
+move.l (%a0), %d1
+
+; CHECK:      move.l (%a0), %d7
+; CHECK-SAME: encoding: [0x2e,0x10]
+move.l (%a0), %d7
+
+; CHECK:      move.l (%a0), (%a0)
+; CHECK-SAME: encoding: [0x20,0x90]
+move.l (%a0), (%a0)
+
+; CHECK:      move.l (%a0), (%a1)
+; CHECK-SAME: encoding: [0x22,0x90]
+move.l (%a0), (%a1)
+
+; CHECK:      move.l (%a0), (%sp)
+; CHECK-SAME: encoding: [0x2e,0x90]
+move.l (%a0), (%sp)
+
+; CHECK:      move.l (%a1), %d0
+; CHECK-SAME: encoding: [0x20,0x11]
+move.l (%a1), %d0
+
+; CHECK:      move.l (%a1), %d1
+; CHECK-SAME: encoding: [0x22,0x11]
+move.l (%a1), %d1
+
+; CHECK:      move.l (%a1), %d7
+; CHECK-SAME: encoding: [0x2e,0x11]
+move.l (%a1), %d7
+
+; CHECK:      move.l (%a1), (%a0)
+; CHECK-SAME: encoding: [0x20,0x91]
+move.l (%a1), (%a0)
+
+; CHECK:      move.l (%a1), (%a1)
+; CHECK-SAME: encoding: [0x22,0x91]
+move.l (%a1), (%a1)
+
+; CHECK:      move.l (%a1), (%sp)
+; CHECK-SAME: encoding: [0x2e,0x91]
+move.l (%a1), (%sp)
+
+; CHECK:      move.l (%sp), %d0
+; CHECK-SAME: encoding: [0x20,0x17]
+move.l (%sp), %d0
+
+; CHECK:      move.l (%sp), %d1
+; CHECK-SAME: encoding: [0x22,0x17]
+move.l (%sp), %d1
+
+; CHECK:      move.l (%sp), %d7
+; CHECK-SAME: encoding: [0x2e,0x17]
+move.l (%sp), %d7
+
+; CHECK:      move.l (%sp), (%a0)
+; CHECK-SAME: encoding: [0x20,0x97]
+move.l (%sp), (%a0)
+
+; CHECK:      move.l (%sp), (%a1)
+; CHECK-SAME: encoding: [0x22,0x97]
+move.l (%sp), (%a1)
+
+; CHECK:      move.l (%sp), (%sp)
+; CHECK-SAME: encoding: [0x2e,0x97]
+move.l (%sp), (%sp)
diff --git a/llvm/test/MC/M68k/generate_tests.py b/llvm/test/MC/M68k/generate_tests.py
index 13a1dd28e06ce..d4d8d34863c7c 100755
--- a/llvm/test/MC/M68k/generate_tests.py
+++ b/llvm/test/MC/M68k/generate_tests.py
@@ -164,7 +164,7 @@ class DataRegisterDirect(EffectiveAddressingMode):
 
     register: DataRegister
 
-    def permutations() -> Generator["DataRegisterDirect", None, None]:
+    def permutations() -> Generator[EffectiveAddressingMode, None, None]:
         for register in DataRegister.permutations():
             yield DataRegisterDirect(register)
 
@@ -186,7 +186,7 @@ class AddressRegisterDirect(EffectiveAddressingMode):
 
     register: AddressRegister
 
-    def permutations() -> Generator["AddressRegisterDirect", None, None]:
+    def permutations() -> Generator[EffectiveAddressingMode, None, None]:
         for register in AddressRegister.permutations():
             yield AddressRegisterDirect(register)
 
@@ -200,6 +200,28 @@ def registerField(self) -> int:
         return self.register
 
 
+# https://m680x0.github.io/ref/M68000PM_AD_Rev_1_Programmers_Reference_Manual_1992.html#pf2e
+# (An)
+ at dataclass
+class AddressRegisterIndirect(EffectiveAddressingMode):
+    """Represents the contents of memory, with address in a particular address register."""
+
+    register: AddressRegister
+
+    def permutations() -> Generator[EffectiveAddressingMode, None, None]:
+        for register in AddressRegister.permutations():
+            yield AddressRegisterIndirect(register)
+
+    def asm(self) -> str:
+        return f"({self.register.asm()})"
+
+    def modeField(self) -> int:
+        return 0b010
+
+    def registerField(self) -> int:
+        return self.register
+
+
 # Instructions
 
 
@@ -233,8 +255,12 @@ class MOVE(Instruction):
     source: EffectiveAddressingMode
 
     def permutations() -> Generator["MOVE", None, None]:
-        sourceModes = [DataRegisterDirect, AddressRegisterDirect]
-        destinationModes = [DataRegisterDirect]
+        sourceModes = [
+            DataRegisterDirect,
+            AddressRegisterDirect,
+            AddressRegisterIndirect,
+        ]
+        destinationModes = [DataRegisterDirect, AddressRegisterIndirect]
 
         for size in [Byte, Word, Long]:
             for sourceMode in sourceModes:



More information about the llvm-commits mailing list