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