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