1 /* tc-m68k.c -- Assemble for the m68k family
2 Copyright 1987, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
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 2, 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 mcf5206_ctrl[] = {
180 CACR, ACR0, ACR1, VBR, RAMBAR0, RAMBAR_ALT, MBAR,
183 static const enum m68k_register mcf5208_ctrl[] = {
184 CACR, ACR0, ACR1, VBR, RAMBAR, RAMBAR1,
187 static const enum m68k_register mcf5210a_ctrl[] = {
188 VBR, CACR, ACR0, ACR1, ROMBAR, RAMBAR, RAMBAR1, MBAR,
191 static const enum m68k_register mcf5213_ctrl[] = {
192 VBR, RAMBAR, RAMBAR1, FLASHBAR,
195 static const enum m68k_register mcf5216_ctrl[] = {
196 VBR, CACR, ACR0, ACR1, FLASHBAR, RAMBAR, RAMBAR1,
199 static const enum m68k_register mcf52223_ctrl[] = {
200 VBR, CACR, ACR0, ACR1, FLASHBAR, RAMBAR, RAMBAR1,
203 static const enum m68k_register mcf52235_ctrl[] = {
204 VBR, FLASHBAR, RAMBAR, RAMBAR1,
207 static const enum m68k_register mcf5225_ctrl[] = {
208 VBR, CACR, ACR0, ACR1, FLASHBAR, RAMBAR, MBAR, RAMBAR1,
211 static const enum m68k_register mcf5235_ctrl[] = {
212 VBR, CACR, ACR0, ACR1, RAMBAR, RAMBAR1,
215 static const enum m68k_register mcf5249_ctrl[] = {
216 VBR, CACR, ACR0, ACR1, RAMBAR0, RAMBAR1, RAMBAR, MBAR, MBAR2,
219 static const enum m68k_register mcf5250_ctrl[] = {
223 static const enum m68k_register mcf5253_ctrl[] = {
224 VBR, CACR, ACR0, ACR1, RAMBAR0, RAMBAR1, MBAR,
227 static const enum m68k_register mcf5271_ctrl[] = {
228 VBR, CACR, ACR0, ACR1, RAMBAR, RAMBAR1,
231 static const enum m68k_register mcf5272_ctrl[] = {
232 VBR, CACR, ACR0, ACR1, ROMBAR, RAMBAR_ALT, RAMBAR0, MBAR,
235 static const enum m68k_register mcf5275_ctrl[] = {
236 VBR, CACR, ACR0, ACR1, RAMBAR, RAMBAR1,
239 static const enum m68k_register mcf5282_ctrl[] = {
240 VBR, CACR, ACR0, ACR1, FLASHBAR, RAMBAR, RAMBAR1,
243 static const enum m68k_register mcf5307_ctrl[] = {
244 CACR, ACR0, ACR1, VBR, RAMBAR0, RAMBAR_ALT, MBAR,
247 static const enum m68k_register mcf5329_ctrl[] = {
248 VBR, CACR, ACR0, ACR1, RAMBAR, RAMBAR1,
251 static const enum m68k_register mcf5373_ctrl[] = {
252 VBR, CACR, ACR0, ACR1, RAMBAR, RAMBAR1,
255 static const enum m68k_register mcfv4e_ctrl[] = {
256 CACR, ASID, ACR0, ACR1, ACR2, ACR3, MMUBAR,
257 VBR, PC, ROMBAR0, ROMBAR1, RAMBAR0, RAMBAR1,
259 MPCR /* Multiprocessor Control register */,
260 EDRAMBAR /* Embedded DRAM Base Address Register */,
261 /* Permutation control registers. */
262 PCR1U0, PCR1L0, PCR1U1, PCR1L1, PCR2U0, PCR2L0, PCR2U1, PCR2L1,
263 PCR3U0, PCR3L0, PCR3U1, PCR3L1,
265 TC /* ASID */, BUSCR /* MMUBAR */,
266 ITT0 /* ACR0 */, ITT1 /* ACR1 */, DTT0 /* ACR2 */, DTT1 /* ACR3 */,
267 MBAR1 /* MBAR */, MBAR2 /* SECMBAR */, MBAR0 /* SECMBAR */,
268 ROMBAR /* ROMBAR0 */, RAMBAR /* RAMBAR1 */,
271 static const enum m68k_register mcf54455_ctrl[] = {
272 CACR, ASID, ACR0, ACR1, ACR2, ACR3, MMUBAR,
273 VBR, PC, RAMBAR1, MBAR,
275 TC /* ASID */, BUSCR /* MMUBAR */,
276 ITT0 /* ACR0 */, ITT1 /* ACR1 */, DTT0 /* ACR2 */, DTT1 /* ACR3 */,
277 MBAR1 /* MBAR */, RAMBAR /* RAMBAR1 */,
280 static const enum m68k_register mcf5475_ctrl[] = {
281 CACR, ASID, ACR0, ACR1, ACR2, ACR3, MMUBAR,
282 VBR, PC, RAMBAR0, RAMBAR1, MBAR,
284 TC /* ASID */, BUSCR /* MMUBAR */,
285 ITT0 /* ACR0 */, ITT1 /* ACR1 */, DTT0 /* ACR2 */, DTT1 /* ACR3 */,
286 MBAR1 /* MBAR */, RAMBAR /* RAMBAR1 */,
289 static const enum m68k_register mcf5485_ctrl[] = {
290 CACR, ASID, ACR0, ACR1, ACR2, ACR3, MMUBAR,
291 VBR, PC, RAMBAR0, RAMBAR1, MBAR,
293 TC /* ASID */, BUSCR /* MMUBAR */,
294 ITT0 /* ACR0 */, ITT1 /* ACR1 */, DTT0 /* ACR2 */, DTT1 /* ACR3 */,
295 MBAR1 /* MBAR */, RAMBAR /* RAMBAR1 */,
298 static const enum m68k_register fido_ctrl[] = {
299 SFC, DFC, USP, VBR, CAC, MBB,
302 #define cpu32_ctrl m68010_ctrl
304 static const enum m68k_register *control_regs;
306 /* Internal form of a 68020 instruction. */
310 const char *args; /* List of opcode info. */
313 int numo; /* Number of shorts in opcode. */
316 struct m68k_op operands[6];
318 int nexp; /* Number of exprs in use. */
319 struct m68k_exp exprs[4];
321 int nfrag; /* Number of frags we have to produce. */
324 int fragoff; /* Where in the current opcode the frag ends. */
331 int nrel; /* Num of reloc strucs in use. */
338 /* In a pc relative address the difference between the address
339 of the offset and the address that the offset is relative
340 to. This depends on the addressing mode. Basically this
341 is the value to put in the offset field to address the
342 first byte of the offset, without regarding the special
343 significance of some values (in the branch instruction, for
347 /* Whether this expression needs special pic relocation, and if
349 enum pic_relocation pic_reloc;
352 reloc[5]; /* Five is enough??? */
355 #define cpu_of_arch(x) ((x) & (m68000up | mcfisa_a | fido_a))
356 #define float_of_arch(x) ((x) & mfloat)
357 #define mmu_of_arch(x) ((x) & mmmu)
358 #define arch_coldfire_p(x) ((x) & mcfisa_a)
359 #define arch_coldfire_fpu(x) ((x) & cfloat)
361 /* Macros for determining if cpu supports a specific addressing mode. */
362 #define HAVE_LONG_DISP(x) \
363 ((x) & (m68020|m68030|m68040|m68060|cpu32|fido_a|mcfisa_b|mcfisa_c))
364 #define HAVE_LONG_CALL(x) \
365 ((x) & (m68020|m68030|m68040|m68060|cpu32|fido_a|mcfisa_b|mcfisa_c))
366 #define HAVE_LONG_COND(x) \
367 ((x) & (m68020|m68030|m68040|m68060|cpu32|fido_a|mcfisa_b|mcfisa_c))
368 #define HAVE_LONG_BRANCH(x) \
369 ((x) & (m68020|m68030|m68040|m68060|cpu32|fido_a|mcfisa_b))
371 static struct m68k_it the_ins; /* The instruction being assembled. */
373 #define op(ex) ((ex)->exp.X_op)
374 #define adds(ex) ((ex)->exp.X_add_symbol)
375 #define subs(ex) ((ex)->exp.X_op_symbol)
376 #define offs(ex) ((ex)->exp.X_add_number)
378 /* Macros for adding things to the m68k_it struct. */
379 #define addword(w) (the_ins.opcode[the_ins.numo++] = (w))
381 /* Like addword, but goes BEFORE general operands. */
384 insop (int w, const struct m68k_incant *opcode)
387 for (z = the_ins.numo; z > opcode->m_codenum; --z)
388 the_ins.opcode[z] = the_ins.opcode[z - 1];
389 for (z = 0; z < the_ins.nrel; z++)
390 the_ins.reloc[z].n += 2;
391 for (z = 0; z < the_ins.nfrag; z++)
392 the_ins.fragb[z].fragoff++;
393 the_ins.opcode[opcode->m_codenum] = w;
397 /* The numo+1 kludge is so we can hit the low order byte of the prev word.
400 add_fix (int width, struct m68k_exp *exp, int pc_rel, int pc_fix)
402 the_ins.reloc[the_ins.nrel].n = (width == 'B' || width == '3'
403 ? the_ins.numo * 2 - 1
405 ? the_ins.numo * 2 + 1
406 : the_ins.numo * 2));
407 the_ins.reloc[the_ins.nrel].exp = exp->exp;
408 the_ins.reloc[the_ins.nrel].wid = width;
409 the_ins.reloc[the_ins.nrel].pcrel_fix = pc_fix;
411 the_ins.reloc[the_ins.nrel].pic_reloc = exp->pic_reloc;
413 the_ins.reloc[the_ins.nrel++].pcrel = pc_rel;
416 /* Cause an extra frag to be generated here, inserting up to 10 bytes
417 (that value is chosen in the frag_var call in md_assemble). TYPE
418 is the subtype of the frag to be generated; its primary type is
419 rs_machine_dependent.
421 The TYPE parameter is also used by md_convert_frag_1 and
422 md_estimate_size_before_relax. The appropriate type of fixup will
423 be emitted by md_convert_frag_1.
425 ADD becomes the FR_SYMBOL field of the frag, and OFF the FR_OFFSET. */
427 add_frag (symbolS *add, offsetT off, int type)
429 the_ins.fragb[the_ins.nfrag].fragoff = the_ins.numo;
430 the_ins.fragb[the_ins.nfrag].fadd = add;
431 the_ins.fragb[the_ins.nfrag].foff = off;
432 the_ins.fragb[the_ins.nfrag++].fragty = type;
436 (op (ex) != O_constant && op (ex) != O_big)
438 static char *crack_operand (char *str, struct m68k_op *opP);
439 static int get_num (struct m68k_exp *exp, int ok);
440 static int reverse_16_bits (int in);
441 static int reverse_8_bits (int in);
442 static void install_gen_operand (int mode, int val);
443 static void install_operand (int mode, int val);
444 static void s_bss (int);
445 static void s_data1 (int);
446 static void s_data2 (int);
447 static void s_even (int);
448 static void s_proc (int);
449 static void s_chip (int);
450 static void s_fopt (int);
451 static void s_opt (int);
452 static void s_reg (int);
453 static void s_restore (int);
454 static void s_save (int);
455 static void s_mri_if (int);
456 static void s_mri_else (int);
457 static void s_mri_endi (int);
458 static void s_mri_break (int);
459 static void s_mri_next (int);
460 static void s_mri_for (int);
461 static void s_mri_endf (int);
462 static void s_mri_repeat (int);
463 static void s_mri_until (int);
464 static void s_mri_while (int);
465 static void s_mri_endw (int);
466 static void s_m68k_cpu (int);
467 static void s_m68k_arch (int);
471 unsigned long arch; /* Architecture features. */
472 const enum m68k_register *control_regs; /* Control regs on chip */
473 const char *name; /* Name */
474 int alias; /* Alias for a cannonical name. If 1, then
475 succeeds canonical name, if -1 then
476 succeeds canonical name, if <-1 ||>1 this is a
477 deprecated name, and the next/previous name
481 /* We hold flags for features explicitly enabled and explicitly
483 static int current_architecture;
484 static int not_current_architecture;
485 static const struct m68k_cpu *selected_arch;
486 static const struct m68k_cpu *selected_cpu;
487 static int initialized;
489 /* Architecture models. */
490 static const struct m68k_cpu m68k_archs[] =
492 {m68000, m68000_ctrl, "68000", 0},
493 {m68010, m68010_ctrl, "68010", 0},
494 {m68020|m68881|m68851, m68020_ctrl, "68020", 0},
495 {m68030|m68881|m68851, m68020_ctrl, "68030", 0},
496 {m68040, m68040_ctrl, "68040", 0},
497 {m68060, m68060_ctrl, "68060", 0},
498 {cpu32|m68881, cpu32_ctrl, "cpu32", 0},
499 {fido_a, fido_ctrl, "fidoa", 0},
500 {mcfisa_a|mcfhwdiv, NULL, "isaa", 0},
501 {mcfisa_a|mcfhwdiv|mcfisa_aa|mcfusp, NULL, "isaaplus", 0},
502 {mcfisa_a|mcfhwdiv|mcfisa_b|mcfusp, NULL, "isab", 0},
503 {mcfisa_a|mcfhwdiv|mcfisa_c|mcfusp, NULL, "isac", 0},
504 {mcfisa_a|mcfhwdiv|mcfisa_b|mcfmac|mcfusp, mcf_ctrl, "cfv4", 0},
505 {mcfisa_a|mcfhwdiv|mcfisa_b|mcfemac|mcfusp|cfloat, mcfv4e_ctrl, "cfv4e", 0},
509 /* Architecture extensions, here 'alias' -1 for m68k, +1 for cf and 0
511 static const struct m68k_cpu m68k_extensions[] =
513 {m68851, NULL, "68851", -1},
514 {m68881, NULL, "68881", -1},
515 {m68881, NULL, "68882", -1},
517 {cfloat|m68881, NULL, "float", 0},
519 {mcfhwdiv, NULL, "div", 1},
520 {mcfusp, NULL, "usp", 1},
521 {mcfmac, NULL, "mac", 1},
522 {mcfemac, NULL, "emac", 1},
528 static const struct m68k_cpu m68k_cpus[] =
530 {m68000, m68000_ctrl, "68000", 0},
531 {m68000, m68000_ctrl, "68ec000", 1},
532 {m68000, m68000_ctrl, "68hc000", 1},
533 {m68000, m68000_ctrl, "68hc001", 1},
534 {m68000, m68000_ctrl, "68008", 1},
535 {m68000, m68000_ctrl, "68302", 1},
536 {m68000, m68000_ctrl, "68306", 1},
537 {m68000, m68000_ctrl, "68307", 1},
538 {m68000, m68000_ctrl, "68322", 1},
539 {m68000, m68000_ctrl, "68356", 1},
540 {m68010, m68010_ctrl, "68010", 0},
541 {m68020|m68881|m68851, m68020_ctrl, "68020", 0},
542 {m68020|m68881|m68851, m68020_ctrl, "68k", 1},
543 {m68020|m68881|m68851, m68020_ctrl, "68ec020", 1},
544 {m68030|m68881|m68851, m68020_ctrl, "68030", 0},
545 {m68030|m68881|m68851, m68020_ctrl, "68ec030", 1},
546 {m68040, m68040_ctrl, "68040", 0},
547 {m68040, m68040_ctrl, "68ec040", 1},
548 {m68060, m68060_ctrl, "68060", 0},
549 {m68060, m68060_ctrl, "68ec060", 1},
551 {cpu32|m68881, cpu32_ctrl, "cpu32", 0},
552 {cpu32|m68881, cpu32_ctrl, "68330", 1},
553 {cpu32|m68881, cpu32_ctrl, "68331", 1},
554 {cpu32|m68881, cpu32_ctrl, "68332", 1},
555 {cpu32|m68881, cpu32_ctrl, "68333", 1},
556 {cpu32|m68881, cpu32_ctrl, "68334", 1},
557 {cpu32|m68881, cpu32_ctrl, "68336", 1},
558 {cpu32|m68881, cpu32_ctrl, "68340", 1},
559 {cpu32|m68881, cpu32_ctrl, "68341", 1},
560 {cpu32|m68881, cpu32_ctrl, "68349", 1},
561 {cpu32|m68881, cpu32_ctrl, "68360", 1},
563 {mcfisa_a, mcf_ctrl, "5200", 0},
564 {mcfisa_a, mcf_ctrl, "5202", 1},
565 {mcfisa_a, mcf_ctrl, "5204", 1},
566 {mcfisa_a, mcf5206_ctrl, "5206", 1},
568 {mcfisa_a|mcfhwdiv|mcfmac, mcf5206_ctrl, "5206e", 0},
570 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5208_ctrl, "5207", -1},
571 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5208_ctrl, "5208", 0},
573 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf5210a_ctrl, "5210a", 0},
574 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf5210a_ctrl, "5211a", 1},
576 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf5213_ctrl, "5211", -1},
577 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf5213_ctrl, "5212", -1},
578 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf5213_ctrl, "5213", 0},
580 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5216_ctrl, "5214", -1},
581 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5216_ctrl, "5216", 0},
582 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5216_ctrl, "521x", 2},
584 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf52223_ctrl, "52221", -1},
585 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf52223_ctrl, "52223", 0},
587 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf52235_ctrl, "52230", -1},
588 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf52235_ctrl, "52233", -1},
589 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf52235_ctrl, "52234", -1},
590 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf52235_ctrl, "52235", 0},
592 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf5225_ctrl, "5224", -1},
593 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf5225_ctrl, "5225", 0},
595 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5235_ctrl, "5232", -1},
596 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5235_ctrl, "5233", -1},
597 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5235_ctrl, "5234", -1},
598 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5235_ctrl, "5235", -1},
599 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5235_ctrl, "523x", 0},
601 {mcfisa_a|mcfhwdiv|mcfemac, mcf5249_ctrl, "5249", 0},
602 {mcfisa_a|mcfhwdiv|mcfemac, mcf5250_ctrl, "5250", 0},
603 {mcfisa_a|mcfhwdiv|mcfemac, mcf5253_ctrl, "5253", 0},
605 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5271_ctrl, "5270", -1},
606 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5271_ctrl, "5271", 0},
608 {mcfisa_a|mcfhwdiv|mcfmac, mcf5272_ctrl, "5272", 0},
610 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5275_ctrl, "5274", -1},
611 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5275_ctrl, "5275", 0},
613 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5282_ctrl, "5280", -1},
614 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5282_ctrl, "5281", -1},
615 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5282_ctrl, "5282", -1},
616 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5282_ctrl, "528x", 0},
618 {mcfisa_a|mcfhwdiv|mcfmac, mcf5307_ctrl, "5307", 0},
620 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5329_ctrl, "5327", -1},
621 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5329_ctrl, "5328", -1},
622 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5329_ctrl, "5329", -1},
623 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5329_ctrl, "532x", 0},
625 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5373_ctrl, "5372", -1},
626 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5373_ctrl, "5373", -1},
627 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5373_ctrl, "537x", 0},
629 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfmac, mcf_ctrl, "5407",0},
631 {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp, mcf54455_ctrl, "54450", -1},
632 {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp, mcf54455_ctrl, "54451", -1},
633 {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp, mcf54455_ctrl, "54452", -1},
634 {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp, mcf54455_ctrl, "54453", -1},
635 {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp, mcf54455_ctrl, "54454", -1},
636 {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp, mcf54455_ctrl, "54455", 0},
638 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "5470", -1},
639 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "5471", -1},
640 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "5472", -1},
641 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "5473", -1},
642 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "5474", -1},
643 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "5475", -1},
644 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "547x", 0},
646 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "5480", -1},
647 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "5481", -1},
648 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "5482", -1},
649 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "5483", -1},
650 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "5484", -1},
651 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "5485", -1},
652 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "548x", 0},
654 {fido_a, fido_ctrl, "fidoa", 0},
655 {fido_a, fido_ctrl, "fido", 1},
660 static const struct m68k_cpu *m68k_lookup_cpu
661 (const char *, const struct m68k_cpu *, int, int *);
662 static int m68k_set_arch (const char *, int, int);
663 static int m68k_set_cpu (const char *, int, int);
664 static int m68k_set_extension (const char *, int, int);
665 static void m68k_init_arch (void);
667 /* This is the assembler relaxation table for m68k. m68k is a rich CISC
668 architecture and we have a lot of relaxation modes. */
670 /* Macros used in the relaxation code. */
671 #define TAB(x,y) (((x) << 2) + (y))
672 #define TABTYPE(x) ((x) >> 2)
674 /* Relaxation states. */
680 /* Here are all the relaxation modes we support. First we can relax ordinary
681 branches. On 68020 and higher and on CPU32 all branch instructions take
682 three forms, so on these CPUs all branches always remain as such. When we
683 have to expand to the LONG form on a 68000, though, we substitute an
684 absolute jump instead. This is a direct replacement for unconditional
685 branches and a branch over a jump for conditional branches. However, if the
686 user requires PIC and disables this with --pcrel, we can only relax between
687 BYTE and SHORT forms, punting if that isn't enough. This gives us four
688 different relaxation modes for branches: */
690 #define BRANCHBWL 0 /* Branch byte, word, or long. */
691 #define BRABSJUNC 1 /* Absolute jump for LONG, unconditional. */
692 #define BRABSJCOND 2 /* Absolute jump for LONG, conditional. */
693 #define BRANCHBW 3 /* Branch byte or word. */
695 /* We also relax coprocessor branches and DBcc's. All CPUs that support
696 coprocessor branches support them in word and long forms, so we have only
697 one relaxation mode for them. DBcc's are word only on all CPUs. We can
698 relax them to the LONG form with a branch-around sequence. This sequence
699 can use a long branch (if available) or an absolute jump (if acceptable).
700 This gives us two relaxation modes. If long branches are not available and
701 absolute jumps are not acceptable, we don't relax DBcc's. */
703 #define FBRANCH 4 /* Coprocessor branch. */
704 #define DBCCLBR 5 /* DBcc relaxable with a long branch. */
705 #define DBCCABSJ 6 /* DBcc relaxable with an absolute jump. */
707 /* That's all for instruction relaxation. However, we also relax PC-relative
708 operands. Specifically, we have three operand relaxation modes. On the
709 68000 PC-relative operands can only be 16-bit, but on 68020 and higher and
710 on CPU32 they may be 16-bit or 32-bit. For the latter we relax between the
711 two. Also PC+displacement+index operands in their simple form (with a non-
712 suppressed index without memory indirection) are supported on all CPUs, but
713 on the 68000 the displacement can be 8-bit only, whereas on 68020 and higher
714 and on CPU32 we relax it to SHORT and LONG forms as well using the extended
715 form of the PC+displacement+index operand. Finally, some absolute operands
716 can be relaxed down to 16-bit PC-relative. */
718 #define PCREL1632 7 /* 16-bit or 32-bit PC-relative. */
719 #define PCINDEX 8 /* PC + displacement + index. */
720 #define ABSTOPCREL 9 /* Absolute relax down to 16-bit PC-relative. */
722 /* Note that calls to frag_var need to specify the maximum expansion
723 needed; this is currently 10 bytes for DBCC. */
726 How far Forward this mode will reach:
727 How far Backward this mode will reach:
728 How many bytes this mode will add to the size of the frag
729 Which mode to go to if the offset won't fit in this one
731 Please check tc-m68k.h:md_prepare_relax_scan if changing this table. */
732 relax_typeS md_relax_table[] =
734 { 127, -128, 0, TAB (BRANCHBWL, SHORT) },
735 { 32767, -32768, 2, TAB (BRANCHBWL, LONG) },
739 { 127, -128, 0, TAB (BRABSJUNC, SHORT) },
740 { 32767, -32768, 2, TAB (BRABSJUNC, LONG) },
744 { 127, -128, 0, TAB (BRABSJCOND, SHORT) },
745 { 32767, -32768, 2, TAB (BRABSJCOND, LONG) },
749 { 127, -128, 0, TAB (BRANCHBW, SHORT) },
754 { 1, 1, 0, 0 }, /* FBRANCH doesn't come BYTE. */
755 { 32767, -32768, 2, TAB (FBRANCH, LONG) },
759 { 1, 1, 0, 0 }, /* DBCC doesn't come BYTE. */
760 { 32767, -32768, 2, TAB (DBCCLBR, LONG) },
764 { 1, 1, 0, 0 }, /* DBCC doesn't come BYTE. */
765 { 32767, -32768, 2, TAB (DBCCABSJ, LONG) },
769 { 1, 1, 0, 0 }, /* PCREL1632 doesn't come BYTE. */
770 { 32767, -32768, 2, TAB (PCREL1632, LONG) },
774 { 125, -130, 0, TAB (PCINDEX, SHORT) },
775 { 32765, -32770, 2, TAB (PCINDEX, LONG) },
779 { 1, 1, 0, 0 }, /* ABSTOPCREL doesn't come BYTE. */
780 { 32767, -32768, 2, TAB (ABSTOPCREL, LONG) },
785 /* These are the machine dependent pseudo-ops. These are included so
786 the assembler can work on the output from the SUN C compiler, which
789 /* This table describes all the machine specific pseudo-ops the assembler
790 has to support. The fields are:
791 pseudo-op name without dot
792 function to call to execute this pseudo-op
793 Integer arg to pass to the function. */
794 const pseudo_typeS md_pseudo_table[] =
796 {"data1", s_data1, 0},
797 {"data2", s_data2, 0},
800 {"skip", s_space, 0},
802 #if defined (TE_SUN3) || defined (OBJ_ELF)
803 {"align", s_align_bytes, 0},
806 {"swbeg", s_ignore, 0},
808 {"extend", float_cons, 'x'},
809 {"ldouble", float_cons, 'x'},
811 {"arch", s_m68k_arch, 0},
812 {"cpu", s_m68k_cpu, 0},
814 /* The following pseudo-ops are supported for MRI compatibility. */
816 {"comline", s_space, 1},
818 {"mask2", s_ignore, 0},
821 {"restore", s_restore, 0},
825 {"if.b", s_mri_if, 'b'},
826 {"if.w", s_mri_if, 'w'},
827 {"if.l", s_mri_if, 'l'},
828 {"else", s_mri_else, 0},
829 {"else.s", s_mri_else, 's'},
830 {"else.l", s_mri_else, 'l'},
831 {"endi", s_mri_endi, 0},
832 {"break", s_mri_break, 0},
833 {"break.s", s_mri_break, 's'},
834 {"break.l", s_mri_break, 'l'},
835 {"next", s_mri_next, 0},
836 {"next.s", s_mri_next, 's'},
837 {"next.l", s_mri_next, 'l'},
838 {"for", s_mri_for, 0},
839 {"for.b", s_mri_for, 'b'},
840 {"for.w", s_mri_for, 'w'},
841 {"for.l", s_mri_for, 'l'},
842 {"endf", s_mri_endf, 0},
843 {"repeat", s_mri_repeat, 0},
844 {"until", s_mri_until, 0},
845 {"until.b", s_mri_until, 'b'},
846 {"until.w", s_mri_until, 'w'},
847 {"until.l", s_mri_until, 'l'},
848 {"while", s_mri_while, 0},
849 {"while.b", s_mri_while, 'b'},
850 {"while.w", s_mri_while, 'w'},
851 {"while.l", s_mri_while, 'l'},
852 {"endw", s_mri_endw, 0},
857 /* The mote pseudo ops are put into the opcode table, since they
858 don't start with a . they look like opcodes to gas. */
860 const pseudo_typeS mote_pseudo_table[] =
873 {"xdef", s_globl, 0},
875 {"align", s_align_bytes, 0},
877 {"align", s_align_ptwo, 0},
880 {"sect", obj_coff_section, 0},
881 {"section", obj_coff_section, 0},
886 /* Truncate and sign-extend at 32 bits, so that building on a 64-bit host
887 gives identical results to a 32-bit host. */
888 #define TRUNC(X) ((valueT) (X) & 0xffffffff)
889 #define SEXT(X) ((TRUNC (X) ^ 0x80000000) - 0x80000000)
891 #define issbyte(x) ((valueT) SEXT (x) + 0x80 < 0x100)
892 #define isubyte(x) ((valueT) TRUNC (x) < 0x100)
893 #define issword(x) ((valueT) SEXT (x) + 0x8000 < 0x10000)
894 #define isuword(x) ((valueT) TRUNC (x) < 0x10000)
896 #define isbyte(x) ((valueT) SEXT (x) + 0xff < 0x1ff)
897 #define isword(x) ((valueT) SEXT (x) + 0xffff < 0x1ffff)
898 #define islong(x) (1)
900 static char notend_table[256];
901 static char alt_notend_table[256];
903 (! (notend_table[(unsigned char) *s] \
905 && alt_notend_table[(unsigned char) s[1]])))
909 /* Return zero if the reference to SYMBOL from within the same segment may
912 /* On an ELF system, we can't relax an externally visible symbol,
913 because it may be overridden by a shared library. However, if
914 TARGET_OS is "elf", then we presume that we are assembling for an
915 embedded system, in which case we don't have to worry about shared
916 libraries, and we can relax any external sym. */
918 #define relaxable_symbol(symbol) \
919 (!((S_IS_EXTERNAL (symbol) && EXTERN_FORCE_RELOC) \
920 || S_IS_WEAK (symbol)))
922 /* Compute the relocation code for a fixup of SIZE bytes, using pc
923 relative relocation if PCREL is non-zero. PIC says whether a special
924 pic relocation was requested. */
926 static bfd_reloc_code_real_type
927 get_reloc_code (int size, int pcrel, enum pic_relocation pic)
935 return BFD_RELOC_8_GOT_PCREL;
937 return BFD_RELOC_16_GOT_PCREL;
939 return BFD_RELOC_32_GOT_PCREL;
947 return BFD_RELOC_8_GOTOFF;
949 return BFD_RELOC_16_GOTOFF;
951 return BFD_RELOC_32_GOTOFF;
959 return BFD_RELOC_8_PLT_PCREL;
961 return BFD_RELOC_16_PLT_PCREL;
963 return BFD_RELOC_32_PLT_PCREL;
971 return BFD_RELOC_8_PLTOFF;
973 return BFD_RELOC_16_PLTOFF;
975 return BFD_RELOC_32_PLTOFF;
985 return BFD_RELOC_8_PCREL;
987 return BFD_RELOC_16_PCREL;
989 return BFD_RELOC_32_PCREL;
1001 return BFD_RELOC_32;
1008 if (pic == pic_none)
1009 as_bad (_("Can not do %d byte pc-relative relocation"), size);
1011 as_bad (_("Can not do %d byte pc-relative pic relocation"), size);
1015 if (pic == pic_none)
1016 as_bad (_("Can not do %d byte relocation"), size);
1018 as_bad (_("Can not do %d byte pic relocation"), size);
1021 return BFD_RELOC_NONE;
1024 /* Here we decide which fixups can be adjusted to make them relative
1025 to the beginning of the section instead of the symbol. Basically
1026 we need to make sure that the dynamic relocations are done
1027 correctly, so in some cases we force the original symbol to be
1030 tc_m68k_fix_adjustable (fixS *fixP)
1032 /* Adjust_reloc_syms doesn't know about the GOT. */
1033 switch (fixP->fx_r_type)
1035 case BFD_RELOC_8_GOT_PCREL:
1036 case BFD_RELOC_16_GOT_PCREL:
1037 case BFD_RELOC_32_GOT_PCREL:
1038 case BFD_RELOC_8_GOTOFF:
1039 case BFD_RELOC_16_GOTOFF:
1040 case BFD_RELOC_32_GOTOFF:
1041 case BFD_RELOC_8_PLT_PCREL:
1042 case BFD_RELOC_16_PLT_PCREL:
1043 case BFD_RELOC_32_PLT_PCREL:
1044 case BFD_RELOC_8_PLTOFF:
1045 case BFD_RELOC_16_PLTOFF:
1046 case BFD_RELOC_32_PLTOFF:
1049 case BFD_RELOC_VTABLE_INHERIT:
1050 case BFD_RELOC_VTABLE_ENTRY:
1058 #else /* !OBJ_ELF */
1060 #define get_reloc_code(SIZE,PCREL,OTHER) NO_RELOC
1062 #define relaxable_symbol(symbol) 1
1064 #endif /* OBJ_ELF */
1067 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
1070 bfd_reloc_code_real_type code;
1072 /* If the tcbit is set, then this was a fixup of a negative value
1073 that was never resolved. We do not have a reloc to handle this,
1074 so just return. We assume that other code will have detected this
1075 situation and produced a helpful error message, so we just tell the
1076 user that the reloc cannot be produced. */
1080 as_bad_where (fixp->fx_file, fixp->fx_line,
1081 _("Unable to produce reloc against symbol '%s'"),
1082 S_GET_NAME (fixp->fx_addsy));
1086 if (fixp->fx_r_type != BFD_RELOC_NONE)
1088 code = fixp->fx_r_type;
1090 /* Since DIFF_EXPR_OK is defined in tc-m68k.h, it is possible
1091 that fixup_segment converted a non-PC relative reloc into a
1092 PC relative reloc. In such a case, we need to convert the
1099 code = BFD_RELOC_8_PCREL;
1102 code = BFD_RELOC_16_PCREL;
1105 code = BFD_RELOC_32_PCREL;
1107 case BFD_RELOC_8_PCREL:
1108 case BFD_RELOC_16_PCREL:
1109 case BFD_RELOC_32_PCREL:
1110 case BFD_RELOC_8_GOT_PCREL:
1111 case BFD_RELOC_16_GOT_PCREL:
1112 case BFD_RELOC_32_GOT_PCREL:
1113 case BFD_RELOC_8_GOTOFF:
1114 case BFD_RELOC_16_GOTOFF:
1115 case BFD_RELOC_32_GOTOFF:
1116 case BFD_RELOC_8_PLT_PCREL:
1117 case BFD_RELOC_16_PLT_PCREL:
1118 case BFD_RELOC_32_PLT_PCREL:
1119 case BFD_RELOC_8_PLTOFF:
1120 case BFD_RELOC_16_PLTOFF:
1121 case BFD_RELOC_32_PLTOFF:
1124 as_bad_where (fixp->fx_file, fixp->fx_line,
1125 _("Cannot make %s relocation PC relative"),
1126 bfd_get_reloc_code_name (code));
1132 #define F(SZ,PCREL) (((SZ) << 1) + (PCREL))
1133 switch (F (fixp->fx_size, fixp->fx_pcrel))
1135 #define MAP(SZ,PCREL,TYPE) case F(SZ,PCREL): code = (TYPE); break
1136 MAP (1, 0, BFD_RELOC_8);
1137 MAP (2, 0, BFD_RELOC_16);
1138 MAP (4, 0, BFD_RELOC_32);
1139 MAP (1, 1, BFD_RELOC_8_PCREL);
1140 MAP (2, 1, BFD_RELOC_16_PCREL);
1141 MAP (4, 1, BFD_RELOC_32_PCREL);
1149 reloc = (arelent *) xmalloc (sizeof (arelent));
1150 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
1151 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1152 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
1155 reloc->addend = fixp->fx_addnumber;
1159 if (!fixp->fx_pcrel)
1160 reloc->addend = fixp->fx_addnumber;
1162 reloc->addend = (section->vma
1163 /* Explicit sign extension in case char is
1165 + ((fixp->fx_pcrel_adjust & 0xff) ^ 0x80) - 0x80
1166 + fixp->fx_addnumber
1167 + md_pcrel_from (fixp));
1170 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
1171 assert (reloc->howto != 0);
1176 /* Handle of the OPCODE hash table. NULL means any use before
1177 m68k_ip_begin() will crash. */
1178 static struct hash_control *op_hash;
1180 /* Assemble an m68k instruction. */
1183 m68k_ip (char *instring)
1186 register struct m68k_op *opP;
1187 register const struct m68k_incant *opcode;
1188 register const char *s;
1189 register int tmpreg = 0, baseo = 0, outro = 0, nextword;
1190 char *pdot, *pdotmove;
1191 enum m68k_size siz1, siz2;
1195 struct m68k_op operands_backup[6];
1196 LITTLENUM_TYPE words[6];
1197 LITTLENUM_TYPE *wordp;
1198 unsigned long ok_arch = 0;
1200 if (*instring == ' ')
1201 instring++; /* Skip leading whitespace. */
1203 /* Scan up to end of operation-code, which MUST end in end-of-string
1204 or exactly 1 space. */
1206 for (p = instring; *p != '\0'; p++)
1216 the_ins.error = _("No operator");
1220 /* p now points to the end of the opcode name, probably whitespace.
1221 Make sure the name is null terminated by clobbering the
1222 whitespace, look it up in the hash table, then fix it back.
1223 Remove a dot, first, since the opcode tables have none. */
1226 for (pdotmove = pdot; pdotmove < p; pdotmove++)
1227 *pdotmove = pdotmove[1];
1233 opcode = (const struct m68k_incant *) hash_find (op_hash, instring);
1238 for (pdotmove = p; pdotmove > pdot; pdotmove--)
1239 *pdotmove = pdotmove[-1];
1246 the_ins.error = _("Unknown operator");
1250 /* Found a legitimate opcode, start matching operands. */
1254 if (opcode->m_operands == 0)
1256 char *old = input_line_pointer;
1258 input_line_pointer = p;
1259 /* Ahh - it's a motorola style psuedo op. */
1260 mote_pseudo_table[opcode->m_opnum].poc_handler
1261 (mote_pseudo_table[opcode->m_opnum].poc_val);
1262 input_line_pointer = old;
1268 if (flag_mri && opcode->m_opnum == 0)
1270 /* In MRI mode, random garbage is allowed after an instruction
1271 which accepts no operands. */
1272 the_ins.args = opcode->m_operands;
1273 the_ins.numargs = opcode->m_opnum;
1274 the_ins.numo = opcode->m_codenum;
1275 the_ins.opcode[0] = getone (opcode);
1276 the_ins.opcode[1] = gettwo (opcode);
1280 for (opP = &the_ins.operands[0]; *p; opP++)
1282 p = crack_operand (p, opP);
1286 the_ins.error = opP->error;
1291 opsfound = opP - &the_ins.operands[0];
1293 /* This ugly hack is to support the floating pt opcodes in their
1294 standard form. Essentially, we fake a first enty of type COP#1 */
1295 if (opcode->m_operands[0] == 'I')
1299 for (n = opsfound; n > 0; --n)
1300 the_ins.operands[n] = the_ins.operands[n - 1];
1302 memset (&the_ins.operands[0], '\0', sizeof (the_ins.operands[0]));
1303 the_ins.operands[0].mode = CONTROL;
1304 the_ins.operands[0].reg = m68k_float_copnum;
1308 /* We've got the operands. Find an opcode that'll accept them. */
1311 /* If we didn't get the right number of ops, or we have no
1312 common model with this pattern then reject this pattern. */
1314 ok_arch |= opcode->m_arch;
1315 if (opsfound != opcode->m_opnum
1316 || ((opcode->m_arch & current_architecture) == 0))
1322 /* Make a copy of the operands of this insn so that
1323 we can modify them safely, should we want to. */
1324 assert (opsfound <= (int) ARRAY_SIZE (operands_backup));
1325 for (i = 0; i < opsfound; i++)
1326 operands_backup[i] = the_ins.operands[i];
1328 for (s = opcode->m_operands, opP = &operands_backup[0];
1332 /* Warning: this switch is huge! */
1333 /* I've tried to organize the cases into this order:
1334 non-alpha first, then alpha by letter. Lower-case
1335 goes directly before uppercase counterpart. */
1336 /* Code with multiple case ...: gets sorted by the lowest
1337 case ... it belongs to. I hope this makes sense. */
1443 if (opP->reg == PC || opP->reg == ZPC)
1460 if (opP->reg == PC || opP->reg == ZPC)
1479 if (opP->reg == PC || opP->reg == ZPC)
1489 if (opP->mode != IMMED)
1491 else if (s[1] == 'b'
1492 && ! isvar (&opP->disp)
1493 && (opP->disp.exp.X_op != O_constant
1494 || ! isbyte (opP->disp.exp.X_add_number)))
1496 else if (s[1] == 'B'
1497 && ! isvar (&opP->disp)
1498 && (opP->disp.exp.X_op != O_constant
1499 || ! issbyte (opP->disp.exp.X_add_number)))
1501 else if (s[1] == 'w'
1502 && ! isvar (&opP->disp)
1503 && (opP->disp.exp.X_op != O_constant
1504 || ! isword (opP->disp.exp.X_add_number)))
1506 else if (s[1] == 'W'
1507 && ! isvar (&opP->disp)
1508 && (opP->disp.exp.X_op != O_constant
1509 || ! issword (opP->disp.exp.X_add_number)))
1515 if (opP->mode != IMMED)
1520 if (opP->mode == AREG
1521 || opP->mode == CONTROL
1522 || opP->mode == FPREG
1523 || opP->mode == IMMED
1524 || opP->mode == REGLST
1525 || (opP->mode != ABSL
1527 || opP->reg == ZPC)))
1532 if (opP->mode == CONTROL
1533 || opP->mode == FPREG
1534 || opP->mode == REGLST
1535 || opP->mode == IMMED
1536 || (opP->mode != ABSL
1538 || opP->reg == ZPC)))
1566 if (opP->mode == CONTROL
1567 || opP->mode == FPREG
1568 || opP->mode == REGLST)
1573 if (opP->mode != AINC)
1578 if (opP->mode != ADEC)
1628 if (opP->reg == PC || opP->reg == ZPC)
1649 case '~': /* For now! (JF FOO is this right?) */
1671 if (opP->mode != CONTROL
1672 || (opP->reg != TT0 && opP->reg != TT1))
1677 if (opP->mode != AREG)
1682 if (opP->mode != AINDR)
1687 if (opP->mode != AINDR && opP->mode != AINC && opP->mode != ADEC
1688 && (opP->mode != DISP
1690 || opP->reg > ADDR7))
1695 if (opP->mode != ABSL
1697 && strncmp (instring, "jbsr", 4) == 0))
1720 if (opP->mode != CONTROL || opP->reg != CCR)
1725 if (opP->mode != DISP
1727 || opP->reg > ADDR7)
1732 if (opP->mode != DREG)
1737 if (opP->reg != ACC)
1742 if (opP->reg != ACC && opP->reg != ACC1
1743 && opP->reg != ACC2 && opP->reg != ACC3)
1748 if (opP->mode != FPREG)
1753 if (opP->reg != MACSR)
1758 if (opP->reg != ACCEXT01 && opP->reg != ACCEXT23)
1763 if (opP->reg != MASK)
1768 if (opP->mode != CONTROL
1775 if (opP->mode != LSH && opP->mode != RSH)
1780 if (opP->mode != CONTROL
1782 || opP->reg > last_movec_reg
1787 const enum m68k_register *rp;
1789 for (rp = control_regs; *rp; rp++)
1791 if (*rp == opP->reg)
1793 /* In most CPUs RAMBAR refers to control reg
1794 c05 (RAMBAR1), but a few CPUs have it
1795 refer to c04 (RAMBAR0). */
1796 else if (*rp == RAMBAR_ALT && opP->reg == RAMBAR)
1798 opP->reg = RAMBAR_ALT;
1808 if (opP->mode != IMMED)
1814 if (opP->mode == DREG
1815 || opP->mode == AREG
1816 || opP->mode == FPREG)
1825 opP->mask = 1 << (opP->reg - DATA0);
1828 opP->mask = 1 << (opP->reg - ADDR0 + 8);
1831 opP->mask = 1 << (opP->reg - FP0 + 16);
1839 else if (opP->mode == CONTROL)
1848 opP->mask = 1 << 24;
1851 opP->mask = 1 << 25;
1854 opP->mask = 1 << 26;
1863 else if (opP->mode != REGLST)
1865 else if (s[1] == '8' && (opP->mask & 0x0ffffff) != 0)
1867 else if (s[1] == '3' && (opP->mask & 0x7000000) != 0)
1872 if (opP->mode != IMMED)
1874 else if (opP->disp.exp.X_op != O_constant
1875 || ! issbyte (opP->disp.exp.X_add_number))
1877 else if (! m68k_quick
1878 && instring[3] != 'q'
1879 && instring[4] != 'q')
1884 if (opP->mode != DREG
1885 && opP->mode != IMMED
1886 && opP->mode != ABSL)
1891 if (opP->mode != IMMED)
1893 else if (opP->disp.exp.X_op != O_constant
1894 || TRUNC (opP->disp.exp.X_add_number) - 1 > 7)
1896 else if (! m68k_quick
1897 && (strncmp (instring, "add", 3) == 0
1898 || strncmp (instring, "sub", 3) == 0)
1899 && instring[3] != 'q')
1904 if (opP->mode != DREG && opP->mode != AREG)
1909 if (opP->mode != AINDR
1910 && (opP->mode != BASE
1912 && opP->reg != ZADDR0)
1913 || opP->disp.exp.X_op != O_absent
1914 || ((opP->index.reg < DATA0
1915 || opP->index.reg > DATA7)
1916 && (opP->index.reg < ADDR0
1917 || opP->index.reg > ADDR7))
1918 || opP->index.size != SIZE_UNSPEC
1919 || opP->index.scale != 1))
1924 if (opP->mode != CONTROL
1925 || ! (opP->reg == FPI
1927 || opP->reg == FPC))
1932 if (opP->mode != CONTROL || opP->reg != SR)
1937 if (opP->mode != IMMED)
1939 else if (opP->disp.exp.X_op != O_constant
1940 || TRUNC (opP->disp.exp.X_add_number) > 7)
1945 if (opP->mode != CONTROL || opP->reg != USP)
1950 if (opP->mode != IMMED)
1952 else if (opP->disp.exp.X_op != O_constant
1953 || (TRUNC (opP->disp.exp.X_add_number) != 0xffffffff
1954 && TRUNC (opP->disp.exp.X_add_number) - 1 > 6))
1958 /* JF these are out of order. We could put them
1959 in order if we were willing to put up with
1960 bunches of #ifdef m68851s in the code.
1962 Don't forget that you need these operands
1963 to use 68030 MMU instructions. */
1965 /* Memory addressing mode used by pflushr. */
1967 if (opP->mode == CONTROL
1968 || opP->mode == FPREG
1969 || opP->mode == DREG
1970 || opP->mode == AREG
1971 || opP->mode == REGLST)
1973 /* We should accept immediate operands, but they
1974 supposedly have to be quad word, and we don't
1975 handle that. I would like to see what a Motorola
1976 assembler does before doing something here. */
1977 if (opP->mode == IMMED)
1982 if (opP->mode != CONTROL
1983 || (opP->reg != SFC && opP->reg != DFC))
1988 if (opP->mode != CONTROL || opP->reg != TC)
1993 if (opP->mode != CONTROL || opP->reg != AC)
1998 if (opP->mode != CONTROL
2001 && opP->reg != SCC))
2006 if (opP->mode != CONTROL
2012 if (opP->mode != CONTROL
2015 && opP->reg != CRP))
2039 if (opP->mode != CONTROL
2040 || (!(opP->reg >= BAD && opP->reg <= BAD + 7)
2041 && !(opP->reg >= BAC && opP->reg <= BAC + 7)))
2046 if (opP->mode != CONTROL || opP->reg != PSR)
2051 if (opP->mode != CONTROL || opP->reg != PCSR)
2056 if (opP->mode != CONTROL
2065 if (opP->mode != ABSL)
2070 if (opP->reg < DATA0L || opP->reg > ADDR7U)
2072 /* FIXME: kludge instead of fixing parser:
2073 upper/lower registers are *not* CONTROL
2074 registers, but ordinary ones. */
2075 if ((opP->reg >= DATA0L && opP->reg <= DATA7L)
2076 || (opP->reg >= DATA0U && opP->reg <= DATA7U))
2083 if (!(opP->mode == AINDR
2084 || (opP->mode == DISP
2085 && !(opP->reg == PC || opP->reg == ZPC))))
2090 if (!(opP->mode == AINDR || opP->mode == DISP))
2102 /* Since we have found the correct instruction, copy
2103 in the modifications that we may have made. */
2105 for (i = 0; i < opsfound; i++)
2106 the_ins.operands[i] = operands_backup[i];
2112 opcode = opcode->m_next;
2117 && !(ok_arch & current_architecture))
2119 const struct m68k_cpu *cpu;
2122 char *buf = xmalloc (space + 1);
2126 the_ins.error = buf;
2127 /* Make sure there's a NUL at the end of the buffer -- strncpy
2128 won't write one when it runs out of buffer */
2130 #define APPEND(STRING) \
2131 (strncpy (buf, STRING, space), len = strlen (buf), buf += len, space -= len)
2133 APPEND (_("invalid instruction for this architecture; needs "));
2137 APPEND (_("ColdFire ISA_A"));
2140 APPEND (_("ColdFire hardware divide"));
2143 APPEND (_("ColdFire ISA_A+"));
2146 APPEND (_("ColdFire ISA_B"));
2149 APPEND (_("ColdFire fpu"));
2152 APPEND (_("M68K fpu"));
2155 APPEND (_("M68K mmu"));
2158 APPEND (_("68020 or higher"));
2161 APPEND (_("68000 or higher"));
2164 APPEND (_("68010 or higher"));
2172 for (cpu = m68k_cpus; cpu->name; cpu++)
2173 if (!cpu->alias && (cpu->arch & ok_arch))
2175 const struct m68k_cpu *alias;
2176 int seen_master = 0;
2182 for (alias = cpu; alias != m68k_cpus; alias--)
2183 if (alias[-1].alias >= 0)
2185 for (; !seen_master || alias->alias > 0; alias++)
2195 APPEND (alias->name);
2208 /* we ran out of space, so replace the end of the list
2213 strcpy (buf, " ...");
2217 the_ins.error = _("operands mismatch");
2224 /* Now assemble it. */
2225 the_ins.args = opcode->m_operands;
2226 the_ins.numargs = opcode->m_opnum;
2227 the_ins.numo = opcode->m_codenum;
2228 the_ins.opcode[0] = getone (opcode);
2229 the_ins.opcode[1] = gettwo (opcode);
2231 for (s = the_ins.args, opP = &the_ins.operands[0]; *s; s += 2, opP++)
2235 /* This switch is a doozy.
2236 Watch the first step; its a big one! */
2269 tmpreg = 0x3c; /* 7.4 */
2270 if (strchr ("bwl", s[1]))
2271 nextword = get_num (&opP->disp, 90);
2273 nextword = get_num (&opP->disp, 0);
2274 if (isvar (&opP->disp))
2275 add_fix (s[1], &opP->disp, 0, 0);
2279 if (!isbyte (nextword))
2280 opP->error = _("operand out of range");
2285 if (!isword (nextword))
2286 opP->error = _("operand out of range");
2291 if (!issword (nextword))
2292 opP->error = _("operand out of range");
2297 addword (nextword >> 16);
2324 /* We gotta put out some float. */
2325 if (op (&opP->disp) != O_big)
2330 /* Can other cases happen here? */
2331 if (op (&opP->disp) != O_constant)
2334 val = (valueT) offs (&opP->disp);
2338 generic_bignum[gencnt] = (LITTLENUM_TYPE) val;
2339 val >>= LITTLENUM_NUMBER_OF_BITS;
2343 offs (&opP->disp) = gencnt;
2345 if (offs (&opP->disp) > 0)
2347 if (offs (&opP->disp) > baseo)
2349 as_warn (_("Bignum too big for %c format; truncated"),
2351 offs (&opP->disp) = baseo;
2353 baseo -= offs (&opP->disp);
2356 for (wordp = generic_bignum + offs (&opP->disp) - 1;
2357 offs (&opP->disp)--;
2362 gen_to_words (words, baseo, (long) outro);
2363 for (wordp = words; baseo--; wordp++)
2367 tmpreg = opP->reg - DATA; /* 0.dreg */
2370 tmpreg = 0x08 + opP->reg - ADDR; /* 1.areg */
2373 tmpreg = 0x10 + opP->reg - ADDR; /* 2.areg */
2376 tmpreg = 0x20 + opP->reg - ADDR; /* 4.areg */
2379 tmpreg = 0x18 + opP->reg - ADDR; /* 3.areg */
2383 nextword = get_num (&opP->disp, 90);
2385 /* Convert mode 5 addressing with a zero offset into
2386 mode 2 addressing to reduce the instruction size by a
2388 if (! isvar (&opP->disp)
2390 && (opP->disp.size == SIZE_UNSPEC)
2391 && (opP->reg >= ADDR0)
2392 && (opP->reg <= ADDR7))
2394 tmpreg = 0x10 + opP->reg - ADDR; /* 2.areg */
2399 && ! isvar (&opP->disp)
2402 opP->disp.exp.X_op = O_symbol;
2403 opP->disp.exp.X_add_symbol =
2404 section_symbol (absolute_section);
2407 /* Force into index mode. Hope this works. */
2409 /* We do the first bit for 32-bit displacements, and the
2410 second bit for 16 bit ones. It is possible that we
2411 should make the default be WORD instead of LONG, but
2412 I think that'd break GCC, so we put up with a little
2413 inefficiency for the sake of working output. */
2415 if (!issword (nextword)
2416 || (isvar (&opP->disp)
2417 && ((opP->disp.size == SIZE_UNSPEC
2418 && flag_short_refs == 0
2419 && cpu_of_arch (current_architecture) >= m68020
2420 && ! arch_coldfire_p (current_architecture))
2421 || opP->disp.size == SIZE_LONG)))
2423 if (cpu_of_arch (current_architecture) < m68020
2424 || arch_coldfire_p (current_architecture))
2426 _("displacement too large for this architecture; needs 68020 or higher");
2428 tmpreg = 0x3B; /* 7.3 */
2430 tmpreg = 0x30 + opP->reg - ADDR; /* 6.areg */
2431 if (isvar (&opP->disp))
2435 if (opP->disp.size == SIZE_LONG
2437 /* If the displacement needs pic
2438 relocation it cannot be relaxed. */
2439 || opP->disp.pic_reloc != pic_none
2444 add_fix ('l', &opP->disp, 1, 2);
2448 add_frag (adds (&opP->disp),
2449 SEXT (offs (&opP->disp)),
2450 TAB (PCREL1632, SZ_UNDEF));
2457 add_fix ('l', &opP->disp, 0, 0);
2462 addword (nextword >> 16);
2467 tmpreg = 0x3A; /* 7.2 */
2469 tmpreg = 0x28 + opP->reg - ADDR; /* 5.areg */
2471 if (isvar (&opP->disp))
2475 add_fix ('w', &opP->disp, 1, 0);
2478 add_fix ('w', &opP->disp, 0, 0);
2488 baseo = get_num (&opP->disp, 90);
2489 if (opP->mode == POST || opP->mode == PRE)
2490 outro = get_num (&opP->odisp, 90);
2491 /* Figure out the `addressing mode'.
2492 Also turn on the BASE_DISABLE bit, if needed. */
2493 if (opP->reg == PC || opP->reg == ZPC)
2495 tmpreg = 0x3b; /* 7.3 */
2496 if (opP->reg == ZPC)
2499 else if (opP->reg == 0)
2502 tmpreg = 0x30; /* 6.garbage */
2504 else if (opP->reg >= ZADDR0 && opP->reg <= ZADDR7)
2507 tmpreg = 0x30 + opP->reg - ZADDR0;
2510 tmpreg = 0x30 + opP->reg - ADDR; /* 6.areg */
2512 siz1 = opP->disp.size;
2513 if (opP->mode == POST || opP->mode == PRE)
2514 siz2 = opP->odisp.size;
2518 /* Index register stuff. */
2519 if (opP->index.reg != 0
2520 && opP->index.reg >= DATA
2521 && opP->index.reg <= ADDR7)
2523 nextword |= (opP->index.reg - DATA) << 12;
2525 if (opP->index.size == SIZE_LONG
2526 || (opP->index.size == SIZE_UNSPEC
2527 && m68k_index_width_default == SIZE_LONG))
2530 if ((opP->index.scale != 1
2531 && cpu_of_arch (current_architecture) < m68020)
2532 || (opP->index.scale == 8
2533 && (arch_coldfire_p (current_architecture)
2534 && !arch_coldfire_fpu (current_architecture))))
2537 _("scale factor invalid on this architecture; needs cpu32 or 68020 or higher");
2540 if (arch_coldfire_p (current_architecture)
2541 && opP->index.size == SIZE_WORD)
2542 opP->error = _("invalid index size for coldfire");
2544 switch (opP->index.scale)
2561 GET US OUT OF HERE! */
2563 /* Must be INDEX, with an index register. Address
2564 register cannot be ZERO-PC, and either :b was
2565 forced, or we know it will fit. For a 68000 or
2566 68010, force this mode anyways, because the
2567 larger modes aren't supported. */
2568 if (opP->mode == BASE
2569 && ((opP->reg >= ADDR0
2570 && opP->reg <= ADDR7)
2573 if (siz1 == SIZE_BYTE
2574 || cpu_of_arch (current_architecture) < m68020
2575 || arch_coldfire_p (current_architecture)
2576 || (siz1 == SIZE_UNSPEC
2577 && ! isvar (&opP->disp)
2578 && issbyte (baseo)))
2580 nextword += baseo & 0xff;
2582 if (isvar (&opP->disp))
2584 /* Do a byte relocation. If it doesn't
2585 fit (possible on m68000) let the
2586 fixup processing complain later. */
2588 add_fix ('B', &opP->disp, 1, 1);
2590 add_fix ('B', &opP->disp, 0, 0);
2592 else if (siz1 != SIZE_BYTE)
2594 if (siz1 != SIZE_UNSPEC)
2595 as_warn (_("Forcing byte displacement"));
2596 if (! issbyte (baseo))
2597 opP->error = _("byte displacement out of range");
2602 else if (siz1 == SIZE_UNSPEC
2604 && isvar (&opP->disp)
2605 && subs (&opP->disp) == NULL
2607 /* If the displacement needs pic
2608 relocation it cannot be relaxed. */
2609 && opP->disp.pic_reloc == pic_none
2613 /* The code in md_convert_frag_1 needs to be
2614 able to adjust nextword. Call frag_grow
2615 to ensure that we have enough space in
2616 the frag obstack to make all the bytes
2619 nextword += baseo & 0xff;
2621 add_frag (adds (&opP->disp),
2622 SEXT (offs (&opP->disp)),
2623 TAB (PCINDEX, SZ_UNDEF));
2631 nextword |= 0x40; /* No index reg. */
2632 if (opP->index.reg >= ZDATA0
2633 && opP->index.reg <= ZDATA7)
2634 nextword |= (opP->index.reg - ZDATA0) << 12;
2635 else if (opP->index.reg >= ZADDR0
2636 || opP->index.reg <= ZADDR7)
2637 nextword |= (opP->index.reg - ZADDR0 + 8) << 12;
2640 /* It isn't simple. */
2642 if (cpu_of_arch (current_architecture) < m68020
2643 || arch_coldfire_p (current_architecture))
2645 _("invalid operand mode for this architecture; needs 68020 or higher");
2648 /* If the guy specified a width, we assume that it is
2649 wide enough. Maybe it isn't. If so, we lose. */
2653 if (isvar (&opP->disp)
2655 : ! issword (baseo))
2660 else if (! isvar (&opP->disp) && baseo == 0)
2669 as_warn (_(":b not permitted; defaulting to :w"));
2679 /* Figure out inner displacement stuff. */
2680 if (opP->mode == POST || opP->mode == PRE)
2682 if (cpu_of_arch (current_architecture) & cpu32)
2683 opP->error = _("invalid operand mode for this architecture; needs 68020 or higher");
2687 if (isvar (&opP->odisp)
2689 : ! issword (outro))
2694 else if (! isvar (&opP->odisp) && outro == 0)
2703 as_warn (_(":b not permitted; defaulting to :w"));
2712 if (opP->mode == POST
2713 && (nextword & 0x40) == 0)
2718 if (siz1 != SIZE_UNSPEC && isvar (&opP->disp))
2720 if (opP->reg == PC || opP->reg == ZPC)
2721 add_fix (siz1 == SIZE_LONG ? 'l' : 'w', &opP->disp, 1, 2);
2723 add_fix (siz1 == SIZE_LONG ? 'l' : 'w', &opP->disp, 0, 0);
2725 if (siz1 == SIZE_LONG)
2726 addword (baseo >> 16);
2727 if (siz1 != SIZE_UNSPEC)
2730 if (siz2 != SIZE_UNSPEC && isvar (&opP->odisp))
2731 add_fix (siz2 == SIZE_LONG ? 'l' : 'w', &opP->odisp, 0, 0);
2732 if (siz2 == SIZE_LONG)
2733 addword (outro >> 16);
2734 if (siz2 != SIZE_UNSPEC)
2740 nextword = get_num (&opP->disp, 90);
2741 switch (opP->disp.size)
2746 if (!isvar (&opP->disp) && issword (offs (&opP->disp)))
2748 tmpreg = 0x38; /* 7.0 */
2752 if (isvar (&opP->disp)
2753 && !subs (&opP->disp)
2754 && adds (&opP->disp)
2756 /* If the displacement needs pic relocation it
2757 cannot be relaxed. */
2758 && opP->disp.pic_reloc == pic_none
2761 && !strchr ("~%&$?", s[0]))
2763 tmpreg = 0x3A; /* 7.2 */
2764 add_frag (adds (&opP->disp),
2765 SEXT (offs (&opP->disp)),
2766 TAB (ABSTOPCREL, SZ_UNDEF));
2769 /* Fall through into long. */
2771 if (isvar (&opP->disp))
2772 add_fix ('l', &opP->disp, 0, 0);
2774 tmpreg = 0x39;/* 7.1 mode */
2775 addword (nextword >> 16);
2780 as_bad (_("unsupported byte value; use a different suffix"));
2784 if (isvar (&opP->disp))
2785 add_fix ('w', &opP->disp, 0, 0);
2787 tmpreg = 0x38;/* 7.0 mode */
2795 as_bad (_("unknown/incorrect operand"));
2799 /* If s[0] is '4', then this is for the mac instructions
2800 that can have a trailing_ampersand set. If so, set 0x100
2801 bit on tmpreg so install_gen_operand can check for it and
2802 set the appropriate bit (word2, bit 5). */
2805 if (opP->trailing_ampersand)
2808 install_gen_operand (s[1], tmpreg);
2814 { /* JF: I hate floating point! */
2829 tmpreg = get_num (&opP->disp, tmpreg);
2830 if (isvar (&opP->disp))
2831 add_fix (s[1], &opP->disp, 0, 0);
2834 case 'b': /* Danger: These do no check for
2835 certain types of overflow.
2837 if (!isbyte (tmpreg))
2838 opP->error = _("out of range");
2839 insop (tmpreg, opcode);
2840 if (isvar (&opP->disp))
2841 the_ins.reloc[the_ins.nrel - 1].n =
2842 (opcode->m_codenum) * 2 + 1;
2845 if (!issbyte (tmpreg))
2846 opP->error = _("out of range");
2847 the_ins.opcode[the_ins.numo - 1] |= tmpreg & 0xff;
2848 if (isvar (&opP->disp))
2849 the_ins.reloc[the_ins.nrel - 1].n = opcode->m_codenum * 2 - 1;
2852 if (!isword (tmpreg))
2853 opP->error = _("out of range");
2854 insop (tmpreg, opcode);
2855 if (isvar (&opP->disp))
2856 the_ins.reloc[the_ins.nrel - 1].n = (opcode->m_codenum) * 2;
2859 if (!issword (tmpreg))
2860 opP->error = _("out of range");
2861 insop (tmpreg, opcode);
2862 if (isvar (&opP->disp))
2863 the_ins.reloc[the_ins.nrel - 1].n = (opcode->m_codenum) * 2;
2866 /* Because of the way insop works, we put these two out
2868 insop (tmpreg, opcode);
2869 insop (tmpreg >> 16, opcode);
2870 if (isvar (&opP->disp))
2871 the_ins.reloc[the_ins.nrel - 1].n = (opcode->m_codenum) * 2;
2878 install_operand (s[1], tmpreg);
2889 install_operand (s[1], opP->reg - ADDR);
2893 tmpreg = get_num (&opP->disp, 90);
2898 add_fix ('B', &opP->disp, 1, -1);
2901 add_fix ('w', &opP->disp, 1, 0);
2906 the_ins.opcode[0] |= 0xff;
2907 add_fix ('l', &opP->disp, 1, 0);
2911 case 'g': /* Conditional branch */
2912 have_disp = HAVE_LONG_CALL (current_architecture);
2915 case 'b': /* Unconditional branch */
2916 have_disp = HAVE_LONG_BRANCH (current_architecture);
2919 case 's': /* Unconditional subroutine */
2920 have_disp = HAVE_LONG_CALL (current_architecture);
2923 if (subs (&opP->disp) /* We can't relax it. */
2925 /* If the displacement needs pic relocation it cannot be
2927 || opP->disp.pic_reloc != pic_none
2932 as_warn (_("Can't use long branches on this architecture"));
2936 /* This could either be a symbol, or an absolute
2937 address. If it's an absolute address, turn it into
2938 an absolute jump right here and keep it out of the
2940 if (adds (&opP->disp) == 0)
2942 if (the_ins.opcode[0] == 0x6000) /* jbra */
2943 the_ins.opcode[0] = 0x4EF9;
2944 else if (the_ins.opcode[0] == 0x6100) /* jbsr */
2945 the_ins.opcode[0] = 0x4EB9;
2948 the_ins.opcode[0] ^= 0x0100;
2949 the_ins.opcode[0] |= 0x0006;
2952 add_fix ('l', &opP->disp, 0, 0);
2958 /* Now we know it's going into the relaxer. Now figure
2959 out which mode. We try in this order of preference:
2960 long branch, absolute jump, byte/word branches only. */
2962 add_frag (adds (&opP->disp),
2963 SEXT (offs (&opP->disp)),
2964 TAB (BRANCHBWL, SZ_UNDEF));
2965 else if (! flag_keep_pcrel)
2967 if ((the_ins.opcode[0] == 0x6000)
2968 || (the_ins.opcode[0] == 0x6100))
2969 add_frag (adds (&opP->disp),
2970 SEXT (offs (&opP->disp)),
2971 TAB (BRABSJUNC, SZ_UNDEF));
2973 add_frag (adds (&opP->disp),
2974 SEXT (offs (&opP->disp)),
2975 TAB (BRABSJCOND, SZ_UNDEF));
2978 add_frag (adds (&opP->disp),
2979 SEXT (offs (&opP->disp)),
2980 TAB (BRANCHBW, SZ_UNDEF));
2983 if (isvar (&opP->disp))
2985 /* Check for DBcc instructions. We can relax them,
2986 but only if we have long branches and/or absolute
2988 if (((the_ins.opcode[0] & 0xf0f8) == 0x50c8)
2989 && (HAVE_LONG_BRANCH (current_architecture)
2990 || ! flag_keep_pcrel))
2992 if (HAVE_LONG_BRANCH (current_architecture))
2993 add_frag (adds (&opP->disp),
2994 SEXT (offs (&opP->disp)),
2995 TAB (DBCCLBR, SZ_UNDEF));
2997 add_frag (adds (&opP->disp),
2998 SEXT (offs (&opP->disp)),
2999 TAB (DBCCABSJ, SZ_UNDEF));
3002 add_fix ('w', &opP->disp, 1, 0);
3006 case 'C': /* Fixed size LONG coproc branches. */
3007 add_fix ('l', &opP->disp, 1, 0);
3011 case 'c': /* Var size Coprocesssor branches. */
3012 if (subs (&opP->disp) || (adds (&opP->disp) == 0))
3014 the_ins.opcode[the_ins.numo - 1] |= 0x40;
3015 add_fix ('l', &opP->disp, 1, 0);
3020 add_frag (adds (&opP->disp),
3021 SEXT (offs (&opP->disp)),
3022 TAB (FBRANCH, SZ_UNDEF));
3029 case 'C': /* Ignore it. */
3032 case 'd': /* JF this is a kludge. */
3033 install_operand ('s', opP->reg - ADDR);
3034 tmpreg = get_num (&opP->disp, 90);
3035 if (!issword (tmpreg))
3037 as_warn (_("Expression out of range, using 0"));
3044 install_operand (s[1], opP->reg - DATA);
3047 case 'e': /* EMAC ACCx, reg/reg. */
3048 install_operand (s[1], opP->reg - ACC);
3051 case 'E': /* Ignore it. */
3055 install_operand (s[1], opP->reg - FP0);
3058 case 'g': /* EMAC ACCEXTx. */
3059 install_operand (s[1], opP->reg - ACCEXT01);
3062 case 'G': /* Ignore it. */
3067 tmpreg = opP->reg - COP0;
3068 install_operand (s[1], tmpreg);
3071 case 'i': /* MAC/EMAC scale factor. */
3072 install_operand (s[1], opP->mode == LSH ? 0x1 : 0x3);
3075 case 'J': /* JF foo. */
3215 install_operand (s[1], tmpreg);
3219 tmpreg = get_num (&opP->disp, 55);
3220 install_operand (s[1], tmpreg & 0x7f);
3227 if (tmpreg & 0x7FF0000)
3228 as_bad (_("Floating point register in register list"));
3229 insop (reverse_16_bits (tmpreg), opcode);
3233 if (tmpreg & 0x700FFFF)
3234 as_bad (_("Wrong register in floating-point reglist"));
3235 install_operand (s[1], reverse_8_bits (tmpreg >> 16));
3243 if (tmpreg & 0x7FF0000)
3244 as_bad (_("Floating point register in register list"));
3245 insop (tmpreg, opcode);
3247 else if (s[1] == '8')
3249 if (tmpreg & 0x0FFFFFF)
3250 as_bad (_("incorrect register in reglist"));
3251 install_operand (s[1], tmpreg >> 24);
3255 if (tmpreg & 0x700FFFF)
3256 as_bad (_("wrong register in floating-point reglist"));
3258 install_operand (s[1], tmpreg >> 16);
3263 install_operand (s[1], get_num (&opP->disp, 60));
3267 tmpreg = ((opP->mode == DREG)
3268 ? 0x20 + (int) (opP->reg - DATA)
3269 : (get_num (&opP->disp, 40) & 0x1F));
3270 install_operand (s[1], tmpreg);
3274 tmpreg = get_num (&opP->disp, 10);
3277 install_operand (s[1], tmpreg);
3281 /* This depends on the fact that ADDR registers are eight
3282 more than their corresponding DATA regs, so the result
3283 will have the ADDR_REG bit set. */
3284 install_operand (s[1], opP->reg - DATA);
3288 if (opP->mode == AINDR)
3289 install_operand (s[1], opP->reg - DATA);
3291 install_operand (s[1], opP->index.reg - DATA);
3295 if (opP->reg == FPI)
3297 else if (opP->reg == FPS)
3299 else if (opP->reg == FPC)
3303 install_operand (s[1], tmpreg);
3306 case 'S': /* Ignore it. */
3310 install_operand (s[1], get_num (&opP->disp, 30));
3313 case 'U': /* Ignore it. */
3332 as_fatal (_("failed sanity check"));
3333 } /* switch on cache token. */
3334 install_operand (s[1], tmpreg);
3337 /* JF: These are out of order, I fear. */
3350 install_operand (s[1], tmpreg);
3376 install_operand (s[1], tmpreg);
3380 if (opP->reg == VAL)
3399 install_operand (s[1], tmpreg);
3413 tmpreg = (4 << 10) | ((opP->reg - BAD) << 2);
3424 tmpreg = (5 << 10) | ((opP->reg - BAC) << 2);
3430 install_operand (s[1], tmpreg);
3433 know (opP->reg == PSR);
3436 know (opP->reg == PCSR);
3451 install_operand (s[1], tmpreg);
3454 tmpreg = get_num (&opP->disp, 20);
3455 install_operand (s[1], tmpreg);
3457 case '_': /* used only for move16 absolute 32-bit address. */
3458 if (isvar (&opP->disp))
3459 add_fix ('l', &opP->disp, 0, 0);
3460 tmpreg = get_num (&opP->disp, 90);
3461 addword (tmpreg >> 16);
3462 addword (tmpreg & 0xFFFF);
3465 install_operand (s[1], opP->reg - DATA0L);
3466 opP->reg -= (DATA0L);
3467 opP->reg &= 0x0F; /* remove upper/lower bit. */
3470 tmpreg = get_num (&opP->disp, 80);
3473 install_operand (s[1], tmpreg);
3480 /* By the time whe get here (FINALLY) the_ins contains the complete
3481 instruction, ready to be emitted. . . */
3485 reverse_16_bits (int in)
3490 static int mask[16] =
3492 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
3493 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000
3495 for (n = 0; n < 16; n++)
3498 out |= mask[15 - n];
3501 } /* reverse_16_bits() */
3504 reverse_8_bits (int in)
3509 static int mask[8] =
3511 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
3514 for (n = 0; n < 8; n++)
3520 } /* reverse_8_bits() */
3522 /* Cause an extra frag to be generated here, inserting up to 10 bytes
3523 (that value is chosen in the frag_var call in md_assemble). TYPE
3524 is the subtype of the frag to be generated; its primary type is
3525 rs_machine_dependent.
3527 The TYPE parameter is also used by md_convert_frag_1 and
3528 md_estimate_size_before_relax. The appropriate type of fixup will
3529 be emitted by md_convert_frag_1.
3531 ADD becomes the FR_SYMBOL field of the frag, and OFF the FR_OFFSET. */
3533 install_operand (int mode, int val)
3538 the_ins.opcode[0] |= val & 0xFF; /* JF FF is for M kludge. */
3541 the_ins.opcode[0] |= val << 9;
3544 the_ins.opcode[1] |= val << 12;
3547 the_ins.opcode[1] |= val << 6;
3550 the_ins.opcode[1] |= val;
3553 the_ins.opcode[2] |= val << 12;
3556 the_ins.opcode[2] |= val << 6;
3559 /* DANGER! This is a hack to force cas2l and cas2w cmds to be
3560 three words long! */
3562 the_ins.opcode[2] |= val;
3565 the_ins.opcode[1] |= val << 7;
3568 the_ins.opcode[1] |= val << 10;
3572 the_ins.opcode[1] |= val << 5;
3577 the_ins.opcode[1] |= (val << 10) | (val << 7);
3580 the_ins.opcode[1] |= (val << 12) | val;
3583 the_ins.opcode[0] |= val = 0xff;
3586 the_ins.opcode[0] |= val << 9;
3589 the_ins.opcode[1] |= val;
3592 the_ins.opcode[1] |= val;
3593 the_ins.numo++; /* What a hack. */
3596 the_ins.opcode[1] |= val << 4;
3604 the_ins.opcode[0] |= (val << 6);
3607 the_ins.opcode[1] = (val >> 16);
3608 the_ins.opcode[2] = val & 0xffff;
3611 the_ins.opcode[0] |= ((val & 0x8) << (6 - 3));
3612 the_ins.opcode[0] |= ((val & 0x7) << 9);
3613 the_ins.opcode[1] |= ((val & 0x10) << (7 - 4));
3615 case 'n': /* MAC/EMAC Rx on !load. */
3616 the_ins.opcode[0] |= ((val & 0x8) << (6 - 3));
3617 the_ins.opcode[0] |= ((val & 0x7) << 9);
3618 the_ins.opcode[1] |= ((val & 0x10) << (7 - 4));
3620 case 'o': /* MAC/EMAC Rx on load. */
3621 the_ins.opcode[1] |= val << 12;
3622 the_ins.opcode[1] |= ((val & 0x10) << (7 - 4));
3624 case 'M': /* MAC/EMAC Ry on !load. */
3625 the_ins.opcode[0] |= (val & 0xF);
3626 the_ins.opcode[1] |= ((val & 0x10) << (6 - 4));
3628 case 'N': /* MAC/EMAC Ry on load. */
3629 the_ins.opcode[1] |= (val & 0xF);
3630 the_ins.opcode[1] |= ((val & 0x10) << (6 - 4));
3633 the_ins.opcode[1] |= ((val != 1) << 10);
3636 the_ins.opcode[0] |= ((val & 0x3) << 9);
3639 the_ins.opcode[0] |= ((val & 0x3) << 0);
3641 case 'G': /* EMAC accumulator in a EMAC load instruction. */
3642 the_ins.opcode[0] |= ((~val & 0x1) << 7);
3643 the_ins.opcode[1] |= ((val & 0x2) << (4 - 1));
3645 case 'H': /* EMAC accumulator in a EMAC non-load instruction. */
3646 the_ins.opcode[0] |= ((val & 0x1) << 7);
3647 the_ins.opcode[1] |= ((val & 0x2) << (4 - 1));
3650 the_ins.opcode[1] |= ((val & 0x3) << 9);
3653 the_ins.opcode[0] |= (val & 0x1) <<10;
3657 as_fatal (_("failed sanity check."));
3662 install_gen_operand (int mode, int val)
3666 case '/': /* Special for mask loads for mac/msac insns with
3667 possible mask; trailing_ampersend set in bit 8. */
3668 the_ins.opcode[0] |= (val & 0x3f);
3669 the_ins.opcode[1] |= (((val & 0x100) >> 8) << 5);
3672 the_ins.opcode[0] |= val;
3675 /* This is a kludge!!! */
3676 the_ins.opcode[0] |= (val & 0x07) << 9 | (val & 0x38) << 3;
3685 the_ins.opcode[0] |= val;
3687 /* more stuff goes here. */
3689 as_fatal (_("failed sanity check."));
3693 /* Verify that we have some number of paren pairs, do m68k_ip_op(), and
3694 then deal with the bitfield hack. */
3697 crack_operand (char *str, struct m68k_op *opP)
3699 register int parens;
3701 register char *beg_str;
3709 for (parens = 0; *str && (parens > 0 || inquote || notend (str)); str++)
3715 else if (*str == ')')
3719 opP->error = _("Extra )");
3725 if (flag_mri && *str == '\'')
3726 inquote = ! inquote;
3728 if (!*str && parens)
3730 opP->error = _("Missing )");
3735 if (m68k_ip_op (beg_str, opP) != 0)
3742 c = *++str; /* JF bitfield hack. */
3747 as_bad (_("Missing operand"));
3750 /* Detect MRI REG symbols and convert them to REGLSTs. */
3751 if (opP->mode == CONTROL && (int)opP->reg < 0)
3754 opP->mask = ~(int)opP->reg;
3761 /* This is the guts of the machine-dependent assembler. STR points to a
3762 machine dependent instruction. This function is supposed to emit
3763 the frags/bytes it assembles to.
3767 insert_reg (const char *regname, int regnum)
3772 #ifdef REGISTER_PREFIX
3773 if (!flag_reg_prefix_optional)
3775 buf[0] = REGISTER_PREFIX;
3776 strcpy (buf + 1, regname);
3781 symbol_table_insert (symbol_new (regname, reg_section, regnum,
3782 &zero_address_frag));
3784 for (i = 0; regname[i]; i++)
3785 buf[i] = TOUPPER (regname[i]);
3788 symbol_table_insert (symbol_new (buf, reg_section, regnum,
3789 &zero_address_frag));
3798 static const struct init_entry init_table[] =
3858 { "accext01", ACCEXT01 },
3859 { "accext23", ACCEXT23 },
3863 /* Control registers. */
3864 { "sfc", SFC }, /* Source Function Code. */
3866 { "dfc", DFC }, /* Destination Function Code. */
3868 { "cacr", CACR }, /* Cache Control Register. */
3869 { "caar", CAAR }, /* Cache Address Register. */
3871 { "usp", USP }, /* User Stack Pointer. */
3872 { "vbr", VBR }, /* Vector Base Register. */
3873 { "msp", MSP }, /* Master Stack Pointer. */
3874 { "isp", ISP }, /* Interrupt Stack Pointer. */
3876 { "itt0", ITT0 }, /* Instruction Transparent Translation Reg 0. */
3877 { "itt1", ITT1 }, /* Instruction Transparent Translation Reg 1. */
3878 { "dtt0", DTT0 }, /* Data Transparent Translation Register 0. */
3879 { "dtt1", DTT1 }, /* Data Transparent Translation Register 1. */
3881 /* 68ec040 versions of same */
3882 { "iacr0", ITT0 }, /* Instruction Access Control Register 0. */
3883 { "iacr1", ITT1 }, /* Instruction Access Control Register 0. */
3884 { "dacr0", DTT0 }, /* Data Access Control Register 0. */
3885 { "dacr1", DTT1 }, /* Data Access Control Register 0. */
3887 /* Coldfire versions of same. The ColdFire programmer's reference
3888 manual indicated that the order is 2,3,0,1, but Ken Rose
3889 <rose@netcom.com> says that 0,1,2,3 is the correct order. */
3890 { "acr0", ACR0 }, /* Access Control Unit 0. */
3891 { "acr1", ACR1 }, /* Access Control Unit 1. */
3892 { "acr2", ACR2 }, /* Access Control Unit 2. */
3893 { "acr3", ACR3 }, /* Access Control Unit 3. */
3895 { "tc", TC }, /* MMU Translation Control Register. */
3899 { "mmusr", MMUSR }, /* MMU Status Register. */
3900 { "srp", SRP }, /* User Root Pointer. */
3901 { "urp", URP }, /* Supervisor Root Pointer. */
3904 { "mmubar", MMUBAR },
3907 { "rombar", ROMBAR }, /* ROM Base Address Register. */
3908 { "rambar0", RAMBAR0 }, /* ROM Base Address Register. */
3909 { "rambar1", RAMBAR1 }, /* ROM Base Address Register. */
3910 { "mbar", MBAR }, /* Module Base Address Register. */
3912 { "mbar0", MBAR0 }, /* mcfv4e registers. */
3913 { "mbar1", MBAR1 }, /* mcfv4e registers. */
3914 { "rombar0", ROMBAR0 }, /* mcfv4e registers. */
3915 { "rombar1", ROMBAR1 }, /* mcfv4e registers. */
3916 { "mpcr", MPCR }, /* mcfv4e registers. */
3917 { "edrambar", EDRAMBAR }, /* mcfv4e registers. */
3918 { "secmbar", SECMBAR }, /* mcfv4e registers. */
3919 { "asid", TC }, /* mcfv4e registers. */
3920 { "mmubar", BUSCR }, /* mcfv4e registers. */
3921 { "pcr1u0", PCR1U0 }, /* mcfv4e registers. */
3922 { "pcr1l0", PCR1L0 }, /* mcfv4e registers. */
3923 { "pcr2u0", PCR2U0 }, /* mcfv4e registers. */
3924 { "pcr2l0", PCR2L0 }, /* mcfv4e registers. */
3925 { "pcr3u0", PCR3U0 }, /* mcfv4e registers. */
3926 { "pcr3l0", PCR3L0 }, /* mcfv4e registers. */
3927 { "pcr1u1", PCR1U1 }, /* mcfv4e registers. */
3928 { "pcr1l1", PCR1L1 }, /* mcfv4e registers. */
3929 { "pcr2u1", PCR2U1 }, /* mcfv4e registers. */
3930 { "pcr2l1", PCR2L1 }, /* mcfv4e registers. */
3931 { "pcr3u1", PCR3U1 }, /* mcfv4e registers. */
3932 { "pcr3l1", PCR3L1 }, /* mcfv4e registers. */
3934 { "flashbar", FLASHBAR }, /* mcf528x registers. */
3935 { "rambar", RAMBAR }, /* mcf528x registers. */
3937 { "mbar2", MBAR2 }, /* mcf5249 registers. */
3939 { "cac", CAC }, /* fido registers. */
3940 { "mbb", MBB }, /* fido registers. */
3941 /* End of control registers. */
3975 /* 68ec030 versions of same. */
3978 /* 68ec030 access control unit, identical to 030 MMU status reg. */
3981 /* Suppressed data and address registers. */
3999 /* Upper and lower data and address registers, used by macw and msacw. */
4040 init_regtable (void)
4043 for (i = 0; init_table[i].name; i++)
4044 insert_reg (init_table[i].name, init_table[i].number);
4048 md_assemble (char *str)
4055 int shorts_this_frag;
4058 if (!selected_cpu && !selected_arch)
4060 /* We've not selected an architecture yet. Set the default
4061 now. We do this lazily so that an initial .cpu or .arch directive
4063 if (!m68k_set_cpu (TARGET_CPU, 1, 1))
4064 as_bad (_("unrecognized default cpu `%s'"), TARGET_CPU);
4069 /* In MRI mode, the instruction and operands are separated by a
4070 space. Anything following the operands is a comment. The label
4071 has already been removed. */
4079 for (s = str; *s != '\0'; s++)
4081 if ((*s == ' ' || *s == '\t') && ! inquote)
4099 inquote = ! inquote;
4104 memset (&the_ins, '\0', sizeof (the_ins));
4109 for (n = 0; n < the_ins.numargs; n++)
4110 if (the_ins.operands[n].error)
4112 er = the_ins.operands[n].error;
4118 as_bad (_("%s -- statement `%s' ignored"), er, str);
4122 /* If there is a current label, record that it marks an instruction. */
4123 if (current_label != NULL)
4125 current_label->text = 1;
4126 current_label = NULL;
4130 /* Tie dwarf2 debug info to the address at the start of the insn. */
4131 dwarf2_emit_insn (0);
4134 if (the_ins.nfrag == 0)
4136 /* No frag hacking involved; just put it out. */
4137 toP = frag_more (2 * the_ins.numo);
4138 fromP = &the_ins.opcode[0];
4139 for (m = the_ins.numo; m; --m)
4141 md_number_to_chars (toP, (long) (*fromP), 2);
4145 /* Put out symbol-dependent info. */
4146 for (m = 0; m < the_ins.nrel; m++)
4148 switch (the_ins.reloc[m].wid)
4167 as_fatal (_("Don't know how to figure width of %c in md_assemble()"),
4168 the_ins.reloc[m].wid);
4171 fixP = fix_new_exp (frag_now,
4172 ((toP - frag_now->fr_literal)
4173 - the_ins.numo * 2 + the_ins.reloc[m].n),
4175 &the_ins.reloc[m].exp,
4176 the_ins.reloc[m].pcrel,
4177 get_reloc_code (n, the_ins.reloc[m].pcrel,
4178 the_ins.reloc[m].pic_reloc));
4179 fixP->fx_pcrel_adjust = the_ins.reloc[m].pcrel_fix;
4180 if (the_ins.reloc[m].wid == 'B')
4181 fixP->fx_signed = 1;
4186 /* There's some frag hacking. */
4188 /* Calculate the max frag size. */
4191 wid = 2 * the_ins.fragb[0].fragoff;
4192 for (n = 1; n < the_ins.nfrag; n++)
4193 wid += 2 * (the_ins.numo - the_ins.fragb[n - 1].fragoff);
4194 /* frag_var part. */
4196 /* Make sure the whole insn fits in one chunk, in particular that
4197 the var part is attached, as we access one byte before the
4198 variable frag for byte branches. */
4202 for (n = 0, fromP = &the_ins.opcode[0]; n < the_ins.nfrag; n++)
4207 wid = 2 * the_ins.fragb[n].fragoff;
4209 wid = 2 * (the_ins.numo - the_ins.fragb[n - 1].fragoff);
4210 toP = frag_more (wid);
4212 shorts_this_frag = 0;
4213 for (m = wid / 2; m; --m)
4215 md_number_to_chars (toP, (long) (*fromP), 2);
4220 for (m = 0; m < the_ins.nrel; m++)
4222 if ((the_ins.reloc[m].n) >= 2 * shorts_this_frag)
4224 the_ins.reloc[m].n -= 2 * shorts_this_frag;
4227 wid = the_ins.reloc[m].wid;
4230 the_ins.reloc[m].wid = 0;
4231 wid = (wid == 'b') ? 1 : (wid == 'w') ? 2 : (wid == 'l') ? 4 : 4000;
4233 fixP = fix_new_exp (frag_now,
4234 ((toP - frag_now->fr_literal)
4235 - the_ins.numo * 2 + the_ins.reloc[m].n),
4237 &the_ins.reloc[m].exp,
4238 the_ins.reloc[m].pcrel,
4239 get_reloc_code (wid, the_ins.reloc[m].pcrel,
4240 the_ins.reloc[m].pic_reloc));
4241 fixP->fx_pcrel_adjust = the_ins.reloc[m].pcrel_fix;
4243 (void) frag_var (rs_machine_dependent, 10, 0,
4244 (relax_substateT) (the_ins.fragb[n].fragty),
4245 the_ins.fragb[n].fadd, the_ins.fragb[n].foff, to_beg_P);
4247 n = (the_ins.numo - the_ins.fragb[n - 1].fragoff);
4248 shorts_this_frag = 0;
4251 toP = frag_more (n * 2);
4254 md_number_to_chars (toP, (long) (*fromP), 2);
4260 for (m = 0; m < the_ins.nrel; m++)
4264 wid = the_ins.reloc[m].wid;
4267 the_ins.reloc[m].wid = 0;
4268 wid = (wid == 'b') ? 1 : (wid == 'w') ? 2 : (wid == 'l') ? 4 : 4000;
4270 fixP = fix_new_exp (frag_now,
4271 ((the_ins.reloc[m].n + toP - frag_now->fr_literal)
4272 - shorts_this_frag * 2),
4274 &the_ins.reloc[m].exp,
4275 the_ins.reloc[m].pcrel,
4276 get_reloc_code (wid, the_ins.reloc[m].pcrel,
4277 the_ins.reloc[m].pic_reloc));
4278 fixP->fx_pcrel_adjust = the_ins.reloc[m].pcrel_fix;
4282 /* Comparison function used by qsort to rank the opcode entries by name. */
4285 m68k_compare_opcode (const void * v1, const void * v2)
4287 struct m68k_opcode * op1, * op2;
4293 op1 = *(struct m68k_opcode **) v1;
4294 op2 = *(struct m68k_opcode **) v2;
4296 /* Compare the two names. If different, return the comparison.
4297 If the same, return the order they are in the opcode table. */
4298 ret = strcmp (op1->name, op2->name);
4309 const struct m68k_opcode *ins;
4310 struct m68k_incant *hack, *slak;
4311 const char *retval = 0; /* Empty string, or error msg text. */
4314 /* Set up hash tables with 68000 instructions.
4315 similar to what the vax assembler does. */
4316 /* RMS claims the thing to do is take the m68k-opcode.h table, and make
4317 a copy of it at runtime, adding in the information we want but isn't
4318 there. I think it'd be better to have an awk script hack the table
4319 at compile time. Or even just xstr the table and use it as-is. But
4320 my lord ghod hath spoken, so we do it this way. Excuse the ugly var
4325 flag_reg_prefix_optional = 1;
4327 if (! m68k_rel32_from_cmdline)
4331 /* First sort the opcode table into alphabetical order to seperate
4332 the order that the assembler wants to see the opcodes from the
4333 order that the disassembler wants to see them. */
4334 m68k_sorted_opcodes = xmalloc (m68k_numopcodes * sizeof (* m68k_sorted_opcodes));
4335 if (!m68k_sorted_opcodes)
4336 as_fatal (_("Internal Error: Can't allocate m68k_sorted_opcodes of size %d"),
4337 m68k_numopcodes * ((int) sizeof (* m68k_sorted_opcodes)));
4339 for (i = m68k_numopcodes; i--;)
4340 m68k_sorted_opcodes[i] = m68k_opcodes + i;
4342 qsort (m68k_sorted_opcodes, m68k_numopcodes,
4343 sizeof (m68k_sorted_opcodes[0]), m68k_compare_opcode);
4345 op_hash = hash_new ();
4347 obstack_begin (&robyn, 4000);
4348 for (i = 0; i < m68k_numopcodes; i++)
4350 hack = slak = (struct m68k_incant *) obstack_alloc (&robyn, sizeof (struct m68k_incant));
4353 ins = m68k_sorted_opcodes[i];
4355 /* We *could* ignore insns that don't match our
4356 arch here by just leaving them out of the hash. */
4357 slak->m_operands = ins->args;
4358 slak->m_opnum = strlen (slak->m_operands) / 2;
4359 slak->m_arch = ins->arch;
4360 slak->m_opcode = ins->opcode;
4361 /* This is kludgey. */
4362 slak->m_codenum = ((ins->match) & 0xffffL) ? 2 : 1;
4363 if (i + 1 != m68k_numopcodes
4364 && !strcmp (ins->name, m68k_sorted_opcodes[i + 1]->name))
4366 slak->m_next = obstack_alloc (&robyn, sizeof (struct m68k_incant));
4371 slak = slak->m_next;
4375 retval = hash_insert (op_hash, ins->name, (char *) hack);
4377 as_fatal (_("Internal Error: Can't hash %s: %s"), ins->name, retval);
4380 for (i = 0; i < m68k_numaliases; i++)
4382 const char *name = m68k_opcode_aliases[i].primary;
4383 const char *alias = m68k_opcode_aliases[i].alias;
4384 PTR val = hash_find (op_hash, name);
4387 as_fatal (_("Internal Error: Can't find %s in hash table"), name);
4388 retval = hash_insert (op_hash, alias, val);
4390 as_fatal (_("Internal Error: Can't hash %s: %s"), alias, retval);
4393 /* In MRI mode, all unsized branches are variable sized. Normally,
4394 they are word sized. */
4397 static struct m68k_opcode_alias mri_aliases[] =
4418 i < (int) (sizeof mri_aliases / sizeof mri_aliases[0]);
4421 const char *name = mri_aliases[i].primary;
4422 const char *alias = mri_aliases[i].alias;
4423 PTR val = hash_find (op_hash, name);
4426 as_fatal (_("Internal Error: Can't find %s in hash table"), name);
4427 retval = hash_jam (op_hash, alias, val);
4429 as_fatal (_("Internal Error: Can't hash %s: %s"), alias, retval);
4433 for (i = 0; i < (int) sizeof (notend_table); i++)
4435 notend_table[i] = 0;
4436 alt_notend_table[i] = 0;
4439 notend_table[','] = 1;
4440 notend_table['{'] = 1;
4441 notend_table['}'] = 1;
4442 alt_notend_table['a'] = 1;
4443 alt_notend_table['A'] = 1;
4444 alt_notend_table['d'] = 1;
4445 alt_notend_table['D'] = 1;
4446 alt_notend_table['#'] = 1;
4447 alt_notend_table['&'] = 1;
4448 alt_notend_table['f'] = 1;
4449 alt_notend_table['F'] = 1;
4450 #ifdef REGISTER_PREFIX
4451 alt_notend_table[REGISTER_PREFIX] = 1;
4454 /* We need to put '(' in alt_notend_table to handle
4455 cas2 %d0:%d2,%d3:%d4,(%a0):(%a1) */
4456 alt_notend_table['('] = 1;
4458 /* We need to put '@' in alt_notend_table to handle
4459 cas2 %d0:%d2,%d3:%d4,@(%d0):@(%d1) */
4460 alt_notend_table['@'] = 1;
4462 /* We need to put digits in alt_notend_table to handle
4463 bfextu %d0{24:1},%d0 */
4464 alt_notend_table['0'] = 1;
4465 alt_notend_table['1'] = 1;
4466 alt_notend_table['2'] = 1;
4467 alt_notend_table['3'] = 1;
4468 alt_notend_table['4'] = 1;
4469 alt_notend_table['5'] = 1;
4470 alt_notend_table['6'] = 1;
4471 alt_notend_table['7'] = 1;
4472 alt_notend_table['8'] = 1;
4473 alt_notend_table['9'] = 1;
4475 #ifndef MIT_SYNTAX_ONLY
4476 /* Insert pseudo ops, these have to go into the opcode table since
4477 gas expects pseudo ops to start with a dot. */
4481 while (mote_pseudo_table[n].poc_name)
4483 hack = obstack_alloc (&robyn, sizeof (struct m68k_incant));
4484 hash_insert (op_hash,
4485 mote_pseudo_table[n].poc_name, (char *) hack);
4486 hack->m_operands = 0;
4496 record_alignment (text_section, 2);
4497 record_alignment (data_section, 2);
4498 record_alignment (bss_section, 2);
4503 /* This is called when a label is defined. */
4506 m68k_frob_label (symbolS *sym)
4508 struct label_line *n;
4510 n = (struct label_line *) xmalloc (sizeof *n);
4513 as_where (&n->file, &n->line);
4519 dwarf2_emit_label (sym);
4523 /* This is called when a value that is not an instruction is emitted. */
4526 m68k_flush_pending_output (void)
4528 current_label = NULL;
4531 /* This is called at the end of the assembly, when the final value of
4532 the label is known. We warn if this is a text symbol aligned at an
4536 m68k_frob_symbol (symbolS *sym)
4538 if (S_GET_SEGMENT (sym) == reg_section
4539 && (int) S_GET_VALUE (sym) < 0)
4541 S_SET_SEGMENT (sym, absolute_section);
4542 S_SET_VALUE (sym, ~(int)S_GET_VALUE (sym));
4544 else if ((S_GET_VALUE (sym) & 1) != 0)
4546 struct label_line *l;
4548 for (l = labels; l != NULL; l = l->next)
4550 if (l->label == sym)
4553 as_warn_where (l->file, l->line,
4554 _("text label `%s' aligned to odd boundary"),
4562 /* This is called if we go in or out of MRI mode because of the .mri
4566 m68k_mri_mode_change (int on)
4570 if (! flag_reg_prefix_optional)
4572 flag_reg_prefix_optional = 1;
4573 #ifdef REGISTER_PREFIX
4578 if (! m68k_rel32_from_cmdline)
4583 if (! reg_prefix_optional_seen)
4585 #ifdef REGISTER_PREFIX_OPTIONAL
4586 flag_reg_prefix_optional = REGISTER_PREFIX_OPTIONAL;
4588 flag_reg_prefix_optional = 0;
4590 #ifdef REGISTER_PREFIX
4595 if (! m68k_rel32_from_cmdline)
4600 /* Equal to MAX_PRECISION in atof-ieee.c. */
4601 #define MAX_LITTLENUMS 6
4603 /* Turn a string in input_line_pointer into a floating point constant
4604 of type TYPE, and store the appropriate bytes in *LITP. The number
4605 of LITTLENUMS emitted is stored in *SIZEP. An error message is
4606 returned, or NULL on OK. */
4609 md_atof (int type, char *litP, int *sizeP)
4612 LITTLENUM_TYPE words[MAX_LITTLENUMS];
4613 LITTLENUM_TYPE *wordP;
4644 return _("Bad call to MD_ATOF()");
4646 t = atof_ieee (input_line_pointer, type, words);
4648 input_line_pointer = t;
4650 *sizeP = prec * sizeof (LITTLENUM_TYPE);
4651 for (wordP = words; prec--;)
4653 md_number_to_chars (litP, (long) (*wordP++), sizeof (LITTLENUM_TYPE));
4654 litP += sizeof (LITTLENUM_TYPE);
4660 md_number_to_chars (char *buf, valueT val, int n)
4662 number_to_chars_bigendian (buf, val, n);
4666 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
4668 offsetT val = *valP;
4669 addressT upper_limit;
4670 offsetT lower_limit;
4672 /* This is unnecessary but it convinces the native rs6000 compiler
4673 to generate the code we want. */
4674 char *buf = fixP->fx_frag->fr_literal;
4675 buf += fixP->fx_where;
4676 /* End ibm compiler workaround. */
4680 if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
4686 memset (buf, 0, fixP->fx_size);
4687 fixP->fx_addnumber = val; /* Remember value for emit_reloc. */
4689 if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
4690 && !S_IS_DEFINED (fixP->fx_addsy)
4691 && !S_IS_WEAK (fixP->fx_addsy))
4692 S_SET_WEAK (fixP->fx_addsy);
4697 if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
4698 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
4701 switch (fixP->fx_size)
4703 /* The cast to offsetT below are necessary to make code
4704 correct for machines where ints are smaller than offsetT. */
4708 lower_limit = - (offsetT) 0x80;
4711 *buf++ = (val >> 8);
4713 upper_limit = 0x7fff;
4714 lower_limit = - (offsetT) 0x8000;
4717 *buf++ = (val >> 24);
4718 *buf++ = (val >> 16);
4719 *buf++ = (val >> 8);
4721 upper_limit = 0x7fffffff;
4722 lower_limit = - (offsetT) 0x7fffffff - 1; /* Avoid constant overflow. */
4725 BAD_CASE (fixP->fx_size);
4728 /* Fix up a negative reloc. */
4729 if (fixP->fx_addsy == NULL && fixP->fx_subsy != NULL)
4731 fixP->fx_addsy = fixP->fx_subsy;
4732 fixP->fx_subsy = NULL;
4736 /* For non-pc-relative values, it's conceivable we might get something
4737 like "0xff" for a byte field. So extend the upper part of the range
4738 to accept such numbers. We arbitrarily disallow "-0xff" or "0xff+0xff",
4739 so that we can do any range checking at all. */
4740 if (! fixP->fx_pcrel && ! fixP->fx_signed)
4741 upper_limit = upper_limit * 2 + 1;
4743 if ((addressT) val > upper_limit
4744 && (val > 0 || val < lower_limit))
4745 as_bad_where (fixP->fx_file, fixP->fx_line, _("value out of range"));
4747 /* A one byte PC-relative reloc means a short branch. We can't use
4748 a short branch with a value of 0 or -1, because those indicate
4749 different opcodes (branches with longer offsets). fixup_segment
4750 in write.c may have clobbered fx_pcrel, so we need to examine the
4753 || fixP->fx_r_type == BFD_RELOC_8_PCREL)
4754 && fixP->fx_size == 1
4755 && (fixP->fx_addsy == NULL
4756 || S_IS_DEFINED (fixP->fx_addsy))
4757 && (val == 0 || val == -1))
4758 as_bad_where (fixP->fx_file, fixP->fx_line, _("invalid byte branch offset"));
4761 /* *fragP has been relaxed to its final size, and now needs to have
4762 the bytes inside it modified to conform to the new size There is UGLY
4766 md_convert_frag_1 (fragS *fragP)
4771 /* Address in object code of the displacement. */
4772 register int object_address = fragP->fr_fix + fragP->fr_address;
4774 /* Address in gas core of the place to store the displacement. */
4775 /* This convinces the native rs6000 compiler to generate the code we
4777 register char *buffer_address = fragP->fr_literal;
4778 buffer_address += fragP->fr_fix;
4779 /* End ibm compiler workaround. */
4781 /* The displacement of the address, from current location. */
4782 disp = fragP->fr_symbol ? S_GET_VALUE (fragP->fr_symbol) : 0;
4783 disp = (disp + fragP->fr_offset) - object_address;
4785 switch (fragP->fr_subtype)
4787 case TAB (BRANCHBWL, BYTE):
4788 case TAB (BRABSJUNC, BYTE):
4789 case TAB (BRABSJCOND, BYTE):
4790 case TAB (BRANCHBW, BYTE):
4791 know (issbyte (disp));
4793 as_bad_where (fragP->fr_file, fragP->fr_line,
4794 _("short branch with zero offset: use :w"));
4795 fixP = fix_new (fragP, fragP->fr_fix - 1, 1, fragP->fr_symbol,
4796 fragP->fr_offset, 1, RELAX_RELOC_PC8);
4797 fixP->fx_pcrel_adjust = -1;
4799 case TAB (BRANCHBWL, SHORT):
4800 case TAB (BRABSJUNC, SHORT):
4801 case TAB (BRABSJCOND, SHORT):
4802 case TAB (BRANCHBW, SHORT):
4803 fragP->fr_opcode[1] = 0x00;
4804 fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol, fragP->fr_offset,
4805 1, RELAX_RELOC_PC16);
4808 case TAB (BRANCHBWL, LONG):
4809 fragP->fr_opcode[1] = (char) 0xFF;
4810 fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol, fragP->fr_offset,
4811 1, RELAX_RELOC_PC32);
4814 case TAB (BRABSJUNC, LONG):
4815 if (fragP->fr_opcode[0] == 0x61) /* jbsr */
4817 if (flag_keep_pcrel)
4818 as_fatal (_("Tried to convert PC relative BSR to absolute JSR"));
4819 fragP->fr_opcode[0] = 0x4E;
4820 fragP->fr_opcode[1] = (char) 0xB9; /* JSR with ABSL LONG operand. */
4821 fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol, fragP->fr_offset,
4822 0, RELAX_RELOC_ABS32);
4825 else if (fragP->fr_opcode[0] == 0x60) /* jbra */
4827 if (flag_keep_pcrel)
4828 as_fatal (_("Tried to convert PC relative branch to absolute jump"));
4829 fragP->fr_opcode[0] = 0x4E;
4830 fragP->fr_opcode[1] = (char) 0xF9; /* JMP with ABSL LONG operand. */
4831 fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol, fragP->fr_offset,
4832 0, RELAX_RELOC_ABS32);
4837 /* This cannot happen, because jbsr and jbra are the only two
4838 unconditional branches. */
4842 case TAB (BRABSJCOND, LONG):
4843 if (flag_keep_pcrel)
4844 as_fatal (_("Tried to convert PC relative conditional branch to absolute jump"));
4846 /* Only Bcc 68000 instructions can come here
4847 Change bcc into b!cc/jmp absl long. */
4848 fragP->fr_opcode[0] ^= 0x01; /* Invert bcc. */
4849 fragP->fr_opcode[1] = 0x06; /* Branch offset = 6. */
4851 /* JF: these used to be fr_opcode[2,3], but they may be in a
4852 different frag, in which case referring to them is a no-no.
4853 Only fr_opcode[0,1] are guaranteed to work. */
4854 *buffer_address++ = 0x4e; /* put in jmp long (0x4ef9) */
4855 *buffer_address++ = (char) 0xf9;
4856 fragP->fr_fix += 2; /* Account for jmp instruction. */
4857 fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
4858 fragP->fr_offset, 0, RELAX_RELOC_ABS32);
4861 case TAB (FBRANCH, SHORT):
4862 know ((fragP->fr_opcode[1] & 0x40) == 0);
4863 fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol, fragP->fr_offset,
4864 1, RELAX_RELOC_PC16);
4867 case TAB (FBRANCH, LONG):
4868 fragP->fr_opcode[1] |= 0x40; /* Turn on LONG bit. */
4869 fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol, fragP->fr_offset,
4870 1, RELAX_RELOC_PC32);
4873 case TAB (DBCCLBR, SHORT):
4874 case TAB (DBCCABSJ, SHORT):
4875 fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol, fragP->fr_offset,
4876 1, RELAX_RELOC_PC16);
4879 case TAB (DBCCLBR, LONG):
4880 /* Only DBcc instructions can come here.
4881 Change dbcc into dbcc/bral.
4882 JF: these used to be fr_opcode[2-7], but that's wrong. */
4883 if (flag_keep_pcrel)
4884 as_fatal (_("Tried to convert DBcc to absolute jump"));
4886 *buffer_address++ = 0x00; /* Branch offset = 4. */
4887 *buffer_address++ = 0x04;
4888 *buffer_address++ = 0x60; /* Put in bra pc+6. */
4889 *buffer_address++ = 0x06;
4890 *buffer_address++ = 0x60; /* Put in bral (0x60ff). */
4891 *buffer_address++ = (char) 0xff;
4893 fragP->fr_fix += 6; /* Account for bra/jmp instructions. */
4894 fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol, fragP->fr_offset, 1,
4898 case TAB (DBCCABSJ, LONG):
4899 /* Only DBcc instructions can come here.
4900 Change dbcc into dbcc/jmp.
4901 JF: these used to be fr_opcode[2-7], but that's wrong. */
4902 if (flag_keep_pcrel)
4903 as_fatal (_("Tried to convert PC relative conditional branch to absolute jump"));
4905 *buffer_address++ = 0x00; /* Branch offset = 4. */
4906 *buffer_address++ = 0x04;
4907 *buffer_address++ = 0x60; /* Put in bra pc + 6. */
4908 *buffer_address++ = 0x06;
4909 *buffer_address++ = 0x4e; /* Put in jmp long (0x4ef9). */
4910 *buffer_address++ = (char) 0xf9;
4912 fragP->fr_fix += 6; /* Account for bra/jmp instructions. */
4913 fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol, fragP->fr_offset, 0,
4917 case TAB (PCREL1632, SHORT):
4918 fragP->fr_opcode[1] &= ~0x3F;
4919 fragP->fr_opcode[1] |= 0x3A; /* 072 - mode 7.2 */
4920 fix_new (fragP, (int) (fragP->fr_fix), 2, fragP->fr_symbol,
4921 fragP->fr_offset, 1, RELAX_RELOC_PC16);
4924 case TAB (PCREL1632, LONG):
4925 /* Already set to mode 7.3; this indicates: PC indirect with
4926 suppressed index, 32-bit displacement. */
4927 *buffer_address++ = 0x01;
4928 *buffer_address++ = 0x70;
4930 fixP = fix_new (fragP, (int) (fragP->fr_fix), 4, fragP->fr_symbol,
4931 fragP->fr_offset, 1, RELAX_RELOC_PC32);
4932 fixP->fx_pcrel_adjust = 2;
4935 case TAB (PCINDEX, BYTE):
4936 assert (fragP->fr_fix >= 2);
4937 buffer_address[-2] &= ~1;
4938 fixP = fix_new (fragP, fragP->fr_fix - 1, 1, fragP->fr_symbol,
4939 fragP->fr_offset, 1, RELAX_RELOC_PC8);
4940 fixP->fx_pcrel_adjust = 1;
4942 case TAB (PCINDEX, SHORT):
4943 assert (fragP->fr_fix >= 2);
4944 buffer_address[-2] |= 0x1;
4945 buffer_address[-1] = 0x20;
4946 fixP = fix_new (fragP, (int) (fragP->fr_fix), 2, fragP->fr_symbol,
4947 fragP->fr_offset, 1, RELAX_RELOC_PC16);
4948 fixP->fx_pcrel_adjust = 2;
4951 case TAB (PCINDEX, LONG):
4952 assert (fragP->fr_fix >= 2);
4953 buffer_address[-2] |= 0x1;
4954 buffer_address[-1] = 0x30;
4955 fixP = fix_new (fragP, (int) (fragP->fr_fix), 4, fragP->fr_symbol,
4956 fragP->fr_offset, 1, RELAX_RELOC_PC32);
4957 fixP->fx_pcrel_adjust = 2;
4960 case TAB (ABSTOPCREL, SHORT):
4961 fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol, fragP->fr_offset,
4962 1, RELAX_RELOC_PC16);
4965 case TAB (ABSTOPCREL, LONG):
4966 if (flag_keep_pcrel)
4967 as_fatal (_("Tried to convert PC relative conditional branch to absolute jump"));
4968 /* The thing to do here is force it to ABSOLUTE LONG, since
4969 ABSTOPCREL is really trying to shorten an ABSOLUTE address anyway. */
4970 if ((fragP->fr_opcode[1] & 0x3F) != 0x3A)
4972 fragP->fr_opcode[1] &= ~0x3F;
4973 fragP->fr_opcode[1] |= 0x39; /* Mode 7.1 */
4974 fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol, fragP->fr_offset,
4975 0, RELAX_RELOC_ABS32);
4982 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
4983 segT sec ATTRIBUTE_UNUSED,
4986 md_convert_frag_1 (fragP);
4989 /* Force truly undefined symbols to their maximum size, and generally set up
4990 the frag list to be relaxed
4993 md_estimate_size_before_relax (fragS *fragP, segT segment)
4995 /* Handle SZ_UNDEF first, it can be changed to BYTE or SHORT. */
4996 switch (fragP->fr_subtype)
4998 case TAB (BRANCHBWL, SZ_UNDEF):
4999 case TAB (BRABSJUNC, SZ_UNDEF):
5000 case TAB (BRABSJCOND, SZ_UNDEF):
5002 if (S_GET_SEGMENT (fragP->fr_symbol) == segment
5003 && relaxable_symbol (fragP->fr_symbol))
5005 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), BYTE);
5007 else if (flag_short_refs)
5009 /* Symbol is undefined and we want short ref. */
5010 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT);
5014 /* Symbol is still undefined. Make it LONG. */
5015 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), LONG);
5020 case TAB (BRANCHBW, SZ_UNDEF):
5022 if (S_GET_SEGMENT (fragP->fr_symbol) == segment
5023 && relaxable_symbol (fragP->fr_symbol))
5025 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), BYTE);
5029 /* Symbol is undefined and we don't have long branches. */
5030 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT);
5035 case TAB (FBRANCH, SZ_UNDEF):
5036 case TAB (DBCCLBR, SZ_UNDEF):
5037 case TAB (DBCCABSJ, SZ_UNDEF):
5038 case TAB (PCREL1632, SZ_UNDEF):
5040 if ((S_GET_SEGMENT (fragP->fr_symbol) == segment
5041 && relaxable_symbol (fragP->fr_symbol))
5044 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT);
5048 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), LONG);
5053 case TAB (PCINDEX, SZ_UNDEF):
5054 if ((S_GET_SEGMENT (fragP->fr_symbol) == segment
5055 && relaxable_symbol (fragP->fr_symbol)))
5057 fragP->fr_subtype = TAB (PCINDEX, BYTE);
5061 fragP->fr_subtype = TAB (PCINDEX, LONG);
5065 case TAB (ABSTOPCREL, SZ_UNDEF):
5067 if ((S_GET_SEGMENT (fragP->fr_symbol) == segment
5068 && relaxable_symbol (fragP->fr_symbol)))
5070 fragP->fr_subtype = TAB (ABSTOPCREL, SHORT);
5074 fragP->fr_subtype = TAB (ABSTOPCREL, LONG);
5083 /* Now that SZ_UNDEF are taken care of, check others. */
5084 switch (fragP->fr_subtype)
5086 case TAB (BRANCHBWL, BYTE):
5087 case TAB (BRABSJUNC, BYTE):
5088 case TAB (BRABSJCOND, BYTE):
5089 case TAB (BRANCHBW, BYTE):
5090 /* We can't do a short jump to the next instruction, so in that
5091 case we force word mode. If the symbol is at the start of a
5092 frag, and it is the next frag with any data in it (usually
5093 this is just the next frag, but assembler listings may
5094 introduce empty frags), we must use word mode. */
5095 if (fragP->fr_symbol)
5099 sym_frag = symbol_get_frag (fragP->fr_symbol);
5100 if (S_GET_VALUE (fragP->fr_symbol) == sym_frag->fr_address)
5104 for (l = fragP->fr_next; l && l != sym_frag; l = l->fr_next)
5108 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT);
5115 return md_relax_table[fragP->fr_subtype].rlx_length;
5118 #if defined(OBJ_AOUT) | defined(OBJ_BOUT)
5119 /* the bit-field entries in the relocation_info struct plays hell
5120 with the byte-order problems of cross-assembly. So as a hack,
5121 I added this mach. dependent ri twiddler. Ugly, but it gets
5123 /* on m68k: first 4 bytes are normal unsigned long, next three bytes
5124 are symbolnum, most sig. byte first. Last byte is broken up with
5125 bit 7 as pcrel, bits 6 & 5 as length, bit 4 as pcrel, and the lower
5126 nibble as nuthin. (on Sun 3 at least) */
5127 /* Translate the internal relocation information into target-specific
5131 md_ri_to_chars (char *the_bytes, struct reloc_info_generic *ri)
5134 md_number_to_chars (the_bytes, ri->r_address, 4);
5135 /* Now the fun stuff. */
5136 the_bytes[4] = (ri->r_symbolnum >> 16) & 0x0ff;
5137 the_bytes[5] = (ri->r_symbolnum >> 8) & 0x0ff;
5138 the_bytes[6] = ri->r_symbolnum & 0x0ff;
5139 the_bytes[7] = (((ri->r_pcrel << 7) & 0x80)
5140 | ((ri->r_length << 5) & 0x60)
5141 | ((ri->r_extern << 4) & 0x10));
5146 #endif /* OBJ_AOUT or OBJ_BOUT */
5148 #ifndef WORKING_DOT_WORD
5149 int md_short_jump_size = 4;
5150 int md_long_jump_size = 6;
5153 md_create_short_jump (char *ptr, addressT from_addr, addressT to_addr,
5154 fragS *frag ATTRIBUTE_UNUSED,
5155 symbolS *to_symbol ATTRIBUTE_UNUSED)
5159 offset = to_addr - (from_addr + 2);
5161 md_number_to_chars (ptr, (valueT) 0x6000, 2);
5162 md_number_to_chars (ptr + 2, (valueT) offset, 2);
5166 md_create_long_jump (char *ptr, addressT from_addr, addressT to_addr,
5167 fragS *frag, symbolS *to_symbol)
5171 if (!HAVE_LONG_BRANCH (current_architecture))
5173 if (flag_keep_pcrel)
5174 as_fatal (_("Tried to convert PC relative branch to absolute jump"));
5175 offset = to_addr - S_GET_VALUE (to_symbol);
5176 md_number_to_chars (ptr, (valueT) 0x4EF9, 2);
5177 md_number_to_chars (ptr + 2, (valueT) offset, 4);
5178 fix_new (frag, (ptr + 2) - frag->fr_literal, 4, to_symbol, (offsetT) 0,
5183 offset = to_addr - (from_addr + 2);
5184 md_number_to_chars (ptr, (valueT) 0x60ff, 2);
5185 md_number_to_chars (ptr + 2, (valueT) offset, 4);
5191 /* Different values of OK tell what its OK to return. Things that
5192 aren't OK are an error (what a shock, no?)
5195 10: Absolute 1:8 only
5196 20: Absolute 0:7 only
5197 30: absolute 0:15 only
5198 40: Absolute 0:31 only
5199 50: absolute 0:127 only
5200 55: absolute -64:63 only
5201 60: absolute -128:127 only
5202 70: absolute 0:4095 only
5203 80: absolute -1, 1:7 only
5207 get_num (struct m68k_exp *exp, int ok)
5209 if (exp->exp.X_op == O_absent)
5211 /* Do the same thing the VAX asm does. */
5212 op (exp) = O_constant;
5218 as_warn (_("expression out of range: defaulting to 1"));
5222 else if (exp->exp.X_op == O_constant)
5227 if ((valueT) TRUNC (offs (exp)) - 1 > 7)
5229 as_warn (_("expression out of range: defaulting to 1"));
5234 if ((valueT) TRUNC (offs (exp)) > 7)
5238 if ((valueT) TRUNC (offs (exp)) > 15)
5242 if ((valueT) TRUNC (offs (exp)) > 32)
5246 if ((valueT) TRUNC (offs (exp)) > 127)
5250 if ((valueT) SEXT (offs (exp)) + 64 > 127)
5254 if ((valueT) SEXT (offs (exp)) + 128 > 255)
5258 if ((valueT) TRUNC (offs (exp)) > 4095)
5261 as_warn (_("expression out of range: defaulting to 0"));
5266 if ((valueT) TRUNC (offs (exp)) != 0xffffffff
5267 && (valueT) TRUNC (offs (exp)) - 1 > 6)
5269 as_warn (_("expression out of range: defaulting to 1"));
5277 else if (exp->exp.X_op == O_big)
5279 if (offs (exp) <= 0 /* flonum. */
5280 && (ok == 90 /* no bignums */
5281 || (ok > 10 /* Small-int ranges including 0 ok. */
5282 /* If we have a flonum zero, a zero integer should
5283 do as well (e.g., in moveq). */
5284 && generic_floating_point_number.exponent == 0
5285 && generic_floating_point_number.low[0] == 0)))
5287 /* HACK! Turn it into a long. */
5288 LITTLENUM_TYPE words[6];
5290 gen_to_words (words, 2, 8L); /* These numbers are magic! */
5291 op (exp) = O_constant;
5294 offs (exp) = words[1] | (words[0] << 16);
5298 op (exp) = O_constant;
5301 offs (exp) = (ok == 10) ? 1 : 0;
5302 as_warn (_("Can't deal with expression; defaulting to %ld"),
5308 if (ok >= 10 && ok <= 80)
5310 op (exp) = O_constant;
5313 offs (exp) = (ok == 10) ? 1 : 0;
5314 as_warn (_("Can't deal with expression; defaulting to %ld"),
5319 if (exp->size != SIZE_UNSPEC)
5327 if (!isbyte (offs (exp)))
5328 as_warn (_("expression doesn't fit in BYTE"));
5331 if (!isword (offs (exp)))
5332 as_warn (_("expression doesn't fit in WORD"));
5340 /* These are the back-ends for the various machine dependent pseudo-ops. */
5343 s_data1 (int ignore ATTRIBUTE_UNUSED)
5345 subseg_set (data_section, 1);
5346 demand_empty_rest_of_line ();
5350 s_data2 (int ignore ATTRIBUTE_UNUSED)
5352 subseg_set (data_section, 2);
5353 demand_empty_rest_of_line ();
5357 s_bss (int ignore ATTRIBUTE_UNUSED)
5359 /* We don't support putting frags in the BSS segment, we fake it
5360 by marking in_bss, then looking at s_skip for clues. */
5362 subseg_set (bss_section, 0);
5363 demand_empty_rest_of_line ();
5367 s_even (int ignore ATTRIBUTE_UNUSED)
5370 register long temp_fill;
5372 temp = 1; /* JF should be 2? */
5373 temp_fill = get_absolute_expression ();
5374 if (!need_pass_2) /* Never make frag if expect extra pass. */
5375 frag_align (temp, (int) temp_fill, 0);
5376 demand_empty_rest_of_line ();
5377 record_alignment (now_seg, temp);
5381 s_proc (int ignore ATTRIBUTE_UNUSED)
5383 demand_empty_rest_of_line ();
5386 /* Pseudo-ops handled for MRI compatibility. */
5388 /* This function returns non-zero if the argument is a conditional
5389 pseudo-op. This is called when checking whether a pending
5390 alignment is needed. */
5393 m68k_conditional_pseudoop (pseudo_typeS *pop)
5395 return (pop->poc_handler == s_mri_if
5396 || pop->poc_handler == s_mri_else);
5399 /* Handle an MRI style chip specification. */
5408 s = input_line_pointer;
5409 /* We can't use get_symbol_end since the processor names are not proper
5411 while (is_part_of_name (c = *input_line_pointer++))
5413 *--input_line_pointer = 0;
5414 for (i = 0; m68k_cpus[i].name; i++)
5415 if (strcasecmp (s, m68k_cpus[i].name) == 0)
5417 if (!m68k_cpus[i].name)
5419 as_bad (_("%s: unrecognized processor name"), s);
5420 *input_line_pointer = c;
5421 ignore_rest_of_line ();
5424 *input_line_pointer = c;
5426 if (*input_line_pointer == '/')
5427 current_architecture = 0;
5429 current_architecture &= m68881 | m68851;
5430 current_architecture |= m68k_cpus[i].arch & ~(m68881 | m68851);
5431 control_regs = m68k_cpus[i].control_regs;
5433 while (*input_line_pointer == '/')
5435 ++input_line_pointer;
5436 s = input_line_pointer;
5437 /* We can't use get_symbol_end since the processor names are not
5439 while (is_part_of_name (c = *input_line_pointer++))
5441 *--input_line_pointer = 0;
5442 if (strcmp (s, "68881") == 0)
5443 current_architecture |= m68881;
5444 else if (strcmp (s, "68851") == 0)
5445 current_architecture |= m68851;
5446 *input_line_pointer = c;
5450 /* The MRI CHIP pseudo-op. */
5453 s_chip (int ignore ATTRIBUTE_UNUSED)
5459 stop = mri_comment_field (&stopc);
5462 mri_comment_end (stop, stopc);
5463 demand_empty_rest_of_line ();
5466 /* The MRI FOPT pseudo-op. */
5469 s_fopt (int ignore ATTRIBUTE_UNUSED)
5473 if (strncasecmp (input_line_pointer, "ID=", 3) == 0)
5477 input_line_pointer += 3;
5478 temp = get_absolute_expression ();
5479 if (temp < 0 || temp > 7)
5480 as_bad (_("bad coprocessor id"));
5482 m68k_float_copnum = COP0 + temp;
5486 as_bad (_("unrecognized fopt option"));
5487 ignore_rest_of_line ();
5491 demand_empty_rest_of_line ();
5494 /* The structure used to handle the MRI OPT pseudo-op. */
5498 /* The name of the option. */
5501 /* If this is not NULL, just call this function. The first argument
5502 is the ARG field of this structure, the second argument is
5503 whether the option was negated. */
5504 void (*pfn) (int arg, int on);
5506 /* If this is not NULL, and the PFN field is NULL, set the variable
5507 this points to. Set it to the ARG field if the option was not
5508 negated, and the NOTARG field otherwise. */
5511 /* The value to pass to PFN or to assign to *PVAR. */
5514 /* The value to assign to *PVAR if the option is negated. If PFN is
5515 NULL, and PVAR is not NULL, and ARG and NOTARG are the same, then
5516 the option may not be negated. */
5520 /* The table used to handle the MRI OPT pseudo-op. */
5522 static void skip_to_comma (int, int);
5523 static void opt_nest (int, int);
5524 static void opt_chip (int, int);
5525 static void opt_list (int, int);
5526 static void opt_list_symbols (int, int);
5528 static const struct opt_action opt_table[] =
5530 { "abspcadd", 0, &m68k_abspcadd, 1, 0 },
5532 /* We do relaxing, so there is little use for these options. */
5533 { "b", 0, 0, 0, 0 },
5534 { "brs", 0, 0, 0, 0 },
5535 { "brb", 0, 0, 0, 0 },
5536 { "brl", 0, 0, 0, 0 },
5537 { "brw", 0, 0, 0, 0 },
5539 { "c", 0, 0, 0, 0 },
5540 { "cex", 0, 0, 0, 0 },
5541 { "case", 0, &symbols_case_sensitive, 1, 0 },
5542 { "cl", 0, 0, 0, 0 },
5543 { "cre", 0, 0, 0, 0 },
5544 { "d", 0, &flag_keep_locals, 1, 0 },
5545 { "e", 0, 0, 0, 0 },
5546 { "f", 0, &flag_short_refs, 1, 0 },
5547 { "frs", 0, &flag_short_refs, 1, 0 },
5548 { "frl", 0, &flag_short_refs, 0, 1 },
5549 { "g", 0, 0, 0, 0 },
5550 { "i", 0, 0, 0, 0 },
5551 { "m", 0, 0, 0, 0 },
5552 { "mex", 0, 0, 0, 0 },
5553 { "mc", 0, 0, 0, 0 },
5554 { "md", 0, 0, 0, 0 },
5555 { "nest", opt_nest, 0, 0, 0 },
5556 { "next", skip_to_comma, 0, 0, 0 },
5557 { "o", 0, 0, 0, 0 },
5558 { "old", 0, 0, 0, 0 },
5559 { "op", skip_to_comma, 0, 0, 0 },
5560 { "pco", 0, 0, 0, 0 },
5561 { "p", opt_chip, 0, 0, 0 },
5562 { "pcr", 0, 0, 0, 0 },
5563 { "pcs", 0, 0, 0, 0 },
5564 { "r", 0, 0, 0, 0 },
5565 { "quick", 0, &m68k_quick, 1, 0 },
5566 { "rel32", 0, &m68k_rel32, 1, 0 },
5567 { "s", opt_list, 0, 0, 0 },
5568 { "t", opt_list_symbols, 0, 0, 0 },
5569 { "w", 0, &flag_no_warnings, 0, 1 },
5573 #define OPTCOUNT ((int) (sizeof opt_table / sizeof opt_table[0]))
5575 /* The MRI OPT pseudo-op. */
5578 s_opt (int ignore ATTRIBUTE_UNUSED)
5586 const struct opt_action *o;
5591 if (*input_line_pointer == '-')
5593 ++input_line_pointer;
5596 else if (strncasecmp (input_line_pointer, "NO", 2) == 0)
5598 input_line_pointer += 2;
5602 s = input_line_pointer;
5603 c = get_symbol_end ();
5605 for (i = 0, o = opt_table; i < OPTCOUNT; i++, o++)
5607 if (strcasecmp (s, o->name) == 0)
5611 /* Restore input_line_pointer now in case the option
5613 *input_line_pointer = c;
5614 (*o->pfn) (o->arg, t);
5616 else if (o->pvar != NULL)
5618 if (! t && o->arg == o->notarg)
5619 as_bad (_("option `%s' may not be negated"), s);
5620 *input_line_pointer = c;
5621 *o->pvar = t ? o->arg : o->notarg;
5624 *input_line_pointer = c;
5630 as_bad (_("option `%s' not recognized"), s);
5631 *input_line_pointer = c;
5634 while (*input_line_pointer++ == ',');
5636 /* Move back to terminating character. */
5637 --input_line_pointer;
5638 demand_empty_rest_of_line ();
5641 /* Skip ahead to a comma. This is used for OPT options which we do
5642 not support and which take arguments. */
5645 skip_to_comma (int arg ATTRIBUTE_UNUSED, int on ATTRIBUTE_UNUSED)
5647 while (*input_line_pointer != ','
5648 && ! is_end_of_line[(unsigned char) *input_line_pointer])
5649 ++input_line_pointer;
5652 /* Handle the OPT NEST=depth option. */
5655 opt_nest (int arg ATTRIBUTE_UNUSED, int on ATTRIBUTE_UNUSED)
5657 if (*input_line_pointer != '=')
5659 as_bad (_("bad format of OPT NEST=depth"));
5663 ++input_line_pointer;
5664 max_macro_nest = get_absolute_expression ();
5667 /* Handle the OPT P=chip option. */
5670 opt_chip (int arg ATTRIBUTE_UNUSED, int on ATTRIBUTE_UNUSED)
5672 if (*input_line_pointer != '=')
5674 /* This is just OPT P, which we do not support. */
5678 ++input_line_pointer;
5682 /* Handle the OPT S option. */
5685 opt_list (int arg ATTRIBUTE_UNUSED, int on)
5690 /* Handle the OPT T option. */
5693 opt_list_symbols (int arg ATTRIBUTE_UNUSED, int on)
5696 listing |= LISTING_SYMBOLS;
5698 listing &= ~LISTING_SYMBOLS;
5701 /* Handle the MRI REG pseudo-op. */
5704 s_reg (int ignore ATTRIBUTE_UNUSED)
5713 if (line_label == NULL)
5715 as_bad (_("missing label"));
5716 ignore_rest_of_line ();
5721 stop = mri_comment_field (&stopc);
5725 s = input_line_pointer;
5726 while (ISALNUM (*input_line_pointer)
5727 #ifdef REGISTER_PREFIX
5728 || *input_line_pointer == REGISTER_PREFIX
5730 || *input_line_pointer == '/'
5731 || *input_line_pointer == '-')
5732 ++input_line_pointer;
5733 c = *input_line_pointer;
5734 *input_line_pointer = '\0';
5736 if (m68k_ip_op (s, &rop) != 0)
5738 if (rop.error == NULL)
5739 as_bad (_("bad register list"));
5741 as_bad (_("bad register list: %s"), rop.error);
5742 *input_line_pointer = c;
5743 ignore_rest_of_line ();
5747 *input_line_pointer = c;
5749 if (rop.mode == REGLST)
5751 else if (rop.mode == DREG)
5752 mask = 1 << (rop.reg - DATA0);
5753 else if (rop.mode == AREG)
5754 mask = 1 << (rop.reg - ADDR0 + 8);
5755 else if (rop.mode == FPREG)
5756 mask = 1 << (rop.reg - FP0 + 16);
5757 else if (rop.mode == CONTROL
5760 else if (rop.mode == CONTROL
5763 else if (rop.mode == CONTROL
5768 as_bad (_("bad register list"));
5769 ignore_rest_of_line ();
5773 S_SET_SEGMENT (line_label, reg_section);
5774 S_SET_VALUE (line_label, ~mask);
5775 symbol_set_frag (line_label, &zero_address_frag);
5778 mri_comment_end (stop, stopc);
5780 demand_empty_rest_of_line ();
5783 /* This structure is used for the MRI SAVE and RESTORE pseudo-ops. */
5787 struct save_opts *next;
5789 int symbols_case_sensitive;
5793 const enum m68k_register *control_regs;
5798 /* FIXME: We don't save OPT S. */
5801 /* This variable holds the stack of saved options. */
5803 static struct save_opts *save_stack;
5805 /* The MRI SAVE pseudo-op. */
5808 s_save (int ignore ATTRIBUTE_UNUSED)
5810 struct save_opts *s;
5812 s = (struct save_opts *) xmalloc (sizeof (struct save_opts));
5813 s->abspcadd = m68k_abspcadd;
5814 s->symbols_case_sensitive = symbols_case_sensitive;
5815 s->keep_locals = flag_keep_locals;
5816 s->short_refs = flag_short_refs;
5817 s->architecture = current_architecture;
5818 s->control_regs = control_regs;
5819 s->quick = m68k_quick;
5820 s->rel32 = m68k_rel32;
5821 s->listing = listing;
5822 s->no_warnings = flag_no_warnings;
5824 s->next = save_stack;
5827 demand_empty_rest_of_line ();
5830 /* The MRI RESTORE pseudo-op. */
5833 s_restore (int ignore ATTRIBUTE_UNUSED)
5835 struct save_opts *s;
5837 if (save_stack == NULL)
5839 as_bad (_("restore without save"));
5840 ignore_rest_of_line ();
5845 save_stack = s->next;
5847 m68k_abspcadd = s->abspcadd;
5848 symbols_case_sensitive = s->symbols_case_sensitive;
5849 flag_keep_locals = s->keep_locals;
5850 flag_short_refs = s->short_refs;
5851 current_architecture = s->architecture;
5852 control_regs = s->control_regs;
5853 m68k_quick = s->quick;
5854 m68k_rel32 = s->rel32;
5855 listing = s->listing;
5856 flag_no_warnings = s->no_warnings;
5860 demand_empty_rest_of_line ();
5863 /* Types of MRI structured control directives. */
5865 enum mri_control_type
5873 /* This structure is used to stack the MRI structured control
5876 struct mri_control_info
5878 /* The directive within which this one is enclosed. */
5879 struct mri_control_info *outer;
5881 /* The type of directive. */
5882 enum mri_control_type type;
5884 /* Whether an ELSE has been in an IF. */
5887 /* The add or sub statement at the end of a FOR. */
5890 /* The label of the top of a FOR or REPEAT loop. */
5893 /* The label to jump to for the next iteration, or the else
5894 expression of a conditional. */
5897 /* The label to jump to to break out of the loop, or the label past
5898 the end of a conditional. */
5902 /* The stack of MRI structured control directives. */
5904 static struct mri_control_info *mri_control_stack;
5906 /* The current MRI structured control directive index number, used to
5907 generate label names. */
5909 static int mri_control_index;
5911 /* Assemble an instruction for an MRI structured control directive. */
5914 mri_assemble (char *str)
5918 /* md_assemble expects the opcode to be in lower case. */
5919 for (s = str; *s != ' ' && *s != '\0'; s++)
5925 /* Generate a new MRI label structured control directive label name. */
5928 mri_control_label (void)
5932 n = (char *) xmalloc (20);
5933 sprintf (n, "%smc%d", FAKE_LABEL_NAME, mri_control_index);
5934 ++mri_control_index;
5938 /* Create a new MRI structured control directive. */
5940 static struct mri_control_info *
5941 push_mri_control (enum mri_control_type type)
5943 struct mri_control_info *n;
5945 n = (struct mri_control_info *) xmalloc (sizeof (struct mri_control_info));
5949 if (type == mri_if || type == mri_while)
5952 n->top = mri_control_label ();
5953 n->next = mri_control_label ();
5954 n->bottom = mri_control_label ();
5956 n->outer = mri_control_stack;
5957 mri_control_stack = n;
5962 /* Pop off the stack of MRI structured control directives. */
5965 pop_mri_control (void)
5967 struct mri_control_info *n;
5969 n = mri_control_stack;
5970 mri_control_stack = n->outer;
5978 /* Recognize a condition code in an MRI structured control expression. */
5981 parse_mri_condition (int *pcc)
5985 know (*input_line_pointer == '<');
5987 ++input_line_pointer;
5988 c1 = *input_line_pointer++;
5989 c2 = *input_line_pointer++;
5991 if (*input_line_pointer != '>')
5993 as_bad (_("syntax error in structured control directive"));
5997 ++input_line_pointer;
6003 *pcc = (c1 << 8) | c2;
6008 /* Parse a single operand in an MRI structured control expression. */
6011 parse_mri_control_operand (int *pcc, char **leftstart, char **leftstop,
6012 char **rightstart, char **rightstop)
6024 if (*input_line_pointer == '<')
6026 /* It's just a condition code. */
6027 return parse_mri_condition (pcc);
6030 /* Look ahead for the condition code. */
6031 for (s = input_line_pointer; *s != '\0'; ++s)
6033 if (*s == '<' && s[1] != '\0' && s[2] != '\0' && s[3] == '>')
6038 as_bad (_("missing condition code in structured control directive"));
6042 *leftstart = input_line_pointer;
6044 if (*leftstop > *leftstart
6045 && ((*leftstop)[-1] == ' ' || (*leftstop)[-1] == '\t'))
6048 input_line_pointer = s;
6049 if (! parse_mri_condition (pcc))
6052 /* Look ahead for AND or OR or end of line. */
6053 for (s = input_line_pointer; *s != '\0'; ++s)
6055 /* We must make sure we don't misinterpret AND/OR at the end of labels!
6056 if d0 <eq> #FOOAND and d1 <ne> #BAROR then
6058 if ((s == input_line_pointer
6061 && ((strncasecmp (s, "AND", 3) == 0
6062 && (s[3] == '.' || ! is_part_of_name (s[3])))
6063 || (strncasecmp (s, "OR", 2) == 0
6064 && (s[2] == '.' || ! is_part_of_name (s[2])))))
6068 *rightstart = input_line_pointer;
6070 if (*rightstop > *rightstart
6071 && ((*rightstop)[-1] == ' ' || (*rightstop)[-1] == '\t'))
6074 input_line_pointer = s;
6079 #define MCC(b1, b2) (((b1) << 8) | (b2))
6081 /* Swap the sense of a condition. This changes the condition so that
6082 it generates the same result when the operands are swapped. */
6085 swap_mri_condition (int cc)
6089 case MCC ('h', 'i'): return MCC ('c', 's');
6090 case MCC ('l', 's'): return MCC ('c', 'c');
6091 /* <HS> is an alias for <CC>. */
6092 case MCC ('h', 's'):
6093 case MCC ('c', 'c'): return MCC ('l', 's');
6094 /* <LO> is an alias for <CS>. */
6095 case MCC ('l', 'o'):
6096 case MCC ('c', 's'): return MCC ('h', 'i');
6097 case MCC ('p', 'l'): return MCC ('m', 'i');
6098 case MCC ('m', 'i'): return MCC ('p', 'l');
6099 case MCC ('g', 'e'): return MCC ('l', 'e');
6100 case MCC ('l', 't'): return MCC ('g', 't');
6101 case MCC ('g', 't'): return MCC ('l', 't');
6102 case MCC ('l', 'e'): return MCC ('g', 'e');
6103 /* Issue a warning for conditions we can not swap. */
6104 case MCC ('n', 'e'): return MCC ('n', 'e'); // no problem here
6105 case MCC ('e', 'q'): return MCC ('e', 'q'); // also no problem
6106 case MCC ('v', 'c'):
6107 case MCC ('v', 's'):
6109 as_warn (_("Condition <%c%c> in structured control directive can not be encoded correctly"),
6110 (char) (cc >> 8), (char) (cc));
6116 /* Reverse the sense of a condition. */
6119 reverse_mri_condition (int cc)
6123 case MCC ('h', 'i'): return MCC ('l', 's');
6124 case MCC ('l', 's'): return MCC ('h', 'i');
6125 /* <HS> is an alias for <CC> */
6126 case MCC ('h', 's'): return MCC ('l', 'o');
6127 case MCC ('c', 'c'): return MCC ('c', 's');
6128 /* <LO> is an alias for <CS> */
6129 case MCC ('l', 'o'): return MCC ('h', 's');
6130 case MCC ('c', 's'): return MCC ('c', 'c');
6131 case MCC ('n', 'e'): return MCC ('e', 'q');
6132 case MCC ('e', 'q'): return MCC ('n', 'e');
6133 case MCC ('v', 'c'): return MCC ('v', 's');
6134 case MCC ('v', 's'): return MCC ('v', 'c');
6135 case MCC ('p', 'l'): return MCC ('m', 'i');
6136 case MCC ('m', 'i'): return MCC ('p', 'l');
6137 case MCC ('g', 'e'): return MCC ('l', 't');
6138 case MCC ('l', 't'): return MCC ('g', 'e');
6139 case MCC ('g', 't'): return MCC ('l', 'e');
6140 case MCC ('l', 'e'): return MCC ('g', 't');
6145 /* Build an MRI structured control expression. This generates test
6146 and branch instructions. It goes to TRUELAB if the condition is
6147 true, and to FALSELAB if the condition is false. Exactly one of
6148 TRUELAB and FALSELAB will be NULL, meaning to fall through. QUAL
6149 is the size qualifier for the expression. EXTENT is the size to
6150 use for the branch. */
6153 build_mri_control_operand (int qual, int cc, char *leftstart, char *leftstop,
6154 char *rightstart, char *rightstop,
6155 const char *truelab, const char *falselab,
6161 if (leftstart != NULL)
6163 struct m68k_op leftop, rightop;
6166 /* Swap the compare operands, if necessary, to produce a legal
6167 m68k compare instruction. Comparing a register operand with
6168 a non-register operand requires the register to be on the
6169 right (cmp, cmpa). Comparing an immediate value with
6170 anything requires the immediate value to be on the left
6175 (void) m68k_ip_op (leftstart, &leftop);
6180 (void) m68k_ip_op (rightstart, &rightop);
6183 if (rightop.mode == IMMED
6184 || ((leftop.mode == DREG || leftop.mode == AREG)
6185 && (rightop.mode != DREG && rightop.mode != AREG)))
6189 /* Correct conditional handling:
6190 if #1 <lt> d0 then ;means if (1 < d0)
6196 cmp #1,d0 if we do *not* swap the operands
6197 bgt true we need the swapped condition!
6204 leftstart = rightstart;
6207 leftstop = rightstop;
6212 cc = swap_mri_condition (cc);
6216 if (truelab == NULL)
6218 cc = reverse_mri_condition (cc);
6222 if (leftstart != NULL)
6224 buf = (char *) xmalloc (20
6225 + (leftstop - leftstart)
6226 + (rightstop - rightstart));
6232 *s++ = TOLOWER (qual);
6234 memcpy (s, leftstart, leftstop - leftstart);
6235 s += leftstop - leftstart;
6237 memcpy (s, rightstart, rightstop - rightstart);
6238 s += rightstop - rightstart;
6244 buf = (char *) xmalloc (20 + strlen (truelab));
6250 *s++ = TOLOWER (extent);
6252 strcpy (s, truelab);
6257 /* Parse an MRI structured control expression. This generates test
6258 and branch instructions. STOP is where the expression ends. It
6259 goes to TRUELAB if the condition is true, and to FALSELAB if the
6260 condition is false. Exactly one of TRUELAB and FALSELAB will be
6261 NULL, meaning to fall through. QUAL is the size qualifier for the
6262 expression. EXTENT is the size to use for the branch. */
6265 parse_mri_control_expression (char *stop, int qual, const char *truelab,
6266 const char *falselab, int extent)
6278 if (! parse_mri_control_operand (&cc, &leftstart, &leftstop,
6279 &rightstart, &rightstop))
6285 if (strncasecmp (input_line_pointer, "AND", 3) == 0)
6289 if (falselab != NULL)
6292 flab = mri_control_label ();
6294 build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart,
6295 rightstop, (const char *) NULL, flab, extent);
6297 input_line_pointer += 3;
6298 if (*input_line_pointer != '.'
6299 || input_line_pointer[1] == '\0')
6303 qual = input_line_pointer[1];
6304 input_line_pointer += 2;
6307 if (! parse_mri_control_operand (&cc, &leftstart, &leftstop,
6308 &rightstart, &rightstop))
6314 build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart,
6315 rightstop, truelab, falselab, extent);
6317 if (falselab == NULL)
6320 else if (strncasecmp (input_line_pointer, "OR", 2) == 0)
6324 if (truelab != NULL)
6327 tlab = mri_control_label ();
6329 build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart,
6330 rightstop, tlab, (const char *) NULL, extent);
6332 input_line_pointer += 2;
6333 if (*input_line_pointer != '.'
6334 || input_line_pointer[1] == '\0')
6338 qual = input_line_pointer[1];
6339 input_line_pointer += 2;
6342 if (! parse_mri_control_operand (&cc, &leftstart, &leftstop,
6343 &rightstart, &rightstop))
6349 build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart,
6350 rightstop, truelab, falselab, extent);
6352 if (truelab == NULL)
6357 build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart,
6358 rightstop, truelab, falselab, extent);
6362 if (input_line_pointer != stop)
6363 as_bad (_("syntax error in structured control directive"));
6366 /* Handle the MRI IF pseudo-op. This may be a structured control
6367 directive, or it may be a regular assembler conditional, depending
6375 struct mri_control_info *n;
6377 /* A structured control directive must end with THEN with an
6378 optional qualifier. */
6379 s = input_line_pointer;
6380 /* We only accept '*' as introduction of comments if preceded by white space
6381 or at first column of a line (I think this can't actually happen here?)
6382 This is important when assembling:
6383 if d0 <ne> 12(a0,d0*2) then
6384 if d0 <ne> #CONST*20 then. */
6385 while (! (is_end_of_line[(unsigned char) *s]
6388 && (s == input_line_pointer
6390 || *(s-1) == '\t'))))
6393 while (s > input_line_pointer && (*s == ' ' || *s == '\t'))
6396 if (s - input_line_pointer > 1
6400 if (s - input_line_pointer < 3
6401 || strncasecmp (s - 3, "THEN", 4) != 0)
6405 as_bad (_("missing then"));
6406 ignore_rest_of_line ();
6410 /* It's a conditional. */
6415 /* Since this might be a conditional if, this pseudo-op will be
6416 called even if we are supported to be ignoring input. Double
6417 check now. Clobber *input_line_pointer so that ignore_input
6418 thinks that this is not a special pseudo-op. */
6419 c = *input_line_pointer;
6420 *input_line_pointer = 0;
6421 if (ignore_input ())
6423 *input_line_pointer = c;
6424 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6425 ++input_line_pointer;
6426 demand_empty_rest_of_line ();
6429 *input_line_pointer = c;
6431 n = push_mri_control (mri_if);
6433 parse_mri_control_expression (s - 3, qual, (const char *) NULL,
6434 n->next, s[1] == '.' ? s[2] : '\0');
6437 input_line_pointer = s + 3;
6439 input_line_pointer = s + 1;
6443 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6444 ++input_line_pointer;
6447 demand_empty_rest_of_line ();
6450 /* Handle the MRI else pseudo-op. If we are currently doing an MRI
6451 structured IF, associate the ELSE with the IF. Otherwise, assume
6452 it is a conditional else. */
6455 s_mri_else (int qual)
6462 && (mri_control_stack == NULL
6463 || mri_control_stack->type != mri_if
6464 || mri_control_stack->else_seen))
6470 c = *input_line_pointer;
6471 *input_line_pointer = 0;
6472 if (ignore_input ())
6474 *input_line_pointer = c;
6475 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6476 ++input_line_pointer;
6477 demand_empty_rest_of_line ();
6480 *input_line_pointer = c;
6482 if (mri_control_stack == NULL
6483 || mri_control_stack->type != mri_if
6484 || mri_control_stack->else_seen)
6486 as_bad (_("else without matching if"));
6487 ignore_rest_of_line ();
6491 mri_control_stack->else_seen = 1;
6493 buf = (char *) xmalloc (20 + strlen (mri_control_stack->bottom));
6494 q[0] = TOLOWER (qual);
6496 sprintf (buf, "bra%s %s", q, mri_control_stack->bottom);
6500 colon (mri_control_stack->next);
6504 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6505 ++input_line_pointer;
6508 demand_empty_rest_of_line ();
6511 /* Handle the MRI ENDI pseudo-op. */
6514 s_mri_endi (int ignore ATTRIBUTE_UNUSED)
6516 if (mri_control_stack == NULL
6517 || mri_control_stack->type != mri_if)
6519 as_bad (_("endi without matching if"));
6520 ignore_rest_of_line ();
6524 /* ignore_input will not return true for ENDI, so we don't need to
6525 worry about checking it again here. */
6527 if (! mri_control_stack->else_seen)
6528 colon (mri_control_stack->next);
6529 colon (mri_control_stack->bottom);
6535 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6536 ++input_line_pointer;
6539 demand_empty_rest_of_line ();
6542 /* Handle the MRI BREAK pseudo-op. */
6545 s_mri_break (int extent)
6547 struct mri_control_info *n;
6551 n = mri_control_stack;
6553 && n->type != mri_for
6554 && n->type != mri_repeat
6555 && n->type != mri_while)
6559 as_bad (_("break outside of structured loop"));
6560 ignore_rest_of_line ();
6564 buf = (char *) xmalloc (20 + strlen (n->bottom));
6565 ex[0] = TOLOWER (extent);
6567 sprintf (buf, "bra%s %s", ex, n->bottom);
6573 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6574 ++input_line_pointer;
6577 demand_empty_rest_of_line ();
6580 /* Handle the MRI NEXT pseudo-op. */
6583 s_mri_next (int extent)
6585 struct mri_control_info *n;
6589 n = mri_control_stack;
6591 && n->type != mri_for
6592 && n->type != mri_repeat
6593 && n->type != mri_while)
6597 as_bad (_("next outside of structured loop"));
6598 ignore_rest_of_line ();
6602 buf = (char *) xmalloc (20 + strlen (n->next));
6603 ex[0] = TOLOWER (extent);
6605 sprintf (buf, "bra%s %s", ex, n->next);
6611 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6612 ++input_line_pointer;
6615 demand_empty_rest_of_line ();
6618 /* Handle the MRI FOR pseudo-op. */
6621 s_mri_for (int qual)
6623 const char *varstart, *varstop;
6624 const char *initstart, *initstop;
6625 const char *endstart, *endstop;
6626 const char *bystart, *bystop;
6630 struct mri_control_info *n;
6636 FOR.q var = init { TO | DOWNTO } end [ BY by ] DO.e
6640 varstart = input_line_pointer;
6642 /* Look for the '='. */
6643 while (! is_end_of_line[(unsigned char) *input_line_pointer]
6644 && *input_line_pointer != '=')
6645 ++input_line_pointer;
6646 if (*input_line_pointer != '=')
6648 as_bad (_("missing ="));
6649 ignore_rest_of_line ();
6653 varstop = input_line_pointer;
6654 if (varstop > varstart
6655 && (varstop[-1] == ' ' || varstop[-1] == '\t'))
6658 ++input_line_pointer;
6660 initstart = input_line_pointer;
6662 /* Look for TO or DOWNTO. */
6665 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6667 if (strncasecmp (input_line_pointer, "TO", 2) == 0
6668 && ! is_part_of_name (input_line_pointer[2]))
6670 initstop = input_line_pointer;
6671 input_line_pointer += 2;
6674 if (strncasecmp (input_line_pointer, "DOWNTO", 6) == 0
6675 && ! is_part_of_name (input_line_pointer[6]))
6677 initstop = input_line_pointer;
6679 input_line_pointer += 6;
6682 ++input_line_pointer;
6684 if (initstop == NULL)
6686 as_bad (_("missing to or downto"));
6687 ignore_rest_of_line ();
6690 if (initstop > initstart
6691 && (initstop[-1] == ' ' || initstop[-1] == '\t'))
6695 endstart = input_line_pointer;
6697 /* Look for BY or DO. */
6700 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6702 if (strncasecmp (input_line_pointer, "BY", 2) == 0
6703 && ! is_part_of_name (input_line_pointer[2]))
6705 endstop = input_line_pointer;
6707 input_line_pointer += 2;
6710 if (strncasecmp (input_line_pointer, "DO", 2) == 0
6711 && (input_line_pointer[2] == '.'
6712 || ! is_part_of_name (input_line_pointer[2])))
6714 endstop = input_line_pointer;
6715 input_line_pointer += 2;
6718 ++input_line_pointer;
6720 if (endstop == NULL)
6722 as_bad (_("missing do"));
6723 ignore_rest_of_line ();
6726 if (endstop > endstart
6727 && (endstop[-1] == ' ' || endstop[-1] == '\t'))
6733 bystop = bystart + 2;
6738 bystart = input_line_pointer;
6742 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6744 if (strncasecmp (input_line_pointer, "DO", 2) == 0
6745 && (input_line_pointer[2] == '.'
6746 || ! is_part_of_name (input_line_pointer[2])))
6748 bystop = input_line_pointer;
6749 input_line_pointer += 2;
6752 ++input_line_pointer;
6756 as_bad (_("missing do"));
6757 ignore_rest_of_line ();
6760 if (bystop > bystart
6761 && (bystop[-1] == ' ' || bystop[-1] == '\t'))
6765 if (*input_line_pointer != '.')
6769 extent = input_line_pointer[1];
6770 input_line_pointer += 2;
6773 /* We have fully parsed the FOR operands. Now build the loop. */
6774 n = push_mri_control (mri_for);
6776 buf = (char *) xmalloc (50 + (input_line_pointer - varstart));
6778 /* Move init,var. */
6785 *s++ = TOLOWER (qual);
6787 memcpy (s, initstart, initstop - initstart);
6788 s += initstop - initstart;
6790 memcpy (s, varstart, varstop - varstart);
6791 s += varstop - varstart;
6803 *s++ = TOLOWER (qual);
6805 memcpy (s, endstart, endstop - endstart);
6806 s += endstop - endstart;
6808 memcpy (s, varstart, varstop - varstart);
6809 s += varstop - varstart;
6814 ex[0] = TOLOWER (extent);
6817 sprintf (buf, "blt%s %s", ex, n->bottom);
6819 sprintf (buf, "bgt%s %s", ex, n->bottom);
6822 /* Put together the add or sub instruction used by ENDF. */
6830 *s++ = TOLOWER (qual);
6832 memcpy (s, bystart, bystop - bystart);
6833 s += bystop - bystart;
6835 memcpy (s, varstart, varstop - varstart);
6836 s += varstop - varstart;
6842 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6843 ++input_line_pointer;
6846 demand_empty_rest_of_line ();
6849 /* Handle the MRI ENDF pseudo-op. */
6852 s_mri_endf (int ignore ATTRIBUTE_UNUSED)
6854 if (mri_control_stack == NULL
6855 || mri_control_stack->type != mri_for)
6857 as_bad (_("endf without for"));
6858 ignore_rest_of_line ();
6862 colon (mri_control_stack->next);
6864 mri_assemble (mri_control_stack->incr);
6866 sprintf (mri_control_stack->incr, "bra %s", mri_control_stack->top);
6867 mri_assemble (mri_control_stack->incr);
6869 free (mri_control_stack->incr);
6871 colon (mri_control_stack->bottom);
6877 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6878 ++input_line_pointer;
6881 demand_empty_rest_of_line ();
6884 /* Handle the MRI REPEAT pseudo-op. */
6887 s_mri_repeat (int ignore ATTRIBUTE_UNUSED)
6889 struct mri_control_info *n;
6891 n = push_mri_control (mri_repeat);
6895 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6896 ++input_line_pointer;
6898 demand_empty_rest_of_line ();
6901 /* Handle the MRI UNTIL pseudo-op. */
6904 s_mri_until (int qual)
6908 if (mri_control_stack == NULL
6909 || mri_control_stack->type != mri_repeat)
6911 as_bad (_("until without repeat"));
6912 ignore_rest_of_line ();
6916 colon (mri_control_stack->next);
6918 for (s = input_line_pointer; ! is_end_of_line[(unsigned char) *s]; s++)
6921 parse_mri_control_expression (s, qual, (const char *) NULL,
6922 mri_control_stack->top, '\0');
6924 colon (mri_control_stack->bottom);
6926 input_line_pointer = s;
6932 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6933 ++input_line_pointer;
6936 demand_empty_rest_of_line ();
6939 /* Handle the MRI WHILE pseudo-op. */
6942 s_mri_while (int qual)
6946 struct mri_control_info *n;
6948 s = input_line_pointer;
6949 /* We only accept '*' as introduction of comments if preceded by white space
6950 or at first column of a line (I think this can't actually happen here?)
6951 This is important when assembling:
6952 while d0 <ne> 12(a0,d0*2) do
6953 while d0 <ne> #CONST*20 do. */
6954 while (! (is_end_of_line[(unsigned char) *s]
6957 && (s == input_line_pointer
6959 || *(s-1) == '\t'))))
6962 while (*s == ' ' || *s == '\t')
6964 if (s - input_line_pointer > 1
6967 if (s - input_line_pointer < 2
6968 || strncasecmp (s - 1, "DO", 2) != 0)
6970 as_bad (_("missing do"));
6971 ignore_rest_of_line ();
6975 n = push_mri_control (mri_while);
6979 parse_mri_control_expression (s - 1, qual, (const char *) NULL, n->bottom,
6980 s[1] == '.' ? s[2] : '\0');
6982 input_line_pointer = s + 1;
6983 if (*input_line_pointer == '.')
6984 input_line_pointer += 2;
6988 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6989 ++input_line_pointer;
6992 demand_empty_rest_of_line ();
6995 /* Handle the MRI ENDW pseudo-op. */
6998 s_mri_endw (int ignore ATTRIBUTE_UNUSED)
7002 if (mri_control_stack == NULL
7003 || mri_control_stack->type != mri_while)
7005 as_bad (_("endw without while"));
7006 ignore_rest_of_line ();
7010 buf = (char *) xmalloc (20 + strlen (mri_control_stack->next));
7011 sprintf (buf, "bra %s", mri_control_stack->next);
7015 colon (mri_control_stack->bottom);
7021 while (! is_end_of_line[(unsigned char) *input_line_pointer])
7022 ++input_line_pointer;
7025 demand_empty_rest_of_line ();
7028 /* Parse a .cpu directive. */
7031 s_m68k_cpu (int ignored ATTRIBUTE_UNUSED)
7038 as_bad (_("already assembled instructions"));
7039 ignore_rest_of_line ();
7043 name = input_line_pointer;
7044 while (*input_line_pointer && !ISSPACE(*input_line_pointer))
7045 input_line_pointer++;
7046 saved_char = *input_line_pointer;
7047 *input_line_pointer = 0;
7049 m68k_set_cpu (name, 1, 0);
7051 *input_line_pointer = saved_char;
7052 demand_empty_rest_of_line ();
7056 /* Parse a .arch directive. */
7059 s_m68k_arch (int ignored ATTRIBUTE_UNUSED)
7066 as_bad (_("already assembled instructions"));
7067 ignore_rest_of_line ();
7071 name = input_line_pointer;
7072 while (*input_line_pointer && *input_line_pointer != ','
7073 && !ISSPACE (*input_line_pointer))
7074 input_line_pointer++;
7075 saved_char = *input_line_pointer;
7076 *input_line_pointer = 0;
7078 if (m68k_set_arch (name, 1, 0))
7080 /* Scan extensions. */
7083 *input_line_pointer++ = saved_char;
7084 if (!*input_line_pointer || ISSPACE (*input_line_pointer))
7086 name = input_line_pointer;
7087 while (*input_line_pointer && *input_line_pointer != ','
7088 && !ISSPACE (*input_line_pointer))
7089 input_line_pointer++;
7090 saved_char = *input_line_pointer;
7091 *input_line_pointer = 0;
7093 while (m68k_set_extension (name, 1, 0));
7096 *input_line_pointer = saved_char;
7097 demand_empty_rest_of_line ();
7101 /* Lookup a cpu name in TABLE and return the slot found. Return NULL
7102 if none is found, the caller is responsible for emitting an error
7103 message. If ALLOW_M is non-zero, we allow an initial 'm' on the
7104 cpu name, if it begins with a '6' (possibly skipping an intervening
7105 'c'. We also allow a 'c' in the same place. if NEGATED is
7106 non-zero, we accept a leading 'no-' and *NEGATED is set to true, if
7107 the option is indeed negated. */
7109 static const struct m68k_cpu *
7110 m68k_lookup_cpu (const char *arg, const struct m68k_cpu *table,
7111 int allow_m, int *negated)
7113 /* allow negated value? */
7118 if (arg[0] == 'n' && arg[1] == 'o' && arg[2] == '-')
7125 /* Remove 'm' or 'mc' prefix from 68k variants. */
7132 else if (arg[1] == 'c' && arg[2] == '6')
7136 else if (arg[0] == 'c' && arg[1] == '6')
7139 for (; table->name; table++)
7140 if (!strcmp (arg, table->name))
7142 if (table->alias < -1 || table->alias > 1)
7143 as_bad (_("`%s' is deprecated, use `%s'"),
7144 table->name, table[table->alias < 0 ? 1 : -1].name);
7150 /* Set the cpu, issuing errors if it is unrecognized, or invalid */
7153 m68k_set_cpu (char const *name, int allow_m, int silent)
7155 const struct m68k_cpu *cpu;
7157 cpu = m68k_lookup_cpu (name, m68k_cpus, allow_m, NULL);
7162 as_bad (_("cpu `%s' unrecognized"), name);
7166 if (selected_cpu && selected_cpu != cpu)
7168 as_bad (_("already selected `%s' processor"),
7169 selected_cpu->name);
7176 /* Set the architecture, issuing errors if it is unrecognized, or invalid */
7179 m68k_set_arch (char const *name, int allow_m, int silent)
7181 const struct m68k_cpu *arch;
7183 arch = m68k_lookup_cpu (name, m68k_archs, allow_m, NULL);
7188 as_bad (_("architecture `%s' unrecognized"), name);
7192 if (selected_arch && selected_arch != arch)
7194 as_bad (_("already selected `%s' architecture"),
7195 selected_arch->name);
7199 selected_arch = arch;
7203 /* Set the architecture extension, issuing errors if it is
7204 unrecognized, or invalid */
7207 m68k_set_extension (char const *name, int allow_m, int silent)
7210 const struct m68k_cpu *ext;
7212 ext = m68k_lookup_cpu (name, m68k_extensions, allow_m, &negated);
7217 as_bad (_("extension `%s' unrecognized"), name);
7222 not_current_architecture |= ext->arch;
7224 current_architecture |= ext->arch;
7229 Invocation line includes a switch not recognized by the base assembler.
7233 const char *md_shortopts = "lSA:m:kQ:V";
7235 const char *md_shortopts = "lSA:m:k";
7238 struct option md_longopts[] = {
7239 #define OPTION_PIC (OPTION_MD_BASE)
7240 {"pic", no_argument, NULL, OPTION_PIC},
7241 #define OPTION_REGISTER_PREFIX_OPTIONAL (OPTION_MD_BASE + 1)
7242 {"register-prefix-optional", no_argument, NULL,
7243 OPTION_REGISTER_PREFIX_OPTIONAL},
7244 #define OPTION_BITWISE_OR (OPTION_MD_BASE + 2)
7245 {"bitwise-or", no_argument, NULL, OPTION_BITWISE_OR},
7246 #define OPTION_BASE_SIZE_DEFAULT_16 (OPTION_MD_BASE + 3)
7247 {"base-size-default-16", no_argument, NULL, OPTION_BASE_SIZE_DEFAULT_16},
7248 #define OPTION_BASE_SIZE_DEFAULT_32 (OPTION_MD_BASE + 4)
7249 {"base-size-default-32", no_argument, NULL, OPTION_BASE_SIZE_DEFAULT_32},
7250 #define OPTION_DISP_SIZE_DEFAULT_16 (OPTION_MD_BASE + 5)
7251 {"disp-size-default-16", no_argument, NULL, OPTION_DISP_SIZE_DEFAULT_16},
7252 #define OPTION_DISP_SIZE_DEFAULT_32 (OPTION_MD_BASE + 6)
7253 {"disp-size-default-32", no_argument, NULL, OPTION_DISP_SIZE_DEFAULT_32},
7254 #define OPTION_PCREL (OPTION_MD_BASE + 7)
7255 {"pcrel", no_argument, NULL, OPTION_PCREL},
7256 {NULL, no_argument, NULL, 0}
7258 size_t md_longopts_size = sizeof (md_longopts);
7261 md_parse_option (int c, char *arg)
7265 case 'l': /* -l means keep external to 2 bit offset
7266 rather than 16 bit one. */
7267 flag_short_refs = 1;
7270 case 'S': /* -S means that jbsr's always turn into
7272 flag_long_jumps = 1;
7275 case OPTION_PCREL: /* --pcrel means never turn PC-relative
7276 branches into absolute jumps. */
7277 flag_keep_pcrel = 1;
7283 break; /* -pic, Position Independent Code. */
7285 case OPTION_REGISTER_PREFIX_OPTIONAL:
7286 flag_reg_prefix_optional = 1;
7287 reg_prefix_optional_seen = 1;
7290 /* -V: SVR4 argument to print version ID. */
7292 print_version_id ();
7295 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
7296 should be emitted or not. FIXME: Not implemented. */
7300 case OPTION_BITWISE_OR:
7305 n = (char *) xmalloc (strlen (m68k_comment_chars) + 1);
7307 for (s = m68k_comment_chars; *s != '\0'; s++)
7311 m68k_comment_chars = n;
7315 case OPTION_BASE_SIZE_DEFAULT_16:
7316 m68k_index_width_default = SIZE_WORD;
7319 case OPTION_BASE_SIZE_DEFAULT_32:
7320 m68k_index_width_default = SIZE_LONG;
7323 case OPTION_DISP_SIZE_DEFAULT_16:
7325 m68k_rel32_from_cmdline = 1;
7328 case OPTION_DISP_SIZE_DEFAULT_32:
7330 m68k_rel32_from_cmdline = 1;
7335 as_tsktsk (_ ("option `-A%s' is deprecated: use `-%s'",
7338 /* Intentional fall-through. */
7340 if (!strncmp (arg, "arch=", 5))
7341 m68k_set_arch (arg + 5, 1, 0);
7342 else if (!strncmp (arg, "cpu=", 4))
7343 m68k_set_cpu (arg + 4, 1, 0);
7344 else if (m68k_set_extension (arg, 0, 1))
7346 else if (m68k_set_arch (arg, 0, 1))
7348 else if (m68k_set_cpu (arg, 0, 1))
7361 /* Setup tables from the selected arch and/or cpu */
7364 m68k_init_arch (void)
7366 if (not_current_architecture & current_architecture)
7368 as_bad (_("architecture features both enabled and disabled"));
7369 not_current_architecture &= ~current_architecture;
7373 current_architecture |= selected_arch->arch;
7374 control_regs = selected_arch->control_regs;
7377 current_architecture |= selected_cpu->arch;
7379 current_architecture &= ~not_current_architecture;
7381 if ((current_architecture & (cfloat | m68881)) == (cfloat | m68881))
7383 /* Determine which float is really meant. */
7384 if (current_architecture & (m68k_mask & ~m68881))
7385 current_architecture ^= cfloat;
7387 current_architecture ^= m68881;
7392 control_regs = selected_cpu->control_regs;
7393 if (current_architecture & ~selected_cpu->arch)
7395 as_bad (_("selected processor does not have all features of selected architecture"));
7396 current_architecture
7397 = selected_cpu->arch & ~not_current_architecture;
7401 if ((current_architecture & m68k_mask)
7402 && (current_architecture & ~m68k_mask))
7404 as_bad (_ ("m68k and cf features both selected"));
7405 if (current_architecture & m68k_mask)
7406 current_architecture &= m68k_mask;
7408 current_architecture &= ~m68k_mask;
7411 /* Permit m68881 specification with all cpus; those that can't work
7412 with a coprocessor could be doing emulation. */
7413 if (current_architecture & m68851)
7415 if (current_architecture & m68040)
7416 as_warn (_("68040 and 68851 specified; mmu instructions may assemble incorrectly"));
7418 /* What other incompatibilities could we check for? */
7420 if (cpu_of_arch (current_architecture) < m68020
7421 || arch_coldfire_p (current_architecture))
7422 md_relax_table[TAB (PCINDEX, BYTE)].rlx_more = 0;
7428 md_show_usage (FILE *stream)
7430 const char *default_cpu = TARGET_CPU;
7432 unsigned int default_arch;
7434 /* Get the canonical name for the default target CPU. */
7435 if (*default_cpu == 'm')
7437 for (i = 0; m68k_cpus[i].name; i++)
7439 if (strcasecmp (default_cpu, m68k_cpus[i].name) == 0)
7441 default_arch = m68k_cpus[i].arch;
7442 while (m68k_cpus[i].alias > 0)
7444 while (m68k_cpus[i].alias < 0)
7446 default_cpu = m68k_cpus[i].name;
7450 fprintf (stream, _("\
7451 -march=<arch> set architecture\n\
7452 -mcpu=<cpu> set cpu [default %s]\n\
7454 for (i = 0; m68k_extensions[i].name; i++)
7455 fprintf (stream, _("\
7456 -m[no-]%-16s enable/disable%s architecture extension\n\
7457 "), m68k_extensions[i].name,
7458 m68k_extensions[i].alias > 0 ? " ColdFire"
7459 : m68k_extensions[i].alias < 0 ? " m68k" : "");
7461 fprintf (stream, _("\
7462 -l use 1 word for refs to undefined symbols [default 2]\n\
7463 -pic, -k generate position independent code\n\
7464 -S turn jbsr into jsr\n\
7465 --pcrel never turn PC-relative branches into absolute jumps\n\
7466 --register-prefix-optional\n\
7467 recognize register names without prefix character\n\
7468 --bitwise-or do not treat `|' as a comment character\n\
7469 --base-size-default-16 base reg without size is 16 bits\n\
7470 --base-size-default-32 base reg without size is 32 bits (default)\n\
7471 --disp-size-default-16 displacement with unknown size is 16 bits\n\
7472 --disp-size-default-32 displacement with unknown size is 32 bits (default)\n\
7475 fprintf (stream, _("Architecture variants are: "));
7476 for (i = 0; m68k_archs[i].name; i++)
7479 fprintf (stream, " | ");
7480 fprintf (stream, m68k_archs[i].name);
7482 fprintf (stream, "\n");
7484 fprintf (stream, _("Processor variants are: "));
7485 for (i = 0; m68k_cpus[i].name; i++)
7488 fprintf (stream, " | ");
7489 fprintf (stream, m68k_cpus[i].name);
7491 fprintf (stream, _("\n"));
7496 /* TEST2: Test md_assemble() */
7497 /* Warning, this routine probably doesn't work anymore. */
7501 struct m68k_it the_ins;
7509 if (!gets (buf) || !*buf)
7511 if (buf[0] == '|' || buf[1] == '.')
7513 for (cp = buf; *cp; cp++)
7518 memset (&the_ins, '\0', sizeof (the_ins));
7519 m68k_ip (&the_ins, buf);
7522 printf (_("Error %s in %s\n"), the_ins.error, buf);
7526 printf (_("Opcode(%d.%s): "), the_ins.numo, the_ins.args);
7527 for (n = 0; n < the_ins.numo; n++)
7528 printf (" 0x%x", the_ins.opcode[n] & 0xffff);
7530 print_the_insn (&the_ins.opcode[0], stdout);
7531 (void) putchar ('\n');
7533 for (n = 0; n < strlen (the_ins.args) / 2; n++)
7535 if (the_ins.operands[n].error)
7537 printf ("op%d Error %s in %s\n", n, the_ins.operands[n].error, buf);
7540 printf ("mode %d, reg %d, ", the_ins.operands[n].mode,
7541 the_ins.operands[n].reg);
7542 if (the_ins.operands[n].b_const)
7543 printf ("Constant: '%.*s', ",
7544 1 + the_ins.operands[n].e_const - the_ins.operands[n].b_const,
7545 the_ins.operands[n].b_const);
7546 printf ("ireg %d, isiz %d, imul %d, ", the_ins.operands[n].ireg,
7547 the_ins.operands[n].isiz, the_ins.operands[n].imul);
7548 if (the_ins.operands[n].b_iadd)
7549 printf ("Iadd: '%.*s',",
7550 1 + the_ins.operands[n].e_iadd - the_ins.operands[n].b_iadd,
7551 the_ins.operands[n].b_iadd);
7560 is_label (char *str)
7564 while (*str && *str != ' ')
7566 if (str[-1] == ':' || str[1] == '=')
7573 /* Possible states for relaxation:
7575 0 0 branch offset byte (bra, etc)
7579 1 0 indexed offsets byte a0@(32,d4:w:1) etc
7583 2 0 two-offset index word-word a0@(32,d4)@(45) etc
7590 /* We have no need to default values of symbols. */
7593 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
7598 /* Round up a section size to the appropriate boundary. */
7600 md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
7603 /* For a.out, force the section size to be aligned. If we don't do
7604 this, BFD will align it for us, but it will not write out the
7605 final bytes of the section. This may be a bug in BFD, but it is
7606 easier to fix it here since that is how the other a.out targets
7610 align = bfd_get_section_alignment (stdoutput, segment);
7611 size = ((size + (1 << align) - 1) & ((valueT) -1 << align));
7617 /* Exactly what point is a PC-relative offset relative TO?
7618 On the 68k, it is relative to the address of the first extension
7619 word. The difference between the addresses of the offset and the
7620 first extension word is stored in fx_pcrel_adjust. */
7622 md_pcrel_from (fixS *fixP)
7626 /* Because fx_pcrel_adjust is a char, and may be unsigned, we explicitly
7627 sign extend the value here. */
7628 adjust = ((fixP->fx_pcrel_adjust & 0xff) ^ 0x80) - 0x80;
7631 return fixP->fx_where + fixP->fx_frag->fr_address - adjust;
7636 m68k_elf_final_processing (void)
7640 if (arch_coldfire_fpu (current_architecture))
7641 flags |= EF_M68K_CFV4E;
7642 /* Set file-specific flags if this is a cpu32 processor. */
7643 if (cpu_of_arch (current_architecture) & cpu32)
7644 flags |= EF_M68K_CPU32;
7645 else if (cpu_of_arch (current_architecture) & fido_a)
7646 flags |= EF_M68K_FIDO;
7647 else if ((cpu_of_arch (current_architecture) & m68000up)
7648 && !(cpu_of_arch (current_architecture) & m68020up))
7649 flags |= EF_M68K_M68000;
7651 if (current_architecture & mcfisa_a)
7653 static const unsigned isa_features[][2] =
7655 {EF_M68K_CF_ISA_A_NODIV,mcfisa_a},
7656 {EF_M68K_CF_ISA_A, mcfisa_a|mcfhwdiv},
7657 {EF_M68K_CF_ISA_A_PLUS, mcfisa_a|mcfisa_aa|mcfhwdiv|mcfusp},
7658 {EF_M68K_CF_ISA_B_NOUSP,mcfisa_a|mcfisa_b|mcfhwdiv},
7659 {EF_M68K_CF_ISA_B, mcfisa_a|mcfisa_b|mcfhwdiv|mcfusp},
7660 {EF_M68K_CF_ISA_C, mcfisa_a|mcfisa_c|mcfhwdiv|mcfusp},
7663 static const unsigned mac_features[][2] =
7665 {EF_M68K_CF_MAC, mcfmac},
7666 {EF_M68K_CF_EMAC, mcfemac},
7672 pattern = (current_architecture
7673 & (mcfisa_a|mcfisa_aa|mcfisa_b|mcfisa_c|mcfhwdiv|mcfusp));
7674 for (ix = 0; isa_features[ix][1]; ix++)
7676 if (pattern == isa_features[ix][1])
7678 flags |= isa_features[ix][0];
7682 if (!isa_features[ix][1])
7685 as_warn (_("Not a defined coldfire architecture"));
7689 if (current_architecture & cfloat)
7690 flags |= EF_M68K_CF_FLOAT | EF_M68K_CFV4E;
7692 pattern = current_architecture & (mcfmac|mcfemac);
7695 for (ix = 0; mac_features[ix][1]; ix++)
7697 if (pattern == mac_features[ix][1])
7699 flags |= mac_features[ix][0];
7703 if (!mac_features[ix][1])
7708 elf_elfheader (stdoutput)->e_flags |= flags;
7713 tc_m68k_regname_to_dw2regnum (char *regname)
7715 unsigned int regnum;
7716 static const char *const regnames[] =
7718 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
7719 "a0", "a1", "a2", "a3", "a4", "a5", "a6", "sp",
7720 "fp0", "fp1", "fp2", "fp3", "fp4", "fp5", "fp6", "fp7",
7724 for (regnum = 0; regnum < ARRAY_SIZE (regnames); regnum++)
7725 if (strcmp (regname, regnames[regnum]) == 0)
7732 tc_m68k_frame_initial_instructions (void)
7734 static int sp_regno = -1;
7737 sp_regno = tc_m68k_regname_to_dw2regnum ("sp");
7739 cfi_add_CFA_def_cfa (sp_regno, -DWARF2_CIE_DATA_ALIGNMENT);
7740 cfi_add_CFA_offset (DWARF2_DEFAULT_RETURN_COLUMN, DWARF2_CIE_DATA_ALIGNMENT);