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