aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--binutils/testsuite/ChangeLog6
-rw-r--r--binutils/testsuite/binutils-all/m68k/movem.s2
-rw-r--r--binutils/testsuite/binutils-all/m68k/objdump.exp53
-rw-r--r--include/opcode/ChangeLog4
-rw-r--r--include/opcode/m68k.h2
-rw-r--r--opcodes/ChangeLog4
-rw-r--r--opcodes/m68k-dis.c98
7 files changed, 160 insertions, 9 deletions
diff --git a/binutils/testsuite/ChangeLog b/binutils/testsuite/ChangeLog
index 9339ec0..8f3473a 100644
--- a/binutils/testsuite/ChangeLog
+++ b/binutils/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2004-07-09 Andreas Schwab <schwab@suse.de>
+
+ * binutils-all/m68k/movem.s: New file.
+
+ * binutils-all/m68k/objdump.exp: New file.
+
2004-05-15 Nick Clifton <nickc@redhat.com>
* binutils-all/readelf.ss: Allow for ARM mapping symbols.
diff --git a/binutils/testsuite/binutils-all/m68k/movem.s b/binutils/testsuite/binutils-all/m68k/movem.s
new file mode 100644
index 0000000..b3718d5
--- /dev/null
+++ b/binutils/testsuite/binutils-all/m68k/movem.s
@@ -0,0 +1,2 @@
+ movem.l %d0-%d3,-(%sp)
+ movem.l %d0-%d3,(%sp)
diff --git a/binutils/testsuite/binutils-all/m68k/objdump.exp b/binutils/testsuite/binutils-all/m68k/objdump.exp
new file mode 100644
index 0000000..9db775e
--- /dev/null
+++ b/binutils/testsuite/binutils-all/m68k/objdump.exp
@@ -0,0 +1,53 @@
+# Copyright 2004
+# Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+if {![istarget "m68*-*-*"] || [istarget "m68h*-*-*"] || [istarget "m681*-*-*"]} then {
+ return
+}
+
+if {[which $OBJDUMP] == 0} then {
+ perror "$OBJDUMP does not exist"
+ return
+}
+
+send_user "Version [binutil_version $OBJDUMP]"
+
+###########################
+# Set up the test of movem.s
+###########################
+
+if {![binutils_assemble $srcdir/$subdir/movem.s tmpdir/movem.o]} then {
+ return
+}
+
+if [is_remote host] {
+ set objfile [remote_download host tmpdir/movem.o]
+} else {
+ set objfile tmpdir/movem.o
+}
+
+# Make sure that the movem is correctly decoded.
+
+set got [binutils_run $OBJDUMP "$OBJDUMPFLAGS --disassemble $objfile"]
+
+set want "moveml %d0-%d3,%sp@-.*moveml %d0-%d3,%sp@\[\r\n\]"
+
+if [regexp $want $got] then {
+ pass "movem test"
+} else {
+ fail "movem test"
+}
diff --git a/include/opcode/ChangeLog b/include/opcode/ChangeLog
index da9505f..bd6f448 100644
--- a/include/opcode/ChangeLog
+++ b/include/opcode/ChangeLog
@@ -1,3 +1,7 @@
+2004-07-09 Andreas Schwab <schwab@suse.de>
+
+ * m68k.h: Fix comment.
+
2004-07-07 Tomer Levi <Tomer.Levi@nsc.com>
* crx.h: New file.
diff --git a/include/opcode/m68k.h b/include/opcode/m68k.h
index 49bd8f9..014495b 100644
--- a/include/opcode/m68k.h
+++ b/include/opcode/m68k.h
@@ -219,7 +219,7 @@ struct m68k_opcode_alias
! control (modes 2,5,6,7.0-3)
(not 0,1,3,4,7.4)
& alterable control (modes 2,5,6,7.0,7.1)
- (not 0,1,7.2-4)
+ (not 0,1,3,4,7.2-4)
$ alterable data (modes 0,2-6,7.0,7.1)
(not 1,7.2-4)
? alterable control, or data register (modes 0,2,5,6,7.0,7.1)
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index d86c615..94a54aa 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -1,3 +1,7 @@
+2004-07-09 Andreas Schwab <schwab@suse.de>
+
+ * m68k-dis.c (m68k_valid_ea): Check validity of all codes.
+
2004-07-07 Tomer Levi <Tomer.Levi@nsc.com>
* Makefile.am (CFILES): Add crx-dis.c, crx-opc.c.
diff --git a/opcodes/m68k-dis.c b/opcodes/m68k-dis.c
index a3d6d2b..18489e3 100644
--- a/opcodes/m68k-dis.c
+++ b/opcodes/m68k-dis.c
@@ -826,7 +826,7 @@ print_insn_arg (d, buffer, p0, addr, info)
val = fetch_arg (buffer, 's', 6, info);
/* If the <ea> is invalid for *d, then reject this match. */
- if (m68k_valid_ea (*d, val) == FALSE)
+ if (!m68k_valid_ea (*d, val))
return -1;
/* Get register number assuming address register. */
@@ -1127,19 +1127,101 @@ print_insn_arg (d, buffer, p0, addr, info)
/* Check if an EA is valid for a particular code. This is required
for the EMAC instructions since the type of source address determines
if it is a EMAC-load instruciton if the EA is mode 2-5, otherwise it
- is a non-load EMAC instruction and the bits mean register Ry. */
+ is a non-load EMAC instruction and the bits mean register Ry.
+ A similar case exists for the movem instructions where the register
+ mask is interpreted differently for different EAs. */
static bfd_boolean
m68k_valid_ea (char code, int val)
{
- int mode;
+ int mode, mask;
+#define M(n0,n1,n2,n3,n4,n5,n6,n70,n71,n72,n73,n74) \
+ (n0 | n1 << 1 | n2 << 2 | n3 << 3 | n4 << 4 | n5 << 5 | n6 << 6 \
+ | n70 << 7 | n71 << 8 | n72 << 9 | n73 << 10 | n74 << 11)
- mode = (val >> 3) & 7;
- if (code == '4')
- if (!(mode >= 2 && mode <= 5))
- return FALSE;
+ switch (code)
+ {
+ case '*':
+ mask = M (1,1,1,1,1,1,1,1,1,1,1,1);
+ break;
+ case '~':
+ mask = M (0,0,1,1,1,1,1,1,1,0,0,0);
+ break;
+ case '%':
+ mask = M (1,1,1,1,1,1,1,1,1,0,0,0);
+ break;
+ case ';':
+ mask = M (1,0,1,1,1,1,1,1,1,1,1,1);
+ break;
+ case '@':
+ mask = M (1,0,1,1,1,1,1,1,1,1,1,0);
+ break;
+ case '!':
+ mask = M (0,0,1,0,0,1,1,1,1,1,1,0);
+ break;
+ case '&':
+ mask = M (0,0,1,0,0,1,1,1,1,0,0,0);
+ break;
+ case '$':
+ mask = M (1,0,1,1,1,1,1,1,1,0,0,0);
+ break;
+ case '?':
+ mask = M (0,1,0,0,1,1,1,1,1,0,0,0);
+ break;
+ case '/':
+ mask = M (1,0,1,0,0,1,1,1,1,1,1,0);
+ break;
+ case '|':
+ mask = M (0,0,1,0,0,1,1,1,1,1,1,0);
+ break;
+ case '>':
+ mask = M (0,0,1,0,1,1,1,1,1,1,1,0);
+ break;
+ case '<':
+ mask = M (0,0,1,1,0,1,1,1,1,0,0,0);
+ break;
+ case 'm':
+ mask = M (1,1,1,1,1,0,0,0,0,0,0,0);
+ break;
+ case 'n':
+ mask = M (0,0,0,0,0,1,0,0,0,1,0,0);
+ break;
+ case 'o':
+ mask = M (0,0,0,0,0,0,1,1,1,0,1,1);
+ break;
+ case 'p':
+ mask = M (1,1,1,1,1,1,0,0,0,0,0,0);
+ break;
+ case 'q':
+ mask = M (1,0,1,1,1,1,0,0,0,0,0,0);
+ break;
+ case 'v':
+ mask = M (1,0,1,1,1,1,0,1,1,0,0,0);
+ break;
+ case 'b':
+ mask = M (1,0,1,1,1,1,0,0,0,1,0,0);
+ break;
+ case 'w':
+ mask = M (0,0,1,1,1,1,0,0,0,1,0,0);
+ break;
+ case 'y':
+ mask = M (0,0,1,0,0,1,0,0,0,0,0,0);
+ break;
+ case 'z':
+ mask = M (0,0,1,0,0,1,0,0,0,1,0,0);
+ break;
+ case '4':
+ mask = M (0,0,1,1,1,1,0,0,0,0,0,0);
+ break;
+ default:
+ abort ();
+ }
+#undef M
- return TRUE;
+ mode = (val >> 3) & 7;
+ if (mode == 7)
+ mode += val & 7;
+ return (mask & (1 << mode)) != 0;
}
/* Fetch BITS bits from a position in the instruction specified by CODE.