Fix m68k/mri mode problems.
This commit is contained in:
parent
3971ce954f
commit
e1f44d1052
8 changed files with 129 additions and 39 deletions
|
@ -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.
|
||||
|
|
|
@ -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')
|
||||
|
|
32
gas/macro.c
32
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;
|
||||
{
|
||||
/* 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 = (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;
|
||||
n->next = m->formals;
|
||||
m->formals = n;
|
||||
|
||||
idx = get_any_string (idx + 1, in, &n->actual, 1, 0);
|
||||
}
|
||||
}
|
||||
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);
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue