1 /* tc-m68k.c -- Assemble for the m68k family
2 Copyright 1987, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
5 This file is part of GAS, the GNU Assembler.
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
12 GAS is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to the Free
19 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
23 #include "safe-ctype.h"
26 #include "dwarf2dbg.h"
27 #include "dw2gencfi.h"
29 #include "opcode/m68k.h"
30 #include "m68k-parse.h"
40 /* This string holds the chars that always start a comment. If the
41 pre-processor is disabled, these aren't very useful. The macro
42 tc_comment_chars points to this. We use this, rather than the
43 usual comment_chars, so that the --bitwise-or option will work. */
44 #if defined (TE_SVR4) || defined (TE_DELTA)
45 const char *m68k_comment_chars = "|#";
47 const char *m68k_comment_chars = "|";
50 /* This array holds the chars that only start a comment at the beginning of
51 a line. If the line seems to have the form '# 123 filename'
52 .line and .file directives will appear in the pre-processed output */
53 /* Note that input_file.c hand checks for '#' at the beginning of the
54 first line of the input file. This is because the compiler outputs
55 #NO_APP at the beginning of its output. */
56 /* Also note that comments like this one will always work. */
57 const char line_comment_chars[] = "#*";
59 const char line_separator_chars[] = ";";
61 /* Chars that can be used to separate mant from exp in floating point nums. */
62 const char EXP_CHARS[] = "eE";
64 /* Chars that mean this number is a floating point constant, as
65 in "0f12.456" or "0d1.2345e12". */
67 const char FLT_CHARS[] = "rRsSfFdDxXeEpP";
69 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
70 changed in read.c . Ideally it shouldn't have to know about it at all,
71 but nothing is ideal around here. */
73 /* Are we trying to generate PIC code? If so, absolute references
74 ought to be made into linkage table references or pc-relative
75 references. Not implemented. For ELF there are other means
76 to denote pic relocations. */
79 static int flag_short_refs; /* -l option. */
80 static int flag_long_jumps; /* -S option. */
81 static int flag_keep_pcrel; /* --pcrel option. */
83 #ifdef REGISTER_PREFIX_OPTIONAL
84 int flag_reg_prefix_optional = REGISTER_PREFIX_OPTIONAL;
86 int flag_reg_prefix_optional;
89 /* Whether --register-prefix-optional was used on the command line. */
90 static int reg_prefix_optional_seen;
92 /* The floating point coprocessor to use by default. */
93 static enum m68k_register m68k_float_copnum = COP1;
95 /* If this is non-zero, then references to number(%pc) will be taken
96 to refer to number, rather than to %pc + number. */
97 static int m68k_abspcadd;
99 /* If this is non-zero, then the quick forms of the move, add, and sub
100 instructions are used when possible. */
101 static int m68k_quick = 1;
103 /* If this is non-zero, then if the size is not specified for a base
104 or outer displacement, the assembler assumes that the size should
106 static int m68k_rel32 = 1;
108 /* This is non-zero if m68k_rel32 was set from the command line. */
109 static int m68k_rel32_from_cmdline;
111 /* The default width to use for an index register when using a base
113 static enum m68k_size m68k_index_width_default = SIZE_LONG;
115 /* We want to warn if any text labels are misaligned. In order to get
116 the right line number, we need to record the line number for each
120 struct label_line *next;
127 /* The list of labels. */
129 static struct label_line *labels;
131 /* The current label. */
133 static struct label_line *current_label;
135 /* Pointer to list holding the opcodes sorted by name. */
136 static struct m68k_opcode const ** m68k_sorted_opcodes;
138 /* Its an arbitrary name: This means I don't approve of it.
140 static struct obstack robyn;
144 const char *m_operands;
145 unsigned long m_opcode;
149 struct m68k_incant *m_next;
152 #define getone(x) ((((x)->m_opcode)>>16)&0xffff)
153 #define gettwo(x) (((x)->m_opcode)&0xffff)
155 static const enum m68k_register m68000_ctrl[] = { 0 };
156 static const enum m68k_register m68010_ctrl[] = {
160 static const enum m68k_register m68020_ctrl[] = {
161 SFC, DFC, USP, VBR, CACR, CAAR, MSP, ISP,
164 static const enum m68k_register m68040_ctrl[] = {
165 SFC, DFC, CACR, TC, ITT0, ITT1, DTT0, DTT1,
166 USP, VBR, MSP, ISP, MMUSR, URP, SRP,
169 static const enum m68k_register m68060_ctrl[] = {
170 SFC, DFC, CACR, TC, ITT0, ITT1, DTT0, DTT1, BUSCR,
171 USP, VBR, URP, SRP, PCR,
174 static const enum m68k_register mcf_ctrl[] = {
175 CACR, TC, ACR0, ACR1, ACR2, ACR3, VBR, ROMBAR,
176 RAMBAR0, RAMBAR1, RAMBAR, MBAR,
179 static const enum m68k_register mcf51qe_ctrl[] = {
183 static const enum m68k_register mcf5206_ctrl[] = {
184 CACR, ACR0, ACR1, VBR, RAMBAR0, RAMBAR_ALT, MBAR,
187 static const enum m68k_register mcf5208_ctrl[] = {
188 CACR, ACR0, ACR1, VBR, RAMBAR, RAMBAR1,
191 static const enum m68k_register mcf5210a_ctrl[] = {
192 VBR, CACR, ACR0, ACR1, ROMBAR, RAMBAR, RAMBAR1, MBAR,
195 static const enum m68k_register mcf5213_ctrl[] = {
196 VBR, RAMBAR, RAMBAR1, FLASHBAR,
199 static const enum m68k_register mcf5216_ctrl[] = {
200 VBR, CACR, ACR0, ACR1, FLASHBAR, RAMBAR, RAMBAR1,
203 static const enum m68k_register mcf52223_ctrl[] = {
204 VBR, CACR, ACR0, ACR1, FLASHBAR, RAMBAR, RAMBAR1,
207 static const enum m68k_register mcf52235_ctrl[] = {
208 VBR, CACR, ACR0, ACR1, FLASHBAR, RAMBAR, RAMBAR1,
211 static const enum m68k_register mcf5225_ctrl[] = {
212 VBR, CACR, ACR0, ACR1, FLASHBAR, RAMBAR, MBAR, RAMBAR1,
215 static const enum m68k_register mcf5235_ctrl[] = {
216 VBR, CACR, ACR0, ACR1, RAMBAR, RAMBAR1,
219 static const enum m68k_register mcf5249_ctrl[] = {
220 VBR, CACR, ACR0, ACR1, RAMBAR0, RAMBAR1, RAMBAR, MBAR, MBAR2,
223 static const enum m68k_register mcf5250_ctrl[] = {
227 static const enum m68k_register mcf5253_ctrl[] = {
228 VBR, CACR, ACR0, ACR1, RAMBAR0, RAMBAR1, RAMBAR, MBAR, MBAR2,
231 static const enum m68k_register mcf5271_ctrl[] = {
232 VBR, CACR, ACR0, ACR1, RAMBAR, RAMBAR1,
235 static const enum m68k_register mcf5272_ctrl[] = {
236 VBR, CACR, ACR0, ACR1, ROMBAR, RAMBAR_ALT, RAMBAR0, MBAR,
239 static const enum m68k_register mcf5275_ctrl[] = {
240 VBR, CACR, ACR0, ACR1, RAMBAR, RAMBAR1,
243 static const enum m68k_register mcf5282_ctrl[] = {
244 VBR, CACR, ACR0, ACR1, FLASHBAR, RAMBAR, RAMBAR1,
247 static const enum m68k_register mcf5307_ctrl[] = {
248 CACR, ACR0, ACR1, VBR, RAMBAR0, RAMBAR_ALT, MBAR,
251 static const enum m68k_register mcf5329_ctrl[] = {
252 VBR, CACR, ACR0, ACR1, RAMBAR, RAMBAR1,
255 static const enum m68k_register mcf5373_ctrl[] = {
256 VBR, CACR, ACR0, ACR1, RAMBAR, RAMBAR1,
259 static const enum m68k_register mcfv4e_ctrl[] = {
260 CACR, ASID, ACR0, ACR1, ACR2, ACR3, MMUBAR,
261 VBR, PC, ROMBAR0, ROMBAR1, RAMBAR0, RAMBAR1,
263 MPCR /* Multiprocessor Control register */,
264 EDRAMBAR /* Embedded DRAM Base Address Register */,
265 /* Permutation control registers. */
266 PCR1U0, PCR1L0, PCR1U1, PCR1L1, PCR2U0, PCR2L0, PCR2U1, PCR2L1,
267 PCR3U0, PCR3L0, PCR3U1, PCR3L1,
269 TC /* ASID */, BUSCR /* MMUBAR */,
270 ITT0 /* ACR0 */, ITT1 /* ACR1 */, DTT0 /* ACR2 */, DTT1 /* ACR3 */,
271 MBAR1 /* MBAR */, MBAR2 /* SECMBAR */, MBAR0 /* SECMBAR */,
272 ROMBAR /* ROMBAR0 */, RAMBAR /* RAMBAR1 */,
275 static const enum m68k_register mcf5407_ctrl[] = {
276 CACR, ASID, ACR0, ACR1, ACR2, ACR3,
277 VBR, PC, RAMBAR0, RAMBAR1, MBAR,
280 ITT0 /* ACR0 */, ITT1 /* ACR1 */, DTT0 /* ACR2 */, DTT1 /* ACR3 */,
281 MBAR1 /* MBAR */, RAMBAR /* RAMBAR1 */,
284 static const enum m68k_register mcf54455_ctrl[] = {
285 CACR, ASID, ACR0, ACR1, ACR2, ACR3, MMUBAR,
286 VBR, PC, RAMBAR1, MBAR,
288 TC /* ASID */, BUSCR /* MMUBAR */,
289 ITT0 /* ACR0 */, ITT1 /* ACR1 */, DTT0 /* ACR2 */, DTT1 /* ACR3 */,
290 MBAR1 /* MBAR */, RAMBAR /* RAMBAR1 */,
293 static const enum m68k_register mcf5475_ctrl[] = {
294 CACR, ASID, ACR0, ACR1, ACR2, ACR3, MMUBAR,
295 VBR, PC, RAMBAR0, RAMBAR1, MBAR,
297 TC /* ASID */, BUSCR /* MMUBAR */,
298 ITT0 /* ACR0 */, ITT1 /* ACR1 */, DTT0 /* ACR2 */, DTT1 /* ACR3 */,
299 MBAR1 /* MBAR */, RAMBAR /* RAMBAR1 */,
302 static const enum m68k_register mcf5485_ctrl[] = {
303 CACR, ASID, ACR0, ACR1, ACR2, ACR3, MMUBAR,
304 VBR, PC, RAMBAR0, RAMBAR1, MBAR,
306 TC /* ASID */, BUSCR /* MMUBAR */,
307 ITT0 /* ACR0 */, ITT1 /* ACR1 */, DTT0 /* ACR2 */, DTT1 /* ACR3 */,
308 MBAR1 /* MBAR */, RAMBAR /* RAMBAR1 */,
311 static const enum m68k_register fido_ctrl[] = {
312 SFC, DFC, USP, VBR, CAC, MBO,
315 #define cpu32_ctrl m68010_ctrl
317 static const enum m68k_register *control_regs;
319 /* Internal form of a 68020 instruction. */
323 const char *args; /* List of opcode info. */
326 int numo; /* Number of shorts in opcode. */
329 struct m68k_op operands[6];
331 int nexp; /* Number of exprs in use. */
332 struct m68k_exp exprs[4];
334 int nfrag; /* Number of frags we have to produce. */
337 int fragoff; /* Where in the current opcode the frag ends. */
344 int nrel; /* Num of reloc strucs in use. */
351 /* In a pc relative address the difference between the address
352 of the offset and the address that the offset is relative
353 to. This depends on the addressing mode. Basically this
354 is the value to put in the offset field to address the
355 first byte of the offset, without regarding the special
356 significance of some values (in the branch instruction, for
360 /* Whether this expression needs special pic relocation, and if
362 enum pic_relocation pic_reloc;
365 reloc[5]; /* Five is enough??? */
368 #define cpu_of_arch(x) ((x) & (m68000up | mcfisa_a | fido_a))
369 #define float_of_arch(x) ((x) & mfloat)
370 #define mmu_of_arch(x) ((x) & mmmu)
371 #define arch_coldfire_p(x) ((x) & mcfisa_a)
372 #define arch_coldfire_fpu(x) ((x) & cfloat)
374 /* Macros for determining if cpu supports a specific addressing mode. */
375 #define HAVE_LONG_DISP(x) \
376 ((x) & (m68020|m68030|m68040|m68060|cpu32|fido_a|mcfisa_b|mcfisa_c))
377 #define HAVE_LONG_CALL(x) \
378 ((x) & (m68020|m68030|m68040|m68060|cpu32|fido_a|mcfisa_b|mcfisa_c))
379 #define HAVE_LONG_COND(x) \
380 ((x) & (m68020|m68030|m68040|m68060|cpu32|fido_a|mcfisa_b|mcfisa_c))
381 #define HAVE_LONG_BRANCH(x) \
382 ((x) & (m68020|m68030|m68040|m68060|cpu32|fido_a|mcfisa_b))
383 #define LONG_BRANCH_VIA_COND(x) (HAVE_LONG_COND(x) && !HAVE_LONG_BRANCH(x))
385 static struct m68k_it the_ins; /* The instruction being assembled. */
387 #define op(ex) ((ex)->exp.X_op)
388 #define adds(ex) ((ex)->exp.X_add_symbol)
389 #define subs(ex) ((ex)->exp.X_op_symbol)
390 #define offs(ex) ((ex)->exp.X_add_number)
392 /* Macros for adding things to the m68k_it struct. */
393 #define addword(w) (the_ins.opcode[the_ins.numo++] = (w))
395 /* Like addword, but goes BEFORE general operands. */
398 insop (int w, const struct m68k_incant *opcode)
401 for (z = the_ins.numo; z > opcode->m_codenum; --z)
402 the_ins.opcode[z] = the_ins.opcode[z - 1];
403 for (z = 0; z < the_ins.nrel; z++)
404 the_ins.reloc[z].n += 2;
405 for (z = 0; z < the_ins.nfrag; z++)
406 the_ins.fragb[z].fragoff++;
407 the_ins.opcode[opcode->m_codenum] = w;
411 /* The numo+1 kludge is so we can hit the low order byte of the prev word.
414 add_fix (int width, struct m68k_exp *exp, int pc_rel, int pc_fix)
416 the_ins.reloc[the_ins.nrel].n = (width == 'B' || width == '3'
417 ? the_ins.numo * 2 - 1
419 ? the_ins.numo * 2 + 1
420 : the_ins.numo * 2));
421 the_ins.reloc[the_ins.nrel].exp = exp->exp;
422 the_ins.reloc[the_ins.nrel].wid = width;
423 the_ins.reloc[the_ins.nrel].pcrel_fix = pc_fix;
425 the_ins.reloc[the_ins.nrel].pic_reloc = exp->pic_reloc;
427 the_ins.reloc[the_ins.nrel++].pcrel = pc_rel;
430 /* Cause an extra frag to be generated here, inserting up to 10 bytes
431 (that value is chosen in the frag_var call in md_assemble). TYPE
432 is the subtype of the frag to be generated; its primary type is
433 rs_machine_dependent.
435 The TYPE parameter is also used by md_convert_frag_1 and
436 md_estimate_size_before_relax. The appropriate type of fixup will
437 be emitted by md_convert_frag_1.
439 ADD becomes the FR_SYMBOL field of the frag, and OFF the FR_OFFSET. */
441 add_frag (symbolS *add, offsetT off, int type)
443 the_ins.fragb[the_ins.nfrag].fragoff = the_ins.numo;
444 the_ins.fragb[the_ins.nfrag].fadd = add;
445 the_ins.fragb[the_ins.nfrag].foff = off;
446 the_ins.fragb[the_ins.nfrag++].fragty = type;
450 (op (ex) != O_constant && op (ex) != O_big)
452 static char *crack_operand (char *str, struct m68k_op *opP);
453 static int get_num (struct m68k_exp *exp, int ok);
454 static int reverse_16_bits (int in);
455 static int reverse_8_bits (int in);
456 static void install_gen_operand (int mode, int val);
457 static void install_operand (int mode, int val);
458 static void s_bss (int);
459 static void s_data1 (int);
460 static void s_data2 (int);
461 static void s_even (int);
462 static void s_proc (int);
463 static void s_chip (int);
464 static void s_fopt (int);
465 static void s_opt (int);
466 static void s_reg (int);
467 static void s_restore (int);
468 static void s_save (int);
469 static void s_mri_if (int);
470 static void s_mri_else (int);
471 static void s_mri_endi (int);
472 static void s_mri_break (int);
473 static void s_mri_next (int);
474 static void s_mri_for (int);
475 static void s_mri_endf (int);
476 static void s_mri_repeat (int);
477 static void s_mri_until (int);
478 static void s_mri_while (int);
479 static void s_mri_endw (int);
480 static void s_m68k_cpu (int);
481 static void s_m68k_arch (int);
485 unsigned long arch; /* Architecture features. */
486 const enum m68k_register *control_regs; /* Control regs on chip */
487 const char *name; /* Name */
488 int alias; /* Alias for a cannonical name. If 1, then
489 succeeds canonical name, if -1 then
490 succeeds canonical name, if <-1 ||>1 this is a
491 deprecated name, and the next/previous name
495 /* We hold flags for features explicitly enabled and explicitly
497 static int current_architecture;
498 static int not_current_architecture;
499 static const struct m68k_cpu *selected_arch;
500 static const struct m68k_cpu *selected_cpu;
501 static int initialized;
503 /* Architecture models. */
504 static const struct m68k_cpu m68k_archs[] =
506 {m68000, m68000_ctrl, "68000", 0},
507 {m68010, m68010_ctrl, "68010", 0},
508 {m68020|m68881|m68851, m68020_ctrl, "68020", 0},
509 {m68030|m68881|m68851, m68020_ctrl, "68030", 0},
510 {m68040, m68040_ctrl, "68040", 0},
511 {m68060, m68060_ctrl, "68060", 0},
512 {cpu32|m68881, cpu32_ctrl, "cpu32", 0},
513 {fido_a, fido_ctrl, "fidoa", 0},
514 {mcfisa_a|mcfhwdiv, NULL, "isaa", 0},
515 {mcfisa_a|mcfhwdiv|mcfisa_aa|mcfusp, NULL, "isaaplus", 0},
516 {mcfisa_a|mcfhwdiv|mcfisa_b|mcfusp, NULL, "isab", 0},
517 {mcfisa_a|mcfhwdiv|mcfisa_c|mcfusp, NULL, "isac", 0},
518 {mcfisa_a|mcfhwdiv|mcfisa_b|mcfmac|mcfusp, mcf_ctrl, "cfv4", 0},
519 {mcfisa_a|mcfhwdiv|mcfisa_b|mcfemac|mcfusp|cfloat, mcfv4e_ctrl, "cfv4e", 0},
523 /* Architecture extensions, here 'alias' -1 for m68k, +1 for cf and 0
525 static const struct m68k_cpu m68k_extensions[] =
527 {m68851, NULL, "68851", -1},
528 {m68881, NULL, "68881", -1},
529 {m68881, NULL, "68882", -1},
531 {cfloat|m68881, NULL, "float", 0},
533 {mcfhwdiv, NULL, "div", 1},
534 {mcfusp, NULL, "usp", 1},
535 {mcfmac, NULL, "mac", 1},
536 {mcfemac, NULL, "emac", 1},
542 static const struct m68k_cpu m68k_cpus[] =
544 {m68000, m68000_ctrl, "68000", 0},
545 {m68000, m68000_ctrl, "68ec000", 1},
546 {m68000, m68000_ctrl, "68hc000", 1},
547 {m68000, m68000_ctrl, "68hc001", 1},
548 {m68000, m68000_ctrl, "68008", 1},
549 {m68000, m68000_ctrl, "68302", 1},
550 {m68000, m68000_ctrl, "68306", 1},
551 {m68000, m68000_ctrl, "68307", 1},
552 {m68000, m68000_ctrl, "68322", 1},
553 {m68000, m68000_ctrl, "68356", 1},
554 {m68010, m68010_ctrl, "68010", 0},
555 {m68020|m68881|m68851, m68020_ctrl, "68020", 0},
556 {m68020|m68881|m68851, m68020_ctrl, "68k", 1},
557 {m68020|m68881|m68851, m68020_ctrl, "68ec020", 1},
558 {m68030|m68881|m68851, m68020_ctrl, "68030", 0},
559 {m68030|m68881|m68851, m68020_ctrl, "68ec030", 1},
560 {m68040, m68040_ctrl, "68040", 0},
561 {m68040, m68040_ctrl, "68ec040", 1},
562 {m68060, m68060_ctrl, "68060", 0},
563 {m68060, m68060_ctrl, "68ec060", 1},
565 {cpu32|m68881, cpu32_ctrl, "cpu32", 0},
566 {cpu32|m68881, cpu32_ctrl, "68330", 1},
567 {cpu32|m68881, cpu32_ctrl, "68331", 1},
568 {cpu32|m68881, cpu32_ctrl, "68332", 1},
569 {cpu32|m68881, cpu32_ctrl, "68333", 1},
570 {cpu32|m68881, cpu32_ctrl, "68334", 1},
571 {cpu32|m68881, cpu32_ctrl, "68336", 1},
572 {cpu32|m68881, cpu32_ctrl, "68340", 1},
573 {cpu32|m68881, cpu32_ctrl, "68341", 1},
574 {cpu32|m68881, cpu32_ctrl, "68349", 1},
575 {cpu32|m68881, cpu32_ctrl, "68360", 1},
577 {mcfisa_a|mcfisa_c|mcfusp, mcf51qe_ctrl, "51qe", 0},
579 {mcfisa_a, mcf_ctrl, "5200", 0},
580 {mcfisa_a, mcf_ctrl, "5202", 1},
581 {mcfisa_a, mcf_ctrl, "5204", 1},
582 {mcfisa_a, mcf5206_ctrl, "5206", 1},
584 {mcfisa_a|mcfhwdiv|mcfmac, mcf5206_ctrl, "5206e", 0},
586 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5208_ctrl, "5207", -1},
587 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5208_ctrl, "5208", 0},
589 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf5210a_ctrl, "5210a", 0},
590 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf5210a_ctrl, "5211a", 1},
592 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf5213_ctrl, "5211", -1},
593 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf5213_ctrl, "5212", -1},
594 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf5213_ctrl, "5213", 0},
596 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5216_ctrl, "5214", -1},
597 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5216_ctrl, "5216", 0},
598 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5216_ctrl, "521x", 2},
600 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf52223_ctrl, "52221", -1},
601 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf52223_ctrl, "52223", 0},
603 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf52235_ctrl, "52230", -1},
604 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf52235_ctrl, "52233", -1},
605 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf52235_ctrl, "52234", -1},
606 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf52235_ctrl, "52235", 0},
608 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf5225_ctrl, "5224", -1},
609 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf5225_ctrl, "5225", 0},
611 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5235_ctrl, "5232", -1},
612 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5235_ctrl, "5233", -1},
613 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5235_ctrl, "5234", -1},
614 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5235_ctrl, "5235", -1},
615 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5235_ctrl, "523x", 0},
617 {mcfisa_a|mcfhwdiv|mcfemac, mcf5249_ctrl, "5249", 0},
618 {mcfisa_a|mcfhwdiv|mcfemac, mcf5250_ctrl, "5250", 0},
619 {mcfisa_a|mcfhwdiv|mcfemac, mcf5253_ctrl, "5253", 0},
621 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5271_ctrl, "5270", -1},
622 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5271_ctrl, "5271", 0},
624 {mcfisa_a|mcfhwdiv|mcfmac, mcf5272_ctrl, "5272", 0},
626 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5275_ctrl, "5274", -1},
627 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5275_ctrl, "5275", 0},
629 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5282_ctrl, "5280", -1},
630 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5282_ctrl, "5281", -1},
631 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5282_ctrl, "5282", -1},
632 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5282_ctrl, "528x", 0},
634 {mcfisa_a|mcfhwdiv|mcfmac, mcf5307_ctrl, "5307", 0},
636 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5329_ctrl, "5327", -1},
637 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5329_ctrl, "5328", -1},
638 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5329_ctrl, "5329", -1},
639 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5329_ctrl, "532x", 0},
641 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5373_ctrl, "5372", -1},
642 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5373_ctrl, "5373", -1},
643 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5373_ctrl, "537x", 0},
645 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfmac, mcf5407_ctrl, "5407",0},
647 {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp, mcf54455_ctrl, "54450", -1},
648 {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp, mcf54455_ctrl, "54451", -1},
649 {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp, mcf54455_ctrl, "54452", -1},
650 {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp, mcf54455_ctrl, "54453", -1},
651 {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp, mcf54455_ctrl, "54454", -1},
652 {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp, mcf54455_ctrl, "54455", 0},
654 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "5470", -1},
655 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "5471", -1},
656 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "5472", -1},
657 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "5473", -1},
658 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "5474", -1},
659 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "5475", -1},
660 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "547x", 0},
662 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "5480", -1},
663 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "5481", -1},
664 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "5482", -1},
665 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "5483", -1},
666 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "5484", -1},
667 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "5485", -1},
668 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "548x", 0},
670 {fido_a, fido_ctrl, "fidoa", 0},
671 {fido_a, fido_ctrl, "fido", 1},
676 static const struct m68k_cpu *m68k_lookup_cpu
677 (const char *, const struct m68k_cpu *, int, int *);
678 static int m68k_set_arch (const char *, int, int);
679 static int m68k_set_cpu (const char *, int, int);
680 static int m68k_set_extension (const char *, int, int);
681 static void m68k_init_arch (void);
683 /* This is the assembler relaxation table for m68k. m68k is a rich CISC
684 architecture and we have a lot of relaxation modes. */
686 /* Macros used in the relaxation code. */
687 #define TAB(x,y) (((x) << 2) + (y))
688 #define TABTYPE(x) ((x) >> 2)
690 /* Relaxation states. */
696 /* Here are all the relaxation modes we support. First we can relax ordinary
697 branches. On 68020 and higher and on CPU32 all branch instructions take
698 three forms, so on these CPUs all branches always remain as such. When we
699 have to expand to the LONG form on a 68000, though, we substitute an
700 absolute jump instead. This is a direct replacement for unconditional
701 branches and a branch over a jump for conditional branches. However, if the
702 user requires PIC and disables this with --pcrel, we can only relax between
703 BYTE and SHORT forms, punting if that isn't enough. This gives us four
704 different relaxation modes for branches: */
706 #define BRANCHBWL 0 /* Branch byte, word, or long. */
707 #define BRABSJUNC 1 /* Absolute jump for LONG, unconditional. */
708 #define BRABSJCOND 2 /* Absolute jump for LONG, conditional. */
709 #define BRANCHBW 3 /* Branch byte or word. */
711 /* We also relax coprocessor branches and DBcc's. All CPUs that support
712 coprocessor branches support them in word and long forms, so we have only
713 one relaxation mode for them. DBcc's are word only on all CPUs. We can
714 relax them to the LONG form with a branch-around sequence. This sequence
715 can use a long branch (if available) or an absolute jump (if acceptable).
716 This gives us two relaxation modes. If long branches are not available and
717 absolute jumps are not acceptable, we don't relax DBcc's. */
719 #define FBRANCH 4 /* Coprocessor branch. */
720 #define DBCCLBR 5 /* DBcc relaxable with a long branch. */
721 #define DBCCABSJ 6 /* DBcc relaxable with an absolute jump. */
723 /* That's all for instruction relaxation. However, we also relax PC-relative
724 operands. Specifically, we have three operand relaxation modes. On the
725 68000 PC-relative operands can only be 16-bit, but on 68020 and higher and
726 on CPU32 they may be 16-bit or 32-bit. For the latter we relax between the
727 two. Also PC+displacement+index operands in their simple form (with a non-
728 suppressed index without memory indirection) are supported on all CPUs, but
729 on the 68000 the displacement can be 8-bit only, whereas on 68020 and higher
730 and on CPU32 we relax it to SHORT and LONG forms as well using the extended
731 form of the PC+displacement+index operand. Finally, some absolute operands
732 can be relaxed down to 16-bit PC-relative. */
734 #define PCREL1632 7 /* 16-bit or 32-bit PC-relative. */
735 #define PCINDEX 8 /* PC + displacement + index. */
736 #define ABSTOPCREL 9 /* Absolute relax down to 16-bit PC-relative. */
738 /* This relaxation is required for branches where there is no long
739 branch and we are in pcrel mode. We generate a bne/beq pair. */
740 #define BRANCHBWPL 10 /* Branch byte, word or pair of longs
743 /* Note that calls to frag_var need to specify the maximum expansion
744 needed; this is currently 12 bytes for bne/beq pair. */
745 #define FRAG_VAR_SIZE 12
748 How far Forward this mode will reach:
749 How far Backward this mode will reach:
750 How many bytes this mode will add to the size of the frag
751 Which mode to go to if the offset won't fit in this one
753 Please check tc-m68k.h:md_prepare_relax_scan if changing this table. */
754 relax_typeS md_relax_table[] =
756 { 127, -128, 0, TAB (BRANCHBWL, SHORT) },
757 { 32767, -32768, 2, TAB (BRANCHBWL, LONG) },
761 { 127, -128, 0, TAB (BRABSJUNC, SHORT) },
762 { 32767, -32768, 2, TAB (BRABSJUNC, LONG) },
766 { 127, -128, 0, TAB (BRABSJCOND, SHORT) },
767 { 32767, -32768, 2, TAB (BRABSJCOND, LONG) },
771 { 127, -128, 0, TAB (BRANCHBW, SHORT) },
776 { 1, 1, 0, 0 }, /* FBRANCH doesn't come BYTE. */
777 { 32767, -32768, 2, TAB (FBRANCH, LONG) },
781 { 1, 1, 0, 0 }, /* DBCC doesn't come BYTE. */
782 { 32767, -32768, 2, TAB (DBCCLBR, LONG) },
786 { 1, 1, 0, 0 }, /* DBCC doesn't come BYTE. */
787 { 32767, -32768, 2, TAB (DBCCABSJ, LONG) },
791 { 1, 1, 0, 0 }, /* PCREL1632 doesn't come BYTE. */
792 { 32767, -32768, 2, TAB (PCREL1632, LONG) },
796 { 125, -130, 0, TAB (PCINDEX, SHORT) },
797 { 32765, -32770, 2, TAB (PCINDEX, LONG) },
801 { 1, 1, 0, 0 }, /* ABSTOPCREL doesn't come BYTE. */
802 { 32767, -32768, 2, TAB (ABSTOPCREL, LONG) },
806 { 127, -128, 0, TAB (BRANCHBWPL, SHORT) },
807 { 32767, -32768, 2, TAB (BRANCHBWPL, LONG) },
812 /* These are the machine dependent pseudo-ops. These are included so
813 the assembler can work on the output from the SUN C compiler, which
816 /* This table describes all the machine specific pseudo-ops the assembler
817 has to support. The fields are:
818 pseudo-op name without dot
819 function to call to execute this pseudo-op
820 Integer arg to pass to the function. */
821 const pseudo_typeS md_pseudo_table[] =
823 {"data1", s_data1, 0},
824 {"data2", s_data2, 0},
827 {"skip", s_space, 0},
829 #if defined (TE_SUN3) || defined (OBJ_ELF)
830 {"align", s_align_bytes, 0},
833 {"swbeg", s_ignore, 0},
835 {"extend", float_cons, 'x'},
836 {"ldouble", float_cons, 'x'},
838 {"arch", s_m68k_arch, 0},
839 {"cpu", s_m68k_cpu, 0},
841 /* The following pseudo-ops are supported for MRI compatibility. */
843 {"comline", s_space, 1},
845 {"mask2", s_ignore, 0},
848 {"restore", s_restore, 0},
852 {"if.b", s_mri_if, 'b'},
853 {"if.w", s_mri_if, 'w'},
854 {"if.l", s_mri_if, 'l'},
855 {"else", s_mri_else, 0},
856 {"else.s", s_mri_else, 's'},
857 {"else.l", s_mri_else, 'l'},
858 {"endi", s_mri_endi, 0},
859 {"break", s_mri_break, 0},
860 {"break.s", s_mri_break, 's'},
861 {"break.l", s_mri_break, 'l'},
862 {"next", s_mri_next, 0},
863 {"next.s", s_mri_next, 's'},
864 {"next.l", s_mri_next, 'l'},
865 {"for", s_mri_for, 0},
866 {"for.b", s_mri_for, 'b'},
867 {"for.w", s_mri_for, 'w'},
868 {"for.l", s_mri_for, 'l'},
869 {"endf", s_mri_endf, 0},
870 {"repeat", s_mri_repeat, 0},
871 {"until", s_mri_until, 0},
872 {"until.b", s_mri_until, 'b'},
873 {"until.w", s_mri_until, 'w'},
874 {"until.l", s_mri_until, 'l'},
875 {"while", s_mri_while, 0},
876 {"while.b", s_mri_while, 'b'},
877 {"while.w", s_mri_while, 'w'},
878 {"while.l", s_mri_while, 'l'},
879 {"endw", s_mri_endw, 0},
884 /* The mote pseudo ops are put into the opcode table, since they
885 don't start with a . they look like opcodes to gas. */
887 const pseudo_typeS mote_pseudo_table[] =
900 {"xdef", s_globl, 0},
902 {"align", s_align_bytes, 0},
904 {"align", s_align_ptwo, 0},
907 {"sect", obj_coff_section, 0},
908 {"section", obj_coff_section, 0},
913 /* Truncate and sign-extend at 32 bits, so that building on a 64-bit host
914 gives identical results to a 32-bit host. */
915 #define TRUNC(X) ((valueT) (X) & 0xffffffff)
916 #define SEXT(X) ((TRUNC (X) ^ 0x80000000) - 0x80000000)
918 #define issbyte(x) ((valueT) SEXT (x) + 0x80 < 0x100)
919 #define isubyte(x) ((valueT) TRUNC (x) < 0x100)
920 #define issword(x) ((valueT) SEXT (x) + 0x8000 < 0x10000)
921 #define isuword(x) ((valueT) TRUNC (x) < 0x10000)
923 #define isbyte(x) ((valueT) SEXT (x) + 0xff < 0x1ff)
924 #define isword(x) ((valueT) SEXT (x) + 0xffff < 0x1ffff)
925 #define islong(x) (1)
927 static char notend_table[256];
928 static char alt_notend_table[256];
930 (! (notend_table[(unsigned char) *s] \
932 && alt_notend_table[(unsigned char) s[1]])))
936 /* Return zero if the reference to SYMBOL from within the same segment may
939 /* On an ELF system, we can't relax an externally visible symbol,
940 because it may be overridden by a shared library. However, if
941 TARGET_OS is "elf", then we presume that we are assembling for an
942 embedded system, in which case we don't have to worry about shared
943 libraries, and we can relax any external sym. */
945 #define relaxable_symbol(symbol) \
946 (!((S_IS_EXTERNAL (symbol) && EXTERN_FORCE_RELOC) \
947 || S_IS_WEAK (symbol)))
949 /* Compute the relocation code for a fixup of SIZE bytes, using pc
950 relative relocation if PCREL is non-zero. PIC says whether a special
951 pic relocation was requested. */
953 static bfd_reloc_code_real_type
954 get_reloc_code (int size, int pcrel, enum pic_relocation pic)
962 return BFD_RELOC_8_GOT_PCREL;
964 return BFD_RELOC_16_GOT_PCREL;
966 return BFD_RELOC_32_GOT_PCREL;
974 return BFD_RELOC_8_GOTOFF;
976 return BFD_RELOC_16_GOTOFF;
978 return BFD_RELOC_32_GOTOFF;
986 return BFD_RELOC_8_PLT_PCREL;
988 return BFD_RELOC_16_PLT_PCREL;
990 return BFD_RELOC_32_PLT_PCREL;
998 return BFD_RELOC_8_PLTOFF;
1000 return BFD_RELOC_16_PLTOFF;
1002 return BFD_RELOC_32_PLTOFF;
1012 return BFD_RELOC_8_PCREL;
1014 return BFD_RELOC_16_PCREL;
1016 return BFD_RELOC_32_PCREL;
1026 return BFD_RELOC_16;
1028 return BFD_RELOC_32;
1035 if (pic == pic_none)
1036 as_bad (_("Can not do %d byte pc-relative relocation"), size);
1038 as_bad (_("Can not do %d byte pc-relative pic relocation"), size);
1042 if (pic == pic_none)
1043 as_bad (_("Can not do %d byte relocation"), size);
1045 as_bad (_("Can not do %d byte pic relocation"), size);
1048 return BFD_RELOC_NONE;
1051 /* Here we decide which fixups can be adjusted to make them relative
1052 to the beginning of the section instead of the symbol. Basically
1053 we need to make sure that the dynamic relocations are done
1054 correctly, so in some cases we force the original symbol to be
1057 tc_m68k_fix_adjustable (fixS *fixP)
1059 /* Adjust_reloc_syms doesn't know about the GOT. */
1060 switch (fixP->fx_r_type)
1062 case BFD_RELOC_8_GOT_PCREL:
1063 case BFD_RELOC_16_GOT_PCREL:
1064 case BFD_RELOC_32_GOT_PCREL:
1065 case BFD_RELOC_8_GOTOFF:
1066 case BFD_RELOC_16_GOTOFF:
1067 case BFD_RELOC_32_GOTOFF:
1068 case BFD_RELOC_8_PLT_PCREL:
1069 case BFD_RELOC_16_PLT_PCREL:
1070 case BFD_RELOC_32_PLT_PCREL:
1071 case BFD_RELOC_8_PLTOFF:
1072 case BFD_RELOC_16_PLTOFF:
1073 case BFD_RELOC_32_PLTOFF:
1076 case BFD_RELOC_VTABLE_INHERIT:
1077 case BFD_RELOC_VTABLE_ENTRY:
1085 #else /* !OBJ_ELF */
1087 #define get_reloc_code(SIZE,PCREL,OTHER) NO_RELOC
1089 /* PR gas/3041 Weak symbols are not relaxable
1090 because they must be treated as extern. */
1091 #define relaxable_symbol(symbol) (!(S_IS_WEAK (symbol)))
1093 #endif /* OBJ_ELF */
1096 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
1099 bfd_reloc_code_real_type code;
1101 /* If the tcbit is set, then this was a fixup of a negative value
1102 that was never resolved. We do not have a reloc to handle this,
1103 so just return. We assume that other code will have detected this
1104 situation and produced a helpful error message, so we just tell the
1105 user that the reloc cannot be produced. */
1109 as_bad_where (fixp->fx_file, fixp->fx_line,
1110 _("Unable to produce reloc against symbol '%s'"),
1111 S_GET_NAME (fixp->fx_addsy));
1115 if (fixp->fx_r_type != BFD_RELOC_NONE)
1117 code = fixp->fx_r_type;
1119 /* Since DIFF_EXPR_OK is defined in tc-m68k.h, it is possible
1120 that fixup_segment converted a non-PC relative reloc into a
1121 PC relative reloc. In such a case, we need to convert the
1128 code = BFD_RELOC_8_PCREL;
1131 code = BFD_RELOC_16_PCREL;
1134 code = BFD_RELOC_32_PCREL;
1136 case BFD_RELOC_8_PCREL:
1137 case BFD_RELOC_16_PCREL:
1138 case BFD_RELOC_32_PCREL:
1139 case BFD_RELOC_8_GOT_PCREL:
1140 case BFD_RELOC_16_GOT_PCREL:
1141 case BFD_RELOC_32_GOT_PCREL:
1142 case BFD_RELOC_8_GOTOFF:
1143 case BFD_RELOC_16_GOTOFF:
1144 case BFD_RELOC_32_GOTOFF:
1145 case BFD_RELOC_8_PLT_PCREL:
1146 case BFD_RELOC_16_PLT_PCREL:
1147 case BFD_RELOC_32_PLT_PCREL:
1148 case BFD_RELOC_8_PLTOFF:
1149 case BFD_RELOC_16_PLTOFF:
1150 case BFD_RELOC_32_PLTOFF:
1153 as_bad_where (fixp->fx_file, fixp->fx_line,
1154 _("Cannot make %s relocation PC relative"),
1155 bfd_get_reloc_code_name (code));
1161 #define F(SZ,PCREL) (((SZ) << 1) + (PCREL))
1162 switch (F (fixp->fx_size, fixp->fx_pcrel))
1164 #define MAP(SZ,PCREL,TYPE) case F(SZ,PCREL): code = (TYPE); break
1165 MAP (1, 0, BFD_RELOC_8);
1166 MAP (2, 0, BFD_RELOC_16);
1167 MAP (4, 0, BFD_RELOC_32);
1168 MAP (1, 1, BFD_RELOC_8_PCREL);
1169 MAP (2, 1, BFD_RELOC_16_PCREL);
1170 MAP (4, 1, BFD_RELOC_32_PCREL);
1178 reloc = (arelent *) xmalloc (sizeof (arelent));
1179 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
1180 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1181 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
1184 reloc->addend = fixp->fx_addnumber;
1185 else if (OUTPUT_FLAVOR == bfd_target_aout_flavour
1187 && S_IS_WEAK (fixp->fx_addsy)
1188 && ! bfd_is_und_section (S_GET_SEGMENT (fixp->fx_addsy)))
1189 /* PR gas/3041 Adjust addend in order to force bfd_install_relocation()
1190 to put the symbol offset into frags referencing a weak symbol. */
1191 reloc->addend = fixp->fx_addnumber
1192 - (S_GET_VALUE (fixp->fx_addsy) * 2);
1196 if (!fixp->fx_pcrel)
1197 reloc->addend = fixp->fx_addnumber;
1199 reloc->addend = (section->vma
1200 /* Explicit sign extension in case char is
1202 + ((fixp->fx_pcrel_adjust & 0xff) ^ 0x80) - 0x80
1203 + fixp->fx_addnumber
1204 + md_pcrel_from (fixp));
1207 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
1208 assert (reloc->howto != 0);
1213 /* Handle of the OPCODE hash table. NULL means any use before
1214 m68k_ip_begin() will crash. */
1215 static struct hash_control *op_hash;
1217 /* Assemble an m68k instruction. */
1220 m68k_ip (char *instring)
1223 register struct m68k_op *opP;
1224 register const struct m68k_incant *opcode;
1225 register const char *s;
1226 register int tmpreg = 0, baseo = 0, outro = 0, nextword;
1227 char *pdot, *pdotmove;
1228 enum m68k_size siz1, siz2;
1232 struct m68k_op operands_backup[6];
1233 LITTLENUM_TYPE words[6];
1234 LITTLENUM_TYPE *wordp;
1235 unsigned long ok_arch = 0;
1237 if (*instring == ' ')
1238 instring++; /* Skip leading whitespace. */
1240 /* Scan up to end of operation-code, which MUST end in end-of-string
1241 or exactly 1 space. */
1243 for (p = instring; *p != '\0'; p++)
1253 the_ins.error = _("No operator");
1257 /* p now points to the end of the opcode name, probably whitespace.
1258 Make sure the name is null terminated by clobbering the
1259 whitespace, look it up in the hash table, then fix it back.
1260 Remove a dot, first, since the opcode tables have none. */
1263 for (pdotmove = pdot; pdotmove < p; pdotmove++)
1264 *pdotmove = pdotmove[1];
1270 opcode = (const struct m68k_incant *) hash_find (op_hash, instring);
1275 for (pdotmove = p; pdotmove > pdot; pdotmove--)
1276 *pdotmove = pdotmove[-1];
1283 the_ins.error = _("Unknown operator");
1287 /* Found a legitimate opcode, start matching operands. */
1291 if (opcode->m_operands == 0)
1293 char *old = input_line_pointer;
1295 input_line_pointer = p;
1296 /* Ahh - it's a motorola style psuedo op. */
1297 mote_pseudo_table[opcode->m_opnum].poc_handler
1298 (mote_pseudo_table[opcode->m_opnum].poc_val);
1299 input_line_pointer = old;
1305 if (flag_mri && opcode->m_opnum == 0)
1307 /* In MRI mode, random garbage is allowed after an instruction
1308 which accepts no operands. */
1309 the_ins.args = opcode->m_operands;
1310 the_ins.numargs = opcode->m_opnum;
1311 the_ins.numo = opcode->m_codenum;
1312 the_ins.opcode[0] = getone (opcode);
1313 the_ins.opcode[1] = gettwo (opcode);
1317 for (opP = &the_ins.operands[0]; *p; opP++)
1319 p = crack_operand (p, opP);
1323 the_ins.error = opP->error;
1328 opsfound = opP - &the_ins.operands[0];
1330 /* This ugly hack is to support the floating pt opcodes in their
1331 standard form. Essentially, we fake a first enty of type COP#1 */
1332 if (opcode->m_operands[0] == 'I')
1336 for (n = opsfound; n > 0; --n)
1337 the_ins.operands[n] = the_ins.operands[n - 1];
1339 memset (&the_ins.operands[0], '\0', sizeof (the_ins.operands[0]));
1340 the_ins.operands[0].mode = CONTROL;
1341 the_ins.operands[0].reg = m68k_float_copnum;
1345 /* We've got the operands. Find an opcode that'll accept them. */
1348 /* If we didn't get the right number of ops, or we have no
1349 common model with this pattern then reject this pattern. */
1351 ok_arch |= opcode->m_arch;
1352 if (opsfound != opcode->m_opnum
1353 || ((opcode->m_arch & current_architecture) == 0))
1359 /* Make a copy of the operands of this insn so that
1360 we can modify them safely, should we want to. */
1361 assert (opsfound <= (int) ARRAY_SIZE (operands_backup));
1362 for (i = 0; i < opsfound; i++)
1363 operands_backup[i] = the_ins.operands[i];
1365 for (s = opcode->m_operands, opP = &operands_backup[0];
1369 /* Warning: this switch is huge! */
1370 /* I've tried to organize the cases into this order:
1371 non-alpha first, then alpha by letter. Lower-case
1372 goes directly before uppercase counterpart. */
1373 /* Code with multiple case ...: gets sorted by the lowest
1374 case ... it belongs to. I hope this makes sense. */
1480 if (opP->reg == PC || opP->reg == ZPC)
1497 if (opP->reg == PC || opP->reg == ZPC)
1516 if (opP->reg == PC || opP->reg == ZPC)
1526 if (opP->mode != IMMED)
1528 else if (s[1] == 'b'
1529 && ! isvar (&opP->disp)
1530 && (opP->disp.exp.X_op != O_constant
1531 || ! isbyte (opP->disp.exp.X_add_number)))
1533 else if (s[1] == 'B'
1534 && ! isvar (&opP->disp)
1535 && (opP->disp.exp.X_op != O_constant
1536 || ! issbyte (opP->disp.exp.X_add_number)))
1538 else if (s[1] == 'w'
1539 && ! isvar (&opP->disp)
1540 && (opP->disp.exp.X_op != O_constant
1541 || ! isword (opP->disp.exp.X_add_number)))
1543 else if (s[1] == 'W'
1544 && ! isvar (&opP->disp)
1545 && (opP->disp.exp.X_op != O_constant
1546 || ! issword (opP->disp.exp.X_add_number)))
1552 if (opP->mode != IMMED)
1557 if (opP->mode == AREG
1558 || opP->mode == CONTROL
1559 || opP->mode == FPREG
1560 || opP->mode == IMMED
1561 || opP->mode == REGLST
1562 || (opP->mode != ABSL
1564 || opP->reg == ZPC)))
1569 if (opP->mode == CONTROL
1570 || opP->mode == FPREG
1571 || opP->mode == REGLST
1572 || opP->mode == IMMED
1573 || (opP->mode != ABSL
1575 || opP->reg == ZPC)))
1603 if (opP->mode == CONTROL
1604 || opP->mode == FPREG
1605 || opP->mode == REGLST)
1610 if (opP->mode != AINC)
1615 if (opP->mode != ADEC)
1665 if (opP->reg == PC || opP->reg == ZPC)
1686 case '~': /* For now! (JF FOO is this right?) */
1708 if (opP->mode != CONTROL
1709 || (opP->reg != TT0 && opP->reg != TT1))
1714 if (opP->mode != AREG)
1719 if (opP->mode != AINDR)
1724 if (opP->mode != AINDR && opP->mode != AINC && opP->mode != ADEC
1725 && (opP->mode != DISP
1727 || opP->reg > ADDR7))
1732 if (opP->mode != ABSL
1734 && strncmp (instring, "jbsr", 4) == 0))
1757 if (opP->mode != CONTROL || opP->reg != CCR)
1762 if (opP->mode != DISP
1764 || opP->reg > ADDR7)
1769 if (opP->mode != DREG)
1774 if (opP->reg != ACC)
1779 if (opP->reg != ACC && opP->reg != ACC1
1780 && opP->reg != ACC2 && opP->reg != ACC3)
1785 if (opP->mode != FPREG)
1790 if (opP->reg != MACSR)
1795 if (opP->reg != ACCEXT01 && opP->reg != ACCEXT23)
1800 if (opP->reg != MASK)
1805 if (opP->mode != CONTROL
1812 if (opP->mode != LSH && opP->mode != RSH)
1817 if (opP->mode != CONTROL
1819 || opP->reg > last_movec_reg
1824 const enum m68k_register *rp;
1826 for (rp = control_regs; *rp; rp++)
1828 if (*rp == opP->reg)
1830 /* In most CPUs RAMBAR refers to control reg
1831 c05 (RAMBAR1), but a few CPUs have it
1832 refer to c04 (RAMBAR0). */
1833 else if (*rp == RAMBAR_ALT && opP->reg == RAMBAR)
1835 opP->reg = RAMBAR_ALT;
1845 if (opP->mode != IMMED)
1851 if (opP->mode == DREG
1852 || opP->mode == AREG
1853 || opP->mode == FPREG)
1862 opP->mask = 1 << (opP->reg - DATA0);
1865 opP->mask = 1 << (opP->reg - ADDR0 + 8);
1868 opP->mask = 1 << (opP->reg - FP0 + 16);
1876 else if (opP->mode == CONTROL)
1885 opP->mask = 1 << 24;
1888 opP->mask = 1 << 25;
1891 opP->mask = 1 << 26;
1900 else if (opP->mode != REGLST)
1902 else if (s[1] == '8' && (opP->mask & 0x0ffffff) != 0)
1904 else if (s[1] == '3' && (opP->mask & 0x7000000) != 0)
1909 if (opP->mode != IMMED)
1911 else if (opP->disp.exp.X_op != O_constant
1912 || ! issbyte (opP->disp.exp.X_add_number))
1914 else if (! m68k_quick
1915 && instring[3] != 'q'
1916 && instring[4] != 'q')
1921 if (opP->mode != DREG
1922 && opP->mode != IMMED
1923 && opP->mode != ABSL)
1928 if (opP->mode != IMMED)
1930 else if (opP->disp.exp.X_op != O_constant
1931 || TRUNC (opP->disp.exp.X_add_number) - 1 > 7)
1933 else if (! m68k_quick
1934 && (strncmp (instring, "add", 3) == 0
1935 || strncmp (instring, "sub", 3) == 0)
1936 && instring[3] != 'q')
1941 if (opP->mode != DREG && opP->mode != AREG)
1946 if (opP->mode != AINDR
1947 && (opP->mode != BASE
1949 && opP->reg != ZADDR0)
1950 || opP->disp.exp.X_op != O_absent
1951 || ((opP->index.reg < DATA0
1952 || opP->index.reg > DATA7)
1953 && (opP->index.reg < ADDR0
1954 || opP->index.reg > ADDR7))
1955 || opP->index.size != SIZE_UNSPEC
1956 || opP->index.scale != 1))
1961 if (opP->mode != CONTROL
1962 || ! (opP->reg == FPI
1964 || opP->reg == FPC))
1969 if (opP->mode != CONTROL || opP->reg != SR)
1974 if (opP->mode != IMMED)
1976 else if (opP->disp.exp.X_op != O_constant
1977 || TRUNC (opP->disp.exp.X_add_number) > 7)
1982 if (opP->mode != CONTROL || opP->reg != USP)
1987 if (opP->mode != IMMED)
1989 else if (opP->disp.exp.X_op != O_constant
1990 || (TRUNC (opP->disp.exp.X_add_number) != 0xffffffff
1991 && TRUNC (opP->disp.exp.X_add_number) - 1 > 6))
1996 if (opP->mode != IMMED)
1998 else if (opP->disp.exp.X_op != O_constant
1999 || TRUNC (opP->disp.exp.X_add_number) - 1 > 7)
2004 if (opP->mode != IMMED)
2006 else if (opP->disp.exp.X_op != O_constant
2007 || TRUNC (opP->disp.exp.X_add_number) > 511)
2011 /* JF these are out of order. We could put them
2012 in order if we were willing to put up with
2013 bunches of #ifdef m68851s in the code.
2015 Don't forget that you need these operands
2016 to use 68030 MMU instructions. */
2018 /* Memory addressing mode used by pflushr. */
2020 if (opP->mode == CONTROL
2021 || opP->mode == FPREG
2022 || opP->mode == DREG
2023 || opP->mode == AREG
2024 || opP->mode == REGLST)
2026 /* We should accept immediate operands, but they
2027 supposedly have to be quad word, and we don't
2028 handle that. I would like to see what a Motorola
2029 assembler does before doing something here. */
2030 if (opP->mode == IMMED)
2035 if (opP->mode != CONTROL
2036 || (opP->reg != SFC && opP->reg != DFC))
2041 if (opP->mode != CONTROL || opP->reg != TC)
2046 if (opP->mode != CONTROL || opP->reg != AC)
2051 if (opP->mode != CONTROL
2054 && opP->reg != SCC))
2059 if (opP->mode != CONTROL
2065 if (opP->mode != CONTROL
2068 && opP->reg != CRP))
2092 if (opP->mode != CONTROL
2093 || (!(opP->reg >= BAD && opP->reg <= BAD + 7)
2094 && !(opP->reg >= BAC && opP->reg <= BAC + 7)))
2099 if (opP->mode != CONTROL || opP->reg != PSR)
2104 if (opP->mode != CONTROL || opP->reg != PCSR)
2109 if (opP->mode != CONTROL
2118 if (opP->mode != ABSL)
2123 if (opP->reg < DATA0L || opP->reg > ADDR7U)
2125 /* FIXME: kludge instead of fixing parser:
2126 upper/lower registers are *not* CONTROL
2127 registers, but ordinary ones. */
2128 if ((opP->reg >= DATA0L && opP->reg <= DATA7L)
2129 || (opP->reg >= DATA0U && opP->reg <= DATA7U))
2136 if (!(opP->mode == AINDR
2137 || (opP->mode == DISP
2138 && !(opP->reg == PC || opP->reg == ZPC))))
2143 if (!(opP->mode == AINDR || opP->mode == DISP))
2155 /* Since we have found the correct instruction, copy
2156 in the modifications that we may have made. */
2158 for (i = 0; i < opsfound; i++)
2159 the_ins.operands[i] = operands_backup[i];
2165 opcode = opcode->m_next;
2170 && !(ok_arch & current_architecture))
2172 const struct m68k_cpu *cpu;
2175 char *buf = xmalloc (space + 1);
2179 the_ins.error = buf;
2180 /* Make sure there's a NUL at the end of the buffer -- strncpy
2181 won't write one when it runs out of buffer. */
2183 #define APPEND(STRING) \
2184 (strncpy (buf, STRING, space), len = strlen (buf), buf += len, space -= len)
2186 APPEND (_("invalid instruction for this architecture; needs "));
2190 APPEND ("ColdFire ISA_A");
2193 APPEND ("ColdFire ");
2194 APPEND (_("hardware divide"));
2197 APPEND ("ColdFire ISA_A+");
2200 APPEND ("ColdFire ISA_B");
2203 APPEND ("ColdFire ISA_C");
2206 APPEND ("ColdFire fpu");
2209 APPEND ("M68K fpu");
2212 APPEND ("M68K mmu");
2216 APPEND (_("or higher"));
2220 APPEND (_("or higher"));
2224 APPEND (_("or higher"));
2232 for (cpu = m68k_cpus; cpu->name; cpu++)
2233 if (!cpu->alias && (cpu->arch & ok_arch))
2235 const struct m68k_cpu *alias;
2236 int seen_master = 0;
2242 for (alias = cpu; alias != m68k_cpus; alias--)
2243 if (alias[-1].alias >= 0)
2245 for (; !seen_master || alias->alias > 0; alias++)
2255 APPEND (alias->name);
2268 /* We ran out of space, so replace the end of the list
2273 strcpy (buf, " ...");
2277 the_ins.error = _("operands mismatch");
2284 /* Now assemble it. */
2285 the_ins.args = opcode->m_operands;
2286 the_ins.numargs = opcode->m_opnum;
2287 the_ins.numo = opcode->m_codenum;
2288 the_ins.opcode[0] = getone (opcode);
2289 the_ins.opcode[1] = gettwo (opcode);
2291 for (s = the_ins.args, opP = &the_ins.operands[0]; *s; s += 2, opP++)
2296 /* This switch is a doozy.
2297 Watch the first step; its a big one! */
2330 tmpreg = 0x3c; /* 7.4 */
2331 if (strchr ("bwl", s[1]))
2332 nextword = get_num (&opP->disp, 90);
2334 nextword = get_num (&opP->disp, 0);
2335 if (isvar (&opP->disp))
2336 add_fix (s[1], &opP->disp, 0, 0);
2340 if (!isbyte (nextword))
2341 opP->error = _("operand out of range");
2346 if (!isword (nextword))
2347 opP->error = _("operand out of range");
2352 if (!issword (nextword))
2353 opP->error = _("operand out of range");
2358 addword (nextword >> 16);
2385 /* We gotta put out some float. */
2386 if (op (&opP->disp) != O_big)
2391 /* Can other cases happen here? */
2392 if (op (&opP->disp) != O_constant)
2395 val = (valueT) offs (&opP->disp);
2399 generic_bignum[gencnt] = (LITTLENUM_TYPE) val;
2400 val >>= LITTLENUM_NUMBER_OF_BITS;
2404 offs (&opP->disp) = gencnt;
2406 if (offs (&opP->disp) > 0)
2408 if (offs (&opP->disp) > baseo)
2410 as_warn (_("Bignum too big for %c format; truncated"),
2412 offs (&opP->disp) = baseo;
2414 baseo -= offs (&opP->disp);
2417 for (wordp = generic_bignum + offs (&opP->disp) - 1;
2418 offs (&opP->disp)--;
2423 gen_to_words (words, baseo, (long) outro);
2424 for (wordp = words; baseo--; wordp++)
2428 tmpreg = opP->reg - DATA; /* 0.dreg */
2431 tmpreg = 0x08 + opP->reg - ADDR; /* 1.areg */
2434 tmpreg = 0x10 + opP->reg - ADDR; /* 2.areg */
2437 tmpreg = 0x20 + opP->reg - ADDR; /* 4.areg */
2440 tmpreg = 0x18 + opP->reg - ADDR; /* 3.areg */
2444 nextword = get_num (&opP->disp, 90);
2446 /* Convert mode 5 addressing with a zero offset into
2447 mode 2 addressing to reduce the instruction size by a
2449 if (! isvar (&opP->disp)
2451 && (opP->disp.size == SIZE_UNSPEC)
2452 && (opP->reg >= ADDR0)
2453 && (opP->reg <= ADDR7))
2455 tmpreg = 0x10 + opP->reg - ADDR; /* 2.areg */
2460 && ! isvar (&opP->disp)
2463 opP->disp.exp.X_op = O_symbol;
2464 opP->disp.exp.X_add_symbol =
2465 section_symbol (absolute_section);
2468 /* Force into index mode. Hope this works. */
2470 /* We do the first bit for 32-bit displacements, and the
2471 second bit for 16 bit ones. It is possible that we
2472 should make the default be WORD instead of LONG, but
2473 I think that'd break GCC, so we put up with a little
2474 inefficiency for the sake of working output. */
2476 if (!issword (nextword)
2477 || (isvar (&opP->disp)
2478 && ((opP->disp.size == SIZE_UNSPEC
2479 && flag_short_refs == 0
2480 && cpu_of_arch (current_architecture) >= m68020
2481 && ! arch_coldfire_p (current_architecture))
2482 || opP->disp.size == SIZE_LONG)))
2484 if (cpu_of_arch (current_architecture) < m68020
2485 || arch_coldfire_p (current_architecture))
2487 _("displacement too large for this architecture; needs 68020 or higher");
2489 tmpreg = 0x3B; /* 7.3 */
2491 tmpreg = 0x30 + opP->reg - ADDR; /* 6.areg */
2492 if (isvar (&opP->disp))
2496 if (opP->disp.size == SIZE_LONG
2498 /* If the displacement needs pic
2499 relocation it cannot be relaxed. */
2500 || opP->disp.pic_reloc != pic_none
2505 add_fix ('l', &opP->disp, 1, 2);
2509 add_frag (adds (&opP->disp),
2510 SEXT (offs (&opP->disp)),
2511 TAB (PCREL1632, SZ_UNDEF));
2518 add_fix ('l', &opP->disp, 0, 0);
2523 addword (nextword >> 16);
2528 tmpreg = 0x3A; /* 7.2 */
2530 tmpreg = 0x28 + opP->reg - ADDR; /* 5.areg */
2532 if (isvar (&opP->disp))
2536 add_fix ('w', &opP->disp, 1, 0);
2539 add_fix ('w', &opP->disp, 0, 0);
2549 baseo = get_num (&opP->disp, 90);
2550 if (opP->mode == POST || opP->mode == PRE)
2551 outro = get_num (&opP->odisp, 90);
2552 /* Figure out the `addressing mode'.
2553 Also turn on the BASE_DISABLE bit, if needed. */
2554 if (opP->reg == PC || opP->reg == ZPC)
2556 tmpreg = 0x3b; /* 7.3 */
2557 if (opP->reg == ZPC)
2560 else if (opP->reg == 0)
2563 tmpreg = 0x30; /* 6.garbage */
2565 else if (opP->reg >= ZADDR0 && opP->reg <= ZADDR7)
2568 tmpreg = 0x30 + opP->reg - ZADDR0;
2571 tmpreg = 0x30 + opP->reg - ADDR; /* 6.areg */
2573 siz1 = opP->disp.size;
2574 if (opP->mode == POST || opP->mode == PRE)
2575 siz2 = opP->odisp.size;
2579 /* Index register stuff. */
2580 if (opP->index.reg != 0
2581 && opP->index.reg >= DATA
2582 && opP->index.reg <= ADDR7)
2584 nextword |= (opP->index.reg - DATA) << 12;
2586 if (opP->index.size == SIZE_LONG
2587 || (opP->index.size == SIZE_UNSPEC
2588 && m68k_index_width_default == SIZE_LONG))
2591 if ((opP->index.scale != 1
2592 && cpu_of_arch (current_architecture) < m68020)
2593 || (opP->index.scale == 8
2594 && (arch_coldfire_p (current_architecture)
2595 && !arch_coldfire_fpu (current_architecture))))
2598 _("scale factor invalid on this architecture; needs cpu32 or 68020 or higher");
2601 if (arch_coldfire_p (current_architecture)
2602 && opP->index.size == SIZE_WORD)
2603 opP->error = _("invalid index size for coldfire");
2605 switch (opP->index.scale)
2622 GET US OUT OF HERE! */
2624 /* Must be INDEX, with an index register. Address
2625 register cannot be ZERO-PC, and either :b was
2626 forced, or we know it will fit. For a 68000 or
2627 68010, force this mode anyways, because the
2628 larger modes aren't supported. */
2629 if (opP->mode == BASE
2630 && ((opP->reg >= ADDR0
2631 && opP->reg <= ADDR7)
2634 if (siz1 == SIZE_BYTE
2635 || cpu_of_arch (current_architecture) < m68020
2636 || arch_coldfire_p (current_architecture)
2637 || (siz1 == SIZE_UNSPEC
2638 && ! isvar (&opP->disp)
2639 && issbyte (baseo)))
2641 nextword += baseo & 0xff;
2643 if (isvar (&opP->disp))
2645 /* Do a byte relocation. If it doesn't
2646 fit (possible on m68000) let the
2647 fixup processing complain later. */
2649 add_fix ('B', &opP->disp, 1, 1);
2651 add_fix ('B', &opP->disp, 0, 0);
2653 else if (siz1 != SIZE_BYTE)
2655 if (siz1 != SIZE_UNSPEC)
2656 as_warn (_("Forcing byte displacement"));
2657 if (! issbyte (baseo))
2658 opP->error = _("byte displacement out of range");
2663 else if (siz1 == SIZE_UNSPEC
2665 && isvar (&opP->disp)
2666 && subs (&opP->disp) == NULL
2668 /* If the displacement needs pic
2669 relocation it cannot be relaxed. */
2670 && opP->disp.pic_reloc == pic_none
2674 /* The code in md_convert_frag_1 needs to be
2675 able to adjust nextword. Call frag_grow
2676 to ensure that we have enough space in
2677 the frag obstack to make all the bytes
2680 nextword += baseo & 0xff;
2682 add_frag (adds (&opP->disp),
2683 SEXT (offs (&opP->disp)),
2684 TAB (PCINDEX, SZ_UNDEF));
2692 nextword |= 0x40; /* No index reg. */
2693 if (opP->index.reg >= ZDATA0
2694 && opP->index.reg <= ZDATA7)
2695 nextword |= (opP->index.reg - ZDATA0) << 12;
2696 else if (opP->index.reg >= ZADDR0
2697 || opP->index.reg <= ZADDR7)
2698 nextword |= (opP->index.reg - ZADDR0 + 8) << 12;
2701 /* It isn't simple. */
2703 if (cpu_of_arch (current_architecture) < m68020
2704 || arch_coldfire_p (current_architecture))
2706 _("invalid operand mode for this architecture; needs 68020 or higher");
2709 /* If the guy specified a width, we assume that it is
2710 wide enough. Maybe it isn't. If so, we lose. */
2714 if (isvar (&opP->disp)
2716 : ! issword (baseo))
2721 else if (! isvar (&opP->disp) && baseo == 0)
2730 as_warn (_(":b not permitted; defaulting to :w"));
2740 /* Figure out inner displacement stuff. */
2741 if (opP->mode == POST || opP->mode == PRE)
2743 if (cpu_of_arch (current_architecture) & cpu32)
2744 opP->error = _("invalid operand mode for this architecture; needs 68020 or higher");
2748 if (isvar (&opP->odisp)
2750 : ! issword (outro))
2755 else if (! isvar (&opP->odisp) && outro == 0)
2764 as_warn (_(":b not permitted; defaulting to :w"));
2773 if (opP->mode == POST
2774 && (nextword & 0x40) == 0)
2779 if (siz1 != SIZE_UNSPEC && isvar (&opP->disp))
2781 if (opP->reg == PC || opP->reg == ZPC)
2782 add_fix (siz1 == SIZE_LONG ? 'l' : 'w', &opP->disp, 1, 2);
2784 add_fix (siz1 == SIZE_LONG ? 'l' : 'w', &opP->disp, 0, 0);
2786 if (siz1 == SIZE_LONG)
2787 addword (baseo >> 16);
2788 if (siz1 != SIZE_UNSPEC)
2791 if (siz2 != SIZE_UNSPEC && isvar (&opP->odisp))
2792 add_fix (siz2 == SIZE_LONG ? 'l' : 'w', &opP->odisp, 0, 0);
2793 if (siz2 == SIZE_LONG)
2794 addword (outro >> 16);
2795 if (siz2 != SIZE_UNSPEC)
2801 nextword = get_num (&opP->disp, 90);
2802 switch (opP->disp.size)
2807 if (!isvar (&opP->disp) && issword (offs (&opP->disp)))
2809 tmpreg = 0x38; /* 7.0 */
2813 if (isvar (&opP->disp)
2814 && !subs (&opP->disp)
2815 && adds (&opP->disp)
2817 /* If the displacement needs pic relocation it
2818 cannot be relaxed. */
2819 && opP->disp.pic_reloc == pic_none
2822 && !strchr ("~%&$?", s[0]))
2824 tmpreg = 0x3A; /* 7.2 */
2825 add_frag (adds (&opP->disp),
2826 SEXT (offs (&opP->disp)),
2827 TAB (ABSTOPCREL, SZ_UNDEF));
2830 /* Fall through into long. */
2832 if (isvar (&opP->disp))
2833 add_fix ('l', &opP->disp, 0, 0);
2835 tmpreg = 0x39;/* 7.1 mode */
2836 addword (nextword >> 16);
2841 as_bad (_("unsupported byte value; use a different suffix"));
2845 if (isvar (&opP->disp))
2846 add_fix ('w', &opP->disp, 0, 0);
2848 tmpreg = 0x38;/* 7.0 mode */
2856 as_bad (_("unknown/incorrect operand"));
2860 /* If s[0] is '4', then this is for the mac instructions
2861 that can have a trailing_ampersand set. If so, set 0x100
2862 bit on tmpreg so install_gen_operand can check for it and
2863 set the appropriate bit (word2, bit 5). */
2866 if (opP->trailing_ampersand)
2869 install_gen_operand (s[1], tmpreg);
2875 { /* JF: I hate floating point! */
2890 tmpreg = get_num (&opP->disp, tmpreg);
2891 if (isvar (&opP->disp))
2892 add_fix (s[1], &opP->disp, 0, 0);
2895 case 'b': /* Danger: These do no check for
2896 certain types of overflow.
2898 if (!isbyte (tmpreg))
2899 opP->error = _("out of range");
2900 insop (tmpreg, opcode);
2901 if (isvar (&opP->disp))
2902 the_ins.reloc[the_ins.nrel - 1].n =
2903 (opcode->m_codenum) * 2 + 1;
2906 if (!issbyte (tmpreg))
2907 opP->error = _("out of range");
2908 the_ins.opcode[the_ins.numo - 1] |= tmpreg & 0xff;
2909 if (isvar (&opP->disp))
2910 the_ins.reloc[the_ins.nrel - 1].n = opcode->m_codenum * 2 - 1;
2913 if (!isword (tmpreg))
2914 opP->error = _("out of range");
2915 insop (tmpreg, opcode);
2916 if (isvar (&opP->disp))
2917 the_ins.reloc[the_ins.nrel - 1].n = (opcode->m_codenum) * 2;
2920 if (!issword (tmpreg))
2921 opP->error = _("out of range");
2922 insop (tmpreg, opcode);
2923 if (isvar (&opP->disp))
2924 the_ins.reloc[the_ins.nrel - 1].n = (opcode->m_codenum) * 2;
2927 /* Because of the way insop works, we put these two out
2929 insop (tmpreg, opcode);
2930 insop (tmpreg >> 16, opcode);
2931 if (isvar (&opP->disp))
2932 the_ins.reloc[the_ins.nrel - 1].n = (opcode->m_codenum) * 2;
2939 install_operand (s[1], tmpreg);
2950 install_operand (s[1], opP->reg - ADDR);
2954 tmpreg = get_num (&opP->disp, 90);
2959 add_fix ('B', &opP->disp, 1, -1);
2962 add_fix ('w', &opP->disp, 1, 0);
2967 the_ins.opcode[0] |= 0xff;
2968 add_fix ('l', &opP->disp, 1, 0);
2972 case 'g': /* Conditional branch */
2973 have_disp = HAVE_LONG_CALL (current_architecture);
2976 case 'b': /* Unconditional branch */
2977 have_disp = HAVE_LONG_BRANCH (current_architecture);
2978 use_pl = LONG_BRANCH_VIA_COND (current_architecture);
2981 case 's': /* Unconditional subroutine */
2982 have_disp = HAVE_LONG_CALL (current_architecture);
2985 if (subs (&opP->disp) /* We can't relax it. */
2987 /* If the displacement needs pic relocation it cannot be
2989 || opP->disp.pic_reloc != pic_none
2994 as_warn (_("Can't use long branches on this architecture"));
2998 /* This could either be a symbol, or an absolute
2999 address. If it's an absolute address, turn it into
3000 an absolute jump right here and keep it out of the
3002 if (adds (&opP->disp) == 0)
3004 if (the_ins.opcode[0] == 0x6000) /* jbra */
3005 the_ins.opcode[0] = 0x4EF9;
3006 else if (the_ins.opcode[0] == 0x6100) /* jbsr */
3007 the_ins.opcode[0] = 0x4EB9;
3010 the_ins.opcode[0] ^= 0x0100;
3011 the_ins.opcode[0] |= 0x0006;
3014 add_fix ('l', &opP->disp, 0, 0);
3020 /* Now we know it's going into the relaxer. Now figure
3021 out which mode. We try in this order of preference:
3022 long branch, absolute jump, byte/word branches only. */
3024 add_frag (adds (&opP->disp),
3025 SEXT (offs (&opP->disp)),
3026 TAB (BRANCHBWL, SZ_UNDEF));
3027 else if (! flag_keep_pcrel)
3029 if ((the_ins.opcode[0] == 0x6000)
3030 || (the_ins.opcode[0] == 0x6100))
3031 add_frag (adds (&opP->disp),
3032 SEXT (offs (&opP->disp)),
3033 TAB (BRABSJUNC, SZ_UNDEF));
3035 add_frag (adds (&opP->disp),
3036 SEXT (offs (&opP->disp)),
3037 TAB (BRABSJCOND, SZ_UNDEF));
3040 add_frag (adds (&opP->disp),
3041 SEXT (offs (&opP->disp)),
3042 (use_pl ? TAB (BRANCHBWPL, SZ_UNDEF)
3043 : TAB (BRANCHBW, SZ_UNDEF)));
3046 if (isvar (&opP->disp))
3048 /* Check for DBcc instructions. We can relax them,
3049 but only if we have long branches and/or absolute
3051 if (((the_ins.opcode[0] & 0xf0f8) == 0x50c8)
3052 && (HAVE_LONG_BRANCH (current_architecture)
3053 || ! flag_keep_pcrel))
3055 if (HAVE_LONG_BRANCH (current_architecture))
3056 add_frag (adds (&opP->disp),
3057 SEXT (offs (&opP->disp)),
3058 TAB (DBCCLBR, SZ_UNDEF));
3060 add_frag (adds (&opP->disp),
3061 SEXT (offs (&opP->disp)),
3062 TAB (DBCCABSJ, SZ_UNDEF));
3065 add_fix ('w', &opP->disp, 1, 0);
3069 case 'C': /* Fixed size LONG coproc branches. */
3070 add_fix ('l', &opP->disp, 1, 0);
3074 case 'c': /* Var size Coprocesssor branches. */
3075 if (subs (&opP->disp) || (adds (&opP->disp) == 0))
3077 the_ins.opcode[the_ins.numo - 1] |= 0x40;
3078 add_fix ('l', &opP->disp, 1, 0);
3083 add_frag (adds (&opP->disp),
3084 SEXT (offs (&opP->disp)),
3085 TAB (FBRANCH, SZ_UNDEF));
3092 case 'C': /* Ignore it. */
3095 case 'd': /* JF this is a kludge. */
3096 install_operand ('s', opP->reg - ADDR);
3097 tmpreg = get_num (&opP->disp, 90);
3098 if (!issword (tmpreg))
3100 as_warn (_("Expression out of range, using 0"));
3107 install_operand (s[1], opP->reg - DATA);
3110 case 'e': /* EMAC ACCx, reg/reg. */
3111 install_operand (s[1], opP->reg - ACC);
3114 case 'E': /* Ignore it. */
3118 install_operand (s[1], opP->reg - FP0);
3121 case 'g': /* EMAC ACCEXTx. */
3122 install_operand (s[1], opP->reg - ACCEXT01);
3125 case 'G': /* Ignore it. */
3130 tmpreg = opP->reg - COP0;
3131 install_operand (s[1], tmpreg);
3134 case 'i': /* MAC/EMAC scale factor. */
3135 install_operand (s[1], opP->mode == LSH ? 0x1 : 0x3);
3138 case 'J': /* JF foo. */
3278 install_operand (s[1], tmpreg);
3282 tmpreg = get_num (&opP->disp, 55);
3283 install_operand (s[1], tmpreg & 0x7f);
3290 if (tmpreg & 0x7FF0000)
3291 as_bad (_("Floating point register in register list"));
3292 insop (reverse_16_bits (tmpreg), opcode);
3296 if (tmpreg & 0x700FFFF)
3297 as_bad (_("Wrong register in floating-point reglist"));
3298 install_operand (s[1], reverse_8_bits (tmpreg >> 16));
3306 if (tmpreg & 0x7FF0000)
3307 as_bad (_("Floating point register in register list"));
3308 insop (tmpreg, opcode);
3310 else if (s[1] == '8')
3312 if (tmpreg & 0x0FFFFFF)
3313 as_bad (_("incorrect register in reglist"));
3314 install_operand (s[1], tmpreg >> 24);
3318 if (tmpreg & 0x700FFFF)
3319 as_bad (_("wrong register in floating-point reglist"));
3321 install_operand (s[1], tmpreg >> 16);
3326 install_operand (s[1], get_num (&opP->disp, 60));
3330 tmpreg = ((opP->mode == DREG)
3331 ? 0x20 + (int) (opP->reg - DATA)
3332 : (get_num (&opP->disp, 40) & 0x1F));
3333 install_operand (s[1], tmpreg);
3337 tmpreg = get_num (&opP->disp, 10);
3340 install_operand (s[1], tmpreg);
3344 /* This depends on the fact that ADDR registers are eight
3345 more than their corresponding DATA regs, so the result
3346 will have the ADDR_REG bit set. */
3347 install_operand (s[1], opP->reg - DATA);
3351 if (opP->mode == AINDR)
3352 install_operand (s[1], opP->reg - DATA);
3354 install_operand (s[1], opP->index.reg - DATA);
3358 if (opP->reg == FPI)
3360 else if (opP->reg == FPS)
3362 else if (opP->reg == FPC)
3366 install_operand (s[1], tmpreg);
3369 case 'S': /* Ignore it. */
3373 install_operand (s[1], get_num (&opP->disp, 30));
3376 case 'U': /* Ignore it. */
3395 as_fatal (_("failed sanity check"));
3396 } /* switch on cache token. */
3397 install_operand (s[1], tmpreg);
3400 /* JF: These are out of order, I fear. */
3413 install_operand (s[1], tmpreg);
3439 install_operand (s[1], tmpreg);
3443 if (opP->reg == VAL)
3462 install_operand (s[1], tmpreg);
3476 tmpreg = (4 << 10) | ((opP->reg - BAD) << 2);
3487 tmpreg = (5 << 10) | ((opP->reg - BAC) << 2);
3493 install_operand (s[1], tmpreg);
3496 know (opP->reg == PSR);
3499 know (opP->reg == PCSR);
3514 install_operand (s[1], tmpreg);
3517 tmpreg = get_num (&opP->disp, 20);
3518 install_operand (s[1], tmpreg);
3520 case '_': /* used only for move16 absolute 32-bit address. */
3521 if (isvar (&opP->disp))
3522 add_fix ('l', &opP->disp, 0, 0);
3523 tmpreg = get_num (&opP->disp, 90);
3524 addword (tmpreg >> 16);
3525 addword (tmpreg & 0xFFFF);
3528 install_operand (s[1], opP->reg - DATA0L);
3529 opP->reg -= (DATA0L);
3530 opP->reg &= 0x0F; /* remove upper/lower bit. */
3533 tmpreg = get_num (&opP->disp, 80);
3536 install_operand (s[1], tmpreg);
3539 tmpreg = get_num (&opP->disp, 10);
3540 install_operand (s[1], tmpreg - 1);
3543 tmpreg = get_num (&opP->disp, 65);
3544 install_operand (s[1], tmpreg);
3551 /* By the time whe get here (FINALLY) the_ins contains the complete
3552 instruction, ready to be emitted. . . */
3556 reverse_16_bits (int in)
3561 static int mask[16] =
3563 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
3564 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000
3566 for (n = 0; n < 16; n++)
3569 out |= mask[15 - n];
3572 } /* reverse_16_bits() */
3575 reverse_8_bits (int in)
3580 static int mask[8] =
3582 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
3585 for (n = 0; n < 8; n++)
3591 } /* reverse_8_bits() */
3593 /* Cause an extra frag to be generated here, inserting up to
3594 FRAG_VAR_SIZE bytes. TYPE is the subtype of the frag to be
3595 generated; its primary type is rs_machine_dependent.
3597 The TYPE parameter is also used by md_convert_frag_1 and
3598 md_estimate_size_before_relax. The appropriate type of fixup will
3599 be emitted by md_convert_frag_1.
3601 ADD becomes the FR_SYMBOL field of the frag, and OFF the FR_OFFSET. */
3603 install_operand (int mode, int val)
3608 the_ins.opcode[0] |= val & 0xFF; /* JF FF is for M kludge. */
3611 the_ins.opcode[0] |= val << 9;
3614 the_ins.opcode[1] |= val << 9;
3617 the_ins.opcode[1] |= val << 12;
3620 the_ins.opcode[1] |= val << 6;
3623 the_ins.opcode[1] |= val;
3626 the_ins.opcode[2] |= val << 12;
3629 the_ins.opcode[2] |= val << 6;
3632 /* DANGER! This is a hack to force cas2l and cas2w cmds to be
3633 three words long! */
3635 the_ins.opcode[2] |= val;
3638 the_ins.opcode[1] |= val << 7;
3641 the_ins.opcode[1] |= val << 10;
3645 the_ins.opcode[1] |= val << 5;
3650 the_ins.opcode[1] |= (val << 10) | (val << 7);
3653 the_ins.opcode[1] |= (val << 12) | val;
3656 the_ins.opcode[0] |= val = 0xff;
3659 the_ins.opcode[0] |= val << 9;
3662 the_ins.opcode[1] |= val;
3665 the_ins.opcode[1] |= val;
3666 the_ins.numo++; /* What a hack. */
3669 the_ins.opcode[1] |= val << 4;
3677 the_ins.opcode[0] |= (val << 6);
3680 the_ins.opcode[1] = (val >> 16);
3681 the_ins.opcode[2] = val & 0xffff;
3684 the_ins.opcode[0] |= ((val & 0x8) << (6 - 3));
3685 the_ins.opcode[0] |= ((val & 0x7) << 9);
3686 the_ins.opcode[1] |= ((val & 0x10) << (7 - 4));
3688 case 'n': /* MAC/EMAC Rx on !load. */
3689 the_ins.opcode[0] |= ((val & 0x8) << (6 - 3));
3690 the_ins.opcode[0] |= ((val & 0x7) << 9);
3691 the_ins.opcode[1] |= ((val & 0x10) << (7 - 4));
3693 case 'o': /* MAC/EMAC Rx on load. */
3694 the_ins.opcode[1] |= val << 12;
3695 the_ins.opcode[1] |= ((val & 0x10) << (7 - 4));
3697 case 'M': /* MAC/EMAC Ry on !load. */
3698 the_ins.opcode[0] |= (val & 0xF);
3699 the_ins.opcode[1] |= ((val & 0x10) << (6 - 4));
3701 case 'N': /* MAC/EMAC Ry on load. */
3702 the_ins.opcode[1] |= (val & 0xF);
3703 the_ins.opcode[1] |= ((val & 0x10) << (6 - 4));
3706 the_ins.opcode[1] |= ((val != 1) << 10);
3709 the_ins.opcode[0] |= ((val & 0x3) << 9);
3712 the_ins.opcode[0] |= ((val & 0x3) << 0);
3714 case 'G': /* EMAC accumulator in a EMAC load instruction. */
3715 the_ins.opcode[0] |= ((~val & 0x1) << 7);
3716 the_ins.opcode[1] |= ((val & 0x2) << (4 - 1));
3718 case 'H': /* EMAC accumulator in a EMAC non-load instruction. */
3719 the_ins.opcode[0] |= ((val & 0x1) << 7);
3720 the_ins.opcode[1] |= ((val & 0x2) << (4 - 1));
3723 the_ins.opcode[1] |= ((val & 0x3) << 9);
3726 the_ins.opcode[0] |= (val & 0x1) <<10;
3730 as_fatal (_("failed sanity check."));
3735 install_gen_operand (int mode, int val)
3739 case '/': /* Special for mask loads for mac/msac insns with
3740 possible mask; trailing_ampersend set in bit 8. */
3741 the_ins.opcode[0] |= (val & 0x3f);
3742 the_ins.opcode[1] |= (((val & 0x100) >> 8) << 5);
3745 the_ins.opcode[0] |= val;
3748 /* This is a kludge!!! */
3749 the_ins.opcode[0] |= (val & 0x07) << 9 | (val & 0x38) << 3;
3758 the_ins.opcode[0] |= val;
3760 /* more stuff goes here. */
3762 as_fatal (_("failed sanity check."));
3766 /* Verify that we have some number of paren pairs, do m68k_ip_op(), and
3767 then deal with the bitfield hack. */
3770 crack_operand (char *str, struct m68k_op *opP)
3772 register int parens;
3774 register char *beg_str;
3782 for (parens = 0; *str && (parens > 0 || inquote || notend (str)); str++)
3788 else if (*str == ')')
3792 opP->error = _("Extra )");
3798 if (flag_mri && *str == '\'')
3799 inquote = ! inquote;
3801 if (!*str && parens)
3803 opP->error = _("Missing )");
3808 if (m68k_ip_op (beg_str, opP) != 0)
3815 c = *++str; /* JF bitfield hack. */
3820 as_bad (_("Missing operand"));
3823 /* Detect MRI REG symbols and convert them to REGLSTs. */
3824 if (opP->mode == CONTROL && (int)opP->reg < 0)
3827 opP->mask = ~(int)opP->reg;
3834 /* This is the guts of the machine-dependent assembler. STR points to a
3835 machine dependent instruction. This function is supposed to emit
3836 the frags/bytes it assembles to.
3840 insert_reg (const char *regname, int regnum)
3845 #ifdef REGISTER_PREFIX
3846 if (!flag_reg_prefix_optional)
3848 buf[0] = REGISTER_PREFIX;
3849 strcpy (buf + 1, regname);
3854 symbol_table_insert (symbol_new (regname, reg_section, regnum,
3855 &zero_address_frag));
3857 for (i = 0; regname[i]; i++)
3858 buf[i] = TOUPPER (regname[i]);
3861 symbol_table_insert (symbol_new (buf, reg_section, regnum,
3862 &zero_address_frag));
3871 static const struct init_entry init_table[] =
3931 { "accext01", ACCEXT01 },
3932 { "accext23", ACCEXT23 },
3936 /* Control registers. */
3937 { "sfc", SFC }, /* Source Function Code. */
3939 { "dfc", DFC }, /* Destination Function Code. */
3941 { "cacr", CACR }, /* Cache Control Register. */
3942 { "caar", CAAR }, /* Cache Address Register. */
3944 { "usp", USP }, /* User Stack Pointer. */
3945 { "vbr", VBR }, /* Vector Base Register. */
3946 { "msp", MSP }, /* Master Stack Pointer. */
3947 { "isp", ISP }, /* Interrupt Stack Pointer. */
3949 { "itt0", ITT0 }, /* Instruction Transparent Translation Reg 0. */
3950 { "itt1", ITT1 }, /* Instruction Transparent Translation Reg 1. */
3951 { "dtt0", DTT0 }, /* Data Transparent Translation Register 0. */
3952 { "dtt1", DTT1 }, /* Data Transparent Translation Register 1. */
3954 /* 68ec040 versions of same */
3955 { "iacr0", ITT0 }, /* Instruction Access Control Register 0. */
3956 { "iacr1", ITT1 }, /* Instruction Access Control Register 0. */
3957 { "dacr0", DTT0 }, /* Data Access Control Register 0. */
3958 { "dacr1", DTT1 }, /* Data Access Control Register 0. */
3960 /* Coldfire versions of same. The ColdFire programmer's reference
3961 manual indicated that the order is 2,3,0,1, but Ken Rose
3962 <rose@netcom.com> says that 0,1,2,3 is the correct order. */
3963 { "acr0", ACR0 }, /* Access Control Unit 0. */
3964 { "acr1", ACR1 }, /* Access Control Unit 1. */
3965 { "acr2", ACR2 }, /* Access Control Unit 2. */
3966 { "acr3", ACR3 }, /* Access Control Unit 3. */
3968 { "tc", TC }, /* MMU Translation Control Register. */
3972 { "mmusr", MMUSR }, /* MMU Status Register. */
3973 { "srp", SRP }, /* User Root Pointer. */
3974 { "urp", URP }, /* Supervisor Root Pointer. */
3977 { "mmubar", MMUBAR },
3980 { "rombar", ROMBAR }, /* ROM Base Address Register. */
3981 { "rambar0", RAMBAR0 }, /* ROM Base Address Register. */
3982 { "rambar1", RAMBAR1 }, /* ROM Base Address Register. */
3983 { "mbar", MBAR }, /* Module Base Address Register. */
3985 { "mbar0", MBAR0 }, /* mcfv4e registers. */
3986 { "mbar1", MBAR1 }, /* mcfv4e registers. */
3987 { "rombar0", ROMBAR0 }, /* mcfv4e registers. */
3988 { "rombar1", ROMBAR1 }, /* mcfv4e registers. */
3989 { "mpcr", MPCR }, /* mcfv4e registers. */
3990 { "edrambar", EDRAMBAR }, /* mcfv4e registers. */
3991 { "secmbar", SECMBAR }, /* mcfv4e registers. */
3992 { "asid", TC }, /* mcfv4e registers. */
3993 { "mmubar", BUSCR }, /* mcfv4e registers. */
3994 { "pcr1u0", PCR1U0 }, /* mcfv4e registers. */
3995 { "pcr1l0", PCR1L0 }, /* mcfv4e registers. */
3996 { "pcr2u0", PCR2U0 }, /* mcfv4e registers. */
3997 { "pcr2l0", PCR2L0 }, /* mcfv4e registers. */
3998 { "pcr3u0", PCR3U0 }, /* mcfv4e registers. */
3999 { "pcr3l0", PCR3L0 }, /* mcfv4e registers. */
4000 { "pcr1u1", PCR1U1 }, /* mcfv4e registers. */
4001 { "pcr1l1", PCR1L1 }, /* mcfv4e registers. */
4002 { "pcr2u1", PCR2U1 }, /* mcfv4e registers. */
4003 { "pcr2l1", PCR2L1 }, /* mcfv4e registers. */
4004 { "pcr3u1", PCR3U1 }, /* mcfv4e registers. */
4005 { "pcr3l1", PCR3L1 }, /* mcfv4e registers. */
4007 { "flashbar", FLASHBAR }, /* mcf528x registers. */
4008 { "rambar", RAMBAR }, /* mcf528x registers. */
4010 { "mbar2", MBAR2 }, /* mcf5249 registers. */
4012 { "cac", CAC }, /* fido registers. */
4013 { "mbb", MBO }, /* fido registers (obsolete). */
4014 { "mbo", MBO }, /* fido registers. */
4015 /* End of control registers. */
4049 /* 68ec030 versions of same. */
4052 /* 68ec030 access control unit, identical to 030 MMU status reg. */
4055 /* Suppressed data and address registers. */
4073 /* Upper and lower data and address registers, used by macw and msacw. */
4114 init_regtable (void)
4117 for (i = 0; init_table[i].name; i++)
4118 insert_reg (init_table[i].name, init_table[i].number);
4122 md_assemble (char *str)
4129 int shorts_this_frag;
4132 if (!selected_cpu && !selected_arch)
4134 /* We've not selected an architecture yet. Set the default
4135 now. We do this lazily so that an initial .cpu or .arch directive
4137 if (!m68k_set_cpu (TARGET_CPU, 1, 1))
4138 as_bad (_("unrecognized default cpu `%s'"), TARGET_CPU);
4143 /* In MRI mode, the instruction and operands are separated by a
4144 space. Anything following the operands is a comment. The label
4145 has already been removed. */
4153 for (s = str; *s != '\0'; s++)
4155 if ((*s == ' ' || *s == '\t') && ! inquote)
4173 inquote = ! inquote;
4178 memset (&the_ins, '\0', sizeof (the_ins));
4183 for (n = 0; n < the_ins.numargs; n++)
4184 if (the_ins.operands[n].error)
4186 er = the_ins.operands[n].error;
4192 as_bad (_("%s -- statement `%s' ignored"), er, str);
4196 /* If there is a current label, record that it marks an instruction. */
4197 if (current_label != NULL)
4199 current_label->text = 1;
4200 current_label = NULL;
4204 /* Tie dwarf2 debug info to the address at the start of the insn. */
4205 dwarf2_emit_insn (0);
4208 if (the_ins.nfrag == 0)
4210 /* No frag hacking involved; just put it out. */
4211 toP = frag_more (2 * the_ins.numo);
4212 fromP = &the_ins.opcode[0];
4213 for (m = the_ins.numo; m; --m)
4215 md_number_to_chars (toP, (long) (*fromP), 2);
4219 /* Put out symbol-dependent info. */
4220 for (m = 0; m < the_ins.nrel; m++)
4222 switch (the_ins.reloc[m].wid)
4241 as_fatal (_("Don't know how to figure width of %c in md_assemble()"),
4242 the_ins.reloc[m].wid);
4245 fixP = fix_new_exp (frag_now,
4246 ((toP - frag_now->fr_literal)
4247 - the_ins.numo * 2 + the_ins.reloc[m].n),
4249 &the_ins.reloc[m].exp,
4250 the_ins.reloc[m].pcrel,
4251 get_reloc_code (n, the_ins.reloc[m].pcrel,
4252 the_ins.reloc[m].pic_reloc));
4253 fixP->fx_pcrel_adjust = the_ins.reloc[m].pcrel_fix;
4254 if (the_ins.reloc[m].wid == 'B')
4255 fixP->fx_signed = 1;
4260 /* There's some frag hacking. */
4262 /* Calculate the max frag size. */
4265 wid = 2 * the_ins.fragb[0].fragoff;
4266 for (n = 1; n < the_ins.nfrag; n++)
4267 wid += 2 * (the_ins.numo - the_ins.fragb[n - 1].fragoff);
4268 /* frag_var part. */
4269 wid += FRAG_VAR_SIZE;
4270 /* Make sure the whole insn fits in one chunk, in particular that
4271 the var part is attached, as we access one byte before the
4272 variable frag for byte branches. */
4276 for (n = 0, fromP = &the_ins.opcode[0]; n < the_ins.nfrag; n++)
4281 wid = 2 * the_ins.fragb[n].fragoff;
4283 wid = 2 * (the_ins.numo - the_ins.fragb[n - 1].fragoff);
4284 toP = frag_more (wid);
4286 shorts_this_frag = 0;
4287 for (m = wid / 2; m; --m)
4289 md_number_to_chars (toP, (long) (*fromP), 2);
4294 for (m = 0; m < the_ins.nrel; m++)
4296 if ((the_ins.reloc[m].n) >= 2 * shorts_this_frag)
4298 the_ins.reloc[m].n -= 2 * shorts_this_frag;
4301 wid = the_ins.reloc[m].wid;
4304 the_ins.reloc[m].wid = 0;
4305 wid = (wid == 'b') ? 1 : (wid == 'w') ? 2 : (wid == 'l') ? 4 : 4000;
4307 fixP = fix_new_exp (frag_now,
4308 ((toP - frag_now->fr_literal)
4309 - the_ins.numo * 2 + the_ins.reloc[m].n),
4311 &the_ins.reloc[m].exp,
4312 the_ins.reloc[m].pcrel,
4313 get_reloc_code (wid, the_ins.reloc[m].pcrel,
4314 the_ins.reloc[m].pic_reloc));
4315 fixP->fx_pcrel_adjust = the_ins.reloc[m].pcrel_fix;
4317 (void) frag_var (rs_machine_dependent, FRAG_VAR_SIZE, 0,
4318 (relax_substateT) (the_ins.fragb[n].fragty),
4319 the_ins.fragb[n].fadd, the_ins.fragb[n].foff, to_beg_P);
4321 n = (the_ins.numo - the_ins.fragb[n - 1].fragoff);
4322 shorts_this_frag = 0;
4325 toP = frag_more (n * 2);
4328 md_number_to_chars (toP, (long) (*fromP), 2);
4334 for (m = 0; m < the_ins.nrel; m++)
4338 wid = the_ins.reloc[m].wid;
4341 the_ins.reloc[m].wid = 0;
4342 wid = (wid == 'b') ? 1 : (wid == 'w') ? 2 : (wid == 'l') ? 4 : 4000;
4344 fixP = fix_new_exp (frag_now,
4345 ((the_ins.reloc[m].n + toP - frag_now->fr_literal)
4346 - shorts_this_frag * 2),
4348 &the_ins.reloc[m].exp,
4349 the_ins.reloc[m].pcrel,
4350 get_reloc_code (wid, the_ins.reloc[m].pcrel,
4351 the_ins.reloc[m].pic_reloc));
4352 fixP->fx_pcrel_adjust = the_ins.reloc[m].pcrel_fix;
4356 /* Comparison function used by qsort to rank the opcode entries by name. */
4359 m68k_compare_opcode (const void * v1, const void * v2)
4361 struct m68k_opcode * op1, * op2;
4367 op1 = *(struct m68k_opcode **) v1;
4368 op2 = *(struct m68k_opcode **) v2;
4370 /* Compare the two names. If different, return the comparison.
4371 If the same, return the order they are in the opcode table. */
4372 ret = strcmp (op1->name, op2->name);
4383 const struct m68k_opcode *ins;
4384 struct m68k_incant *hack, *slak;
4385 const char *retval = 0; /* Empty string, or error msg text. */
4388 /* Set up hash tables with 68000 instructions.
4389 similar to what the vax assembler does. */
4390 /* RMS claims the thing to do is take the m68k-opcode.h table, and make
4391 a copy of it at runtime, adding in the information we want but isn't
4392 there. I think it'd be better to have an awk script hack the table
4393 at compile time. Or even just xstr the table and use it as-is. But
4394 my lord ghod hath spoken, so we do it this way. Excuse the ugly var
4399 flag_reg_prefix_optional = 1;
4401 if (! m68k_rel32_from_cmdline)
4405 /* First sort the opcode table into alphabetical order to seperate
4406 the order that the assembler wants to see the opcodes from the
4407 order that the disassembler wants to see them. */
4408 m68k_sorted_opcodes = xmalloc (m68k_numopcodes * sizeof (* m68k_sorted_opcodes));
4409 if (!m68k_sorted_opcodes)
4410 as_fatal (_("Internal Error: Can't allocate m68k_sorted_opcodes of size %d"),
4411 m68k_numopcodes * ((int) sizeof (* m68k_sorted_opcodes)));
4413 for (i = m68k_numopcodes; i--;)
4414 m68k_sorted_opcodes[i] = m68k_opcodes + i;
4416 qsort (m68k_sorted_opcodes, m68k_numopcodes,
4417 sizeof (m68k_sorted_opcodes[0]), m68k_compare_opcode);
4419 op_hash = hash_new ();
4421 obstack_begin (&robyn, 4000);
4422 for (i = 0; i < m68k_numopcodes; i++)
4424 hack = slak = (struct m68k_incant *) obstack_alloc (&robyn, sizeof (struct m68k_incant));
4427 ins = m68k_sorted_opcodes[i];
4429 /* We must enter all insns into the table, because .arch and
4430 .cpu directives can change things. */
4431 slak->m_operands = ins->args;
4432 slak->m_arch = ins->arch;
4433 slak->m_opcode = ins->opcode;
4435 /* In most cases we can determine the number of opcode words
4436 by checking the second word of the mask. Unfortunately
4437 some instructions have 2 opcode words, but no fixed bits
4438 in the second word. A leading dot in the operands
4439 string also indicates 2 opcodes. */
4440 if (*slak->m_operands == '.')
4443 slak->m_codenum = 2;
4445 else if (ins->match & 0xffffL)
4446 slak->m_codenum = 2;
4448 slak->m_codenum = 1;
4449 slak->m_opnum = strlen (slak->m_operands) / 2;
4451 if (i + 1 != m68k_numopcodes
4452 && !strcmp (ins->name, m68k_sorted_opcodes[i + 1]->name))
4454 slak->m_next = obstack_alloc (&robyn, sizeof (struct m68k_incant));
4459 slak = slak->m_next;
4463 retval = hash_insert (op_hash, ins->name, (char *) hack);
4465 as_fatal (_("Internal Error: Can't hash %s: %s"), ins->name, retval);
4468 for (i = 0; i < m68k_numaliases; i++)
4470 const char *name = m68k_opcode_aliases[i].primary;
4471 const char *alias = m68k_opcode_aliases[i].alias;
4472 PTR val = hash_find (op_hash, name);
4475 as_fatal (_("Internal Error: Can't find %s in hash table"), name);
4476 retval = hash_insert (op_hash, alias, val);
4478 as_fatal (_("Internal Error: Can't hash %s: %s"), alias, retval);
4481 /* In MRI mode, all unsized branches are variable sized. Normally,
4482 they are word sized. */
4485 static struct m68k_opcode_alias mri_aliases[] =
4506 i < (int) (sizeof mri_aliases / sizeof mri_aliases[0]);
4509 const char *name = mri_aliases[i].primary;
4510 const char *alias = mri_aliases[i].alias;
4511 PTR val = hash_find (op_hash, name);
4514 as_fatal (_("Internal Error: Can't find %s in hash table"), name);
4515 retval = hash_jam (op_hash, alias, val);
4517 as_fatal (_("Internal Error: Can't hash %s: %s"), alias, retval);
4521 for (i = 0; i < (int) sizeof (notend_table); i++)
4523 notend_table[i] = 0;
4524 alt_notend_table[i] = 0;
4527 notend_table[','] = 1;
4528 notend_table['{'] = 1;
4529 notend_table['}'] = 1;
4530 alt_notend_table['a'] = 1;
4531 alt_notend_table['A'] = 1;
4532 alt_notend_table['d'] = 1;
4533 alt_notend_table['D'] = 1;
4534 alt_notend_table['#'] = 1;
4535 alt_notend_table['&'] = 1;
4536 alt_notend_table['f'] = 1;
4537 alt_notend_table['F'] = 1;
4538 #ifdef REGISTER_PREFIX
4539 alt_notend_table[REGISTER_PREFIX] = 1;
4542 /* We need to put '(' in alt_notend_table to handle
4543 cas2 %d0:%d2,%d3:%d4,(%a0):(%a1) */
4544 alt_notend_table['('] = 1;
4546 /* We need to put '@' in alt_notend_table to handle
4547 cas2 %d0:%d2,%d3:%d4,@(%d0):@(%d1) */
4548 alt_notend_table['@'] = 1;
4550 /* We need to put digits in alt_notend_table to handle
4551 bfextu %d0{24:1},%d0 */
4552 alt_notend_table['0'] = 1;
4553 alt_notend_table['1'] = 1;
4554 alt_notend_table['2'] = 1;
4555 alt_notend_table['3'] = 1;
4556 alt_notend_table['4'] = 1;
4557 alt_notend_table['5'] = 1;
4558 alt_notend_table['6'] = 1;
4559 alt_notend_table['7'] = 1;
4560 alt_notend_table['8'] = 1;
4561 alt_notend_table['9'] = 1;
4563 #ifndef MIT_SYNTAX_ONLY
4564 /* Insert pseudo ops, these have to go into the opcode table since
4565 gas expects pseudo ops to start with a dot. */
4569 while (mote_pseudo_table[n].poc_name)
4571 hack = obstack_alloc (&robyn, sizeof (struct m68k_incant));
4572 hash_insert (op_hash,
4573 mote_pseudo_table[n].poc_name, (char *) hack);
4574 hack->m_operands = 0;
4584 record_alignment (text_section, 2);
4585 record_alignment (data_section, 2);
4586 record_alignment (bss_section, 2);
4591 /* This is called when a label is defined. */
4594 m68k_frob_label (symbolS *sym)
4596 struct label_line *n;
4598 n = (struct label_line *) xmalloc (sizeof *n);
4601 as_where (&n->file, &n->line);
4607 dwarf2_emit_label (sym);
4611 /* This is called when a value that is not an instruction is emitted. */
4614 m68k_flush_pending_output (void)
4616 current_label = NULL;
4619 /* This is called at the end of the assembly, when the final value of
4620 the label is known. We warn if this is a text symbol aligned at an
4624 m68k_frob_symbol (symbolS *sym)
4626 if (S_GET_SEGMENT (sym) == reg_section
4627 && (int) S_GET_VALUE (sym) < 0)
4629 S_SET_SEGMENT (sym, absolute_section);
4630 S_SET_VALUE (sym, ~(int)S_GET_VALUE (sym));
4632 else if ((S_GET_VALUE (sym) & 1) != 0)
4634 struct label_line *l;
4636 for (l = labels; l != NULL; l = l->next)
4638 if (l->label == sym)
4641 as_warn_where (l->file, l->line,
4642 _("text label `%s' aligned to odd boundary"),
4650 /* This is called if we go in or out of MRI mode because of the .mri
4654 m68k_mri_mode_change (int on)
4658 if (! flag_reg_prefix_optional)
4660 flag_reg_prefix_optional = 1;
4661 #ifdef REGISTER_PREFIX
4666 if (! m68k_rel32_from_cmdline)
4671 if (! reg_prefix_optional_seen)
4673 #ifdef REGISTER_PREFIX_OPTIONAL
4674 flag_reg_prefix_optional = REGISTER_PREFIX_OPTIONAL;
4676 flag_reg_prefix_optional = 0;
4678 #ifdef REGISTER_PREFIX
4683 if (! m68k_rel32_from_cmdline)
4689 md_atof (int type, char *litP, int *sizeP)
4691 return ieee_md_atof (type, litP, sizeP, TRUE);
4695 md_number_to_chars (char *buf, valueT val, int n)
4697 number_to_chars_bigendian (buf, val, n);
4701 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
4703 offsetT val = *valP;
4704 addressT upper_limit;
4705 offsetT lower_limit;
4707 /* This is unnecessary but it convinces the native rs6000 compiler
4708 to generate the code we want. */
4709 char *buf = fixP->fx_frag->fr_literal;
4710 buf += fixP->fx_where;
4711 /* End ibm compiler workaround. */
4715 if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
4721 memset (buf, 0, fixP->fx_size);
4722 fixP->fx_addnumber = val; /* Remember value for emit_reloc. */
4724 if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
4725 && !S_IS_DEFINED (fixP->fx_addsy)
4726 && !S_IS_WEAK (fixP->fx_addsy))
4727 S_SET_WEAK (fixP->fx_addsy);
4730 #elif defined(OBJ_AOUT)
4731 /* PR gas/3041 Do not fix frags referencing a weak symbol. */
4732 if (fixP->fx_addsy && S_IS_WEAK (fixP->fx_addsy))
4734 memset (buf, 0, fixP->fx_size);
4735 fixP->fx_addnumber = val; /* Remember value for emit_reloc. */
4740 if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
4741 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
4744 switch (fixP->fx_size)
4746 /* The cast to offsetT below are necessary to make code
4747 correct for machines where ints are smaller than offsetT. */
4751 lower_limit = - (offsetT) 0x80;
4754 *buf++ = (val >> 8);
4756 upper_limit = 0x7fff;
4757 lower_limit = - (offsetT) 0x8000;
4760 *buf++ = (val >> 24);
4761 *buf++ = (val >> 16);
4762 *buf++ = (val >> 8);
4764 upper_limit = 0x7fffffff;
4765 lower_limit = - (offsetT) 0x7fffffff - 1; /* Avoid constant overflow. */
4768 BAD_CASE (fixP->fx_size);
4771 /* Fix up a negative reloc. */
4772 if (fixP->fx_addsy == NULL && fixP->fx_subsy != NULL)
4774 fixP->fx_addsy = fixP->fx_subsy;
4775 fixP->fx_subsy = NULL;
4779 /* For non-pc-relative values, it's conceivable we might get something
4780 like "0xff" for a byte field. So extend the upper part of the range
4781 to accept such numbers. We arbitrarily disallow "-0xff" or "0xff+0xff",
4782 so that we can do any range checking at all. */
4783 if (! fixP->fx_pcrel && ! fixP->fx_signed)
4784 upper_limit = upper_limit * 2 + 1;
4786 if ((addressT) val > upper_limit
4787 && (val > 0 || val < lower_limit))
4788 as_bad_where (fixP->fx_file, fixP->fx_line,
4789 _("value %ld out of range"), (long)val);
4791 /* A one byte PC-relative reloc means a short branch. We can't use
4792 a short branch with a value of 0 or -1, because those indicate
4793 different opcodes (branches with longer offsets). fixup_segment
4794 in write.c may have clobbered fx_pcrel, so we need to examine the
4797 || fixP->fx_r_type == BFD_RELOC_8_PCREL)
4798 && fixP->fx_size == 1
4799 && (fixP->fx_addsy == NULL
4800 || S_IS_DEFINED (fixP->fx_addsy))
4801 && (val == 0 || val == -1))
4802 as_bad_where (fixP->fx_file, fixP->fx_line,
4803 _("invalid byte branch offset"));
4806 /* *fragP has been relaxed to its final size, and now needs to have
4807 the bytes inside it modified to conform to the new size There is UGLY
4811 md_convert_frag_1 (fragS *fragP)
4816 /* Address in object code of the displacement. */
4817 register int object_address = fragP->fr_fix + fragP->fr_address;
4819 /* Address in gas core of the place to store the displacement. */
4820 /* This convinces the native rs6000 compiler to generate the code we
4822 register char *buffer_address = fragP->fr_literal;
4823 buffer_address += fragP->fr_fix;
4824 /* End ibm compiler workaround. */
4826 /* The displacement of the address, from current location. */
4827 disp = fragP->fr_symbol ? S_GET_VALUE (fragP->fr_symbol) : 0;
4828 disp = (disp + fragP->fr_offset) - object_address;
4830 switch (fragP->fr_subtype)
4832 case TAB (BRANCHBWL, BYTE):
4833 case TAB (BRABSJUNC, BYTE):
4834 case TAB (BRABSJCOND, BYTE):
4835 case TAB (BRANCHBW, BYTE):
4836 case TAB (BRANCHBWPL, BYTE):
4837 know (issbyte (disp));
4839 as_bad_where (fragP->fr_file, fragP->fr_line,
4840 _("short branch with zero offset: use :w"));
4841 fixP = fix_new (fragP, fragP->fr_fix - 1, 1, fragP->fr_symbol,
4842 fragP->fr_offset, 1, RELAX_RELOC_PC8);
4843 fixP->fx_pcrel_adjust = -1;
4845 case TAB (BRANCHBWL, SHORT):
4846 case TAB (BRABSJUNC, SHORT):
4847 case TAB (BRABSJCOND, SHORT):
4848 case TAB (BRANCHBW, SHORT):
4849 case TAB (BRANCHBWPL, SHORT):
4850 fragP->fr_opcode[1] = 0x00;
4851 fixP = fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
4852 fragP->fr_offset, 1, RELAX_RELOC_PC16);
4855 case TAB (BRANCHBWL, LONG):
4856 fragP->fr_opcode[1] = (char) 0xFF;
4857 fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
4858 fragP->fr_offset, 1, RELAX_RELOC_PC32);
4861 case TAB (BRANCHBWPL, LONG):
4862 /* Here we are converting an unconditional branch into a pair of
4863 conditional branches, in order to get the range. */
4864 fragP->fr_opcode[0] = 0x66; /* bne */
4865 fragP->fr_opcode[1] = 0xFF;
4866 fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
4867 fragP->fr_offset, 1, RELAX_RELOC_PC32);
4868 fixP->fx_file = fragP->fr_file;
4869 fixP->fx_line = fragP->fr_line;
4870 fragP->fr_fix += 4; /* Skip first offset */
4871 buffer_address += 4;
4872 *buffer_address++ = 0x67; /* beq */
4873 *buffer_address++ = 0xff;
4874 fragP->fr_fix += 2; /* Skip second branch opcode */
4875 fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
4876 fragP->fr_offset, 1, RELAX_RELOC_PC32);
4879 case TAB (BRABSJUNC, LONG):
4880 if (fragP->fr_opcode[0] == 0x61) /* jbsr */
4882 if (flag_keep_pcrel)
4883 as_bad_where (fragP->fr_file, fragP->fr_line,
4884 _("Conversion of PC relative BSR to absolute JSR"));
4885 fragP->fr_opcode[0] = 0x4E;
4886 fragP->fr_opcode[1] = (char) 0xB9; /* JSR with ABSL LONG operand. */
4887 fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
4888 fragP->fr_offset, 0, RELAX_RELOC_ABS32);
4891 else if (fragP->fr_opcode[0] == 0x60) /* jbra */
4893 if (flag_keep_pcrel)
4894 as_bad_where (fragP->fr_file, fragP->fr_line,
4895 _("Conversion of PC relative branch to absolute jump"));
4896 fragP->fr_opcode[0] = 0x4E;
4897 fragP->fr_opcode[1] = (char) 0xF9; /* JMP with ABSL LONG operand. */
4898 fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
4899 fragP->fr_offset, 0, RELAX_RELOC_ABS32);
4904 /* This cannot happen, because jbsr and jbra are the only two
4905 unconditional branches. */
4909 case TAB (BRABSJCOND, LONG):
4910 if (flag_keep_pcrel)
4911 as_bad_where (fragP->fr_file, fragP->fr_line,
4912 _("Conversion of PC relative conditional branch to absolute jump"));
4914 /* Only Bcc 68000 instructions can come here
4915 Change bcc into b!cc/jmp absl long. */
4916 fragP->fr_opcode[0] ^= 0x01; /* Invert bcc. */
4917 fragP->fr_opcode[1] = 0x06; /* Branch offset = 6. */
4919 /* JF: these used to be fr_opcode[2,3], but they may be in a
4920 different frag, in which case referring to them is a no-no.
4921 Only fr_opcode[0,1] are guaranteed to work. */
4922 *buffer_address++ = 0x4e; /* put in jmp long (0x4ef9) */
4923 *buffer_address++ = (char) 0xf9;
4924 fragP->fr_fix += 2; /* Account for jmp instruction. */
4925 fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
4926 fragP->fr_offset, 0, RELAX_RELOC_ABS32);
4929 case TAB (FBRANCH, SHORT):
4930 know ((fragP->fr_opcode[1] & 0x40) == 0);
4931 fixP = fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
4932 fragP->fr_offset, 1, RELAX_RELOC_PC16);
4935 case TAB (FBRANCH, LONG):
4936 fragP->fr_opcode[1] |= 0x40; /* Turn on LONG bit. */
4937 fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
4938 fragP->fr_offset, 1, RELAX_RELOC_PC32);
4941 case TAB (DBCCLBR, SHORT):
4942 case TAB (DBCCABSJ, SHORT):
4943 fixP = fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
4944 fragP->fr_offset, 1, RELAX_RELOC_PC16);
4947 case TAB (DBCCLBR, LONG):
4948 /* Only DBcc instructions can come here.
4949 Change dbcc into dbcc/bral.
4950 JF: these used to be fr_opcode[2-7], but that's wrong. */
4951 if (flag_keep_pcrel)
4952 as_bad_where (fragP->fr_file, fragP->fr_line,
4953 _("Conversion of DBcc to absolute jump"));
4955 *buffer_address++ = 0x00; /* Branch offset = 4. */
4956 *buffer_address++ = 0x04;
4957 *buffer_address++ = 0x60; /* Put in bra pc+6. */
4958 *buffer_address++ = 0x06;
4959 *buffer_address++ = 0x60; /* Put in bral (0x60ff). */
4960 *buffer_address++ = (char) 0xff;
4962 fragP->fr_fix += 6; /* Account for bra/jmp instructions. */
4963 fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
4964 fragP->fr_offset, 1, RELAX_RELOC_PC32);
4967 case TAB (DBCCABSJ, LONG):
4968 /* Only DBcc instructions can come here.
4969 Change dbcc into dbcc/jmp.
4970 JF: these used to be fr_opcode[2-7], but that's wrong. */
4971 if (flag_keep_pcrel)
4972 as_bad_where (fragP->fr_file, fragP->fr_line,
4973 _("Conversion of PC relative conditional branch to absolute jump"));
4975 *buffer_address++ = 0x00; /* Branch offset = 4. */
4976 *buffer_address++ = 0x04;
4977 *buffer_address++ = 0x60; /* Put in bra pc + 6. */
4978 *buffer_address++ = 0x06;
4979 *buffer_address++ = 0x4e; /* Put in jmp long (0x4ef9). */
4980 *buffer_address++ = (char) 0xf9;
4982 fragP->fr_fix += 6; /* Account for bra/jmp instructions. */
4983 fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
4984 fragP->fr_offset, 0, RELAX_RELOC_ABS32);
4987 case TAB (PCREL1632, SHORT):
4988 fragP->fr_opcode[1] &= ~0x3F;
4989 fragP->fr_opcode[1] |= 0x3A; /* 072 - mode 7.2 */
4990 fixP = fix_new (fragP, (int) (fragP->fr_fix), 2, fragP->fr_symbol,
4991 fragP->fr_offset, 1, RELAX_RELOC_PC16);
4994 case TAB (PCREL1632, LONG):
4995 /* Already set to mode 7.3; this indicates: PC indirect with
4996 suppressed index, 32-bit displacement. */
4997 *buffer_address++ = 0x01;
4998 *buffer_address++ = 0x70;
5000 fixP = fix_new (fragP, (int) (fragP->fr_fix), 4, fragP->fr_symbol,
5001 fragP->fr_offset, 1, RELAX_RELOC_PC32);
5002 fixP->fx_pcrel_adjust = 2;
5005 case TAB (PCINDEX, BYTE):
5006 assert (fragP->fr_fix >= 2);
5007 buffer_address[-2] &= ~1;
5008 fixP = fix_new (fragP, fragP->fr_fix - 1, 1, fragP->fr_symbol,
5009 fragP->fr_offset, 1, RELAX_RELOC_PC8);
5010 fixP->fx_pcrel_adjust = 1;
5012 case TAB (PCINDEX, SHORT):
5013 assert (fragP->fr_fix >= 2);
5014 buffer_address[-2] |= 0x1;
5015 buffer_address[-1] = 0x20;
5016 fixP = fix_new (fragP, (int) (fragP->fr_fix), 2, fragP->fr_symbol,
5017 fragP->fr_offset, 1, RELAX_RELOC_PC16);
5018 fixP->fx_pcrel_adjust = 2;
5021 case TAB (PCINDEX, LONG):
5022 assert (fragP->fr_fix >= 2);
5023 buffer_address[-2] |= 0x1;
5024 buffer_address[-1] = 0x30;
5025 fixP = fix_new (fragP, (int) (fragP->fr_fix), 4, fragP->fr_symbol,
5026 fragP->fr_offset, 1, RELAX_RELOC_PC32);
5027 fixP->fx_pcrel_adjust = 2;
5030 case TAB (ABSTOPCREL, SHORT):
5031 fixP = fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
5032 fragP->fr_offset, 1, RELAX_RELOC_PC16);
5035 case TAB (ABSTOPCREL, LONG):
5036 if (flag_keep_pcrel)
5037 as_bad_where (fragP->fr_file, fragP->fr_line,
5038 _("Conversion of PC relative displacement to absolute"));
5039 /* The thing to do here is force it to ABSOLUTE LONG, since
5040 ABSTOPCREL is really trying to shorten an ABSOLUTE address anyway. */
5041 if ((fragP->fr_opcode[1] & 0x3F) != 0x3A)
5043 fragP->fr_opcode[1] &= ~0x3F;
5044 fragP->fr_opcode[1] |= 0x39; /* Mode 7.1 */
5045 fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
5046 fragP->fr_offset, 0, RELAX_RELOC_ABS32);
5052 fixP->fx_file = fragP->fr_file;
5053 fixP->fx_line = fragP->fr_line;
5058 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
5059 segT sec ATTRIBUTE_UNUSED,
5062 md_convert_frag_1 (fragP);
5065 /* Force truly undefined symbols to their maximum size, and generally set up
5066 the frag list to be relaxed
5069 md_estimate_size_before_relax (fragS *fragP, segT segment)
5071 /* Handle SZ_UNDEF first, it can be changed to BYTE or SHORT. */
5072 switch (fragP->fr_subtype)
5074 case TAB (BRANCHBWL, SZ_UNDEF):
5075 case TAB (BRANCHBWPL, SZ_UNDEF):
5076 case TAB (BRABSJUNC, SZ_UNDEF):
5077 case TAB (BRABSJCOND, SZ_UNDEF):
5079 if (S_GET_SEGMENT (fragP->fr_symbol) == segment
5080 && relaxable_symbol (fragP->fr_symbol))
5082 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), BYTE);
5084 else if (flag_short_refs)
5086 /* Symbol is undefined and we want short ref. */
5087 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT);
5091 /* Symbol is still undefined. Make it LONG. */
5092 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), LONG);
5097 case TAB (BRANCHBW, SZ_UNDEF):
5099 if (S_GET_SEGMENT (fragP->fr_symbol) == segment
5100 && relaxable_symbol (fragP->fr_symbol))
5102 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), BYTE);
5106 /* Symbol is undefined and we don't have long branches. */
5107 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT);
5112 case TAB (FBRANCH, SZ_UNDEF):
5113 case TAB (DBCCLBR, SZ_UNDEF):
5114 case TAB (DBCCABSJ, SZ_UNDEF):
5115 case TAB (PCREL1632, SZ_UNDEF):
5117 if ((S_GET_SEGMENT (fragP->fr_symbol) == segment
5118 && relaxable_symbol (fragP->fr_symbol))
5121 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT);
5125 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), LONG);
5130 case TAB (PCINDEX, SZ_UNDEF):
5131 if ((S_GET_SEGMENT (fragP->fr_symbol) == segment
5132 && relaxable_symbol (fragP->fr_symbol)))
5134 fragP->fr_subtype = TAB (PCINDEX, BYTE);
5138 fragP->fr_subtype = TAB (PCINDEX, LONG);
5142 case TAB (ABSTOPCREL, SZ_UNDEF):
5144 if ((S_GET_SEGMENT (fragP->fr_symbol) == segment
5145 && relaxable_symbol (fragP->fr_symbol)))
5147 fragP->fr_subtype = TAB (ABSTOPCREL, SHORT);
5151 fragP->fr_subtype = TAB (ABSTOPCREL, LONG);
5160 /* Now that SZ_UNDEF are taken care of, check others. */
5161 switch (fragP->fr_subtype)
5163 case TAB (BRANCHBWL, BYTE):
5164 case TAB (BRABSJUNC, BYTE):
5165 case TAB (BRABSJCOND, BYTE):
5166 case TAB (BRANCHBW, BYTE):
5167 /* We can't do a short jump to the next instruction, so in that
5168 case we force word mode. If the symbol is at the start of a
5169 frag, and it is the next frag with any data in it (usually
5170 this is just the next frag, but assembler listings may
5171 introduce empty frags), we must use word mode. */
5172 if (fragP->fr_symbol)
5176 sym_frag = symbol_get_frag (fragP->fr_symbol);
5177 if (S_GET_VALUE (fragP->fr_symbol) == sym_frag->fr_address)
5181 for (l = fragP->fr_next; l && l != sym_frag; l = l->fr_next)
5185 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT);
5192 return md_relax_table[fragP->fr_subtype].rlx_length;
5195 #if defined(OBJ_AOUT) | defined(OBJ_BOUT)
5196 /* the bit-field entries in the relocation_info struct plays hell
5197 with the byte-order problems of cross-assembly. So as a hack,
5198 I added this mach. dependent ri twiddler. Ugly, but it gets
5200 /* on m68k: first 4 bytes are normal unsigned long, next three bytes
5201 are symbolnum, most sig. byte first. Last byte is broken up with
5202 bit 7 as pcrel, bits 6 & 5 as length, bit 4 as pcrel, and the lower
5203 nibble as nuthin. (on Sun 3 at least) */
5204 /* Translate the internal relocation information into target-specific
5208 md_ri_to_chars (char *the_bytes, struct reloc_info_generic *ri)
5211 md_number_to_chars (the_bytes, ri->r_address, 4);
5212 /* Now the fun stuff. */
5213 the_bytes[4] = (ri->r_symbolnum >> 16) & 0x0ff;
5214 the_bytes[5] = (ri->r_symbolnum >> 8) & 0x0ff;
5215 the_bytes[6] = ri->r_symbolnum & 0x0ff;
5216 the_bytes[7] = (((ri->r_pcrel << 7) & 0x80)
5217 | ((ri->r_length << 5) & 0x60)
5218 | ((ri->r_extern << 4) & 0x10));
5223 #endif /* OBJ_AOUT or OBJ_BOUT */
5225 #ifndef WORKING_DOT_WORD
5226 int md_short_jump_size = 4;
5227 int md_long_jump_size = 6;
5230 md_create_short_jump (char *ptr, addressT from_addr, addressT to_addr,
5231 fragS *frag ATTRIBUTE_UNUSED,
5232 symbolS *to_symbol ATTRIBUTE_UNUSED)
5236 offset = to_addr - (from_addr + 2);
5238 md_number_to_chars (ptr, (valueT) 0x6000, 2);
5239 md_number_to_chars (ptr + 2, (valueT) offset, 2);
5243 md_create_long_jump (char *ptr, addressT from_addr, addressT to_addr,
5244 fragS *frag, symbolS *to_symbol)
5248 if (!HAVE_LONG_BRANCH (current_architecture))
5250 if (flag_keep_pcrel)
5251 as_fatal (_("Tried to convert PC relative branch to absolute jump"));
5252 offset = to_addr - S_GET_VALUE (to_symbol);
5253 md_number_to_chars (ptr, (valueT) 0x4EF9, 2);
5254 md_number_to_chars (ptr + 2, (valueT) offset, 4);
5255 fix_new (frag, (ptr + 2) - frag->fr_literal, 4, to_symbol, (offsetT) 0,
5260 offset = to_addr - (from_addr + 2);
5261 md_number_to_chars (ptr, (valueT) 0x60ff, 2);
5262 md_number_to_chars (ptr + 2, (valueT) offset, 4);
5268 /* Different values of OK tell what its OK to return. Things that
5269 aren't OK are an error (what a shock, no?)
5272 10: Absolute 1:8 only
5273 20: Absolute 0:7 only
5274 30: absolute 0:15 only
5275 40: Absolute 0:31 only
5276 50: absolute 0:127 only
5277 55: absolute -64:63 only
5278 60: absolute -128:127 only
5279 65: absolute 0:511 only
5280 70: absolute 0:4095 only
5281 80: absolute -1, 1:7 only
5285 get_num (struct m68k_exp *exp, int ok)
5287 if (exp->exp.X_op == O_absent)
5289 /* Do the same thing the VAX asm does. */
5290 op (exp) = O_constant;
5296 as_warn (_("expression out of range: defaulting to 1"));
5300 else if (exp->exp.X_op == O_constant)
5305 if ((valueT) TRUNC (offs (exp)) - 1 > 7)
5307 as_warn (_("expression out of range: defaulting to 1"));
5312 if ((valueT) TRUNC (offs (exp)) > 7)
5316 if ((valueT) TRUNC (offs (exp)) > 15)
5320 if ((valueT) TRUNC (offs (exp)) > 32)
5324 if ((valueT) TRUNC (offs (exp)) > 127)
5328 if ((valueT) SEXT (offs (exp)) + 64 > 127)
5332 if ((valueT) SEXT (offs (exp)) + 128 > 255)
5336 if ((valueT) TRUNC (offs (exp)) > 511)
5340 if ((valueT) TRUNC (offs (exp)) > 4095)
5343 as_warn (_("expression out of range: defaulting to 0"));
5348 if ((valueT) TRUNC (offs (exp)) != 0xffffffff
5349 && (valueT) TRUNC (offs (exp)) - 1 > 6)
5351 as_warn (_("expression out of range: defaulting to 1"));
5359 else if (exp->exp.X_op == O_big)
5361 if (offs (exp) <= 0 /* flonum. */
5362 && (ok == 90 /* no bignums */
5363 || (ok > 10 /* Small-int ranges including 0 ok. */
5364 /* If we have a flonum zero, a zero integer should
5365 do as well (e.g., in moveq). */
5366 && generic_floating_point_number.exponent == 0
5367 && generic_floating_point_number.low[0] == 0)))
5369 /* HACK! Turn it into a long. */
5370 LITTLENUM_TYPE words[6];
5372 gen_to_words (words, 2, 8L); /* These numbers are magic! */
5373 op (exp) = O_constant;
5376 offs (exp) = words[1] | (words[0] << 16);
5380 op (exp) = O_constant;
5383 offs (exp) = (ok == 10) ? 1 : 0;
5384 as_warn (_("Can't deal with expression; defaulting to %ld"),
5390 if (ok >= 10 && ok <= 80)
5392 op (exp) = O_constant;
5395 offs (exp) = (ok == 10) ? 1 : 0;
5396 as_warn (_("Can't deal with expression; defaulting to %ld"),
5401 if (exp->size != SIZE_UNSPEC)
5409 if (!isbyte (offs (exp)))
5410 as_warn (_("expression doesn't fit in BYTE"));
5413 if (!isword (offs (exp)))
5414 as_warn (_("expression doesn't fit in WORD"));
5422 /* These are the back-ends for the various machine dependent pseudo-ops. */
5425 s_data1 (int ignore ATTRIBUTE_UNUSED)
5427 subseg_set (data_section, 1);
5428 demand_empty_rest_of_line ();
5432 s_data2 (int ignore ATTRIBUTE_UNUSED)
5434 subseg_set (data_section, 2);
5435 demand_empty_rest_of_line ();
5439 s_bss (int ignore ATTRIBUTE_UNUSED)
5441 /* We don't support putting frags in the BSS segment, we fake it
5442 by marking in_bss, then looking at s_skip for clues. */
5444 subseg_set (bss_section, 0);
5445 demand_empty_rest_of_line ();
5449 s_even (int ignore ATTRIBUTE_UNUSED)
5452 register long temp_fill;
5454 temp = 1; /* JF should be 2? */
5455 temp_fill = get_absolute_expression ();
5456 if (!need_pass_2) /* Never make frag if expect extra pass. */
5457 frag_align (temp, (int) temp_fill, 0);
5458 demand_empty_rest_of_line ();
5459 record_alignment (now_seg, temp);
5463 s_proc (int ignore ATTRIBUTE_UNUSED)
5465 demand_empty_rest_of_line ();
5468 /* Pseudo-ops handled for MRI compatibility. */
5470 /* This function returns non-zero if the argument is a conditional
5471 pseudo-op. This is called when checking whether a pending
5472 alignment is needed. */
5475 m68k_conditional_pseudoop (pseudo_typeS *pop)
5477 return (pop->poc_handler == s_mri_if
5478 || pop->poc_handler == s_mri_else);
5481 /* Handle an MRI style chip specification. */
5490 s = input_line_pointer;
5491 /* We can't use get_symbol_end since the processor names are not proper
5493 while (is_part_of_name (c = *input_line_pointer++))
5495 *--input_line_pointer = 0;
5496 for (i = 0; m68k_cpus[i].name; i++)
5497 if (strcasecmp (s, m68k_cpus[i].name) == 0)
5499 if (!m68k_cpus[i].name)
5501 as_bad (_("%s: unrecognized processor name"), s);
5502 *input_line_pointer = c;
5503 ignore_rest_of_line ();
5506 *input_line_pointer = c;
5508 if (*input_line_pointer == '/')
5509 current_architecture = 0;
5511 current_architecture &= m68881 | m68851;
5512 current_architecture |= m68k_cpus[i].arch & ~(m68881 | m68851);
5513 control_regs = m68k_cpus[i].control_regs;
5515 while (*input_line_pointer == '/')
5517 ++input_line_pointer;
5518 s = input_line_pointer;
5519 /* We can't use get_symbol_end since the processor names are not
5521 while (is_part_of_name (c = *input_line_pointer++))
5523 *--input_line_pointer = 0;
5524 if (strcmp (s, "68881") == 0)
5525 current_architecture |= m68881;
5526 else if (strcmp (s, "68851") == 0)
5527 current_architecture |= m68851;
5528 *input_line_pointer = c;
5532 /* The MRI CHIP pseudo-op. */
5535 s_chip (int ignore ATTRIBUTE_UNUSED)
5541 stop = mri_comment_field (&stopc);
5544 mri_comment_end (stop, stopc);
5545 demand_empty_rest_of_line ();
5548 /* The MRI FOPT pseudo-op. */
5551 s_fopt (int ignore ATTRIBUTE_UNUSED)
5555 if (strncasecmp (input_line_pointer, "ID=", 3) == 0)
5559 input_line_pointer += 3;
5560 temp = get_absolute_expression ();
5561 if (temp < 0 || temp > 7)
5562 as_bad (_("bad coprocessor id"));
5564 m68k_float_copnum = COP0 + temp;
5568 as_bad (_("unrecognized fopt option"));
5569 ignore_rest_of_line ();
5573 demand_empty_rest_of_line ();
5576 /* The structure used to handle the MRI OPT pseudo-op. */
5580 /* The name of the option. */
5583 /* If this is not NULL, just call this function. The first argument
5584 is the ARG field of this structure, the second argument is
5585 whether the option was negated. */
5586 void (*pfn) (int arg, int on);
5588 /* If this is not NULL, and the PFN field is NULL, set the variable
5589 this points to. Set it to the ARG field if the option was not
5590 negated, and the NOTARG field otherwise. */
5593 /* The value to pass to PFN or to assign to *PVAR. */
5596 /* The value to assign to *PVAR if the option is negated. If PFN is
5597 NULL, and PVAR is not NULL, and ARG and NOTARG are the same, then
5598 the option may not be negated. */
5602 /* The table used to handle the MRI OPT pseudo-op. */
5604 static void skip_to_comma (int, int);
5605 static void opt_nest (int, int);
5606 static void opt_chip (int, int);
5607 static void opt_list (int, int);
5608 static void opt_list_symbols (int, int);
5610 static const struct opt_action opt_table[] =
5612 { "abspcadd", 0, &m68k_abspcadd, 1, 0 },
5614 /* We do relaxing, so there is little use for these options. */
5615 { "b", 0, 0, 0, 0 },
5616 { "brs", 0, 0, 0, 0 },
5617 { "brb", 0, 0, 0, 0 },
5618 { "brl", 0, 0, 0, 0 },
5619 { "brw", 0, 0, 0, 0 },
5621 { "c", 0, 0, 0, 0 },
5622 { "cex", 0, 0, 0, 0 },
5623 { "case", 0, &symbols_case_sensitive, 1, 0 },
5624 { "cl", 0, 0, 0, 0 },
5625 { "cre", 0, 0, 0, 0 },
5626 { "d", 0, &flag_keep_locals, 1, 0 },
5627 { "e", 0, 0, 0, 0 },
5628 { "f", 0, &flag_short_refs, 1, 0 },
5629 { "frs", 0, &flag_short_refs, 1, 0 },
5630 { "frl", 0, &flag_short_refs, 0, 1 },
5631 { "g", 0, 0, 0, 0 },
5632 { "i", 0, 0, 0, 0 },
5633 { "m", 0, 0, 0, 0 },
5634 { "mex", 0, 0, 0, 0 },
5635 { "mc", 0, 0, 0, 0 },
5636 { "md", 0, 0, 0, 0 },
5637 { "nest", opt_nest, 0, 0, 0 },
5638 { "next", skip_to_comma, 0, 0, 0 },
5639 { "o", 0, 0, 0, 0 },
5640 { "old", 0, 0, 0, 0 },
5641 { "op", skip_to_comma, 0, 0, 0 },
5642 { "pco", 0, 0, 0, 0 },
5643 { "p", opt_chip, 0, 0, 0 },
5644 { "pcr", 0, 0, 0, 0 },
5645 { "pcs", 0, 0, 0, 0 },
5646 { "r", 0, 0, 0, 0 },
5647 { "quick", 0, &m68k_quick, 1, 0 },
5648 { "rel32", 0, &m68k_rel32, 1, 0 },
5649 { "s", opt_list, 0, 0, 0 },
5650 { "t", opt_list_symbols, 0, 0, 0 },
5651 { "w", 0, &flag_no_warnings, 0, 1 },
5655 #define OPTCOUNT ((int) (sizeof opt_table / sizeof opt_table[0]))
5657 /* The MRI OPT pseudo-op. */
5660 s_opt (int ignore ATTRIBUTE_UNUSED)
5668 const struct opt_action *o;
5673 if (*input_line_pointer == '-')
5675 ++input_line_pointer;
5678 else if (strncasecmp (input_line_pointer, "NO", 2) == 0)
5680 input_line_pointer += 2;
5684 s = input_line_pointer;
5685 c = get_symbol_end ();
5687 for (i = 0, o = opt_table; i < OPTCOUNT; i++, o++)
5689 if (strcasecmp (s, o->name) == 0)
5693 /* Restore input_line_pointer now in case the option
5695 *input_line_pointer = c;
5696 (*o->pfn) (o->arg, t);
5698 else if (o->pvar != NULL)
5700 if (! t && o->arg == o->notarg)
5701 as_bad (_("option `%s' may not be negated"), s);
5702 *input_line_pointer = c;
5703 *o->pvar = t ? o->arg : o->notarg;
5706 *input_line_pointer = c;
5712 as_bad (_("option `%s' not recognized"), s);
5713 *input_line_pointer = c;
5716 while (*input_line_pointer++ == ',');
5718 /* Move back to terminating character. */
5719 --input_line_pointer;
5720 demand_empty_rest_of_line ();
5723 /* Skip ahead to a comma. This is used for OPT options which we do
5724 not support and which take arguments. */
5727 skip_to_comma (int arg ATTRIBUTE_UNUSED, int on ATTRIBUTE_UNUSED)
5729 while (*input_line_pointer != ','
5730 && ! is_end_of_line[(unsigned char) *input_line_pointer])
5731 ++input_line_pointer;
5734 /* Handle the OPT NEST=depth option. */
5737 opt_nest (int arg ATTRIBUTE_UNUSED, int on ATTRIBUTE_UNUSED)
5739 if (*input_line_pointer != '=')
5741 as_bad (_("bad format of OPT NEST=depth"));
5745 ++input_line_pointer;
5746 max_macro_nest = get_absolute_expression ();
5749 /* Handle the OPT P=chip option. */
5752 opt_chip (int arg ATTRIBUTE_UNUSED, int on ATTRIBUTE_UNUSED)
5754 if (*input_line_pointer != '=')
5756 /* This is just OPT P, which we do not support. */
5760 ++input_line_pointer;
5764 /* Handle the OPT S option. */
5767 opt_list (int arg ATTRIBUTE_UNUSED, int on)
5772 /* Handle the OPT T option. */
5775 opt_list_symbols (int arg ATTRIBUTE_UNUSED, int on)
5778 listing |= LISTING_SYMBOLS;
5780 listing &= ~LISTING_SYMBOLS;
5783 /* Handle the MRI REG pseudo-op. */
5786 s_reg (int ignore ATTRIBUTE_UNUSED)
5795 if (line_label == NULL)
5797 as_bad (_("missing label"));
5798 ignore_rest_of_line ();
5803 stop = mri_comment_field (&stopc);
5807 s = input_line_pointer;
5808 while (ISALNUM (*input_line_pointer)
5809 #ifdef REGISTER_PREFIX
5810 || *input_line_pointer == REGISTER_PREFIX
5812 || *input_line_pointer == '/'
5813 || *input_line_pointer == '-')
5814 ++input_line_pointer;
5815 c = *input_line_pointer;
5816 *input_line_pointer = '\0';
5818 if (m68k_ip_op (s, &rop) != 0)
5820 if (rop.error == NULL)
5821 as_bad (_("bad register list"));
5823 as_bad (_("bad register list: %s"), rop.error);
5824 *input_line_pointer = c;
5825 ignore_rest_of_line ();
5829 *input_line_pointer = c;
5831 if (rop.mode == REGLST)
5833 else if (rop.mode == DREG)
5834 mask = 1 << (rop.reg - DATA0);
5835 else if (rop.mode == AREG)
5836 mask = 1 << (rop.reg - ADDR0 + 8);
5837 else if (rop.mode == FPREG)
5838 mask = 1 << (rop.reg - FP0 + 16);
5839 else if (rop.mode == CONTROL
5842 else if (rop.mode == CONTROL
5845 else if (rop.mode == CONTROL
5850 as_bad (_("bad register list"));
5851 ignore_rest_of_line ();
5855 S_SET_SEGMENT (line_label, reg_section);
5856 S_SET_VALUE (line_label, ~mask);
5857 symbol_set_frag (line_label, &zero_address_frag);
5860 mri_comment_end (stop, stopc);
5862 demand_empty_rest_of_line ();
5865 /* This structure is used for the MRI SAVE and RESTORE pseudo-ops. */
5869 struct save_opts *next;
5871 int symbols_case_sensitive;
5875 const enum m68k_register *control_regs;
5880 /* FIXME: We don't save OPT S. */
5883 /* This variable holds the stack of saved options. */
5885 static struct save_opts *save_stack;
5887 /* The MRI SAVE pseudo-op. */
5890 s_save (int ignore ATTRIBUTE_UNUSED)
5892 struct save_opts *s;
5894 s = (struct save_opts *) xmalloc (sizeof (struct save_opts));
5895 s->abspcadd = m68k_abspcadd;
5896 s->symbols_case_sensitive = symbols_case_sensitive;
5897 s->keep_locals = flag_keep_locals;
5898 s->short_refs = flag_short_refs;
5899 s->architecture = current_architecture;
5900 s->control_regs = control_regs;
5901 s->quick = m68k_quick;
5902 s->rel32 = m68k_rel32;
5903 s->listing = listing;
5904 s->no_warnings = flag_no_warnings;
5906 s->next = save_stack;
5909 demand_empty_rest_of_line ();
5912 /* The MRI RESTORE pseudo-op. */
5915 s_restore (int ignore ATTRIBUTE_UNUSED)
5917 struct save_opts *s;
5919 if (save_stack == NULL)
5921 as_bad (_("restore without save"));
5922 ignore_rest_of_line ();
5927 save_stack = s->next;
5929 m68k_abspcadd = s->abspcadd;
5930 symbols_case_sensitive = s->symbols_case_sensitive;
5931 flag_keep_locals = s->keep_locals;
5932 flag_short_refs = s->short_refs;
5933 current_architecture = s->architecture;
5934 control_regs = s->control_regs;
5935 m68k_quick = s->quick;
5936 m68k_rel32 = s->rel32;
5937 listing = s->listing;
5938 flag_no_warnings = s->no_warnings;
5942 demand_empty_rest_of_line ();
5945 /* Types of MRI structured control directives. */
5947 enum mri_control_type
5955 /* This structure is used to stack the MRI structured control
5958 struct mri_control_info
5960 /* The directive within which this one is enclosed. */
5961 struct mri_control_info *outer;
5963 /* The type of directive. */
5964 enum mri_control_type type;
5966 /* Whether an ELSE has been in an IF. */
5969 /* The add or sub statement at the end of a FOR. */
5972 /* The label of the top of a FOR or REPEAT loop. */
5975 /* The label to jump to for the next iteration, or the else
5976 expression of a conditional. */
5979 /* The label to jump to to break out of the loop, or the label past
5980 the end of a conditional. */
5984 /* The stack of MRI structured control directives. */
5986 static struct mri_control_info *mri_control_stack;
5988 /* The current MRI structured control directive index number, used to
5989 generate label names. */
5991 static int mri_control_index;
5993 /* Assemble an instruction for an MRI structured control directive. */
5996 mri_assemble (char *str)
6000 /* md_assemble expects the opcode to be in lower case. */
6001 for (s = str; *s != ' ' && *s != '\0'; s++)
6007 /* Generate a new MRI label structured control directive label name. */
6010 mri_control_label (void)
6014 n = (char *) xmalloc (20);
6015 sprintf (n, "%smc%d", FAKE_LABEL_NAME, mri_control_index);
6016 ++mri_control_index;
6020 /* Create a new MRI structured control directive. */
6022 static struct mri_control_info *
6023 push_mri_control (enum mri_control_type type)
6025 struct mri_control_info *n;
6027 n = (struct mri_control_info *) xmalloc (sizeof (struct mri_control_info));
6031 if (type == mri_if || type == mri_while)
6034 n->top = mri_control_label ();
6035 n->next = mri_control_label ();
6036 n->bottom = mri_control_label ();
6038 n->outer = mri_control_stack;
6039 mri_control_stack = n;
6044 /* Pop off the stack of MRI structured control directives. */
6047 pop_mri_control (void)
6049 struct mri_control_info *n;
6051 n = mri_control_stack;
6052 mri_control_stack = n->outer;
6060 /* Recognize a condition code in an MRI structured control expression. */
6063 parse_mri_condition (int *pcc)
6067 know (*input_line_pointer == '<');
6069 ++input_line_pointer;
6070 c1 = *input_line_pointer++;
6071 c2 = *input_line_pointer++;
6073 if (*input_line_pointer != '>')
6075 as_bad (_("syntax error in structured control directive"));
6079 ++input_line_pointer;
6085 *pcc = (c1 << 8) | c2;
6090 /* Parse a single operand in an MRI structured control expression. */
6093 parse_mri_control_operand (int *pcc, char **leftstart, char **leftstop,
6094 char **rightstart, char **rightstop)
6106 if (*input_line_pointer == '<')
6108 /* It's just a condition code. */
6109 return parse_mri_condition (pcc);
6112 /* Look ahead for the condition code. */
6113 for (s = input_line_pointer; *s != '\0'; ++s)
6115 if (*s == '<' && s[1] != '\0' && s[2] != '\0' && s[3] == '>')
6120 as_bad (_("missing condition code in structured control directive"));
6124 *leftstart = input_line_pointer;
6126 if (*leftstop > *leftstart
6127 && ((*leftstop)[-1] == ' ' || (*leftstop)[-1] == '\t'))
6130 input_line_pointer = s;
6131 if (! parse_mri_condition (pcc))
6134 /* Look ahead for AND or OR or end of line. */
6135 for (s = input_line_pointer; *s != '\0'; ++s)
6137 /* We must make sure we don't misinterpret AND/OR at the end of labels!
6138 if d0 <eq> #FOOAND and d1 <ne> #BAROR then
6140 if ((s == input_line_pointer
6143 && ((strncasecmp (s, "AND", 3) == 0
6144 && (s[3] == '.' || ! is_part_of_name (s[3])))
6145 || (strncasecmp (s, "OR", 2) == 0
6146 && (s[2] == '.' || ! is_part_of_name (s[2])))))
6150 *rightstart = input_line_pointer;
6152 if (*rightstop > *rightstart
6153 && ((*rightstop)[-1] == ' ' || (*rightstop)[-1] == '\t'))
6156 input_line_pointer = s;
6161 #define MCC(b1, b2) (((b1) << 8) | (b2))
6163 /* Swap the sense of a condition. This changes the condition so that
6164 it generates the same result when the operands are swapped. */
6167 swap_mri_condition (int cc)
6171 case MCC ('h', 'i'): return MCC ('c', 's');
6172 case MCC ('l', 's'): return MCC ('c', 'c');
6173 /* <HS> is an alias for <CC>. */
6174 case MCC ('h', 's'):
6175 case MCC ('c', 'c'): return MCC ('l', 's');
6176 /* <LO> is an alias for <CS>. */
6177 case MCC ('l', 'o'):
6178 case MCC ('c', 's'): return MCC ('h', 'i');
6179 case MCC ('p', 'l'): return MCC ('m', 'i');
6180 case MCC ('m', 'i'): return MCC ('p', 'l');
6181 case MCC ('g', 'e'): return MCC ('l', 'e');
6182 case MCC ('l', 't'): return MCC ('g', 't');
6183 case MCC ('g', 't'): return MCC ('l', 't');
6184 case MCC ('l', 'e'): return MCC ('g', 'e');
6185 /* Issue a warning for conditions we can not swap. */
6186 case MCC ('n', 'e'): return MCC ('n', 'e'); // no problem here
6187 case MCC ('e', 'q'): return MCC ('e', 'q'); // also no problem
6188 case MCC ('v', 'c'):
6189 case MCC ('v', 's'):
6191 as_warn (_("Condition <%c%c> in structured control directive can not be encoded correctly"),
6192 (char) (cc >> 8), (char) (cc));
6198 /* Reverse the sense of a condition. */
6201 reverse_mri_condition (int cc)
6205 case MCC ('h', 'i'): return MCC ('l', 's');
6206 case MCC ('l', 's'): return MCC ('h', 'i');
6207 /* <HS> is an alias for <CC> */
6208 case MCC ('h', 's'): return MCC ('l', 'o');
6209 case MCC ('c', 'c'): return MCC ('c', 's');
6210 /* <LO> is an alias for <CS> */
6211 case MCC ('l', 'o'): return MCC ('h', 's');
6212 case MCC ('c', 's'): return MCC ('c', 'c');
6213 case MCC ('n', 'e'): return MCC ('e', 'q');
6214 case MCC ('e', 'q'): return MCC ('n', 'e');
6215 case MCC ('v', 'c'): return MCC ('v', 's');
6216 case MCC ('v', 's'): return MCC ('v', 'c');
6217 case MCC ('p', 'l'): return MCC ('m', 'i');
6218 case MCC ('m', 'i'): return MCC ('p', 'l');
6219 case MCC ('g', 'e'): return MCC ('l', 't');
6220 case MCC ('l', 't'): return MCC ('g', 'e');
6221 case MCC ('g', 't'): return MCC ('l', 'e');
6222 case MCC ('l', 'e'): return MCC ('g', 't');
6227 /* Build an MRI structured control expression. This generates test
6228 and branch instructions. It goes to TRUELAB if the condition is
6229 true, and to FALSELAB if the condition is false. Exactly one of
6230 TRUELAB and FALSELAB will be NULL, meaning to fall through. QUAL
6231 is the size qualifier for the expression. EXTENT is the size to
6232 use for the branch. */
6235 build_mri_control_operand (int qual, int cc, char *leftstart, char *leftstop,
6236 char *rightstart, char *rightstop,
6237 const char *truelab, const char *falselab,
6243 if (leftstart != NULL)
6245 struct m68k_op leftop, rightop;
6248 /* Swap the compare operands, if necessary, to produce a legal
6249 m68k compare instruction. Comparing a register operand with
6250 a non-register operand requires the register to be on the
6251 right (cmp, cmpa). Comparing an immediate value with
6252 anything requires the immediate value to be on the left
6257 (void) m68k_ip_op (leftstart, &leftop);
6262 (void) m68k_ip_op (rightstart, &rightop);
6265 if (rightop.mode == IMMED
6266 || ((leftop.mode == DREG || leftop.mode == AREG)
6267 && (rightop.mode != DREG && rightop.mode != AREG)))
6271 /* Correct conditional handling:
6272 if #1 <lt> d0 then ;means if (1 < d0)
6278 cmp #1,d0 if we do *not* swap the operands
6279 bgt true we need the swapped condition!
6286 leftstart = rightstart;
6289 leftstop = rightstop;
6294 cc = swap_mri_condition (cc);
6298 if (truelab == NULL)
6300 cc = reverse_mri_condition (cc);
6304 if (leftstart != NULL)
6306 buf = (char *) xmalloc (20
6307 + (leftstop - leftstart)
6308 + (rightstop - rightstart));
6314 *s++ = TOLOWER (qual);
6316 memcpy (s, leftstart, leftstop - leftstart);
6317 s += leftstop - leftstart;
6319 memcpy (s, rightstart, rightstop - rightstart);
6320 s += rightstop - rightstart;
6326 buf = (char *) xmalloc (20 + strlen (truelab));
6332 *s++ = TOLOWER (extent);
6334 strcpy (s, truelab);
6339 /* Parse an MRI structured control expression. This generates test
6340 and branch instructions. STOP is where the expression ends. It
6341 goes to TRUELAB if the condition is true, and to FALSELAB if the
6342 condition is false. Exactly one of TRUELAB and FALSELAB will be
6343 NULL, meaning to fall through. QUAL is the size qualifier for the
6344 expression. EXTENT is the size to use for the branch. */
6347 parse_mri_control_expression (char *stop, int qual, const char *truelab,
6348 const char *falselab, int extent)
6360 if (! parse_mri_control_operand (&cc, &leftstart, &leftstop,
6361 &rightstart, &rightstop))
6367 if (strncasecmp (input_line_pointer, "AND", 3) == 0)
6371 if (falselab != NULL)
6374 flab = mri_control_label ();
6376 build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart,
6377 rightstop, (const char *) NULL, flab, extent);
6379 input_line_pointer += 3;
6380 if (*input_line_pointer != '.'
6381 || input_line_pointer[1] == '\0')
6385 qual = input_line_pointer[1];
6386 input_line_pointer += 2;
6389 if (! parse_mri_control_operand (&cc, &leftstart, &leftstop,
6390 &rightstart, &rightstop))
6396 build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart,
6397 rightstop, truelab, falselab, extent);
6399 if (falselab == NULL)
6402 else if (strncasecmp (input_line_pointer, "OR", 2) == 0)
6406 if (truelab != NULL)
6409 tlab = mri_control_label ();
6411 build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart,
6412 rightstop, tlab, (const char *) NULL, extent);
6414 input_line_pointer += 2;
6415 if (*input_line_pointer != '.'
6416 || input_line_pointer[1] == '\0')
6420 qual = input_line_pointer[1];
6421 input_line_pointer += 2;
6424 if (! parse_mri_control_operand (&cc, &leftstart, &leftstop,
6425 &rightstart, &rightstop))
6431 build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart,
6432 rightstop, truelab, falselab, extent);
6434 if (truelab == NULL)
6439 build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart,
6440 rightstop, truelab, falselab, extent);
6444 if (input_line_pointer != stop)
6445 as_bad (_("syntax error in structured control directive"));
6448 /* Handle the MRI IF pseudo-op. This may be a structured control
6449 directive, or it may be a regular assembler conditional, depending
6457 struct mri_control_info *n;
6459 /* A structured control directive must end with THEN with an
6460 optional qualifier. */
6461 s = input_line_pointer;
6462 /* We only accept '*' as introduction of comments if preceded by white space
6463 or at first column of a line (I think this can't actually happen here?)
6464 This is important when assembling:
6465 if d0 <ne> 12(a0,d0*2) then
6466 if d0 <ne> #CONST*20 then. */
6467 while (! (is_end_of_line[(unsigned char) *s]
6470 && (s == input_line_pointer
6472 || *(s-1) == '\t'))))
6475 while (s > input_line_pointer && (*s == ' ' || *s == '\t'))
6478 if (s - input_line_pointer > 1
6482 if (s - input_line_pointer < 3
6483 || strncasecmp (s - 3, "THEN", 4) != 0)
6487 as_bad (_("missing then"));
6488 ignore_rest_of_line ();
6492 /* It's a conditional. */
6497 /* Since this might be a conditional if, this pseudo-op will be
6498 called even if we are supported to be ignoring input. Double
6499 check now. Clobber *input_line_pointer so that ignore_input
6500 thinks that this is not a special pseudo-op. */
6501 c = *input_line_pointer;
6502 *input_line_pointer = 0;
6503 if (ignore_input ())
6505 *input_line_pointer = c;
6506 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6507 ++input_line_pointer;
6508 demand_empty_rest_of_line ();
6511 *input_line_pointer = c;
6513 n = push_mri_control (mri_if);
6515 parse_mri_control_expression (s - 3, qual, (const char *) NULL,
6516 n->next, s[1] == '.' ? s[2] : '\0');
6519 input_line_pointer = s + 3;
6521 input_line_pointer = s + 1;
6525 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6526 ++input_line_pointer;
6529 demand_empty_rest_of_line ();
6532 /* Handle the MRI else pseudo-op. If we are currently doing an MRI
6533 structured IF, associate the ELSE with the IF. Otherwise, assume
6534 it is a conditional else. */
6537 s_mri_else (int qual)
6544 && (mri_control_stack == NULL
6545 || mri_control_stack->type != mri_if
6546 || mri_control_stack->else_seen))
6552 c = *input_line_pointer;
6553 *input_line_pointer = 0;
6554 if (ignore_input ())
6556 *input_line_pointer = c;
6557 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6558 ++input_line_pointer;
6559 demand_empty_rest_of_line ();
6562 *input_line_pointer = c;
6564 if (mri_control_stack == NULL
6565 || mri_control_stack->type != mri_if
6566 || mri_control_stack->else_seen)
6568 as_bad (_("else without matching if"));
6569 ignore_rest_of_line ();
6573 mri_control_stack->else_seen = 1;
6575 buf = (char *) xmalloc (20 + strlen (mri_control_stack->bottom));
6576 q[0] = TOLOWER (qual);
6578 sprintf (buf, "bra%s %s", q, mri_control_stack->bottom);
6582 colon (mri_control_stack->next);
6586 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6587 ++input_line_pointer;
6590 demand_empty_rest_of_line ();
6593 /* Handle the MRI ENDI pseudo-op. */
6596 s_mri_endi (int ignore ATTRIBUTE_UNUSED)
6598 if (mri_control_stack == NULL
6599 || mri_control_stack->type != mri_if)
6601 as_bad (_("endi without matching if"));
6602 ignore_rest_of_line ();
6606 /* ignore_input will not return true for ENDI, so we don't need to
6607 worry about checking it again here. */
6609 if (! mri_control_stack->else_seen)
6610 colon (mri_control_stack->next);
6611 colon (mri_control_stack->bottom);
6617 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6618 ++input_line_pointer;
6621 demand_empty_rest_of_line ();
6624 /* Handle the MRI BREAK pseudo-op. */
6627 s_mri_break (int extent)
6629 struct mri_control_info *n;
6633 n = mri_control_stack;
6635 && n->type != mri_for
6636 && n->type != mri_repeat
6637 && n->type != mri_while)
6641 as_bad (_("break outside of structured loop"));
6642 ignore_rest_of_line ();
6646 buf = (char *) xmalloc (20 + strlen (n->bottom));
6647 ex[0] = TOLOWER (extent);
6649 sprintf (buf, "bra%s %s", ex, n->bottom);
6655 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6656 ++input_line_pointer;
6659 demand_empty_rest_of_line ();
6662 /* Handle the MRI NEXT pseudo-op. */
6665 s_mri_next (int extent)
6667 struct mri_control_info *n;
6671 n = mri_control_stack;
6673 && n->type != mri_for
6674 && n->type != mri_repeat
6675 && n->type != mri_while)
6679 as_bad (_("next outside of structured loop"));
6680 ignore_rest_of_line ();
6684 buf = (char *) xmalloc (20 + strlen (n->next));
6685 ex[0] = TOLOWER (extent);
6687 sprintf (buf, "bra%s %s", ex, n->next);
6693 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6694 ++input_line_pointer;
6697 demand_empty_rest_of_line ();
6700 /* Handle the MRI FOR pseudo-op. */
6703 s_mri_for (int qual)
6705 const char *varstart, *varstop;
6706 const char *initstart, *initstop;
6707 const char *endstart, *endstop;
6708 const char *bystart, *bystop;
6712 struct mri_control_info *n;
6718 FOR.q var = init { TO | DOWNTO } end [ BY by ] DO.e
6722 varstart = input_line_pointer;
6724 /* Look for the '='. */
6725 while (! is_end_of_line[(unsigned char) *input_line_pointer]
6726 && *input_line_pointer != '=')
6727 ++input_line_pointer;
6728 if (*input_line_pointer != '=')
6730 as_bad (_("missing ="));
6731 ignore_rest_of_line ();
6735 varstop = input_line_pointer;
6736 if (varstop > varstart
6737 && (varstop[-1] == ' ' || varstop[-1] == '\t'))
6740 ++input_line_pointer;
6742 initstart = input_line_pointer;
6744 /* Look for TO or DOWNTO. */
6747 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6749 if (strncasecmp (input_line_pointer, "TO", 2) == 0
6750 && ! is_part_of_name (input_line_pointer[2]))
6752 initstop = input_line_pointer;
6753 input_line_pointer += 2;
6756 if (strncasecmp (input_line_pointer, "DOWNTO", 6) == 0
6757 && ! is_part_of_name (input_line_pointer[6]))
6759 initstop = input_line_pointer;
6761 input_line_pointer += 6;
6764 ++input_line_pointer;
6766 if (initstop == NULL)
6768 as_bad (_("missing to or downto"));
6769 ignore_rest_of_line ();
6772 if (initstop > initstart
6773 && (initstop[-1] == ' ' || initstop[-1] == '\t'))
6777 endstart = input_line_pointer;
6779 /* Look for BY or DO. */
6782 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6784 if (strncasecmp (input_line_pointer, "BY", 2) == 0
6785 && ! is_part_of_name (input_line_pointer[2]))
6787 endstop = input_line_pointer;
6789 input_line_pointer += 2;
6792 if (strncasecmp (input_line_pointer, "DO", 2) == 0
6793 && (input_line_pointer[2] == '.'
6794 || ! is_part_of_name (input_line_pointer[2])))
6796 endstop = input_line_pointer;
6797 input_line_pointer += 2;
6800 ++input_line_pointer;
6802 if (endstop == NULL)
6804 as_bad (_("missing do"));
6805 ignore_rest_of_line ();
6808 if (endstop > endstart
6809 && (endstop[-1] == ' ' || endstop[-1] == '\t'))
6815 bystop = bystart + 2;
6820 bystart = input_line_pointer;
6824 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6826 if (strncasecmp (input_line_pointer, "DO", 2) == 0
6827 && (input_line_pointer[2] == '.'
6828 || ! is_part_of_name (input_line_pointer[2])))
6830 bystop = input_line_pointer;
6831 input_line_pointer += 2;
6834 ++input_line_pointer;
6838 as_bad (_("missing do"));
6839 ignore_rest_of_line ();
6842 if (bystop > bystart
6843 && (bystop[-1] == ' ' || bystop[-1] == '\t'))
6847 if (*input_line_pointer != '.')
6851 extent = input_line_pointer[1];
6852 input_line_pointer += 2;
6855 /* We have fully parsed the FOR operands. Now build the loop. */
6856 n = push_mri_control (mri_for);
6858 buf = (char *) xmalloc (50 + (input_line_pointer - varstart));
6860 /* Move init,var. */
6867 *s++ = TOLOWER (qual);
6869 memcpy (s, initstart, initstop - initstart);
6870 s += initstop - initstart;
6872 memcpy (s, varstart, varstop - varstart);
6873 s += varstop - varstart;
6885 *s++ = TOLOWER (qual);
6887 memcpy (s, endstart, endstop - endstart);
6888 s += endstop - endstart;
6890 memcpy (s, varstart, varstop - varstart);
6891 s += varstop - varstart;
6896 ex[0] = TOLOWER (extent);
6899 sprintf (buf, "blt%s %s", ex, n->bottom);
6901 sprintf (buf, "bgt%s %s", ex, n->bottom);
6904 /* Put together the add or sub instruction used by ENDF. */
6912 *s++ = TOLOWER (qual);
6914 memcpy (s, bystart, bystop - bystart);
6915 s += bystop - bystart;
6917 memcpy (s, varstart, varstop - varstart);
6918 s += varstop - varstart;
6924 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6925 ++input_line_pointer;
6928 demand_empty_rest_of_line ();
6931 /* Handle the MRI ENDF pseudo-op. */
6934 s_mri_endf (int ignore ATTRIBUTE_UNUSED)
6936 if (mri_control_stack == NULL
6937 || mri_control_stack->type != mri_for)
6939 as_bad (_("endf without for"));
6940 ignore_rest_of_line ();
6944 colon (mri_control_stack->next);
6946 mri_assemble (mri_control_stack->incr);
6948 sprintf (mri_control_stack->incr, "bra %s", mri_control_stack->top);
6949 mri_assemble (mri_control_stack->incr);
6951 free (mri_control_stack->incr);
6953 colon (mri_control_stack->bottom);
6959 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6960 ++input_line_pointer;
6963 demand_empty_rest_of_line ();
6966 /* Handle the MRI REPEAT pseudo-op. */
6969 s_mri_repeat (int ignore ATTRIBUTE_UNUSED)
6971 struct mri_control_info *n;
6973 n = push_mri_control (mri_repeat);
6977 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6978 ++input_line_pointer;
6980 demand_empty_rest_of_line ();
6983 /* Handle the MRI UNTIL pseudo-op. */
6986 s_mri_until (int qual)
6990 if (mri_control_stack == NULL
6991 || mri_control_stack->type != mri_repeat)
6993 as_bad (_("until without repeat"));
6994 ignore_rest_of_line ();
6998 colon (mri_control_stack->next);
7000 for (s = input_line_pointer; ! is_end_of_line[(unsigned char) *s]; s++)
7003 parse_mri_control_expression (s, qual, (const char *) NULL,
7004 mri_control_stack->top, '\0');
7006 colon (mri_control_stack->bottom);
7008 input_line_pointer = s;
7014 while (! is_end_of_line[(unsigned char) *input_line_pointer])
7015 ++input_line_pointer;
7018 demand_empty_rest_of_line ();
7021 /* Handle the MRI WHILE pseudo-op. */
7024 s_mri_while (int qual)
7028 struct mri_control_info *n;
7030 s = input_line_pointer;
7031 /* We only accept '*' as introduction of comments if preceded by white space
7032 or at first column of a line (I think this can't actually happen here?)
7033 This is important when assembling:
7034 while d0 <ne> 12(a0,d0*2) do
7035 while d0 <ne> #CONST*20 do. */
7036 while (! (is_end_of_line[(unsigned char) *s]
7039 && (s == input_line_pointer
7041 || *(s-1) == '\t'))))
7044 while (*s == ' ' || *s == '\t')
7046 if (s - input_line_pointer > 1
7049 if (s - input_line_pointer < 2
7050 || strncasecmp (s - 1, "DO", 2) != 0)
7052 as_bad (_("missing do"));
7053 ignore_rest_of_line ();
7057 n = push_mri_control (mri_while);
7061 parse_mri_control_expression (s - 1, qual, (const char *) NULL, n->bottom,
7062 s[1] == '.' ? s[2] : '\0');
7064 input_line_pointer = s + 1;
7065 if (*input_line_pointer == '.')
7066 input_line_pointer += 2;
7070 while (! is_end_of_line[(unsigned char) *input_line_pointer])
7071 ++input_line_pointer;
7074 demand_empty_rest_of_line ();
7077 /* Handle the MRI ENDW pseudo-op. */
7080 s_mri_endw (int ignore ATTRIBUTE_UNUSED)
7084 if (mri_control_stack == NULL
7085 || mri_control_stack->type != mri_while)
7087 as_bad (_("endw without while"));
7088 ignore_rest_of_line ();
7092 buf = (char *) xmalloc (20 + strlen (mri_control_stack->next));
7093 sprintf (buf, "bra %s", mri_control_stack->next);
7097 colon (mri_control_stack->bottom);
7103 while (! is_end_of_line[(unsigned char) *input_line_pointer])
7104 ++input_line_pointer;
7107 demand_empty_rest_of_line ();
7110 /* Parse a .cpu directive. */
7113 s_m68k_cpu (int ignored ATTRIBUTE_UNUSED)
7120 as_bad (_("already assembled instructions"));
7121 ignore_rest_of_line ();
7125 name = input_line_pointer;
7126 while (*input_line_pointer && !ISSPACE(*input_line_pointer))
7127 input_line_pointer++;
7128 saved_char = *input_line_pointer;
7129 *input_line_pointer = 0;
7131 m68k_set_cpu (name, 1, 0);
7133 *input_line_pointer = saved_char;
7134 demand_empty_rest_of_line ();
7138 /* Parse a .arch directive. */
7141 s_m68k_arch (int ignored ATTRIBUTE_UNUSED)
7148 as_bad (_("already assembled instructions"));
7149 ignore_rest_of_line ();
7153 name = input_line_pointer;
7154 while (*input_line_pointer && *input_line_pointer != ','
7155 && !ISSPACE (*input_line_pointer))
7156 input_line_pointer++;
7157 saved_char = *input_line_pointer;
7158 *input_line_pointer = 0;
7160 if (m68k_set_arch (name, 1, 0))
7162 /* Scan extensions. */
7165 *input_line_pointer++ = saved_char;
7166 if (!*input_line_pointer || ISSPACE (*input_line_pointer))
7168 name = input_line_pointer;
7169 while (*input_line_pointer && *input_line_pointer != ','
7170 && !ISSPACE (*input_line_pointer))
7171 input_line_pointer++;
7172 saved_char = *input_line_pointer;
7173 *input_line_pointer = 0;
7175 while (m68k_set_extension (name, 1, 0));
7178 *input_line_pointer = saved_char;
7179 demand_empty_rest_of_line ();
7183 /* Lookup a cpu name in TABLE and return the slot found. Return NULL
7184 if none is found, the caller is responsible for emitting an error
7185 message. If ALLOW_M is non-zero, we allow an initial 'm' on the
7186 cpu name, if it begins with a '6' (possibly skipping an intervening
7187 'c'. We also allow a 'c' in the same place. if NEGATED is
7188 non-zero, we accept a leading 'no-' and *NEGATED is set to true, if
7189 the option is indeed negated. */
7191 static const struct m68k_cpu *
7192 m68k_lookup_cpu (const char *arg, const struct m68k_cpu *table,
7193 int allow_m, int *negated)
7195 /* allow negated value? */
7200 if (arg[0] == 'n' && arg[1] == 'o' && arg[2] == '-')
7207 /* Remove 'm' or 'mc' prefix from 68k variants. */
7214 else if (arg[1] == 'c' && arg[2] == '6')
7218 else if (arg[0] == 'c' && arg[1] == '6')
7221 for (; table->name; table++)
7222 if (!strcmp (arg, table->name))
7224 if (table->alias < -1 || table->alias > 1)
7225 as_bad (_("`%s' is deprecated, use `%s'"),
7226 table->name, table[table->alias < 0 ? 1 : -1].name);
7232 /* Set the cpu, issuing errors if it is unrecognized. */
7235 m68k_set_cpu (char const *name, int allow_m, int silent)
7237 const struct m68k_cpu *cpu;
7239 cpu = m68k_lookup_cpu (name, m68k_cpus, allow_m, NULL);
7244 as_bad (_("cpu `%s' unrecognized"), name);
7251 /* Set the architecture, issuing errors if it is unrecognized. */
7254 m68k_set_arch (char const *name, int allow_m, int silent)
7256 const struct m68k_cpu *arch;
7258 arch = m68k_lookup_cpu (name, m68k_archs, allow_m, NULL);
7263 as_bad (_("architecture `%s' unrecognized"), name);
7266 selected_arch = arch;
7270 /* Set the architecture extension, issuing errors if it is
7271 unrecognized, or invalid */
7274 m68k_set_extension (char const *name, int allow_m, int silent)
7277 const struct m68k_cpu *ext;
7279 ext = m68k_lookup_cpu (name, m68k_extensions, allow_m, &negated);
7284 as_bad (_("extension `%s' unrecognized"), name);
7289 not_current_architecture |= ext->arch;
7291 current_architecture |= ext->arch;
7296 Invocation line includes a switch not recognized by the base assembler.
7300 const char *md_shortopts = "lSA:m:kQ:V";
7302 const char *md_shortopts = "lSA:m:k";
7305 struct option md_longopts[] = {
7306 #define OPTION_PIC (OPTION_MD_BASE)
7307 {"pic", no_argument, NULL, OPTION_PIC},
7308 #define OPTION_REGISTER_PREFIX_OPTIONAL (OPTION_MD_BASE + 1)
7309 {"register-prefix-optional", no_argument, NULL,
7310 OPTION_REGISTER_PREFIX_OPTIONAL},
7311 #define OPTION_BITWISE_OR (OPTION_MD_BASE + 2)
7312 {"bitwise-or", no_argument, NULL, OPTION_BITWISE_OR},
7313 #define OPTION_BASE_SIZE_DEFAULT_16 (OPTION_MD_BASE + 3)
7314 {"base-size-default-16", no_argument, NULL, OPTION_BASE_SIZE_DEFAULT_16},
7315 #define OPTION_BASE_SIZE_DEFAULT_32 (OPTION_MD_BASE + 4)
7316 {"base-size-default-32", no_argument, NULL, OPTION_BASE_SIZE_DEFAULT_32},
7317 #define OPTION_DISP_SIZE_DEFAULT_16 (OPTION_MD_BASE + 5)
7318 {"disp-size-default-16", no_argument, NULL, OPTION_DISP_SIZE_DEFAULT_16},
7319 #define OPTION_DISP_SIZE_DEFAULT_32 (OPTION_MD_BASE + 6)
7320 {"disp-size-default-32", no_argument, NULL, OPTION_DISP_SIZE_DEFAULT_32},
7321 #define OPTION_PCREL (OPTION_MD_BASE + 7)
7322 {"pcrel", no_argument, NULL, OPTION_PCREL},
7323 {NULL, no_argument, NULL, 0}
7325 size_t md_longopts_size = sizeof (md_longopts);
7328 md_parse_option (int c, char *arg)
7332 case 'l': /* -l means keep external to 2 bit offset
7333 rather than 16 bit one. */
7334 flag_short_refs = 1;
7337 case 'S': /* -S means that jbsr's always turn into
7339 flag_long_jumps = 1;
7342 case OPTION_PCREL: /* --pcrel means never turn PC-relative
7343 branches into absolute jumps. */
7344 flag_keep_pcrel = 1;
7350 break; /* -pic, Position Independent Code. */
7352 case OPTION_REGISTER_PREFIX_OPTIONAL:
7353 flag_reg_prefix_optional = 1;
7354 reg_prefix_optional_seen = 1;
7357 /* -V: SVR4 argument to print version ID. */
7359 print_version_id ();
7362 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
7363 should be emitted or not. FIXME: Not implemented. */
7367 case OPTION_BITWISE_OR:
7372 n = (char *) xmalloc (strlen (m68k_comment_chars) + 1);
7374 for (s = m68k_comment_chars; *s != '\0'; s++)
7378 m68k_comment_chars = n;
7382 case OPTION_BASE_SIZE_DEFAULT_16:
7383 m68k_index_width_default = SIZE_WORD;
7386 case OPTION_BASE_SIZE_DEFAULT_32:
7387 m68k_index_width_default = SIZE_LONG;
7390 case OPTION_DISP_SIZE_DEFAULT_16:
7392 m68k_rel32_from_cmdline = 1;
7395 case OPTION_DISP_SIZE_DEFAULT_32:
7397 m68k_rel32_from_cmdline = 1;
7402 as_tsktsk (_ ("option `-A%s' is deprecated: use `-%s'",
7405 /* Intentional fall-through. */
7407 if (!strncmp (arg, "arch=", 5))
7408 m68k_set_arch (arg + 5, 1, 0);
7409 else if (!strncmp (arg, "cpu=", 4))
7410 m68k_set_cpu (arg + 4, 1, 0);
7411 else if (m68k_set_extension (arg, 0, 1))
7413 else if (m68k_set_arch (arg, 0, 1))
7415 else if (m68k_set_cpu (arg, 0, 1))
7428 /* Setup tables from the selected arch and/or cpu */
7431 m68k_init_arch (void)
7433 if (not_current_architecture & current_architecture)
7435 as_bad (_("architecture features both enabled and disabled"));
7436 not_current_architecture &= ~current_architecture;
7440 current_architecture |= selected_arch->arch;
7441 control_regs = selected_arch->control_regs;
7444 current_architecture |= selected_cpu->arch;
7446 current_architecture &= ~not_current_architecture;
7448 if ((current_architecture & (cfloat | m68881)) == (cfloat | m68881))
7450 /* Determine which float is really meant. */
7451 if (current_architecture & (m68k_mask & ~m68881))
7452 current_architecture ^= cfloat;
7454 current_architecture ^= m68881;
7459 control_regs = selected_cpu->control_regs;
7460 if (current_architecture & ~selected_cpu->arch)
7462 as_bad (_("selected processor does not have all features of selected architecture"));
7463 current_architecture
7464 = selected_cpu->arch & ~not_current_architecture;
7468 if ((current_architecture & m68k_mask)
7469 && (current_architecture & ~m68k_mask))
7471 as_bad (_ ("m68k and cf features both selected"));
7472 if (current_architecture & m68k_mask)
7473 current_architecture &= m68k_mask;
7475 current_architecture &= ~m68k_mask;
7478 /* Permit m68881 specification with all cpus; those that can't work
7479 with a coprocessor could be doing emulation. */
7480 if (current_architecture & m68851)
7482 if (current_architecture & m68040)
7483 as_warn (_("68040 and 68851 specified; mmu instructions may assemble incorrectly"));
7485 /* What other incompatibilities could we check for? */
7487 if (cpu_of_arch (current_architecture) < m68020
7488 || arch_coldfire_p (current_architecture))
7489 md_relax_table[TAB (PCINDEX, BYTE)].rlx_more = 0;
7495 md_show_usage (FILE *stream)
7497 const char *default_cpu = TARGET_CPU;
7499 unsigned int default_arch;
7501 /* Get the canonical name for the default target CPU. */
7502 if (*default_cpu == 'm')
7504 for (i = 0; m68k_cpus[i].name; i++)
7506 if (strcasecmp (default_cpu, m68k_cpus[i].name) == 0)
7508 default_arch = m68k_cpus[i].arch;
7509 while (m68k_cpus[i].alias > 0)
7511 while (m68k_cpus[i].alias < 0)
7513 default_cpu = m68k_cpus[i].name;
7517 fprintf (stream, _("\
7518 -march=<arch> set architecture\n\
7519 -mcpu=<cpu> set cpu [default %s]\n\
7521 for (i = 0; m68k_extensions[i].name; i++)
7522 fprintf (stream, _("\
7523 -m[no-]%-16s enable/disable%s architecture extension\n\
7524 "), m68k_extensions[i].name,
7525 m68k_extensions[i].alias > 0 ? " ColdFire"
7526 : m68k_extensions[i].alias < 0 ? " m68k" : "");
7528 fprintf (stream, _("\
7529 -l use 1 word for refs to undefined symbols [default 2]\n\
7530 -pic, -k generate position independent code\n\
7531 -S turn jbsr into jsr\n\
7532 --pcrel never turn PC-relative branches into absolute jumps\n\
7533 --register-prefix-optional\n\
7534 recognize register names without prefix character\n\
7535 --bitwise-or do not treat `|' as a comment character\n\
7536 --base-size-default-16 base reg without size is 16 bits\n\
7537 --base-size-default-32 base reg without size is 32 bits (default)\n\
7538 --disp-size-default-16 displacement with unknown size is 16 bits\n\
7539 --disp-size-default-32 displacement with unknown size is 32 bits (default)\n\
7542 fprintf (stream, _("Architecture variants are: "));
7543 for (i = 0; m68k_archs[i].name; i++)
7546 fprintf (stream, " | ");
7547 fprintf (stream, m68k_archs[i].name);
7549 fprintf (stream, "\n");
7551 fprintf (stream, _("Processor variants are: "));
7552 for (i = 0; m68k_cpus[i].name; i++)
7555 fprintf (stream, " | ");
7556 fprintf (stream, m68k_cpus[i].name);
7558 fprintf (stream, _("\n"));
7563 /* TEST2: Test md_assemble() */
7564 /* Warning, this routine probably doesn't work anymore. */
7568 struct m68k_it the_ins;
7576 if (!gets (buf) || !*buf)
7578 if (buf[0] == '|' || buf[1] == '.')
7580 for (cp = buf; *cp; cp++)
7585 memset (&the_ins, '\0', sizeof (the_ins));
7586 m68k_ip (&the_ins, buf);
7589 printf (_("Error %s in %s\n"), the_ins.error, buf);
7593 printf (_("Opcode(%d.%s): "), the_ins.numo, the_ins.args);
7594 for (n = 0; n < the_ins.numo; n++)
7595 printf (" 0x%x", the_ins.opcode[n] & 0xffff);
7597 print_the_insn (&the_ins.opcode[0], stdout);
7598 (void) putchar ('\n');
7600 for (n = 0; n < strlen (the_ins.args) / 2; n++)
7602 if (the_ins.operands[n].error)
7604 printf ("op%d Error %s in %s\n", n, the_ins.operands[n].error, buf);
7607 printf ("mode %d, reg %d, ", the_ins.operands[n].mode,
7608 the_ins.operands[n].reg);
7609 if (the_ins.operands[n].b_const)
7610 printf ("Constant: '%.*s', ",
7611 1 + the_ins.operands[n].e_const - the_ins.operands[n].b_const,
7612 the_ins.operands[n].b_const);
7613 printf ("ireg %d, isiz %d, imul %d, ", the_ins.operands[n].ireg,
7614 the_ins.operands[n].isiz, the_ins.operands[n].imul);
7615 if (the_ins.operands[n].b_iadd)
7616 printf ("Iadd: '%.*s',",
7617 1 + the_ins.operands[n].e_iadd - the_ins.operands[n].b_iadd,
7618 the_ins.operands[n].b_iadd);
7627 is_label (char *str)
7631 while (*str && *str != ' ')
7633 if (str[-1] == ':' || str[1] == '=')
7640 /* Possible states for relaxation:
7642 0 0 branch offset byte (bra, etc)
7646 1 0 indexed offsets byte a0@(32,d4:w:1) etc
7650 2 0 two-offset index word-word a0@(32,d4)@(45) etc
7657 /* We have no need to default values of symbols. */
7660 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
7665 /* Round up a section size to the appropriate boundary. */
7667 md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
7670 /* For a.out, force the section size to be aligned. If we don't do
7671 this, BFD will align it for us, but it will not write out the
7672 final bytes of the section. This may be a bug in BFD, but it is
7673 easier to fix it here since that is how the other a.out targets
7677 align = bfd_get_section_alignment (stdoutput, segment);
7678 size = ((size + (1 << align) - 1) & ((valueT) -1 << align));
7684 /* Exactly what point is a PC-relative offset relative TO?
7685 On the 68k, it is relative to the address of the first extension
7686 word. The difference between the addresses of the offset and the
7687 first extension word is stored in fx_pcrel_adjust. */
7689 md_pcrel_from (fixS *fixP)
7693 /* Because fx_pcrel_adjust is a char, and may be unsigned, we explicitly
7694 sign extend the value here. */
7695 adjust = ((fixP->fx_pcrel_adjust & 0xff) ^ 0x80) - 0x80;
7698 return fixP->fx_where + fixP->fx_frag->fr_address - adjust;
7703 m68k_elf_final_processing (void)
7707 if (arch_coldfire_fpu (current_architecture))
7708 flags |= EF_M68K_CFV4E;
7709 /* Set file-specific flags if this is a cpu32 processor. */
7710 if (cpu_of_arch (current_architecture) & cpu32)
7711 flags |= EF_M68K_CPU32;
7712 else if (cpu_of_arch (current_architecture) & fido_a)
7713 flags |= EF_M68K_FIDO;
7714 else if ((cpu_of_arch (current_architecture) & m68000up)
7715 && !(cpu_of_arch (current_architecture) & m68020up))
7716 flags |= EF_M68K_M68000;
7718 if (current_architecture & mcfisa_a)
7720 static const unsigned isa_features[][2] =
7722 {EF_M68K_CF_ISA_A_NODIV,mcfisa_a},
7723 {EF_M68K_CF_ISA_A, mcfisa_a|mcfhwdiv},
7724 {EF_M68K_CF_ISA_A_PLUS, mcfisa_a|mcfisa_aa|mcfhwdiv|mcfusp},
7725 {EF_M68K_CF_ISA_B_NOUSP,mcfisa_a|mcfisa_b|mcfhwdiv},
7726 {EF_M68K_CF_ISA_B, mcfisa_a|mcfisa_b|mcfhwdiv|mcfusp},
7727 {EF_M68K_CF_ISA_C, mcfisa_a|mcfisa_c|mcfhwdiv|mcfusp},
7728 {EF_M68K_CF_ISA_C_NODIV,mcfisa_a|mcfisa_c|mcfusp},
7731 static const unsigned mac_features[][2] =
7733 {EF_M68K_CF_MAC, mcfmac},
7734 {EF_M68K_CF_EMAC, mcfemac},
7740 pattern = (current_architecture
7741 & (mcfisa_a|mcfisa_aa|mcfisa_b|mcfisa_c|mcfhwdiv|mcfusp));
7742 for (ix = 0; isa_features[ix][1]; ix++)
7744 if (pattern == isa_features[ix][1])
7746 flags |= isa_features[ix][0];
7750 if (!isa_features[ix][1])
7753 as_warn (_("Not a defined coldfire architecture"));
7757 if (current_architecture & cfloat)
7758 flags |= EF_M68K_CF_FLOAT | EF_M68K_CFV4E;
7760 pattern = current_architecture & (mcfmac|mcfemac);
7763 for (ix = 0; mac_features[ix][1]; ix++)
7765 if (pattern == mac_features[ix][1])
7767 flags |= mac_features[ix][0];
7771 if (!mac_features[ix][1])
7776 elf_elfheader (stdoutput)->e_flags |= flags;
7781 tc_m68k_regname_to_dw2regnum (char *regname)
7783 unsigned int regnum;
7784 static const char *const regnames[] =
7786 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
7787 "a0", "a1", "a2", "a3", "a4", "a5", "a6", "sp",
7788 "fp0", "fp1", "fp2", "fp3", "fp4", "fp5", "fp6", "fp7",
7792 for (regnum = 0; regnum < ARRAY_SIZE (regnames); regnum++)
7793 if (strcmp (regname, regnames[regnum]) == 0)
7800 tc_m68k_frame_initial_instructions (void)
7802 static int sp_regno = -1;
7805 sp_regno = tc_m68k_regname_to_dw2regnum ("sp");
7807 cfi_add_CFA_def_cfa (sp_regno, -DWARF2_CIE_DATA_ALIGNMENT);
7808 cfi_add_CFA_offset (DWARF2_DEFAULT_RETURN_COLUMN, DWARF2_CIE_DATA_ALIGNMENT);