X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gas%2Fconfig%2Ftc-m68k.c;h=20c9c107b58ec6d6ede3d093a21f4832e98d43c6;hb=bbe8ef22ff5ff90692a87e3d5f4f3aa135bd7a03;hp=10e26233a904dc9fa65b96a75853d41dbcee4b8c;hpb=bc805888417f16602aeb4bfd3f6e33d32ffcae24;p=deliverable%2Fbinutils-gdb.git diff --git a/gas/config/tc-m68k.c b/gas/config/tc-m68k.c index 10e26233a9..20c9c107b5 100644 --- a/gas/config/tc-m68k.c +++ b/gas/config/tc-m68k.c @@ -1,5 +1,6 @@ /* tc-m68k.c -- Assemble for the m68k family - Copyright (C) 1987, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000 + Copyright 1987, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, + 2000, 2001 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -19,10 +20,11 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#include #include "as.h" +#include "safe-ctype.h" #include "obstack.h" #include "subsegs.h" +#include "dwarf2dbg.h" #include "opcode/m68k.h" #include "m68k-parse.h" @@ -229,7 +231,7 @@ struct m68k_it #define arch_coldfire_p(x) (((x) & mcf) != 0) /* Macros for determining if cpu supports a specific addressing mode */ -#define HAVE_LONG_BRANCH(x) ((x) & (m68020|m68030|m68040|m68060|cpu32)) +#define HAVE_LONG_BRANCH(x) ((x) & (m68020|m68030|m68040|m68060|cpu32|mcf5407)) static struct m68k_it the_ins; /* the instruction being assembled */ @@ -255,9 +257,9 @@ insop (w, opcode) const struct m68k_incant *opcode; { int z; - for(z=the_ins.numo;z>opcode->m_codenum;--z) + for (z = the_ins.numo; z > opcode->m_codenum; --z) the_ins.opcode[z]=the_ins.opcode[z-1]; - for(z=0;zfx_addsy) - || S_IS_WEAK (fixP->fx_addsy)) + if (! relaxable_symbol (fixP->fx_addsy)) return 0; /* adjust_reloc_syms doesn't know about the GOT */ @@ -862,6 +877,8 @@ tc_m68k_fix_adjustable (fixP) #define get_reloc_code(SIZE,PCREL,OTHER) NO_RELOC +#define relaxable_symbol(symbol) 1 + #endif /* OBJ_ELF */ #ifdef BFD_ASSEMBLER @@ -874,8 +891,19 @@ tc_gen_reloc (section, fixp) arelent *reloc; bfd_reloc_code_real_type code; + /* If the tcbit is set, then this was a fixup of a negative value + that was never resolved. We do not have a reloc to handle this, + so just return. We assume that other code will have detected this + situation and produced a helpful error message, so we just tell the + user that the reloc cannot be produced. */ if (fixp->fx_tcbit) - abort (); + { + if (fixp->fx_addsy) + as_bad_where (fixp->fx_file, fixp->fx_line, + _("Unable to produce reloc against symbol '%s'"), + S_GET_NAME (fixp->fx_addsy)); + return NULL; + } if (fixp->fx_r_type != BFD_RELOC_NONE) { @@ -954,8 +982,9 @@ tc_gen_reloc (section, fixp) reloc->addend = fixp->fx_addnumber; else reloc->addend = (section->vma - + (fixp->fx_pcrel_adjust == 64 - ? -1 : fixp->fx_pcrel_adjust) + /* Explicit sign extension in case char is + unsigned. */ + + ((fixp->fx_pcrel_adjust & 0xff) ^ 0x80) - 0x80 + fixp->fx_addnumber + md_pcrel_from (fixp)); #endif @@ -968,27 +997,6 @@ tc_gen_reloc (section, fixp) #endif /* BFD_ASSEMBLER */ -/* Return zero if the reference to SYMBOL from within the same segment may - be relaxed. */ -#ifdef OBJ_ELF - -/* On an ELF system, we can't relax an externally visible symbol, - because it may be overridden by a shared library. However, if - TARGET_OS is "elf", then we presume that we are assembling for an - embedded system, in which case we don't have to worry about shared - libraries, and we can relax anything. */ - -#define relaxable_symbol(symbol) \ - (strcmp (TARGET_OS, "elf") == 0 \ - || (! S_IS_EXTERNAL (symbol) \ - && ! S_IS_WEAK (symbol))) - -#else - -#define relaxable_symbol(symbol) 1 - -#endif - /* Handle of the OPCODE hash table. NULL means any use before m68k_ip_begin() will crash. */ static struct hash_control *op_hash; @@ -2532,11 +2540,7 @@ m68k_ip (instring) switch (s[1]) { case 'B': - /* The pc_fix argument winds up in fx_pcrel_adjust, - which is a char, and may therefore be unsigned. We - want to pass -1, but we pass 64 instead, and convert - back in md_pcrel_from. */ - add_fix ('B', &opP->disp, 1, 64); + add_fix ('B', &opP->disp, 1, -1); break; case 'W': add_fix ('w', &opP->disp, 1, 0); @@ -2568,14 +2572,14 @@ m68k_ip (instring) if (adds (&opP->disp) == 0) { if (the_ins.opcode[0] == 0x6000) /* jbra */ - the_ins.opcode[0] = 0x4EF1; + the_ins.opcode[0] = 0x4EF9; else if (the_ins.opcode[0] == 0x6100) /* jbsr */ - the_ins.opcode[0] = 0x4EB1; + the_ins.opcode[0] = 0x4EB9; else /* jCC */ { the_ins.opcode[0] ^= 0x0100; the_ins.opcode[0] |= 0x0006; - addword (0x4EF1); + addword (0x4EF9); } add_fix ('l', &opP->disp, 0, 0); addword (0); @@ -3304,7 +3308,7 @@ insert_reg (regname, regnum) &zero_address_frag)); for (i = 0; regname[i]; i++) - buf[i] = islower (regname[i]) ? toupper (regname[i]) : regname[i]; + buf[i] = TOUPPER (regname[i]); buf[i] = '\0'; symbol_table_insert (symbol_new (buf, reg_section, regnum, @@ -3607,6 +3611,11 @@ md_assemble (str) current_label = NULL; } +#ifdef OBJ_ELF + /* Tie dwarf2 debug info to the address at the start of the insn. */ + dwarf2_emit_insn (0); +#endif + if (the_ins.nfrag == 0) { /* No frag hacking involved; just put it out */ @@ -3660,6 +3669,21 @@ md_assemble (str) } /* There's some frag hacking */ + { + /* Calculate the max frag size. */ + int wid; + + wid = 2 * the_ins.fragb[0].fragoff; + for (n = 1; n < the_ins.nfrag; n++) + wid += 2 * (the_ins.numo - the_ins.fragb[n - 1].fragoff); + /* frag_var part. */ + wid += 10; + /* Make sure the whole insn fits in one chunk, in particular that + the var part is attached, as we access one byte before the + variable frag for byte branches. */ + frag_grow (wid); + } + for (n = 0, fromP = &the_ins.opcode[0]; n < the_ins.nfrag; n++) { int wid; @@ -3754,11 +3778,10 @@ md_begin () my lord ghod hath spoken, so we do it this way. Excuse the ugly var names. */ - register const struct m68k_opcode *ins; - register struct m68k_incant *hack, *slak; - register const char *retval = 0; /* empty string, or error msg text */ - register int i; - register char c; + const struct m68k_opcode *ins; + struct m68k_incant *hack, *slak; + const char *retval = 0; /* empty string, or error msg text */ + int i; if (flag_mri) { @@ -3853,9 +3876,6 @@ md_begin () } } - for (i = 0; i < (int) sizeof (mklower_table); i++) - mklower_table[i] = (isupper (c = (char) i)) ? tolower (c) : c; - for (i = 0; i < (int) sizeof (notend_table); i++) { notend_table[i] = 0; @@ -3955,6 +3975,7 @@ select_control_regs () case mcf5200: case mcf5206e: case mcf5307: + case mcf5407: control_regs = mcf_control_regs; break; default: @@ -4200,11 +4221,13 @@ md_number_to_chars (buf, val, n) number_to_chars_bigendian (buf, val, n); } -static void -md_apply_fix_2 (fixP, val) +void +md_apply_fix3 (fixP, valP, seg) fixS *fixP; - offsetT val; + valueT *valP; + segT seg ATTRIBUTE_UNUSED; { + offsetT val = *valP; addressT upper_limit; offsetT lower_limit; @@ -4214,10 +4237,10 @@ md_apply_fix_2 (fixP, val) buf += fixP->fx_where; /* end ibm compiler workaround */ - if (val & 0x80000000) - val |= ~(addressT)0x7fffffff; - else - val &= 0x7fffffff; + val = ((val & 0xffffffff) ^ 0x80000000) - 0x80000000; + + if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0) + fixP->fx_done = 1; #ifdef OBJ_ELF if (fixP->fx_addsy) @@ -4241,8 +4264,8 @@ md_apply_fix_2 (fixP, val) switch (fixP->fx_size) { - /* The cast to offsetT below are necessary to make code correct for - machines where ints are smaller than offsetT */ + /* The cast to offsetT below are necessary to make code + correct for machines where ints are smaller than offsetT. */ case 1: *buf++ = val; upper_limit = 0x7f; @@ -4302,24 +4325,6 @@ md_apply_fix_2 (fixP, val) as_bad_where (fixP->fx_file, fixP->fx_line, _("invalid byte branch offset")); } -#ifdef BFD_ASSEMBLER -int -md_apply_fix (fixP, valp) - fixS *fixP; - valueT *valp; -{ - md_apply_fix_2 (fixP, (addressT) *valp); - return 1; -} -#else -void md_apply_fix (fixP, val) - fixS *fixP; - long val; -{ - md_apply_fix_2 (fixP, (addressT) val); -} -#endif - /* *fragP has been relaxed to its final size, and now needs to have the bytes inside it modified to conform to the new size There is UGLY MAGIC here. .. @@ -4345,10 +4350,6 @@ md_convert_frag_1 (fragP) disp = fragP->fr_symbol ? S_GET_VALUE (fragP->fr_symbol) : 0; disp = (disp + fragP->fr_offset) - object_address; -#ifdef BFD_ASSEMBLER - disp += symbol_get_frag (fragP->fr_symbol)->fr_address; -#endif - switch (fragP->fr_subtype) { case TAB (BRANCHBWL, BYTE): @@ -4357,7 +4358,8 @@ md_convert_frag_1 (fragP) case TAB (BRANCHBW, BYTE): know (issbyte (disp)); if (disp == 0) - as_bad (_("short branch with zero offset: use :w")); + as_bad_where (fragP->fr_file, fragP->fr_line, + _("short branch with zero offset: use :w")); fixP = fix_new (fragP, fragP->fr_fix - 1, 1, fragP->fr_symbol, fragP->fr_offset, 1, RELAX_RELOC_PC8); fixP->fx_pcrel_adjust = -1; @@ -4563,37 +4565,11 @@ md_estimate_size_before_relax (fragP, segment) register fragS *fragP; segT segment; { - int old_fix; - register char *buffer_address = fragP->fr_fix + fragP->fr_literal; - - old_fix = fragP->fr_fix; - /* Handle SZ_UNDEF first, it can be changed to BYTE or SHORT. */ switch (fragP->fr_subtype) { case TAB (BRANCHBWL, SZ_UNDEF): case TAB (BRABSJUNC, SZ_UNDEF): - { - if (S_GET_SEGMENT (fragP->fr_symbol) == segment - && relaxable_symbol (fragP->fr_symbol)) - { - fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), BYTE); - } - else if (flag_short_refs) - { - /* Symbol is undefined and we want short ref. */ - fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT); - fragP->fr_var += 2; - } - else - { - /* Symbol is still undefined. Make it LONG. */ - fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), LONG); - fragP->fr_var += 4; - } - break; - } - case TAB (BRABSJCOND, SZ_UNDEF): { if (S_GET_SEGMENT (fragP->fr_symbol) == segment @@ -4605,13 +4581,11 @@ md_estimate_size_before_relax (fragP, segment) { /* Symbol is undefined and we want short ref. */ fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT); - fragP->fr_var += 2; } else { /* Symbol is still undefined. Make it LONG. */ fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), LONG); - fragP->fr_var += 6; } break; } @@ -4627,59 +4601,24 @@ md_estimate_size_before_relax (fragP, segment) { /* Symbol is undefined and we don't have long branches. */ fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT); - fragP->fr_var += 2; } break; } case TAB (FBRANCH, SZ_UNDEF): - { - if ((S_GET_SEGMENT (fragP->fr_symbol) == segment - && relaxable_symbol (fragP->fr_symbol)) - || flag_short_refs) - { - fragP->fr_subtype = TAB (FBRANCH, SHORT); - fragP->fr_var += 2; - } - else - { - fragP->fr_subtype = TAB (FBRANCH, LONG); - fragP->fr_var += 4; - } - break; - } - case TAB (DBCCLBR, SZ_UNDEF): case TAB (DBCCABSJ, SZ_UNDEF): - { - if (S_GET_SEGMENT (fragP->fr_symbol) == segment - && relaxable_symbol (fragP->fr_symbol) - || flag_short_refs) - { - fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT); - fragP->fr_var += 2; - } - else - { - fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), LONG); - fragP->fr_var += 10; - } - break; - } - case TAB (PCREL1632, SZ_UNDEF): { - if (((S_GET_SEGMENT (fragP->fr_symbol)) == segment + if ((S_GET_SEGMENT (fragP->fr_symbol) == segment && relaxable_symbol (fragP->fr_symbol)) || flag_short_refs) { - fragP->fr_subtype = TAB (PCREL1632, SHORT); - fragP->fr_var += 2; + fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT); } else { - fragP->fr_subtype = TAB (PCREL1632, LONG); - fragP->fr_var += 6; + fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), LONG); } break; } @@ -4693,7 +4632,6 @@ md_estimate_size_before_relax (fragP, segment) else { fragP->fr_subtype = TAB (PCINDEX, LONG); - fragP->fr_var += 4; } break; @@ -4703,12 +4641,10 @@ md_estimate_size_before_relax (fragP, segment) && relaxable_symbol (fragP->fr_symbol))) { fragP->fr_subtype = TAB (ABSTOPCREL, SHORT); - fragP->fr_var += 2; } else { fragP->fr_subtype = TAB (ABSTOPCREL, LONG); - fragP->fr_var += 4; } break; } @@ -4725,32 +4661,31 @@ md_estimate_size_before_relax (fragP, segment) case TAB (BRABSJCOND, BYTE): case TAB (BRANCHBW, BYTE): /* We can't do a short jump to the next instruction, so in that - case we force word mode. At this point S_GET_VALUE should - return the offset of the symbol within its frag. If the - symbol is at the start of a frag, and it is the next frag - with any data in it (usually this is just the next frag, but - assembler listings may introduce empty frags), we must use - word mode. */ - if (fragP->fr_symbol && S_GET_VALUE (fragP->fr_symbol) == 0) + case we force word mode. If the symbol is at the start of a + frag, and it is the next frag with any data in it (usually + this is just the next frag, but assembler listings may + introduce empty frags), we must use word mode. */ + if (fragP->fr_symbol) { - fragS *stop; - fragS *l; + fragS *sym_frag; - stop = symbol_get_frag (fragP->fr_symbol); - for (l = fragP->fr_next; l != stop; l = l->fr_next) - if (l->fr_fix + l->fr_var != 0) - break; - if (l == stop) + sym_frag = symbol_get_frag (fragP->fr_symbol); + if (S_GET_VALUE (fragP->fr_symbol) == sym_frag->fr_address) { - fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT); - fragP->fr_var += 2; + fragS *l; + + for (l = fragP->fr_next; l != sym_frag; l = l->fr_next) + if (l->fr_fix != 0) + break; + if (l == sym_frag) + fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT); } } break; default: break; } - return fragP->fr_var + fragP->fr_fix - old_fix; + return md_relax_table[fragP->fr_subtype].rlx_length; } #if defined(OBJ_AOUT) | defined(OBJ_BOUT) @@ -5415,7 +5350,7 @@ s_reg (ignore) SKIP_WHITESPACE (); s = input_line_pointer; - while (isalnum ((unsigned char) *input_line_pointer) + while (ISALNUM (*input_line_pointer) #ifdef REGISTER_PREFIX || *input_line_pointer == REGISTER_PREFIX #endif @@ -5627,10 +5562,7 @@ mri_assemble (str) /* md_assemble expects the opcode to be in lower case. */ for (s = str; *s != ' ' && *s != '\0'; s++) - { - if (isupper ((unsigned char) *s)) - *s = tolower ((unsigned char) *s); - } + *s = TOLOWER (*s); md_assemble (str); } @@ -5712,10 +5644,8 @@ parse_mri_condition (pcc) ++input_line_pointer; SKIP_WHITESPACE (); - if (isupper (c1)) - c1 = tolower (c1); - if (isupper (c2)) - c2 = tolower (c2); + c1 = TOLOWER (c1); + c2 = TOLOWER (c2); *pcc = (c1 << 8) | c2; @@ -5773,11 +5703,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 #FOOAND and d1 #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; @@ -5804,7 +5740,11 @@ swap_mri_condition (cc) { case MCC ('h', 'i'): return MCC ('c', 's'); case MCC ('l', 's'): return MCC ('c', 'c'); + /* is an alias for */ + case MCC ('h', 's'): case MCC ('c', 'c'): return MCC ('l', 's'); + /* is an alias for */ + 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'); @@ -5812,6 +5752,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; } @@ -5826,7 +5775,11 @@ reverse_mri_condition (cc) { case MCC ('h', 'i'): return MCC ('l', 's'); case MCC ('l', 's'): return MCC ('h', 'i'); + /* is an alias for */ + case MCC ('h', 's'): return MCC ('l', 'o'); case MCC ('c', 'c'): return MCC ('c', 's'); + /* is an alias for */ + 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'); @@ -5893,13 +5846,28 @@ build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart, { char *temp; - cc = swap_mri_condition (cc); + /* Correct conditional handling: + if #1 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); } } @@ -5919,7 +5887,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; @@ -5937,7 +5905,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); @@ -6072,8 +6040,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 12(a0,d0*2) then + if d0 #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')) @@ -6178,7 +6155,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); @@ -6251,7 +6228,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); @@ -6290,7 +6267,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); @@ -6474,7 +6451,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; @@ -6492,7 +6469,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; @@ -6503,7 +6480,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); @@ -6519,7 +6496,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; @@ -6642,8 +6619,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 12(a0,d0*2) do + while d0 #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') @@ -6932,9 +6918,9 @@ md_show_usage (stream) fprintf (stream, _("\ 680X0 options:\n\ -l use 1 word for refs to undefined symbols [default 2]\n\ --m68000 | -m68008 | -m68010 | -m68020 | -m68030 | -m68040 | -m68060\n\ - | -m68302 | -m68331 | -m68332 | -m68333 | -m68340 | -m68360\n\ - | -mcpu32 | -m5200\n\ +-m68000 | -m68008 | -m68010 | -m68020 | -m68030 | -m68040 | -m68060 |\n\ +-m68302 | -m68331 | -m68332 | -m68333 | -m68340 | -m68360 | -mcpu32 |\n\ +-m5200 | -m5202 | -m5204 | -m5206 | -m5206e | -m5307 | -m5407\n\ specify variant of 680X0 architecture [default 68020]\n\ -m68881 | -m68882 | -mno-68881 | -mno-68882\n\ target has/lacks floating-point coprocessor\n\ @@ -7048,7 +7034,6 @@ is_label (str) /* We have no need to default values of symbols. */ -/* ARGSUSED */ symbolS * md_undefined_symbol (name) char *name ATTRIBUTE_UNUSED; @@ -7089,9 +7074,9 @@ md_pcrel_from (fixP) { int adjust; - /* Because fx_pcrel_adjust is a char, and may be unsigned, we store - -1 as 64. */ - adjust = fixP->fx_pcrel_adjust; + /* Because fx_pcrel_adjust is a char, and may be unsigned, we explicitly + sign extend the value here. */ + adjust = ((fixP->fx_pcrel_adjust & 0xff) ^ 0x80) - 0x80; if (adjust == 64) adjust = -1; return fixP->fx_where + fixP->fx_frag->fr_address - adjust; @@ -7100,7 +7085,6 @@ md_pcrel_from (fixP) #ifndef BFD_ASSEMBLER #ifdef OBJ_COFF -/*ARGSUSED*/ void tc_coff_symbol_emit_hook (ignore) symbolS *ignore ATTRIBUTE_UNUSED;