From 580b9172d22e2bb4fb7900000bc9897e04b295e0 Mon Sep 17 00:00:00 2001
From: Nick Clifton <nickc@redhat.com>
Date: Fri, 28 May 2004 07:55:21 +0000
Subject: [PATCH] Convert mode 5 addressing with zero offset into mode 2
 addressing to save a word.

---
 gas/ChangeLog                  |  5 +++++
 gas/config/tc-m68k.c           | 13 +++++++++++++
 gas/testsuite/ChangeLog        |  7 +++++++
 gas/testsuite/gas/m68k/all.exp |  1 +
 gas/testsuite/gas/m68k/mode5.d | 12 ++++++++++++
 gas/testsuite/gas/m68k/mode5.s |  6 ++++++
 6 files changed, 44 insertions(+)
 create mode 100644 gas/testsuite/gas/m68k/mode5.d
 create mode 100644 gas/testsuite/gas/m68k/mode5.s

diff --git a/gas/ChangeLog b/gas/ChangeLog
index 66f396a66a6..2e5f6f27b5a 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,8 @@
+2004-05-28  Peter Barada <peter@the-baradas.com>
+
+	* config/gc-m68k.c(m68k_ip): Convert mode 5 addressing
+	with zero offset into mode 2 addressing to save a word.
+
 2004-05-27  H.J. Lu  <hongjiu.lu@intel.com>
 
 	* config/tc-ia64.c (ar_is_in_integer_unit): Removed.
diff --git a/gas/config/tc-m68k.c b/gas/config/tc-m68k.c
index 2a5b47975e2..69be532fd6c 100644
--- a/gas/config/tc-m68k.c
+++ b/gas/config/tc-m68k.c
@@ -2261,6 +2261,19 @@ m68k_ip (instring)
 
 	      nextword = get_num (&opP->disp, 90);
 
+	      /* Convert mode 5 addressing with a zero offset into
+		 mode 2 addressing to reduce the instruction size by a
+		 word.  */
+	      if (! isvar (&opP->disp)
+		  && (nextword == 0)
+		  && (opP->disp.size == SIZE_UNSPEC)
+		  && (opP->reg >= ADDR0)
+		  && (opP->reg <= ADDR7))
+		{
+		  tmpreg = 0x10 + opP->reg - ADDR; /* 2.areg */
+		  break;
+		}
+
 	      if (opP->reg == PC
 		  && ! isvar (&opP->disp)
 		  && m68k_abspcadd)
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index c26d461ab6f..76c10c9dd10 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2004-05-28  Peter Barada <peter@the-baradas.com>
+
+	* gas/m68k/mode5.s: New test file.  Checks conversion of mode 5
+	addressing with zero offset into mode 2 addressing.
+	* gas/m68k/mode5.d: New file: Expected disassmbly.
+	* gas/m68k/all.exp: Run new test.
+
 2004-05-27  H.J. Lu  <hongjiu.lu@intel.com>
 
 	* gas/ia64/regs.d: Updated.
diff --git a/gas/testsuite/gas/m68k/all.exp b/gas/testsuite/gas/m68k/all.exp
index c98179cbe9f..0eb0fd89c5b 100644
--- a/gas/testsuite/gas/m68k/all.exp
+++ b/gas/testsuite/gas/m68k/all.exp
@@ -35,6 +35,7 @@ if [istarget m68*-*-*] then {
     run_dump_test link
     run_dump_test fmoveml
     run_dump_test mcf-mov3q
+    run_dump_test mode5
     run_dump_test mcf-mac
     run_dump_test mcf-emac
 
diff --git a/gas/testsuite/gas/m68k/mode5.d b/gas/testsuite/gas/m68k/mode5.d
new file mode 100644
index 00000000000..71805a23076
--- /dev/null
+++ b/gas/testsuite/gas/m68k/mode5.d
@@ -0,0 +1,12 @@
+#name: mode5
+#objdump: -d
+#as: 
+
+.*:     file format .*
+
+Disassembly of section .text:
+
+00000000 <.text>:
+   0:	2213           	movel %a3@,%d1
+   2:	2882           	movel %d2,%a4@
+   4:	2295           	movel %a5@,%a1@
diff --git a/gas/testsuite/gas/m68k/mode5.s b/gas/testsuite/gas/m68k/mode5.s
new file mode 100644
index 00000000000..6f7cd006f14
--- /dev/null
+++ b/gas/testsuite/gas/m68k/mode5.s
@@ -0,0 +1,6 @@
+
+	| Test conversion of mode 5 addressing with a zero offset into mode 2.
+	.text
+	move.l 0(%a3),%d1
+	move.l %d2,0(%a4)
+	move.l 0(%a5),0(%a1)