diff options
author | Nick Clifton <nickc@redhat.com> | 2001-06-12 10:35:24 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2001-06-12 10:35:24 +0000 |
commit | e1f44d1052d735fa63401ab4dc7f3cb1070f8223 (patch) | |
tree | df7feda7179eca662fd1600cc4d11d64b6ca9b63 /gas | |
parent | 3971ce954fddbcb8154267ebc18a34c5967ff17b (diff) | |
download | gdb-e1f44d1052d735fa63401ab4dc7f3cb1070f8223.zip gdb-e1f44d1052d735fa63401ab4dc7f3cb1070f8223.tar.gz gdb-e1f44d1052d735fa63401ab4dc7f3cb1070f8223.tar.bz2 |
Fix m68k/mri mode problems.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 19 | ||||
-rw-r--r-- | gas/config/tc-m68k.c | 94 | ||||
-rw-r--r-- | gas/macro.c | 38 | ||||
-rw-r--r-- | gas/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gas/testsuite/gas/mri/for.d | 2 | ||||
-rw-r--r-- | gas/testsuite/gas/mri/if.d | 10 | ||||
-rw-r--r-- | gas/testsuite/gas/mri/repeat.d | 2 | ||||
-rw-r--r-- | gas/testsuite/gas/mri/while.d | 2 |
8 files changed, 132 insertions, 42 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index e5db5e1..5e50df7 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,22 @@ +2001-06-12 Peter Jakubek <pjak@snafu.de> + + * gas/config/tc-m68k.c (parse_mri_control_operand): Fix handling + of AND/OR. + (swap_mri_condition): Add HS (alias fo CC) and LO (alias for CS). + (reverse_mri_condition): Likewise. + (swap_mri_condition): Issue warning for conditions that can not be + swapped. + (build_mri_control_operand): Fix order of operands (swapped). + (build_mri_control_operand): Allow upper case extension in structured + control directives. + (s_mri_else): Likewise. + (s_mri_next): Likewise. + (s_mri_for): Likewise. + (s_mri_if): Fix handling comment ('*') in mri mode. + (s_mri_while): Likewise. + * gas/macro.c (macro_expand): Allow macro invocation with empty + extension. + 2001-06-12 Nick Clifton <nickc@cambridge.redhat.com> * config/tc-arm.c: Fix test for overlow of literal pool. diff --git a/gas/config/tc-m68k.c b/gas/config/tc-m68k.c index 0d4cd23..c672ffe 100644 --- a/gas/config/tc-m68k.c +++ b/gas/config/tc-m68k.c @@ -5728,11 +5728,17 @@ parse_mri_control_operand (pcc, leftstart, leftstop, rightstart, rightstop) /* Look ahead for AND or OR or end of line. */ for (s = input_line_pointer; *s != '\0'; ++s) { - if ((strncasecmp (s, "AND", 3) == 0 - && (s[3] == '.' || ! is_part_of_name (s[3]))) - || (strncasecmp (s, "OR", 2) == 0 - && (s[2] == '.' || ! is_part_of_name (s[2])))) - break; + /* We must make sure we don't misinterpret AND/OR at the end of labels! + if d0 <eq> #FOOAND and d1 <ne> #BAROR then + ^^^ ^^ */ + if ( ( s == input_line_pointer + || *(s-1) == ' ' + || *(s-1) == '\t') + && ( ( strncasecmp (s, "AND", 3) == 0 + && (s[3] == '.' || ! is_part_of_name (s[3]))) + || ( strncasecmp (s, "OR", 2) == 0 + && (s[2] == '.' || ! is_part_of_name (s[2]))))) + break; } *rightstart = input_line_pointer; @@ -5759,7 +5765,11 @@ swap_mri_condition (cc) { case MCC ('h', 'i'): return MCC ('c', 's'); case MCC ('l', 's'): return MCC ('c', 'c'); + /* <HS> is an alias for <CC> */ + case MCC ('h', 's'): case MCC ('c', 'c'): return MCC ('l', 's'); + /* <LO> is an alias for <CS> */ + case MCC ('l', 'o'): case MCC ('c', 's'): return MCC ('h', 'i'); case MCC ('p', 'l'): return MCC ('m', 'i'); case MCC ('m', 'i'): return MCC ('p', 'l'); @@ -5767,6 +5777,15 @@ swap_mri_condition (cc) case MCC ('l', 't'): return MCC ('g', 't'); case MCC ('g', 't'): return MCC ('l', 't'); case MCC ('l', 'e'): return MCC ('g', 'e'); + /* issue a warning for conditions we can not swap */ + case MCC ('n', 'e'): return MCC ('n', 'e'); // no problem here + case MCC ('e', 'q'): return MCC ('e', 'q'); // also no problem + case MCC ('v', 'c'): + case MCC ('v', 's'): + default : + as_warn (_("Condition <%c%c> in structured control directive can not be encoded correctly"), + (char) (cc >> 8), (char) (cc)); + break; } return cc; } @@ -5781,7 +5800,11 @@ reverse_mri_condition (cc) { case MCC ('h', 'i'): return MCC ('l', 's'); case MCC ('l', 's'): return MCC ('h', 'i'); + /* <HS> is an alias for <CC> */ + case MCC ('h', 's'): return MCC ('l', 'o'); case MCC ('c', 'c'): return MCC ('c', 's'); + /* <LO> is an alias for <CS> */ + case MCC ('l', 'o'): return MCC ('h', 's'); case MCC ('c', 's'): return MCC ('c', 'c'); case MCC ('n', 'e'): return MCC ('e', 'q'); case MCC ('e', 'q'): return MCC ('n', 'e'); @@ -5848,13 +5871,28 @@ build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart, { char *temp; - cc = swap_mri_condition (cc); + /* Correct conditional handling: + if #1 <lt> d0 then ;means if (1 < d0) + ... + endi + + should assemble to: + + cmp #1,d0 if we do *not* swap the operands + bgt true we need the swapped condition! + ble false + true: + ... + false: + */ temp = leftstart; leftstart = rightstart; rightstart = temp; temp = leftstop; leftstop = rightstop; rightstop = temp; + } else { + cc = swap_mri_condition (cc); } } @@ -5874,7 +5912,7 @@ build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart, *s++ = 'm'; *s++ = 'p'; if (qual != '\0') - *s++ = qual; + *s++ = tolower(qual); *s++ = ' '; memcpy (s, leftstart, leftstop - leftstart); s += leftstop - leftstart; @@ -5892,7 +5930,7 @@ build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart, *s++ = cc >> 8; *s++ = cc & 0xff; if (extent != '\0') - *s++ = extent; + *s++ = tolower(extent); *s++ = ' '; strcpy (s, truelab); mri_assemble (buf); @@ -6027,8 +6065,17 @@ s_mri_if (qual) /* A structured control directive must end with THEN with an optional qualifier. */ s = input_line_pointer; - while (! is_end_of_line[(unsigned char) *s] - && (! flag_mri || *s != '*')) + /* We only accept '*' as introduction of comments if preceded by white space + or at first column of a line (I think this can't actually happen here?) + This is important when assembling: + if d0 <ne> 12(a0,d0*2) then + if d0 <ne> #CONST*20 then */ + while ( ! ( is_end_of_line[(unsigned char) *s] + || ( flag_mri + && *s == '*' + && ( s == input_line_pointer + || *(s-1) == ' ' + || *(s-1) == '\t')))) ++s; --s; while (s > input_line_pointer && (*s == ' ' || *s == '\t')) @@ -6133,7 +6180,7 @@ s_mri_else (qual) mri_control_stack->else_seen = 1; buf = (char *) xmalloc (20 + strlen (mri_control_stack->bottom)); - q[0] = qual; + q[0] = tolower(qual); q[1] = '\0'; sprintf (buf, "bra%s %s", q, mri_control_stack->bottom); mri_assemble (buf); @@ -6206,7 +6253,7 @@ s_mri_break (extent) } buf = (char *) xmalloc (20 + strlen (n->bottom)); - ex[0] = extent; + ex[0] = tolower(extent); ex[1] = '\0'; sprintf (buf, "bra%s %s", ex, n->bottom); mri_assemble (buf); @@ -6245,7 +6292,7 @@ s_mri_next (extent) } buf = (char *) xmalloc (20 + strlen (n->next)); - ex[0] = extent; + ex[0] = tolower(extent); ex[1] = '\0'; sprintf (buf, "bra%s %s", ex, n->next); mri_assemble (buf); @@ -6429,7 +6476,7 @@ s_mri_for (qual) *s++ = 'v'; *s++ = 'e'; if (qual != '\0') - *s++ = qual; + *s++ = tolower(qual); *s++ = ' '; memcpy (s, initstart, initstop - initstart); s += initstop - initstart; @@ -6447,7 +6494,7 @@ s_mri_for (qual) *s++ = 'm'; *s++ = 'p'; if (qual != '\0') - *s++ = qual; + *s++ = tolower(qual); *s++ = ' '; memcpy (s, endstart, endstop - endstart); s += endstop - endstart; @@ -6458,7 +6505,7 @@ s_mri_for (qual) mri_assemble (buf); /* bcc bottom */ - ex[0] = extent; + ex[0] = tolower(extent); ex[1] = '\0'; if (up) sprintf (buf, "blt%s %s", ex, n->bottom); @@ -6474,7 +6521,7 @@ s_mri_for (qual) strcpy (s, "sub"); s += 3; if (qual != '\0') - *s++ = qual; + *s++ = tolower(qual); *s++ = ' '; memcpy (s, bystart, bystop - bystart); s += bystop - bystart; @@ -6597,8 +6644,17 @@ s_mri_while (qual) struct mri_control_info *n; s = input_line_pointer; - while (! is_end_of_line[(unsigned char) *s] - && (! flag_mri || *s != '*')) + /* We only accept '*' as introduction of comments if preceded by white space + or at first column of a line (I think this can't actually happen here?) + This is important when assembling: + while d0 <ne> 12(a0,d0*2) do + while d0 <ne> #CONST*20 do */ + while ( ! ( is_end_of_line[(unsigned char) *s] + || ( flag_mri + && *s == '*' + && ( s == input_line_pointer + || *(s-1) == ' ' + || *(s-1) == '\t')))) s++; --s; while (*s == ' ' || *s == '\t') diff --git a/gas/macro.c b/gas/macro.c index 8512208..e93cdce 100644 --- a/gas/macro.c +++ b/gas/macro.c @@ -935,21 +935,29 @@ macro_expand (idx, in, m, out, comment_char) /* The macro may be called with an optional qualifier, which may be referred to in the macro body as \0. */ if (idx < in->len && in->ptr[idx] == '.') - { - formal_entry *n; - - n = (formal_entry *) xmalloc (sizeof (formal_entry)); - sb_new (&n->name); - sb_new (&n->def); - sb_new (&n->actual); - n->index = QUAL_INDEX; - - n->next = m->formals; - m->formals = n; - - idx = get_any_string (idx + 1, in, &n->actual, 1, 0); - } - } + { + /* The Microtec assembler ignores this if followed by a white space. + (Macro invocation with empty extension) */ + idx++; + if ( idx < in->len + && in->ptr[idx] != ' ' + && in->ptr[idx] != '\t') + { + formal_entry *n; + + n = (formal_entry *) xmalloc (sizeof (formal_entry)); + sb_new (&n->name); + sb_new (&n->def); + sb_new (&n->actual); + n->index = QUAL_INDEX; + + n->next = m->formals; + m->formals = n; + + idx = get_any_string (idx, in, &n->actual, 1, 0); + } + } + } /* Peel off the actuals and store them away in the hash tables' actuals. */ idx = sb_skip_white (idx, in); diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index c49daad..7d97840 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2001-06-06 Peter Jakubek <pjak@snafu.de> + + * gas/mri/for.d: Correct for swapped operands. + * gas/mri/if.d: Likewise. + * gas/mri/repeat.d: Likewise. + * gas/mri/while.d: Likewise. + 2001-06-12 Alan Modra <amodra@bigpond.net.au> * gas/i386/x86_64.d: Update for 2001-06-11 disassembler change. diff --git a/gas/testsuite/gas/mri/for.d b/gas/testsuite/gas/mri/for.d index e75fb95..ac62f7c 100644 --- a/gas/testsuite/gas/mri/for.d +++ b/gas/testsuite/gas/mri/for.d @@ -21,7 +21,7 @@ Disassembly of section .text: 0+01c <foo\+(0x|)1c> cmpiw #1,%d0 0+020 <foo\+(0x|)20> bgts 0+030 <foo\+(0x|)30> 0+022 <foo\+(0x|)22> cmpiw #100,%d1 -0+026 <foo\+(0x|)26> bgts 0+02a <foo\+(0x|)2a> +0+026 <foo\+(0x|)26> blts 0+02a <foo\+(0x|)2a> 0+028 <foo\+(0x|)28> bras 0+02c <foo\+(0x|)2c> 0+02a <foo\+(0x|)2a> addw %d0,%d1 0+02c <foo\+(0x|)2c> subqw #1,%d0 diff --git a/gas/testsuite/gas/mri/if.d b/gas/testsuite/gas/mri/if.d index 832972c..9547086 100644 --- a/gas/testsuite/gas/mri/if.d +++ b/gas/testsuite/gas/mri/if.d @@ -8,18 +8,18 @@ Disassembly of section .text: 0+000 <foo> cmpw %d1,%d0 -0+002 <foo\+(0x|)2> bles 0+014 <foo\+(0x|)14> +0+002 <foo\+(0x|)2> bges 0+014 <foo\+(0x|)14> 0+004 <foo\+(0x|)4> cmpw %d2,%d0 -0+006 <foo\+(0x|)6> bles 0+014 <foo\+(0x|)14> +0+006 <foo\+(0x|)6> bges 0+014 <foo\+(0x|)14> 0+008 <foo\+(0x|)8> cmpw %d1,%d2 -0+00a <foo\+(0x|)a> bles 0+010 <foo\+(0x|)10> +0+00a <foo\+(0x|)a> bges 0+010 <foo\+(0x|)10> 0+00c <foo\+(0x|)c> movew %d1,%d3 0+00e <foo\+(0x|)e> bras 0+012 <foo\+(0x|)12> 0+010 <foo\+(0x|)10> movew %d2,%d3 0+012 <foo\+(0x|)12> bras 0+01e <foo\+(0x|)1e> 0+014 <foo\+(0x|)14> cmpw %d0,%d1 -0+016 <foo\+(0x|)16> bgts 0+01c <foo\+(0x|)1c> +0+016 <foo\+(0x|)16> blts 0+01c <foo\+(0x|)1c> 0+018 <foo\+(0x|)18> cmpw %d0,%d2 -0+01a <foo\+(0x|)1a> bles 0+01e <foo\+(0x|)1e> +0+01a <foo\+(0x|)1a> bges 0+01e <foo\+(0x|)1e> 0+01c <foo\+(0x|)1c> movew %d0,%d3 0+01e <foo\+(0x|)1e> nop diff --git a/gas/testsuite/gas/mri/repeat.d b/gas/testsuite/gas/mri/repeat.d index 3cc5f63..e3c863f 100644 --- a/gas/testsuite/gas/mri/repeat.d +++ b/gas/testsuite/gas/mri/repeat.d @@ -11,6 +11,6 @@ Disassembly of section .text: 0+002 <foo\+(0x|)2> clrw %d1 0+004 <foo\+(0x|)4> addqw #1,%d1 0+006 <foo\+(0x|)6> cmpiw #10,%d1 -0+00a <foo\+(0x|)a> bgts 0+004 <foo\+(0x|)4> +0+00a <foo\+(0x|)a> blts 0+004 <foo\+(0x|)4> 0+00c <foo\+(0x|)c> nop 0+00e <foo\+(0x|)e> nop diff --git a/gas/testsuite/gas/mri/while.d b/gas/testsuite/gas/mri/while.d index d8dd37a..40934f1 100644 --- a/gas/testsuite/gas/mri/while.d +++ b/gas/testsuite/gas/mri/while.d @@ -11,7 +11,7 @@ Disassembly of section .text: 0+002 <foo\+(0x|)2> bras 0+000 <foo> 0+004 <foo\+(0x|)4> clrw %d1 0+006 <foo\+(0x|)6> cmpiw #10,%d1 -0+00a <foo\+(0x|)a> blts 0+010 <foo\+(0x|)10> +0+00a <foo\+(0x|)a> bgts 0+010 <foo\+(0x|)10> 0+00c <foo\+(0x|)c> addqw #1,%d1 0+00e <foo\+(0x|)e> bras 0+006 <foo\+(0x|)6> 0+010 <foo\+(0x|)10> nop |