aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephane Carrez <stcarrez@nerim.fr>2000-11-26 21:18:15 +0000
committerStephane Carrez <stcarrez@nerim.fr>2000-11-26 21:18:15 +0000
commitae3e85dd270c1dba87ac81cd431ebc6a44a28e44 (patch)
tree3a962511d10f783ae1fa82202a25ae8b088f396e
parent639aa4f72f2d6abfb62c46d24ac699d9b52724b6 (diff)
downloadgdb-ae3e85dd270c1dba87ac81cd431ebc6a44a28e44.zip
gdb-ae3e85dd270c1dba87ac81cd431ebc6a44a28e44.tar.gz
gdb-ae3e85dd270c1dba87ac81cd431ebc6a44a28e44.tar.bz2
Fix movw/movb operands for 68HC12
-rw-r--r--gas/ChangeLog6
-rw-r--r--gas/config/tc-m68hc11.c31
-rw-r--r--gas/testsuite/ChangeLog5
-rw-r--r--gas/testsuite/gas/m68hc11/opers12.d13
-rw-r--r--gas/testsuite/gas/m68hc11/opers12.s10
5 files changed, 57 insertions, 8 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 5ab54b2..19a9449 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,9 @@
+2000-11-26 Stephane Carrez <Stephane.Carrez@worldnet.fr>
+
+ * config/tc-m68hc11.c (build_indexed_byte): Print the offset in
+ the error message.
+ (get_operand): Fix analysis for movw/movb instructions.
+
2000-11-24 Nick Clifton <nickc@redhat.com>
* configure.in (xscale-elf): Add target.
diff --git a/gas/config/tc-m68hc11.c b/gas/config/tc-m68hc11.c
index eabf8ef..3901ad0 100644
--- a/gas/config/tc-m68hc11.c
+++ b/gas/config/tc-m68hc11.c
@@ -1073,6 +1073,8 @@ get_operand (oper, which, opmode)
if (*p == ',')
{
+ int possible_mode = M6811_OP_NONE;
+ char *old_input_line;
p++;
/* 68HC12 pre increment or decrement. */
@@ -1080,23 +1082,37 @@ get_operand (oper, which, opmode)
{
if (*p == '-')
{
- mode = M6812_PRE_DEC;
+ possible_mode = M6812_PRE_DEC;
p++;
- if (current_architecture & cpu6811)
- as_bad (_("Pre-decrement mode is not valid for 68HC11"));
}
else if (*p == '+')
{
- mode = M6812_PRE_INC;
+ possible_mode = M6812_PRE_INC;
p++;
- if (current_architecture & cpu6811)
- as_bad (_("Pre-increment mode is not valid for 68HC11"));
}
p = skip_whites (p);
}
+ old_input_line = input_line_pointer;
input_line_pointer = p;
reg = register_name ();
+ /* Backtrack if we have a valid constant expression and
+ it does not correspond to the offset of the 68HC12 indexed
+ addressing mode (as in N,x). */
+ if (reg == REG_NONE && mode == M6811_OP_NONE
+ && possible_mode != M6811_OP_NONE)
+ {
+ oper->mode = M6811_OP_IND16 | M6811_OP_JUMP_REL;
+ input_line_pointer = skip_whites (old_input_line);
+ return 1;
+ }
+
+ if (possible_mode != M6811_OP_NONE)
+ mode = possible_mode;
+
+ if ((current_architecture & cpu6811)
+ && possible_mode != M6811_OP_NONE)
+ as_bad (_("Pre-increment mode is not valid for 68HC11"));
/* Backtrack. */
if (which == 0 && opmode & M6812_OP_IDX_P2
&& reg != REG_X && reg != REG_Y
@@ -1700,7 +1716,8 @@ build_indexed_byte (op, format, move_insn)
if (move_insn && !(val >= -16 && val <= 15))
{
- as_bad (_("Offset out of 5-bit range for movw/movb insn."));
+ as_bad (_("Offset out of 5-bit range for movw/movb insn: %ld."),
+ val);
return -1;
}
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index e5527d5..4bb3ecc 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2000-11-26 Stephane Carrez <Stephane.Carrez@worldnet.fr>
+
+ * gas/m68hc11/opers12.s: New test for movw operands.
+ * gas/m68hc11/opers12.d: Likewise.
+
2000-11-24 Nick Clifton <nickc@redhat.com>
* arm.exp: Run tests for xscale as well as arm.
diff --git a/gas/testsuite/gas/m68hc11/opers12.d b/gas/testsuite/gas/m68hc11/opers12.d
index fec02eb..2fbd3dd 100644
--- a/gas/testsuite/gas/m68hc11/opers12.d
+++ b/gas/testsuite/gas/m68hc11/opers12.d
@@ -67,4 +67,15 @@ Disassembly of section .text:
0+0b6 <L1\+0xad> trap #64
0+0b8 <L1\+0xaf> trap #128
0+0ba <L1\+0xb1> trap #255
-0+0bc <L2> rts
+0+0bc <L2> movw 1,X, 2,X
+0+0c0 <L2\+0x4> movw 0+0ffff <L2\+0xff43>, 0000ffff <L2\+0xff43>
+0+0c6 <L2\+0xa> movw 0+0ffff <L2\+0xff43>, 1,X
+0+0cb <L2\+0xf> movw #0+0ffff <L2\+0xff43>, 1,X
+0+0d0 <L2\+0x14> movw 0+03 <start\+0x3>, 0+08 <start\+0x8>
+0+0d6 <L2\+0x1a> movw #0+03 <start\+0x3>, 0+03 <start\+0x3>
+0+0dc <L2\+0x20> movw #0+03 <start\+0x3>, 1,X
+0+0e1 <L2\+0x25> movw 0+03 <start\+0x3>, 1,X
+0+0e6 <L2\+0x2a> movw 0+03 <start\+0x3>, 2,X
+0+0eb <L2\+0x2f> movw 0+04 <start\+0x4>, -2,X
+0+0f0 <L2\+0x34> rts
+
diff --git a/gas/testsuite/gas/m68hc11/opers12.s b/gas/testsuite/gas/m68hc11/opers12.s
index dcf53d1..b4a9c24 100644
--- a/gas/testsuite/gas/m68hc11/opers12.s
+++ b/gas/testsuite/gas/m68hc11/opers12.s
@@ -69,4 +69,14 @@ L1: ldy ,x
trap #0x80
trap #255
L2:
+ movw 1,x,2,x
+ movw -1,-1
+ movw -1,1,x
+ movw #-1,1,x
+ movw 3,8
+ movw #3,3
+ movw #3,1,x
+ movw 3,1,x
+ movw 3,+2,x
+ movw 4,-2,x
rts