Banish PARAMS and PTR. Convert to ISO C.
[external/binutils.git] / gas / config / tc-m68k.c
1 /* tc-m68k.c -- Assemble for the m68k family
2    Copyright 1987, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3    2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
4    Free Software Foundation, Inc.
5
6    This file is part of GAS, the GNU Assembler.
7
8    GAS is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3, or (at your option)
11    any later version.
12
13    GAS is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with GAS; see the file COPYING.  If not, write to the Free
20    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
21    02110-1301, USA.  */
22
23 #include "as.h"
24 #include "safe-ctype.h"
25 #include "obstack.h"
26 #include "subsegs.h"
27 #include "dwarf2dbg.h"
28 #include "dw2gencfi.h"
29
30 #include "opcode/m68k.h"
31 #include "m68k-parse.h"
32
33 #if defined (OBJ_ELF)
34 #include "elf/m68k.h"
35 #endif
36
37 #ifdef M68KCOFF
38 #include "obj-coff.h"
39 #endif
40
41 /* This string holds the chars that always start a comment.  If the
42    pre-processor is disabled, these aren't very useful.  The macro
43    tc_comment_chars points to this.  We use this, rather than the
44    usual comment_chars, so that the --bitwise-or option will work.  */
45 #if defined (TE_SVR4) || defined (TE_DELTA)
46 const char *m68k_comment_chars = "|#";
47 #else
48 const char *m68k_comment_chars = "|";
49 #endif
50
51 /* This array holds the chars that only start a comment at the beginning of
52    a line.  If the line seems to have the form '# 123 filename'
53    .line and .file directives will appear in the pre-processed output */
54 /* Note that input_file.c hand checks for '#' at the beginning of the
55    first line of the input file.  This is because the compiler outputs
56    #NO_APP at the beginning of its output.  */
57 /* Also note that comments like this one will always work.  */
58 const char line_comment_chars[] = "#*";
59
60 const char line_separator_chars[] = ";";
61
62 /* Chars that can be used to separate mant from exp in floating point nums.  */
63 const char EXP_CHARS[] = "eE";
64
65 /* Chars that mean this number is a floating point constant, as
66    in "0f12.456" or "0d1.2345e12".  */
67
68 const char FLT_CHARS[] = "rRsSfFdDxXeEpP";
69
70 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
71    changed in read.c .  Ideally it shouldn't have to know about it at all,
72    but nothing is ideal around here.  */
73
74 /* Are we trying to generate PIC code?  If so, absolute references
75    ought to be made into linkage table references or pc-relative
76    references.  Not implemented.  For ELF there are other means
77    to denote pic relocations.  */
78 int flag_want_pic;
79
80 static int flag_short_refs;     /* -l option.  */
81 static int flag_long_jumps;     /* -S option.  */
82 static int flag_keep_pcrel;     /* --pcrel option.  */
83
84 #ifdef REGISTER_PREFIX_OPTIONAL
85 int flag_reg_prefix_optional = REGISTER_PREFIX_OPTIONAL;
86 #else
87 int flag_reg_prefix_optional;
88 #endif
89
90 /* Whether --register-prefix-optional was used on the command line.  */
91 static int reg_prefix_optional_seen;
92
93 /* The floating point coprocessor to use by default.  */
94 static enum m68k_register m68k_float_copnum = COP1;
95
96 /* If this is non-zero, then references to number(%pc) will be taken
97    to refer to number, rather than to %pc + number.  */
98 static int m68k_abspcadd;
99
100 /* If this is non-zero, then the quick forms of the move, add, and sub
101    instructions are used when possible.  */
102 static int m68k_quick = 1;
103
104 /* If this is non-zero, then if the size is not specified for a base
105    or outer displacement, the assembler assumes that the size should
106    be 32 bits.  */
107 static int m68k_rel32 = 1;
108
109 /* This is non-zero if m68k_rel32 was set from the command line.  */
110 static int m68k_rel32_from_cmdline;
111
112 /* The default width to use for an index register when using a base
113    displacement.  */
114 static enum m68k_size m68k_index_width_default = SIZE_LONG;
115
116 /* We want to warn if any text labels are misaligned.  In order to get
117    the right line number, we need to record the line number for each
118    label.  */
119 struct label_line
120 {
121   struct label_line *next;
122   symbolS *label;
123   char *file;
124   unsigned int line;
125   int text;
126 };
127
128 /* The list of labels.  */
129
130 static struct label_line *labels;
131
132 /* The current label.  */
133
134 static struct label_line *current_label;
135
136 /* Pointer to list holding the opcodes sorted by name.  */
137 static struct m68k_opcode const ** m68k_sorted_opcodes;
138
139 /* Its an arbitrary name:  This means I don't approve of it.
140    See flames below.  */
141 static struct obstack robyn;
142
143 struct m68k_incant
144   {
145     const char *m_operands;
146     unsigned long m_opcode;
147     short m_opnum;
148     short m_codenum;
149     int m_arch;
150     struct m68k_incant *m_next;
151   };
152
153 #define getone(x)       ((((x)->m_opcode)>>16)&0xffff)
154 #define gettwo(x)       (((x)->m_opcode)&0xffff)
155
156 static const enum m68k_register m68000_ctrl[] = { 0 };
157 static const enum m68k_register m68010_ctrl[] = {
158   SFC, DFC, USP, VBR,
159   0
160 };
161 static const enum m68k_register m68020_ctrl[] = {
162   SFC, DFC, USP, VBR, CACR, CAAR, MSP, ISP,
163   0
164 };
165 static const enum m68k_register m68040_ctrl[] = {
166   SFC, DFC, CACR, TC, ITT0, ITT1, DTT0, DTT1,
167   USP, VBR, MSP, ISP, MMUSR, URP, SRP,
168   0
169 };
170 static const enum m68k_register m68060_ctrl[] = {
171   SFC, DFC, CACR, TC, ITT0, ITT1, DTT0, DTT1, BUSCR,
172   USP, VBR, URP, SRP, PCR,
173   0
174 };
175 static const enum m68k_register mcf_ctrl[] = {
176   CACR, TC, ACR0, ACR1, ACR2, ACR3, VBR, ROMBAR,
177   RAMBAR0, RAMBAR1, RAMBAR, MBAR,
178   0
179 };
180 static const enum m68k_register mcf51qe_ctrl[] = {
181   VBR,
182   0
183 };
184 static const enum m68k_register mcf5206_ctrl[] = {
185   CACR, ACR0, ACR1,  VBR, RAMBAR0, RAMBAR_ALT, MBAR,
186   0
187 };
188 static const enum m68k_register mcf5208_ctrl[] = {
189   CACR, ACR0, ACR1, VBR,  RAMBAR, RAMBAR1,
190   0
191 };
192 static const enum m68k_register mcf5210a_ctrl[] = {
193   VBR, CACR, ACR0, ACR1, ROMBAR, RAMBAR, RAMBAR1, MBAR,
194   0
195 };
196 static const enum m68k_register mcf5213_ctrl[] = {
197   VBR, RAMBAR, RAMBAR1, FLASHBAR,
198   0
199 };
200 static const enum m68k_register mcf5216_ctrl[] = {
201   VBR, CACR, ACR0, ACR1, FLASHBAR, RAMBAR, RAMBAR1,
202   0
203 };
204 static const enum m68k_register mcf52223_ctrl[] = {
205   VBR, CACR, ACR0, ACR1, FLASHBAR, RAMBAR, RAMBAR1,
206   0
207 };
208 static const enum m68k_register mcf52235_ctrl[] = {
209   VBR, CACR, ACR0, ACR1, FLASHBAR, RAMBAR, RAMBAR1,
210   0
211 };
212 static const enum m68k_register mcf5225_ctrl[] = {
213   VBR, CACR, ACR0, ACR1, FLASHBAR, RAMBAR, MBAR, RAMBAR1,
214   0
215 };
216 static const enum m68k_register mcf5235_ctrl[] = {
217   VBR, CACR, ACR0, ACR1, RAMBAR, RAMBAR1,
218   0
219 };
220 static const enum m68k_register mcf5249_ctrl[] = {
221   VBR, CACR, ACR0, ACR1, RAMBAR0, RAMBAR1, RAMBAR, MBAR, MBAR2,
222   0
223 };
224 static const enum m68k_register mcf5250_ctrl[] = {
225   VBR,
226   0
227 };
228 static const enum m68k_register mcf5253_ctrl[] = {
229   VBR, CACR, ACR0, ACR1, RAMBAR0, RAMBAR1, RAMBAR, MBAR, MBAR2,
230   0
231 };
232 static const enum m68k_register mcf5271_ctrl[] = {
233   VBR, CACR, ACR0, ACR1, RAMBAR, RAMBAR1,
234   0
235 };
236 static const enum m68k_register mcf5272_ctrl[] = {
237   VBR, CACR, ACR0, ACR1, ROMBAR, RAMBAR_ALT, RAMBAR0, MBAR,
238   0
239 };
240 static const enum m68k_register mcf5275_ctrl[] = {
241   VBR, CACR, ACR0, ACR1, RAMBAR, RAMBAR1,
242   0
243 };
244 static const enum m68k_register mcf5282_ctrl[] = {
245   VBR, CACR, ACR0, ACR1, FLASHBAR, RAMBAR, RAMBAR1,
246   0
247 };
248 static const enum m68k_register mcf5307_ctrl[] = {
249   CACR, ACR0, ACR1,  VBR, RAMBAR0, RAMBAR_ALT, MBAR,
250   0
251 };
252 static const enum m68k_register mcf5329_ctrl[] = {
253   VBR, CACR, ACR0, ACR1, RAMBAR, RAMBAR1,
254   0
255 };
256 static const enum m68k_register mcf5373_ctrl[] = {
257   VBR, CACR, ACR0, ACR1, RAMBAR, RAMBAR1,
258   0
259 };
260 static const enum m68k_register mcfv4e_ctrl[] = {
261   CACR, ASID, ACR0, ACR1, ACR2, ACR3, MMUBAR,
262   VBR, PC, ROMBAR0, ROMBAR1, RAMBAR0, RAMBAR1,
263   MBAR, SECMBAR,
264   MPCR /* Multiprocessor Control register */,
265   EDRAMBAR /* Embedded DRAM Base Address Register */,
266   /* Permutation control registers.  */
267   PCR1U0, PCR1L0, PCR1U1, PCR1L1, PCR2U0, PCR2L0, PCR2U1, PCR2L1,
268   PCR3U0, PCR3L0, PCR3U1, PCR3L1,
269   /* Legacy names */
270   TC /* ASID */, BUSCR /* MMUBAR */,
271   ITT0 /* ACR0 */, ITT1 /* ACR1 */, DTT0 /* ACR2 */, DTT1 /* ACR3 */,
272   MBAR1 /* MBAR */, MBAR2 /* SECMBAR */, MBAR0 /* SECMBAR */,
273   ROMBAR /* ROMBAR0 */, RAMBAR /* RAMBAR1 */,
274   0
275 };
276 static const enum m68k_register mcf5407_ctrl[] = {
277   CACR, ASID, ACR0, ACR1, ACR2, ACR3,
278   VBR, PC, RAMBAR0, RAMBAR1, MBAR,
279   /* Legacy names */
280   TC /* ASID */,
281   ITT0 /* ACR0 */, ITT1 /* ACR1 */, DTT0 /* ACR2 */, DTT1 /* ACR3 */,
282   MBAR1 /* MBAR */, RAMBAR /* RAMBAR1 */,
283   0
284 };
285 static const enum m68k_register mcf54455_ctrl[] = {
286   CACR, ASID, ACR0, ACR1, ACR2, ACR3, MMUBAR,
287   VBR, PC, RAMBAR1, MBAR,
288   /* Legacy names */
289   TC /* ASID */, BUSCR /* MMUBAR */,
290   ITT0 /* ACR0 */, ITT1 /* ACR1 */, DTT0 /* ACR2 */, DTT1 /* ACR3 */,
291   MBAR1 /* MBAR */,  RAMBAR /* RAMBAR1 */,
292   0
293 };
294 static const enum m68k_register mcf5475_ctrl[] = {
295   CACR, ASID, ACR0, ACR1, ACR2, ACR3, MMUBAR,
296   VBR, PC, RAMBAR0, RAMBAR1, MBAR,
297   /* Legacy names */
298   TC /* ASID */, BUSCR /* MMUBAR */,
299   ITT0 /* ACR0 */, ITT1 /* ACR1 */, DTT0 /* ACR2 */, DTT1 /* ACR3 */,
300   MBAR1 /* MBAR */, RAMBAR /* RAMBAR1 */,
301   0
302 };
303 static const enum m68k_register mcf5485_ctrl[] = {
304   CACR, ASID, ACR0, ACR1, ACR2, ACR3, MMUBAR,
305   VBR, PC, RAMBAR0, RAMBAR1, MBAR,
306   /* Legacy names */
307   TC /* ASID */, BUSCR /* MMUBAR */,
308   ITT0 /* ACR0 */, ITT1 /* ACR1 */, DTT0 /* ACR2 */, DTT1 /* ACR3 */,
309   MBAR1 /* MBAR */, RAMBAR /* RAMBAR1 */,
310   0
311 };
312 static const enum m68k_register fido_ctrl[] = {
313   SFC, DFC, USP, VBR, CAC, MBO,
314   0
315 };
316 #define cpu32_ctrl m68010_ctrl
317
318 static const enum m68k_register *control_regs;
319
320 /* Internal form of a 68020 instruction.  */
321 struct m68k_it
322 {
323   const char *error;
324   const char *args;             /* List of opcode info.  */
325   int numargs;
326
327   int numo;                     /* Number of shorts in opcode.  */
328   short opcode[11];
329
330   struct m68k_op operands[6];
331
332   int nexp;                     /* Number of exprs in use.  */
333   struct m68k_exp exprs[4];
334
335   int nfrag;                    /* Number of frags we have to produce.  */
336   struct
337     {
338       int fragoff;              /* Where in the current opcode the frag ends.  */
339       symbolS *fadd;
340       offsetT foff;
341       int fragty;
342     }
343   fragb[4];
344
345   int nrel;                     /* Num of reloc strucs in use.  */
346   struct
347     {
348       int n;
349       expressionS exp;
350       char wid;
351       char pcrel;
352       /* In a pc relative address the difference between the address
353          of the offset and the address that the offset is relative
354          to.  This depends on the addressing mode.  Basically this
355          is the value to put in the offset field to address the
356          first byte of the offset, without regarding the special
357          significance of some values (in the branch instruction, for
358          example).  */
359       int pcrel_fix;
360 #ifdef OBJ_ELF
361       /* Whether this expression needs special pic relocation, and if
362          so, which.  */
363       enum pic_relocation pic_reloc;
364 #endif
365     }
366   reloc[5];                     /* Five is enough???  */
367 };
368
369 #define cpu_of_arch(x)          ((x) & (m68000up | mcfisa_a | fido_a))
370 #define float_of_arch(x)        ((x) & mfloat)
371 #define mmu_of_arch(x)          ((x) & mmmu)
372 #define arch_coldfire_p(x)      ((x) & mcfisa_a)
373 #define arch_coldfire_fpu(x)    ((x) & cfloat)
374
375 /* Macros for determining if cpu supports a specific addressing mode.  */
376 #define HAVE_LONG_DISP(x)       \
377         ((x) & (m68020|m68030|m68040|m68060|cpu32|fido_a|mcfisa_b|mcfisa_c))
378 #define HAVE_LONG_CALL(x)       \
379         ((x) & (m68020|m68030|m68040|m68060|cpu32|fido_a|mcfisa_b|mcfisa_c))
380 #define HAVE_LONG_COND(x)       \
381         ((x) & (m68020|m68030|m68040|m68060|cpu32|fido_a|mcfisa_b|mcfisa_c))
382 #define HAVE_LONG_BRANCH(x)     \
383         ((x) & (m68020|m68030|m68040|m68060|cpu32|fido_a|mcfisa_b))
384 #define LONG_BRANCH_VIA_COND(x) (HAVE_LONG_COND(x) && !HAVE_LONG_BRANCH(x))
385
386 static struct m68k_it the_ins;  /* The instruction being assembled.  */
387
388 #define op(ex)          ((ex)->exp.X_op)
389 #define adds(ex)        ((ex)->exp.X_add_symbol)
390 #define subs(ex)        ((ex)->exp.X_op_symbol)
391 #define offs(ex)        ((ex)->exp.X_add_number)
392
393 /* Macros for adding things to the m68k_it struct.  */
394 #define addword(w)      (the_ins.opcode[the_ins.numo++] = (w))
395
396 /* Like addword, but goes BEFORE general operands.  */
397
398 static void
399 insop (int w, const struct m68k_incant *opcode)
400 {
401   int z;
402   for (z = the_ins.numo; z > opcode->m_codenum; --z)
403     the_ins.opcode[z] = the_ins.opcode[z - 1];
404   for (z = 0; z < the_ins.nrel; z++)
405     the_ins.reloc[z].n += 2;
406   for (z = 0; z < the_ins.nfrag; z++)
407     the_ins.fragb[z].fragoff++;
408   the_ins.opcode[opcode->m_codenum] = w;
409   the_ins.numo++;
410 }
411
412 /* The numo+1 kludge is so we can hit the low order byte of the prev word.
413    Blecch.  */
414 static void
415 add_fix (int width, struct m68k_exp *exp, int pc_rel, int pc_fix)
416 {
417   the_ins.reloc[the_ins.nrel].n = (width == 'B' || width == '3'
418                                    ? the_ins.numo * 2 - 1
419                                    : (width == 'b'
420                                       ? the_ins.numo * 2 + 1
421                                       : the_ins.numo * 2));
422   the_ins.reloc[the_ins.nrel].exp = exp->exp;
423   the_ins.reloc[the_ins.nrel].wid = width;
424   the_ins.reloc[the_ins.nrel].pcrel_fix = pc_fix;
425 #ifdef OBJ_ELF
426   the_ins.reloc[the_ins.nrel].pic_reloc = exp->pic_reloc;
427 #endif
428   the_ins.reloc[the_ins.nrel++].pcrel = pc_rel;
429 }
430
431 /* Cause an extra frag to be generated here, inserting up to 10 bytes
432    (that value is chosen in the frag_var call in md_assemble).  TYPE
433    is the subtype of the frag to be generated; its primary type is
434    rs_machine_dependent.
435
436    The TYPE parameter is also used by md_convert_frag_1 and
437    md_estimate_size_before_relax.  The appropriate type of fixup will
438    be emitted by md_convert_frag_1.
439
440    ADD becomes the FR_SYMBOL field of the frag, and OFF the FR_OFFSET.  */
441 static void
442 add_frag (symbolS *add, offsetT off, int type)
443 {
444   the_ins.fragb[the_ins.nfrag].fragoff = the_ins.numo;
445   the_ins.fragb[the_ins.nfrag].fadd = add;
446   the_ins.fragb[the_ins.nfrag].foff = off;
447   the_ins.fragb[the_ins.nfrag++].fragty = type;
448 }
449
450 #define isvar(ex) \
451   (op (ex) != O_constant && op (ex) != O_big)
452
453 static char *crack_operand (char *str, struct m68k_op *opP);
454 static int get_num (struct m68k_exp *exp, int ok);
455 static int reverse_16_bits (int in);
456 static int reverse_8_bits (int in);
457 static void install_gen_operand (int mode, int val);
458 static void install_operand (int mode, int val);
459 static void s_bss (int);
460 static void s_data1 (int);
461 static void s_data2 (int);
462 static void s_even (int);
463 static void s_proc (int);
464 static void s_chip (int);
465 static void s_fopt (int);
466 static void s_opt (int);
467 static void s_reg (int);
468 static void s_restore (int);
469 static void s_save (int);
470 static void s_mri_if (int);
471 static void s_mri_else (int);
472 static void s_mri_endi (int);
473 static void s_mri_break (int);
474 static void s_mri_next (int);
475 static void s_mri_for (int);
476 static void s_mri_endf (int);
477 static void s_mri_repeat (int);
478 static void s_mri_until (int);
479 static void s_mri_while (int);
480 static void s_mri_endw (int);
481 static void s_m68k_cpu (int);
482 static void s_m68k_arch (int);
483
484 struct m68k_cpu
485 {
486   unsigned long arch;   /* Architecture features.  */
487   const enum m68k_register *control_regs;       /* Control regs on chip */
488   const char *name;     /* Name */
489   int alias;            /* Alias for a cannonical name.  If 1, then
490                            succeeds canonical name, if -1 then
491                            succeeds canonical name, if <-1 ||>1 this is a
492                            deprecated name, and the next/previous name
493                            should be used. */
494 };
495
496 /* We hold flags for features explicitly enabled and explicitly
497    disabled.  */
498 static int current_architecture;
499 static int not_current_architecture;
500 static const struct m68k_cpu *selected_arch;
501 static const struct m68k_cpu *selected_cpu;
502 static int initialized;
503
504 /* Architecture models.  */
505 static const struct m68k_cpu m68k_archs[] =
506 {
507   {m68000,                                      m68000_ctrl, "68000", 0},
508   {m68010,                                      m68010_ctrl, "68010", 0},
509   {m68020|m68881|m68851,                        m68020_ctrl, "68020", 0},
510   {m68030|m68881|m68851,                        m68020_ctrl, "68030", 0},
511   {m68040,                                      m68040_ctrl, "68040", 0},
512   {m68060,                                      m68060_ctrl, "68060", 0},
513   {cpu32|m68881,                                cpu32_ctrl, "cpu32", 0},
514   {fido_a,                                      fido_ctrl, "fidoa", 0},
515   {mcfisa_a|mcfhwdiv,                           NULL, "isaa", 0},
516   {mcfisa_a|mcfhwdiv|mcfisa_aa|mcfusp,          NULL, "isaaplus", 0},
517   {mcfisa_a|mcfhwdiv|mcfisa_b|mcfusp,           NULL, "isab", 0},
518   {mcfisa_a|mcfhwdiv|mcfisa_c|mcfusp,           NULL, "isac", 0},
519   {mcfisa_a|mcfhwdiv|mcfisa_b|mcfmac|mcfusp,    mcf_ctrl, "cfv4", 0},
520   {mcfisa_a|mcfhwdiv|mcfisa_b|mcfemac|mcfusp|cfloat, mcfv4e_ctrl, "cfv4e", 0},
521   {0,0,NULL, 0}
522 };
523
524 /* Architecture extensions, here 'alias' -1 for m68k, +1 for cf and 0
525    for either.  */
526 static const struct m68k_cpu m68k_extensions[] =
527 {
528   {m68851,                                      NULL, "68851", -1},
529   {m68881,                                      NULL, "68881", -1},
530   {m68881,                                      NULL, "68882", -1},
531   
532   {cfloat|m68881,                               NULL, "float", 0},
533   
534   {mcfhwdiv,                                    NULL, "div", 1},
535   {mcfusp,                                      NULL, "usp", 1},
536   {mcfmac,                                      NULL, "mac", 1},
537   {mcfemac,                                     NULL, "emac", 1},
538    
539   {0,NULL,NULL, 0}
540 };
541
542 /* Processor list */
543 static const struct m68k_cpu m68k_cpus[] =
544 {
545   {m68000,                                      m68000_ctrl, "68000", 0},
546   {m68000,                                      m68000_ctrl, "68ec000", 1},
547   {m68000,                                      m68000_ctrl, "68hc000", 1},
548   {m68000,                                      m68000_ctrl, "68hc001", 1},
549   {m68000,                                      m68000_ctrl, "68008", 1},
550   {m68000,                                      m68000_ctrl, "68302", 1},
551   {m68000,                                      m68000_ctrl, "68306", 1},
552   {m68000,                                      m68000_ctrl, "68307", 1},
553   {m68000,                                      m68000_ctrl, "68322", 1},
554   {m68000,                                      m68000_ctrl, "68356", 1},
555   {m68010,                                      m68010_ctrl, "68010", 0},
556   {m68020|m68881|m68851,                        m68020_ctrl, "68020", 0},
557   {m68020|m68881|m68851,                        m68020_ctrl, "68k", 1},
558   {m68020|m68881|m68851,                        m68020_ctrl, "68ec020", 1},
559   {m68030|m68881|m68851,                        m68020_ctrl, "68030", 0},
560   {m68030|m68881|m68851,                        m68020_ctrl, "68ec030", 1},
561   {m68040,                                      m68040_ctrl, "68040", 0},
562   {m68040,                                      m68040_ctrl, "68ec040", 1},
563   {m68060,                                      m68060_ctrl, "68060", 0},
564   {m68060,                                      m68060_ctrl, "68ec060", 1},
565   
566   {cpu32|m68881,                                cpu32_ctrl, "cpu32",  0},
567   {cpu32|m68881,                                cpu32_ctrl, "68330", 1},
568   {cpu32|m68881,                                cpu32_ctrl, "68331", 1},
569   {cpu32|m68881,                                cpu32_ctrl, "68332", 1},
570   {cpu32|m68881,                                cpu32_ctrl, "68333", 1},
571   {cpu32|m68881,                                cpu32_ctrl, "68334", 1},
572   {cpu32|m68881,                                cpu32_ctrl, "68336", 1},
573   {cpu32|m68881,                                cpu32_ctrl, "68340", 1},
574   {cpu32|m68881,                                cpu32_ctrl, "68341", 1},
575   {cpu32|m68881,                                cpu32_ctrl, "68349", 1},
576   {cpu32|m68881,                                cpu32_ctrl, "68360", 1},
577
578   {mcfisa_a|mcfisa_c|mcfusp,                    mcf51qe_ctrl, "51qe", 0},
579   
580   {mcfisa_a,                                    mcf_ctrl, "5200", 0},
581   {mcfisa_a,                                    mcf_ctrl, "5202", 1},
582   {mcfisa_a,                                    mcf_ctrl, "5204", 1},
583   {mcfisa_a,                                    mcf5206_ctrl, "5206", 1},
584   
585   {mcfisa_a|mcfhwdiv|mcfmac,                    mcf5206_ctrl, "5206e", 0},
586   
587   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,  mcf5208_ctrl, "5207", -1},
588   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,  mcf5208_ctrl, "5208", 0},
589   
590   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp,   mcf5210a_ctrl, "5210a", 0},
591   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp,   mcf5210a_ctrl, "5211a", 1},
592   
593   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp,   mcf5213_ctrl, "5211", -1},
594   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp,   mcf5213_ctrl, "5212", -1},
595   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp,   mcf5213_ctrl, "5213", 0},
596   
597   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,  mcf5216_ctrl, "5214", -1},
598   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,  mcf5216_ctrl, "5216", 0},
599   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,  mcf5216_ctrl, "521x", 2},
600
601   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp,   mcf52223_ctrl, "52221", -1},
602   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp,   mcf52223_ctrl, "52223", 0},
603
604   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,  mcf52235_ctrl, "52230", -1},
605   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,  mcf52235_ctrl, "52233", -1},
606   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,  mcf52235_ctrl, "52234", -1},
607   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,  mcf52235_ctrl, "52235", 0},
608   
609   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp,   mcf5225_ctrl, "5224", -1},
610   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp,   mcf5225_ctrl, "5225", 0},
611   
612   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,  mcf5235_ctrl, "5232", -1},
613   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,  mcf5235_ctrl, "5233", -1},
614   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,  mcf5235_ctrl, "5234", -1},
615   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,  mcf5235_ctrl, "5235", -1},
616   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,  mcf5235_ctrl, "523x", 0},
617   
618   {mcfisa_a|mcfhwdiv|mcfemac,                   mcf5249_ctrl, "5249", 0},
619   {mcfisa_a|mcfhwdiv|mcfemac,                   mcf5250_ctrl, "5250", 0},
620   {mcfisa_a|mcfhwdiv|mcfemac,                   mcf5253_ctrl, "5253", 0},
621   
622   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,  mcf5271_ctrl, "5270", -1},
623   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,  mcf5271_ctrl, "5271", 0},
624   
625   {mcfisa_a|mcfhwdiv|mcfmac,                    mcf5272_ctrl, "5272", 0},
626   
627   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,  mcf5275_ctrl, "5274", -1},
628   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,  mcf5275_ctrl, "5275", 0},
629   
630   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,  mcf5282_ctrl, "5280", -1},
631   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,  mcf5282_ctrl, "5281", -1},
632   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,  mcf5282_ctrl, "5282", -1},
633   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,  mcf5282_ctrl, "528x", 0},
634   
635   {mcfisa_a|mcfhwdiv|mcfmac,                    mcf5307_ctrl, "5307", 0},
636   
637   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,  mcf5329_ctrl, "5327", -1},
638   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,  mcf5329_ctrl, "5328", -1},
639   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,  mcf5329_ctrl, "5329", -1},
640   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,  mcf5329_ctrl, "532x", 0},
641   
642   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,  mcf5373_ctrl, "5372", -1},
643   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,  mcf5373_ctrl, "5373", -1},
644   {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp,  mcf5373_ctrl, "537x", 0},
645   
646   {mcfisa_a|mcfisa_b|mcfhwdiv|mcfmac,           mcf5407_ctrl, "5407",0},
647
648   {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp,   mcf54455_ctrl, "54450", -1},
649   {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp,   mcf54455_ctrl, "54451", -1},
650   {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp,   mcf54455_ctrl, "54452", -1},
651   {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp,   mcf54455_ctrl, "54453", -1},
652   {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp,   mcf54455_ctrl, "54454", -1},
653   {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp,   mcf54455_ctrl, "54455", 0},
654   
655   {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "5470", -1},
656   {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "5471", -1},
657   {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "5472", -1},
658   {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "5473", -1},
659   {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "5474", -1},
660   {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "5475", -1},
661   {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "547x", 0},
662   
663   {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "5480", -1},
664   {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "5481", -1},
665   {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "5482", -1},
666   {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "5483", -1},
667   {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "5484", -1},
668   {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "5485", -1},
669   {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "548x", 0},
670   
671   {fido_a,                              fido_ctrl, "fidoa", 0},
672   {fido_a,                              fido_ctrl, "fido", 1},
673
674   {0,NULL,NULL, 0}
675   };
676
677 static const struct m68k_cpu *m68k_lookup_cpu
678 (const char *, const struct m68k_cpu *, int, int *);
679 static int m68k_set_arch (const char *, int, int);
680 static int m68k_set_cpu (const char *, int, int);
681 static int m68k_set_extension (const char *, int, int);
682 static void m68k_init_arch (void);
683
684 /* This is the assembler relaxation table for m68k. m68k is a rich CISC
685    architecture and we have a lot of relaxation modes.  */
686
687 /* Macros used in the relaxation code.  */
688 #define TAB(x,y)        (((x) << 2) + (y))
689 #define TABTYPE(x)      ((x) >> 2)
690
691 /* Relaxation states.  */
692 #define BYTE            0
693 #define SHORT           1
694 #define LONG            2
695 #define SZ_UNDEF        3
696
697 /* Here are all the relaxation modes we support.  First we can relax ordinary
698    branches.  On 68020 and higher and on CPU32 all branch instructions take
699    three forms, so on these CPUs all branches always remain as such.  When we
700    have to expand to the LONG form on a 68000, though, we substitute an
701    absolute jump instead.  This is a direct replacement for unconditional
702    branches and a branch over a jump for conditional branches.  However, if the
703    user requires PIC and disables this with --pcrel, we can only relax between
704    BYTE and SHORT forms, punting if that isn't enough.  This gives us four
705    different relaxation modes for branches:  */
706
707 #define BRANCHBWL       0       /* Branch byte, word, or long.  */
708 #define BRABSJUNC       1       /* Absolute jump for LONG, unconditional.  */
709 #define BRABSJCOND      2       /* Absolute jump for LONG, conditional.  */
710 #define BRANCHBW        3       /* Branch byte or word.  */
711
712 /* We also relax coprocessor branches and DBcc's.  All CPUs that support
713    coprocessor branches support them in word and long forms, so we have only
714    one relaxation mode for them.  DBcc's are word only on all CPUs.  We can
715    relax them to the LONG form with a branch-around sequence.  This sequence
716    can use a long branch (if available) or an absolute jump (if acceptable).
717    This gives us two relaxation modes.  If long branches are not available and
718    absolute jumps are not acceptable, we don't relax DBcc's.  */
719
720 #define FBRANCH         4       /* Coprocessor branch.  */
721 #define DBCCLBR         5       /* DBcc relaxable with a long branch.  */
722 #define DBCCABSJ        6       /* DBcc relaxable with an absolute jump.  */
723
724 /* That's all for instruction relaxation.  However, we also relax PC-relative
725    operands.  Specifically, we have three operand relaxation modes.  On the
726    68000 PC-relative operands can only be 16-bit, but on 68020 and higher and
727    on CPU32 they may be 16-bit or 32-bit.  For the latter we relax between the
728    two.  Also PC+displacement+index operands in their simple form (with a non-
729    suppressed index without memory indirection) are supported on all CPUs, but
730    on the 68000 the displacement can be 8-bit only, whereas on 68020 and higher
731    and on CPU32 we relax it to SHORT and LONG forms as well using the extended
732    form of the PC+displacement+index operand.  Finally, some absolute operands
733    can be relaxed down to 16-bit PC-relative.  */
734
735 #define PCREL1632       7       /* 16-bit or 32-bit PC-relative.  */
736 #define PCINDEX         8       /* PC + displacement + index. */
737 #define ABSTOPCREL      9       /* Absolute relax down to 16-bit PC-relative.  */
738
739 /* This relaxation is required for branches where there is no long
740    branch and we are in pcrel mode.  We generate a bne/beq pair.  */
741 #define BRANCHBWPL      10      /* Branch byte, word or pair of longs
742                                    */
743
744 /* Note that calls to frag_var need to specify the maximum expansion
745    needed; this is currently 12 bytes for bne/beq pair.  */
746 #define FRAG_VAR_SIZE 12
747
748 /* The fields are:
749    How far Forward this mode will reach:
750    How far Backward this mode will reach:
751    How many bytes this mode will add to the size of the frag
752    Which mode to go to if the offset won't fit in this one
753
754    Please check tc-m68k.h:md_prepare_relax_scan if changing this table.  */
755 relax_typeS md_relax_table[] =
756 {
757   {   127,   -128,  0, TAB (BRANCHBWL, SHORT) },
758   { 32767, -32768,  2, TAB (BRANCHBWL, LONG) },
759   {     0,      0,  4, 0 },
760   {     1,      1,  0, 0 },
761
762   {   127,   -128,  0, TAB (BRABSJUNC, SHORT) },
763   { 32767, -32768,  2, TAB (BRABSJUNC, LONG) },
764   {     0,      0,  4, 0 },
765   {     1,      1,  0, 0 },
766
767   {   127,   -128,  0, TAB (BRABSJCOND, SHORT) },
768   { 32767, -32768,  2, TAB (BRABSJCOND, LONG) },
769   {     0,      0,  6, 0 },
770   {     1,      1,  0, 0 },
771
772   {   127,   -128,  0, TAB (BRANCHBW, SHORT) },
773   {     0,      0,  2, 0 },
774   {     1,      1,  0, 0 },
775   {     1,      1,  0, 0 },
776
777   {     1,      1,  0, 0 },             /* FBRANCH doesn't come BYTE.  */
778   { 32767, -32768,  2, TAB (FBRANCH, LONG) },
779   {     0,      0,  4, 0 },
780   {     1,      1,  0, 0 },
781
782   {     1,      1,  0, 0 },             /* DBCC doesn't come BYTE.  */
783   { 32767, -32768,  2, TAB (DBCCLBR, LONG) },
784   {     0,      0, 10, 0 },
785   {     1,      1,  0, 0 },
786
787   {     1,      1,  0, 0 },             /* DBCC doesn't come BYTE.  */
788   { 32767, -32768,  2, TAB (DBCCABSJ, LONG) },
789   {     0,      0, 10, 0 },
790   {     1,      1,  0, 0 },
791
792   {     1,      1,  0, 0 },             /* PCREL1632 doesn't come BYTE.  */
793   { 32767, -32768,  2, TAB (PCREL1632, LONG) },
794   {     0,      0,  6, 0 },
795   {     1,      1,  0, 0 },
796
797   {   125,   -130,  0, TAB (PCINDEX, SHORT) },
798   { 32765, -32770,  2, TAB (PCINDEX, LONG) },
799   {     0,      0,  4, 0 },
800   {     1,      1,  0, 0 },
801
802   {     1,      1,  0, 0 },             /* ABSTOPCREL doesn't come BYTE.  */
803   { 32767, -32768,  2, TAB (ABSTOPCREL, LONG) },
804   {     0,      0,  4, 0 },
805   {     1,      1,  0, 0 },
806   
807   {   127,   -128,  0, TAB (BRANCHBWPL, SHORT) },
808   { 32767, -32768,  2, TAB (BRANCHBWPL, LONG) },
809   {     0,      0,  10, 0 },
810   {     1,      1,  0, 0 },
811 };
812
813 /* These are the machine dependent pseudo-ops.  These are included so
814    the assembler can work on the output from the SUN C compiler, which
815    generates these.  */
816
817 /* This table describes all the machine specific pseudo-ops the assembler
818    has to support.  The fields are:
819    pseudo-op name without dot
820    function to call to execute this pseudo-op
821    Integer arg to pass to the function.  */
822 const pseudo_typeS md_pseudo_table[] =
823 {
824   {"data1", s_data1, 0},
825   {"data2", s_data2, 0},
826   {"bss", s_bss, 0},
827   {"even", s_even, 0},
828   {"skip", s_space, 0},
829   {"proc", s_proc, 0},
830 #if defined (TE_SUN3) || defined (OBJ_ELF)
831   {"align", s_align_bytes, 0},
832 #endif
833 #ifdef OBJ_ELF
834   {"swbeg", s_ignore, 0},
835 #endif
836   {"extend", float_cons, 'x'},
837   {"ldouble", float_cons, 'x'},
838
839   {"arch", s_m68k_arch, 0},
840   {"cpu", s_m68k_cpu, 0},
841
842   /* The following pseudo-ops are supported for MRI compatibility.  */
843   {"chip", s_chip, 0},
844   {"comline", s_space, 1},
845   {"fopt", s_fopt, 0},
846   {"mask2", s_ignore, 0},
847   {"opt", s_opt, 0},
848   {"reg", s_reg, 0},
849   {"restore", s_restore, 0},
850   {"save", s_save, 0},
851
852   {"if", s_mri_if, 0},
853   {"if.b", s_mri_if, 'b'},
854   {"if.w", s_mri_if, 'w'},
855   {"if.l", s_mri_if, 'l'},
856   {"else", s_mri_else, 0},
857   {"else.s", s_mri_else, 's'},
858   {"else.l", s_mri_else, 'l'},
859   {"endi", s_mri_endi, 0},
860   {"break", s_mri_break, 0},
861   {"break.s", s_mri_break, 's'},
862   {"break.l", s_mri_break, 'l'},
863   {"next", s_mri_next, 0},
864   {"next.s", s_mri_next, 's'},
865   {"next.l", s_mri_next, 'l'},
866   {"for", s_mri_for, 0},
867   {"for.b", s_mri_for, 'b'},
868   {"for.w", s_mri_for, 'w'},
869   {"for.l", s_mri_for, 'l'},
870   {"endf", s_mri_endf, 0},
871   {"repeat", s_mri_repeat, 0},
872   {"until", s_mri_until, 0},
873   {"until.b", s_mri_until, 'b'},
874   {"until.w", s_mri_until, 'w'},
875   {"until.l", s_mri_until, 'l'},
876   {"while", s_mri_while, 0},
877   {"while.b", s_mri_while, 'b'},
878   {"while.w", s_mri_while, 'w'},
879   {"while.l", s_mri_while, 'l'},
880   {"endw", s_mri_endw, 0},
881
882   {0, 0, 0}
883 };
884
885 /* The mote pseudo ops are put into the opcode table, since they
886    don't start with a . they look like opcodes to gas.  */
887
888 const pseudo_typeS mote_pseudo_table[] =
889 {
890
891   {"dcl", cons, 4},
892   {"dc", cons, 2},
893   {"dcw", cons, 2},
894   {"dcb", cons, 1},
895
896   {"dsl", s_space, 4},
897   {"ds", s_space, 2},
898   {"dsw", s_space, 2},
899   {"dsb", s_space, 1},
900
901   {"xdef", s_globl, 0},
902 #ifdef OBJ_ELF
903   {"align", s_align_bytes, 0},
904 #else
905   {"align", s_align_ptwo, 0},
906 #endif
907 #ifdef M68KCOFF
908   {"sect", obj_coff_section, 0},
909   {"section", obj_coff_section, 0},
910 #endif
911   {0, 0, 0}
912 };
913
914 /* Truncate and sign-extend at 32 bits, so that building on a 64-bit host
915    gives identical results to a 32-bit host.  */
916 #define TRUNC(X)        ((valueT) (X) & 0xffffffff)
917 #define SEXT(X)         ((TRUNC (X) ^ 0x80000000) - 0x80000000)
918
919 #define issbyte(x)      ((valueT) SEXT (x) + 0x80 < 0x100)
920 #define isubyte(x)      ((valueT) TRUNC (x) < 0x100)
921 #define issword(x)      ((valueT) SEXT (x) + 0x8000 < 0x10000)
922 #define isuword(x)      ((valueT) TRUNC (x) < 0x10000)
923
924 #define isbyte(x)       ((valueT) SEXT (x) + 0xff < 0x1ff)
925 #define isword(x)       ((valueT) SEXT (x) + 0xffff < 0x1ffff)
926 #define islong(x)       (1)
927
928 static char notend_table[256];
929 static char alt_notend_table[256];
930 #define notend(s)                                               \
931   (! (notend_table[(unsigned char) *s]                          \
932       || (*s == ':'                                             \
933           && alt_notend_table[(unsigned char) s[1]])))
934
935 #ifdef OBJ_ELF
936
937 /* Return zero if the reference to SYMBOL from within the same segment may
938    be relaxed.  */
939
940 /* On an ELF system, we can't relax an externally visible symbol,
941    because it may be overridden by a shared library.  However, if
942    TARGET_OS is "elf", then we presume that we are assembling for an
943    embedded system, in which case we don't have to worry about shared
944    libraries, and we can relax any external sym.  */
945
946 #define relaxable_symbol(symbol) \
947   (!((S_IS_EXTERNAL (symbol) && EXTERN_FORCE_RELOC) \
948      || S_IS_WEAK (symbol)))
949
950 /* Compute the relocation code for a fixup of SIZE bytes, using pc
951    relative relocation if PCREL is non-zero.  PIC says whether a special
952    pic relocation was requested.  */
953
954 static bfd_reloc_code_real_type
955 get_reloc_code (int size, int pcrel, enum pic_relocation pic)
956 {
957   switch (pic)
958     {
959     case pic_got_pcrel:
960       switch (size)
961         {
962         case 1:
963           return BFD_RELOC_8_GOT_PCREL;
964         case 2:
965           return BFD_RELOC_16_GOT_PCREL;
966         case 4:
967           return BFD_RELOC_32_GOT_PCREL;
968         }
969       break;
970
971     case pic_got_off:
972       switch (size)
973         {
974         case 1:
975           return BFD_RELOC_8_GOTOFF;
976         case 2:
977           return BFD_RELOC_16_GOTOFF;
978         case 4:
979           return BFD_RELOC_32_GOTOFF;
980         }
981       break;
982
983     case pic_plt_pcrel:
984       switch (size)
985         {
986         case 1:
987           return BFD_RELOC_8_PLT_PCREL;
988         case 2:
989           return BFD_RELOC_16_PLT_PCREL;
990         case 4:
991           return BFD_RELOC_32_PLT_PCREL;
992         }
993       break;
994
995     case pic_plt_off:
996       switch (size)
997         {
998         case 1:
999           return BFD_RELOC_8_PLTOFF;
1000         case 2:
1001           return BFD_RELOC_16_PLTOFF;
1002         case 4:
1003           return BFD_RELOC_32_PLTOFF;
1004         }
1005       break;
1006
1007     case pic_none:
1008       if (pcrel)
1009         {
1010           switch (size)
1011             {
1012             case 1:
1013               return BFD_RELOC_8_PCREL;
1014             case 2:
1015               return BFD_RELOC_16_PCREL;
1016             case 4:
1017               return BFD_RELOC_32_PCREL;
1018             }
1019         }
1020       else
1021         {
1022           switch (size)
1023             {
1024             case 1:
1025               return BFD_RELOC_8;
1026             case 2:
1027               return BFD_RELOC_16;
1028             case 4:
1029               return BFD_RELOC_32;
1030             }
1031         }
1032     }
1033
1034   if (pcrel)
1035     {
1036       if (pic == pic_none)
1037         as_bad (_("Can not do %d byte pc-relative relocation"), size);
1038       else
1039         as_bad (_("Can not do %d byte pc-relative pic relocation"), size);
1040     }
1041   else
1042     {
1043       if (pic == pic_none)
1044         as_bad (_("Can not do %d byte relocation"), size);
1045       else
1046         as_bad (_("Can not do %d byte pic relocation"), size);
1047     }
1048
1049   return BFD_RELOC_NONE;
1050 }
1051
1052 /* Here we decide which fixups can be adjusted to make them relative
1053    to the beginning of the section instead of the symbol.  Basically
1054    we need to make sure that the dynamic relocations are done
1055    correctly, so in some cases we force the original symbol to be
1056    used.  */
1057 int
1058 tc_m68k_fix_adjustable (fixS *fixP)
1059 {
1060   /* Adjust_reloc_syms doesn't know about the GOT.  */
1061   switch (fixP->fx_r_type)
1062     {
1063     case BFD_RELOC_8_GOT_PCREL:
1064     case BFD_RELOC_16_GOT_PCREL:
1065     case BFD_RELOC_32_GOT_PCREL:
1066     case BFD_RELOC_8_GOTOFF:
1067     case BFD_RELOC_16_GOTOFF:
1068     case BFD_RELOC_32_GOTOFF:
1069     case BFD_RELOC_8_PLT_PCREL:
1070     case BFD_RELOC_16_PLT_PCREL:
1071     case BFD_RELOC_32_PLT_PCREL:
1072     case BFD_RELOC_8_PLTOFF:
1073     case BFD_RELOC_16_PLTOFF:
1074     case BFD_RELOC_32_PLTOFF:
1075       return 0;
1076
1077     case BFD_RELOC_VTABLE_INHERIT:
1078     case BFD_RELOC_VTABLE_ENTRY:
1079       return 0;
1080
1081     default:
1082       return 1;
1083     }
1084 }
1085
1086 #else /* !OBJ_ELF */
1087
1088 #define get_reloc_code(SIZE,PCREL,OTHER) NO_RELOC
1089
1090 /* PR gas/3041 Weak symbols are not relaxable
1091    because they must be treated as extern.  */
1092 #define relaxable_symbol(symbol)   (!(S_IS_WEAK (symbol)))
1093
1094 #endif /* OBJ_ELF */
1095
1096 arelent *
1097 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
1098 {
1099   arelent *reloc;
1100   bfd_reloc_code_real_type code;
1101
1102   /* If the tcbit is set, then this was a fixup of a negative value
1103      that was never resolved.  We do not have a reloc to handle this,
1104      so just return.  We assume that other code will have detected this
1105      situation and produced a helpful error message, so we just tell the
1106      user that the reloc cannot be produced.  */
1107   if (fixp->fx_tcbit)
1108     {
1109       if (fixp->fx_addsy)
1110         as_bad_where (fixp->fx_file, fixp->fx_line,
1111                       _("Unable to produce reloc against symbol '%s'"),
1112                       S_GET_NAME (fixp->fx_addsy));
1113       return NULL;
1114     }
1115
1116   if (fixp->fx_r_type != BFD_RELOC_NONE)
1117     {
1118       code = fixp->fx_r_type;
1119
1120       /* Since DIFF_EXPR_OK is defined in tc-m68k.h, it is possible
1121          that fixup_segment converted a non-PC relative reloc into a
1122          PC relative reloc.  In such a case, we need to convert the
1123          reloc code.  */
1124       if (fixp->fx_pcrel)
1125         {
1126           switch (code)
1127             {
1128             case BFD_RELOC_8:
1129               code = BFD_RELOC_8_PCREL;
1130               break;
1131             case BFD_RELOC_16:
1132               code = BFD_RELOC_16_PCREL;
1133               break;
1134             case BFD_RELOC_32:
1135               code = BFD_RELOC_32_PCREL;
1136               break;
1137             case BFD_RELOC_8_PCREL:
1138             case BFD_RELOC_16_PCREL:
1139             case BFD_RELOC_32_PCREL:
1140             case BFD_RELOC_8_GOT_PCREL:
1141             case BFD_RELOC_16_GOT_PCREL:
1142             case BFD_RELOC_32_GOT_PCREL:
1143             case BFD_RELOC_8_GOTOFF:
1144             case BFD_RELOC_16_GOTOFF:
1145             case BFD_RELOC_32_GOTOFF:
1146             case BFD_RELOC_8_PLT_PCREL:
1147             case BFD_RELOC_16_PLT_PCREL:
1148             case BFD_RELOC_32_PLT_PCREL:
1149             case BFD_RELOC_8_PLTOFF:
1150             case BFD_RELOC_16_PLTOFF:
1151             case BFD_RELOC_32_PLTOFF:
1152               break;
1153             default:
1154               as_bad_where (fixp->fx_file, fixp->fx_line,
1155                             _("Cannot make %s relocation PC relative"),
1156                             bfd_get_reloc_code_name (code));
1157             }
1158         }
1159     }
1160   else
1161     {
1162 #define F(SZ,PCREL)             (((SZ) << 1) + (PCREL))
1163       switch (F (fixp->fx_size, fixp->fx_pcrel))
1164         {
1165 #define MAP(SZ,PCREL,TYPE)      case F(SZ,PCREL): code = (TYPE); break
1166           MAP (1, 0, BFD_RELOC_8);
1167           MAP (2, 0, BFD_RELOC_16);
1168           MAP (4, 0, BFD_RELOC_32);
1169           MAP (1, 1, BFD_RELOC_8_PCREL);
1170           MAP (2, 1, BFD_RELOC_16_PCREL);
1171           MAP (4, 1, BFD_RELOC_32_PCREL);
1172         default:
1173           abort ();
1174         }
1175     }
1176 #undef F
1177 #undef MAP
1178
1179   reloc = (arelent *) xmalloc (sizeof (arelent));
1180   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
1181   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1182   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
1183 #ifndef OBJ_ELF
1184   if (fixp->fx_pcrel)
1185     reloc->addend = fixp->fx_addnumber;
1186   else if (OUTPUT_FLAVOR == bfd_target_aout_flavour
1187            && fixp->fx_addsy
1188            && S_IS_WEAK (fixp->fx_addsy)
1189            && ! bfd_is_und_section (S_GET_SEGMENT (fixp->fx_addsy)))
1190     /* PR gas/3041 Adjust addend in order to force bfd_install_relocation()
1191        to put the symbol offset into frags referencing a weak symbol.  */
1192     reloc->addend = fixp->fx_addnumber
1193                     - (S_GET_VALUE (fixp->fx_addsy) * 2);
1194   else
1195     reloc->addend = 0;
1196 #else
1197   if (!fixp->fx_pcrel)
1198     reloc->addend = fixp->fx_addnumber;
1199   else
1200     reloc->addend = (section->vma
1201                      /* Explicit sign extension in case char is
1202                         unsigned.  */
1203                      + ((fixp->fx_pcrel_adjust & 0xff) ^ 0x80) - 0x80
1204                      + fixp->fx_addnumber
1205                      + md_pcrel_from (fixp));
1206 #endif
1207
1208   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
1209   assert (reloc->howto != 0);
1210
1211   return reloc;
1212 }
1213
1214 /* Handle of the OPCODE hash table.  NULL means any use before
1215    m68k_ip_begin() will crash.  */
1216 static struct hash_control *op_hash;
1217 \f
1218 /* Assemble an m68k instruction.  */
1219
1220 static void
1221 m68k_ip (char *instring)
1222 {
1223   register char *p;
1224   register struct m68k_op *opP;
1225   register const struct m68k_incant *opcode;
1226   register const char *s;
1227   register int tmpreg = 0, baseo = 0, outro = 0, nextword;
1228   char *pdot, *pdotmove;
1229   enum m68k_size siz1, siz2;
1230   char c;
1231   int losing;
1232   int opsfound;
1233   struct m68k_op operands_backup[6];
1234   LITTLENUM_TYPE words[6];
1235   LITTLENUM_TYPE *wordp;
1236   unsigned long ok_arch = 0;
1237
1238   if (*instring == ' ')
1239     instring++;                 /* Skip leading whitespace.  */
1240
1241   /* Scan up to end of operation-code, which MUST end in end-of-string
1242      or exactly 1 space.  */
1243   pdot = 0;
1244   for (p = instring; *p != '\0'; p++)
1245     {
1246       if (*p == ' ')
1247         break;
1248       if (*p == '.')
1249         pdot = p;
1250     }
1251
1252   if (p == instring)
1253     {
1254       the_ins.error = _("No operator");
1255       return;
1256     }
1257
1258   /* p now points to the end of the opcode name, probably whitespace.
1259      Make sure the name is null terminated by clobbering the
1260      whitespace, look it up in the hash table, then fix it back.
1261      Remove a dot, first, since the opcode tables have none.  */
1262   if (pdot != NULL)
1263     {
1264       for (pdotmove = pdot; pdotmove < p; pdotmove++)
1265         *pdotmove = pdotmove[1];
1266       p--;
1267     }
1268
1269   c = *p;
1270   *p = '\0';
1271   opcode = (const struct m68k_incant *) hash_find (op_hash, instring);
1272   *p = c;
1273
1274   if (pdot != NULL)
1275     {
1276       for (pdotmove = p; pdotmove > pdot; pdotmove--)
1277         *pdotmove = pdotmove[-1];
1278       *pdot = '.';
1279       ++p;
1280     }
1281
1282   if (opcode == NULL)
1283     {
1284       the_ins.error = _("Unknown operator");
1285       return;
1286     }
1287
1288   /* Found a legitimate opcode, start matching operands.  */
1289   while (*p == ' ')
1290     ++p;
1291
1292   if (opcode->m_operands == 0)
1293     {
1294       char *old = input_line_pointer;
1295       *old = '\n';
1296       input_line_pointer = p;
1297       /* Ahh - it's a motorola style psuedo op.  */
1298       mote_pseudo_table[opcode->m_opnum].poc_handler
1299         (mote_pseudo_table[opcode->m_opnum].poc_val);
1300       input_line_pointer = old;
1301       *old = 0;
1302
1303       return;
1304     }
1305
1306   if (flag_mri && opcode->m_opnum == 0)
1307     {
1308       /* In MRI mode, random garbage is allowed after an instruction
1309          which accepts no operands.  */
1310       the_ins.args = opcode->m_operands;
1311       the_ins.numargs = opcode->m_opnum;
1312       the_ins.numo = opcode->m_codenum;
1313       the_ins.opcode[0] = getone (opcode);
1314       the_ins.opcode[1] = gettwo (opcode);
1315       return;
1316     }
1317
1318   for (opP = &the_ins.operands[0]; *p; opP++)
1319     {
1320       p = crack_operand (p, opP);
1321
1322       if (opP->error)
1323         {
1324           the_ins.error = opP->error;
1325           return;
1326         }
1327     }
1328
1329   opsfound = opP - &the_ins.operands[0];
1330
1331   /* This ugly hack is to support the floating pt opcodes in their
1332      standard form.  Essentially, we fake a first enty of type COP#1 */
1333   if (opcode->m_operands[0] == 'I')
1334     {
1335       int n;
1336
1337       for (n = opsfound; n > 0; --n)
1338         the_ins.operands[n] = the_ins.operands[n - 1];
1339
1340       memset (&the_ins.operands[0], '\0', sizeof (the_ins.operands[0]));
1341       the_ins.operands[0].mode = CONTROL;
1342       the_ins.operands[0].reg = m68k_float_copnum;
1343       opsfound++;
1344     }
1345
1346   /* We've got the operands.  Find an opcode that'll accept them.  */
1347   for (losing = 0;;)
1348     {
1349       /* If we didn't get the right number of ops, or we have no
1350          common model with this pattern then reject this pattern.  */
1351
1352       ok_arch |= opcode->m_arch;
1353       if (opsfound != opcode->m_opnum
1354           || ((opcode->m_arch & current_architecture) == 0))
1355         ++losing;
1356       else
1357         {
1358           int i;
1359
1360           /* Make a copy of the operands of this insn so that
1361              we can modify them safely, should we want to.  */
1362           assert (opsfound <= (int) ARRAY_SIZE (operands_backup));
1363           for (i = 0; i < opsfound; i++)
1364             operands_backup[i] = the_ins.operands[i];
1365
1366           for (s = opcode->m_operands, opP = &operands_backup[0];
1367                *s && !losing;
1368                s += 2, opP++)
1369             {
1370               /* Warning: this switch is huge! */
1371               /* I've tried to organize the cases into this order:
1372                  non-alpha first, then alpha by letter.  Lower-case
1373                  goes directly before uppercase counterpart.  */
1374               /* Code with multiple case ...: gets sorted by the lowest
1375                  case ... it belongs to.  I hope this makes sense.  */
1376               switch (*s)
1377                 {
1378                 case '!':
1379                   switch (opP->mode)
1380                     {
1381                     case IMMED:
1382                     case DREG:
1383                     case AREG:
1384                     case FPREG:
1385                     case CONTROL:
1386                     case AINC:
1387                     case ADEC:
1388                     case REGLST:
1389                       losing++;
1390                       break;
1391                     default:
1392                       break;
1393                     }
1394                   break;
1395
1396                 case '<':
1397                   switch (opP->mode)
1398                     {
1399                     case DREG:
1400                     case AREG:
1401                     case FPREG:
1402                     case CONTROL:
1403                     case IMMED:
1404                     case ADEC:
1405                     case REGLST:
1406                       losing++;
1407                       break;
1408                     default:
1409                       break;
1410                     }
1411                   break;
1412
1413                 case '>':
1414                   switch (opP->mode)
1415                     {
1416                     case DREG:
1417                     case AREG:
1418                     case FPREG:
1419                     case CONTROL:
1420                     case IMMED:
1421                     case AINC:
1422                     case REGLST:
1423                       losing++;
1424                       break;
1425                     case ABSL:
1426                       break;
1427                     default:
1428                       if (opP->reg == PC
1429                           || opP->reg == ZPC)
1430                         losing++;
1431                       break;
1432                     }
1433                   break;
1434
1435                 case 'm':
1436                   switch (opP->mode)
1437                     {
1438                     case DREG:
1439                     case AREG:
1440                     case AINDR:
1441                     case AINC:
1442                     case ADEC:
1443                       break;
1444                     default:
1445                       losing++;
1446                     }
1447                   break;
1448
1449                 case 'n':
1450                   switch (opP->mode)
1451                     {
1452                     case DISP:
1453                       break;
1454                     default:
1455                       losing++;
1456                     }
1457                   break;
1458
1459                 case 'o':
1460                   switch (opP->mode)
1461                     {
1462                     case BASE:
1463                     case ABSL:
1464                     case IMMED:
1465                       break;
1466                     default:
1467                       losing++;
1468                     }
1469                   break;
1470
1471                 case 'p':
1472                   switch (opP->mode)
1473                     {
1474                     case DREG:
1475                     case AREG:
1476                     case AINDR:
1477                     case AINC:
1478                     case ADEC:
1479                       break;
1480                     case DISP:
1481                       if (opP->reg == PC || opP->reg == ZPC)
1482                         losing++;
1483                       break;
1484                     default:
1485                       losing++;
1486                     }
1487                   break;
1488
1489                 case 'q':
1490                   switch (opP->mode)
1491                     {
1492                     case DREG:
1493                     case AINDR:
1494                     case AINC:
1495                     case ADEC:
1496                       break;
1497                     case DISP:
1498                       if (opP->reg == PC || opP->reg == ZPC)
1499                         losing++;
1500                       break;
1501                     default:
1502                       losing++;
1503                       break;
1504                     }
1505                   break;
1506
1507                 case 'v':
1508                   switch (opP->mode)
1509                     {
1510                     case DREG:
1511                     case AINDR:
1512                     case AINC:
1513                     case ADEC:
1514                     case ABSL:
1515                       break;
1516                     case DISP:
1517                       if (opP->reg == PC || opP->reg == ZPC)
1518                         losing++;
1519                       break;
1520                     default:
1521                       losing++;
1522                       break;
1523                     }
1524                   break;
1525
1526                 case '#':
1527                   if (opP->mode != IMMED)
1528                     losing++;
1529                   else if (s[1] == 'b'
1530                            && ! isvar (&opP->disp)
1531                            && (opP->disp.exp.X_op != O_constant
1532                                || ! isbyte (opP->disp.exp.X_add_number)))
1533                     losing++;
1534                   else if (s[1] == 'B'
1535                            && ! isvar (&opP->disp)
1536                            && (opP->disp.exp.X_op != O_constant
1537                                || ! issbyte (opP->disp.exp.X_add_number)))
1538                     losing++;
1539                   else if (s[1] == 'w'
1540                            && ! isvar (&opP->disp)
1541                            && (opP->disp.exp.X_op != O_constant
1542                                || ! isword (opP->disp.exp.X_add_number)))
1543                     losing++;
1544                   else if (s[1] == 'W'
1545                            && ! isvar (&opP->disp)
1546                            && (opP->disp.exp.X_op != O_constant
1547                                || ! issword (opP->disp.exp.X_add_number)))
1548                     losing++;
1549                   break;
1550
1551                 case '^':
1552                 case 'T':
1553                   if (opP->mode != IMMED)
1554                     losing++;
1555                   break;
1556
1557                 case '$':
1558                   if (opP->mode == AREG
1559                       || opP->mode == CONTROL
1560                       || opP->mode == FPREG
1561                       || opP->mode == IMMED
1562                       || opP->mode == REGLST
1563                       || (opP->mode != ABSL
1564                           && (opP->reg == PC
1565                               || opP->reg == ZPC)))
1566                     losing++;
1567                   break;
1568
1569                 case '%':
1570                   if (opP->mode == CONTROL
1571                       || opP->mode == FPREG
1572                       || opP->mode == REGLST
1573                       || opP->mode == IMMED
1574                       || (opP->mode != ABSL
1575                           && (opP->reg == PC
1576                               || opP->reg == ZPC)))
1577                     losing++;
1578                   break;
1579
1580                 case '&':
1581                   switch (opP->mode)
1582                     {
1583                     case DREG:
1584                     case AREG:
1585                     case FPREG:
1586                     case CONTROL:
1587                     case IMMED:
1588                     case AINC:
1589                     case ADEC:
1590                     case REGLST:
1591                       losing++;
1592                       break;
1593                     case ABSL:
1594                       break;
1595                     default:
1596                       if (opP->reg == PC
1597                           || opP->reg == ZPC)
1598                         losing++;
1599                       break;
1600                     }
1601                   break;
1602
1603                 case '*':
1604                   if (opP->mode == CONTROL
1605                       || opP->mode == FPREG
1606                       || opP->mode == REGLST)
1607                     losing++;
1608                   break;
1609
1610                 case '+':
1611                   if (opP->mode != AINC)
1612                     losing++;
1613                   break;
1614
1615                 case '-':
1616                   if (opP->mode != ADEC)
1617                     losing++;
1618                   break;
1619
1620                 case '/':
1621                   switch (opP->mode)
1622                     {
1623                     case AREG:
1624                     case CONTROL:
1625                     case FPREG:
1626                     case AINC:
1627                     case ADEC:
1628                     case IMMED:
1629                     case REGLST:
1630                       losing++;
1631                       break;
1632                     default:
1633                       break;
1634                     }
1635                   break;
1636
1637                 case ';':
1638                   switch (opP->mode)
1639                     {
1640                     case AREG:
1641                     case CONTROL:
1642                     case FPREG:
1643                     case REGLST:
1644                       losing++;
1645                       break;
1646                     default:
1647                       break;
1648                     }
1649                   break;
1650
1651                 case '?':
1652                   switch (opP->mode)
1653                     {
1654                     case AREG:
1655                     case CONTROL:
1656                     case FPREG:
1657                     case AINC:
1658                     case ADEC:
1659                     case IMMED:
1660                     case REGLST:
1661                       losing++;
1662                       break;
1663                     case ABSL:
1664                       break;
1665                     default:
1666                       if (opP->reg == PC || opP->reg == ZPC)
1667                         losing++;
1668                       break;
1669                     }
1670                   break;
1671
1672                 case '@':
1673                   switch (opP->mode)
1674                     {
1675                     case AREG:
1676                     case CONTROL:
1677                     case FPREG:
1678                     case IMMED:
1679                     case REGLST:
1680                       losing++;
1681                       break;
1682                     default:
1683                       break;
1684                     }
1685                   break;
1686
1687                 case '~':       /* For now! (JF FOO is this right?) */
1688                   switch (opP->mode)
1689                     {
1690                     case DREG:
1691                     case AREG:
1692                     case CONTROL:
1693                     case FPREG:
1694                     case IMMED:
1695                     case REGLST:
1696                       losing++;
1697                       break;
1698                     case ABSL:
1699                       break;
1700                     default:
1701                       if (opP->reg == PC
1702                           || opP->reg == ZPC)
1703                         losing++;
1704                       break;
1705                     }
1706                   break;
1707
1708                 case '3':
1709                   if (opP->mode != CONTROL
1710                       || (opP->reg != TT0 && opP->reg != TT1))
1711                     losing++;
1712                   break;
1713
1714                 case 'A':
1715                   if (opP->mode != AREG)
1716                     losing++;
1717                   break;
1718
1719                 case 'a':
1720                   if (opP->mode != AINDR)
1721                     ++losing;
1722                   break;
1723
1724                 case '4':
1725                   if (opP->mode != AINDR && opP->mode != AINC && opP->mode != ADEC
1726                       && (opP->mode != DISP
1727                            || opP->reg < ADDR0
1728                            || opP->reg > ADDR7))
1729                     ++losing;
1730                   break;
1731
1732                 case 'B':       /* FOO */
1733                   if (opP->mode != ABSL
1734                       || (flag_long_jumps
1735                           && strncmp (instring, "jbsr", 4) == 0))
1736                     losing++;
1737                   break;
1738
1739                 case 'b':
1740                   switch (opP->mode)
1741                     {
1742                     case IMMED:
1743                     case ABSL:
1744                     case AREG:
1745                     case FPREG:
1746                     case CONTROL:
1747                     case POST:
1748                     case PRE:
1749                     case REGLST:
1750                       losing++;
1751                       break;
1752                     default:
1753                       break;
1754                     }
1755                   break;
1756
1757                 case 'C':
1758                   if (opP->mode != CONTROL || opP->reg != CCR)
1759                     losing++;
1760                   break;
1761
1762                 case 'd':
1763                   if (opP->mode != DISP
1764                       || opP->reg < ADDR0
1765                       || opP->reg > ADDR7)
1766                     losing++;
1767                   break;
1768
1769                 case 'D':
1770                   if (opP->mode != DREG)
1771                     losing++;
1772                   break;
1773
1774                 case 'E':
1775                   if (opP->reg != ACC)
1776                     losing++;
1777                   break;
1778
1779                 case 'e':
1780                   if (opP->reg != ACC && opP->reg != ACC1
1781                       && opP->reg != ACC2 && opP->reg != ACC3)
1782                     losing++;
1783                   break;
1784
1785                 case 'F':
1786                   if (opP->mode != FPREG)
1787                     losing++;
1788                   break;
1789
1790                 case 'G':
1791                   if (opP->reg != MACSR)
1792                     losing++;
1793                   break;
1794
1795                 case 'g':
1796                   if (opP->reg != ACCEXT01 && opP->reg != ACCEXT23)
1797                     losing++;
1798                   break;
1799
1800                 case 'H':
1801                   if (opP->reg != MASK)
1802                     losing++;
1803                   break;
1804
1805                 case 'I':
1806                   if (opP->mode != CONTROL
1807                       || opP->reg < COP0
1808                       || opP->reg > COP7)
1809                     losing++;
1810                   break;
1811
1812                 case 'i':
1813                   if (opP->mode != LSH && opP->mode != RSH)
1814                     losing++;
1815                   break;
1816
1817                 case 'J':
1818                   if (opP->mode != CONTROL
1819                       || opP->reg < USP
1820                       || opP->reg > last_movec_reg
1821                       || !control_regs)
1822                     losing++;
1823                   else
1824                     {
1825                       const enum m68k_register *rp;
1826                       
1827                       for (rp = control_regs; *rp; rp++)
1828                         {
1829                           if (*rp == opP->reg)
1830                             break;
1831                           /* In most CPUs RAMBAR refers to control reg
1832                              c05 (RAMBAR1), but a few CPUs have it
1833                              refer to c04 (RAMBAR0).  */
1834                           else if (*rp == RAMBAR_ALT && opP->reg == RAMBAR)
1835                             {
1836                               opP->reg = RAMBAR_ALT;
1837                               break;
1838                             }
1839                         }
1840                       if (*rp == 0)
1841                         losing++;
1842                     }
1843                   break;
1844
1845                 case 'k':
1846                   if (opP->mode != IMMED)
1847                     losing++;
1848                   break;
1849
1850                 case 'l':
1851                 case 'L':
1852                   if (opP->mode == DREG
1853                       || opP->mode == AREG
1854                       || opP->mode == FPREG)
1855                     {
1856                       if (s[1] == '8')
1857                         losing++;
1858                       else
1859                         {
1860                           switch (opP->mode)
1861                             {
1862                             case DREG:
1863                               opP->mask = 1 << (opP->reg - DATA0);
1864                               break;
1865                             case AREG:
1866                               opP->mask = 1 << (opP->reg - ADDR0 + 8);
1867                               break;
1868                             case FPREG:
1869                               opP->mask = 1 << (opP->reg - FP0 + 16);
1870                               break;
1871                             default:
1872                               abort ();
1873                             }
1874                           opP->mode = REGLST;
1875                         }
1876                     }
1877                   else if (opP->mode == CONTROL)
1878                     {
1879                       if (s[1] != '8')
1880                         losing++;
1881                       else
1882                         {
1883                           switch (opP->reg)
1884                             {
1885                             case FPI:
1886                               opP->mask = 1 << 24;
1887                               break;
1888                             case FPS:
1889                               opP->mask = 1 << 25;
1890                               break;
1891                             case FPC:
1892                               opP->mask = 1 << 26;
1893                               break;
1894                             default:
1895                               losing++;
1896                               break;
1897                             }
1898                           opP->mode = REGLST;
1899                         }
1900                     }
1901                   else if (opP->mode != REGLST)
1902                     losing++;
1903                   else if (s[1] == '8' && (opP->mask & 0x0ffffff) != 0)
1904                     losing++;
1905                   else if (s[1] == '3' && (opP->mask & 0x7000000) != 0)
1906                     losing++;
1907                   break;
1908
1909                 case 'M':
1910                   if (opP->mode != IMMED)
1911                     losing++;
1912                   else if (opP->disp.exp.X_op != O_constant
1913                            || ! issbyte (opP->disp.exp.X_add_number))
1914                     losing++;
1915                   else if (! m68k_quick
1916                            && instring[3] != 'q'
1917                            && instring[4] != 'q')
1918                     losing++;
1919                   break;
1920
1921                 case 'O':
1922                   if (opP->mode != DREG
1923                       && opP->mode != IMMED
1924                       && opP->mode != ABSL)
1925                     losing++;
1926                   break;
1927
1928                 case 'Q':
1929                   if (opP->mode != IMMED)
1930                     losing++;
1931                   else if (opP->disp.exp.X_op != O_constant
1932                            || TRUNC (opP->disp.exp.X_add_number) - 1 > 7)
1933                     losing++;
1934                   else if (! m68k_quick
1935                            && (strncmp (instring, "add", 3) == 0
1936                                || strncmp (instring, "sub", 3) == 0)
1937                            && instring[3] != 'q')
1938                     losing++;
1939                   break;
1940
1941                 case 'R':
1942                   if (opP->mode != DREG && opP->mode != AREG)
1943                     losing++;
1944                   break;
1945
1946                 case 'r':
1947                   if (opP->mode != AINDR
1948                       && (opP->mode != BASE
1949                           || (opP->reg != 0
1950                               && opP->reg != ZADDR0)
1951                           || opP->disp.exp.X_op != O_absent
1952                           || ((opP->index.reg < DATA0
1953                                || opP->index.reg > DATA7)
1954                               && (opP->index.reg < ADDR0
1955                                   || opP->index.reg > ADDR7))
1956                           || opP->index.size != SIZE_UNSPEC
1957                           || opP->index.scale != 1))
1958                     losing++;
1959                   break;
1960
1961                 case 's':
1962                   if (opP->mode != CONTROL
1963                       || ! (opP->reg == FPI
1964                             || opP->reg == FPS
1965                             || opP->reg == FPC))
1966                     losing++;
1967                   break;
1968
1969                 case 'S':
1970                   if (opP->mode != CONTROL || opP->reg != SR)
1971                     losing++;
1972                   break;
1973
1974                 case 't':
1975                   if (opP->mode != IMMED)
1976                     losing++;
1977                   else if (opP->disp.exp.X_op != O_constant
1978                            || TRUNC (opP->disp.exp.X_add_number) > 7)
1979                     losing++;
1980                   break;
1981
1982                 case 'U':
1983                   if (opP->mode != CONTROL || opP->reg != USP)
1984                     losing++;
1985                   break;
1986
1987                 case 'x':
1988                   if (opP->mode != IMMED)
1989                     losing++;
1990                   else if (opP->disp.exp.X_op != O_constant
1991                            || (TRUNC (opP->disp.exp.X_add_number) != 0xffffffff
1992                                && TRUNC (opP->disp.exp.X_add_number) - 1 > 6))
1993                     losing++;
1994                   break;
1995
1996                 case 'j':
1997                   if (opP->mode != IMMED)
1998                     losing++;
1999                   else if (opP->disp.exp.X_op != O_constant
2000                            || TRUNC (opP->disp.exp.X_add_number) - 1 > 7)
2001                     losing++;
2002                   break;
2003
2004                 case 'K':
2005                   if (opP->mode != IMMED)
2006                     losing++;
2007                   else if (opP->disp.exp.X_op != O_constant
2008                            || TRUNC (opP->disp.exp.X_add_number) > 511)
2009                     losing++;
2010                   break;
2011
2012                   /* JF these are out of order.  We could put them
2013                      in order if we were willing to put up with
2014                      bunches of #ifdef m68851s in the code.
2015
2016                      Don't forget that you need these operands
2017                      to use 68030 MMU instructions.  */
2018 #ifndef NO_68851
2019                   /* Memory addressing mode used by pflushr.  */
2020                 case '|':
2021                   if (opP->mode == CONTROL
2022                       || opP->mode == FPREG
2023                       || opP->mode == DREG
2024                       || opP->mode == AREG
2025                       || opP->mode == REGLST)
2026                     losing++;
2027                   /* We should accept immediate operands, but they
2028                      supposedly have to be quad word, and we don't
2029                      handle that.  I would like to see what a Motorola
2030                      assembler does before doing something here.  */
2031                   if (opP->mode == IMMED)
2032                     losing++;
2033                   break;
2034
2035                 case 'f':
2036                   if (opP->mode != CONTROL
2037                       || (opP->reg != SFC && opP->reg != DFC))
2038                     losing++;
2039                   break;
2040
2041                 case '0':
2042                   if (opP->mode != CONTROL || opP->reg != TC)
2043                     losing++;
2044                   break;
2045
2046                 case '1':
2047                   if (opP->mode != CONTROL || opP->reg != AC)
2048                     losing++;
2049                   break;
2050
2051                 case '2':
2052                   if (opP->mode != CONTROL
2053                       || (opP->reg != CAL
2054                           && opP->reg != VAL
2055                           && opP->reg != SCC))
2056                     losing++;
2057                   break;
2058
2059                 case 'V':
2060                   if (opP->mode != CONTROL
2061                       || opP->reg != VAL)
2062                     losing++;
2063                   break;
2064
2065                 case 'W':
2066                   if (opP->mode != CONTROL
2067                       || (opP->reg != DRP
2068                           && opP->reg != SRP
2069                           && opP->reg != CRP))
2070                     losing++;
2071                   break;
2072
2073                 case 'w':
2074                   switch (opP->mode)
2075                     {
2076                       case IMMED:
2077                       case ABSL:
2078                       case AREG:
2079                       case DREG:
2080                       case FPREG:
2081                       case CONTROL:
2082                       case POST:
2083                       case PRE:
2084                       case REGLST:
2085                         losing++;
2086                         break;
2087                       default:
2088                         break;
2089                     }
2090                   break;
2091
2092                 case 'X':
2093                   if (opP->mode != CONTROL
2094                       || (!(opP->reg >= BAD && opP->reg <= BAD + 7)
2095                           && !(opP->reg >= BAC && opP->reg <= BAC + 7)))
2096                     losing++;
2097                   break;
2098
2099                 case 'Y':
2100                   if (opP->mode != CONTROL || opP->reg != PSR)
2101                     losing++;
2102                   break;
2103
2104                 case 'Z':
2105                   if (opP->mode != CONTROL || opP->reg != PCSR)
2106                     losing++;
2107                   break;
2108 #endif
2109                 case 'c':
2110                   if (opP->mode != CONTROL
2111                       || (opP->reg != NC
2112                           && opP->reg != IC
2113                           && opP->reg != DC
2114                           && opP->reg != BC))
2115                     losing++;
2116                   break;
2117
2118                 case '_':
2119                   if (opP->mode != ABSL)
2120                     ++losing;
2121                   break;
2122
2123                 case 'u':
2124                   if (opP->reg < DATA0L || opP->reg > ADDR7U)
2125                     losing++;
2126                   /* FIXME: kludge instead of fixing parser:
2127                      upper/lower registers are *not* CONTROL
2128                      registers, but ordinary ones.  */
2129                   if ((opP->reg >= DATA0L && opP->reg <= DATA7L)
2130                       || (opP->reg >= DATA0U && opP->reg <= DATA7U))
2131                     opP->mode = DREG;
2132                   else
2133                     opP->mode = AREG;
2134                   break;
2135
2136                  case 'y':
2137                    if (!(opP->mode == AINDR
2138                          || (opP->mode == DISP
2139                              && !(opP->reg == PC || opP->reg == ZPC))))
2140                      losing++;
2141                    break;
2142
2143                  case 'z':
2144                    if (!(opP->mode == AINDR || opP->mode == DISP))
2145                      losing++;
2146                    break;
2147
2148                 default:
2149                   abort ();
2150                 }
2151
2152               if (losing)
2153                 break;
2154             }
2155
2156           /* Since we have found the correct instruction, copy
2157              in the modifications that we may have made.  */
2158           if (!losing)
2159             for (i = 0; i < opsfound; i++)
2160               the_ins.operands[i] = operands_backup[i];
2161         }
2162
2163       if (!losing)
2164         break;
2165
2166       opcode = opcode->m_next;
2167
2168       if (!opcode)
2169         {
2170           if (ok_arch
2171               && !(ok_arch & current_architecture))
2172             {
2173               const struct m68k_cpu *cpu;
2174               int any = 0;
2175               size_t space = 400;
2176               char *buf = xmalloc (space + 1);
2177               size_t len;
2178               int paren = 1;
2179
2180               the_ins.error = buf;
2181               /* Make sure there's a NUL at the end of the buffer -- strncpy
2182                  won't write one when it runs out of buffer.  */
2183               buf[space] = 0;
2184 #define APPEND(STRING) \
2185   (strncpy (buf, STRING, space), len = strlen (buf), buf += len, space -= len)
2186
2187               APPEND (_("invalid instruction for this architecture; needs "));
2188               switch (ok_arch)
2189                 {
2190                 case mcfisa_a:
2191                   APPEND ("ColdFire ISA_A");
2192                   break;
2193                 case mcfhwdiv:
2194                   APPEND ("ColdFire ");
2195                   APPEND (_("hardware divide"));
2196                   break;
2197                 case mcfisa_aa:
2198                   APPEND ("ColdFire ISA_A+");
2199                   break;
2200                 case mcfisa_b:
2201                   APPEND ("ColdFire ISA_B");
2202                   break;
2203                 case mcfisa_c:
2204                   APPEND ("ColdFire ISA_C");
2205                   break;
2206                 case cfloat:
2207                   APPEND ("ColdFire fpu");
2208                   break;
2209                 case mfloat:
2210                   APPEND ("M68K fpu");
2211                   break;
2212                 case mmmu:
2213                   APPEND ("M68K mmu");
2214                   break;
2215                 case m68020up:
2216                   APPEND ("68020 ");
2217                   APPEND (_("or higher"));
2218                   break;
2219                 case m68000up:
2220                   APPEND ("68000 ");
2221                   APPEND (_("or higher"));
2222                   break;
2223                 case m68010up:
2224                   APPEND ("68010 ");
2225                   APPEND (_("or higher"));
2226                   break;
2227                 default:
2228                   paren = 0;
2229                 }
2230               if (paren)
2231                 APPEND (" (");
2232
2233               for (cpu = m68k_cpus; cpu->name; cpu++)
2234                 if (!cpu->alias && (cpu->arch & ok_arch))
2235                   {
2236                     const struct m68k_cpu *alias;
2237                     int seen_master = 0;
2238                     
2239                     if (any)
2240                       APPEND (", ");
2241                     any = 0;
2242                     APPEND (cpu->name);
2243                     for (alias = cpu; alias != m68k_cpus; alias--)
2244                       if (alias[-1].alias >= 0)
2245                         break;
2246                     for (; !seen_master || alias->alias > 0; alias++)
2247                         {
2248                           if (!alias->alias)
2249                             seen_master = 1;
2250                           else
2251                             {
2252                               if (any)
2253                                 APPEND (", ");
2254                               else
2255                                 APPEND (" [");
2256                               APPEND (alias->name);
2257                               any = 1;
2258                             }
2259                         }
2260                     if (any)
2261                       APPEND ("]");
2262                     any = 1;
2263                   }
2264               if (paren)
2265                 APPEND (")");
2266 #undef APPEND
2267               if (!space)
2268                 {
2269                   /* We ran out of space, so replace the end of the list
2270                      with ellipsis.  */
2271                   buf -= 4;
2272                   while (*buf != ' ')
2273                     buf--;
2274                   strcpy (buf, " ...");
2275                 }
2276             }
2277           else
2278             the_ins.error = _("operands mismatch");
2279           return;
2280         }
2281
2282       losing = 0;
2283     }
2284
2285   /* Now assemble it.  */
2286   the_ins.args = opcode->m_operands;
2287   the_ins.numargs = opcode->m_opnum;
2288   the_ins.numo = opcode->m_codenum;
2289   the_ins.opcode[0] = getone (opcode);
2290   the_ins.opcode[1] = gettwo (opcode);
2291
2292   for (s = the_ins.args, opP = &the_ins.operands[0]; *s; s += 2, opP++)
2293     {
2294       int have_disp = 0;
2295       int use_pl = 0;
2296       
2297       /* This switch is a doozy.
2298          Watch the first step; its a big one! */
2299       switch (s[0])
2300         {
2301
2302         case '*':
2303         case '~':
2304         case '%':
2305         case ';':
2306         case '@':
2307         case '!':
2308         case '&':
2309         case '$':
2310         case '?':
2311         case '/':
2312         case '<':
2313         case '>':
2314         case 'b':
2315         case 'm':
2316         case 'n':
2317         case 'o':
2318         case 'p':
2319         case 'q':
2320         case 'v':
2321         case 'w':
2322         case 'y':
2323         case 'z':
2324         case '4':
2325 #ifndef NO_68851
2326         case '|':
2327 #endif
2328           switch (opP->mode)
2329             {
2330             case IMMED:
2331               tmpreg = 0x3c;    /* 7.4 */
2332               if (strchr ("bwl", s[1]))
2333                 nextword = get_num (&opP->disp, 90);
2334               else
2335                 nextword = get_num (&opP->disp, 0);
2336               if (isvar (&opP->disp))
2337                 add_fix (s[1], &opP->disp, 0, 0);
2338               switch (s[1])
2339                 {
2340                 case 'b':
2341                   if (!isbyte (nextword))
2342                     opP->error = _("operand out of range");
2343                   addword (nextword);
2344                   baseo = 0;
2345                   break;
2346                 case 'w':
2347                   if (!isword (nextword))
2348                     opP->error = _("operand out of range");
2349                   addword (nextword);
2350                   baseo = 0;
2351                   break;
2352                 case 'W':
2353                   if (!issword (nextword))
2354                     opP->error = _("operand out of range");
2355                   addword (nextword);
2356                   baseo = 0;
2357                   break;
2358                 case 'l':
2359                   addword (nextword >> 16);
2360                   addword (nextword);
2361                   baseo = 0;
2362                   break;
2363
2364                 case 'f':
2365                   baseo = 2;
2366                   outro = 8;
2367                   break;
2368                 case 'F':
2369                   baseo = 4;
2370                   outro = 11;
2371                   break;
2372                 case 'x':
2373                   baseo = 6;
2374                   outro = 15;
2375                   break;
2376                 case 'p':
2377                   baseo = 6;
2378                   outro = -1;
2379                   break;
2380                 default:
2381                   abort ();
2382                 }
2383               if (!baseo)
2384                 break;
2385
2386               /* We gotta put out some float.  */
2387               if (op (&opP->disp) != O_big)
2388                 {
2389                   valueT val;
2390                   int gencnt;
2391
2392                   /* Can other cases happen here?  */
2393                   if (op (&opP->disp) != O_constant)
2394                     abort ();
2395
2396                   val = (valueT) offs (&opP->disp);
2397                   gencnt = 0;
2398                   do
2399                     {
2400                       generic_bignum[gencnt] = (LITTLENUM_TYPE) val;
2401                       val >>= LITTLENUM_NUMBER_OF_BITS;
2402                       ++gencnt;
2403                     }
2404                   while (val != 0);
2405                   offs (&opP->disp) = gencnt;
2406                 }
2407               if (offs (&opP->disp) > 0)
2408                 {
2409                   if (offs (&opP->disp) > baseo)
2410                     {
2411                       as_warn (_("Bignum too big for %c format; truncated"),
2412                                s[1]);
2413                       offs (&opP->disp) = baseo;
2414                     }
2415                   baseo -= offs (&opP->disp);
2416                   while (baseo--)
2417                     addword (0);
2418                   for (wordp = generic_bignum + offs (&opP->disp) - 1;
2419                        offs (&opP->disp)--;
2420                        --wordp)
2421                     addword (*wordp);
2422                   break;
2423                 }
2424               gen_to_words (words, baseo, (long) outro);
2425               for (wordp = words; baseo--; wordp++)
2426                 addword (*wordp);
2427               break;
2428             case DREG:
2429               tmpreg = opP->reg - DATA; /* 0.dreg */
2430               break;
2431             case AREG:
2432               tmpreg = 0x08 + opP->reg - ADDR;  /* 1.areg */
2433               break;
2434             case AINDR:
2435               tmpreg = 0x10 + opP->reg - ADDR;  /* 2.areg */
2436               break;
2437             case ADEC:
2438               tmpreg = 0x20 + opP->reg - ADDR;  /* 4.areg */
2439               break;
2440             case AINC:
2441               tmpreg = 0x18 + opP->reg - ADDR;  /* 3.areg */
2442               break;
2443             case DISP:
2444
2445               nextword = get_num (&opP->disp, 90);
2446
2447               /* Convert mode 5 addressing with a zero offset into
2448                  mode 2 addressing to reduce the instruction size by a
2449                  word.  */
2450               if (! isvar (&opP->disp)
2451                   && (nextword == 0)
2452                   && (opP->disp.size == SIZE_UNSPEC)
2453                   && (opP->reg >= ADDR0)
2454                   && (opP->reg <= ADDR7))
2455                 {
2456                   tmpreg = 0x10 + opP->reg - ADDR; /* 2.areg */
2457                   break;
2458                 }
2459
2460               if (opP->reg == PC
2461                   && ! isvar (&opP->disp)
2462                   && m68k_abspcadd)
2463                 {
2464                   opP->disp.exp.X_op = O_symbol;
2465                   opP->disp.exp.X_add_symbol =
2466                     section_symbol (absolute_section);
2467                 }
2468
2469               /* Force into index mode.  Hope this works.  */
2470
2471               /* We do the first bit for 32-bit displacements, and the
2472                  second bit for 16 bit ones.  It is possible that we
2473                  should make the default be WORD instead of LONG, but
2474                  I think that'd break GCC, so we put up with a little
2475                  inefficiency for the sake of working output.  */
2476
2477               if (!issword (nextword)
2478                   || (isvar (&opP->disp)
2479                       && ((opP->disp.size == SIZE_UNSPEC
2480                            && flag_short_refs == 0
2481                            && cpu_of_arch (current_architecture) >= m68020
2482                            && ! arch_coldfire_p (current_architecture))
2483                           || opP->disp.size == SIZE_LONG)))
2484                 {
2485                   if (cpu_of_arch (current_architecture) < m68020
2486                       || arch_coldfire_p (current_architecture))
2487                     opP->error =
2488                       _("displacement too large for this architecture; needs 68020 or higher");
2489                   if (opP->reg == PC)
2490                     tmpreg = 0x3B;      /* 7.3 */
2491                   else
2492                     tmpreg = 0x30 + opP->reg - ADDR;    /* 6.areg */
2493                   if (isvar (&opP->disp))
2494                     {
2495                       if (opP->reg == PC)
2496                         {
2497                           if (opP->disp.size == SIZE_LONG
2498 #ifdef OBJ_ELF
2499                               /* If the displacement needs pic
2500                                  relocation it cannot be relaxed.  */
2501                               || opP->disp.pic_reloc != pic_none
2502 #endif
2503                               )
2504                             {
2505                               addword (0x0170);
2506                               add_fix ('l', &opP->disp, 1, 2);
2507                             }
2508                           else
2509                             {
2510                               add_frag (adds (&opP->disp),
2511                                         SEXT (offs (&opP->disp)),
2512                                         TAB (PCREL1632, SZ_UNDEF));
2513                               break;
2514                             }
2515                         }
2516                       else
2517                         {
2518                           addword (0x0170);
2519                           add_fix ('l', &opP->disp, 0, 0);
2520                         }
2521                     }
2522                   else
2523                     addword (0x0170);
2524                   addword (nextword >> 16);
2525                 }
2526               else
2527                 {
2528                   if (opP->reg == PC)
2529                     tmpreg = 0x3A;      /* 7.2 */
2530                   else
2531                     tmpreg = 0x28 + opP->reg - ADDR;    /* 5.areg */
2532
2533                   if (isvar (&opP->disp))
2534                     {
2535                       if (opP->reg == PC)
2536                         {
2537                           add_fix ('w', &opP->disp, 1, 0);
2538                         }
2539                       else
2540                         add_fix ('w', &opP->disp, 0, 0);
2541                     }
2542                 }
2543               addword (nextword);
2544               break;
2545
2546             case POST:
2547             case PRE:
2548             case BASE:
2549               nextword = 0;
2550               baseo = get_num (&opP->disp, 90);
2551               if (opP->mode == POST || opP->mode == PRE)
2552                 outro = get_num (&opP->odisp, 90);
2553               /* Figure out the `addressing mode'.
2554                  Also turn on the BASE_DISABLE bit, if needed.  */
2555               if (opP->reg == PC || opP->reg == ZPC)
2556                 {
2557                   tmpreg = 0x3b;        /* 7.3 */
2558                   if (opP->reg == ZPC)
2559                     nextword |= 0x80;
2560                 }
2561               else if (opP->reg == 0)
2562                 {
2563                   nextword |= 0x80;
2564                   tmpreg = 0x30;        /* 6.garbage */
2565                 }
2566               else if (opP->reg >= ZADDR0 && opP->reg <= ZADDR7)
2567                 {
2568                   nextword |= 0x80;
2569                   tmpreg = 0x30 + opP->reg - ZADDR0;
2570                 }
2571               else
2572                 tmpreg = 0x30 + opP->reg - ADDR;        /* 6.areg */
2573
2574               siz1 = opP->disp.size;
2575               if (opP->mode == POST || opP->mode == PRE)
2576                 siz2 = opP->odisp.size;
2577               else
2578                 siz2 = SIZE_UNSPEC;
2579
2580               /* Index register stuff.  */
2581               if (opP->index.reg != 0
2582                   && opP->index.reg >= DATA
2583                   && opP->index.reg <= ADDR7)
2584                 {
2585                   nextword |= (opP->index.reg - DATA) << 12;
2586
2587                   if (opP->index.size == SIZE_LONG
2588                       || (opP->index.size == SIZE_UNSPEC
2589                           && m68k_index_width_default == SIZE_LONG))
2590                     nextword |= 0x800;
2591
2592                   if ((opP->index.scale != 1
2593                        && cpu_of_arch (current_architecture) < m68020)
2594                       || (opP->index.scale == 8
2595                           && (arch_coldfire_p (current_architecture)
2596                               && !arch_coldfire_fpu (current_architecture))))
2597                     {
2598                       opP->error =
2599                         _("scale factor invalid on this architecture; needs cpu32 or 68020 or higher");
2600                     }
2601
2602                   if (arch_coldfire_p (current_architecture)
2603                       && opP->index.size == SIZE_WORD)
2604                     opP->error = _("invalid index size for coldfire");
2605
2606                   switch (opP->index.scale)
2607                     {
2608                     case 1:
2609                       break;
2610                     case 2:
2611                       nextword |= 0x200;
2612                       break;
2613                     case 4:
2614                       nextword |= 0x400;
2615                       break;
2616                     case 8:
2617                       nextword |= 0x600;
2618                       break;
2619                     default:
2620                       abort ();
2621                     }
2622                   /* IF its simple,
2623                      GET US OUT OF HERE! */
2624
2625                   /* Must be INDEX, with an index register.  Address
2626                      register cannot be ZERO-PC, and either :b was
2627                      forced, or we know it will fit.  For a 68000 or
2628                      68010, force this mode anyways, because the
2629                      larger modes aren't supported.  */
2630                   if (opP->mode == BASE
2631                       && ((opP->reg >= ADDR0
2632                            && opP->reg <= ADDR7)
2633                           || opP->reg == PC))
2634                     {
2635                       if (siz1 == SIZE_BYTE
2636                           || cpu_of_arch (current_architecture) < m68020
2637                           || arch_coldfire_p (current_architecture)
2638                           || (siz1 == SIZE_UNSPEC
2639                               && ! isvar (&opP->disp)
2640                               && issbyte (baseo)))
2641                         {
2642                           nextword += baseo & 0xff;
2643                           addword (nextword);
2644                           if (isvar (&opP->disp))
2645                             {
2646                               /* Do a byte relocation.  If it doesn't
2647                                  fit (possible on m68000) let the
2648                                  fixup processing complain later.  */
2649                               if (opP->reg == PC)
2650                                 add_fix ('B', &opP->disp, 1, 1);
2651                               else
2652                                 add_fix ('B', &opP->disp, 0, 0);
2653                             }
2654                           else if (siz1 != SIZE_BYTE)
2655                             {
2656                               if (siz1 != SIZE_UNSPEC)
2657                                 as_warn (_("Forcing byte displacement"));
2658                               if (! issbyte (baseo))
2659                                 opP->error = _("byte displacement out of range");
2660                             }
2661
2662                           break;
2663                         }
2664                       else if (siz1 == SIZE_UNSPEC
2665                                && opP->reg == PC
2666                                && isvar (&opP->disp)
2667                                && subs (&opP->disp) == NULL
2668 #ifdef OBJ_ELF
2669                                /* If the displacement needs pic
2670                                   relocation it cannot be relaxed.  */
2671                                && opP->disp.pic_reloc == pic_none
2672 #endif
2673                                )
2674                         {
2675                           /* The code in md_convert_frag_1 needs to be
2676                              able to adjust nextword.  Call frag_grow
2677                              to ensure that we have enough space in
2678                              the frag obstack to make all the bytes
2679                              contiguous.  */
2680                           frag_grow (14);
2681                           nextword += baseo & 0xff;
2682                           addword (nextword);
2683                           add_frag (adds (&opP->disp),
2684                                     SEXT (offs (&opP->disp)),
2685                                     TAB (PCINDEX, SZ_UNDEF));
2686
2687                           break;
2688                         }
2689                     }
2690                 }
2691               else
2692                 {
2693                   nextword |= 0x40;     /* No index reg.  */
2694                   if (opP->index.reg >= ZDATA0
2695                       && opP->index.reg <= ZDATA7)
2696                     nextword |= (opP->index.reg - ZDATA0) << 12;
2697                   else if (opP->index.reg >= ZADDR0
2698                            || opP->index.reg <= ZADDR7)
2699                     nextword |= (opP->index.reg - ZADDR0 + 8) << 12;
2700                 }
2701
2702               /* It isn't simple.  */
2703
2704               if (cpu_of_arch (current_architecture) < m68020
2705                   || arch_coldfire_p (current_architecture))
2706                 opP->error =
2707                   _("invalid operand mode for this architecture; needs 68020 or higher");
2708
2709               nextword |= 0x100;
2710               /* If the guy specified a width, we assume that it is
2711                  wide enough.  Maybe it isn't.  If so, we lose.  */
2712               switch (siz1)
2713                 {
2714                 case SIZE_UNSPEC:
2715                   if (isvar (&opP->disp)
2716                       ? m68k_rel32
2717                       : ! issword (baseo))
2718                     {
2719                       siz1 = SIZE_LONG;
2720                       nextword |= 0x30;
2721                     }
2722                   else if (! isvar (&opP->disp) && baseo == 0)
2723                     nextword |= 0x10;
2724                   else
2725                     {
2726                       nextword |= 0x20;
2727                       siz1 = SIZE_WORD;
2728                     }
2729                   break;
2730                 case SIZE_BYTE:
2731                   as_warn (_(":b not permitted; defaulting to :w"));
2732                   /* Fall through.  */
2733                 case SIZE_WORD:
2734                   nextword |= 0x20;
2735                   break;
2736                 case SIZE_LONG:
2737                   nextword |= 0x30;
2738                   break;
2739                 }
2740
2741               /* Figure out inner displacement stuff.  */
2742               if (opP->mode == POST || opP->mode == PRE)
2743                 {
2744                   if (cpu_of_arch (current_architecture) & cpu32)
2745                     opP->error = _("invalid operand mode for this architecture; needs 68020 or higher");
2746                   switch (siz2)
2747                     {
2748                     case SIZE_UNSPEC:
2749                       if (isvar (&opP->odisp)
2750                           ? m68k_rel32
2751                           : ! issword (outro))
2752                         {
2753                           siz2 = SIZE_LONG;
2754                           nextword |= 0x3;
2755                         }
2756                       else if (! isvar (&opP->odisp) && outro == 0)
2757                         nextword |= 0x1;
2758                       else
2759                         {
2760                           nextword |= 0x2;
2761                           siz2 = SIZE_WORD;
2762                         }
2763                       break;
2764                     case 1:
2765                       as_warn (_(":b not permitted; defaulting to :w"));
2766                       /* Fall through.  */
2767                     case 2:
2768                       nextword |= 0x2;
2769                       break;
2770                     case 3:
2771                       nextword |= 0x3;
2772                       break;
2773                     }
2774                   if (opP->mode == POST
2775                       && (nextword & 0x40) == 0)
2776                     nextword |= 0x04;
2777                 }
2778               addword (nextword);
2779
2780               if (siz1 != SIZE_UNSPEC && isvar (&opP->disp))
2781                 {
2782                   if (opP->reg == PC || opP->reg == ZPC)
2783                     add_fix (siz1 == SIZE_LONG ? 'l' : 'w', &opP->disp, 1, 2);
2784                   else
2785                     add_fix (siz1 == SIZE_LONG ? 'l' : 'w', &opP->disp, 0, 0);
2786                 }
2787               if (siz1 == SIZE_LONG)
2788                 addword (baseo >> 16);
2789               if (siz1 != SIZE_UNSPEC)
2790                 addword (baseo);
2791
2792               if (siz2 != SIZE_UNSPEC && isvar (&opP->odisp))
2793                 add_fix (siz2 == SIZE_LONG ? 'l' : 'w', &opP->odisp, 0, 0);
2794               if (siz2 == SIZE_LONG)
2795                 addword (outro >> 16);
2796               if (siz2 != SIZE_UNSPEC)
2797                 addword (outro);
2798
2799               break;
2800
2801             case ABSL:
2802               nextword = get_num (&opP->disp, 90);
2803               switch (opP->disp.size)
2804                 {
2805                 default:
2806                   abort ();
2807                 case SIZE_UNSPEC:
2808                   if (!isvar (&opP->disp) && issword (offs (&opP->disp)))
2809                     {
2810                       tmpreg = 0x38;    /* 7.0 */
2811                       addword (nextword);
2812                       break;
2813                     }
2814                   if (isvar (&opP->disp)
2815                       && !subs (&opP->disp)
2816                       && adds (&opP->disp)
2817 #ifdef OBJ_ELF
2818                       /* If the displacement needs pic relocation it
2819                          cannot be relaxed.  */
2820                       && opP->disp.pic_reloc == pic_none
2821 #endif
2822                       && !flag_long_jumps
2823                       && !strchr ("~%&$?", s[0]))
2824                     {
2825                       tmpreg = 0x3A;    /* 7.2 */
2826                       add_frag (adds (&opP->disp),
2827                                 SEXT (offs (&opP->disp)),
2828                                 TAB (ABSTOPCREL, SZ_UNDEF));
2829                       break;
2830                     }
2831                   /* Fall through into long.  */
2832                 case SIZE_LONG:
2833                   if (isvar (&opP->disp))
2834                     add_fix ('l', &opP->disp, 0, 0);
2835
2836                   tmpreg = 0x39;/* 7.1 mode */
2837                   addword (nextword >> 16);
2838                   addword (nextword);
2839                   break;
2840
2841                 case SIZE_BYTE:
2842                   as_bad (_("unsupported byte value; use a different suffix"));
2843                   /* Fall through.  */
2844
2845                 case SIZE_WORD:
2846                   if (isvar (&opP->disp))
2847                     add_fix ('w', &opP->disp, 0, 0);
2848
2849                   tmpreg = 0x38;/* 7.0 mode */
2850                   addword (nextword);
2851                   break;
2852                 }
2853               break;
2854             case CONTROL:
2855             case FPREG:
2856             default:
2857               as_bad (_("unknown/incorrect operand"));
2858               /* abort (); */
2859             }
2860
2861           /* If s[0] is '4', then this is for the mac instructions
2862              that can have a trailing_ampersand set.  If so, set 0x100
2863              bit on tmpreg so install_gen_operand can check for it and
2864              set the appropriate bit (word2, bit 5).  */
2865           if (s[0] == '4')
2866             {
2867               if (opP->trailing_ampersand)
2868                 tmpreg |= 0x100;
2869             }
2870           install_gen_operand (s[1], tmpreg);
2871           break;
2872
2873         case '#':
2874         case '^':
2875           switch (s[1])
2876             {                   /* JF: I hate floating point! */
2877             case 'j':
2878               tmpreg = 70;
2879               break;
2880             case '8':
2881               tmpreg = 20;
2882               break;
2883             case 'C':
2884               tmpreg = 50;
2885               break;
2886             case '3':
2887             default:
2888               tmpreg = 90;
2889               break;
2890             }
2891           tmpreg = get_num (&opP->disp, tmpreg);
2892           if (isvar (&opP->disp))
2893             add_fix (s[1], &opP->disp, 0, 0);
2894           switch (s[1])
2895             {
2896             case 'b':           /* Danger:  These do no check for
2897                                    certain types of overflow.
2898                                    user beware! */
2899               if (!isbyte (tmpreg))
2900                 opP->error = _("out of range");
2901               insop (tmpreg, opcode);
2902               if (isvar (&opP->disp))
2903                 the_ins.reloc[the_ins.nrel - 1].n =
2904                   (opcode->m_codenum) * 2 + 1;
2905               break;
2906             case 'B':
2907               if (!issbyte (tmpreg))
2908                 opP->error = _("out of range");
2909               the_ins.opcode[the_ins.numo - 1] |= tmpreg & 0xff;
2910               if (isvar (&opP->disp))
2911                 the_ins.reloc[the_ins.nrel - 1].n = opcode->m_codenum * 2 - 1;
2912               break;
2913             case 'w':
2914               if (!isword (tmpreg))
2915                 opP->error = _("out of range");
2916               insop (tmpreg, opcode);
2917               if (isvar (&opP->disp))
2918                 the_ins.reloc[the_ins.nrel - 1].n = (opcode->m_codenum) * 2;
2919               break;
2920             case 'W':
2921               if (!issword (tmpreg))
2922                 opP->error = _("out of range");
2923               insop (tmpreg, opcode);
2924               if (isvar (&opP->disp))
2925                 the_ins.reloc[the_ins.nrel - 1].n = (opcode->m_codenum) * 2;
2926               break;
2927             case 'l':
2928               /* Because of the way insop works, we put these two out
2929                  backwards.  */
2930               insop (tmpreg, opcode);
2931               insop (tmpreg >> 16, opcode);
2932               if (isvar (&opP->disp))
2933                 the_ins.reloc[the_ins.nrel - 1].n = (opcode->m_codenum) * 2;
2934               break;
2935             case '3':
2936               tmpreg &= 0xFF;
2937             case '8':
2938             case 'C':
2939             case 'j':
2940               install_operand (s[1], tmpreg);
2941               break;
2942             default:
2943               abort ();
2944             }
2945           break;
2946
2947         case '+':
2948         case '-':
2949         case 'A':
2950         case 'a':
2951           install_operand (s[1], opP->reg - ADDR);
2952           break;
2953
2954         case 'B':
2955           tmpreg = get_num (&opP->disp, 90);
2956           
2957           switch (s[1])
2958             {
2959             case 'B':
2960               add_fix ('B', &opP->disp, 1, -1);
2961               break;
2962             case 'W':
2963               add_fix ('w', &opP->disp, 1, 0);
2964               addword (0);
2965               break;
2966             case 'L':
2967             long_branch:
2968               the_ins.opcode[0] |= 0xff;
2969               add_fix ('l', &opP->disp, 1, 0);
2970               addword (0);
2971               addword (0);
2972               break;
2973             case 'g': /* Conditional branch */
2974               have_disp = HAVE_LONG_CALL (current_architecture);
2975               goto var_branch;
2976               
2977             case 'b': /* Unconditional branch */
2978               have_disp = HAVE_LONG_BRANCH (current_architecture);
2979               use_pl = LONG_BRANCH_VIA_COND (current_architecture);
2980               goto var_branch;
2981               
2982             case 's': /* Unconditional subroutine */
2983               have_disp = HAVE_LONG_CALL (current_architecture);
2984               
2985               var_branch:
2986               if (subs (&opP->disp)     /* We can't relax it.  */
2987 #ifdef OBJ_ELF
2988                   /* If the displacement needs pic relocation it cannot be
2989                      relaxed.  */
2990                   || opP->disp.pic_reloc != pic_none
2991 #endif
2992                   || 0)
2993                 {
2994                   if (!have_disp)
2995                     as_warn (_("Can't use long branches on this architecture"));
2996                   goto long_branch;
2997                 }
2998               
2999               /* This could either be a symbol, or an absolute
3000                  address.  If it's an absolute address, turn it into
3001                  an absolute jump right here and keep it out of the
3002                  relaxer.  */
3003               if (adds (&opP->disp) == 0)
3004                 {
3005                   if (the_ins.opcode[0] == 0x6000)      /* jbra */
3006                     the_ins.opcode[0] = 0x4EF9;
3007                   else if (the_ins.opcode[0] == 0x6100) /* jbsr */
3008                     the_ins.opcode[0] = 0x4EB9;
3009                   else                                  /* jCC */
3010                     {
3011                       the_ins.opcode[0] ^= 0x0100;
3012                       the_ins.opcode[0] |= 0x0006;
3013                       addword (0x4EF9);
3014                     }
3015                   add_fix ('l', &opP->disp, 0, 0);
3016                   addword (0);
3017                   addword (0);
3018                   break;
3019                 }
3020
3021               /* Now we know it's going into the relaxer.  Now figure
3022                  out which mode.  We try in this order of preference:
3023                  long branch, absolute jump, byte/word branches only.  */
3024               if (have_disp)
3025                 add_frag (adds (&opP->disp),
3026                           SEXT (offs (&opP->disp)),
3027                           TAB (BRANCHBWL, SZ_UNDEF));
3028               else if (! flag_keep_pcrel)
3029                 {
3030                   if ((the_ins.opcode[0] == 0x6000)
3031                       || (the_ins.opcode[0] == 0x6100))
3032                     add_frag (adds (&opP->disp),
3033                               SEXT (offs (&opP->disp)),
3034                               TAB (BRABSJUNC, SZ_UNDEF));
3035                   else
3036                     add_frag (adds (&opP->disp),
3037                               SEXT (offs (&opP->disp)),
3038                               TAB (BRABSJCOND, SZ_UNDEF));
3039                 }
3040               else
3041                 add_frag (adds (&opP->disp),
3042                           SEXT (offs (&opP->disp)),
3043                           (use_pl ? TAB (BRANCHBWPL, SZ_UNDEF)
3044                            : TAB (BRANCHBW, SZ_UNDEF)));
3045               break;
3046             case 'w':
3047               if (isvar (&opP->disp))
3048                 {
3049                   /* Check for DBcc instructions.  We can relax them,
3050                      but only if we have long branches and/or absolute
3051                      jumps.  */
3052                   if (((the_ins.opcode[0] & 0xf0f8) == 0x50c8)
3053                       && (HAVE_LONG_BRANCH (current_architecture)
3054                           || ! flag_keep_pcrel))
3055                     {
3056                       if (HAVE_LONG_BRANCH (current_architecture))
3057                         add_frag (adds (&opP->disp),
3058                                   SEXT (offs (&opP->disp)),
3059                                   TAB (DBCCLBR, SZ_UNDEF));
3060                       else
3061                         add_frag (adds (&opP->disp),
3062                                   SEXT (offs (&opP->disp)),
3063                                   TAB (DBCCABSJ, SZ_UNDEF));
3064                       break;
3065                     }
3066                   add_fix ('w', &opP->disp, 1, 0);
3067                 }
3068               addword (0);
3069               break;
3070             case 'C':           /* Fixed size LONG coproc branches.  */
3071               add_fix ('l', &opP->disp, 1, 0);
3072               addword (0);
3073               addword (0);
3074               break;
3075             case 'c':           /* Var size Coprocesssor branches.  */
3076               if (subs (&opP->disp) || (adds (&opP->disp) == 0))
3077                 {
3078                   the_ins.opcode[the_ins.numo - 1] |= 0x40;
3079                   add_fix ('l', &opP->disp, 1, 0);
3080                   addword (0);
3081                   addword (0);
3082                 }
3083               else
3084                 add_frag (adds (&opP->disp),
3085                           SEXT (offs (&opP->disp)),
3086                           TAB (FBRANCH, SZ_UNDEF));
3087               break;
3088             default:
3089               abort ();
3090             }
3091           break;
3092
3093         case 'C':               /* Ignore it.  */
3094           break;
3095
3096         case 'd':               /* JF this is a kludge.  */
3097           install_operand ('s', opP->reg - ADDR);
3098           tmpreg = get_num (&opP->disp, 90);
3099           if (!issword (tmpreg))
3100             {
3101               as_warn (_("Expression out of range, using 0"));
3102               tmpreg = 0;
3103             }
3104           addword (tmpreg);
3105           break;
3106
3107         case 'D':
3108           install_operand (s[1], opP->reg - DATA);
3109           break;
3110
3111         case 'e':  /* EMAC ACCx, reg/reg.  */
3112           install_operand (s[1], opP->reg - ACC);
3113           break;
3114           
3115         case 'E':               /* Ignore it.  */
3116           break;
3117
3118         case 'F':
3119           install_operand (s[1], opP->reg - FP0);
3120           break;
3121
3122         case 'g':  /* EMAC ACCEXTx.  */
3123           install_operand (s[1], opP->reg - ACCEXT01);
3124           break;
3125
3126         case 'G':               /* Ignore it.  */
3127         case 'H':
3128           break;
3129
3130         case 'I':
3131           tmpreg = opP->reg - COP0;
3132           install_operand (s[1], tmpreg);
3133           break;
3134
3135         case 'i':  /* MAC/EMAC scale factor.  */
3136           install_operand (s[1], opP->mode == LSH ? 0x1 : 0x3);
3137           break;
3138
3139         case 'J':               /* JF foo.  */
3140           switch (opP->reg)
3141             {
3142             case SFC:
3143               tmpreg = 0x000;
3144               break;
3145             case DFC:
3146               tmpreg = 0x001;
3147               break;
3148             case CACR:
3149               tmpreg = 0x002;
3150               break;
3151             case TC:
3152             case ASID:
3153               tmpreg = 0x003;
3154               break;
3155             case ACR0:
3156             case ITT0:
3157               tmpreg = 0x004;
3158               break;
3159             case ACR1:
3160             case ITT1:
3161               tmpreg = 0x005;
3162               break;
3163             case ACR2:
3164             case DTT0:
3165               tmpreg = 0x006;
3166               break;
3167             case ACR3:
3168             case DTT1:
3169               tmpreg = 0x007;
3170               break;
3171             case BUSCR:
3172             case MMUBAR:
3173               tmpreg = 0x008;
3174               break;
3175
3176             case USP:
3177               tmpreg = 0x800;
3178               break;
3179             case VBR:
3180               tmpreg = 0x801;
3181               break;
3182             case CAAR:
3183               tmpreg = 0x802;
3184               break;
3185             case MSP:
3186               tmpreg = 0x803;
3187               break;
3188             case ISP:
3189               tmpreg = 0x804;
3190               break;
3191             case MMUSR:
3192               tmpreg = 0x805;
3193               break;
3194             case URP:
3195               tmpreg = 0x806;
3196               break;
3197             case SRP:
3198               tmpreg = 0x807;
3199               break;
3200             case PCR:
3201               tmpreg = 0x808;
3202               break;
3203             case ROMBAR:
3204             case ROMBAR0:
3205               tmpreg = 0xC00;
3206               break;
3207             case ROMBAR1:
3208               tmpreg = 0xC01;
3209               break;
3210             case FLASHBAR:
3211             case RAMBAR0:
3212             case RAMBAR_ALT:
3213               tmpreg = 0xC04;
3214               break;
3215             case RAMBAR:
3216             case RAMBAR1:
3217               tmpreg = 0xC05;
3218               break;
3219             case MPCR:
3220               tmpreg = 0xC0C;
3221               break;
3222             case EDRAMBAR:
3223               tmpreg = 0xC0D;
3224               break;
3225             case MBAR0:
3226             case MBAR2:
3227             case SECMBAR:
3228               tmpreg = 0xC0E;
3229               break;
3230             case MBAR1:
3231             case MBAR:
3232               tmpreg = 0xC0F;
3233               break;
3234             case PCR1U0:
3235               tmpreg = 0xD02;
3236               break;
3237             case PCR1L0:
3238               tmpreg = 0xD03;
3239               break;
3240             case PCR2U0:
3241               tmpreg = 0xD04;
3242               break;
3243             case PCR2L0:
3244               tmpreg = 0xD05;
3245               break;
3246             case PCR3U0:
3247               tmpreg = 0xD06;
3248               break;
3249             case PCR3L0:
3250               tmpreg = 0xD07;
3251               break;
3252             case PCR1L1:
3253               tmpreg = 0xD0A;
3254               break;
3255             case PCR1U1:
3256               tmpreg = 0xD0B;
3257               break;
3258             case PCR2L1:
3259               tmpreg = 0xD0C;
3260               break;
3261             case PCR2U1:
3262               tmpreg = 0xD0D;
3263               break;
3264             case PCR3L1:
3265               tmpreg = 0xD0E;
3266               break;
3267             case PCR3U1:
3268               tmpreg = 0xD0F;
3269               break;
3270             case CAC:
3271               tmpreg = 0xFFE;
3272               break;
3273             case MBO:
3274               tmpreg = 0xFFF;
3275               break;
3276             default:
3277               abort ();
3278             }
3279           install_operand (s[1], tmpreg);
3280           break;
3281
3282         case 'k':
3283           tmpreg = get_num (&opP->disp, 55);
3284           install_operand (s[1], tmpreg & 0x7f);
3285           break;
3286
3287         case 'l':
3288           tmpreg = opP->mask;
3289           if (s[1] == 'w')
3290             {
3291               if (tmpreg & 0x7FF0000)
3292                 as_bad (_("Floating point register in register list"));
3293               insop (reverse_16_bits (tmpreg), opcode);
3294             }
3295           else
3296             {
3297               if (tmpreg & 0x700FFFF)
3298                 as_bad (_("Wrong register in floating-point reglist"));
3299               install_operand (s[1], reverse_8_bits (tmpreg >> 16));
3300             }
3301           break;
3302
3303         case 'L':
3304           tmpreg = opP->mask;
3305           if (s[1] == 'w')
3306             {
3307               if (tmpreg & 0x7FF0000)
3308                 as_bad (_("Floating point register in register list"));
3309               insop (tmpreg, opcode);
3310             }
3311           else if (s[1] == '8')
3312             {
3313               if (tmpreg & 0x0FFFFFF)
3314                 as_bad (_("incorrect register in reglist"));
3315               install_operand (s[1], tmpreg >> 24);
3316             }
3317           else
3318             {
3319               if (tmpreg & 0x700FFFF)
3320                 as_bad (_("wrong register in floating-point reglist"));
3321               else
3322                 install_operand (s[1], tmpreg >> 16);
3323             }
3324           break;
3325
3326         case 'M':
3327           install_operand (s[1], get_num (&opP->disp, 60));
3328           break;
3329
3330         case 'O':
3331           tmpreg = ((opP->mode == DREG)
3332                     ? 0x20 + (int) (opP->reg - DATA)
3333                     : (get_num (&opP->disp, 40) & 0x1F));
3334           install_operand (s[1], tmpreg);
3335           break;
3336
3337         case 'Q':
3338           tmpreg = get_num (&opP->disp, 10);
3339           if (tmpreg == 8)
3340             tmpreg = 0;
3341           install_operand (s[1], tmpreg);
3342           break;
3343
3344         case 'R':
3345           /* This depends on the fact that ADDR registers are eight
3346              more than their corresponding DATA regs, so the result
3347              will have the ADDR_REG bit set.  */
3348           install_operand (s[1], opP->reg - DATA);
3349           break;
3350
3351         case 'r':
3352           if (opP->mode == AINDR)
3353             install_operand (s[1], opP->reg - DATA);
3354           else
3355             install_operand (s[1], opP->index.reg - DATA);
3356           break;
3357
3358         case 's':
3359           if (opP->reg == FPI)
3360             tmpreg = 0x1;
3361           else if (opP->reg == FPS)
3362             tmpreg = 0x2;
3363           else if (opP->reg == FPC)
3364             tmpreg = 0x4;
3365           else
3366             abort ();
3367           install_operand (s[1], tmpreg);
3368           break;
3369
3370         case 'S':               /* Ignore it.  */
3371           break;
3372
3373         case 'T':
3374           install_operand (s[1], get_num (&opP->disp, 30));
3375           break;
3376
3377         case 'U':               /* Ignore it.  */
3378           break;
3379
3380         case 'c':
3381           switch (opP->reg)
3382             {
3383             case NC:
3384               tmpreg = 0;
3385               break;
3386             case DC:
3387               tmpreg = 1;
3388               break;
3389             case IC:
3390               tmpreg = 2;
3391               break;
3392             case BC:
3393               tmpreg = 3;
3394               break;
3395             default:
3396               as_fatal (_("failed sanity check"));
3397             }                   /* switch on cache token.  */
3398           install_operand (s[1], tmpreg);
3399           break;
3400 #ifndef NO_68851
3401           /* JF: These are out of order, I fear.  */
3402         case 'f':
3403           switch (opP->reg)
3404             {
3405             case SFC:
3406               tmpreg = 0;
3407               break;
3408             case DFC:
3409               tmpreg = 1;
3410               break;
3411             default:
3412               abort ();
3413             }
3414           install_operand (s[1], tmpreg);
3415           break;
3416
3417         case '0':
3418         case '1':
3419         case '2':
3420           switch (opP->reg)
3421             {
3422             case TC:
3423               tmpreg = 0;
3424               break;
3425             case CAL:
3426               tmpreg = 4;
3427               break;
3428             case VAL:
3429               tmpreg = 5;
3430               break;
3431             case SCC:
3432               tmpreg = 6;
3433               break;
3434             case AC:
3435               tmpreg = 7;
3436               break;
3437             default:
3438               abort ();
3439             }
3440           install_operand (s[1], tmpreg);
3441           break;
3442
3443         case 'V':
3444           if (opP->reg == VAL)
3445             break;
3446           abort ();
3447
3448         case 'W':
3449           switch (opP->reg)
3450             {
3451             case DRP:
3452               tmpreg = 1;
3453               break;
3454             case SRP:
3455               tmpreg = 2;
3456               break;
3457             case CRP:
3458               tmpreg = 3;
3459               break;
3460             default:
3461               abort ();
3462             }
3463           install_operand (s[1], tmpreg);
3464           break;
3465
3466         case 'X':
3467           switch (opP->reg)
3468             {
3469             case BAD:
3470             case BAD + 1:
3471             case BAD + 2:
3472             case BAD + 3:
3473             case BAD + 4:
3474             case BAD + 5:
3475             case BAD + 6:
3476             case BAD + 7:
3477               tmpreg = (4 << 10) | ((opP->reg - BAD) << 2);
3478               break;
3479
3480             case BAC:
3481             case BAC + 1:
3482             case BAC + 2:
3483             case BAC + 3:
3484             case BAC + 4:
3485             case BAC + 5:
3486             case BAC + 6:
3487             case BAC + 7:
3488               tmpreg = (5 << 10) | ((opP->reg - BAC) << 2);
3489               break;
3490
3491             default:
3492               abort ();
3493             }
3494           install_operand (s[1], tmpreg);
3495           break;
3496         case 'Y':
3497           know (opP->reg == PSR);
3498           break;
3499         case 'Z':
3500           know (opP->reg == PCSR);
3501           break;
3502 #endif /* m68851 */
3503         case '3':
3504           switch (opP->reg)
3505             {
3506             case TT0:
3507               tmpreg = 2;
3508               break;
3509             case TT1:
3510               tmpreg = 3;
3511               break;
3512             default:
3513               abort ();
3514             }
3515           install_operand (s[1], tmpreg);
3516           break;
3517         case 't':
3518           tmpreg = get_num (&opP->disp, 20);
3519           install_operand (s[1], tmpreg);
3520           break;
3521         case '_':       /* used only for move16 absolute 32-bit address.  */
3522           if (isvar (&opP->disp))
3523             add_fix ('l', &opP->disp, 0, 0);
3524           tmpreg = get_num (&opP->disp, 90);
3525           addword (tmpreg >> 16);
3526           addword (tmpreg & 0xFFFF);
3527           break;
3528         case 'u':
3529           install_operand (s[1], opP->reg - DATA0L);
3530           opP->reg -= (DATA0L);
3531           opP->reg &= 0x0F;     /* remove upper/lower bit.  */
3532           break;
3533         case 'x':
3534           tmpreg = get_num (&opP->disp, 80);
3535           if (tmpreg == -1)
3536             tmpreg = 0;
3537           install_operand (s[1], tmpreg);
3538           break;
3539         case 'j':
3540           tmpreg = get_num (&opP->disp, 10);
3541           install_operand (s[1], tmpreg - 1);
3542           break;
3543         case 'K':
3544           tmpreg = get_num (&opP->disp, 65);
3545           install_operand (s[1], tmpreg);
3546           break;
3547         default:
3548           abort ();
3549         }
3550     }
3551
3552   /* By the time whe get here (FINALLY) the_ins contains the complete
3553      instruction, ready to be emitted. . .  */
3554 }
3555
3556 static int
3557 reverse_16_bits (int in)
3558 {
3559   int out = 0;
3560   int n;
3561
3562   static int mask[16] =
3563   {
3564     0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
3565     0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000
3566   };
3567   for (n = 0; n < 16; n++)
3568     {
3569       if (in & mask[n])
3570         out |= mask[15 - n];
3571     }
3572   return out;
3573 }                               /* reverse_16_bits() */
3574
3575 static int
3576 reverse_8_bits (int in)
3577 {
3578   int out = 0;
3579   int n;
3580
3581   static int mask[8] =
3582   {
3583     0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
3584   };
3585
3586   for (n = 0; n < 8; n++)
3587     {
3588       if (in & mask[n])
3589         out |= mask[7 - n];
3590     }
3591   return out;
3592 }                               /* reverse_8_bits() */
3593
3594 /* Cause an extra frag to be generated here, inserting up to
3595    FRAG_VAR_SIZE bytes.  TYPE is the subtype of the frag to be
3596    generated; its primary type is rs_machine_dependent.
3597
3598    The TYPE parameter is also used by md_convert_frag_1 and
3599    md_estimate_size_before_relax.  The appropriate type of fixup will
3600    be emitted by md_convert_frag_1.
3601
3602    ADD becomes the FR_SYMBOL field of the frag, and OFF the FR_OFFSET.  */
3603 static void
3604 install_operand (int mode, int val)
3605 {
3606   switch (mode)
3607     {
3608     case 's':
3609       the_ins.opcode[0] |= val & 0xFF;  /* JF FF is for M kludge.  */
3610       break;
3611     case 'd':
3612       the_ins.opcode[0] |= val << 9;
3613       break;
3614     case 'E':
3615       the_ins.opcode[1] |= val << 9;
3616       break;
3617     case '1':
3618       the_ins.opcode[1] |= val << 12;
3619       break;
3620     case '2':
3621       the_ins.opcode[1] |= val << 6;
3622       break;
3623     case '3':
3624       the_ins.opcode[1] |= val;
3625       break;
3626     case '4':
3627       the_ins.opcode[2] |= val << 12;
3628       break;
3629     case '5':
3630       the_ins.opcode[2] |= val << 6;
3631       break;
3632     case '6':
3633       /* DANGER!  This is a hack to force cas2l and cas2w cmds to be
3634          three words long! */
3635       the_ins.numo++;
3636       the_ins.opcode[2] |= val;
3637       break;
3638     case '7':
3639       the_ins.opcode[1] |= val << 7;
3640       break;
3641     case '8':
3642       the_ins.opcode[1] |= val << 10;
3643       break;
3644 #ifndef NO_68851
3645     case '9':
3646       the_ins.opcode[1] |= val << 5;
3647       break;
3648 #endif
3649
3650     case 't':
3651       the_ins.opcode[1] |= (val << 10) | (val << 7);
3652       break;
3653     case 'D':
3654       the_ins.opcode[1] |= (val << 12) | val;
3655       break;
3656     case 'g':
3657       the_ins.opcode[0] |= val = 0xff;
3658       break;
3659     case 'i':
3660       the_ins.opcode[0] |= val << 9;
3661       break;
3662     case 'C':
3663       the_ins.opcode[1] |= val;
3664       break;
3665     case 'j':
3666       the_ins.opcode[1] |= val;
3667       the_ins.numo++;           /* What a hack.  */
3668       break;
3669     case 'k':
3670       the_ins.opcode[1] |= val << 4;
3671       break;
3672     case 'b':
3673     case 'w':
3674     case 'W':
3675     case 'l':
3676       break;
3677     case 'e':
3678       the_ins.opcode[0] |= (val << 6);
3679       break;
3680     case 'L':
3681       the_ins.opcode[1] = (val >> 16);
3682       the_ins.opcode[2] = val & 0xffff;
3683       break;
3684     case 'm':
3685       the_ins.opcode[0] |= ((val & 0x8) << (6 - 3));
3686       the_ins.opcode[0] |= ((val & 0x7) << 9);
3687       the_ins.opcode[1] |= ((val & 0x10) << (7 - 4));
3688       break;
3689     case 'n': /* MAC/EMAC Rx on !load.  */
3690       the_ins.opcode[0] |= ((val & 0x8) << (6 - 3));
3691       the_ins.opcode[0] |= ((val & 0x7) << 9);
3692       the_ins.opcode[1] |= ((val & 0x10) << (7 - 4));
3693       break;
3694     case 'o': /* MAC/EMAC Rx on load.  */
3695       the_ins.opcode[1] |= val << 12;
3696       the_ins.opcode[1] |= ((val & 0x10) << (7 - 4));
3697       break;
3698     case 'M': /* MAC/EMAC Ry on !load.  */
3699       the_ins.opcode[0] |= (val & 0xF);
3700       the_ins.opcode[1] |= ((val & 0x10) << (6 - 4));
3701       break;
3702     case 'N': /* MAC/EMAC Ry on load.  */
3703       the_ins.opcode[1] |= (val & 0xF);
3704       the_ins.opcode[1] |= ((val & 0x10) << (6 - 4));
3705       break;
3706     case 'h':
3707       the_ins.opcode[1] |= ((val != 1) << 10);
3708       break;
3709     case 'F':
3710       the_ins.opcode[0] |= ((val & 0x3) << 9);
3711       break;
3712     case 'f':
3713       the_ins.opcode[0] |= ((val & 0x3) << 0);
3714       break;
3715     case 'G':  /* EMAC accumulator in a EMAC load instruction.  */
3716       the_ins.opcode[0] |= ((~val & 0x1) << 7);
3717       the_ins.opcode[1] |= ((val & 0x2) << (4 - 1));
3718       break;
3719     case 'H':  /* EMAC accumulator in a EMAC non-load instruction.  */
3720       the_ins.opcode[0] |= ((val & 0x1) << 7);
3721       the_ins.opcode[1] |= ((val & 0x2) << (4 - 1));
3722       break;
3723     case 'I':
3724       the_ins.opcode[1] |= ((val & 0x3) << 9);
3725       break;
3726     case ']':
3727       the_ins.opcode[0] |= (val & 0x1) <<10;
3728       break;
3729     case 'c':
3730     default:
3731       as_fatal (_("failed sanity check."));
3732     }
3733 }
3734
3735 static void
3736 install_gen_operand (int mode, int val)
3737 {
3738   switch (mode)
3739     {
3740     case '/':  /* Special for mask loads for mac/msac insns with
3741                   possible mask; trailing_ampersend set in bit 8.  */
3742       the_ins.opcode[0] |= (val & 0x3f);
3743       the_ins.opcode[1] |= (((val & 0x100) >> 8) << 5);
3744       break;
3745     case 's':
3746       the_ins.opcode[0] |= val;
3747       break;
3748     case 'd':
3749       /* This is a kludge!!! */
3750       the_ins.opcode[0] |= (val & 0x07) << 9 | (val & 0x38) << 3;
3751       break;
3752     case 'b':
3753     case 'w':
3754     case 'l':
3755     case 'f':
3756     case 'F':
3757     case 'x':
3758     case 'p':
3759       the_ins.opcode[0] |= val;
3760       break;
3761       /* more stuff goes here.  */
3762     default:
3763       as_fatal (_("failed sanity check."));
3764     }
3765 }
3766
3767 /* Verify that we have some number of paren pairs, do m68k_ip_op(), and
3768    then deal with the bitfield hack.  */
3769
3770 static char *
3771 crack_operand (char *str, struct m68k_op *opP)
3772 {
3773   register int parens;
3774   register int c;
3775   register char *beg_str;
3776   int inquote = 0;
3777
3778   if (!str)
3779     {
3780       return str;
3781     }
3782   beg_str = str;
3783   for (parens = 0; *str && (parens > 0 || inquote || notend (str)); str++)
3784     {
3785       if (! inquote)
3786         {
3787           if (*str == '(')
3788             parens++;
3789           else if (*str == ')')
3790             {
3791               if (!parens)
3792                 {                       /* ERROR.  */
3793                   opP->error = _("Extra )");
3794                   return str;
3795                 }
3796               --parens;
3797             }
3798         }
3799       if (flag_mri && *str == '\'')
3800         inquote = ! inquote;
3801     }
3802   if (!*str && parens)
3803     {                           /* ERROR.  */
3804       opP->error = _("Missing )");
3805       return str;
3806     }
3807   c = *str;
3808   *str = '\0';
3809   if (m68k_ip_op (beg_str, opP) != 0)
3810     {
3811       *str = c;
3812       return str;
3813     }
3814   *str = c;
3815   if (c == '}')
3816     c = *++str;                 /* JF bitfield hack.  */
3817   if (c)
3818     {
3819       c = *++str;
3820       if (!c)
3821         as_bad (_("Missing operand"));
3822     }
3823
3824   /* Detect MRI REG symbols and convert them to REGLSTs.  */
3825   if (opP->mode == CONTROL && (int)opP->reg < 0)
3826     {
3827       opP->mode = REGLST;
3828       opP->mask = ~(int)opP->reg;
3829       opP->reg = 0;
3830     }
3831
3832   return str;
3833 }
3834
3835 /* This is the guts of the machine-dependent assembler.  STR points to a
3836    machine dependent instruction.  This function is supposed to emit
3837    the frags/bytes it assembles to.
3838    */
3839
3840 static void
3841 insert_reg (const char *regname, int regnum)
3842 {
3843   char buf[100];
3844   int i;
3845
3846 #ifdef REGISTER_PREFIX
3847   if (!flag_reg_prefix_optional)
3848     {
3849       buf[0] = REGISTER_PREFIX;
3850       strcpy (buf + 1, regname);
3851       regname = buf;
3852     }
3853 #endif
3854
3855   symbol_table_insert (symbol_new (regname, reg_section, regnum,
3856                                    &zero_address_frag));
3857
3858   for (i = 0; regname[i]; i++)
3859     buf[i] = TOUPPER (regname[i]);
3860   buf[i] = '\0';
3861
3862   symbol_table_insert (symbol_new (buf, reg_section, regnum,
3863                                    &zero_address_frag));
3864 }
3865
3866 struct init_entry
3867   {
3868     const char *name;
3869     int number;
3870   };
3871
3872 static const struct init_entry init_table[] =
3873 {
3874   { "d0", DATA0 },
3875   { "d1", DATA1 },
3876   { "d2", DATA2 },
3877   { "d3", DATA3 },
3878   { "d4", DATA4 },
3879   { "d5", DATA5 },
3880   { "d6", DATA6 },
3881   { "d7", DATA7 },
3882   { "a0", ADDR0 },
3883   { "a1", ADDR1 },
3884   { "a2", ADDR2 },
3885   { "a3", ADDR3 },
3886   { "a4", ADDR4 },
3887   { "a5", ADDR5 },
3888   { "a6", ADDR6 },
3889   { "fp", ADDR6 },
3890   { "a7", ADDR7 },
3891   { "sp", ADDR7 },
3892   { "ssp", ADDR7 },
3893   { "fp0", FP0 },
3894   { "fp1", FP1 },
3895   { "fp2", FP2 },
3896   { "fp3", FP3 },
3897   { "fp4", FP4 },
3898   { "fp5", FP5 },
3899   { "fp6", FP6 },
3900   { "fp7", FP7 },
3901   { "fpi", FPI },
3902   { "fpiar", FPI },
3903   { "fpc", FPI },
3904   { "fps", FPS },
3905   { "fpsr", FPS },
3906   { "fpc", FPC },
3907   { "fpcr", FPC },
3908   { "control", FPC },
3909   { "status", FPS },
3910   { "iaddr", FPI },
3911
3912   { "cop0", COP0 },
3913   { "cop1", COP1 },
3914   { "cop2", COP2 },
3915   { "cop3", COP3 },
3916   { "cop4", COP4 },
3917   { "cop5", COP5 },
3918   { "cop6", COP6 },
3919   { "cop7", COP7 },
3920   { "pc", PC },
3921   { "zpc", ZPC },
3922   { "sr", SR },
3923
3924   { "ccr", CCR },
3925   { "cc", CCR },
3926
3927   { "acc", ACC },
3928   { "acc0", ACC },
3929   { "acc1", ACC1 },
3930   { "acc2", ACC2 },
3931   { "acc3", ACC3 },
3932   { "accext01", ACCEXT01 },
3933   { "accext23", ACCEXT23 },
3934   { "macsr", MACSR },
3935   { "mask", MASK },
3936
3937   /* Control registers.  */
3938   { "sfc", SFC },               /* Source Function Code.  */
3939   { "sfcr", SFC },
3940   { "dfc", DFC },               /* Destination Function Code.  */
3941   { "dfcr", DFC },
3942   { "cacr", CACR },             /* Cache Control Register.  */
3943   { "caar", CAAR },             /* Cache Address Register.  */
3944
3945   { "usp", USP },               /* User Stack Pointer.  */
3946   { "vbr", VBR },               /* Vector Base Register.  */
3947   { "msp", MSP },               /* Master Stack Pointer.  */
3948   { "isp", ISP },               /* Interrupt Stack Pointer.  */
3949
3950   { "itt0", ITT0 },             /* Instruction Transparent Translation Reg 0.  */
3951   { "itt1", ITT1 },             /* Instruction Transparent Translation Reg 1.  */
3952   { "dtt0", DTT0 },             /* Data Transparent Translation Register 0.  */
3953   { "dtt1", DTT1 },             /* Data Transparent Translation Register 1.  */
3954
3955   /* 68ec040 versions of same */
3956   { "iacr0", ITT0 },            /* Instruction Access Control Register 0.  */
3957   { "iacr1", ITT1 },            /* Instruction Access Control Register 0.  */
3958   { "dacr0", DTT0 },            /* Data Access Control Register 0.  */
3959   { "dacr1", DTT1 },            /* Data Access Control Register 0.  */
3960
3961   /* Coldfire versions of same.  The ColdFire programmer's reference
3962      manual indicated that the order is 2,3,0,1, but Ken Rose
3963      <rose@netcom.com> says that 0,1,2,3 is the correct order.  */
3964   { "acr0", ACR0 },             /* Access Control Unit 0.  */
3965   { "acr1", ACR1 },             /* Access Control Unit 1.  */
3966   { "acr2", ACR2 },             /* Access Control Unit 2.  */
3967   { "acr3", ACR3 },             /* Access Control Unit 3.  */
3968
3969   { "tc", TC },                 /* MMU Translation Control Register.  */
3970   { "tcr", TC },
3971   { "asid", ASID },
3972
3973   { "mmusr", MMUSR },           /* MMU Status Register.  */
3974   { "srp", SRP },               /* User Root Pointer.  */
3975   { "urp", URP },               /* Supervisor Root Pointer.  */
3976
3977   { "buscr", BUSCR },
3978   { "mmubar", MMUBAR },
3979   { "pcr", PCR },
3980
3981   { "rombar", ROMBAR },         /* ROM Base Address Register.  */
3982   { "rambar0", RAMBAR0 },       /* ROM Base Address Register.  */
3983   { "rambar1", RAMBAR1 },       /* ROM Base Address Register.  */
3984   { "mbar", MBAR },             /* Module Base Address Register.  */
3985
3986   { "mbar0",    MBAR0 },        /* mcfv4e registers.  */
3987   { "mbar1",    MBAR1 },        /* mcfv4e registers.  */
3988   { "rombar0",  ROMBAR0 },      /* mcfv4e registers.  */
3989   { "rombar1",  ROMBAR1 },      /* mcfv4e registers.  */
3990   { "mpcr",     MPCR },         /* mcfv4e registers.  */
3991   { "edrambar", EDRAMBAR },     /* mcfv4e registers.  */
3992   { "secmbar",  SECMBAR },      /* mcfv4e registers.  */
3993   { "asid",     TC },           /* mcfv4e registers.  */
3994   { "mmubar",   BUSCR },        /* mcfv4e registers.  */
3995   { "pcr1u0",   PCR1U0 },       /* mcfv4e registers.  */
3996   { "pcr1l0",   PCR1L0 },       /* mcfv4e registers.  */
3997   { "pcr2u0",   PCR2U0 },       /* mcfv4e registers.  */
3998   { "pcr2l0",   PCR2L0 },       /* mcfv4e registers.  */
3999   { "pcr3u0",   PCR3U0 },       /* mcfv4e registers.  */
4000   { "pcr3l0",   PCR3L0 },       /* mcfv4e registers.  */
4001   { "pcr1u1",   PCR1U1 },       /* mcfv4e registers.  */
4002   { "pcr1l1",   PCR1L1 },       /* mcfv4e registers.  */
4003   { "pcr2u1",   PCR2U1 },       /* mcfv4e registers.  */
4004   { "pcr2l1",   PCR2L1 },       /* mcfv4e registers.  */
4005   { "pcr3u1",   PCR3U1 },       /* mcfv4e registers.  */
4006   { "pcr3l1",   PCR3L1 },       /* mcfv4e registers.  */
4007
4008   { "flashbar", FLASHBAR },     /* mcf528x registers.  */
4009   { "rambar",   RAMBAR },       /* mcf528x registers.  */
4010
4011   { "mbar2",    MBAR2 },        /* mcf5249 registers.  */
4012
4013   { "cac",    CAC },            /* fido registers.  */
4014   { "mbb",    MBO },            /* fido registers (obsolete).  */
4015   { "mbo",    MBO },            /* fido registers.  */
4016   /* End of control registers.  */
4017
4018   { "ac", AC },
4019   { "bc", BC },
4020   { "cal", CAL },
4021   { "crp", CRP },
4022   { "drp", DRP },
4023   { "pcsr", PCSR },
4024   { "psr", PSR },
4025   { "scc", SCC },
4026   { "val", VAL },
4027   { "bad0", BAD0 },
4028   { "bad1", BAD1 },
4029   { "bad2", BAD2 },
4030   { "bad3", BAD3 },
4031   { "bad4", BAD4 },
4032   { "bad5", BAD5 },
4033   { "bad6", BAD6 },
4034   { "bad7", BAD7 },
4035   { "bac0", BAC0 },
4036   { "bac1", BAC1 },
4037   { "bac2", BAC2 },
4038   { "bac3", BAC3 },
4039   { "bac4", BAC4 },
4040   { "bac5", BAC5 },
4041   { "bac6", BAC6 },
4042   { "bac7", BAC7 },
4043
4044   { "ic", IC },
4045   { "dc", DC },
4046   { "nc", NC },
4047
4048   { "tt0", TT0 },
4049   { "tt1", TT1 },
4050   /* 68ec030 versions of same.  */
4051   { "ac0", TT0 },
4052   { "ac1", TT1 },
4053   /* 68ec030 access control unit, identical to 030 MMU status reg.  */
4054   { "acusr", PSR },
4055
4056   /* Suppressed data and address registers.  */
4057   { "zd0", ZDATA0 },
4058   { "zd1", ZDATA1 },
4059   { "zd2", ZDATA2 },
4060   { "zd3", ZDATA3 },
4061   { "zd4", ZDATA4 },
4062   { "zd5", ZDATA5 },
4063   { "zd6", ZDATA6 },
4064   { "zd7", ZDATA7 },
4065   { "za0", ZADDR0 },
4066   { "za1", ZADDR1 },
4067   { "za2", ZADDR2 },
4068   { "za3", ZADDR3 },
4069   { "za4", ZADDR4 },
4070   { "za5", ZADDR5 },
4071   { "za6", ZADDR6 },
4072   { "za7", ZADDR7 },
4073
4074   /* Upper and lower data and address registers, used by macw and msacw.  */
4075   { "d0l", DATA0L },
4076   { "d1l", DATA1L },
4077   { "d2l", DATA2L },
4078   { "d3l", DATA3L },
4079   { "d4l", DATA4L },
4080   { "d5l", DATA5L },
4081   { "d6l", DATA6L },
4082   { "d7l", DATA7L },
4083
4084   { "a0l", ADDR0L },
4085   { "a1l", ADDR1L },
4086   { "a2l", ADDR2L },
4087   { "a3l", ADDR3L },
4088   { "a4l", ADDR4L },
4089   { "a5l", ADDR5L },
4090   { "a6l", ADDR6L },
4091   { "a7l", ADDR7L },
4092
4093   { "d0u", DATA0U },
4094   { "d1u", DATA1U },
4095   { "d2u", DATA2U },
4096   { "d3u", DATA3U },
4097   { "d4u", DATA4U },
4098   { "d5u", DATA5U },
4099   { "d6u", DATA6U },
4100   { "d7u", DATA7U },
4101
4102   { "a0u", ADDR0U },
4103   { "a1u", ADDR1U },
4104   { "a2u", ADDR2U },
4105   { "a3u", ADDR3U },
4106   { "a4u", ADDR4U },
4107   { "a5u", ADDR5U },
4108   { "a6u", ADDR6U },
4109   { "a7u", ADDR7U },
4110
4111   { 0, 0 }
4112 };
4113
4114 static void
4115 init_regtable (void)
4116 {
4117   int i;
4118   for (i = 0; init_table[i].name; i++)
4119     insert_reg (init_table[i].name, init_table[i].number);
4120 }
4121
4122 void
4123 md_assemble (char *str)
4124 {
4125   const char *er;
4126   short *fromP;
4127   char *toP = NULL;
4128   int m, n = 0;
4129   char *to_beg_P;
4130   int shorts_this_frag;
4131   fixS *fixP;
4132
4133   if (!selected_cpu && !selected_arch)
4134     {
4135       /* We've not selected an architecture yet.  Set the default
4136          now.  We do this lazily so that an initial .cpu or .arch directive
4137          can specify.  */
4138       if (!m68k_set_cpu (TARGET_CPU, 1, 1))
4139         as_bad (_("unrecognized default cpu `%s'"), TARGET_CPU);
4140     }
4141   if (!initialized)
4142     m68k_init_arch ();
4143   
4144   /* In MRI mode, the instruction and operands are separated by a
4145      space.  Anything following the operands is a comment.  The label
4146      has already been removed.  */
4147   if (flag_mri)
4148     {
4149       char *s;
4150       int fields = 0;
4151       int infield = 0;
4152       int inquote = 0;
4153
4154       for (s = str; *s != '\0'; s++)
4155         {
4156           if ((*s == ' ' || *s == '\t') && ! inquote)
4157             {
4158               if (infield)
4159                 {
4160                   ++fields;
4161                   if (fields >= 2)
4162                     {
4163                       *s = '\0';
4164                       break;
4165                     }
4166                   infield = 0;
4167                 }
4168             }
4169           else
4170             {
4171               if (! infield)
4172                 infield = 1;
4173               if (*s == '\'')
4174                 inquote = ! inquote;
4175             }
4176         }
4177     }
4178
4179   memset (&the_ins, '\0', sizeof (the_ins));
4180   m68k_ip (str);
4181   er = the_ins.error;
4182   if (!er)
4183     {
4184       for (n = 0; n < the_ins.numargs; n++)
4185         if (the_ins.operands[n].error)
4186           {
4187             er = the_ins.operands[n].error;
4188             break;
4189           }
4190     }
4191   if (er)
4192     {
4193       as_bad (_("%s -- statement `%s' ignored"), er, str);
4194       return;
4195     }
4196
4197   /* If there is a current label, record that it marks an instruction.  */
4198   if (current_label != NULL)
4199     {
4200       current_label->text = 1;
4201       current_label = NULL;
4202     }
4203
4204 #ifdef OBJ_ELF
4205   /* Tie dwarf2 debug info to the address at the start of the insn.  */
4206   dwarf2_emit_insn (0);
4207 #endif
4208
4209   if (the_ins.nfrag == 0)
4210     {
4211       /* No frag hacking involved; just put it out.  */
4212       toP = frag_more (2 * the_ins.numo);
4213       fromP = &the_ins.opcode[0];
4214       for (m = the_ins.numo; m; --m)
4215         {
4216           md_number_to_chars (toP, (long) (*fromP), 2);
4217           toP += 2;
4218           fromP++;
4219         }
4220       /* Put out symbol-dependent info.  */
4221       for (m = 0; m < the_ins.nrel; m++)
4222         {
4223           switch (the_ins.reloc[m].wid)
4224             {
4225             case 'B':
4226               n = 1;
4227               break;
4228             case 'b':
4229               n = 1;
4230               break;
4231             case '3':
4232               n = 1;
4233               break;
4234             case 'w':
4235             case 'W':
4236               n = 2;
4237               break;
4238             case 'l':
4239               n = 4;
4240               break;
4241             default:
4242               as_fatal (_("Don't know how to figure width of %c in md_assemble()"),
4243                         the_ins.reloc[m].wid);
4244             }
4245
4246           fixP = fix_new_exp (frag_now,
4247                               ((toP - frag_now->fr_literal)
4248                                - the_ins.numo * 2 + the_ins.reloc[m].n),
4249                               n,
4250                               &the_ins.reloc[m].exp,
4251                               the_ins.reloc[m].pcrel,
4252                               get_reloc_code (n, the_ins.reloc[m].pcrel,
4253                                               the_ins.reloc[m].pic_reloc));
4254           fixP->fx_pcrel_adjust = the_ins.reloc[m].pcrel_fix;
4255           if (the_ins.reloc[m].wid == 'B')
4256             fixP->fx_signed = 1;
4257         }
4258       return;
4259     }
4260
4261   /* There's some frag hacking.  */
4262   {
4263     /* Calculate the max frag size.  */
4264     int wid;
4265
4266     wid = 2 * the_ins.fragb[0].fragoff;
4267     for (n = 1; n < the_ins.nfrag; n++)
4268       wid += 2 * (the_ins.numo - the_ins.fragb[n - 1].fragoff);
4269     /* frag_var part.  */
4270     wid += FRAG_VAR_SIZE;
4271     /* Make sure the whole insn fits in one chunk, in particular that
4272        the var part is attached, as we access one byte before the
4273        variable frag for byte branches.  */
4274     frag_grow (wid);
4275   }
4276
4277   for (n = 0, fromP = &the_ins.opcode[0]; n < the_ins.nfrag; n++)
4278     {
4279       int wid;
4280
4281       if (n == 0)
4282         wid = 2 * the_ins.fragb[n].fragoff;
4283       else
4284         wid = 2 * (the_ins.numo - the_ins.fragb[n - 1].fragoff);
4285       toP = frag_more (wid);
4286       to_beg_P = toP;
4287       shorts_this_frag = 0;
4288       for (m = wid / 2; m; --m)
4289         {
4290           md_number_to_chars (toP, (long) (*fromP), 2);
4291           toP += 2;
4292           fromP++;
4293           shorts_this_frag++;
4294         }
4295       for (m = 0; m < the_ins.nrel; m++)
4296         {
4297           if ((the_ins.reloc[m].n) >= 2 * shorts_this_frag)
4298             {
4299               the_ins.reloc[m].n -= 2 * shorts_this_frag;
4300               break;
4301             }
4302           wid = the_ins.reloc[m].wid;
4303           if (wid == 0)
4304             continue;
4305           the_ins.reloc[m].wid = 0;
4306           wid = (wid == 'b') ? 1 : (wid == 'w') ? 2 : (wid == 'l') ? 4 : 4000;
4307
4308           fixP = fix_new_exp (frag_now,
4309                               ((toP - frag_now->fr_literal)
4310                                - the_ins.numo * 2 + the_ins.reloc[m].n),
4311                               wid,
4312                               &the_ins.reloc[m].exp,
4313                               the_ins.reloc[m].pcrel,
4314                               get_reloc_code (wid, the_ins.reloc[m].pcrel,
4315                                               the_ins.reloc[m].pic_reloc));
4316           fixP->fx_pcrel_adjust = the_ins.reloc[m].pcrel_fix;
4317         }
4318       (void) frag_var (rs_machine_dependent, FRAG_VAR_SIZE, 0,
4319                        (relax_substateT) (the_ins.fragb[n].fragty),
4320                        the_ins.fragb[n].fadd, the_ins.fragb[n].foff, to_beg_P);
4321     }
4322   n = (the_ins.numo - the_ins.fragb[n - 1].fragoff);
4323   shorts_this_frag = 0;
4324   if (n)
4325     {
4326       toP = frag_more (n * 2);
4327       while (n--)
4328         {
4329           md_number_to_chars (toP, (long) (*fromP), 2);
4330           toP += 2;
4331           fromP++;
4332           shorts_this_frag++;
4333         }
4334     }
4335   for (m = 0; m < the_ins.nrel; m++)
4336     {
4337       int wid;
4338
4339       wid = the_ins.reloc[m].wid;
4340       if (wid == 0)
4341         continue;
4342       the_ins.reloc[m].wid = 0;
4343       wid = (wid == 'b') ? 1 : (wid == 'w') ? 2 : (wid == 'l') ? 4 : 4000;
4344
4345       fixP = fix_new_exp (frag_now,
4346                           ((the_ins.reloc[m].n + toP - frag_now->fr_literal)
4347                            - shorts_this_frag * 2),
4348                           wid,
4349                           &the_ins.reloc[m].exp,
4350                           the_ins.reloc[m].pcrel,
4351                           get_reloc_code (wid, the_ins.reloc[m].pcrel,
4352                                           the_ins.reloc[m].pic_reloc));
4353       fixP->fx_pcrel_adjust = the_ins.reloc[m].pcrel_fix;
4354     }
4355 }
4356
4357 /* Comparison function used by qsort to rank the opcode entries by name.  */
4358
4359 static int
4360 m68k_compare_opcode (const void * v1, const void * v2)
4361 {
4362   struct m68k_opcode * op1, * op2;
4363   int ret;
4364
4365   if (v1 == v2)
4366     return 0;
4367
4368   op1 = *(struct m68k_opcode **) v1;
4369   op2 = *(struct m68k_opcode **) v2;
4370
4371   /* Compare the two names.  If different, return the comparison.
4372      If the same, return the order they are in the opcode table.  */
4373   ret = strcmp (op1->name, op2->name);
4374   if (ret)
4375     return ret;
4376   if (op1 < op2)
4377     return -1;
4378   return 1;
4379 }
4380
4381 void
4382 md_begin (void)
4383 {
4384   const struct m68k_opcode *ins;
4385   struct m68k_incant *hack, *slak;
4386   const char *retval = 0;       /* Empty string, or error msg text.  */
4387   int i;
4388
4389   /* Set up hash tables with 68000 instructions.
4390      similar to what the vax assembler does.  */
4391   /* RMS claims the thing to do is take the m68k-opcode.h table, and make
4392      a copy of it at runtime, adding in the information we want but isn't
4393      there.  I think it'd be better to have an awk script hack the table
4394      at compile time.  Or even just xstr the table and use it as-is.  But
4395      my lord ghod hath spoken, so we do it this way.  Excuse the ugly var
4396      names.  */
4397
4398   if (flag_mri)
4399     {
4400       flag_reg_prefix_optional = 1;
4401       m68k_abspcadd = 1;
4402       if (! m68k_rel32_from_cmdline)
4403         m68k_rel32 = 0;
4404     }
4405
4406   /* First sort the opcode table into alphabetical order to seperate
4407      the order that the assembler wants to see the opcodes from the
4408      order that the disassembler wants to see them.  */
4409   m68k_sorted_opcodes = xmalloc (m68k_numopcodes * sizeof (* m68k_sorted_opcodes));
4410   if (!m68k_sorted_opcodes)
4411     as_fatal (_("Internal Error:  Can't allocate m68k_sorted_opcodes of size %d"),
4412               m68k_numopcodes * ((int) sizeof (* m68k_sorted_opcodes)));
4413
4414   for (i = m68k_numopcodes; i--;)
4415     m68k_sorted_opcodes[i] = m68k_opcodes + i;
4416
4417   qsort (m68k_sorted_opcodes, m68k_numopcodes,
4418          sizeof (m68k_sorted_opcodes[0]), m68k_compare_opcode);
4419
4420   op_hash = hash_new ();
4421
4422   obstack_begin (&robyn, 4000);
4423   for (i = 0; i < m68k_numopcodes; i++)
4424     {
4425       hack = slak = (struct m68k_incant *) obstack_alloc (&robyn, sizeof (struct m68k_incant));
4426       do
4427         {
4428           ins = m68k_sorted_opcodes[i];
4429
4430           /* We must enter all insns into the table, because .arch and
4431              .cpu directives can change things.  */
4432           slak->m_operands = ins->args;
4433           slak->m_arch = ins->arch;
4434           slak->m_opcode = ins->opcode;
4435           
4436           /* In most cases we can determine the number of opcode words
4437              by checking the second word of the mask.  Unfortunately
4438              some instructions have 2 opcode words, but no fixed bits
4439              in the second word.  A leading dot in the operands
4440              string also indicates 2 opcodes.  */
4441           if (*slak->m_operands == '.')
4442             {
4443               slak->m_operands++;
4444               slak->m_codenum = 2;
4445             }
4446           else if (ins->match & 0xffffL)
4447             slak->m_codenum = 2;
4448           else
4449             slak->m_codenum = 1;
4450           slak->m_opnum = strlen (slak->m_operands) / 2;
4451           
4452           if (i + 1 != m68k_numopcodes
4453               && !strcmp (ins->name, m68k_sorted_opcodes[i + 1]->name))
4454             {
4455               slak->m_next = obstack_alloc (&robyn, sizeof (struct m68k_incant));
4456               i++;
4457             }
4458           else
4459             slak->m_next = 0;
4460           slak = slak->m_next;
4461         }
4462       while (slak);
4463
4464       retval = hash_insert (op_hash, ins->name, (char *) hack);
4465       if (retval)
4466         as_fatal (_("Internal Error:  Can't hash %s: %s"), ins->name, retval);
4467     }
4468
4469   for (i = 0; i < m68k_numaliases; i++)
4470     {
4471       const char *name = m68k_opcode_aliases[i].primary;
4472       const char *alias = m68k_opcode_aliases[i].alias;
4473       void *val = hash_find (op_hash, name);
4474
4475       if (!val)
4476         as_fatal (_("Internal Error: Can't find %s in hash table"), name);
4477       retval = hash_insert (op_hash, alias, val);
4478       if (retval)
4479         as_fatal (_("Internal Error: Can't hash %s: %s"), alias, retval);
4480     }
4481
4482   /* In MRI mode, all unsized branches are variable sized.  Normally,
4483      they are word sized.  */
4484   if (flag_mri)
4485     {
4486       static struct m68k_opcode_alias mri_aliases[] =
4487         {
4488           { "bhi",      "jhi", },
4489           { "bls",      "jls", },
4490           { "bcc",      "jcc", },
4491           { "bcs",      "jcs", },
4492           { "bne",      "jne", },
4493           { "beq",      "jeq", },
4494           { "bvc",      "jvc", },
4495           { "bvs",      "jvs", },
4496           { "bpl",      "jpl", },
4497           { "bmi",      "jmi", },
4498           { "bge",      "jge", },
4499           { "blt",      "jlt", },
4500           { "bgt",      "jgt", },
4501           { "ble",      "jle", },
4502           { "bra",      "jra", },
4503           { "bsr",      "jbsr", },
4504         };
4505
4506       for (i = 0;
4507            i < (int) (sizeof mri_aliases / sizeof mri_aliases[0]);
4508            i++)
4509         {
4510           const char *name = mri_aliases[i].primary;
4511           const char *alias = mri_aliases[i].alias;
4512           void *val = hash_find (op_hash, name);
4513
4514           if (!val)
4515             as_fatal (_("Internal Error: Can't find %s in hash table"), name);
4516           retval = hash_jam (op_hash, alias, val);
4517           if (retval)
4518             as_fatal (_("Internal Error: Can't hash %s: %s"), alias, retval);
4519         }
4520     }
4521
4522   for (i = 0; i < (int) sizeof (notend_table); i++)
4523     {
4524       notend_table[i] = 0;
4525       alt_notend_table[i] = 0;
4526     }
4527
4528   notend_table[','] = 1;
4529   notend_table['{'] = 1;
4530   notend_table['}'] = 1;
4531   alt_notend_table['a'] = 1;
4532   alt_notend_table['A'] = 1;
4533   alt_notend_table['d'] = 1;
4534   alt_notend_table['D'] = 1;
4535   alt_notend_table['#'] = 1;
4536   alt_notend_table['&'] = 1;
4537   alt_notend_table['f'] = 1;
4538   alt_notend_table['F'] = 1;
4539 #ifdef REGISTER_PREFIX
4540   alt_notend_table[REGISTER_PREFIX] = 1;
4541 #endif
4542
4543   /* We need to put '(' in alt_notend_table to handle
4544        cas2 %d0:%d2,%d3:%d4,(%a0):(%a1)  */
4545   alt_notend_table['('] = 1;
4546
4547   /* We need to put '@' in alt_notend_table to handle
4548        cas2 %d0:%d2,%d3:%d4,@(%d0):@(%d1)  */
4549   alt_notend_table['@'] = 1;
4550
4551   /* We need to put digits in alt_notend_table to handle
4552        bfextu %d0{24:1},%d0  */
4553   alt_notend_table['0'] = 1;
4554   alt_notend_table['1'] = 1;
4555   alt_notend_table['2'] = 1;
4556   alt_notend_table['3'] = 1;
4557   alt_notend_table['4'] = 1;
4558   alt_notend_table['5'] = 1;
4559   alt_notend_table['6'] = 1;
4560   alt_notend_table['7'] = 1;
4561   alt_notend_table['8'] = 1;
4562   alt_notend_table['9'] = 1;
4563
4564 #ifndef MIT_SYNTAX_ONLY
4565   /* Insert pseudo ops, these have to go into the opcode table since
4566      gas expects pseudo ops to start with a dot.  */
4567   {
4568     int n = 0;
4569
4570     while (mote_pseudo_table[n].poc_name)
4571       {
4572         hack = obstack_alloc (&robyn, sizeof (struct m68k_incant));
4573         hash_insert (op_hash,
4574                      mote_pseudo_table[n].poc_name, (char *) hack);
4575         hack->m_operands = 0;
4576         hack->m_opnum = n;
4577         n++;
4578       }
4579   }
4580 #endif
4581
4582   init_regtable ();
4583
4584 #ifdef OBJ_ELF
4585   record_alignment (text_section, 2);
4586   record_alignment (data_section, 2);
4587   record_alignment (bss_section, 2);
4588 #endif
4589 }
4590
4591 \f
4592 /* This is called when a label is defined.  */
4593
4594 void
4595 m68k_frob_label (symbolS *sym)
4596 {
4597   struct label_line *n;
4598
4599   n = (struct label_line *) xmalloc (sizeof *n);
4600   n->next = labels;
4601   n->label = sym;
4602   as_where (&n->file, &n->line);
4603   n->text = 0;
4604   labels = n;
4605   current_label = n;
4606
4607 #ifdef OBJ_ELF
4608   dwarf2_emit_label (sym);
4609 #endif
4610 }
4611
4612 /* This is called when a value that is not an instruction is emitted.  */
4613
4614 void
4615 m68k_flush_pending_output (void)
4616 {
4617   current_label = NULL;
4618 }
4619
4620 /* This is called at the end of the assembly, when the final value of
4621    the label is known.  We warn if this is a text symbol aligned at an
4622    odd location.  */
4623
4624 void
4625 m68k_frob_symbol (symbolS *sym)
4626 {
4627   if (S_GET_SEGMENT (sym) == reg_section
4628       && (int) S_GET_VALUE (sym) < 0)
4629     {
4630       S_SET_SEGMENT (sym, absolute_section);
4631       S_SET_VALUE (sym, ~(int)S_GET_VALUE (sym));
4632     }
4633   else if ((S_GET_VALUE (sym) & 1) != 0)
4634     {
4635       struct label_line *l;
4636
4637       for (l = labels; l != NULL; l = l->next)
4638         {
4639           if (l->label == sym)
4640             {
4641               if (l->text)
4642                 as_warn_where (l->file, l->line,
4643                                _("text label `%s' aligned to odd boundary"),
4644                                S_GET_NAME (sym));
4645               break;
4646             }
4647         }
4648     }
4649 }
4650 \f
4651 /* This is called if we go in or out of MRI mode because of the .mri
4652    pseudo-op.  */
4653
4654 void
4655 m68k_mri_mode_change (int on)
4656 {
4657   if (on)
4658     {
4659       if (! flag_reg_prefix_optional)
4660         {
4661           flag_reg_prefix_optional = 1;
4662 #ifdef REGISTER_PREFIX
4663           init_regtable ();
4664 #endif
4665         }
4666       m68k_abspcadd = 1;
4667       if (! m68k_rel32_from_cmdline)
4668         m68k_rel32 = 0;
4669     }
4670   else
4671     {
4672       if (! reg_prefix_optional_seen)
4673         {
4674 #ifdef REGISTER_PREFIX_OPTIONAL
4675           flag_reg_prefix_optional = REGISTER_PREFIX_OPTIONAL;
4676 #else
4677           flag_reg_prefix_optional = 0;
4678 #endif
4679 #ifdef REGISTER_PREFIX
4680           init_regtable ();
4681 #endif
4682         }
4683       m68k_abspcadd = 0;
4684       if (! m68k_rel32_from_cmdline)
4685         m68k_rel32 = 1;
4686     }
4687 }
4688
4689 char *
4690 md_atof (int type, char *litP, int *sizeP)
4691 {
4692   return ieee_md_atof (type, litP, sizeP, TRUE);
4693 }
4694
4695 void
4696 md_number_to_chars (char *buf, valueT val, int n)
4697 {
4698   number_to_chars_bigendian (buf, val, n);
4699 }
4700
4701 void
4702 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
4703 {
4704   offsetT val = *valP;
4705   addressT upper_limit;
4706   offsetT lower_limit;
4707
4708   /* This is unnecessary but it convinces the native rs6000 compiler
4709      to generate the code we want.  */
4710   char *buf = fixP->fx_frag->fr_literal;
4711   buf += fixP->fx_where;
4712   /* End ibm compiler workaround.  */
4713
4714   val = SEXT (val);
4715
4716   if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
4717     fixP->fx_done = 1;
4718
4719 #ifdef OBJ_ELF
4720   if (fixP->fx_addsy)
4721     {
4722       memset (buf, 0, fixP->fx_size);
4723       fixP->fx_addnumber = val; /* Remember value for emit_reloc.  */
4724
4725       if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
4726           && !S_IS_DEFINED (fixP->fx_addsy)
4727           && !S_IS_WEAK (fixP->fx_addsy))
4728         S_SET_WEAK (fixP->fx_addsy);
4729       return;
4730     }
4731 #elif defined(OBJ_AOUT)
4732   /* PR gas/3041 Do not fix frags referencing a weak symbol.  */
4733   if (fixP->fx_addsy && S_IS_WEAK (fixP->fx_addsy))
4734     {
4735       memset (buf, 0, fixP->fx_size);
4736       fixP->fx_addnumber = val; /* Remember value for emit_reloc.  */
4737       return;
4738     }
4739 #endif
4740
4741   if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
4742       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
4743     return;
4744
4745   switch (fixP->fx_size)
4746     {
4747       /* The cast to offsetT below are necessary to make code
4748          correct for machines where ints are smaller than offsetT.  */
4749     case 1:
4750       *buf++ = val;
4751       upper_limit = 0x7f;
4752       lower_limit = - (offsetT) 0x80;
4753       break;
4754     case 2:
4755       *buf++ = (val >> 8);
4756       *buf++ = val;
4757       upper_limit = 0x7fff;
4758       lower_limit = - (offsetT) 0x8000;
4759       break;
4760     case 4:
4761       *buf++ = (val >> 24);
4762       *buf++ = (val >> 16);
4763       *buf++ = (val >> 8);
4764       *buf++ = val;
4765       upper_limit = 0x7fffffff;
4766       lower_limit = - (offsetT) 0x7fffffff - 1; /* Avoid constant overflow.  */
4767       break;
4768     default:
4769       BAD_CASE (fixP->fx_size);
4770     }
4771
4772   /* Fix up a negative reloc.  */
4773   if (fixP->fx_addsy == NULL && fixP->fx_subsy != NULL)
4774     {
4775       fixP->fx_addsy = fixP->fx_subsy;
4776       fixP->fx_subsy = NULL;
4777       fixP->fx_tcbit = 1;
4778     }
4779
4780   /* For non-pc-relative values, it's conceivable we might get something
4781      like "0xff" for a byte field.  So extend the upper part of the range
4782      to accept such numbers.  We arbitrarily disallow "-0xff" or "0xff+0xff",
4783      so that we can do any range checking at all.  */
4784   if (! fixP->fx_pcrel && ! fixP->fx_signed)
4785     upper_limit = upper_limit * 2 + 1;
4786
4787   if ((addressT) val > upper_limit
4788       && (val > 0 || val < lower_limit))
4789     as_bad_where (fixP->fx_file, fixP->fx_line,
4790                   _("value %ld out of range"), (long)val);
4791
4792   /* A one byte PC-relative reloc means a short branch.  We can't use
4793      a short branch with a value of 0 or -1, because those indicate
4794      different opcodes (branches with longer offsets).  fixup_segment
4795      in write.c may have clobbered fx_pcrel, so we need to examine the
4796      reloc type.  */
4797   if ((fixP->fx_pcrel
4798        || fixP->fx_r_type == BFD_RELOC_8_PCREL)
4799       && fixP->fx_size == 1
4800       && (fixP->fx_addsy == NULL
4801           || S_IS_DEFINED (fixP->fx_addsy))
4802       && (val == 0 || val == -1))
4803     as_bad_where (fixP->fx_file, fixP->fx_line,
4804                   _("invalid byte branch offset"));
4805 }
4806
4807 /* *fragP has been relaxed to its final size, and now needs to have
4808    the bytes inside it modified to conform to the new size  There is UGLY
4809    MAGIC here. ..
4810    */
4811 static void
4812 md_convert_frag_1 (fragS *fragP)
4813 {
4814   long disp;
4815   fixS *fixP = NULL;
4816
4817   /* Address in object code of the displacement.  */
4818   register int object_address = fragP->fr_fix + fragP->fr_address;
4819
4820   /* Address in gas core of the place to store the displacement.  */
4821   /* This convinces the native rs6000 compiler to generate the code we
4822      want.  */
4823   register char *buffer_address = fragP->fr_literal;
4824   buffer_address += fragP->fr_fix;
4825   /* End ibm compiler workaround.  */
4826
4827   /* The displacement of the address, from current location.  */
4828   disp = fragP->fr_symbol ? S_GET_VALUE (fragP->fr_symbol) : 0;
4829   disp = (disp + fragP->fr_offset) - object_address;
4830
4831   switch (fragP->fr_subtype)
4832     {
4833     case TAB (BRANCHBWL, BYTE):
4834     case TAB (BRABSJUNC, BYTE):
4835     case TAB (BRABSJCOND, BYTE):
4836     case TAB (BRANCHBW, BYTE):
4837     case TAB (BRANCHBWPL, BYTE):
4838       know (issbyte (disp));
4839       if (disp == 0)
4840         as_bad_where (fragP->fr_file, fragP->fr_line,
4841                       _("short branch with zero offset: use :w"));
4842       fixP = fix_new (fragP, fragP->fr_fix - 1, 1, fragP->fr_symbol,
4843                       fragP->fr_offset, 1, RELAX_RELOC_PC8);
4844       fixP->fx_pcrel_adjust = -1;
4845       break;
4846     case TAB (BRANCHBWL, SHORT):
4847     case TAB (BRABSJUNC, SHORT):
4848     case TAB (BRABSJCOND, SHORT):
4849     case TAB (BRANCHBW, SHORT):
4850     case TAB (BRANCHBWPL, SHORT):
4851       fragP->fr_opcode[1] = 0x00;
4852       fixP = fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
4853                       fragP->fr_offset, 1, RELAX_RELOC_PC16);
4854       fragP->fr_fix += 2;
4855       break;
4856     case TAB (BRANCHBWL, LONG):
4857       fragP->fr_opcode[1] = (char) 0xFF;
4858       fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
4859                       fragP->fr_offset, 1, RELAX_RELOC_PC32);
4860       fragP->fr_fix += 4;
4861       break;
4862     case TAB (BRANCHBWPL, LONG):
4863       /* Here we are converting an unconditional branch into a pair of
4864          conditional branches, in order to get the range.  */
4865       fragP->fr_opcode[0] = 0x66; /* bne */
4866       fragP->fr_opcode[1] = 0xFF;
4867       fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
4868                       fragP->fr_offset, 1, RELAX_RELOC_PC32);
4869       fixP->fx_file = fragP->fr_file;
4870       fixP->fx_line = fragP->fr_line;
4871       fragP->fr_fix += 4;  /* Skip first offset */
4872       buffer_address += 4;
4873       *buffer_address++ = 0x67; /* beq */
4874       *buffer_address++ = 0xff;
4875       fragP->fr_fix += 2;  /* Skip second branch opcode */
4876       fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
4877                       fragP->fr_offset, 1, RELAX_RELOC_PC32);
4878       fragP->fr_fix += 4;
4879       break;
4880     case TAB (BRABSJUNC, LONG):
4881       if (fragP->fr_opcode[0] == 0x61)          /* jbsr */
4882         {
4883           if (flag_keep_pcrel)
4884             as_bad_where (fragP->fr_file, fragP->fr_line,
4885                           _("Conversion of PC relative BSR to absolute JSR"));
4886           fragP->fr_opcode[0] = 0x4E;
4887           fragP->fr_opcode[1] = (char) 0xB9; /* JSR with ABSL LONG operand.  */
4888           fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
4889                           fragP->fr_offset, 0, RELAX_RELOC_ABS32);
4890           fragP->fr_fix += 4;
4891         }
4892       else if (fragP->fr_opcode[0] == 0x60)     /* jbra */
4893         {
4894           if (flag_keep_pcrel)
4895             as_bad_where (fragP->fr_file, fragP->fr_line,
4896                       _("Conversion of PC relative branch to absolute jump"));
4897           fragP->fr_opcode[0] = 0x4E;
4898           fragP->fr_opcode[1] = (char) 0xF9; /* JMP with ABSL LONG operand.  */
4899           fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
4900                           fragP->fr_offset, 0, RELAX_RELOC_ABS32);
4901           fragP->fr_fix += 4;
4902         }
4903       else
4904         {
4905           /* This cannot happen, because jbsr and jbra are the only two
4906              unconditional branches.  */
4907           abort ();
4908         }
4909       break;
4910     case TAB (BRABSJCOND, LONG):
4911       if (flag_keep_pcrel)
4912         as_bad_where (fragP->fr_file, fragP->fr_line,
4913                   _("Conversion of PC relative conditional branch to absolute jump"));
4914
4915       /* Only Bcc 68000 instructions can come here
4916          Change bcc into b!cc/jmp absl long.  */
4917       fragP->fr_opcode[0] ^= 0x01;      /* Invert bcc.  */
4918       fragP->fr_opcode[1]  = 0x06;      /* Branch offset = 6.  */
4919
4920       /* JF: these used to be fr_opcode[2,3], but they may be in a
4921            different frag, in which case referring to them is a no-no.
4922            Only fr_opcode[0,1] are guaranteed to work.  */
4923       *buffer_address++ = 0x4e; /* put in jmp long (0x4ef9) */
4924       *buffer_address++ = (char) 0xf9;
4925       fragP->fr_fix += 2;       /* Account for jmp instruction.  */
4926       fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
4927                       fragP->fr_offset, 0, RELAX_RELOC_ABS32);
4928       fragP->fr_fix += 4;
4929       break;
4930     case TAB (FBRANCH, SHORT):
4931       know ((fragP->fr_opcode[1] & 0x40) == 0);
4932       fixP = fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
4933                       fragP->fr_offset, 1, RELAX_RELOC_PC16);
4934       fragP->fr_fix += 2;
4935       break;
4936     case TAB (FBRANCH, LONG):
4937       fragP->fr_opcode[1] |= 0x40;      /* Turn on LONG bit.  */
4938       fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
4939                       fragP->fr_offset, 1, RELAX_RELOC_PC32);
4940       fragP->fr_fix += 4;
4941       break;
4942     case TAB (DBCCLBR, SHORT):
4943     case TAB (DBCCABSJ, SHORT):
4944       fixP = fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
4945                       fragP->fr_offset, 1, RELAX_RELOC_PC16);
4946       fragP->fr_fix += 2;
4947       break;
4948     case TAB (DBCCLBR, LONG):
4949       /* Only DBcc instructions can come here.
4950          Change dbcc into dbcc/bral.
4951          JF: these used to be fr_opcode[2-7], but that's wrong.  */
4952       if (flag_keep_pcrel)
4953         as_bad_where (fragP->fr_file, fragP->fr_line,
4954                   _("Conversion of DBcc to absolute jump"));
4955
4956       *buffer_address++ = 0x00; /* Branch offset = 4.  */
4957       *buffer_address++ = 0x04;
4958       *buffer_address++ = 0x60; /* Put in bra pc+6.  */
4959       *buffer_address++ = 0x06;
4960       *buffer_address++ = 0x60;     /* Put in bral (0x60ff).  */
4961       *buffer_address++ = (char) 0xff;
4962
4963       fragP->fr_fix += 6;       /* Account for bra/jmp instructions.  */
4964       fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
4965                       fragP->fr_offset, 1, RELAX_RELOC_PC32);
4966       fragP->fr_fix += 4;
4967       break;
4968     case TAB (DBCCABSJ, LONG):
4969       /* Only DBcc instructions can come here.
4970          Change dbcc into dbcc/jmp.
4971          JF: these used to be fr_opcode[2-7], but that's wrong.  */
4972       if (flag_keep_pcrel)
4973         as_bad_where (fragP->fr_file, fragP->fr_line,
4974                       _("Conversion of PC relative conditional branch to absolute jump"));
4975
4976       *buffer_address++ = 0x00;         /* Branch offset = 4.  */
4977       *buffer_address++ = 0x04;
4978       *buffer_address++ = 0x60;         /* Put in bra pc + 6.  */
4979       *buffer_address++ = 0x06;
4980       *buffer_address++ = 0x4e;         /* Put in jmp long (0x4ef9).  */
4981       *buffer_address++ = (char) 0xf9;
4982
4983       fragP->fr_fix += 6;               /* Account for bra/jmp instructions.  */
4984       fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
4985                       fragP->fr_offset, 0, RELAX_RELOC_ABS32);
4986       fragP->fr_fix += 4;
4987       break;
4988     case TAB (PCREL1632, SHORT):
4989       fragP->fr_opcode[1] &= ~0x3F;
4990       fragP->fr_opcode[1] |= 0x3A; /* 072 - mode 7.2 */
4991       fixP = fix_new (fragP, (int) (fragP->fr_fix), 2, fragP->fr_symbol,
4992                       fragP->fr_offset, 1, RELAX_RELOC_PC16);
4993       fragP->fr_fix += 2;
4994       break;
4995     case TAB (PCREL1632, LONG):
4996       /* Already set to mode 7.3; this indicates: PC indirect with
4997          suppressed index, 32-bit displacement.  */
4998       *buffer_address++ = 0x01;
4999       *buffer_address++ = 0x70;
5000       fragP->fr_fix += 2;
5001       fixP = fix_new (fragP, (int) (fragP->fr_fix), 4, fragP->fr_symbol,
5002                       fragP->fr_offset, 1, RELAX_RELOC_PC32);
5003       fixP->fx_pcrel_adjust = 2;
5004       fragP->fr_fix += 4;
5005       break;
5006     case TAB (PCINDEX, BYTE):
5007       assert (fragP->fr_fix >= 2);
5008       buffer_address[-2] &= ~1;
5009       fixP = fix_new (fragP, fragP->fr_fix - 1, 1, fragP->fr_symbol,
5010                       fragP->fr_offset, 1, RELAX_RELOC_PC8);
5011       fixP->fx_pcrel_adjust = 1;
5012       break;
5013     case TAB (PCINDEX, SHORT):
5014       assert (fragP->fr_fix >= 2);
5015       buffer_address[-2] |= 0x1;
5016       buffer_address[-1] = 0x20;
5017       fixP = fix_new (fragP, (int) (fragP->fr_fix), 2, fragP->fr_symbol,
5018                       fragP->fr_offset, 1, RELAX_RELOC_PC16);
5019       fixP->fx_pcrel_adjust = 2;
5020       fragP->fr_fix += 2;
5021       break;
5022     case TAB (PCINDEX, LONG):
5023       assert (fragP->fr_fix >= 2);
5024       buffer_address[-2] |= 0x1;
5025       buffer_address[-1] = 0x30;
5026       fixP = fix_new (fragP, (int) (fragP->fr_fix), 4, fragP->fr_symbol,
5027                       fragP->fr_offset, 1, RELAX_RELOC_PC32);
5028       fixP->fx_pcrel_adjust = 2;
5029       fragP->fr_fix += 4;
5030       break;
5031     case TAB (ABSTOPCREL, SHORT):
5032       fixP = fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
5033                       fragP->fr_offset, 1, RELAX_RELOC_PC16);
5034       fragP->fr_fix += 2;
5035       break;
5036     case TAB (ABSTOPCREL, LONG):
5037       if (flag_keep_pcrel)
5038         as_bad_where (fragP->fr_file, fragP->fr_line,
5039                       _("Conversion of PC relative displacement to absolute"));
5040       /* The thing to do here is force it to ABSOLUTE LONG, since
5041          ABSTOPCREL is really trying to shorten an ABSOLUTE address anyway.  */
5042       if ((fragP->fr_opcode[1] & 0x3F) != 0x3A)
5043         abort ();
5044       fragP->fr_opcode[1] &= ~0x3F;
5045       fragP->fr_opcode[1] |= 0x39;      /* Mode 7.1 */
5046       fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
5047                       fragP->fr_offset, 0, RELAX_RELOC_ABS32);
5048       fragP->fr_fix += 4;
5049       break;
5050     }
5051   if (fixP)
5052     {
5053       fixP->fx_file = fragP->fr_file;
5054       fixP->fx_line = fragP->fr_line;
5055     }
5056 }
5057
5058 void
5059 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
5060                  segT sec ATTRIBUTE_UNUSED,
5061                  fragS *fragP)
5062 {
5063   md_convert_frag_1 (fragP);
5064 }
5065
5066 /* Force truly undefined symbols to their maximum size, and generally set up
5067    the frag list to be relaxed
5068    */
5069 int
5070 md_estimate_size_before_relax (fragS *fragP, segT segment)
5071 {
5072   /* Handle SZ_UNDEF first, it can be changed to BYTE or SHORT.  */
5073   switch (fragP->fr_subtype)
5074     {
5075     case TAB (BRANCHBWL, SZ_UNDEF):
5076     case TAB (BRANCHBWPL, SZ_UNDEF):
5077     case TAB (BRABSJUNC, SZ_UNDEF):
5078     case TAB (BRABSJCOND, SZ_UNDEF):
5079       {
5080         if (S_GET_SEGMENT (fragP->fr_symbol) == segment
5081             && relaxable_symbol (fragP->fr_symbol))
5082           {
5083             fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), BYTE);
5084           }
5085         else if (flag_short_refs)
5086           {
5087             /* Symbol is undefined and we want short ref.  */
5088             fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT);
5089           }
5090         else
5091           {
5092             /* Symbol is still undefined.  Make it LONG.  */
5093             fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), LONG);
5094           }
5095         break;
5096       }
5097
5098     case TAB (BRANCHBW, SZ_UNDEF):
5099       {
5100         if (S_GET_SEGMENT (fragP->fr_symbol) == segment
5101             && relaxable_symbol (fragP->fr_symbol))
5102           {
5103             fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), BYTE);
5104           }
5105         else
5106           {
5107             /* Symbol is undefined and we don't have long branches.  */
5108             fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT);
5109           }
5110         break;
5111       }
5112
5113     case TAB (FBRANCH, SZ_UNDEF):
5114     case TAB (DBCCLBR, SZ_UNDEF):
5115     case TAB (DBCCABSJ, SZ_UNDEF):
5116     case TAB (PCREL1632, SZ_UNDEF):
5117       {
5118         if ((S_GET_SEGMENT (fragP->fr_symbol) == segment
5119              && relaxable_symbol (fragP->fr_symbol))
5120             || flag_short_refs)
5121           {
5122             fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT);
5123           }
5124         else
5125           {
5126             fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), LONG);
5127           }
5128         break;
5129       }
5130
5131     case TAB (PCINDEX, SZ_UNDEF):
5132       if ((S_GET_SEGMENT (fragP->fr_symbol) == segment
5133            && relaxable_symbol (fragP->fr_symbol)))
5134         {
5135           fragP->fr_subtype = TAB (PCINDEX, BYTE);
5136         }
5137       else
5138         {
5139           fragP->fr_subtype = TAB (PCINDEX, LONG);
5140         }
5141       break;
5142
5143     case TAB (ABSTOPCREL, SZ_UNDEF):
5144       {
5145         if ((S_GET_SEGMENT (fragP->fr_symbol) == segment
5146              && relaxable_symbol (fragP->fr_symbol)))
5147           {
5148             fragP->fr_subtype = TAB (ABSTOPCREL, SHORT);
5149           }
5150         else
5151           {
5152             fragP->fr_subtype = TAB (ABSTOPCREL, LONG);
5153           }
5154         break;
5155       }
5156
5157     default:
5158       break;
5159     }
5160
5161   /* Now that SZ_UNDEF are taken care of, check others.  */
5162   switch (fragP->fr_subtype)
5163     {
5164     case TAB (BRANCHBWL, BYTE):
5165     case TAB (BRABSJUNC, BYTE):
5166     case TAB (BRABSJCOND, BYTE):
5167     case TAB (BRANCHBW, BYTE):
5168       /* We can't do a short jump to the next instruction, so in that
5169          case we force word mode.  If the symbol is at the start of a
5170          frag, and it is the next frag with any data in it (usually
5171          this is just the next frag, but assembler listings may
5172          introduce empty frags), we must use word mode.  */
5173       if (fragP->fr_symbol)
5174         {
5175           fragS *sym_frag;
5176
5177           sym_frag = symbol_get_frag (fragP->fr_symbol);
5178           if (S_GET_VALUE (fragP->fr_symbol) == sym_frag->fr_address)
5179             {
5180               fragS *l;
5181
5182               for (l = fragP->fr_next; l && l != sym_frag; l = l->fr_next)
5183                 if (l->fr_fix != 0)
5184                   break;
5185               if (l == sym_frag)
5186                 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT);
5187             }
5188         }
5189       break;
5190     default:
5191       break;
5192     }
5193   return md_relax_table[fragP->fr_subtype].rlx_length;
5194 }
5195
5196 #if defined(OBJ_AOUT) | defined(OBJ_BOUT)
5197 /* the bit-field entries in the relocation_info struct plays hell
5198    with the byte-order problems of cross-assembly.  So as a hack,
5199    I added this mach. dependent ri twiddler.  Ugly, but it gets
5200    you there. -KWK  */
5201 /* on m68k: first 4 bytes are normal unsigned long, next three bytes
5202    are symbolnum, most sig. byte first.  Last byte is broken up with
5203    bit 7 as pcrel, bits 6 & 5 as length, bit 4 as pcrel, and the lower
5204    nibble as nuthin. (on Sun 3 at least) */
5205 /* Translate the internal relocation information into target-specific
5206    format.  */
5207 #ifdef comment
5208 void
5209 md_ri_to_chars (char *the_bytes, struct reloc_info_generic *ri)
5210 {
5211   /* This is easy.  */
5212   md_number_to_chars (the_bytes, ri->r_address, 4);
5213   /* Now the fun stuff.  */
5214   the_bytes[4] = (ri->r_symbolnum >> 16) & 0x0ff;
5215   the_bytes[5] = (ri->r_symbolnum >>  8) & 0x0ff;
5216   the_bytes[6] =  ri->r_symbolnum        & 0x0ff;
5217   the_bytes[7] = (((ri->r_pcrel << 7) & 0x80)
5218                   | ((ri->r_length << 5) & 0x60)
5219                   | ((ri->r_extern << 4) & 0x10));
5220 }
5221
5222 #endif
5223
5224 #endif /* OBJ_AOUT or OBJ_BOUT */
5225
5226 #ifndef WORKING_DOT_WORD
5227 int md_short_jump_size = 4;
5228 int md_long_jump_size = 6;
5229
5230 void
5231 md_create_short_jump (char *ptr, addressT from_addr, addressT to_addr,
5232                       fragS *frag ATTRIBUTE_UNUSED,
5233                       symbolS *to_symbol ATTRIBUTE_UNUSED)
5234 {
5235   valueT offset;
5236
5237   offset = to_addr - (from_addr + 2);
5238
5239   md_number_to_chars (ptr, (valueT) 0x6000, 2);
5240   md_number_to_chars (ptr + 2, (valueT) offset, 2);
5241 }
5242
5243 void
5244 md_create_long_jump (char *ptr, addressT from_addr, addressT to_addr,
5245                      fragS *frag, symbolS *to_symbol)
5246 {
5247   valueT offset;
5248
5249   if (!HAVE_LONG_BRANCH (current_architecture))
5250     {
5251       if (flag_keep_pcrel)
5252         as_fatal (_("Tried to convert PC relative branch to absolute jump"));
5253       offset = to_addr - S_GET_VALUE (to_symbol);
5254       md_number_to_chars (ptr, (valueT) 0x4EF9, 2);
5255       md_number_to_chars (ptr + 2, (valueT) offset, 4);
5256       fix_new (frag, (ptr + 2) - frag->fr_literal, 4, to_symbol, (offsetT) 0,
5257                0, NO_RELOC);
5258     }
5259   else
5260     {
5261       offset = to_addr - (from_addr + 2);
5262       md_number_to_chars (ptr, (valueT) 0x60ff, 2);
5263       md_number_to_chars (ptr + 2, (valueT) offset, 4);
5264     }
5265 }
5266
5267 #endif
5268
5269 /* Different values of OK tell what its OK to return.  Things that
5270    aren't OK are an error (what a shock, no?)
5271
5272    0:  Everything is OK
5273    10:  Absolute 1:8       only
5274    20:  Absolute 0:7       only
5275    30:  absolute 0:15      only
5276    40:  Absolute 0:31      only
5277    50:  absolute 0:127     only
5278    55:  absolute -64:63    only
5279    60:  absolute -128:127  only
5280    65:  absolute 0:511     only
5281    70:  absolute 0:4095    only
5282    80:  absolute -1, 1:7   only
5283    90:  No bignums.          */
5284
5285 static int
5286 get_num (struct m68k_exp *exp, int ok)
5287 {
5288   if (exp->exp.X_op == O_absent)
5289     {
5290       /* Do the same thing the VAX asm does.  */
5291       op (exp) = O_constant;
5292       adds (exp) = 0;
5293       subs (exp) = 0;
5294       offs (exp) = 0;
5295       if (ok == 10)
5296         {
5297           as_warn (_("expression out of range: defaulting to 1"));
5298           offs (exp) = 1;
5299         }
5300     }
5301   else if (exp->exp.X_op == O_constant)
5302     {
5303       switch (ok)
5304         {
5305         case 10:
5306           if ((valueT) TRUNC (offs (exp)) - 1 > 7)
5307             {
5308               as_warn (_("expression out of range: defaulting to 1"));
5309               offs (exp) = 1;
5310             }
5311           break;
5312         case 20:
5313           if ((valueT) TRUNC (offs (exp)) > 7)
5314             goto outrange;
5315           break;
5316         case 30:
5317           if ((valueT) TRUNC (offs (exp)) > 15)
5318             goto outrange;
5319           break;
5320         case 40:
5321           if ((valueT) TRUNC (offs (exp)) > 32)
5322             goto outrange;
5323           break;
5324         case 50:
5325           if ((valueT) TRUNC (offs (exp)) > 127)
5326             goto outrange;
5327           break;
5328         case 55:
5329           if ((valueT) SEXT (offs (exp)) + 64 > 127)
5330             goto outrange;
5331           break;
5332         case 60:
5333           if ((valueT) SEXT (offs (exp)) + 128 > 255)
5334             goto outrange;
5335           break;
5336         case 65:
5337           if ((valueT) TRUNC (offs (exp)) > 511)
5338             goto outrange;
5339           break;
5340         case 70:
5341           if ((valueT) TRUNC (offs (exp)) > 4095)
5342             {
5343             outrange:
5344               as_warn (_("expression out of range: defaulting to 0"));
5345               offs (exp) = 0;
5346             }
5347           break;
5348         case 80:
5349           if ((valueT) TRUNC (offs (exp)) != 0xffffffff
5350               && (valueT) TRUNC (offs (exp)) - 1 > 6)
5351             {
5352               as_warn (_("expression out of range: defaulting to 1"));
5353               offs (exp) = 1;
5354             }
5355           break;
5356         default:
5357           break;
5358         }
5359     }
5360   else if (exp->exp.X_op == O_big)
5361     {
5362       if (offs (exp) <= 0       /* flonum.  */
5363           && (ok == 90          /* no bignums */
5364               || (ok > 10       /* Small-int ranges including 0 ok.  */
5365                   /* If we have a flonum zero, a zero integer should
5366                      do as well (e.g., in moveq).  */
5367                   && generic_floating_point_number.exponent == 0
5368                   && generic_floating_point_number.low[0] == 0)))
5369         {
5370           /* HACK! Turn it into a long.  */
5371           LITTLENUM_TYPE words[6];
5372
5373           gen_to_words (words, 2, 8L);  /* These numbers are magic!  */
5374           op (exp) = O_constant;
5375           adds (exp) = 0;
5376           subs (exp) = 0;
5377           offs (exp) = words[1] | (words[0] << 16);
5378         }
5379       else if (ok != 0)
5380         {
5381           op (exp) = O_constant;
5382           adds (exp) = 0;
5383           subs (exp) = 0;
5384           offs (exp) = (ok == 10) ? 1 : 0;
5385           as_warn (_("Can't deal with expression; defaulting to %ld"),
5386                    (long) offs (exp));
5387         }
5388     }
5389   else
5390     {
5391       if (ok >= 10 && ok <= 80)
5392         {
5393           op (exp) = O_constant;
5394           adds (exp) = 0;
5395           subs (exp) = 0;
5396           offs (exp) = (ok == 10) ? 1 : 0;
5397           as_warn (_("Can't deal with expression; defaulting to %ld"),
5398                    (long) offs (exp));
5399         }
5400     }
5401
5402   if (exp->size != SIZE_UNSPEC)
5403     {
5404       switch (exp->size)
5405         {
5406         case SIZE_UNSPEC:
5407         case SIZE_LONG:
5408           break;
5409         case SIZE_BYTE:
5410           if (!isbyte (offs (exp)))
5411             as_warn (_("expression doesn't fit in BYTE"));
5412           break;
5413         case SIZE_WORD:
5414           if (!isword (offs (exp)))
5415             as_warn (_("expression doesn't fit in WORD"));
5416           break;
5417         }
5418     }
5419
5420   return offs (exp);
5421 }
5422
5423 /* These are the back-ends for the various machine dependent pseudo-ops.  */
5424
5425 static void
5426 s_data1 (int ignore ATTRIBUTE_UNUSED)
5427 {
5428   subseg_set (data_section, 1);
5429   demand_empty_rest_of_line ();
5430 }
5431
5432 static void
5433 s_data2 (int ignore ATTRIBUTE_UNUSED)
5434 {
5435   subseg_set (data_section, 2);
5436   demand_empty_rest_of_line ();
5437 }
5438
5439 static void
5440 s_bss (int ignore ATTRIBUTE_UNUSED)
5441 {
5442   /* We don't support putting frags in the BSS segment, we fake it
5443      by marking in_bss, then looking at s_skip for clues.  */
5444
5445   subseg_set (bss_section, 0);
5446   demand_empty_rest_of_line ();
5447 }
5448
5449 static void
5450 s_even (int ignore ATTRIBUTE_UNUSED)
5451 {
5452   register int temp;
5453   register long temp_fill;
5454
5455   temp = 1;                     /* JF should be 2? */
5456   temp_fill = get_absolute_expression ();
5457   if (!need_pass_2)             /* Never make frag if expect extra pass.  */
5458     frag_align (temp, (int) temp_fill, 0);
5459   demand_empty_rest_of_line ();
5460   record_alignment (now_seg, temp);
5461 }
5462
5463 static void
5464 s_proc (int ignore ATTRIBUTE_UNUSED)
5465 {
5466   demand_empty_rest_of_line ();
5467 }
5468 \f
5469 /* Pseudo-ops handled for MRI compatibility.  */
5470
5471 /* This function returns non-zero if the argument is a conditional
5472    pseudo-op.  This is called when checking whether a pending
5473    alignment is needed.  */
5474
5475 int
5476 m68k_conditional_pseudoop (pseudo_typeS *pop)
5477 {
5478   return (pop->poc_handler == s_mri_if
5479           || pop->poc_handler == s_mri_else);
5480 }
5481
5482 /* Handle an MRI style chip specification.  */
5483
5484 static void
5485 mri_chip (void)
5486 {
5487   char *s;
5488   char c;
5489   int i;
5490
5491   s = input_line_pointer;
5492   /* We can't use get_symbol_end since the processor names are not proper
5493      symbols.  */
5494   while (is_part_of_name (c = *input_line_pointer++))
5495     ;
5496   *--input_line_pointer = 0;
5497   for (i = 0; m68k_cpus[i].name; i++)
5498     if (strcasecmp (s, m68k_cpus[i].name) == 0)
5499       break;
5500   if (!m68k_cpus[i].name)
5501     {
5502       as_bad (_("%s: unrecognized processor name"), s);
5503       *input_line_pointer = c;
5504       ignore_rest_of_line ();
5505       return;
5506     }
5507   *input_line_pointer = c;
5508
5509   if (*input_line_pointer == '/')
5510     current_architecture = 0;
5511   else
5512     current_architecture &= m68881 | m68851;
5513   current_architecture |= m68k_cpus[i].arch & ~(m68881 | m68851);
5514   control_regs = m68k_cpus[i].control_regs;
5515
5516   while (*input_line_pointer == '/')
5517     {
5518       ++input_line_pointer;
5519       s = input_line_pointer;
5520       /* We can't use get_symbol_end since the processor names are not
5521          proper symbols.  */
5522       while (is_part_of_name (c = *input_line_pointer++))
5523         ;
5524       *--input_line_pointer = 0;
5525       if (strcmp (s, "68881") == 0)
5526         current_architecture |= m68881;
5527       else if (strcmp (s, "68851") == 0)
5528         current_architecture |= m68851;
5529       *input_line_pointer = c;
5530     }
5531 }
5532
5533 /* The MRI CHIP pseudo-op.  */
5534
5535 static void
5536 s_chip (int ignore ATTRIBUTE_UNUSED)
5537 {
5538   char *stop = NULL;
5539   char stopc;
5540
5541   if (flag_mri)
5542     stop = mri_comment_field (&stopc);
5543   mri_chip ();
5544   if (flag_mri)
5545     mri_comment_end (stop, stopc);
5546   demand_empty_rest_of_line ();
5547 }
5548
5549 /* The MRI FOPT pseudo-op.  */
5550
5551 static void
5552 s_fopt (int ignore ATTRIBUTE_UNUSED)
5553 {
5554   SKIP_WHITESPACE ();
5555
5556   if (strncasecmp (input_line_pointer, "ID=", 3) == 0)
5557     {
5558       int temp;
5559
5560       input_line_pointer += 3;
5561       temp = get_absolute_expression ();
5562       if (temp < 0 || temp > 7)
5563         as_bad (_("bad coprocessor id"));
5564       else
5565         m68k_float_copnum = COP0 + temp;
5566     }
5567   else
5568     {
5569       as_bad (_("unrecognized fopt option"));
5570       ignore_rest_of_line ();
5571       return;
5572     }
5573
5574   demand_empty_rest_of_line ();
5575 }
5576
5577 /* The structure used to handle the MRI OPT pseudo-op.  */
5578
5579 struct opt_action
5580 {
5581   /* The name of the option.  */
5582   const char *name;
5583
5584   /* If this is not NULL, just call this function.  The first argument
5585      is the ARG field of this structure, the second argument is
5586      whether the option was negated.  */
5587   void (*pfn) (int arg, int on);
5588
5589   /* If this is not NULL, and the PFN field is NULL, set the variable
5590      this points to.  Set it to the ARG field if the option was not
5591      negated, and the NOTARG field otherwise.  */
5592   int *pvar;
5593
5594   /* The value to pass to PFN or to assign to *PVAR.  */
5595   int arg;
5596
5597   /* The value to assign to *PVAR if the option is negated.  If PFN is
5598      NULL, and PVAR is not NULL, and ARG and NOTARG are the same, then
5599      the option may not be negated.  */
5600   int notarg;
5601 };
5602
5603 /* The table used to handle the MRI OPT pseudo-op.  */
5604
5605 static void skip_to_comma (int, int);
5606 static void opt_nest (int, int);
5607 static void opt_chip (int, int);
5608 static void opt_list (int, int);
5609 static void opt_list_symbols (int, int);
5610
5611 static const struct opt_action opt_table[] =
5612 {
5613   { "abspcadd", 0, &m68k_abspcadd, 1, 0 },
5614
5615   /* We do relaxing, so there is little use for these options.  */
5616   { "b", 0, 0, 0, 0 },
5617   { "brs", 0, 0, 0, 0 },
5618   { "brb", 0, 0, 0, 0 },
5619   { "brl", 0, 0, 0, 0 },
5620   { "brw", 0, 0, 0, 0 },
5621
5622   { "c", 0, 0, 0, 0 },
5623   { "cex", 0, 0, 0, 0 },
5624   { "case", 0, &symbols_case_sensitive, 1, 0 },
5625   { "cl", 0, 0, 0, 0 },
5626   { "cre", 0, 0, 0, 0 },
5627   { "d", 0, &flag_keep_locals, 1, 0 },
5628   { "e", 0, 0, 0, 0 },
5629   { "f", 0, &flag_short_refs, 1, 0 },
5630   { "frs", 0, &flag_short_refs, 1, 0 },
5631   { "frl", 0, &flag_short_refs, 0, 1 },
5632   { "g", 0, 0, 0, 0 },
5633   { "i", 0, 0, 0, 0 },
5634   { "m", 0, 0, 0, 0 },
5635   { "mex", 0, 0, 0, 0 },
5636   { "mc", 0, 0, 0, 0 },
5637   { "md", 0, 0, 0, 0 },
5638   { "nest", opt_nest, 0, 0, 0 },
5639   { "next", skip_to_comma, 0, 0, 0 },
5640   { "o", 0, 0, 0, 0 },
5641   { "old", 0, 0, 0, 0 },
5642   { "op", skip_to_comma, 0, 0, 0 },
5643   { "pco", 0, 0, 0, 0 },
5644   { "p", opt_chip, 0, 0, 0 },
5645   { "pcr", 0, 0, 0, 0 },
5646   { "pcs", 0, 0, 0, 0 },
5647   { "r", 0, 0, 0, 0 },
5648   { "quick", 0, &m68k_quick, 1, 0 },
5649   { "rel32", 0, &m68k_rel32, 1, 0 },
5650   { "s", opt_list, 0, 0, 0 },
5651   { "t", opt_list_symbols, 0, 0, 0 },
5652   { "w", 0, &flag_no_warnings, 0, 1 },
5653   { "x", 0, 0, 0, 0 }
5654 };
5655
5656 #define OPTCOUNT ((int) (sizeof opt_table / sizeof opt_table[0]))
5657
5658 /* The MRI OPT pseudo-op.  */
5659
5660 static void
5661 s_opt (int ignore ATTRIBUTE_UNUSED)
5662 {
5663   do
5664     {
5665       int t;
5666       char *s;
5667       char c;
5668       int i;
5669       const struct opt_action *o;
5670
5671       SKIP_WHITESPACE ();
5672
5673       t = 1;
5674       if (*input_line_pointer == '-')
5675         {
5676           ++input_line_pointer;
5677           t = 0;
5678         }
5679       else if (strncasecmp (input_line_pointer, "NO", 2) == 0)
5680         {
5681           input_line_pointer += 2;
5682           t = 0;
5683         }
5684
5685       s = input_line_pointer;
5686       c = get_symbol_end ();
5687
5688       for (i = 0, o = opt_table; i < OPTCOUNT; i++, o++)
5689         {
5690           if (strcasecmp (s, o->name) == 0)
5691             {
5692               if (o->pfn)
5693                 {
5694                   /* Restore input_line_pointer now in case the option
5695                      takes arguments.  */
5696                   *input_line_pointer = c;
5697                   (*o->pfn) (o->arg, t);
5698                 }
5699               else if (o->pvar != NULL)
5700                 {
5701                   if (! t && o->arg == o->notarg)
5702                     as_bad (_("option `%s' may not be negated"), s);
5703                   *input_line_pointer = c;
5704                   *o->pvar = t ? o->arg : o->notarg;
5705                 }
5706               else
5707                 *input_line_pointer = c;
5708               break;
5709             }
5710         }
5711       if (i >= OPTCOUNT)
5712         {
5713           as_bad (_("option `%s' not recognized"), s);
5714           *input_line_pointer = c;
5715         }
5716     }
5717   while (*input_line_pointer++ == ',');
5718
5719   /* Move back to terminating character.  */
5720   --input_line_pointer;
5721   demand_empty_rest_of_line ();
5722 }
5723
5724 /* Skip ahead to a comma.  This is used for OPT options which we do
5725    not support and which take arguments.  */
5726
5727 static void
5728 skip_to_comma (int arg ATTRIBUTE_UNUSED, int on ATTRIBUTE_UNUSED)
5729 {
5730   while (*input_line_pointer != ','
5731          && ! is_end_of_line[(unsigned char) *input_line_pointer])
5732     ++input_line_pointer;
5733 }
5734
5735 /* Handle the OPT NEST=depth option.  */
5736
5737 static void
5738 opt_nest (int arg ATTRIBUTE_UNUSED, int on ATTRIBUTE_UNUSED)
5739 {
5740   if (*input_line_pointer != '=')
5741     {
5742       as_bad (_("bad format of OPT NEST=depth"));
5743       return;
5744     }
5745
5746   ++input_line_pointer;
5747   max_macro_nest = get_absolute_expression ();
5748 }
5749
5750 /* Handle the OPT P=chip option.  */
5751
5752 static void
5753 opt_chip (int arg ATTRIBUTE_UNUSED, int on ATTRIBUTE_UNUSED)
5754 {
5755   if (*input_line_pointer != '=')
5756     {
5757       /* This is just OPT P, which we do not support.  */
5758       return;
5759     }
5760
5761   ++input_line_pointer;
5762   mri_chip ();
5763 }
5764
5765 /* Handle the OPT S option.  */
5766
5767 static void
5768 opt_list (int arg ATTRIBUTE_UNUSED, int on)
5769 {
5770   listing_list (on);
5771 }
5772
5773 /* Handle the OPT T option.  */
5774
5775 static void
5776 opt_list_symbols (int arg ATTRIBUTE_UNUSED, int on)
5777 {
5778   if (on)
5779     listing |= LISTING_SYMBOLS;
5780   else
5781     listing &= ~LISTING_SYMBOLS;
5782 }
5783
5784 /* Handle the MRI REG pseudo-op.  */
5785
5786 static void
5787 s_reg (int ignore ATTRIBUTE_UNUSED)
5788 {
5789   char *s;
5790   int c;
5791   struct m68k_op rop;
5792   int mask;
5793   char *stop = NULL;
5794   char stopc;
5795
5796   if (line_label == NULL)
5797     {
5798       as_bad (_("missing label"));
5799       ignore_rest_of_line ();
5800       return;
5801     }
5802
5803   if (flag_mri)
5804     stop = mri_comment_field (&stopc);
5805
5806   SKIP_WHITESPACE ();
5807
5808   s = input_line_pointer;
5809   while (ISALNUM (*input_line_pointer)
5810 #ifdef REGISTER_PREFIX
5811          || *input_line_pointer == REGISTER_PREFIX
5812 #endif
5813          || *input_line_pointer == '/'
5814          || *input_line_pointer == '-')
5815     ++input_line_pointer;
5816   c = *input_line_pointer;
5817   *input_line_pointer = '\0';
5818
5819   if (m68k_ip_op (s, &rop) != 0)
5820     {
5821       if (rop.error == NULL)
5822         as_bad (_("bad register list"));
5823       else
5824         as_bad (_("bad register list: %s"), rop.error);
5825       *input_line_pointer = c;
5826       ignore_rest_of_line ();
5827       return;
5828     }
5829
5830   *input_line_pointer = c;
5831
5832   if (rop.mode == REGLST)
5833     mask = rop.mask;
5834   else if (rop.mode == DREG)
5835     mask = 1 << (rop.reg - DATA0);
5836   else if (rop.mode == AREG)
5837     mask = 1 << (rop.reg - ADDR0 + 8);
5838   else if (rop.mode == FPREG)
5839     mask = 1 << (rop.reg - FP0 + 16);
5840   else if (rop.mode == CONTROL
5841            && rop.reg == FPI)
5842     mask = 1 << 24;
5843   else if (rop.mode == CONTROL
5844            && rop.reg == FPS)
5845     mask = 1 << 25;
5846   else if (rop.mode == CONTROL
5847            && rop.reg == FPC)
5848     mask = 1 << 26;
5849   else
5850     {
5851       as_bad (_("bad register list"));
5852       ignore_rest_of_line ();
5853       return;
5854     }
5855
5856   S_SET_SEGMENT (line_label, reg_section);
5857   S_SET_VALUE (line_label, ~mask);
5858   symbol_set_frag (line_label, &zero_address_frag);
5859
5860   if (flag_mri)
5861     mri_comment_end (stop, stopc);
5862
5863   demand_empty_rest_of_line ();
5864 }
5865
5866 /* This structure is used for the MRI SAVE and RESTORE pseudo-ops.  */
5867
5868 struct save_opts
5869 {
5870   struct save_opts *next;
5871   int abspcadd;
5872   int symbols_case_sensitive;
5873   int keep_locals;
5874   int short_refs;
5875   int architecture;
5876   const enum m68k_register *control_regs;
5877   int quick;
5878   int rel32;
5879   int listing;
5880   int no_warnings;
5881   /* FIXME: We don't save OPT S.  */
5882 };
5883
5884 /* This variable holds the stack of saved options.  */
5885
5886 static struct save_opts *save_stack;
5887
5888 /* The MRI SAVE pseudo-op.  */
5889
5890 static void
5891 s_save (int ignore ATTRIBUTE_UNUSED)
5892 {
5893   struct save_opts *s;
5894
5895   s = (struct save_opts *) xmalloc (sizeof (struct save_opts));
5896   s->abspcadd = m68k_abspcadd;
5897   s->symbols_case_sensitive = symbols_case_sensitive;
5898   s->keep_locals = flag_keep_locals;
5899   s->short_refs = flag_short_refs;
5900   s->architecture = current_architecture;
5901   s->control_regs = control_regs;
5902   s->quick = m68k_quick;
5903   s->rel32 = m68k_rel32;
5904   s->listing = listing;
5905   s->no_warnings = flag_no_warnings;
5906
5907   s->next = save_stack;
5908   save_stack = s;
5909
5910   demand_empty_rest_of_line ();
5911 }
5912
5913 /* The MRI RESTORE pseudo-op.  */
5914
5915 static void
5916 s_restore (int ignore ATTRIBUTE_UNUSED)
5917 {
5918   struct save_opts *s;
5919
5920   if (save_stack == NULL)
5921     {
5922       as_bad (_("restore without save"));
5923       ignore_rest_of_line ();
5924       return;
5925     }
5926
5927   s = save_stack;
5928   save_stack = s->next;
5929
5930   m68k_abspcadd = s->abspcadd;
5931   symbols_case_sensitive = s->symbols_case_sensitive;
5932   flag_keep_locals = s->keep_locals;
5933   flag_short_refs = s->short_refs;
5934   current_architecture = s->architecture;
5935   control_regs = s->control_regs;
5936   m68k_quick = s->quick;
5937   m68k_rel32 = s->rel32;
5938   listing = s->listing;
5939   flag_no_warnings = s->no_warnings;
5940
5941   free (s);
5942
5943   demand_empty_rest_of_line ();
5944 }
5945
5946 /* Types of MRI structured control directives.  */
5947
5948 enum mri_control_type
5949 {
5950   mri_for,
5951   mri_if,
5952   mri_repeat,
5953   mri_while
5954 };
5955
5956 /* This structure is used to stack the MRI structured control
5957    directives.  */
5958
5959 struct mri_control_info
5960 {
5961   /* The directive within which this one is enclosed.  */
5962   struct mri_control_info *outer;
5963
5964   /* The type of directive.  */
5965   enum mri_control_type type;
5966
5967   /* Whether an ELSE has been in an IF.  */
5968   int else_seen;
5969
5970   /* The add or sub statement at the end of a FOR.  */
5971   char *incr;
5972
5973   /* The label of the top of a FOR or REPEAT loop.  */
5974   char *top;
5975
5976   /* The label to jump to for the next iteration, or the else
5977      expression of a conditional.  */
5978   char *next;
5979
5980   /* The label to jump to to break out of the loop, or the label past
5981      the end of a conditional.  */
5982   char *bottom;
5983 };
5984
5985 /* The stack of MRI structured control directives.  */
5986
5987 static struct mri_control_info *mri_control_stack;
5988
5989 /* The current MRI structured control directive index number, used to
5990    generate label names.  */
5991
5992 static int mri_control_index;
5993
5994 /* Assemble an instruction for an MRI structured control directive.  */
5995
5996 static void
5997 mri_assemble (char *str)
5998 {
5999   char *s;
6000
6001   /* md_assemble expects the opcode to be in lower case.  */
6002   for (s = str; *s != ' ' && *s != '\0'; s++)
6003     *s = TOLOWER (*s);
6004
6005   md_assemble (str);
6006 }
6007
6008 /* Generate a new MRI label structured control directive label name.  */
6009
6010 static char *
6011 mri_control_label (void)
6012 {
6013   char *n;
6014
6015   n = (char *) xmalloc (20);
6016   sprintf (n, "%smc%d", FAKE_LABEL_NAME, mri_control_index);
6017   ++mri_control_index;
6018   return n;
6019 }
6020
6021 /* Create a new MRI structured control directive.  */
6022
6023 static struct mri_control_info *
6024 push_mri_control (enum mri_control_type type)
6025 {
6026   struct mri_control_info *n;
6027
6028   n = (struct mri_control_info *) xmalloc (sizeof (struct mri_control_info));
6029
6030   n->type = type;
6031   n->else_seen = 0;
6032   if (type == mri_if || type == mri_while)
6033     n->top = NULL;
6034   else
6035     n->top = mri_control_label ();
6036   n->next = mri_control_label ();
6037   n->bottom = mri_control_label ();
6038
6039   n->outer = mri_control_stack;
6040   mri_control_stack = n;
6041
6042   return n;
6043 }
6044
6045 /* Pop off the stack of MRI structured control directives.  */
6046
6047 static void
6048 pop_mri_control (void)
6049 {
6050   struct mri_control_info *n;
6051
6052   n = mri_control_stack;
6053   mri_control_stack = n->outer;
6054   if (n->top != NULL)
6055     free (n->top);
6056   free (n->next);
6057   free (n->bottom);
6058   free (n);
6059 }
6060
6061 /* Recognize a condition code in an MRI structured control expression.  */
6062
6063 static int
6064 parse_mri_condition (int *pcc)
6065 {
6066   char c1, c2;
6067
6068   know (*input_line_pointer == '<');
6069
6070   ++input_line_pointer;
6071   c1 = *input_line_pointer++;
6072   c2 = *input_line_pointer++;
6073
6074   if (*input_line_pointer != '>')
6075     {
6076       as_bad (_("syntax error in structured control directive"));
6077       return 0;
6078     }
6079
6080   ++input_line_pointer;
6081   SKIP_WHITESPACE ();
6082
6083   c1 = TOLOWER (c1);
6084   c2 = TOLOWER (c2);
6085
6086   *pcc = (c1 << 8) | c2;
6087
6088   return 1;
6089 }
6090
6091 /* Parse a single operand in an MRI structured control expression.  */
6092
6093 static int
6094 parse_mri_control_operand (int *pcc, char **leftstart, char **leftstop,
6095                            char **rightstart, char **rightstop)
6096 {
6097   char *s;
6098
6099   SKIP_WHITESPACE ();
6100
6101   *pcc = -1;
6102   *leftstart = NULL;
6103   *leftstop = NULL;
6104   *rightstart = NULL;
6105   *rightstop = NULL;
6106
6107   if (*input_line_pointer == '<')
6108     {
6109       /* It's just a condition code.  */
6110       return parse_mri_condition (pcc);
6111     }
6112
6113   /* Look ahead for the condition code.  */
6114   for (s = input_line_pointer; *s != '\0'; ++s)
6115     {
6116       if (*s == '<' && s[1] != '\0' && s[2] != '\0' && s[3] == '>')
6117         break;
6118     }
6119   if (*s == '\0')
6120     {
6121       as_bad (_("missing condition code in structured control directive"));
6122       return 0;
6123     }
6124
6125   *leftstart = input_line_pointer;
6126   *leftstop = s;
6127   if (*leftstop > *leftstart
6128       && ((*leftstop)[-1] == ' ' || (*leftstop)[-1] == '\t'))
6129     --*leftstop;
6130
6131   input_line_pointer = s;
6132   if (! parse_mri_condition (pcc))
6133     return 0;
6134
6135   /* Look ahead for AND or OR or end of line.  */
6136   for (s = input_line_pointer; *s != '\0'; ++s)
6137     {
6138       /* We must make sure we don't misinterpret AND/OR at the end of labels!
6139          if d0 <eq> #FOOAND and d1 <ne> #BAROR then
6140                         ^^^                 ^^ */
6141       if ((s == input_line_pointer
6142            || *(s-1) == ' '
6143            || *(s-1) == '\t')
6144           && ((strncasecmp (s, "AND", 3) == 0
6145                && (s[3] == '.' || ! is_part_of_name (s[3])))
6146               || (strncasecmp (s, "OR", 2) == 0
6147                   && (s[2] == '.' || ! is_part_of_name (s[2])))))
6148         break;
6149     }
6150
6151   *rightstart = input_line_pointer;
6152   *rightstop = s;
6153   if (*rightstop > *rightstart
6154       && ((*rightstop)[-1] == ' ' || (*rightstop)[-1] == '\t'))
6155     --*rightstop;
6156
6157   input_line_pointer = s;
6158
6159   return 1;
6160 }
6161
6162 #define MCC(b1, b2) (((b1) << 8) | (b2))
6163
6164 /* Swap the sense of a condition.  This changes the condition so that
6165    it generates the same result when the operands are swapped.  */
6166
6167 static int
6168 swap_mri_condition (int cc)
6169 {
6170   switch (cc)
6171     {
6172     case MCC ('h', 'i'): return MCC ('c', 's');
6173     case MCC ('l', 's'): return MCC ('c', 'c');
6174     /* <HS> is an alias for <CC>.  */
6175     case MCC ('h', 's'):
6176     case MCC ('c', 'c'): return MCC ('l', 's');
6177     /* <LO> is an alias for <CS>.  */
6178     case MCC ('l', 'o'):
6179     case MCC ('c', 's'): return MCC ('h', 'i');
6180     case MCC ('p', 'l'): return MCC ('m', 'i');
6181     case MCC ('m', 'i'): return MCC ('p', 'l');
6182     case MCC ('g', 'e'): return MCC ('l', 'e');
6183     case MCC ('l', 't'): return MCC ('g', 't');
6184     case MCC ('g', 't'): return MCC ('l', 't');
6185     case MCC ('l', 'e'): return MCC ('g', 'e');
6186     /* Issue a warning for conditions we can not swap.  */
6187     case MCC ('n', 'e'): return MCC ('n', 'e'); // no problem here
6188     case MCC ('e', 'q'): return MCC ('e', 'q'); // also no problem
6189     case MCC ('v', 'c'):
6190     case MCC ('v', 's'):
6191     default :
6192            as_warn (_("Condition <%c%c> in structured control directive can not be encoded correctly"),
6193                          (char) (cc >> 8), (char) (cc));
6194       break;
6195     }
6196   return cc;
6197 }
6198
6199 /* Reverse the sense of a condition.  */
6200
6201 static int
6202 reverse_mri_condition (int cc)
6203 {
6204   switch (cc)
6205     {
6206     case MCC ('h', 'i'): return MCC ('l', 's');
6207     case MCC ('l', 's'): return MCC ('h', 'i');
6208     /* <HS> is an alias for <CC> */
6209     case MCC ('h', 's'): return MCC ('l', 'o');
6210     case MCC ('c', 'c'): return MCC ('c', 's');
6211     /* <LO> is an alias for <CS> */
6212     case MCC ('l', 'o'): return MCC ('h', 's');
6213     case MCC ('c', 's'): return MCC ('c', 'c');
6214     case MCC ('n', 'e'): return MCC ('e', 'q');
6215     case MCC ('e', 'q'): return MCC ('n', 'e');
6216     case MCC ('v', 'c'): return MCC ('v', 's');
6217     case MCC ('v', 's'): return MCC ('v', 'c');
6218     case MCC ('p', 'l'): return MCC ('m', 'i');
6219     case MCC ('m', 'i'): return MCC ('p', 'l');
6220     case MCC ('g', 'e'): return MCC ('l', 't');
6221     case MCC ('l', 't'): return MCC ('g', 'e');
6222     case MCC ('g', 't'): return MCC ('l', 'e');
6223     case MCC ('l', 'e'): return MCC ('g', 't');
6224     }
6225   return cc;
6226 }
6227
6228 /* Build an MRI structured control expression.  This generates test
6229    and branch instructions.  It goes to TRUELAB if the condition is
6230    true, and to FALSELAB if the condition is false.  Exactly one of
6231    TRUELAB and FALSELAB will be NULL, meaning to fall through.  QUAL
6232    is the size qualifier for the expression.  EXTENT is the size to
6233    use for the branch.  */
6234
6235 static void
6236 build_mri_control_operand (int qual, int cc, char *leftstart, char *leftstop,
6237                            char *rightstart, char *rightstop,
6238                            const char *truelab, const char *falselab,
6239                            int extent)
6240 {
6241   char *buf;
6242   char *s;
6243
6244   if (leftstart != NULL)
6245     {
6246       struct m68k_op leftop, rightop;
6247       char c;
6248
6249       /* Swap the compare operands, if necessary, to produce a legal
6250          m68k compare instruction.  Comparing a register operand with
6251          a non-register operand requires the register to be on the
6252          right (cmp, cmpa).  Comparing an immediate value with
6253          anything requires the immediate value to be on the left
6254          (cmpi).  */
6255
6256       c = *leftstop;
6257       *leftstop = '\0';
6258       (void) m68k_ip_op (leftstart, &leftop);
6259       *leftstop = c;
6260
6261       c = *rightstop;
6262       *rightstop = '\0';
6263       (void) m68k_ip_op (rightstart, &rightop);
6264       *rightstop = c;
6265
6266       if (rightop.mode == IMMED
6267           || ((leftop.mode == DREG || leftop.mode == AREG)
6268               && (rightop.mode != DREG && rightop.mode != AREG)))
6269         {
6270           char *temp;
6271
6272           /* Correct conditional handling:
6273              if #1 <lt> d0 then  ;means if (1 < d0)
6274                 ...
6275              endi
6276
6277              should assemble to:
6278
6279                 cmp #1,d0        if we do *not* swap the operands
6280                 bgt true         we need the swapped condition!
6281                 ble false
6282              true:
6283                 ...
6284              false:
6285           */
6286           temp = leftstart;
6287           leftstart = rightstart;
6288           rightstart = temp;
6289           temp = leftstop;
6290           leftstop = rightstop;
6291           rightstop = temp;
6292         }
6293       else
6294         {
6295           cc = swap_mri_condition (cc);
6296         }
6297     }
6298
6299   if (truelab == NULL)
6300     {
6301       cc = reverse_mri_condition (cc);
6302       truelab = falselab;
6303     }
6304
6305   if (leftstart != NULL)
6306     {
6307       buf = (char *) xmalloc (20
6308                               + (leftstop - leftstart)
6309                               + (rightstop - rightstart));
6310       s = buf;
6311       *s++ = 'c';
6312       *s++ = 'm';
6313       *s++ = 'p';
6314       if (qual != '\0')
6315         *s++ = TOLOWER (qual);
6316       *s++ = ' ';
6317       memcpy (s, leftstart, leftstop - leftstart);
6318       s += leftstop - leftstart;
6319       *s++ = ',';
6320       memcpy (s, rightstart, rightstop - rightstart);
6321       s += rightstop - rightstart;
6322       *s = '\0';
6323       mri_assemble (buf);
6324       free (buf);
6325     }
6326
6327   buf = (char *) xmalloc (20 + strlen (truelab));
6328   s = buf;
6329   *s++ = 'b';
6330   *s++ = cc >> 8;
6331   *s++ = cc & 0xff;
6332   if (extent != '\0')
6333     *s++ = TOLOWER (extent);
6334   *s++ = ' ';
6335   strcpy (s, truelab);
6336   mri_assemble (buf);
6337   free (buf);
6338 }
6339
6340 /* Parse an MRI structured control expression.  This generates test
6341    and branch instructions.  STOP is where the expression ends.  It
6342    goes to TRUELAB if the condition is true, and to FALSELAB if the
6343    condition is false.  Exactly one of TRUELAB and FALSELAB will be
6344    NULL, meaning to fall through.  QUAL is the size qualifier for the
6345    expression.  EXTENT is the size to use for the branch.  */
6346
6347 static void
6348 parse_mri_control_expression (char *stop, int qual, const char *truelab,
6349                               const char *falselab, int extent)
6350 {
6351   int c;
6352   int cc;
6353   char *leftstart;
6354   char *leftstop;
6355   char *rightstart;
6356   char *rightstop;
6357
6358   c = *stop;
6359   *stop = '\0';
6360
6361   if (! parse_mri_control_operand (&cc, &leftstart, &leftstop,
6362                                    &rightstart, &rightstop))
6363     {
6364       *stop = c;
6365       return;
6366     }
6367
6368   if (strncasecmp (input_line_pointer, "AND", 3) == 0)
6369     {
6370       const char *flab;
6371
6372       if (falselab != NULL)
6373         flab = falselab;
6374       else
6375         flab = mri_control_label ();
6376
6377       build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart,
6378                                  rightstop, (const char *) NULL, flab, extent);
6379
6380       input_line_pointer += 3;
6381       if (*input_line_pointer != '.'
6382           || input_line_pointer[1] == '\0')
6383         qual = '\0';
6384       else
6385         {
6386           qual = input_line_pointer[1];
6387           input_line_pointer += 2;
6388         }
6389
6390       if (! parse_mri_control_operand (&cc, &leftstart, &leftstop,
6391                                        &rightstart, &rightstop))
6392         {
6393           *stop = c;
6394           return;
6395         }
6396
6397       build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart,
6398                                  rightstop, truelab, falselab, extent);
6399
6400       if (falselab == NULL)
6401         colon (flab);
6402     }
6403   else if (strncasecmp (input_line_pointer, "OR", 2) == 0)
6404     {
6405       const char *tlab;
6406
6407       if (truelab != NULL)
6408         tlab = truelab;
6409       else
6410         tlab = mri_control_label ();
6411
6412       build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart,
6413                                  rightstop, tlab, (const char *) NULL, extent);
6414
6415       input_line_pointer += 2;
6416       if (*input_line_pointer != '.'
6417           || input_line_pointer[1] == '\0')
6418         qual = '\0';
6419       else
6420         {
6421           qual = input_line_pointer[1];
6422           input_line_pointer += 2;
6423         }
6424
6425       if (! parse_mri_control_operand (&cc, &leftstart, &leftstop,
6426                                        &rightstart, &rightstop))
6427         {
6428           *stop = c;
6429           return;
6430         }
6431
6432       build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart,
6433                                  rightstop, truelab, falselab, extent);
6434
6435       if (truelab == NULL)
6436         colon (tlab);
6437     }
6438   else
6439     {
6440       build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart,
6441                                  rightstop, truelab, falselab, extent);
6442     }
6443
6444   *stop = c;
6445   if (input_line_pointer != stop)
6446     as_bad (_("syntax error in structured control directive"));
6447 }
6448
6449 /* Handle the MRI IF pseudo-op.  This may be a structured control
6450    directive, or it may be a regular assembler conditional, depending
6451    on its operands.  */
6452
6453 static void
6454 s_mri_if (int qual)
6455 {
6456   char *s;
6457   int c;
6458   struct mri_control_info *n;
6459
6460   /* A structured control directive must end with THEN with an
6461      optional qualifier.  */
6462   s = input_line_pointer;
6463   /* We only accept '*' as introduction of comments if preceded by white space
6464      or at first column of a line (I think this can't actually happen here?)
6465      This is important when assembling:
6466        if d0 <ne> 12(a0,d0*2) then
6467        if d0 <ne> #CONST*20   then.  */
6468   while (! (is_end_of_line[(unsigned char) *s]
6469             || (flag_mri
6470                 && *s == '*'
6471                 && (s == input_line_pointer
6472                     || *(s-1) == ' '
6473                     || *(s-1) == '\t'))))
6474     ++s;
6475   --s;
6476   while (s > input_line_pointer && (*s == ' ' || *s == '\t'))
6477     --s;
6478
6479   if (s - input_line_pointer > 1
6480       && s[-1] == '.')
6481     s -= 2;
6482
6483   if (s - input_line_pointer < 3
6484       || strncasecmp (s - 3, "THEN", 4) != 0)
6485     {
6486       if (qual != '\0')
6487         {
6488           as_bad (_("missing then"));
6489           ignore_rest_of_line ();
6490           return;
6491         }
6492
6493       /* It's a conditional.  */
6494       s_if (O_ne);
6495       return;
6496     }
6497
6498   /* Since this might be a conditional if, this pseudo-op will be
6499      called even if we are supported to be ignoring input.  Double
6500      check now.  Clobber *input_line_pointer so that ignore_input
6501      thinks that this is not a special pseudo-op.  */
6502   c = *input_line_pointer;
6503   *input_line_pointer = 0;
6504   if (ignore_input ())
6505     {
6506       *input_line_pointer = c;
6507       while (! is_end_of_line[(unsigned char) *input_line_pointer])
6508         ++input_line_pointer;
6509       demand_empty_rest_of_line ();
6510       return;
6511     }
6512   *input_line_pointer = c;
6513
6514   n = push_mri_control (mri_if);
6515
6516   parse_mri_control_expression (s - 3, qual, (const char *) NULL,
6517                                 n->next, s[1] == '.' ? s[2] : '\0');
6518
6519   if (s[1] == '.')
6520     input_line_pointer = s + 3;
6521   else
6522     input_line_pointer = s + 1;
6523
6524   if (flag_mri)
6525     {
6526       while (! is_end_of_line[(unsigned char) *input_line_pointer])
6527         ++input_line_pointer;
6528     }
6529
6530   demand_empty_rest_of_line ();
6531 }
6532
6533 /* Handle the MRI else pseudo-op.  If we are currently doing an MRI
6534    structured IF, associate the ELSE with the IF.  Otherwise, assume
6535    it is a conditional else.  */
6536
6537 static void
6538 s_mri_else (int qual)
6539 {
6540   int c;
6541   char *buf;
6542   char q[2];
6543
6544   if (qual == '\0'
6545       && (mri_control_stack == NULL
6546           || mri_control_stack->type != mri_if
6547           || mri_control_stack->else_seen))
6548     {
6549       s_else (0);
6550       return;
6551     }
6552
6553   c = *input_line_pointer;
6554   *input_line_pointer = 0;
6555   if (ignore_input ())
6556     {
6557       *input_line_pointer = c;
6558       while (! is_end_of_line[(unsigned char) *input_line_pointer])
6559         ++input_line_pointer;
6560       demand_empty_rest_of_line ();
6561       return;
6562     }
6563   *input_line_pointer = c;
6564
6565   if (mri_control_stack == NULL
6566       || mri_control_stack->type != mri_if
6567       || mri_control_stack->else_seen)
6568     {
6569       as_bad (_("else without matching if"));
6570       ignore_rest_of_line ();
6571       return;
6572     }
6573
6574   mri_control_stack->else_seen = 1;
6575
6576   buf = (char *) xmalloc (20 + strlen (mri_control_stack->bottom));
6577   q[0] = TOLOWER (qual);
6578   q[1] = '\0';
6579   sprintf (buf, "bra%s %s", q, mri_control_stack->bottom);
6580   mri_assemble (buf);
6581   free (buf);
6582
6583   colon (mri_control_stack->next);
6584
6585   if (flag_mri)
6586     {
6587       while (! is_end_of_line[(unsigned char) *input_line_pointer])
6588         ++input_line_pointer;
6589     }
6590
6591   demand_empty_rest_of_line ();
6592 }
6593
6594 /* Handle the MRI ENDI pseudo-op.  */
6595
6596 static void
6597 s_mri_endi (int ignore ATTRIBUTE_UNUSED)
6598 {
6599   if (mri_control_stack == NULL
6600       || mri_control_stack->type != mri_if)
6601     {
6602       as_bad (_("endi without matching if"));
6603       ignore_rest_of_line ();
6604       return;
6605     }
6606
6607   /* ignore_input will not return true for ENDI, so we don't need to
6608      worry about checking it again here.  */
6609
6610   if (! mri_control_stack->else_seen)
6611     colon (mri_control_stack->next);
6612   colon (mri_control_stack->bottom);
6613
6614   pop_mri_control ();
6615
6616   if (flag_mri)
6617     {
6618       while (! is_end_of_line[(unsigned char) *input_line_pointer])
6619         ++input_line_pointer;
6620     }
6621
6622   demand_empty_rest_of_line ();
6623 }
6624
6625 /* Handle the MRI BREAK pseudo-op.  */
6626
6627 static void
6628 s_mri_break (int extent)
6629 {
6630   struct mri_control_info *n;
6631   char *buf;
6632   char ex[2];
6633
6634   n = mri_control_stack;
6635   while (n != NULL
6636          && n->type != mri_for
6637          && n->type != mri_repeat
6638          && n->type != mri_while)
6639     n = n->outer;
6640   if (n == NULL)
6641     {
6642       as_bad (_("break outside of structured loop"));
6643       ignore_rest_of_line ();
6644       return;
6645     }
6646
6647   buf = (char *) xmalloc (20 + strlen (n->bottom));
6648   ex[0] = TOLOWER (extent);
6649   ex[1] = '\0';
6650   sprintf (buf, "bra%s %s", ex, n->bottom);
6651   mri_assemble (buf);
6652   free (buf);
6653
6654   if (flag_mri)
6655     {
6656       while (! is_end_of_line[(unsigned char) *input_line_pointer])
6657         ++input_line_pointer;
6658     }
6659
6660   demand_empty_rest_of_line ();
6661 }
6662
6663 /* Handle the MRI NEXT pseudo-op.  */
6664
6665 static void
6666 s_mri_next (int extent)
6667 {
6668   struct mri_control_info *n;
6669   char *buf;
6670   char ex[2];
6671
6672   n = mri_control_stack;
6673   while (n != NULL
6674          && n->type != mri_for
6675          && n->type != mri_repeat
6676          && n->type != mri_while)
6677     n = n->outer;
6678   if (n == NULL)
6679     {
6680       as_bad (_("next outside of structured loop"));
6681       ignore_rest_of_line ();
6682       return;
6683     }
6684
6685   buf = (char *) xmalloc (20 + strlen (n->next));
6686   ex[0] = TOLOWER (extent);
6687   ex[1] = '\0';
6688   sprintf (buf, "bra%s %s", ex, n->next);
6689   mri_assemble (buf);
6690   free (buf);
6691
6692   if (flag_mri)
6693     {
6694       while (! is_end_of_line[(unsigned char) *input_line_pointer])
6695         ++input_line_pointer;
6696     }
6697
6698   demand_empty_rest_of_line ();
6699 }
6700
6701 /* Handle the MRI FOR pseudo-op.  */
6702
6703 static void
6704 s_mri_for (int qual)
6705 {
6706   const char *varstart, *varstop;
6707   const char *initstart, *initstop;
6708   const char *endstart, *endstop;
6709   const char *bystart, *bystop;
6710   int up;
6711   int by;
6712   int extent;
6713   struct mri_control_info *n;
6714   char *buf;
6715   char *s;
6716   char ex[2];
6717
6718   /* The syntax is
6719        FOR.q var = init { TO | DOWNTO } end [ BY by ] DO.e
6720      */
6721
6722   SKIP_WHITESPACE ();
6723   varstart = input_line_pointer;
6724
6725   /* Look for the '='.  */
6726   while (! is_end_of_line[(unsigned char) *input_line_pointer]
6727          && *input_line_pointer != '=')
6728     ++input_line_pointer;
6729   if (*input_line_pointer != '=')
6730     {
6731       as_bad (_("missing ="));
6732       ignore_rest_of_line ();
6733       return;
6734     }
6735
6736   varstop = input_line_pointer;
6737   if (varstop > varstart
6738       && (varstop[-1] == ' ' || varstop[-1] == '\t'))
6739     --varstop;
6740
6741   ++input_line_pointer;
6742
6743   initstart = input_line_pointer;
6744
6745   /* Look for TO or DOWNTO.  */
6746   up = 1;
6747   initstop = NULL;
6748   while (! is_end_of_line[(unsigned char) *input_line_pointer])
6749     {
6750       if (strncasecmp (input_line_pointer, "TO", 2) == 0
6751           && ! is_part_of_name (input_line_pointer[2]))
6752         {
6753           initstop = input_line_pointer;
6754           input_line_pointer += 2;
6755           break;
6756         }
6757       if (strncasecmp (input_line_pointer, "DOWNTO", 6) == 0
6758           && ! is_part_of_name (input_line_pointer[6]))
6759         {
6760           initstop = input_line_pointer;
6761           up = 0;
6762           input_line_pointer += 6;
6763           break;
6764         }
6765       ++input_line_pointer;
6766     }
6767   if (initstop == NULL)
6768     {
6769       as_bad (_("missing to or downto"));
6770       ignore_rest_of_line ();
6771       return;
6772     }
6773   if (initstop > initstart
6774       && (initstop[-1] == ' ' || initstop[-1] == '\t'))
6775     --initstop;
6776
6777   SKIP_WHITESPACE ();
6778   endstart = input_line_pointer;
6779
6780   /* Look for BY or DO.  */
6781   by = 0;
6782   endstop = NULL;
6783   while (! is_end_of_line[(unsigned char) *input_line_pointer])
6784     {
6785       if (strncasecmp (input_line_pointer, "BY", 2) == 0
6786           && ! is_part_of_name (input_line_pointer[2]))
6787         {
6788           endstop = input_line_pointer;
6789           by = 1;
6790           input_line_pointer += 2;
6791           break;
6792         }
6793       if (strncasecmp (input_line_pointer, "DO", 2) == 0
6794           && (input_line_pointer[2] == '.'
6795               || ! is_part_of_name (input_line_pointer[2])))
6796         {
6797           endstop = input_line_pointer;
6798           input_line_pointer += 2;
6799           break;
6800         }
6801       ++input_line_pointer;
6802     }
6803   if (endstop == NULL)
6804     {
6805       as_bad (_("missing do"));
6806       ignore_rest_of_line ();
6807       return;
6808     }
6809   if (endstop > endstart
6810       && (endstop[-1] == ' ' || endstop[-1] == '\t'))
6811     --endstop;
6812
6813   if (! by)
6814     {
6815       bystart = "#1";
6816       bystop = bystart + 2;
6817     }
6818   else
6819     {
6820       SKIP_WHITESPACE ();
6821       bystart = input_line_pointer;
6822
6823       /* Look for DO.  */
6824       bystop = NULL;
6825       while (! is_end_of_line[(unsigned char) *input_line_pointer])
6826         {
6827           if (strncasecmp (input_line_pointer, "DO", 2) == 0
6828               && (input_line_pointer[2] == '.'
6829                   || ! is_part_of_name (input_line_pointer[2])))
6830             {
6831               bystop = input_line_pointer;
6832               input_line_pointer += 2;
6833               break;
6834             }
6835           ++input_line_pointer;
6836         }
6837       if (bystop == NULL)
6838         {
6839           as_bad (_("missing do"));
6840           ignore_rest_of_line ();
6841           return;
6842         }
6843       if (bystop > bystart
6844           && (bystop[-1] == ' ' || bystop[-1] == '\t'))
6845         --bystop;
6846     }
6847
6848   if (*input_line_pointer != '.')
6849     extent = '\0';
6850   else
6851     {
6852       extent = input_line_pointer[1];
6853       input_line_pointer += 2;
6854     }
6855
6856   /* We have fully parsed the FOR operands.  Now build the loop.  */
6857   n = push_mri_control (mri_for);
6858
6859   buf = (char *) xmalloc (50 + (input_line_pointer - varstart));
6860
6861   /* Move init,var.  */
6862   s = buf;
6863   *s++ = 'm';
6864   *s++ = 'o';
6865   *s++ = 'v';
6866   *s++ = 'e';
6867   if (qual != '\0')
6868     *s++ = TOLOWER (qual);
6869   *s++ = ' ';
6870   memcpy (s, initstart, initstop - initstart);
6871   s += initstop - initstart;
6872   *s++ = ',';
6873   memcpy (s, varstart, varstop - varstart);
6874   s += varstop - varstart;
6875   *s = '\0';
6876   mri_assemble (buf);
6877
6878   colon (n->top);
6879
6880   /* cmp end,var.  */
6881   s = buf;
6882   *s++ = 'c';
6883   *s++ = 'm';
6884   *s++ = 'p';
6885   if (qual != '\0')
6886     *s++ = TOLOWER (qual);
6887   *s++ = ' ';
6888   memcpy (s, endstart, endstop - endstart);
6889   s += endstop - endstart;
6890   *s++ = ',';
6891   memcpy (s, varstart, varstop - varstart);
6892   s += varstop - varstart;
6893   *s = '\0';
6894   mri_assemble (buf);
6895
6896   /* bcc bottom.  */
6897   ex[0] = TOLOWER (extent);
6898   ex[1] = '\0';
6899   if (up)
6900     sprintf (buf, "blt%s %s", ex, n->bottom);
6901   else
6902     sprintf (buf, "bgt%s %s", ex, n->bottom);
6903   mri_assemble (buf);
6904
6905   /* Put together the add or sub instruction used by ENDF.  */
6906   s = buf;
6907   if (up)
6908     strcpy (s, "add");
6909   else
6910     strcpy (s, "sub");
6911   s += 3;
6912   if (qual != '\0')
6913     *s++ = TOLOWER (qual);
6914   *s++ = ' ';
6915   memcpy (s, bystart, bystop - bystart);
6916   s += bystop - bystart;
6917   *s++ = ',';
6918   memcpy (s, varstart, varstop - varstart);
6919   s += varstop - varstart;
6920   *s = '\0';
6921   n->incr = buf;
6922
6923   if (flag_mri)
6924     {
6925       while (! is_end_of_line[(unsigned char) *input_line_pointer])
6926         ++input_line_pointer;
6927     }
6928
6929   demand_empty_rest_of_line ();
6930 }
6931
6932 /* Handle the MRI ENDF pseudo-op.  */
6933
6934 static void
6935 s_mri_endf (int ignore ATTRIBUTE_UNUSED)
6936 {
6937   if (mri_control_stack == NULL
6938       || mri_control_stack->type != mri_for)
6939     {
6940       as_bad (_("endf without for"));
6941       ignore_rest_of_line ();
6942       return;
6943     }
6944
6945   colon (mri_control_stack->next);
6946
6947   mri_assemble (mri_control_stack->incr);
6948
6949   sprintf (mri_control_stack->incr, "bra %s", mri_control_stack->top);
6950   mri_assemble (mri_control_stack->incr);
6951
6952   free (mri_control_stack->incr);
6953
6954   colon (mri_control_stack->bottom);
6955
6956   pop_mri_control ();
6957
6958   if (flag_mri)
6959     {
6960       while (! is_end_of_line[(unsigned char) *input_line_pointer])
6961         ++input_line_pointer;
6962     }
6963
6964   demand_empty_rest_of_line ();
6965 }
6966
6967 /* Handle the MRI REPEAT pseudo-op.  */
6968
6969 static void
6970 s_mri_repeat (int ignore ATTRIBUTE_UNUSED)
6971 {
6972   struct mri_control_info *n;
6973
6974   n = push_mri_control (mri_repeat);
6975   colon (n->top);
6976   if (flag_mri)
6977     {
6978       while (! is_end_of_line[(unsigned char) *input_line_pointer])
6979         ++input_line_pointer;
6980     }
6981   demand_empty_rest_of_line ();
6982 }
6983
6984 /* Handle the MRI UNTIL pseudo-op.  */
6985
6986 static void
6987 s_mri_until (int qual)
6988 {
6989   char *s;
6990
6991   if (mri_control_stack == NULL
6992       || mri_control_stack->type != mri_repeat)
6993     {
6994       as_bad (_("until without repeat"));
6995       ignore_rest_of_line ();
6996       return;
6997     }
6998
6999   colon (mri_control_stack->next);
7000
7001   for (s = input_line_pointer; ! is_end_of_line[(unsigned char) *s]; s++)
7002     ;
7003
7004   parse_mri_control_expression (s, qual, (const char *) NULL,
7005                                 mri_control_stack->top, '\0');
7006
7007   colon (mri_control_stack->bottom);
7008
7009   input_line_pointer = s;
7010
7011   pop_mri_control ();
7012
7013   if (flag_mri)
7014     {
7015       while (! is_end_of_line[(unsigned char) *input_line_pointer])
7016         ++input_line_pointer;
7017     }
7018
7019   demand_empty_rest_of_line ();
7020 }
7021
7022 /* Handle the MRI WHILE pseudo-op.  */
7023
7024 static void
7025 s_mri_while (int qual)
7026 {
7027   char *s;
7028
7029   struct mri_control_info *n;
7030
7031   s = input_line_pointer;
7032   /* We only accept '*' as introduction of comments if preceded by white space
7033      or at first column of a line (I think this can't actually happen here?)
7034      This is important when assembling:
7035        while d0 <ne> 12(a0,d0*2) do
7036        while d0 <ne> #CONST*20   do.  */
7037   while (! (is_end_of_line[(unsigned char) *s]
7038             || (flag_mri
7039                 && *s == '*'
7040                 && (s == input_line_pointer
7041                     || *(s-1) == ' '
7042                     || *(s-1) == '\t'))))
7043     s++;
7044   --s;
7045   while (*s == ' ' || *s == '\t')
7046     --s;
7047   if (s - input_line_pointer > 1
7048       && s[-1] == '.')
7049     s -= 2;
7050   if (s - input_line_pointer < 2
7051       || strncasecmp (s - 1, "DO", 2) != 0)
7052     {
7053       as_bad (_("missing do"));
7054       ignore_rest_of_line ();
7055       return;
7056     }
7057
7058   n = push_mri_control (mri_while);
7059
7060   colon (n->next);
7061
7062   parse_mri_control_expression (s - 1, qual, (const char *) NULL, n->bottom,
7063                                 s[1] == '.' ? s[2] : '\0');
7064
7065   input_line_pointer = s + 1;
7066   if (*input_line_pointer == '.')
7067     input_line_pointer += 2;
7068
7069   if (flag_mri)
7070     {
7071       while (! is_end_of_line[(unsigned char) *input_line_pointer])
7072         ++input_line_pointer;
7073     }
7074
7075   demand_empty_rest_of_line ();
7076 }
7077
7078 /* Handle the MRI ENDW pseudo-op.  */
7079
7080 static void
7081 s_mri_endw (int ignore ATTRIBUTE_UNUSED)
7082 {
7083   char *buf;
7084
7085   if (mri_control_stack == NULL
7086       || mri_control_stack->type != mri_while)
7087     {
7088       as_bad (_("endw without while"));
7089       ignore_rest_of_line ();
7090       return;
7091     }
7092
7093   buf = (char *) xmalloc (20 + strlen (mri_control_stack->next));
7094   sprintf (buf, "bra %s", mri_control_stack->next);
7095   mri_assemble (buf);
7096   free (buf);
7097
7098   colon (mri_control_stack->bottom);
7099
7100   pop_mri_control ();
7101
7102   if (flag_mri)
7103     {
7104       while (! is_end_of_line[(unsigned char) *input_line_pointer])
7105         ++input_line_pointer;
7106     }
7107
7108   demand_empty_rest_of_line ();
7109 }
7110 \f
7111 /* Parse a .cpu directive.  */
7112
7113 static void
7114 s_m68k_cpu (int ignored ATTRIBUTE_UNUSED)
7115 {
7116   char saved_char;
7117   char *name;
7118
7119   if (initialized)
7120     {
7121       as_bad (_("already assembled instructions"));
7122       ignore_rest_of_line ();
7123       return;
7124     }
7125   
7126   name = input_line_pointer;
7127   while (*input_line_pointer && !ISSPACE(*input_line_pointer))
7128     input_line_pointer++;
7129   saved_char = *input_line_pointer;
7130   *input_line_pointer = 0;
7131
7132   m68k_set_cpu (name, 1, 0);
7133   
7134   *input_line_pointer = saved_char;
7135   demand_empty_rest_of_line ();
7136   return;
7137 }
7138
7139 /* Parse a .arch directive.  */
7140
7141 static void
7142 s_m68k_arch (int ignored ATTRIBUTE_UNUSED)
7143 {
7144   char saved_char;
7145   char *name;
7146
7147   if (initialized)
7148     {
7149       as_bad (_("already assembled instructions"));
7150       ignore_rest_of_line ();
7151       return;
7152     }
7153   
7154   name = input_line_pointer;
7155   while (*input_line_pointer && *input_line_pointer != ','
7156          && !ISSPACE (*input_line_pointer))
7157     input_line_pointer++;
7158   saved_char = *input_line_pointer;
7159   *input_line_pointer = 0;
7160
7161   if (m68k_set_arch (name, 1, 0))
7162     {
7163       /* Scan extensions. */
7164       do
7165         {
7166           *input_line_pointer++ = saved_char;
7167           if (!*input_line_pointer || ISSPACE (*input_line_pointer))
7168             break;
7169           name = input_line_pointer;
7170           while (*input_line_pointer && *input_line_pointer != ','
7171                  && !ISSPACE (*input_line_pointer))
7172             input_line_pointer++;
7173           saved_char = *input_line_pointer;
7174           *input_line_pointer = 0;
7175         }
7176       while (m68k_set_extension (name, 1, 0));
7177     }
7178   
7179   *input_line_pointer = saved_char;
7180   demand_empty_rest_of_line ();
7181   return;
7182 }
7183 \f
7184 /* Lookup a cpu name in TABLE and return the slot found.  Return NULL
7185    if none is found, the caller is responsible for emitting an error
7186    message.  If ALLOW_M is non-zero, we allow an initial 'm' on the
7187    cpu name, if it begins with a '6' (possibly skipping an intervening
7188    'c'.  We also allow a 'c' in the same place.  if NEGATED is
7189    non-zero, we accept a leading 'no-' and *NEGATED is set to true, if
7190    the option is indeed negated.  */
7191
7192 static const struct m68k_cpu *
7193 m68k_lookup_cpu (const char *arg, const struct m68k_cpu *table,
7194                  int allow_m, int *negated)
7195 {
7196   /* allow negated value? */
7197   if (negated)
7198     {
7199       *negated = 0;
7200
7201       if (arg[0] == 'n' && arg[1] == 'o' && arg[2] == '-')
7202         {
7203           arg += 3;
7204           *negated = 1;
7205         }
7206     }
7207   
7208   /* Remove 'm' or 'mc' prefix from 68k variants.  */
7209   if (allow_m)
7210     {
7211       if (arg[0] == 'm')
7212         {
7213           if (arg[1] == '6')
7214             arg += 1;
7215           else if (arg[1] == 'c'  && arg[2] == '6')
7216             arg += 2;
7217         }
7218     }
7219   else if (arg[0] == 'c' && arg[1] == '6')
7220     arg += 1;
7221
7222   for (; table->name; table++)
7223     if (!strcmp (arg, table->name))
7224       {
7225         if (table->alias < -1 || table->alias > 1)
7226           as_bad (_("`%s' is deprecated, use `%s'"),
7227                   table->name, table[table->alias < 0 ? 1 : -1].name);
7228         return table;
7229       }
7230   return 0;
7231 }
7232
7233 /* Set the cpu, issuing errors if it is unrecognized.  */
7234
7235 static int
7236 m68k_set_cpu (char const *name, int allow_m, int silent)
7237 {
7238   const struct m68k_cpu *cpu;
7239
7240   cpu = m68k_lookup_cpu (name, m68k_cpus, allow_m, NULL);
7241
7242   if (!cpu)
7243     {
7244       if (!silent)
7245         as_bad (_("cpu `%s' unrecognized"), name);
7246       return 0;
7247     }
7248   selected_cpu = cpu;
7249   return 1;
7250 }
7251
7252 /* Set the architecture, issuing errors if it is unrecognized.  */
7253
7254 static int
7255 m68k_set_arch (char const *name, int allow_m, int silent)
7256 {
7257   const struct m68k_cpu *arch;
7258
7259   arch = m68k_lookup_cpu (name, m68k_archs, allow_m, NULL);
7260
7261   if (!arch)
7262     {
7263       if (!silent)
7264         as_bad (_("architecture `%s' unrecognized"), name);
7265       return 0;
7266     }
7267   selected_arch = arch;
7268   return 1;
7269 }
7270
7271 /* Set the architecture extension, issuing errors if it is
7272    unrecognized, or invalid */
7273
7274 static int
7275 m68k_set_extension (char const *name, int allow_m, int silent)
7276 {
7277   int negated;
7278   const struct m68k_cpu *ext;
7279
7280   ext = m68k_lookup_cpu (name, m68k_extensions, allow_m, &negated);
7281
7282   if (!ext)
7283     {
7284       if (!silent)
7285         as_bad (_("extension `%s' unrecognized"), name);
7286       return 0;
7287     }
7288
7289   if (negated)
7290     not_current_architecture |= ext->arch;
7291   else
7292     current_architecture |= ext->arch;
7293   return 1;
7294 }
7295
7296 /* md_parse_option
7297    Invocation line includes a switch not recognized by the base assembler.
7298  */
7299
7300 #ifdef OBJ_ELF
7301 const char *md_shortopts = "lSA:m:kQ:V";
7302 #else
7303 const char *md_shortopts = "lSA:m:k";
7304 #endif
7305
7306 struct option md_longopts[] = {
7307 #define OPTION_PIC (OPTION_MD_BASE)
7308   {"pic", no_argument, NULL, OPTION_PIC},
7309 #define OPTION_REGISTER_PREFIX_OPTIONAL (OPTION_MD_BASE + 1)
7310   {"register-prefix-optional", no_argument, NULL,
7311      OPTION_REGISTER_PREFIX_OPTIONAL},
7312 #define OPTION_BITWISE_OR (OPTION_MD_BASE + 2)
7313   {"bitwise-or", no_argument, NULL, OPTION_BITWISE_OR},
7314 #define OPTION_BASE_SIZE_DEFAULT_16 (OPTION_MD_BASE + 3)
7315   {"base-size-default-16", no_argument, NULL, OPTION_BASE_SIZE_DEFAULT_16},
7316 #define OPTION_BASE_SIZE_DEFAULT_32 (OPTION_MD_BASE + 4)
7317   {"base-size-default-32", no_argument, NULL, OPTION_BASE_SIZE_DEFAULT_32},
7318 #define OPTION_DISP_SIZE_DEFAULT_16 (OPTION_MD_BASE + 5)
7319   {"disp-size-default-16", no_argument, NULL, OPTION_DISP_SIZE_DEFAULT_16},
7320 #define OPTION_DISP_SIZE_DEFAULT_32 (OPTION_MD_BASE + 6)
7321   {"disp-size-default-32", no_argument, NULL, OPTION_DISP_SIZE_DEFAULT_32},
7322 #define OPTION_PCREL (OPTION_MD_BASE + 7)
7323   {"pcrel", no_argument, NULL, OPTION_PCREL},
7324   {NULL, no_argument, NULL, 0}
7325 };
7326 size_t md_longopts_size = sizeof (md_longopts);
7327
7328 int
7329 md_parse_option (int c, char *arg)
7330 {
7331   switch (c)
7332     {
7333     case 'l':                   /* -l means keep external to 2 bit offset
7334                                    rather than 16 bit one.  */
7335       flag_short_refs = 1;
7336       break;
7337
7338     case 'S':                   /* -S means that jbsr's always turn into
7339                                    jsr's.  */
7340       flag_long_jumps = 1;
7341       break;
7342
7343     case OPTION_PCREL:          /* --pcrel means never turn PC-relative
7344                                    branches into absolute jumps.  */
7345       flag_keep_pcrel = 1;
7346       break;
7347
7348     case OPTION_PIC:
7349     case 'k':
7350       flag_want_pic = 1;
7351       break;                    /* -pic, Position Independent Code.  */
7352
7353     case OPTION_REGISTER_PREFIX_OPTIONAL:
7354       flag_reg_prefix_optional = 1;
7355       reg_prefix_optional_seen = 1;
7356       break;
7357
7358       /* -V: SVR4 argument to print version ID.  */
7359     case 'V':
7360       print_version_id ();
7361       break;
7362
7363       /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
7364          should be emitted or not.  FIXME: Not implemented.  */
7365     case 'Q':
7366       break;
7367
7368     case OPTION_BITWISE_OR:
7369       {
7370         char *n, *t;
7371         const char *s;
7372
7373         n = (char *) xmalloc (strlen (m68k_comment_chars) + 1);
7374         t = n;
7375         for (s = m68k_comment_chars; *s != '\0'; s++)
7376           if (*s != '|')
7377             *t++ = *s;
7378         *t = '\0';
7379         m68k_comment_chars = n;
7380       }
7381       break;
7382
7383     case OPTION_BASE_SIZE_DEFAULT_16:
7384       m68k_index_width_default = SIZE_WORD;
7385       break;
7386
7387     case OPTION_BASE_SIZE_DEFAULT_32:
7388       m68k_index_width_default = SIZE_LONG;
7389       break;
7390
7391     case OPTION_DISP_SIZE_DEFAULT_16:
7392       m68k_rel32 = 0;
7393       m68k_rel32_from_cmdline = 1;
7394       break;
7395
7396     case OPTION_DISP_SIZE_DEFAULT_32:
7397       m68k_rel32 = 1;
7398       m68k_rel32_from_cmdline = 1;
7399       break;
7400
7401     case 'A':
7402 #if WARN_DEPRECATED
7403       as_tsktsk (_ ("option `-A%s' is deprecated: use `-%s'",
7404                     arg, arg));
7405 #endif
7406       /* Intentional fall-through.  */
7407     case 'm':
7408       if (!strncmp (arg, "arch=", 5))
7409         m68k_set_arch (arg + 5, 1, 0);
7410       else if (!strncmp (arg, "cpu=", 4))
7411         m68k_set_cpu (arg + 4, 1, 0);
7412       else if (m68k_set_extension (arg, 0, 1))
7413         ;
7414       else if (m68k_set_arch (arg, 0, 1))
7415         ;
7416       else if (m68k_set_cpu (arg, 0, 1))
7417         ;
7418       else
7419         return 0;
7420       break;
7421
7422     default:
7423       return 0;
7424     }
7425
7426   return 1;
7427 }
7428
7429 /* Setup tables from the selected arch and/or cpu */
7430
7431 static void
7432 m68k_init_arch (void)
7433 {
7434   if (not_current_architecture & current_architecture)
7435     {
7436       as_bad (_("architecture features both enabled and disabled"));
7437       not_current_architecture &= ~current_architecture;
7438     }
7439   if (selected_arch)
7440     {
7441       current_architecture |= selected_arch->arch;
7442       control_regs = selected_arch->control_regs;
7443     }
7444   else
7445     current_architecture |= selected_cpu->arch;
7446   
7447   current_architecture &= ~not_current_architecture;
7448
7449   if ((current_architecture & (cfloat | m68881)) == (cfloat | m68881))
7450     {
7451       /* Determine which float is really meant.  */
7452       if (current_architecture & (m68k_mask & ~m68881))
7453         current_architecture ^= cfloat;
7454       else
7455         current_architecture ^= m68881;
7456     }
7457
7458   if (selected_cpu)
7459     {
7460       control_regs = selected_cpu->control_regs;
7461       if (current_architecture & ~selected_cpu->arch)
7462         {
7463           as_bad (_("selected processor does not have all features of selected architecture"));
7464           current_architecture
7465             = selected_cpu->arch & ~not_current_architecture;
7466         }
7467     }
7468
7469   if ((current_architecture & m68k_mask)
7470       && (current_architecture & ~m68k_mask))
7471     {
7472       as_bad (_ ("m68k and cf features both selected"));
7473       if (current_architecture & m68k_mask)
7474         current_architecture &= m68k_mask;
7475       else
7476         current_architecture &= ~m68k_mask;
7477     }
7478   
7479   /* Permit m68881 specification with all cpus; those that can't work
7480      with a coprocessor could be doing emulation.  */
7481   if (current_architecture & m68851)
7482     {
7483       if (current_architecture & m68040)
7484         as_warn (_("68040 and 68851 specified; mmu instructions may assemble incorrectly"));
7485     }
7486   /* What other incompatibilities could we check for?  */
7487
7488   if (cpu_of_arch (current_architecture) < m68020
7489       || arch_coldfire_p (current_architecture))
7490     md_relax_table[TAB (PCINDEX, BYTE)].rlx_more = 0;
7491   
7492   initialized = 1;
7493 }
7494
7495 void
7496 md_show_usage (FILE *stream)
7497 {
7498   const char *default_cpu = TARGET_CPU;
7499   int i;
7500   unsigned int default_arch;
7501
7502   /* Get the canonical name for the default target CPU.  */
7503   if (*default_cpu == 'm')
7504     default_cpu++;
7505   for (i = 0; m68k_cpus[i].name; i++)
7506     {
7507       if (strcasecmp (default_cpu, m68k_cpus[i].name) == 0)
7508         {
7509           default_arch = m68k_cpus[i].arch;
7510           while (m68k_cpus[i].alias > 0)
7511             i--;
7512           while (m68k_cpus[i].alias < 0)
7513             i++;
7514           default_cpu = m68k_cpus[i].name;
7515         }
7516     }
7517
7518   fprintf (stream, _("\
7519 -march=<arch>           set architecture\n\
7520 -mcpu=<cpu>             set cpu [default %s]\n\
7521 "), default_cpu);
7522   for (i = 0; m68k_extensions[i].name; i++)
7523     fprintf (stream, _("\
7524 -m[no-]%-16s enable/disable%s architecture extension\n\
7525 "), m68k_extensions[i].name,
7526              m68k_extensions[i].alias > 0 ? " ColdFire"
7527              : m68k_extensions[i].alias < 0 ? " m68k" : "");
7528   
7529   fprintf (stream, _("\
7530 -l                      use 1 word for refs to undefined symbols [default 2]\n\
7531 -pic, -k                generate position independent code\n\
7532 -S                      turn jbsr into jsr\n\
7533 --pcrel                 never turn PC-relative branches into absolute jumps\n\
7534 --register-prefix-optional\n\
7535                         recognize register names without prefix character\n\
7536 --bitwise-or            do not treat `|' as a comment character\n\
7537 --base-size-default-16  base reg without size is 16 bits\n\
7538 --base-size-default-32  base reg without size is 32 bits (default)\n\
7539 --disp-size-default-16  displacement with unknown size is 16 bits\n\
7540 --disp-size-default-32  displacement with unknown size is 32 bits (default)\n\
7541 "));
7542   
7543   fprintf (stream, _("Architecture variants are: "));
7544   for (i = 0; m68k_archs[i].name; i++)
7545     {
7546       if (i)
7547         fprintf (stream, " | ");
7548       fprintf (stream, m68k_archs[i].name);
7549     }
7550   fprintf (stream, "\n");
7551
7552   fprintf (stream, _("Processor variants are: "));
7553   for (i = 0; m68k_cpus[i].name; i++)
7554     {
7555       if (i)
7556         fprintf (stream, " | ");
7557       fprintf (stream, m68k_cpus[i].name);
7558     }
7559   fprintf (stream, _("\n"));
7560 }
7561 \f
7562 #ifdef TEST2
7563
7564 /* TEST2:  Test md_assemble() */
7565 /* Warning, this routine probably doesn't work anymore.  */
7566 int
7567 main (void)
7568 {
7569   struct m68k_it the_ins;
7570   char buf[120];
7571   char *cp;
7572   int n;
7573
7574   m68k_ip_begin ();
7575   for (;;)
7576     {
7577       if (!gets (buf) || !*buf)
7578         break;
7579       if (buf[0] == '|' || buf[1] == '.')
7580         continue;
7581       for (cp = buf; *cp; cp++)
7582         if (*cp == '\t')
7583           *cp = ' ';
7584       if (is_label (buf))
7585         continue;
7586       memset (&the_ins, '\0', sizeof (the_ins));
7587       m68k_ip (&the_ins, buf);
7588       if (the_ins.error)
7589         {
7590           printf (_("Error %s in %s\n"), the_ins.error, buf);
7591         }
7592       else
7593         {
7594           printf (_("Opcode(%d.%s): "), the_ins.numo, the_ins.args);
7595           for (n = 0; n < the_ins.numo; n++)
7596             printf (" 0x%x", the_ins.opcode[n] & 0xffff);
7597           printf ("    ");
7598           print_the_insn (&the_ins.opcode[0], stdout);
7599           (void) putchar ('\n');
7600         }
7601       for (n = 0; n < strlen (the_ins.args) / 2; n++)
7602         {
7603           if (the_ins.operands[n].error)
7604             {
7605               printf ("op%d Error %s in %s\n", n, the_ins.operands[n].error, buf);
7606               continue;
7607             }
7608           printf ("mode %d, reg %d, ", the_ins.operands[n].mode,
7609                   the_ins.operands[n].reg);
7610           if (the_ins.operands[n].b_const)
7611             printf ("Constant: '%.*s', ",
7612                     1 + the_ins.operands[n].e_const - the_ins.operands[n].b_const,
7613                     the_ins.operands[n].b_const);
7614           printf ("ireg %d, isiz %d, imul %d, ", the_ins.operands[n].ireg,
7615                   the_ins.operands[n].isiz, the_ins.operands[n].imul);
7616           if (the_ins.operands[n].b_iadd)
7617             printf ("Iadd: '%.*s',",
7618                     1 + the_ins.operands[n].e_iadd - the_ins.operands[n].b_iadd,
7619                     the_ins.operands[n].b_iadd);
7620           putchar ('\n');
7621         }
7622     }
7623   m68k_ip_end ();
7624   return 0;
7625 }
7626
7627 int
7628 is_label (char *str)
7629 {
7630   while (*str == ' ')
7631     str++;
7632   while (*str && *str != ' ')
7633     str++;
7634   if (str[-1] == ':' || str[1] == '=')
7635     return 1;
7636   return 0;
7637 }
7638
7639 #endif
7640
7641 /* Possible states for relaxation:
7642
7643    0 0  branch offset   byte    (bra, etc)
7644    0 1                  word
7645    0 2                  long
7646
7647    1 0  indexed offsets byte    a0@(32,d4:w:1) etc
7648    1 1                  word
7649    1 2                  long
7650
7651    2 0  two-offset index word-word a0@(32,d4)@(45) etc
7652    2 1                  word-long
7653    2 2                  long-word
7654    2 3                  long-long
7655
7656    */
7657
7658 /* We have no need to default values of symbols.  */
7659
7660 symbolS *
7661 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
7662 {
7663   return 0;
7664 }
7665
7666 /* Round up a section size to the appropriate boundary.  */
7667 valueT
7668 md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
7669 {
7670 #ifdef OBJ_AOUT
7671   /* For a.out, force the section size to be aligned.  If we don't do
7672      this, BFD will align it for us, but it will not write out the
7673      final bytes of the section.  This may be a bug in BFD, but it is
7674      easier to fix it here since that is how the other a.out targets
7675      work.  */
7676   int align;
7677
7678   align = bfd_get_section_alignment (stdoutput, segment);
7679   size = ((size + (1 << align) - 1) & ((valueT) -1 << align));
7680 #endif
7681
7682   return size;
7683 }
7684
7685 /* Exactly what point is a PC-relative offset relative TO?
7686    On the 68k, it is relative to the address of the first extension
7687    word.  The difference between the addresses of the offset and the
7688    first extension word is stored in fx_pcrel_adjust.  */
7689 long
7690 md_pcrel_from (fixS *fixP)
7691 {
7692   int adjust;
7693
7694   /* Because fx_pcrel_adjust is a char, and may be unsigned, we explicitly
7695      sign extend the value here.  */
7696   adjust = ((fixP->fx_pcrel_adjust & 0xff) ^ 0x80) - 0x80;
7697   if (adjust == 64)
7698     adjust = -1;
7699   return fixP->fx_where + fixP->fx_frag->fr_address - adjust;
7700 }
7701
7702 #ifdef OBJ_ELF
7703 void
7704 m68k_elf_final_processing (void)
7705 {
7706   unsigned flags = 0;
7707   
7708   if (arch_coldfire_fpu (current_architecture))
7709     flags |= EF_M68K_CFV4E;
7710   /* Set file-specific flags if this is a cpu32 processor.  */
7711   if (cpu_of_arch (current_architecture) & cpu32)
7712     flags |= EF_M68K_CPU32;
7713   else if (cpu_of_arch (current_architecture) & fido_a)
7714     flags |= EF_M68K_FIDO;
7715   else if ((cpu_of_arch (current_architecture) & m68000up)
7716            && !(cpu_of_arch (current_architecture) & m68020up))
7717     flags |= EF_M68K_M68000;
7718   
7719   if (current_architecture & mcfisa_a)
7720     {
7721       static const unsigned isa_features[][2] =
7722       {
7723         {EF_M68K_CF_ISA_A_NODIV,mcfisa_a},
7724         {EF_M68K_CF_ISA_A,      mcfisa_a|mcfhwdiv},
7725         {EF_M68K_CF_ISA_A_PLUS, mcfisa_a|mcfisa_aa|mcfhwdiv|mcfusp},
7726         {EF_M68K_CF_ISA_B_NOUSP,mcfisa_a|mcfisa_b|mcfhwdiv},
7727         {EF_M68K_CF_ISA_B,      mcfisa_a|mcfisa_b|mcfhwdiv|mcfusp},
7728         {EF_M68K_CF_ISA_C,      mcfisa_a|mcfisa_c|mcfhwdiv|mcfusp},
7729         {EF_M68K_CF_ISA_C_NODIV,mcfisa_a|mcfisa_c|mcfusp},
7730         {0,0},
7731       };
7732       static const unsigned mac_features[][2] =
7733       {
7734         {EF_M68K_CF_MAC, mcfmac},
7735         {EF_M68K_CF_EMAC, mcfemac},
7736         {0,0},
7737       };
7738       unsigned ix;
7739       unsigned pattern;
7740       
7741       pattern = (current_architecture
7742                  & (mcfisa_a|mcfisa_aa|mcfisa_b|mcfisa_c|mcfhwdiv|mcfusp));
7743       for (ix = 0; isa_features[ix][1]; ix++)
7744         {
7745           if (pattern == isa_features[ix][1])
7746             {
7747               flags |= isa_features[ix][0];
7748               break;
7749             }
7750         }
7751       if (!isa_features[ix][1])
7752         {
7753         cf_bad:
7754           as_warn (_("Not a defined coldfire architecture"));
7755         }
7756       else
7757         {
7758           if (current_architecture & cfloat)
7759             flags |= EF_M68K_CF_FLOAT | EF_M68K_CFV4E;
7760
7761           pattern = current_architecture & (mcfmac|mcfemac);
7762           if (pattern)
7763             {
7764               for (ix = 0; mac_features[ix][1]; ix++)
7765                 {
7766                   if (pattern == mac_features[ix][1])
7767                     {
7768                       flags |= mac_features[ix][0];
7769                       break;
7770                     }
7771                 }
7772               if (!mac_features[ix][1])
7773                 goto cf_bad;
7774             }
7775         }
7776     }
7777   elf_elfheader (stdoutput)->e_flags |= flags;
7778 }
7779 #endif
7780
7781 int
7782 tc_m68k_regname_to_dw2regnum (char *regname)
7783 {
7784   unsigned int regnum;
7785   static const char *const regnames[] =
7786     {
7787       "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
7788       "a0", "a1", "a2", "a3", "a4", "a5", "a6", "sp",
7789       "fp0", "fp1", "fp2", "fp3", "fp4", "fp5", "fp6", "fp7",
7790       "pc"
7791     };
7792
7793   for (regnum = 0; regnum < ARRAY_SIZE (regnames); regnum++)
7794     if (strcmp (regname, regnames[regnum]) == 0)
7795       return regnum;
7796
7797   return -1;
7798 }
7799
7800 void
7801 tc_m68k_frame_initial_instructions (void)
7802 {
7803   static int sp_regno = -1;
7804
7805   if (sp_regno < 0)
7806     sp_regno = tc_m68k_regname_to_dw2regnum ("sp");
7807
7808   cfi_add_CFA_def_cfa (sp_regno, -DWARF2_CIE_DATA_ALIGNMENT);
7809   cfi_add_CFA_offset (DWARF2_DEFAULT_RETURN_COLUMN, DWARF2_CIE_DATA_ALIGNMENT);
7810 }