1 /* tc-m68k.c -- Assemble for the m68k family
2 Copyright (C) 1987, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000
3 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, 59 Temple Place - Suite 330, Boston, MA
27 #include "opcode/m68k.h"
28 #include "m68k-parse.h"
34 /* This string holds the chars that always start a comment. If the
35 pre-processor is disabled, these aren't very useful. The macro
36 tc_comment_chars points to this. We use this, rather than the
37 usual comment_chars, so that the --bitwise-or option will work. */
38 #if defined (TE_SVR4) || defined (TE_DELTA)
39 const char *m68k_comment_chars
= "|#";
41 const char *m68k_comment_chars
= "|";
44 /* This array holds the chars that only start a comment at the beginning of
45 a line. If the line seems to have the form '# 123 filename'
46 .line and .file directives will appear in the pre-processed output */
47 /* Note that input_file.c hand checks for '#' at the beginning of the
48 first line of the input file. This is because the compiler outputs
49 #NO_APP at the beginning of its output. */
50 /* Also note that comments like this one will always work. */
51 const char line_comment_chars
[] = "#*";
53 const char line_separator_chars
[] = ";";
55 /* Chars that can be used to separate mant from exp in floating point nums */
56 CONST
char EXP_CHARS
[] = "eE";
58 /* Chars that mean this number is a floating point constant, as
59 in "0f12.456" or "0d1.2345e12". */
61 CONST
char FLT_CHARS
[] = "rRsSfFdDxXeEpP";
63 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
64 changed in read.c . Ideally it shouldn't have to know about it at all,
65 but nothing is ideal around here. */
67 const int md_reloc_size
= 8; /* Size of relocation record */
69 /* Are we trying to generate PIC code? If so, absolute references
70 ought to be made into linkage table references or pc-relative
71 references. Not implemented. For ELF there are other means
72 to denote pic relocations. */
75 static int flag_short_refs
; /* -l option */
76 static int flag_long_jumps
; /* -S option */
77 static int flag_keep_pcrel
; /* --pcrel option. */
79 #ifdef REGISTER_PREFIX_OPTIONAL
80 int flag_reg_prefix_optional
= REGISTER_PREFIX_OPTIONAL
;
82 int flag_reg_prefix_optional
;
85 /* Whether --register-prefix-optional was used on the command line. */
86 static int reg_prefix_optional_seen
;
88 /* The floating point coprocessor to use by default. */
89 static enum m68k_register m68k_float_copnum
= COP1
;
91 /* If this is non-zero, then references to number(%pc) will be taken
92 to refer to number, rather than to %pc + number. */
93 static int m68k_abspcadd
;
95 /* If this is non-zero, then the quick forms of the move, add, and sub
96 instructions are used when possible. */
97 static int m68k_quick
= 1;
99 /* If this is non-zero, then if the size is not specified for a base
100 or outer displacement, the assembler assumes that the size should
102 static int m68k_rel32
= 1;
104 /* This is non-zero if m68k_rel32 was set from the command line. */
105 static int m68k_rel32_from_cmdline
;
107 /* The default width to use for an index register when using a base
109 static enum m68k_size m68k_index_width_default
= SIZE_LONG
;
111 /* We want to warn if any text labels are misaligned. In order to get
112 the right line number, we need to record the line number for each
117 struct label_line
*next
;
124 /* The list of labels. */
126 static struct label_line
*labels
;
128 /* The current label. */
130 static struct label_line
*current_label
;
132 /* Its an arbitrary name: This means I don't approve of it */
133 /* See flames below */
134 static struct obstack robyn
;
136 #define TAB(x,y) (((x)<<2)+(y))
137 #define TABTYPE(xy) ((xy) >> 2)
143 /* Case `g' except when BCC68000 is applicable. */
145 /* Coprocessor branches. */
147 /* Mode 7.2 -- program counter indirect with (16-bit) displacement,
148 supported on all cpus. Widens to 32-bit absolute. */
150 /* For inserting an extra jmp instruction with long offset on 68000,
151 for expanding conditional branches. (Not bsr or bra.) Since the
152 68000 doesn't support 32-bit displacements for conditional
153 branches, we fake it by reversing the condition and branching
154 around a jmp with an absolute long operand. */
156 /* For the DBcc "instructions". If the displacement requires 32 bits,
157 the branch-around-a-jump game is played here too. */
159 /* Not currently used? */
161 /* Mode AINDX (apc-relative) using PC, with variable target, might fit
167 const char *m_operands
;
168 unsigned long m_opcode
;
172 struct m68k_incant
*m_next
;
175 #define getone(x) ((((x)->m_opcode)>>16)&0xffff)
176 #define gettwo(x) (((x)->m_opcode)&0xffff)
178 static const enum m68k_register m68000_control_regs
[] = { 0 };
179 static const enum m68k_register m68010_control_regs
[] = {
183 static const enum m68k_register m68020_control_regs
[] = {
184 SFC
, DFC
, USP
, VBR
, CACR
, CAAR
, MSP
, ISP
,
187 static const enum m68k_register m68040_control_regs
[] = {
188 SFC
, DFC
, CACR
, TC
, ITT0
, ITT1
, DTT0
, DTT1
,
189 USP
, VBR
, MSP
, ISP
, MMUSR
, URP
, SRP
,
192 static const enum m68k_register m68060_control_regs
[] = {
193 SFC
, DFC
, CACR
, TC
, ITT0
, ITT1
, DTT0
, DTT1
, BUSCR
,
194 USP
, VBR
, URP
, SRP
, PCR
,
197 static const enum m68k_register mcf_control_regs
[] = {
198 CACR
, TC
, ITT0
, ITT1
, DTT0
, DTT1
, VBR
, ROMBAR
,
199 RAMBAR0
, RAMBAR1
, MBAR
,
202 #define cpu32_control_regs m68010_control_regs
204 static const enum m68k_register
*control_regs
;
206 /* internal form of a 68020 instruction */
210 const char *args
; /* list of opcode info */
213 int numo
; /* Number of shorts in opcode */
216 struct m68k_op operands
[6];
218 int nexp
; /* number of exprs in use */
219 struct m68k_exp exprs
[4];
221 int nfrag
; /* Number of frags we have to produce */
224 int fragoff
; /* Where in the current opcode the frag ends */
231 int nrel
; /* Num of reloc strucs in use */
238 /* In a pc relative address the difference between the address
239 of the offset and the address that the offset is relative
240 to. This depends on the addressing mode. Basically this
241 is the value to put in the offset field to address the
242 first byte of the offset, without regarding the special
243 significance of some values (in the branch instruction, for
247 /* Whether this expression needs special pic relocation, and if
249 enum pic_relocation pic_reloc
;
252 reloc
[5]; /* Five is enough??? */
255 #define cpu_of_arch(x) ((x) & (m68000up|mcf))
256 #define float_of_arch(x) ((x) & mfloat)
257 #define mmu_of_arch(x) ((x) & mmmu)
258 #define arch_coldfire_p(x) (((x) & mcf) != 0)
260 /* Macros for determining if cpu supports a specific addressing mode */
261 #define HAVE_LONG_BRANCH(x) ((x) & (m68020|m68030|m68040|m68060|cpu32))
263 static struct m68k_it the_ins
; /* the instruction being assembled */
265 #define op(ex) ((ex)->exp.X_op)
266 #define adds(ex) ((ex)->exp.X_add_symbol)
267 #define subs(ex) ((ex)->exp.X_op_symbol)
268 #define offs(ex) ((ex)->exp.X_add_number)
270 /* Macros for adding things to the m68k_it struct */
272 #define addword(w) the_ins.opcode[the_ins.numo++]=(w)
274 /* Static functions. */
276 static void insop
PARAMS ((int, const struct m68k_incant
*));
277 static void add_fix
PARAMS ((int, struct m68k_exp
*, int, int));
278 static void add_frag
PARAMS ((symbolS
*, offsetT
, int));
280 /* Like addword, but goes BEFORE general operands */
284 const struct m68k_incant
*opcode
;
287 for(z
=the_ins
.numo
;z
>opcode
->m_codenum
;--z
)
288 the_ins
.opcode
[z
]=the_ins
.opcode
[z
-1];
289 for(z
=0;z
<the_ins
.nrel
;z
++)
290 the_ins
.reloc
[z
].n
+=2;
291 for (z
= 0; z
< the_ins
.nfrag
; z
++)
292 the_ins
.fragb
[z
].fragoff
++;
293 the_ins
.opcode
[opcode
->m_codenum
]=w
;
297 /* The numo+1 kludge is so we can hit the low order byte of the prev word.
300 add_fix (width
, exp
, pc_rel
, pc_fix
)
302 struct m68k_exp
*exp
;
306 the_ins
.reloc
[the_ins
.nrel
].n
= ((width
== 'B' || width
== '3')
310 : (the_ins
.numo
*2)));
311 the_ins
.reloc
[the_ins
.nrel
].exp
= exp
->exp
;
312 the_ins
.reloc
[the_ins
.nrel
].wid
= width
;
313 the_ins
.reloc
[the_ins
.nrel
].pcrel_fix
= pc_fix
;
315 the_ins
.reloc
[the_ins
.nrel
].pic_reloc
= exp
->pic_reloc
;
317 the_ins
.reloc
[the_ins
.nrel
++].pcrel
= pc_rel
;
320 /* Cause an extra frag to be generated here, inserting up to 10 bytes
321 (that value is chosen in the frag_var call in md_assemble). TYPE
322 is the subtype of the frag to be generated; its primary type is
323 rs_machine_dependent.
325 The TYPE parameter is also used by md_convert_frag_1 and
326 md_estimate_size_before_relax. The appropriate type of fixup will
327 be emitted by md_convert_frag_1.
329 ADD becomes the FR_SYMBOL field of the frag, and OFF the FR_OFFSET. */
331 add_frag (add
, off
, type
)
336 the_ins
.fragb
[the_ins
.nfrag
].fragoff
=the_ins
.numo
;
337 the_ins
.fragb
[the_ins
.nfrag
].fadd
=add
;
338 the_ins
.fragb
[the_ins
.nfrag
].foff
=off
;
339 the_ins
.fragb
[the_ins
.nfrag
++].fragty
=type
;
343 (op (ex) != O_constant && op (ex) != O_big)
345 static char *crack_operand
PARAMS ((char *str
, struct m68k_op
*opP
));
346 static int get_num
PARAMS ((struct m68k_exp
*exp
, int ok
));
347 static void m68k_ip
PARAMS ((char *));
348 static void insert_reg
PARAMS ((const char *, int));
349 static void select_control_regs
PARAMS ((void));
350 static void init_regtable
PARAMS ((void));
351 static int reverse_16_bits
PARAMS ((int in
));
352 static int reverse_8_bits
PARAMS ((int in
));
353 static void install_gen_operand
PARAMS ((int mode
, int val
));
354 static void install_operand
PARAMS ((int mode
, int val
));
355 static void s_bss
PARAMS ((int));
356 static void s_data1
PARAMS ((int));
357 static void s_data2
PARAMS ((int));
358 static void s_even
PARAMS ((int));
359 static void s_proc
PARAMS ((int));
360 static void mri_chip
PARAMS ((void));
361 static void s_chip
PARAMS ((int));
362 static void s_fopt
PARAMS ((int));
363 static void s_opt
PARAMS ((int));
364 static void s_reg
PARAMS ((int));
365 static void s_restore
PARAMS ((int));
366 static void s_save
PARAMS ((int));
367 static void s_mri_if
PARAMS ((int));
368 static void s_mri_else
PARAMS ((int));
369 static void s_mri_endi
PARAMS ((int));
370 static void s_mri_break
PARAMS ((int));
371 static void s_mri_next
PARAMS ((int));
372 static void s_mri_for
PARAMS ((int));
373 static void s_mri_endf
PARAMS ((int));
374 static void s_mri_repeat
PARAMS ((int));
375 static void s_mri_until
PARAMS ((int));
376 static void s_mri_while
PARAMS ((int));
377 static void s_mri_endw
PARAMS ((int));
378 static void md_apply_fix_2
PARAMS ((fixS
*, offsetT
));
379 static void md_convert_frag_1
PARAMS ((fragS
*));
381 static int current_architecture
;
389 static const struct m68k_cpu archs
[] = {
390 { m68000
, "68000", 0 },
391 { m68010
, "68010", 0 },
392 { m68020
, "68020", 0 },
393 { m68030
, "68030", 0 },
394 { m68040
, "68040", 0 },
395 { m68060
, "68060", 0 },
396 { cpu32
, "cpu32", 0 },
397 { m68881
, "68881", 0 },
398 { m68851
, "68851", 0 },
399 { mcf5200
, "5200", 0 },
400 { mcf5206e
, "5206e", 0 },
401 { mcf5307
, "5307", 0},
402 /* Aliases (effectively, so far as gas is concerned) for the above
404 { m68020
, "68k", 1 },
405 { m68000
, "68008", 1 },
406 { m68000
, "68302", 1 },
407 { m68000
, "68306", 1 },
408 { m68000
, "68307", 1 },
409 { m68000
, "68322", 1 },
410 { m68000
, "68356", 1 },
411 { m68000
, "68ec000", 1 },
412 { m68000
, "68hc000", 1 },
413 { m68000
, "68hc001", 1 },
414 { m68020
, "68ec020", 1 },
415 { m68030
, "68ec030", 1 },
416 { m68040
, "68ec040", 1 },
417 { m68060
, "68ec060", 1 },
418 { cpu32
, "68330", 1 },
419 { cpu32
, "68331", 1 },
420 { cpu32
, "68332", 1 },
421 { cpu32
, "68333", 1 },
422 { cpu32
, "68334", 1 },
423 { cpu32
, "68336", 1 },
424 { cpu32
, "68340", 1 },
425 { cpu32
, "68341", 1 },
426 { cpu32
, "68349", 1 },
427 { cpu32
, "68360", 1 },
428 { m68881
, "68882", 1 },
429 { mcf5200
, "5202", 1 },
430 { mcf5200
, "5204", 1 },
431 { mcf5200
, "5206", 1 },
434 static const int n_archs
= sizeof (archs
) / sizeof (archs
[0]);
436 /* BCC68000 is for patching in an extra jmp instruction for long offsets
437 on the 68000. The 68000 doesn't support long branches with branchs */
439 /* This table desribes how you change sizes for the various types of variable
440 size expressions. This version only supports two kinds. */
442 /* Note that calls to frag_var need to specify the maximum expansion
443 needed; this is currently 10 bytes for DBCC. */
446 How far Forward this mode will reach:
447 How far Backward this mode will reach:
448 How many bytes this mode will add to the size of the frag
449 Which mode to go to if the offset won't fit in this one
451 relax_typeS md_relax_table
[] =
453 {1, 1, 0, 0}, /* First entries aren't used */
454 {1, 1, 0, 0}, /* For no good reason except */
455 {1, 1, 0, 0}, /* that the VAX doesn't either */
458 {(127), (-128), 0, TAB (ABRANCH
, SHORT
)},
459 {(32767), (-32768), 2, TAB (ABRANCH
, LONG
)},
463 {1, 1, 0, 0}, /* FBRANCH doesn't come BYTE */
464 {(32767), (-32768), 2, TAB (FBRANCH
, LONG
)},
468 {1, 1, 0, 0}, /* PCREL doesn't come BYTE */
469 {(32767), (-32768), 2, TAB (PCREL
, LONG
)},
473 {(127), (-128), 0, TAB (BCC68000
, SHORT
)},
474 {(32767), (-32768), 2, TAB (BCC68000
, LONG
)},
475 {0, 0, 6, 0}, /* jmp long space */
478 {1, 1, 0, 0}, /* DBCC doesn't come BYTE */
479 {(32767), (-32768), 2, TAB (DBCC
, LONG
)},
480 {0, 0, 10, 0}, /* bra/jmp long space */
483 {1, 1, 0, 0}, /* PCLEA doesn't come BYTE */
484 {32767, -32768, 2, TAB (PCLEA
, LONG
)},
488 /* For, e.g., jmp pcrel indexed. */
489 {125, -130, 0, TAB (PCINDEX
, SHORT
)},
490 {32765, -32770, 2, TAB (PCINDEX
, LONG
)},
495 /* These are the machine dependent pseudo-ops. These are included so
496 the assembler can work on the output from the SUN C compiler, which
500 /* This table describes all the machine specific pseudo-ops the assembler
501 has to support. The fields are:
502 pseudo-op name without dot
503 function to call to execute this pseudo-op
504 Integer arg to pass to the function
506 const pseudo_typeS md_pseudo_table
[] =
508 {"data1", s_data1
, 0},
509 {"data2", s_data2
, 0},
512 {"skip", s_space
, 0},
514 #if defined (TE_SUN3) || defined (OBJ_ELF)
515 {"align", s_align_bytes
, 0},
518 {"swbeg", s_ignore
, 0},
520 {"extend", float_cons
, 'x'},
521 {"ldouble", float_cons
, 'x'},
523 /* The following pseudo-ops are supported for MRI compatibility. */
525 {"comline", s_space
, 1},
527 {"mask2", s_ignore
, 0},
530 {"restore", s_restore
, 0},
534 {"if.b", s_mri_if
, 'b'},
535 {"if.w", s_mri_if
, 'w'},
536 {"if.l", s_mri_if
, 'l'},
537 {"else", s_mri_else
, 0},
538 {"else.s", s_mri_else
, 's'},
539 {"else.l", s_mri_else
, 'l'},
540 {"endi", s_mri_endi
, 0},
541 {"break", s_mri_break
, 0},
542 {"break.s", s_mri_break
, 's'},
543 {"break.l", s_mri_break
, 'l'},
544 {"next", s_mri_next
, 0},
545 {"next.s", s_mri_next
, 's'},
546 {"next.l", s_mri_next
, 'l'},
547 {"for", s_mri_for
, 0},
548 {"for.b", s_mri_for
, 'b'},
549 {"for.w", s_mri_for
, 'w'},
550 {"for.l", s_mri_for
, 'l'},
551 {"endf", s_mri_endf
, 0},
552 {"repeat", s_mri_repeat
, 0},
553 {"until", s_mri_until
, 0},
554 {"until.b", s_mri_until
, 'b'},
555 {"until.w", s_mri_until
, 'w'},
556 {"until.l", s_mri_until
, 'l'},
557 {"while", s_mri_while
, 0},
558 {"while.b", s_mri_while
, 'b'},
559 {"while.w", s_mri_while
, 'w'},
560 {"while.l", s_mri_while
, 'l'},
561 {"endw", s_mri_endw
, 0},
566 /* The mote pseudo ops are put into the opcode table, since they
567 don't start with a . they look like opcodes to gas.
571 extern void obj_coff_section
PARAMS ((int));
574 CONST pseudo_typeS mote_pseudo_table
[] =
587 {"xdef", s_globl
, 0},
589 {"align", s_align_bytes
, 0},
591 {"align", s_align_ptwo
, 0},
594 {"sect", obj_coff_section
, 0},
595 {"section", obj_coff_section
, 0},
600 #define issbyte(x) ((x)>=-128 && (x)<=127)
601 #define isubyte(x) ((x)>=0 && (x)<=255)
602 #define issword(x) ((x)>=-32768 && (x)<=32767)
603 #define isuword(x) ((x)>=0 && (x)<=65535)
605 #define isbyte(x) ((x)>= -255 && (x)<=255)
606 #define isword(x) ((x)>=-65536 && (x)<=65535)
607 #define islong(x) (1)
609 extern char *input_line_pointer
;
611 static char mklower_table
[256];
612 #define mklower(c) (mklower_table[(unsigned char)(c)])
613 static char notend_table
[256];
614 static char alt_notend_table
[256];
616 (! (notend_table[(unsigned char) *s] \
618 && alt_notend_table[(unsigned char) s[1]])))
620 #if defined (M68KCOFF) && !defined (BFD_ASSEMBLER)
622 #ifdef NO_PCREL_RELOCS
625 make_pcrel_absolute(fixP
, add_number
)
629 register unsigned char *opcode
= fixP
->fx_frag
->fr_opcode
;
631 /* rewrite the PC relative instructions to absolute address ones.
632 * these are rumoured to be faster, and the apollo linker refuses
633 * to deal with the PC relative relocations.
635 if (opcode
[0] == 0x60 && opcode
[1] == 0xff) /* BRA -> JMP */
640 else if (opcode
[0] == 0x61 && opcode
[1] == 0xff) /* BSR -> JSR */
646 as_fatal (_("Unknown PC relative instruction"));
651 #endif /* NO_PCREL_RELOCS */
654 tc_coff_fix2rtype (fixP
)
657 if (fixP
->fx_tcbit
&& fixP
->fx_size
== 4)
658 return R_RELLONG_NEG
;
659 #ifdef NO_PCREL_RELOCS
660 know (fixP
->fx_pcrel
== 0);
661 return (fixP
->fx_size
== 1 ? R_RELBYTE
662 : fixP
->fx_size
== 2 ? R_DIR16
665 return (fixP
->fx_pcrel
?
666 (fixP
->fx_size
== 1 ? R_PCRBYTE
:
667 fixP
->fx_size
== 2 ? R_PCRWORD
:
669 (fixP
->fx_size
== 1 ? R_RELBYTE
:
670 fixP
->fx_size
== 2 ? R_RELWORD
:
679 /* Compute the relocation code for a fixup of SIZE bytes, using pc
680 relative relocation if PCREL is non-zero. PIC says whether a special
681 pic relocation was requested. */
683 static bfd_reloc_code_real_type get_reloc_code
684 PARAMS ((int, int, enum pic_relocation
));
686 static bfd_reloc_code_real_type
687 get_reloc_code (size
, pcrel
, pic
)
690 enum pic_relocation pic
;
698 return BFD_RELOC_8_GOT_PCREL
;
700 return BFD_RELOC_16_GOT_PCREL
;
702 return BFD_RELOC_32_GOT_PCREL
;
710 return BFD_RELOC_8_GOTOFF
;
712 return BFD_RELOC_16_GOTOFF
;
714 return BFD_RELOC_32_GOTOFF
;
722 return BFD_RELOC_8_PLT_PCREL
;
724 return BFD_RELOC_16_PLT_PCREL
;
726 return BFD_RELOC_32_PLT_PCREL
;
734 return BFD_RELOC_8_PLTOFF
;
736 return BFD_RELOC_16_PLTOFF
;
738 return BFD_RELOC_32_PLTOFF
;
748 return BFD_RELOC_8_PCREL
;
750 return BFD_RELOC_16_PCREL
;
752 return BFD_RELOC_32_PCREL
;
772 as_bad (_("Can not do %d byte pc-relative relocation"), size
);
774 as_bad (_("Can not do %d byte pc-relative pic relocation"), size
);
779 as_bad (_("Can not do %d byte relocation"), size
);
781 as_bad (_("Can not do %d byte pic relocation"), size
);
784 return BFD_RELOC_NONE
;
787 /* Here we decide which fixups can be adjusted to make them relative
788 to the beginning of the section instead of the symbol. Basically
789 we need to make sure that the dynamic relocations are done
790 correctly, so in some cases we force the original symbol to be
793 tc_m68k_fix_adjustable (fixP
)
796 /* Prevent all adjustments to global symbols. */
797 if (S_IS_EXTERNAL (fixP
->fx_addsy
)
798 || S_IS_WEAK (fixP
->fx_addsy
))
801 /* adjust_reloc_syms doesn't know about the GOT */
802 switch (fixP
->fx_r_type
)
804 case BFD_RELOC_8_GOT_PCREL
:
805 case BFD_RELOC_16_GOT_PCREL
:
806 case BFD_RELOC_32_GOT_PCREL
:
807 case BFD_RELOC_8_GOTOFF
:
808 case BFD_RELOC_16_GOTOFF
:
809 case BFD_RELOC_32_GOTOFF
:
810 case BFD_RELOC_8_PLT_PCREL
:
811 case BFD_RELOC_16_PLT_PCREL
:
812 case BFD_RELOC_32_PLT_PCREL
:
813 case BFD_RELOC_8_PLTOFF
:
814 case BFD_RELOC_16_PLTOFF
:
815 case BFD_RELOC_32_PLTOFF
:
818 case BFD_RELOC_VTABLE_INHERIT
:
819 case BFD_RELOC_VTABLE_ENTRY
:
829 #define get_reloc_code(SIZE,PCREL,OTHER) NO_RELOC
836 tc_gen_reloc (section
, fixp
)
841 bfd_reloc_code_real_type code
;
846 if (fixp
->fx_r_type
!= BFD_RELOC_NONE
)
848 code
= fixp
->fx_r_type
;
850 /* Since DIFF_EXPR_OK is defined in tc-m68k.h, it is possible
851 that fixup_segment converted a non-PC relative reloc into a
852 PC relative reloc. In such a case, we need to convert the
859 code
= BFD_RELOC_8_PCREL
;
862 code
= BFD_RELOC_16_PCREL
;
865 code
= BFD_RELOC_32_PCREL
;
867 case BFD_RELOC_8_PCREL
:
868 case BFD_RELOC_16_PCREL
:
869 case BFD_RELOC_32_PCREL
:
870 case BFD_RELOC_8_GOT_PCREL
:
871 case BFD_RELOC_16_GOT_PCREL
:
872 case BFD_RELOC_32_GOT_PCREL
:
873 case BFD_RELOC_8_GOTOFF
:
874 case BFD_RELOC_16_GOTOFF
:
875 case BFD_RELOC_32_GOTOFF
:
876 case BFD_RELOC_8_PLT_PCREL
:
877 case BFD_RELOC_16_PLT_PCREL
:
878 case BFD_RELOC_32_PLT_PCREL
:
879 case BFD_RELOC_8_PLTOFF
:
880 case BFD_RELOC_16_PLTOFF
:
881 case BFD_RELOC_32_PLTOFF
:
884 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
885 _("Cannot make %s relocation PC relative"),
886 bfd_get_reloc_code_name (code
));
892 #define F(SZ,PCREL) (((SZ) << 1) + (PCREL))
893 switch (F (fixp
->fx_size
, fixp
->fx_pcrel
))
895 #define MAP(SZ,PCREL,TYPE) case F(SZ,PCREL): code = (TYPE); break
896 MAP (1, 0, BFD_RELOC_8
);
897 MAP (2, 0, BFD_RELOC_16
);
898 MAP (4, 0, BFD_RELOC_32
);
899 MAP (1, 1, BFD_RELOC_8_PCREL
);
900 MAP (2, 1, BFD_RELOC_16_PCREL
);
901 MAP (4, 1, BFD_RELOC_32_PCREL
);
909 reloc
= (arelent
*) xmalloc (sizeof (arelent
));
910 reloc
->sym_ptr_ptr
= (asymbol
**) xmalloc (sizeof (asymbol
*));
911 *reloc
->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
912 reloc
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
915 reloc
->addend
= fixp
->fx_addnumber
;
920 reloc
->addend
= fixp
->fx_addnumber
;
922 reloc
->addend
= (section
->vma
923 + (fixp
->fx_pcrel_adjust
== 64
924 ? -1 : fixp
->fx_pcrel_adjust
)
926 + md_pcrel_from (fixp
));
929 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, code
);
930 assert (reloc
->howto
!= 0);
935 #endif /* BFD_ASSEMBLER */
937 /* Return zero if the reference to SYMBOL from within the same segment may
941 /* On an ELF system, we can't relax an externally visible symbol,
942 because it may be overridden by a shared library. However, if
943 TARGET_OS is "elf", then we presume that we are assembling for an
944 embedded system, in which case we don't have to worry about shared
945 libraries, and we can relax anything. */
947 #define relaxable_symbol(symbol) \
948 (strcmp (TARGET_OS, "elf") == 0 \
949 || (! S_IS_EXTERNAL (symbol) \
950 && ! S_IS_WEAK (symbol)))
954 #define relaxable_symbol(symbol) 1
958 /* Handle of the OPCODE hash table. NULL means any use before
959 m68k_ip_begin() will crash. */
960 static struct hash_control
*op_hash
;
962 /* Assemble an m68k instruction. */
969 register struct m68k_op
*opP
;
970 register const struct m68k_incant
*opcode
;
971 register const char *s
;
972 register int tmpreg
= 0, baseo
= 0, outro
= 0, nextword
;
973 char *pdot
, *pdotmove
;
974 enum m68k_size siz1
, siz2
;
978 LITTLENUM_TYPE words
[6];
979 LITTLENUM_TYPE
*wordp
;
980 unsigned long ok_arch
= 0;
982 if (*instring
== ' ')
983 instring
++; /* skip leading whitespace */
985 /* Scan up to end of operation-code, which MUST end in end-of-string
986 or exactly 1 space. */
988 for (p
= instring
; *p
!= '\0'; p
++)
998 the_ins
.error
= _("No operator");
1002 /* p now points to the end of the opcode name, probably whitespace.
1003 Make sure the name is null terminated by clobbering the
1004 whitespace, look it up in the hash table, then fix it back.
1005 Remove a dot, first, since the opcode tables have none. */
1008 for (pdotmove
= pdot
; pdotmove
< p
; pdotmove
++)
1009 *pdotmove
= pdotmove
[1];
1015 opcode
= (const struct m68k_incant
*) hash_find (op_hash
, instring
);
1020 for (pdotmove
= p
; pdotmove
> pdot
; pdotmove
--)
1021 *pdotmove
= pdotmove
[-1];
1028 the_ins
.error
= _("Unknown operator");
1032 /* found a legitimate opcode, start matching operands */
1036 if (opcode
->m_operands
== 0)
1038 char *old
= input_line_pointer
;
1040 input_line_pointer
= p
;
1041 /* Ahh - it's a motorola style psuedo op */
1042 mote_pseudo_table
[opcode
->m_opnum
].poc_handler
1043 (mote_pseudo_table
[opcode
->m_opnum
].poc_val
);
1044 input_line_pointer
= old
;
1050 if (flag_mri
&& opcode
->m_opnum
== 0)
1052 /* In MRI mode, random garbage is allowed after an instruction
1053 which accepts no operands. */
1054 the_ins
.args
= opcode
->m_operands
;
1055 the_ins
.numargs
= opcode
->m_opnum
;
1056 the_ins
.numo
= opcode
->m_codenum
;
1057 the_ins
.opcode
[0] = getone (opcode
);
1058 the_ins
.opcode
[1] = gettwo (opcode
);
1062 for (opP
= &the_ins
.operands
[0]; *p
; opP
++)
1064 p
= crack_operand (p
, opP
);
1068 the_ins
.error
= opP
->error
;
1073 opsfound
= opP
- &the_ins
.operands
[0];
1075 /* This ugly hack is to support the floating pt opcodes in their
1076 standard form. Essentially, we fake a first enty of type COP#1 */
1077 if (opcode
->m_operands
[0] == 'I')
1081 for (n
= opsfound
; n
> 0; --n
)
1082 the_ins
.operands
[n
] = the_ins
.operands
[n
- 1];
1084 memset ((char *) (&the_ins
.operands
[0]), '\0',
1085 sizeof (the_ins
.operands
[0]));
1086 the_ins
.operands
[0].mode
= CONTROL
;
1087 the_ins
.operands
[0].reg
= m68k_float_copnum
;
1091 /* We've got the operands. Find an opcode that'll accept them */
1094 /* If we didn't get the right number of ops, or we have no
1095 common model with this pattern then reject this pattern. */
1097 ok_arch
|= opcode
->m_arch
;
1098 if (opsfound
!= opcode
->m_opnum
1099 || ((opcode
->m_arch
& current_architecture
) == 0))
1103 for (s
= opcode
->m_operands
, opP
= &the_ins
.operands
[0];
1107 /* Warning: this switch is huge! */
1108 /* I've tried to organize the cases into this order:
1109 non-alpha first, then alpha by letter. Lower-case
1110 goes directly before uppercase counterpart. */
1111 /* Code with multiple case ...: gets sorted by the lowest
1112 case ... it belongs to. I hope this makes sense. */
1218 if (opP
->reg
== PC
|| opP
->reg
== ZPC
)
1235 if (opP
->reg
== PC
|| opP
->reg
== ZPC
)
1254 if (opP
->reg
== PC
|| opP
->reg
== ZPC
)
1264 if (opP
->mode
!= IMMED
)
1266 else if (s
[1] == 'b'
1267 && ! isvar (&opP
->disp
)
1268 && (opP
->disp
.exp
.X_op
!= O_constant
1269 || ! isbyte (opP
->disp
.exp
.X_add_number
)))
1271 else if (s
[1] == 'B'
1272 && ! isvar (&opP
->disp
)
1273 && (opP
->disp
.exp
.X_op
!= O_constant
1274 || ! issbyte (opP
->disp
.exp
.X_add_number
)))
1276 else if (s
[1] == 'w'
1277 && ! isvar (&opP
->disp
)
1278 && (opP
->disp
.exp
.X_op
!= O_constant
1279 || ! isword (opP
->disp
.exp
.X_add_number
)))
1281 else if (s
[1] == 'W'
1282 && ! isvar (&opP
->disp
)
1283 && (opP
->disp
.exp
.X_op
!= O_constant
1284 || ! issword (opP
->disp
.exp
.X_add_number
)))
1290 if (opP
->mode
!= IMMED
)
1295 if (opP
->mode
== AREG
1296 || opP
->mode
== CONTROL
1297 || opP
->mode
== FPREG
1298 || opP
->mode
== IMMED
1299 || opP
->mode
== REGLST
1300 || (opP
->mode
!= ABSL
1302 || opP
->reg
== ZPC
)))
1307 if (opP
->mode
== CONTROL
1308 || opP
->mode
== FPREG
1309 || opP
->mode
== REGLST
1310 || opP
->mode
== IMMED
1311 || (opP
->mode
!= ABSL
1313 || opP
->reg
== ZPC
)))
1341 if (opP
->mode
== CONTROL
1342 || opP
->mode
== FPREG
1343 || opP
->mode
== REGLST
)
1348 if (opP
->mode
!= AINC
)
1353 if (opP
->mode
!= ADEC
)
1403 if (opP
->reg
== PC
|| opP
->reg
== ZPC
)
1424 case '~': /* For now! (JF FOO is this right?) */
1446 if (opP
->mode
!= CONTROL
1447 || (opP
->reg
!= TT0
&& opP
->reg
!= TT1
))
1452 if (opP
->mode
!= AREG
)
1457 if (opP
->mode
!= AINDR
)
1462 if (opP
->mode
!= ABSL
1464 && strncmp (instring
, "jbsr", 4) == 0))
1469 if (opP
->mode
!= CONTROL
|| opP
->reg
!= CCR
)
1474 if (opP
->mode
!= DISP
1476 || opP
->reg
> ADDR7
)
1481 if (opP
->mode
!= DREG
)
1486 if (opP
->reg
!= ACC
)
1491 if (opP
->mode
!= FPREG
)
1496 if (opP
->reg
!= MACSR
)
1501 if (opP
->reg
!= MASK
)
1506 if (opP
->mode
!= CONTROL
1513 if (opP
->mode
!= CONTROL
1515 || opP
->reg
> last_movec_reg
)
1519 const enum m68k_register
*rp
;
1520 for (rp
= control_regs
; *rp
; rp
++)
1521 if (*rp
== opP
->reg
)
1529 if (opP
->mode
!= IMMED
)
1535 if (opP
->mode
== DREG
1536 || opP
->mode
== AREG
1537 || opP
->mode
== FPREG
)
1546 opP
->mask
= 1 << (opP
->reg
- DATA0
);
1549 opP
->mask
= 1 << (opP
->reg
- ADDR0
+ 8);
1552 opP
->mask
= 1 << (opP
->reg
- FP0
+ 16);
1560 else if (opP
->mode
== CONTROL
)
1569 opP
->mask
= 1 << 24;
1572 opP
->mask
= 1 << 25;
1575 opP
->mask
= 1 << 26;
1584 else if (opP
->mode
!= REGLST
)
1586 else if (s
[1] == '8' && (opP
->mask
& 0x0ffffff) != 0)
1588 else if (s
[1] == '3' && (opP
->mask
& 0x7000000) != 0)
1593 if (opP
->mode
!= IMMED
)
1595 else if (opP
->disp
.exp
.X_op
!= O_constant
1596 || ! issbyte (opP
->disp
.exp
.X_add_number
))
1598 else if (! m68k_quick
1599 && instring
[3] != 'q'
1600 && instring
[4] != 'q')
1605 if (opP
->mode
!= DREG
1606 && opP
->mode
!= IMMED
1607 && opP
->mode
!= ABSL
)
1612 if (opP
->mode
!= IMMED
)
1614 else if (opP
->disp
.exp
.X_op
!= O_constant
1615 || opP
->disp
.exp
.X_add_number
< 1
1616 || opP
->disp
.exp
.X_add_number
> 8)
1618 else if (! m68k_quick
1619 && (strncmp (instring
, "add", 3) == 0
1620 || strncmp (instring
, "sub", 3) == 0)
1621 && instring
[3] != 'q')
1626 if (opP
->mode
!= DREG
&& opP
->mode
!= AREG
)
1631 if (opP
->mode
!= AINDR
1632 && (opP
->mode
!= BASE
1634 && opP
->reg
!= ZADDR0
)
1635 || opP
->disp
.exp
.X_op
!= O_absent
1636 || ((opP
->index
.reg
< DATA0
1637 || opP
->index
.reg
> DATA7
)
1638 && (opP
->index
.reg
< ADDR0
1639 || opP
->index
.reg
> ADDR7
))
1640 || opP
->index
.size
!= SIZE_UNSPEC
1641 || opP
->index
.scale
!= 1))
1646 if (opP
->mode
!= CONTROL
1647 || ! (opP
->reg
== FPI
1649 || opP
->reg
== FPC
))
1654 if (opP
->mode
!= CONTROL
|| opP
->reg
!= SR
)
1659 if (opP
->mode
!= IMMED
)
1661 else if (opP
->disp
.exp
.X_op
!= O_constant
1662 || opP
->disp
.exp
.X_add_number
< 0
1663 || opP
->disp
.exp
.X_add_number
> 7)
1668 if (opP
->mode
!= CONTROL
|| opP
->reg
!= USP
)
1672 /* JF these are out of order. We could put them
1673 in order if we were willing to put up with
1674 bunches of #ifdef m68851s in the code.
1676 Don't forget that you need these operands
1677 to use 68030 MMU instructions. */
1679 /* Memory addressing mode used by pflushr */
1681 if (opP
->mode
== CONTROL
1682 || opP
->mode
== FPREG
1683 || opP
->mode
== DREG
1684 || opP
->mode
== AREG
1685 || opP
->mode
== REGLST
)
1687 /* We should accept immediate operands, but they
1688 supposedly have to be quad word, and we don't
1689 handle that. I would like to see what a Motorola
1690 assembler does before doing something here. */
1691 if (opP
->mode
== IMMED
)
1696 if (opP
->mode
!= CONTROL
1697 || (opP
->reg
!= SFC
&& opP
->reg
!= DFC
))
1702 if (opP
->mode
!= CONTROL
|| opP
->reg
!= TC
)
1707 if (opP
->mode
!= CONTROL
|| opP
->reg
!= AC
)
1712 if (opP
->mode
!= CONTROL
1715 && opP
->reg
!= SCC
))
1720 if (opP
->mode
!= CONTROL
1726 if (opP
->mode
!= CONTROL
1729 && opP
->reg
!= CRP
))
1734 if (opP
->mode
!= CONTROL
1735 || (!(opP
->reg
>= BAD
&& opP
->reg
<= BAD
+ 7)
1736 && !(opP
->reg
>= BAC
&& opP
->reg
<= BAC
+ 7)))
1741 if (opP
->mode
!= CONTROL
|| opP
->reg
!= PSR
)
1746 if (opP
->mode
!= CONTROL
|| opP
->reg
!= PCSR
)
1751 if (opP
->mode
!= CONTROL
1758 } /* not a cache specifier. */
1762 if (opP
->mode
!= ABSL
)
1767 if (opP
->reg
< DATA0L
|| opP
->reg
> ADDR7U
)
1769 /* FIXME: kludge instead of fixing parser:
1770 upper/lower registers are *not* CONTROL
1771 registers, but ordinary ones. */
1772 if ((opP
->reg
>= DATA0L
&& opP
->reg
<= DATA7L
)
1773 || (opP
->reg
>= DATA0U
&& opP
->reg
<= DATA7U
))
1781 } /* switch on type of operand */
1785 } /* for each operand */
1786 } /* if immediately wrong */
1793 opcode
= opcode
->m_next
;
1798 && !(ok_arch
& current_architecture
))
1803 _("invalid instruction for this architecture; needs "));
1804 cp
= buf
+ strlen (buf
);
1808 strcpy (cp
, _("fpu (68040, 68060 or 68881/68882)"));
1811 strcpy (cp
, _("mmu (68030 or 68851)"));
1814 strcpy (cp
, _("68020 or higher"));
1817 strcpy (cp
, _("68000 or higher"));
1820 strcpy (cp
, _("68010 or higher"));
1824 int got_one
= 0, idx
;
1826 idx
< (int) (sizeof (archs
) / sizeof (archs
[0]));
1829 if ((archs
[idx
].arch
& ok_arch
)
1830 && ! archs
[idx
].alias
)
1834 strcpy (cp
, " or ");
1838 strcpy (cp
, archs
[idx
].name
);
1844 cp
= xmalloc (strlen (buf
) + 1);
1849 the_ins
.error
= _("operands mismatch");
1851 } /* Fell off the end */
1856 /* now assemble it */
1858 the_ins
.args
= opcode
->m_operands
;
1859 the_ins
.numargs
= opcode
->m_opnum
;
1860 the_ins
.numo
= opcode
->m_codenum
;
1861 the_ins
.opcode
[0] = getone (opcode
);
1862 the_ins
.opcode
[1] = gettwo (opcode
);
1864 for (s
= the_ins
.args
, opP
= &the_ins
.operands
[0]; *s
; s
+= 2, opP
++)
1866 /* This switch is a doozy.
1867 Watch the first step; its a big one! */
1895 tmpreg
= 0x3c; /* 7.4 */
1896 if (strchr ("bwl", s
[1]))
1897 nextword
= get_num (&opP
->disp
, 80);
1899 nextword
= get_num (&opP
->disp
, 0);
1900 if (isvar (&opP
->disp
))
1901 add_fix (s
[1], &opP
->disp
, 0, 0);
1905 if (!isbyte (nextword
))
1906 opP
->error
= _("operand out of range");
1911 if (!isword (nextword
))
1912 opP
->error
= _("operand out of range");
1917 if (!issword (nextword
))
1918 opP
->error
= _("operand out of range");
1923 addword (nextword
>> 16);
1950 /* We gotta put out some float */
1951 if (op (&opP
->disp
) != O_big
)
1956 /* Can other cases happen here? */
1957 if (op (&opP
->disp
) != O_constant
)
1960 val
= (valueT
) offs (&opP
->disp
);
1964 generic_bignum
[gencnt
] = (LITTLENUM_TYPE
) val
;
1965 val
>>= LITTLENUM_NUMBER_OF_BITS
;
1969 offs (&opP
->disp
) = gencnt
;
1971 if (offs (&opP
->disp
) > 0)
1973 if (offs (&opP
->disp
) > baseo
)
1975 as_warn (_("Bignum too big for %c format; truncated"),
1977 offs (&opP
->disp
) = baseo
;
1979 baseo
-= offs (&opP
->disp
);
1982 for (wordp
= generic_bignum
+ offs (&opP
->disp
) - 1;
1983 offs (&opP
->disp
)--;
1988 gen_to_words (words
, baseo
, (long) outro
);
1989 for (wordp
= words
; baseo
--; wordp
++)
1993 tmpreg
= opP
->reg
- DATA
; /* 0.dreg */
1996 tmpreg
= 0x08 + opP
->reg
- ADDR
; /* 1.areg */
1999 tmpreg
= 0x10 + opP
->reg
- ADDR
; /* 2.areg */
2002 tmpreg
= 0x20 + opP
->reg
- ADDR
; /* 4.areg */
2005 tmpreg
= 0x18 + opP
->reg
- ADDR
; /* 3.areg */
2009 nextword
= get_num (&opP
->disp
, 80);
2012 && ! isvar (&opP
->disp
)
2015 opP
->disp
.exp
.X_op
= O_symbol
;
2016 #ifndef BFD_ASSEMBLER
2017 opP
->disp
.exp
.X_add_symbol
= &abs_symbol
;
2019 opP
->disp
.exp
.X_add_symbol
=
2020 section_symbol (absolute_section
);
2024 /* Force into index mode. Hope this works */
2026 /* We do the first bit for 32-bit displacements, and the
2027 second bit for 16 bit ones. It is possible that we
2028 should make the default be WORD instead of LONG, but
2029 I think that'd break GCC, so we put up with a little
2030 inefficiency for the sake of working output. */
2032 if (!issword (nextword
)
2033 || (isvar (&opP
->disp
)
2034 && ((opP
->disp
.size
== SIZE_UNSPEC
2035 && flag_short_refs
== 0
2036 && cpu_of_arch (current_architecture
) >= m68020
2037 && ! arch_coldfire_p (current_architecture
))
2038 || opP
->disp
.size
== SIZE_LONG
)))
2040 if (cpu_of_arch (current_architecture
) < m68020
2041 || arch_coldfire_p (current_architecture
))
2043 _("displacement too large for this architecture; needs 68020 or higher");
2045 tmpreg
= 0x3B; /* 7.3 */
2047 tmpreg
= 0x30 + opP
->reg
- ADDR
; /* 6.areg */
2048 if (isvar (&opP
->disp
))
2052 if (opP
->disp
.size
== SIZE_LONG
2054 /* If the displacement needs pic
2055 relocation it cannot be relaxed. */
2056 || opP
->disp
.pic_reloc
!= pic_none
2061 add_fix ('l', &opP
->disp
, 1, 2);
2065 add_frag (adds (&opP
->disp
),
2067 TAB (PCLEA
, SZ_UNDEF
));
2074 add_fix ('l', &opP
->disp
, 0, 0);
2079 addword (nextword
>> 16);
2084 tmpreg
= 0x3A; /* 7.2 */
2086 tmpreg
= 0x28 + opP
->reg
- ADDR
; /* 5.areg */
2088 if (isvar (&opP
->disp
))
2092 add_fix ('w', &opP
->disp
, 1, 0);
2095 add_fix ('w', &opP
->disp
, 0, 0);
2105 baseo
= get_num (&opP
->disp
, 80);
2106 if (opP
->mode
== POST
|| opP
->mode
== PRE
)
2107 outro
= get_num (&opP
->odisp
, 80);
2108 /* Figure out the `addressing mode'.
2109 Also turn on the BASE_DISABLE bit, if needed. */
2110 if (opP
->reg
== PC
|| opP
->reg
== ZPC
)
2112 tmpreg
= 0x3b; /* 7.3 */
2113 if (opP
->reg
== ZPC
)
2116 else if (opP
->reg
== 0)
2119 tmpreg
= 0x30; /* 6.garbage */
2121 else if (opP
->reg
>= ZADDR0
&& opP
->reg
<= ZADDR7
)
2124 tmpreg
= 0x30 + opP
->reg
- ZADDR0
;
2127 tmpreg
= 0x30 + opP
->reg
- ADDR
; /* 6.areg */
2129 siz1
= opP
->disp
.size
;
2130 if (opP
->mode
== POST
|| opP
->mode
== PRE
)
2131 siz2
= opP
->odisp
.size
;
2135 /* Index register stuff */
2136 if (opP
->index
.reg
!= 0
2137 && opP
->index
.reg
>= DATA
2138 && opP
->index
.reg
<= ADDR7
)
2140 nextword
|= (opP
->index
.reg
- DATA
) << 12;
2142 if (opP
->index
.size
== SIZE_LONG
2143 || (opP
->index
.size
== SIZE_UNSPEC
2144 && m68k_index_width_default
== SIZE_LONG
))
2147 if ((opP
->index
.scale
!= 1
2148 && cpu_of_arch (current_architecture
) < m68020
)
2149 || (opP
->index
.scale
== 8
2150 && arch_coldfire_p (current_architecture
)))
2153 _("scale factor invalid on this architecture; needs cpu32 or 68020 or higher");
2156 if (arch_coldfire_p (current_architecture
)
2157 && opP
->index
.size
== SIZE_WORD
)
2158 opP
->error
= _("invalid index size for coldfire");
2160 switch (opP
->index
.scale
)
2177 GET US OUT OF HERE! */
2179 /* Must be INDEX, with an index register. Address
2180 register cannot be ZERO-PC, and either :b was
2181 forced, or we know it will fit. For a 68000 or
2182 68010, force this mode anyways, because the
2183 larger modes aren't supported. */
2184 if (opP
->mode
== BASE
2185 && ((opP
->reg
>= ADDR0
2186 && opP
->reg
<= ADDR7
)
2189 if (siz1
== SIZE_BYTE
2190 || cpu_of_arch (current_architecture
) < m68020
2191 || arch_coldfire_p (current_architecture
)
2192 || (siz1
== SIZE_UNSPEC
2193 && ! isvar (&opP
->disp
)
2194 && issbyte (baseo
)))
2196 nextword
+= baseo
& 0xff;
2198 if (isvar (&opP
->disp
))
2200 /* Do a byte relocation. If it doesn't
2201 fit (possible on m68000) let the
2202 fixup processing complain later. */
2204 add_fix ('B', &opP
->disp
, 1, 1);
2206 add_fix ('B', &opP
->disp
, 0, 0);
2208 else if (siz1
!= SIZE_BYTE
)
2210 if (siz1
!= SIZE_UNSPEC
)
2211 as_warn (_("Forcing byte displacement"));
2212 if (! issbyte (baseo
))
2213 opP
->error
= _("byte displacement out of range");
2218 else if (siz1
== SIZE_UNSPEC
2220 && isvar (&opP
->disp
)
2221 && subs (&opP
->disp
) == NULL
2223 /* If the displacement needs pic
2224 relocation it cannot be relaxed. */
2225 && opP
->disp
.pic_reloc
== pic_none
2229 /* The code in md_convert_frag_1 needs to be
2230 able to adjust nextword. Call frag_grow
2231 to ensure that we have enough space in
2232 the frag obstack to make all the bytes
2235 nextword
+= baseo
& 0xff;
2237 add_frag (adds (&opP
->disp
), offs (&opP
->disp
),
2238 TAB (PCINDEX
, SZ_UNDEF
));
2246 nextword
|= 0x40; /* No index reg */
2247 if (opP
->index
.reg
>= ZDATA0
2248 && opP
->index
.reg
<= ZDATA7
)
2249 nextword
|= (opP
->index
.reg
- ZDATA0
) << 12;
2250 else if (opP
->index
.reg
>= ZADDR0
2251 || opP
->index
.reg
<= ZADDR7
)
2252 nextword
|= (opP
->index
.reg
- ZADDR0
+ 8) << 12;
2255 /* It isn't simple. */
2257 if (cpu_of_arch (current_architecture
) < m68020
2258 || arch_coldfire_p (current_architecture
))
2260 _("invalid operand mode for this architecture; needs 68020 or higher");
2263 /* If the guy specified a width, we assume that it is
2264 wide enough. Maybe it isn't. If so, we lose. */
2268 if (isvar (&opP
->disp
)
2270 : ! issword (baseo
))
2275 else if (! isvar (&opP
->disp
) && baseo
== 0)
2284 as_warn (_(":b not permitted; defaulting to :w"));
2294 /* Figure out innner displacement stuff */
2295 if (opP
->mode
== POST
|| opP
->mode
== PRE
)
2297 if (cpu_of_arch (current_architecture
) & cpu32
)
2298 opP
->error
= _("invalid operand mode for this architecture; needs 68020 or higher");
2302 if (isvar (&opP
->odisp
)
2304 : ! issword (outro
))
2309 else if (! isvar (&opP
->odisp
) && outro
== 0)
2318 as_warn (_(":b not permitted; defaulting to :w"));
2327 if (opP
->mode
== POST
2328 && (nextword
& 0x40) == 0)
2333 if (siz1
!= SIZE_UNSPEC
&& isvar (&opP
->disp
))
2335 if (opP
->reg
== PC
|| opP
->reg
== ZPC
)
2336 add_fix (siz1
== SIZE_LONG
? 'l' : 'w', &opP
->disp
, 1, 2);
2338 add_fix (siz1
== SIZE_LONG
? 'l' : 'w', &opP
->disp
, 0, 0);
2340 if (siz1
== SIZE_LONG
)
2341 addword (baseo
>> 16);
2342 if (siz1
!= SIZE_UNSPEC
)
2345 if (siz2
!= SIZE_UNSPEC
&& isvar (&opP
->odisp
))
2346 add_fix (siz2
== SIZE_LONG
? 'l' : 'w', &opP
->odisp
, 0, 0);
2347 if (siz2
== SIZE_LONG
)
2348 addword (outro
>> 16);
2349 if (siz2
!= SIZE_UNSPEC
)
2355 nextword
= get_num (&opP
->disp
, 80);
2356 switch (opP
->disp
.size
)
2361 if (!isvar (&opP
->disp
) && issword (offs (&opP
->disp
)))
2363 tmpreg
= 0x38; /* 7.0 */
2367 if (isvar (&opP
->disp
)
2368 && !subs (&opP
->disp
)
2369 && adds (&opP
->disp
)
2371 /* If the displacement needs pic relocation it
2372 cannot be relaxed. */
2373 && opP
->disp
.pic_reloc
== pic_none
2375 && S_GET_SEGMENT (adds (&opP
->disp
)) == now_seg
2376 && relaxable_symbol (adds (&opP
->disp
))
2378 && !strchr ("~%&$?", s
[0]))
2380 tmpreg
= 0x3A; /* 7.2 */
2381 add_frag (adds (&opP
->disp
),
2383 TAB (PCREL
, SZ_UNDEF
));
2386 /* Fall through into long */
2388 if (isvar (&opP
->disp
))
2389 add_fix ('l', &opP
->disp
, 0, 0);
2391 tmpreg
= 0x39;/* 7.1 mode */
2392 addword (nextword
>> 16);
2397 as_bad (_("unsupported byte value; use a different suffix"));
2399 case SIZE_WORD
: /* Word */
2400 if (isvar (&opP
->disp
))
2401 add_fix ('w', &opP
->disp
, 0, 0);
2403 tmpreg
= 0x38;/* 7.0 mode */
2411 as_bad (_("unknown/incorrect operand"));
2414 install_gen_operand (s
[1], tmpreg
);
2420 { /* JF: I hate floating point! */
2435 tmpreg
= get_num (&opP
->disp
, tmpreg
);
2436 if (isvar (&opP
->disp
))
2437 add_fix (s
[1], &opP
->disp
, 0, 0);
2440 case 'b': /* Danger: These do no check for
2441 certain types of overflow.
2443 if (!isbyte (tmpreg
))
2444 opP
->error
= _("out of range");
2445 insop (tmpreg
, opcode
);
2446 if (isvar (&opP
->disp
))
2447 the_ins
.reloc
[the_ins
.nrel
- 1].n
=
2448 (opcode
->m_codenum
) * 2 + 1;
2451 if (!issbyte (tmpreg
))
2452 opP
->error
= _("out of range");
2453 the_ins
.opcode
[the_ins
.numo
- 1] |= tmpreg
& 0xff;
2454 if (isvar (&opP
->disp
))
2455 the_ins
.reloc
[the_ins
.nrel
- 1].n
= opcode
->m_codenum
* 2 - 1;
2458 if (!isword (tmpreg
))
2459 opP
->error
= _("out of range");
2460 insop (tmpreg
, opcode
);
2461 if (isvar (&opP
->disp
))
2462 the_ins
.reloc
[the_ins
.nrel
- 1].n
= (opcode
->m_codenum
) * 2;
2465 if (!issword (tmpreg
))
2466 opP
->error
= _("out of range");
2467 insop (tmpreg
, opcode
);
2468 if (isvar (&opP
->disp
))
2469 the_ins
.reloc
[the_ins
.nrel
- 1].n
= (opcode
->m_codenum
) * 2;
2472 /* Because of the way insop works, we put these two out
2474 insop (tmpreg
, opcode
);
2475 insop (tmpreg
>> 16, opcode
);
2476 if (isvar (&opP
->disp
))
2477 the_ins
.reloc
[the_ins
.nrel
- 1].n
= (opcode
->m_codenum
) * 2;
2484 install_operand (s
[1], tmpreg
);
2495 install_operand (s
[1], opP
->reg
- ADDR
);
2499 tmpreg
= get_num (&opP
->disp
, 80);
2503 /* The pc_fix argument winds up in fx_pcrel_adjust,
2504 which is a char, and may therefore be unsigned. We
2505 want to pass -1, but we pass 64 instead, and convert
2506 back in md_pcrel_from. */
2507 add_fix ('B', &opP
->disp
, 1, 64);
2510 add_fix ('w', &opP
->disp
, 1, 0);
2515 if (!HAVE_LONG_BRANCH(current_architecture
))
2516 as_warn (_("Can't use long branches on 68000/68010/5200"));
2517 the_ins
.opcode
[the_ins
.numo
- 1] |= 0xff;
2518 add_fix ('l', &opP
->disp
, 1, 0);
2523 if (subs (&opP
->disp
)) /* We can't relax it */
2527 /* If the displacement needs pic relocation it cannot be
2529 if (opP
->disp
.pic_reloc
!= pic_none
)
2533 /* This could either be a symbol, or an absolute
2534 address. No matter, the frag hacking will finger it
2535 out. Not quite: it can't switch from BRANCH to
2536 BCC68000 for the case where opnd is absolute (it
2537 needs to use the 68000 hack since no conditional abs
2539 if (( !HAVE_LONG_BRANCH(current_architecture
)
2540 || (0 == adds (&opP
->disp
)))
2541 && (the_ins
.opcode
[0] >= 0x6200)
2542 && (the_ins
.opcode
[0] <= 0x6f00))
2543 add_frag (adds (&opP
->disp
), offs (&opP
->disp
),
2544 TAB (BCC68000
, SZ_UNDEF
));
2546 add_frag (adds (&opP
->disp
), offs (&opP
->disp
),
2547 TAB (ABRANCH
, SZ_UNDEF
));
2550 if (isvar (&opP
->disp
))
2553 /* check for DBcc instruction */
2554 if ((the_ins
.opcode
[0] & 0xf0f8) == 0x50c8)
2556 /* size varies if patch */
2557 /* needed for long form */
2558 add_frag (adds (&opP
->disp
), offs (&opP
->disp
),
2559 TAB (DBCC
, SZ_UNDEF
));
2563 add_fix ('w', &opP
->disp
, 1, 0);
2567 case 'C': /* Fixed size LONG coproc branches */
2568 add_fix ('l', &opP
->disp
, 1, 0);
2572 case 'c': /* Var size Coprocesssor branches */
2573 if (subs (&opP
->disp
))
2575 add_fix ('l', &opP
->disp
, 1, 0);
2576 add_frag ((symbolS
*) 0, (offsetT
) 0, TAB (FBRANCH
, LONG
));
2578 else if (adds (&opP
->disp
))
2579 add_frag (adds (&opP
->disp
), offs (&opP
->disp
),
2580 TAB (FBRANCH
, SZ_UNDEF
));
2583 /* add_frag ((symbolS *) 0, offs (&opP->disp),
2584 TAB(FBRANCH,SHORT)); */
2585 the_ins
.opcode
[the_ins
.numo
- 1] |= 0x40;
2586 add_fix ('l', &opP
->disp
, 1, 0);
2596 case 'C': /* Ignore it */
2599 case 'd': /* JF this is a kludge */
2600 install_operand ('s', opP
->reg
- ADDR
);
2601 tmpreg
= get_num (&opP
->disp
, 80);
2602 if (!issword (tmpreg
))
2604 as_warn (_("Expression out of range, using 0"));
2611 install_operand (s
[1], opP
->reg
- DATA
);
2614 case 'E': /* Ignore it */
2618 install_operand (s
[1], opP
->reg
- FP0
);
2621 case 'G': /* Ignore it */
2626 tmpreg
= opP
->reg
- COP0
;
2627 install_operand (s
[1], tmpreg
);
2630 case 'J': /* JF foo */
2703 install_operand (s
[1], tmpreg
);
2707 tmpreg
= get_num (&opP
->disp
, 55);
2708 install_operand (s
[1], tmpreg
& 0x7f);
2715 if (tmpreg
& 0x7FF0000)
2716 as_bad (_("Floating point register in register list"));
2717 insop (reverse_16_bits (tmpreg
), opcode
);
2721 if (tmpreg
& 0x700FFFF)
2722 as_bad (_("Wrong register in floating-point reglist"));
2723 install_operand (s
[1], reverse_8_bits (tmpreg
>> 16));
2731 if (tmpreg
& 0x7FF0000)
2732 as_bad (_("Floating point register in register list"));
2733 insop (tmpreg
, opcode
);
2735 else if (s
[1] == '8')
2737 if (tmpreg
& 0x0FFFFFF)
2738 as_bad (_("incorrect register in reglist"));
2739 install_operand (s
[1], tmpreg
>> 24);
2743 if (tmpreg
& 0x700FFFF)
2744 as_bad (_("wrong register in floating-point reglist"));
2746 install_operand (s
[1], tmpreg
>> 16);
2751 install_operand (s
[1], get_num (&opP
->disp
, 60));
2755 tmpreg
= ((opP
->mode
== DREG
)
2756 ? 0x20 + (int) (opP
->reg
- DATA
)
2757 : (get_num (&opP
->disp
, 40) & 0x1F));
2758 install_operand (s
[1], tmpreg
);
2762 tmpreg
= get_num (&opP
->disp
, 10);
2765 install_operand (s
[1], tmpreg
);
2769 /* This depends on the fact that ADDR registers are eight
2770 more than their corresponding DATA regs, so the result
2771 will have the ADDR_REG bit set */
2772 install_operand (s
[1], opP
->reg
- DATA
);
2776 if (opP
->mode
== AINDR
)
2777 install_operand (s
[1], opP
->reg
- DATA
);
2779 install_operand (s
[1], opP
->index
.reg
- DATA
);
2783 if (opP
->reg
== FPI
)
2785 else if (opP
->reg
== FPS
)
2787 else if (opP
->reg
== FPC
)
2791 install_operand (s
[1], tmpreg
);
2794 case 'S': /* Ignore it */
2798 install_operand (s
[1], get_num (&opP
->disp
, 30));
2801 case 'U': /* Ignore it */
2820 as_fatal (_("failed sanity check"));
2821 } /* switch on cache token */
2822 install_operand (s
[1], tmpreg
);
2825 /* JF: These are out of order, I fear. */
2838 install_operand (s
[1], tmpreg
);
2864 install_operand (s
[1], tmpreg
);
2868 if (opP
->reg
== VAL
)
2887 install_operand (s
[1], tmpreg
);
2901 tmpreg
= (4 << 10) | ((opP
->reg
- BAD
) << 2);
2912 tmpreg
= (5 << 10) | ((opP
->reg
- BAC
) << 2);
2918 install_operand (s
[1], tmpreg
);
2921 know (opP
->reg
== PSR
);
2924 know (opP
->reg
== PCSR
);
2939 install_operand (s
[1], tmpreg
);
2942 tmpreg
= get_num (&opP
->disp
, 20);
2943 install_operand (s
[1], tmpreg
);
2945 case '_': /* used only for move16 absolute 32-bit address */
2946 if (isvar (&opP
->disp
))
2947 add_fix ('l', &opP
->disp
, 0, 0);
2948 tmpreg
= get_num (&opP
->disp
, 80);
2949 addword (tmpreg
>> 16);
2950 addword (tmpreg
& 0xFFFF);
2953 install_operand (s
[1], opP
->reg
- DATA0L
);
2954 opP
->reg
-= (DATA0L
);
2955 opP
->reg
&= 0x0F; /* remove upper/lower bit */
2962 /* By the time whe get here (FINALLY) the_ins contains the complete
2963 instruction, ready to be emitted. . . */
2967 reverse_16_bits (in
)
2973 static int mask
[16] =
2975 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
2976 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000
2978 for (n
= 0; n
< 16; n
++)
2981 out
|= mask
[15 - n
];
2984 } /* reverse_16_bits() */
2993 static int mask
[8] =
2995 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
2998 for (n
= 0; n
< 8; n
++)
3004 } /* reverse_8_bits() */
3006 /* Cause an extra frag to be generated here, inserting up to 10 bytes
3007 (that value is chosen in the frag_var call in md_assemble). TYPE
3008 is the subtype of the frag to be generated; its primary type is
3009 rs_machine_dependent.
3011 The TYPE parameter is also used by md_convert_frag_1 and
3012 md_estimate_size_before_relax. The appropriate type of fixup will
3013 be emitted by md_convert_frag_1.
3015 ADD becomes the FR_SYMBOL field of the frag, and OFF the FR_OFFSET. */
3017 install_operand (mode
, val
)
3024 the_ins
.opcode
[0] |= val
& 0xFF; /* JF FF is for M kludge */
3027 the_ins
.opcode
[0] |= val
<< 9;
3030 the_ins
.opcode
[1] |= val
<< 12;
3033 the_ins
.opcode
[1] |= val
<< 6;
3036 the_ins
.opcode
[1] |= val
;
3039 the_ins
.opcode
[2] |= val
<< 12;
3042 the_ins
.opcode
[2] |= val
<< 6;
3045 /* DANGER! This is a hack to force cas2l and cas2w cmds to be
3046 three words long! */
3048 the_ins
.opcode
[2] |= val
;
3051 the_ins
.opcode
[1] |= val
<< 7;
3054 the_ins
.opcode
[1] |= val
<< 10;
3058 the_ins
.opcode
[1] |= val
<< 5;
3063 the_ins
.opcode
[1] |= (val
<< 10) | (val
<< 7);
3066 the_ins
.opcode
[1] |= (val
<< 12) | val
;
3069 the_ins
.opcode
[0] |= val
= 0xff;
3072 the_ins
.opcode
[0] |= val
<< 9;
3075 the_ins
.opcode
[1] |= val
;
3078 the_ins
.opcode
[1] |= val
;
3079 the_ins
.numo
++; /* What a hack */
3082 the_ins
.opcode
[1] |= val
<< 4;
3090 the_ins
.opcode
[0] |= (val
<< 6);
3093 the_ins
.opcode
[1] = (val
>> 16);
3094 the_ins
.opcode
[2] = val
& 0xffff;
3097 the_ins
.opcode
[0] |= ((val
& 0x8) << (6 - 3));
3098 the_ins
.opcode
[0] |= ((val
& 0x7) << 9);
3099 the_ins
.opcode
[1] |= ((val
& 0x10) << (7 - 4));
3102 the_ins
.opcode
[0] |= ((val
& 0x8) << (6 - 3));
3103 the_ins
.opcode
[0] |= ((val
& 0x7) << 9);
3106 the_ins
.opcode
[1] |= val
<< 12;
3107 the_ins
.opcode
[1] |= ((val
& 0x10) << (7 - 4));
3110 the_ins
.opcode
[0] |= (val
& 0xF);
3111 the_ins
.opcode
[1] |= ((val
& 0x10) << (6 - 4));
3114 the_ins
.opcode
[1] |= (val
& 0xF);
3115 the_ins
.opcode
[1] |= ((val
& 0x10) << (6 - 4));
3118 the_ins
.opcode
[1] |= ((val
!= 1) << 10);
3122 as_fatal (_("failed sanity check."));
3124 } /* install_operand() */
3127 install_gen_operand (mode
, val
)
3134 the_ins
.opcode
[0] |= val
;
3137 /* This is a kludge!!! */
3138 the_ins
.opcode
[0] |= (val
& 0x07) << 9 | (val
& 0x38) << 3;
3147 the_ins
.opcode
[0] |= val
;
3149 /* more stuff goes here */
3151 as_fatal (_("failed sanity check."));
3153 } /* install_gen_operand() */
3156 * verify that we have some number of paren pairs, do m68k_ip_op(), and
3157 * then deal with the bitfield hack.
3161 crack_operand (str
, opP
)
3163 register struct m68k_op
*opP
;
3165 register int parens
;
3167 register char *beg_str
;
3175 for (parens
= 0; *str
&& (parens
> 0 || inquote
|| notend (str
)); str
++)
3181 else if (*str
== ')')
3185 opP
->error
= _("Extra )");
3191 if (flag_mri
&& *str
== '\'')
3192 inquote
= ! inquote
;
3194 if (!*str
&& parens
)
3196 opP
->error
= _("Missing )");
3201 if (m68k_ip_op (beg_str
, opP
) != 0)
3208 c
= *++str
; /* JF bitfield hack */
3213 as_bad (_("Missing operand"));
3216 /* Detect MRI REG symbols and convert them to REGLSTs. */
3217 if (opP
->mode
== CONTROL
&& (int)opP
->reg
< 0)
3220 opP
->mask
= ~(int)opP
->reg
;
3227 /* This is the guts of the machine-dependent assembler. STR points to a
3228 machine dependent instruction. This function is supposed to emit
3229 the frags/bytes it assembles to.
3233 insert_reg (regname
, regnum
)
3234 const char *regname
;
3240 #ifdef REGISTER_PREFIX
3241 if (!flag_reg_prefix_optional
)
3243 buf
[0] = REGISTER_PREFIX
;
3244 strcpy (buf
+ 1, regname
);
3249 symbol_table_insert (symbol_new (regname
, reg_section
, regnum
,
3250 &zero_address_frag
));
3252 for (i
= 0; regname
[i
]; i
++)
3253 buf
[i
] = islower (regname
[i
]) ? toupper (regname
[i
]) : regname
[i
];
3256 symbol_table_insert (symbol_new (buf
, reg_section
, regnum
,
3257 &zero_address_frag
));
3266 static const struct init_entry init_table
[] =
3325 /* control registers */
3326 { "sfc", SFC
}, /* Source Function Code */
3328 { "dfc", DFC
}, /* Destination Function Code */
3330 { "cacr", CACR
}, /* Cache Control Register */
3331 { "caar", CAAR
}, /* Cache Address Register */
3333 { "usp", USP
}, /* User Stack Pointer */
3334 { "vbr", VBR
}, /* Vector Base Register */
3335 { "msp", MSP
}, /* Master Stack Pointer */
3336 { "isp", ISP
}, /* Interrupt Stack Pointer */
3338 { "itt0", ITT0
}, /* Instruction Transparent Translation Reg 0 */
3339 { "itt1", ITT1
}, /* Instruction Transparent Translation Reg 1 */
3340 { "dtt0", DTT0
}, /* Data Transparent Translation Register 0 */
3341 { "dtt1", DTT1
}, /* Data Transparent Translation Register 1 */
3343 /* 68ec040 versions of same */
3344 { "iacr0", ITT0
}, /* Instruction Access Control Register 0 */
3345 { "iacr1", ITT1
}, /* Instruction Access Control Register 0 */
3346 { "dacr0", DTT0
}, /* Data Access Control Register 0 */
3347 { "dacr1", DTT1
}, /* Data Access Control Register 0 */
3349 /* mcf5200 versions of same. The ColdFire programmer's reference
3350 manual indicated that the order is 2,3,0,1, but Ken Rose
3351 <rose@netcom.com> says that 0,1,2,3 is the correct order. */
3352 { "acr0", ITT0
}, /* Access Control Unit 0 */
3353 { "acr1", ITT1
}, /* Access Control Unit 1 */
3354 { "acr2", DTT0
}, /* Access Control Unit 2 */
3355 { "acr3", DTT1
}, /* Access Control Unit 3 */
3357 { "tc", TC
}, /* MMU Translation Control Register */
3360 { "mmusr", MMUSR
}, /* MMU Status Register */
3361 { "srp", SRP
}, /* User Root Pointer */
3362 { "urp", URP
}, /* Supervisor Root Pointer */
3367 { "rombar", ROMBAR
}, /* ROM Base Address Register */
3368 { "rambar0", RAMBAR0
}, /* ROM Base Address Register */
3369 { "rambar1", RAMBAR1
}, /* ROM Base Address Register */
3370 { "mbar", MBAR
}, /* Module Base Address Register */
3371 /* end of control registers */
3405 /* 68ec030 versions of same */
3408 /* 68ec030 access control unit, identical to 030 MMU status reg */
3411 /* Suppressed data and address registers. */
3429 /* Upper and lower data and address registers, used by macw and msacw. */
3473 for (i
= 0; init_table
[i
].name
; i
++)
3474 insert_reg (init_table
[i
].name
, init_table
[i
].number
);
3477 static int no_68851
, no_68881
;
3480 /* a.out machine type. Default to 68020. */
3481 int m68k_aout_machtype
= 2;
3493 int shorts_this_frag
;
3496 /* In MRI mode, the instruction and operands are separated by a
3497 space. Anything following the operands is a comment. The label
3498 has already been removed. */
3506 for (s
= str
; *s
!= '\0'; s
++)
3508 if ((*s
== ' ' || *s
== '\t') && ! inquote
)
3526 inquote
= ! inquote
;
3531 memset ((char *) (&the_ins
), '\0', sizeof (the_ins
));
3536 for (n
= 0; n
< the_ins
.numargs
; n
++)
3537 if (the_ins
.operands
[n
].error
)
3539 er
= the_ins
.operands
[n
].error
;
3545 as_bad (_("%s -- statement `%s' ignored"), er
, str
);
3549 /* If there is a current label, record that it marks an instruction. */
3550 if (current_label
!= NULL
)
3552 current_label
->text
= 1;
3553 current_label
= NULL
;
3556 if (the_ins
.nfrag
== 0)
3558 /* No frag hacking involved; just put it out */
3559 toP
= frag_more (2 * the_ins
.numo
);
3560 fromP
= &the_ins
.opcode
[0];
3561 for (m
= the_ins
.numo
; m
; --m
)
3563 md_number_to_chars (toP
, (long) (*fromP
), 2);
3567 /* put out symbol-dependent info */
3568 for (m
= 0; m
< the_ins
.nrel
; m
++)
3570 switch (the_ins
.reloc
[m
].wid
)
3589 as_fatal (_("Don't know how to figure width of %c in md_assemble()"),
3590 the_ins
.reloc
[m
].wid
);
3593 fixP
= fix_new_exp (frag_now
,
3594 ((toP
- frag_now
->fr_literal
)
3595 - the_ins
.numo
* 2 + the_ins
.reloc
[m
].n
),
3597 &the_ins
.reloc
[m
].exp
,
3598 the_ins
.reloc
[m
].pcrel
,
3599 get_reloc_code (n
, the_ins
.reloc
[m
].pcrel
,
3600 the_ins
.reloc
[m
].pic_reloc
));
3601 fixP
->fx_pcrel_adjust
= the_ins
.reloc
[m
].pcrel_fix
;
3602 if (the_ins
.reloc
[m
].wid
== 'B')
3603 fixP
->fx_signed
= 1;
3608 /* There's some frag hacking */
3609 for (n
= 0, fromP
= &the_ins
.opcode
[0]; n
< the_ins
.nfrag
; n
++)
3614 wid
= 2 * the_ins
.fragb
[n
].fragoff
;
3616 wid
= 2 * (the_ins
.numo
- the_ins
.fragb
[n
- 1].fragoff
);
3617 toP
= frag_more (wid
);
3619 shorts_this_frag
= 0;
3620 for (m
= wid
/ 2; m
; --m
)
3622 md_number_to_chars (toP
, (long) (*fromP
), 2);
3627 for (m
= 0; m
< the_ins
.nrel
; m
++)
3629 if ((the_ins
.reloc
[m
].n
) >= 2 * shorts_this_frag
)
3631 the_ins
.reloc
[m
].n
-= 2 * shorts_this_frag
;
3634 wid
= the_ins
.reloc
[m
].wid
;
3637 the_ins
.reloc
[m
].wid
= 0;
3638 wid
= (wid
== 'b') ? 1 : (wid
== 'w') ? 2 : (wid
== 'l') ? 4 : 4000;
3640 fixP
= fix_new_exp (frag_now
,
3641 ((toP
- frag_now
->fr_literal
)
3642 - the_ins
.numo
* 2 + the_ins
.reloc
[m
].n
),
3644 &the_ins
.reloc
[m
].exp
,
3645 the_ins
.reloc
[m
].pcrel
,
3646 get_reloc_code (wid
, the_ins
.reloc
[m
].pcrel
,
3647 the_ins
.reloc
[m
].pic_reloc
));
3648 fixP
->fx_pcrel_adjust
= the_ins
.reloc
[m
].pcrel_fix
;
3650 (void) frag_var (rs_machine_dependent
, 10, 0,
3651 (relax_substateT
) (the_ins
.fragb
[n
].fragty
),
3652 the_ins
.fragb
[n
].fadd
, the_ins
.fragb
[n
].foff
, to_beg_P
);
3654 n
= (the_ins
.numo
- the_ins
.fragb
[n
- 1].fragoff
);
3655 shorts_this_frag
= 0;
3658 toP
= frag_more (n
* sizeof (short));
3661 md_number_to_chars (toP
, (long) (*fromP
), 2);
3667 for (m
= 0; m
< the_ins
.nrel
; m
++)
3671 wid
= the_ins
.reloc
[m
].wid
;
3674 the_ins
.reloc
[m
].wid
= 0;
3675 wid
= (wid
== 'b') ? 1 : (wid
== 'w') ? 2 : (wid
== 'l') ? 4 : 4000;
3677 fixP
= fix_new_exp (frag_now
,
3678 ((the_ins
.reloc
[m
].n
+ toP
- frag_now
->fr_literal
)
3679 - shorts_this_frag
* 2),
3681 &the_ins
.reloc
[m
].exp
,
3682 the_ins
.reloc
[m
].pcrel
,
3683 get_reloc_code (wid
, the_ins
.reloc
[m
].pcrel
,
3684 the_ins
.reloc
[m
].pic_reloc
));
3685 fixP
->fx_pcrel_adjust
= the_ins
.reloc
[m
].pcrel_fix
;
3693 * md_begin -- set up hash tables with 68000 instructions.
3694 * similar to what the vax assembler does. ---phr
3696 /* RMS claims the thing to do is take the m68k-opcode.h table, and make
3697 a copy of it at runtime, adding in the information we want but isn't
3698 there. I think it'd be better to have an awk script hack the table
3699 at compile time. Or even just xstr the table and use it as-is. But
3700 my lord ghod hath spoken, so we do it this way. Excuse the ugly var
3703 register const struct m68k_opcode
*ins
;
3704 register struct m68k_incant
*hack
, *slak
;
3705 register const char *retval
= 0; /* empty string, or error msg text */
3711 flag_reg_prefix_optional
= 1;
3713 if (! m68k_rel32_from_cmdline
)
3717 op_hash
= hash_new ();
3719 obstack_begin (&robyn
, 4000);
3720 for (i
= 0; i
< m68k_numopcodes
; i
++)
3722 hack
= slak
= (struct m68k_incant
*) obstack_alloc (&robyn
, sizeof (struct m68k_incant
));
3725 ins
= &m68k_opcodes
[i
];
3726 /* We *could* ignore insns that don't match our arch here
3727 but just leaving them out of the hash. */
3728 slak
->m_operands
= ins
->args
;
3729 slak
->m_opnum
= strlen (slak
->m_operands
) / 2;
3730 slak
->m_arch
= ins
->arch
;
3731 slak
->m_opcode
= ins
->opcode
;
3732 /* This is kludgey */
3733 slak
->m_codenum
= ((ins
->match
) & 0xffffL
) ? 2 : 1;
3734 if (i
+ 1 != m68k_numopcodes
3735 && !strcmp (ins
->name
, m68k_opcodes
[i
+ 1].name
))
3737 slak
->m_next
= (struct m68k_incant
*) obstack_alloc (&robyn
, sizeof (struct m68k_incant
));
3742 slak
= slak
->m_next
;
3746 retval
= hash_insert (op_hash
, ins
->name
, (char *) hack
);
3748 as_fatal (_("Internal Error: Can't hash %s: %s"), ins
->name
, retval
);
3751 for (i
= 0; i
< m68k_numaliases
; i
++)
3753 const char *name
= m68k_opcode_aliases
[i
].primary
;
3754 const char *alias
= m68k_opcode_aliases
[i
].alias
;
3755 PTR val
= hash_find (op_hash
, name
);
3757 as_fatal (_("Internal Error: Can't find %s in hash table"), name
);
3758 retval
= hash_insert (op_hash
, alias
, val
);
3760 as_fatal (_("Internal Error: Can't hash %s: %s"), alias
, retval
);
3763 /* In MRI mode, all unsized branches are variable sized. Normally,
3764 they are word sized. */
3767 static struct m68k_opcode_alias mri_aliases
[] =
3788 i
< (int) (sizeof mri_aliases
/ sizeof mri_aliases
[0]);
3791 const char *name
= mri_aliases
[i
].primary
;
3792 const char *alias
= mri_aliases
[i
].alias
;
3793 PTR val
= hash_find (op_hash
, name
);
3795 as_fatal (_("Internal Error: Can't find %s in hash table"), name
);
3796 retval
= hash_jam (op_hash
, alias
, val
);
3798 as_fatal (_("Internal Error: Can't hash %s: %s"), alias
, retval
);
3802 for (i
= 0; i
< (int) sizeof (mklower_table
); i
++)
3803 mklower_table
[i
] = (isupper (c
= (char) i
)) ? tolower (c
) : c
;
3805 for (i
= 0; i
< (int) sizeof (notend_table
); i
++)
3807 notend_table
[i
] = 0;
3808 alt_notend_table
[i
] = 0;
3810 notend_table
[','] = 1;
3811 notend_table
['{'] = 1;
3812 notend_table
['}'] = 1;
3813 alt_notend_table
['a'] = 1;
3814 alt_notend_table
['A'] = 1;
3815 alt_notend_table
['d'] = 1;
3816 alt_notend_table
['D'] = 1;
3817 alt_notend_table
['#'] = 1;
3818 alt_notend_table
['&'] = 1;
3819 alt_notend_table
['f'] = 1;
3820 alt_notend_table
['F'] = 1;
3821 #ifdef REGISTER_PREFIX
3822 alt_notend_table
[REGISTER_PREFIX
] = 1;
3825 /* We need to put '(' in alt_notend_table to handle
3826 cas2 %d0:%d2,%d3:%d4,(%a0):(%a1)
3828 alt_notend_table
['('] = 1;
3830 /* We need to put '@' in alt_notend_table to handle
3831 cas2 %d0:%d2,%d3:%d4,@(%d0):@(%d1)
3833 alt_notend_table
['@'] = 1;
3835 /* We need to put digits in alt_notend_table to handle
3836 bfextu %d0{24:1},%d0
3838 alt_notend_table
['0'] = 1;
3839 alt_notend_table
['1'] = 1;
3840 alt_notend_table
['2'] = 1;
3841 alt_notend_table
['3'] = 1;
3842 alt_notend_table
['4'] = 1;
3843 alt_notend_table
['5'] = 1;
3844 alt_notend_table
['6'] = 1;
3845 alt_notend_table
['7'] = 1;
3846 alt_notend_table
['8'] = 1;
3847 alt_notend_table
['9'] = 1;
3849 #ifndef MIT_SYNTAX_ONLY
3850 /* Insert pseudo ops, these have to go into the opcode table since
3851 gas expects pseudo ops to start with a dot */
3854 while (mote_pseudo_table
[n
].poc_name
)
3856 hack
= (struct m68k_incant
*)
3857 obstack_alloc (&robyn
, sizeof (struct m68k_incant
));
3858 hash_insert (op_hash
,
3859 mote_pseudo_table
[n
].poc_name
, (char *) hack
);
3860 hack
->m_operands
= 0;
3870 record_alignment (text_section
, 2);
3871 record_alignment (data_section
, 2);
3872 record_alignment (bss_section
, 2);
3877 select_control_regs ()
3879 /* Note which set of "movec" control registers is available. */
3880 switch (cpu_of_arch (current_architecture
))
3883 control_regs
= m68000_control_regs
;
3886 control_regs
= m68010_control_regs
;
3890 control_regs
= m68020_control_regs
;
3893 control_regs
= m68040_control_regs
;
3896 control_regs
= m68060_control_regs
;
3899 control_regs
= cpu32_control_regs
;
3904 control_regs
= mcf_control_regs
;
3912 m68k_init_after_args ()
3914 if (cpu_of_arch (current_architecture
) == 0)
3917 const char *default_cpu
= TARGET_CPU
;
3919 if (*default_cpu
== 'm')
3921 for (i
= 0; i
< n_archs
; i
++)
3922 if (strcasecmp (default_cpu
, archs
[i
].name
) == 0)
3926 as_bad (_("unrecognized default cpu `%s' ???"), TARGET_CPU
);
3927 current_architecture
|= m68020
;
3930 current_architecture
|= archs
[i
].arch
;
3932 /* Permit m68881 specification with all cpus; those that can't work
3933 with a coprocessor could be doing emulation. */
3934 if (current_architecture
& m68851
)
3936 if (current_architecture
& m68040
)
3938 as_warn (_("68040 and 68851 specified; mmu instructions may assemble incorrectly"));
3941 /* What other incompatibilities could we check for? */
3943 /* Toss in some default assumptions about coprocessors. */
3945 && (cpu_of_arch (current_architecture
)
3946 /* Can CPU32 have a 68881 coprocessor?? */
3947 & (m68020
| m68030
| cpu32
)))
3949 current_architecture
|= m68881
;
3952 && (cpu_of_arch (current_architecture
) & m68020up
) != 0
3953 && (cpu_of_arch (current_architecture
) & m68040up
) == 0)
3955 current_architecture
|= m68851
;
3957 if (no_68881
&& (current_architecture
& m68881
))
3958 as_bad (_("options for 68881 and no-68881 both given"));
3959 if (no_68851
&& (current_architecture
& m68851
))
3960 as_bad (_("options for 68851 and no-68851 both given"));
3963 /* Work out the magic number. This isn't very general. */
3964 if (current_architecture
& m68000
)
3965 m68k_aout_machtype
= 0;
3966 else if (current_architecture
& m68010
)
3967 m68k_aout_machtype
= 1;
3968 else if (current_architecture
& m68020
)
3969 m68k_aout_machtype
= 2;
3971 m68k_aout_machtype
= 2;
3974 /* Note which set of "movec" control registers is available. */
3975 select_control_regs ();
3977 if (cpu_of_arch (current_architecture
) < m68020
3978 || arch_coldfire_p (current_architecture
))
3979 md_relax_table
[TAB (PCINDEX
, BYTE
)].rlx_more
= 0;
3982 /* This is called when a label is defined. */
3985 m68k_frob_label (sym
)
3988 struct label_line
*n
;
3990 n
= (struct label_line
*) xmalloc (sizeof *n
);
3993 as_where (&n
->file
, &n
->line
);
3999 /* This is called when a value that is not an instruction is emitted. */
4002 m68k_flush_pending_output ()
4004 current_label
= NULL
;
4007 /* This is called at the end of the assembly, when the final value of
4008 the label is known. We warn if this is a text symbol aligned at an
4012 m68k_frob_symbol (sym
)
4015 if (S_GET_SEGMENT (sym
) == reg_section
4016 && (int) S_GET_VALUE (sym
) < 0)
4018 S_SET_SEGMENT (sym
, absolute_section
);
4019 S_SET_VALUE (sym
, ~(int)S_GET_VALUE (sym
));
4021 else if ((S_GET_VALUE (sym
) & 1) != 0)
4023 struct label_line
*l
;
4025 for (l
= labels
; l
!= NULL
; l
= l
->next
)
4027 if (l
->label
== sym
)
4030 as_warn_where (l
->file
, l
->line
,
4031 _("text label `%s' aligned to odd boundary"),
4039 /* This is called if we go in or out of MRI mode because of the .mri
4043 m68k_mri_mode_change (on
)
4048 if (! flag_reg_prefix_optional
)
4050 flag_reg_prefix_optional
= 1;
4051 #ifdef REGISTER_PREFIX
4056 if (! m68k_rel32_from_cmdline
)
4061 if (! reg_prefix_optional_seen
)
4063 #ifdef REGISTER_PREFIX_OPTIONAL
4064 flag_reg_prefix_optional
= REGISTER_PREFIX_OPTIONAL
;
4066 flag_reg_prefix_optional
= 0;
4068 #ifdef REGISTER_PREFIX
4073 if (! m68k_rel32_from_cmdline
)
4078 /* Equal to MAX_PRECISION in atof-ieee.c */
4079 #define MAX_LITTLENUMS 6
4081 /* Turn a string in input_line_pointer into a floating point constant
4082 of type TYPE, and store the appropriate bytes in *LITP. The number
4083 of LITTLENUMS emitted is stored in *SIZEP. An error message is
4084 returned, or NULL on OK. */
4087 md_atof (type
, litP
, sizeP
)
4093 LITTLENUM_TYPE words
[MAX_LITTLENUMS
];
4094 LITTLENUM_TYPE
*wordP
;
4125 return _("Bad call to MD_ATOF()");
4127 t
= atof_ieee (input_line_pointer
, type
, words
);
4129 input_line_pointer
= t
;
4131 *sizeP
= prec
* sizeof (LITTLENUM_TYPE
);
4132 for (wordP
= words
; prec
--;)
4134 md_number_to_chars (litP
, (long) (*wordP
++), sizeof (LITTLENUM_TYPE
));
4135 litP
+= sizeof (LITTLENUM_TYPE
);
4141 md_number_to_chars (buf
, val
, n
)
4146 number_to_chars_bigendian (buf
, val
, n
);
4150 md_apply_fix_2 (fixP
, val
)
4154 addressT upper_limit
;
4155 offsetT lower_limit
;
4157 /* This is unnecessary but it convinces the native rs6000 compiler
4158 to generate the code we want. */
4159 char *buf
= fixP
->fx_frag
->fr_literal
;
4160 buf
+= fixP
->fx_where
;
4161 /* end ibm compiler workaround */
4163 if (val
& 0x80000000)
4164 val
|= ~(addressT
)0x7fffffff;
4171 memset (buf
, 0, fixP
->fx_size
);
4172 fixP
->fx_addnumber
= val
; /* Remember value for emit_reloc */
4174 if (fixP
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
4175 && !S_IS_DEFINED (fixP
->fx_addsy
)
4176 && !S_IS_WEAK (fixP
->fx_addsy
))
4177 S_SET_WEAK (fixP
->fx_addsy
);
4182 #ifdef BFD_ASSEMBLER
4183 if (fixP
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
4184 || fixP
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
)
4188 switch (fixP
->fx_size
)
4190 /* The cast to offsetT below are necessary to make code correct for
4191 machines where ints are smaller than offsetT */
4195 lower_limit
= - (offsetT
) 0x80;
4198 *buf
++ = (val
>> 8);
4200 upper_limit
= 0x7fff;
4201 lower_limit
= - (offsetT
) 0x8000;
4204 *buf
++ = (val
>> 24);
4205 *buf
++ = (val
>> 16);
4206 *buf
++ = (val
>> 8);
4208 upper_limit
= 0x7fffffff;
4209 lower_limit
= - (offsetT
) 0x7fffffff - 1; /* avoid constant overflow */
4212 BAD_CASE (fixP
->fx_size
);
4215 /* Fix up a negative reloc. */
4216 if (fixP
->fx_addsy
== NULL
&& fixP
->fx_subsy
!= NULL
)
4218 fixP
->fx_addsy
= fixP
->fx_subsy
;
4219 fixP
->fx_subsy
= NULL
;
4223 /* For non-pc-relative values, it's conceivable we might get something
4224 like "0xff" for a byte field. So extend the upper part of the range
4225 to accept such numbers. We arbitrarily disallow "-0xff" or "0xff+0xff",
4226 so that we can do any range checking at all. */
4227 if (! fixP
->fx_pcrel
&& ! fixP
->fx_signed
)
4228 upper_limit
= upper_limit
* 2 + 1;
4230 if ((addressT
) val
> upper_limit
4231 && (val
> 0 || val
< lower_limit
))
4232 as_bad_where (fixP
->fx_file
, fixP
->fx_line
, _("value out of range"));
4234 /* A one byte PC-relative reloc means a short branch. We can't use
4235 a short branch with a value of 0 or -1, because those indicate
4236 different opcodes (branches with longer offsets). fixup_segment
4237 in write.c may have clobbered fx_pcrel, so we need to examine the
4240 #ifdef BFD_ASSEMBLER
4241 || fixP
->fx_r_type
== BFD_RELOC_8_PCREL
4244 && fixP
->fx_size
== 1
4245 && (fixP
->fx_addsy
== NULL
4246 || S_IS_DEFINED (fixP
->fx_addsy
))
4247 && (val
== 0 || val
== -1))
4248 as_bad_where (fixP
->fx_file
, fixP
->fx_line
, _("invalid byte branch offset"));
4251 #ifdef BFD_ASSEMBLER
4253 md_apply_fix (fixP
, valp
)
4257 md_apply_fix_2 (fixP
, (addressT
) *valp
);
4261 void md_apply_fix (fixP
, val
)
4265 md_apply_fix_2 (fixP
, (addressT
) val
);
4269 /* *fragP has been relaxed to its final size, and now needs to have
4270 the bytes inside it modified to conform to the new size There is UGLY
4274 md_convert_frag_1 (fragP
)
4275 register fragS
*fragP
;
4281 /* Address in object code of the displacement. */
4282 register int object_address
= fragP
->fr_fix
+ fragP
->fr_address
;
4284 /* Address in gas core of the place to store the displacement. */
4285 /* This convinces the native rs6000 compiler to generate the code we
4287 register char *buffer_address
= fragP
->fr_literal
;
4288 buffer_address
+= fragP
->fr_fix
;
4289 /* end ibm compiler workaround */
4291 /* The displacement of the address, from current location. */
4292 disp
= fragP
->fr_symbol
? S_GET_VALUE (fragP
->fr_symbol
) : 0;
4293 disp
= (disp
+ fragP
->fr_offset
) - object_address
;
4295 #ifdef BFD_ASSEMBLER
4296 disp
+= symbol_get_frag (fragP
->fr_symbol
)->fr_address
;
4299 switch (fragP
->fr_subtype
)
4301 case TAB (BCC68000
, BYTE
):
4302 case TAB (ABRANCH
, BYTE
):
4303 know (issbyte (disp
));
4305 as_bad (_("short branch with zero offset: use :w"));
4306 fragP
->fr_opcode
[1] = disp
;
4309 case TAB (DBCC
, SHORT
):
4310 know (issword (disp
));
4313 case TAB (BCC68000
, SHORT
):
4314 case TAB (ABRANCH
, SHORT
):
4315 know (issword (disp
));
4316 fragP
->fr_opcode
[1] = 0x00;
4319 case TAB (ABRANCH
, LONG
):
4320 if (!HAVE_LONG_BRANCH (current_architecture
))
4322 if (flag_keep_pcrel
)
4323 as_bad (_("long branch not supported"));
4325 if (fragP
->fr_opcode
[0] == 0x61)
4328 fragP
->fr_opcode
[0] = 0x4E;
4329 fragP
->fr_opcode
[1] = (char) 0xB9; /* JBSR with ABSL LONG offset */
4343 else if (fragP
->fr_opcode
[0] == 0x60)
4345 fragP
->fr_opcode
[0] = 0x4E;
4346 fragP
->fr_opcode
[1] = (char) 0xF9; /* JMP with ABSL LONG offset */
4347 fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
4348 fragP
->fr_offset
, 0, NO_RELOC
);
4354 /* This should never happen, because if it's a conditional
4355 branch and we are on a 68000, BCC68000 should have been
4356 picked instead of ABRANCH. */
4362 fragP
->fr_opcode
[1] = (char) 0xff;
4366 case TAB (BCC68000
, LONG
):
4367 /* only Bcc 68000 instructions can come here */
4368 /* change bcc into b!cc/jmp absl long */
4369 if (flag_keep_pcrel
)
4370 as_bad (_("long branch not supported"));
4372 fragP
->fr_opcode
[0] ^= 0x01; /* invert bcc */
4373 fragP
->fr_opcode
[1] = 0x6;/* branch offset = 6 */
4375 /* JF: these used to be fr_opcode[2,3], but they may be in a
4376 different frag, in which case refering to them is a no-no.
4377 Only fr_opcode[0,1] are guaranteed to work. */
4378 *buffer_address
++ = 0x4e; /* put in jmp long (0x4ef9) */
4379 *buffer_address
++ = (char) 0xf9;
4380 fragP
->fr_fix
+= 2; /* account for jmp instruction */
4381 fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
4382 fragP
->fr_offset
, 0, NO_RELOC
);
4386 case TAB (DBCC
, LONG
):
4387 /* only DBcc 68000 instructions can come here */
4388 /* Change dbcc into dbcc/bral. */
4389 if (! HAVE_LONG_BRANCH (current_architecture
) && flag_keep_pcrel
)
4390 as_bad (_("long branch not supported"));
4392 /* JF: these used to be fr_opcode[2-7], but that's wrong */
4393 *buffer_address
++ = 0x00; /* branch offset = 4 */
4394 *buffer_address
++ = 0x04;
4395 *buffer_address
++ = 0x60; /* put in bra pc+6 */
4396 *buffer_address
++ = 0x06;
4397 if (HAVE_LONG_BRANCH (current_architecture
))
4399 *buffer_address
++ = 0x60; /* Put in bral (0x60ff). */
4400 *buffer_address
++ = (char) 0xff;
4404 *buffer_address
++ = 0x4e; /* Put in jmp long (0x4ef9). */
4405 *buffer_address
++ = (char) 0xf9;
4408 fragP
->fr_fix
+= 6; /* account for bra/jmp instructions */
4409 fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
4410 fragP
->fr_offset
, HAVE_LONG_BRANCH (current_architecture
),
4415 case TAB (FBRANCH
, SHORT
):
4416 know ((fragP
->fr_opcode
[1] & 0x40) == 0);
4419 case TAB (FBRANCH
, LONG
):
4420 fragP
->fr_opcode
[1] |= 0x40; /* Turn on LONG bit */
4423 case TAB (PCREL
, SHORT
):
4426 case TAB (PCREL
, LONG
):
4427 /* The thing to do here is force it to ABSOLUTE LONG, since
4428 PCREL is really trying to shorten an ABSOLUTE address anyway */
4429 /* JF FOO This code has not been tested */
4430 fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
, fragP
->fr_offset
,
4432 if ((fragP
->fr_opcode
[1] & 0x3F) != 0x3A)
4433 as_bad (_("Internal error (long PC-relative operand) for insn 0x%04x at 0x%lx"),
4434 (unsigned) fragP
->fr_opcode
[0],
4435 (unsigned long) fragP
->fr_address
);
4436 fragP
->fr_opcode
[1] &= ~0x3F;
4437 fragP
->fr_opcode
[1] |= 0x39; /* Mode 7.1 */
4441 case TAB (PCLEA
, SHORT
):
4442 fix_new (fragP
, (int) (fragP
->fr_fix
), 2, fragP
->fr_symbol
,
4443 fragP
->fr_offset
, 1, NO_RELOC
);
4444 fragP
->fr_opcode
[1] &= ~0x3F;
4445 fragP
->fr_opcode
[1] |= 0x3A; /* 072 - mode 7.2 */
4448 case TAB (PCLEA
, LONG
):
4449 fixP
= fix_new (fragP
, (int) (fragP
->fr_fix
) + 2, 4, fragP
->fr_symbol
,
4450 fragP
->fr_offset
, 1, NO_RELOC
);
4451 fixP
->fx_pcrel_adjust
= 2;
4452 /* Already set to mode 7.3; this indicates: PC indirect with
4453 suppressed index, 32-bit displacement. */
4454 *buffer_address
++ = 0x01;
4455 *buffer_address
++ = 0x70;
4460 case TAB (PCINDEX
, BYTE
):
4462 if (!issbyte (disp
))
4464 as_bad (_("displacement doesn't fit in one byte"));
4467 assert (fragP
->fr_fix
>= 2);
4468 buffer_address
[-2] &= ~1;
4469 buffer_address
[-1] = disp
;
4472 case TAB (PCINDEX
, SHORT
):
4474 assert (issword (disp
));
4475 assert (fragP
->fr_fix
>= 2);
4476 buffer_address
[-2] |= 0x1;
4477 buffer_address
[-1] = 0x20;
4478 fixP
= fix_new (fragP
, (int) (fragP
->fr_fix
), 2, fragP
->fr_symbol
,
4479 fragP
->fr_offset
, (fragP
->fr_opcode
[1] & 077) == 073,
4481 fixP
->fx_pcrel_adjust
= 2;
4484 case TAB (PCINDEX
, LONG
):
4486 fixP
= fix_new (fragP
, (int) (fragP
->fr_fix
), 4, fragP
->fr_symbol
,
4487 fragP
->fr_offset
, (fragP
->fr_opcode
[1] & 077) == 073,
4489 fixP
->fx_pcrel_adjust
= 2;
4490 assert (fragP
->fr_fix
>= 2);
4491 buffer_address
[-2] |= 0x1;
4492 buffer_address
[-1] = 0x30;
4499 md_number_to_chars (buffer_address
, (long) disp
, (int) ext
);
4500 fragP
->fr_fix
+= ext
;
4504 #ifndef BFD_ASSEMBLER
4507 md_convert_frag (headers
, sec
, fragP
)
4508 object_headers
*headers ATTRIBUTE_UNUSED
;
4509 segT sec ATTRIBUTE_UNUSED
;
4512 md_convert_frag_1 (fragP
);
4518 md_convert_frag (abfd
, sec
, fragP
)
4519 bfd
*abfd ATTRIBUTE_UNUSED
;
4520 segT sec ATTRIBUTE_UNUSED
;
4523 md_convert_frag_1 (fragP
);
4527 /* Force truly undefined symbols to their maximum size, and generally set up
4528 the frag list to be relaxed
4531 md_estimate_size_before_relax (fragP
, segment
)
4532 register fragS
*fragP
;
4536 register char *buffer_address
= fragP
->fr_fix
+ fragP
->fr_literal
;
4538 old_fix
= fragP
->fr_fix
;
4540 /* handle SZ_UNDEF first, it can be changed to BYTE or SHORT */
4541 switch (fragP
->fr_subtype
)
4544 case TAB (ABRANCH
, SZ_UNDEF
):
4546 if ((fragP
->fr_symbol
!= NULL
) /* Not absolute */
4547 && S_GET_SEGMENT (fragP
->fr_symbol
) == segment
4548 && relaxable_symbol (fragP
->fr_symbol
))
4550 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), BYTE
);
4553 else if ((fragP
->fr_symbol
!= NULL
)
4554 && (flag_short_refs
|| flag_keep_pcrel
))
4555 { /* Symbol is undefined and we want short ref */
4556 fix_new (fragP
, (int) (fragP
->fr_fix
), 2, fragP
->fr_symbol
,
4557 fragP
->fr_offset
, 1, NO_RELOC
);
4562 else if ((fragP
->fr_symbol
== 0) || !HAVE_LONG_BRANCH(current_architecture
))
4564 /* On 68000, or for absolute value, switch to abs long */
4565 /* FIXME, we should check abs val, pick short or long */
4566 if (fragP
->fr_opcode
[0] == 0x61)
4568 fragP
->fr_opcode
[0] = 0x4E;
4569 fragP
->fr_opcode
[1] = (char) 0xB9; /* JBSR with ABSL LONG offset */
4570 fix_new (fragP
, fragP
->fr_fix
, 4,
4571 fragP
->fr_symbol
, fragP
->fr_offset
, 0, NO_RELOC
);
4575 else if (fragP
->fr_opcode
[0] == 0x60)
4577 fragP
->fr_opcode
[0] = 0x4E;
4578 fragP
->fr_opcode
[1] = (char) 0xF9; /* JMP with ABSL LONG offset */
4579 fix_new (fragP
, fragP
->fr_fix
, 4,
4580 fragP
->fr_symbol
, fragP
->fr_offset
, 0, NO_RELOC
);
4586 /* This should never happen, because if it's a conditional
4587 branch and we are on a 68000, BCC68000 should have been
4588 picked instead of ABRANCH. */
4593 { /* Symbol is still undefined. Make it simple */
4594 fix_new (fragP
, (int) (fragP
->fr_fix
), 4, fragP
->fr_symbol
,
4595 fragP
->fr_offset
, 1, NO_RELOC
);
4597 fragP
->fr_opcode
[1] = (char) 0xff;
4603 } /* case TAB(ABRANCH,SZ_UNDEF) */
4605 case TAB (FBRANCH
, SZ_UNDEF
):
4607 if ((S_GET_SEGMENT (fragP
->fr_symbol
) == segment
4608 && relaxable_symbol (fragP
->fr_symbol
))
4611 fragP
->fr_subtype
= TAB (FBRANCH
, SHORT
);
4616 fix_new (fragP
, (int) fragP
->fr_fix
, 4, fragP
->fr_symbol
,
4617 fragP
->fr_offset
, 1, NO_RELOC
);
4619 fragP
->fr_opcode
[1] |= 0x40; /* Turn on LONG bit */
4623 } /* TAB(FBRANCH,SZ_UNDEF) */
4625 case TAB (PCREL
, SZ_UNDEF
):
4627 if ((S_GET_SEGMENT (fragP
->fr_symbol
) == segment
4628 && relaxable_symbol (fragP
->fr_symbol
))
4631 fragP
->fr_subtype
= TAB (PCREL
, SHORT
);
4636 fragP
->fr_subtype
= TAB (PCREL
, LONG
);
4640 } /* TAB(PCREL,SZ_UNDEF) */
4642 case TAB (BCC68000
, SZ_UNDEF
):
4644 if ((fragP
->fr_symbol
!= NULL
)
4645 && S_GET_SEGMENT (fragP
->fr_symbol
) == segment
4646 && relaxable_symbol (fragP
->fr_symbol
))
4648 fragP
->fr_subtype
= TAB (BCC68000
, BYTE
);
4651 /* only Bcc 68000 instructions can come here */
4652 if ((fragP
->fr_symbol
!= NULL
) && (flag_short_refs
|| flag_keep_pcrel
))
4654 /* the user wants short refs, so emit one */
4655 fix_new (fragP
, fragP
->fr_fix
, 2, fragP
->fr_symbol
,
4656 fragP
->fr_offset
, 1, NO_RELOC
);
4661 /* change bcc into b!cc/jmp absl long */
4662 fragP
->fr_opcode
[0] ^= 0x01; /* invert bcc */
4663 fragP
->fr_opcode
[1] = 0x06; /* branch offset = 6 */
4664 /* JF: these were fr_opcode[2,3] */
4665 buffer_address
[0] = 0x4e; /* put in jmp long (0x4ef9) */
4666 buffer_address
[1] = (char) 0xf9;
4667 fragP
->fr_fix
+= 2; /* account for jmp instruction */
4668 fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
4669 fragP
->fr_offset
, 0, NO_RELOC
);
4674 } /* case TAB(BCC68000,SZ_UNDEF) */
4676 case TAB (DBCC
, SZ_UNDEF
):
4678 if (fragP
->fr_symbol
!= NULL
4679 && S_GET_SEGMENT (fragP
->fr_symbol
) == segment
4680 && relaxable_symbol (fragP
->fr_symbol
))
4682 fragP
->fr_subtype
= TAB (DBCC
, SHORT
);
4686 /* only DBcc 68000 instructions can come here */
4688 if (fragP
->fr_symbol
!= NULL
4690 || (! HAVE_LONG_BRANCH (current_architecture
)
4691 && flag_keep_pcrel
)))
4693 /* the user wants short refs, so emit one */
4694 fix_new (fragP
, fragP
->fr_fix
, 2, fragP
->fr_symbol
,
4695 fragP
->fr_offset
, 1, NO_RELOC
);
4700 /* Change dbcc into dbcc/bral. */
4701 /* JF: these used to be fr_opcode[2-4], which is wrong. */
4702 buffer_address
[0] = 0x00; /* branch offset = 4 */
4703 buffer_address
[1] = 0x04;
4704 buffer_address
[2] = 0x60; /* put in bra pc + ... */
4705 /* JF: these were fr_opcode[5-7] */
4706 buffer_address
[3] = 0x06; /* Plus 6 */
4707 if (HAVE_LONG_BRANCH (current_architecture
))
4709 buffer_address
[4] = 0x60; /* Put in bral (0x60ff). */
4710 buffer_address
[5] = (char) 0xff;
4714 buffer_address
[4] = 0x4e; /* Put in jmp long (0x4ef9). */
4715 buffer_address
[5] = (char) 0xf9;
4717 fragP
->fr_fix
+= 6; /* account for bra/jmp instruction */
4718 fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
4719 fragP
->fr_offset
, HAVE_LONG_BRANCH (current_architecture
),
4726 } /* case TAB(DBCC,SZ_UNDEF) */
4728 case TAB (PCLEA
, SZ_UNDEF
):
4730 if (((S_GET_SEGMENT (fragP
->fr_symbol
)) == segment
4731 && relaxable_symbol (fragP
->fr_symbol
))
4733 || cpu_of_arch (current_architecture
) < m68020
4734 || cpu_of_arch (current_architecture
) == mcf5200
)
4736 fragP
->fr_subtype
= TAB (PCLEA
, SHORT
);
4741 fragP
->fr_subtype
= TAB (PCLEA
, LONG
);
4745 } /* TAB(PCLEA,SZ_UNDEF) */
4747 case TAB (PCINDEX
, SZ_UNDEF
):
4748 if ((S_GET_SEGMENT (fragP
->fr_symbol
) == segment
4749 && relaxable_symbol (fragP
->fr_symbol
))
4750 || cpu_of_arch (current_architecture
) < m68020
4751 || cpu_of_arch (current_architecture
) == mcf5200
)
4753 fragP
->fr_subtype
= TAB (PCINDEX
, BYTE
);
4757 fragP
->fr_subtype
= TAB (PCINDEX
, LONG
);
4766 /* now that SZ_UNDEF are taken care of, check others */
4767 switch (fragP
->fr_subtype
)
4769 case TAB (BCC68000
, BYTE
):
4770 case TAB (ABRANCH
, BYTE
):
4771 /* We can't do a short jump to the next instruction, so in that
4772 case we force word mode. At this point S_GET_VALUE should
4773 return the offset of the symbol within its frag. If the
4774 symbol is at the start of a frag, and it is the next frag
4775 with any data in it (usually this is just the next frag, but
4776 assembler listings may introduce empty frags), we must use
4778 if (fragP
->fr_symbol
&& S_GET_VALUE (fragP
->fr_symbol
) == 0)
4783 stop
= symbol_get_frag (fragP
->fr_symbol
);
4784 for (l
= fragP
->fr_next
; l
!= stop
; l
= l
->fr_next
)
4785 if (l
->fr_fix
+ l
->fr_var
!= 0)
4789 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), SHORT
);
4797 return fragP
->fr_var
+ fragP
->fr_fix
- old_fix
;
4800 #if defined(OBJ_AOUT) | defined(OBJ_BOUT)
4801 /* the bit-field entries in the relocation_info struct plays hell
4802 with the byte-order problems of cross-assembly. So as a hack,
4803 I added this mach. dependent ri twiddler. Ugly, but it gets
4805 /* on m68k: first 4 bytes are normal unsigned long, next three bytes
4806 are symbolnum, most sig. byte first. Last byte is broken up with
4807 bit 7 as pcrel, bits 6 & 5 as length, bit 4 as pcrel, and the lower
4808 nibble as nuthin. (on Sun 3 at least) */
4809 /* Translate the internal relocation information into target-specific
4813 md_ri_to_chars (the_bytes
, ri
)
4815 struct reloc_info_generic
*ri
;
4818 md_number_to_chars (the_bytes
, ri
->r_address
, 4);
4819 /* now the fun stuff */
4820 the_bytes
[4] = (ri
->r_symbolnum
>> 16) & 0x0ff;
4821 the_bytes
[5] = (ri
->r_symbolnum
>> 8) & 0x0ff;
4822 the_bytes
[6] = ri
->r_symbolnum
& 0x0ff;
4823 the_bytes
[7] = (((ri
->r_pcrel
<< 7) & 0x80) | ((ri
->r_length
<< 5) & 0x60) |
4824 ((ri
->r_extern
<< 4) & 0x10));
4827 #endif /* comment */
4829 #ifndef BFD_ASSEMBLER
4831 tc_aout_fix_to_chars (where
, fixP
, segment_address_in_file
)
4834 relax_addressT segment_address_in_file
;
4837 * In: length of relocation (or of address) in chars: 1, 2 or 4.
4838 * Out: GNU LD relocation length code: 0, 1, or 2.
4841 static CONST
unsigned char nbytes_r_length
[] = {42, 0, 1, 42, 2};
4844 know (fixP
->fx_addsy
!= NULL
);
4846 md_number_to_chars (where
,
4847 fixP
->fx_frag
->fr_address
+ fixP
->fx_where
- segment_address_in_file
,
4850 r_symbolnum
= (S_IS_DEFINED (fixP
->fx_addsy
)
4851 ? S_GET_TYPE (fixP
->fx_addsy
)
4852 : fixP
->fx_addsy
->sy_number
);
4854 where
[4] = (r_symbolnum
>> 16) & 0x0ff;
4855 where
[5] = (r_symbolnum
>> 8) & 0x0ff;
4856 where
[6] = r_symbolnum
& 0x0ff;
4857 where
[7] = (((fixP
->fx_pcrel
<< 7) & 0x80) | ((nbytes_r_length
[fixP
->fx_size
] << 5) & 0x60) |
4858 (((!S_IS_DEFINED (fixP
->fx_addsy
)) << 4) & 0x10));
4862 #endif /* OBJ_AOUT or OBJ_BOUT */
4864 #ifndef WORKING_DOT_WORD
4865 CONST
int md_short_jump_size
= 4;
4866 CONST
int md_long_jump_size
= 6;
4869 md_create_short_jump (ptr
, from_addr
, to_addr
, frag
, to_symbol
)
4871 addressT from_addr
, to_addr
;
4872 fragS
*frag ATTRIBUTE_UNUSED
;
4873 symbolS
*to_symbol ATTRIBUTE_UNUSED
;
4877 offset
= to_addr
- (from_addr
+ 2);
4879 md_number_to_chars (ptr
, (valueT
) 0x6000, 2);
4880 md_number_to_chars (ptr
+ 2, (valueT
) offset
, 2);
4884 md_create_long_jump (ptr
, from_addr
, to_addr
, frag
, to_symbol
)
4886 addressT from_addr
, to_addr
;
4892 if (!HAVE_LONG_BRANCH(current_architecture
))
4894 offset
= to_addr
- S_GET_VALUE (to_symbol
);
4895 md_number_to_chars (ptr
, (valueT
) 0x4EF9, 2);
4896 md_number_to_chars (ptr
+ 2, (valueT
) offset
, 4);
4897 fix_new (frag
, (ptr
+ 2) - frag
->fr_literal
, 4, to_symbol
, (offsetT
) 0,
4902 offset
= to_addr
- (from_addr
+ 2);
4903 md_number_to_chars (ptr
, (valueT
) 0x60ff, 2);
4904 md_number_to_chars (ptr
+ 2, (valueT
) offset
, 4);
4910 /* Different values of OK tell what its OK to return. Things that
4911 aren't OK are an error (what a shock, no?)
4914 10: Absolute 1:8 only
4915 20: Absolute 0:7 only
4916 30: absolute 0:15 only
4917 40: Absolute 0:31 only
4918 50: absolute 0:127 only
4919 55: absolute -64:63 only
4920 60: absolute -128:127 only
4921 70: absolute 0:4095 only
4928 struct m68k_exp
*exp
;
4931 if (exp
->exp
.X_op
== O_absent
)
4933 /* Do the same thing the VAX asm does */
4934 op (exp
) = O_constant
;
4940 as_warn (_("expression out of range: defaulting to 1"));
4944 else if (exp
->exp
.X_op
== O_constant
)
4949 if (offs (exp
) < 1 || offs (exp
) > 8)
4951 as_warn (_("expression out of range: defaulting to 1"));
4956 if (offs (exp
) < 0 || offs (exp
) > 7)
4960 if (offs (exp
) < 0 || offs (exp
) > 15)
4964 if (offs (exp
) < 0 || offs (exp
) > 32)
4968 if (offs (exp
) < 0 || offs (exp
) > 127)
4972 if (offs (exp
) < -64 || offs (exp
) > 63)
4976 if (offs (exp
) < -128 || offs (exp
) > 127)
4980 if (offs (exp
) < 0 || offs (exp
) > 4095)
4983 as_warn (_("expression out of range: defaulting to 0"));
4991 else if (exp
->exp
.X_op
== O_big
)
4993 if (offs (exp
) <= 0 /* flonum */
4994 && (ok
== 80 /* no bignums */
4995 || (ok
> 10 /* small-int ranges including 0 ok */
4996 /* If we have a flonum zero, a zero integer should
4997 do as well (e.g., in moveq). */
4998 && generic_floating_point_number
.exponent
== 0
4999 && generic_floating_point_number
.low
[0] == 0)))
5001 /* HACK! Turn it into a long */
5002 LITTLENUM_TYPE words
[6];
5004 gen_to_words (words
, 2, 8L); /* These numbers are magic! */
5005 op (exp
) = O_constant
;
5008 offs (exp
) = words
[1] | (words
[0] << 16);
5012 op (exp
) = O_constant
;
5015 offs (exp
) = (ok
== 10) ? 1 : 0;
5016 as_warn (_("Can't deal with expression; defaulting to %ld"),
5022 if (ok
>= 10 && ok
<= 70)
5024 op (exp
) = O_constant
;
5027 offs (exp
) = (ok
== 10) ? 1 : 0;
5028 as_warn (_("Can't deal with expression; defaulting to %ld"),
5033 if (exp
->size
!= SIZE_UNSPEC
)
5041 if (!isbyte (offs (exp
)))
5042 as_warn (_("expression doesn't fit in BYTE"));
5045 if (!isword (offs (exp
)))
5046 as_warn (_("expression doesn't fit in WORD"));
5054 /* These are the back-ends for the various machine dependent pseudo-ops. */
5058 int ignore ATTRIBUTE_UNUSED
;
5060 subseg_set (data_section
, 1);
5061 demand_empty_rest_of_line ();
5066 int ignore ATTRIBUTE_UNUSED
;
5068 subseg_set (data_section
, 2);
5069 demand_empty_rest_of_line ();
5074 int ignore ATTRIBUTE_UNUSED
;
5076 /* We don't support putting frags in the BSS segment, we fake it
5077 by marking in_bss, then looking at s_skip for clues. */
5079 subseg_set (bss_section
, 0);
5080 demand_empty_rest_of_line ();
5085 int ignore ATTRIBUTE_UNUSED
;
5088 register long temp_fill
;
5090 temp
= 1; /* JF should be 2? */
5091 temp_fill
= get_absolute_expression ();
5092 if (!need_pass_2
) /* Never make frag if expect extra pass. */
5093 frag_align (temp
, (int) temp_fill
, 0);
5094 demand_empty_rest_of_line ();
5095 record_alignment (now_seg
, temp
);
5100 int ignore ATTRIBUTE_UNUSED
;
5102 demand_empty_rest_of_line ();
5105 /* Pseudo-ops handled for MRI compatibility. */
5107 /* This function returns non-zero if the argument is a conditional
5108 pseudo-op. This is called when checking whether a pending
5109 alignment is needed. */
5112 m68k_conditional_pseudoop (pop
)
5115 return (pop
->poc_handler
== s_mri_if
5116 || pop
->poc_handler
== s_mri_else
);
5119 /* Handle an MRI style chip specification. */
5128 s
= input_line_pointer
;
5129 /* We can't use get_symbol_end since the processor names are not proper
5131 while (is_part_of_name (c
= *input_line_pointer
++))
5133 *--input_line_pointer
= 0;
5134 for (i
= 0; i
< n_archs
; i
++)
5135 if (strcasecmp (s
, archs
[i
].name
) == 0)
5139 as_bad (_("%s: unrecognized processor name"), s
);
5140 *input_line_pointer
= c
;
5141 ignore_rest_of_line ();
5144 *input_line_pointer
= c
;
5146 if (*input_line_pointer
== '/')
5147 current_architecture
= 0;
5149 current_architecture
&= m68881
| m68851
;
5150 current_architecture
|= archs
[i
].arch
;
5152 while (*input_line_pointer
== '/')
5154 ++input_line_pointer
;
5155 s
= input_line_pointer
;
5156 /* We can't use get_symbol_end since the processor names are not
5158 while (is_part_of_name (c
= *input_line_pointer
++))
5160 *--input_line_pointer
= 0;
5161 if (strcmp (s
, "68881") == 0)
5162 current_architecture
|= m68881
;
5163 else if (strcmp (s
, "68851") == 0)
5164 current_architecture
|= m68851
;
5165 *input_line_pointer
= c
;
5168 /* Update info about available control registers. */
5169 select_control_regs ();
5172 /* The MRI CHIP pseudo-op. */
5176 int ignore ATTRIBUTE_UNUSED
;
5182 stop
= mri_comment_field (&stopc
);
5185 mri_comment_end (stop
, stopc
);
5186 demand_empty_rest_of_line ();
5189 /* The MRI FOPT pseudo-op. */
5193 int ignore ATTRIBUTE_UNUSED
;
5197 if (strncasecmp (input_line_pointer
, "ID=", 3) == 0)
5201 input_line_pointer
+= 3;
5202 temp
= get_absolute_expression ();
5203 if (temp
< 0 || temp
> 7)
5204 as_bad (_("bad coprocessor id"));
5206 m68k_float_copnum
= COP0
+ temp
;
5210 as_bad (_("unrecognized fopt option"));
5211 ignore_rest_of_line ();
5215 demand_empty_rest_of_line ();
5218 /* The structure used to handle the MRI OPT pseudo-op. */
5222 /* The name of the option. */
5225 /* If this is not NULL, just call this function. The first argument
5226 is the ARG field of this structure, the second argument is
5227 whether the option was negated. */
5228 void (*pfn
) PARAMS ((int arg
, int on
));
5230 /* If this is not NULL, and the PFN field is NULL, set the variable
5231 this points to. Set it to the ARG field if the option was not
5232 negated, and the NOTARG field otherwise. */
5235 /* The value to pass to PFN or to assign to *PVAR. */
5238 /* The value to assign to *PVAR if the option is negated. If PFN is
5239 NULL, and PVAR is not NULL, and ARG and NOTARG are the same, then
5240 the option may not be negated. */
5244 /* The table used to handle the MRI OPT pseudo-op. */
5246 static void skip_to_comma
PARAMS ((int, int));
5247 static void opt_nest
PARAMS ((int, int));
5248 static void opt_chip
PARAMS ((int, int));
5249 static void opt_list
PARAMS ((int, int));
5250 static void opt_list_symbols
PARAMS ((int, int));
5252 static const struct opt_action opt_table
[] =
5254 { "abspcadd", 0, &m68k_abspcadd
, 1, 0 },
5256 /* We do relaxing, so there is little use for these options. */
5257 { "b", 0, 0, 0, 0 },
5258 { "brs", 0, 0, 0, 0 },
5259 { "brb", 0, 0, 0, 0 },
5260 { "brl", 0, 0, 0, 0 },
5261 { "brw", 0, 0, 0, 0 },
5263 { "c", 0, 0, 0, 0 },
5264 { "cex", 0, 0, 0, 0 },
5265 { "case", 0, &symbols_case_sensitive
, 1, 0 },
5266 { "cl", 0, 0, 0, 0 },
5267 { "cre", 0, 0, 0, 0 },
5268 { "d", 0, &flag_keep_locals
, 1, 0 },
5269 { "e", 0, 0, 0, 0 },
5270 { "f", 0, &flag_short_refs
, 1, 0 },
5271 { "frs", 0, &flag_short_refs
, 1, 0 },
5272 { "frl", 0, &flag_short_refs
, 0, 1 },
5273 { "g", 0, 0, 0, 0 },
5274 { "i", 0, 0, 0, 0 },
5275 { "m", 0, 0, 0, 0 },
5276 { "mex", 0, 0, 0, 0 },
5277 { "mc", 0, 0, 0, 0 },
5278 { "md", 0, 0, 0, 0 },
5279 { "nest", opt_nest
, 0, 0, 0 },
5280 { "next", skip_to_comma
, 0, 0, 0 },
5281 { "o", 0, 0, 0, 0 },
5282 { "old", 0, 0, 0, 0 },
5283 { "op", skip_to_comma
, 0, 0, 0 },
5284 { "pco", 0, 0, 0, 0 },
5285 { "p", opt_chip
, 0, 0, 0 },
5286 { "pcr", 0, 0, 0, 0 },
5287 { "pcs", 0, 0, 0, 0 },
5288 { "r", 0, 0, 0, 0 },
5289 { "quick", 0, &m68k_quick
, 1, 0 },
5290 { "rel32", 0, &m68k_rel32
, 1, 0 },
5291 { "s", opt_list
, 0, 0, 0 },
5292 { "t", opt_list_symbols
, 0, 0, 0 },
5293 { "w", 0, &flag_no_warnings
, 0, 1 },
5297 #define OPTCOUNT ((int) (sizeof opt_table / sizeof opt_table[0]))
5299 /* The MRI OPT pseudo-op. */
5303 int ignore ATTRIBUTE_UNUSED
;
5311 const struct opt_action
*o
;
5316 if (*input_line_pointer
== '-')
5318 ++input_line_pointer
;
5321 else if (strncasecmp (input_line_pointer
, "NO", 2) == 0)
5323 input_line_pointer
+= 2;
5327 s
= input_line_pointer
;
5328 c
= get_symbol_end ();
5330 for (i
= 0, o
= opt_table
; i
< OPTCOUNT
; i
++, o
++)
5332 if (strcasecmp (s
, o
->name
) == 0)
5336 /* Restore input_line_pointer now in case the option
5338 *input_line_pointer
= c
;
5339 (*o
->pfn
) (o
->arg
, t
);
5341 else if (o
->pvar
!= NULL
)
5343 if (! t
&& o
->arg
== o
->notarg
)
5344 as_bad (_("option `%s' may not be negated"), s
);
5345 *input_line_pointer
= c
;
5346 *o
->pvar
= t
? o
->arg
: o
->notarg
;
5349 *input_line_pointer
= c
;
5355 as_bad (_("option `%s' not recognized"), s
);
5356 *input_line_pointer
= c
;
5359 while (*input_line_pointer
++ == ',');
5361 /* Move back to terminating character. */
5362 --input_line_pointer
;
5363 demand_empty_rest_of_line ();
5366 /* Skip ahead to a comma. This is used for OPT options which we do
5367 not suppor tand which take arguments. */
5370 skip_to_comma (arg
, on
)
5371 int arg ATTRIBUTE_UNUSED
;
5372 int on ATTRIBUTE_UNUSED
;
5374 while (*input_line_pointer
!= ','
5375 && ! is_end_of_line
[(unsigned char) *input_line_pointer
])
5376 ++input_line_pointer
;
5379 /* Handle the OPT NEST=depth option. */
5383 int arg ATTRIBUTE_UNUSED
;
5384 int on ATTRIBUTE_UNUSED
;
5386 if (*input_line_pointer
!= '=')
5388 as_bad (_("bad format of OPT NEST=depth"));
5392 ++input_line_pointer
;
5393 max_macro_nest
= get_absolute_expression ();
5396 /* Handle the OPT P=chip option. */
5400 int arg ATTRIBUTE_UNUSED
;
5401 int on ATTRIBUTE_UNUSED
;
5403 if (*input_line_pointer
!= '=')
5405 /* This is just OPT P, which we do not support. */
5409 ++input_line_pointer
;
5413 /* Handle the OPT S option. */
5417 int arg ATTRIBUTE_UNUSED
;
5423 /* Handle the OPT T option. */
5426 opt_list_symbols (arg
, on
)
5427 int arg ATTRIBUTE_UNUSED
;
5431 listing
|= LISTING_SYMBOLS
;
5433 listing
&=~ LISTING_SYMBOLS
;
5436 /* Handle the MRI REG pseudo-op. */
5440 int ignore ATTRIBUTE_UNUSED
;
5449 if (line_label
== NULL
)
5451 as_bad (_("missing label"));
5452 ignore_rest_of_line ();
5457 stop
= mri_comment_field (&stopc
);
5461 s
= input_line_pointer
;
5462 while (isalnum ((unsigned char) *input_line_pointer
)
5463 #ifdef REGISTER_PREFIX
5464 || *input_line_pointer
== REGISTER_PREFIX
5466 || *input_line_pointer
== '/'
5467 || *input_line_pointer
== '-')
5468 ++input_line_pointer
;
5469 c
= *input_line_pointer
;
5470 *input_line_pointer
= '\0';
5472 if (m68k_ip_op (s
, &rop
) != 0)
5474 if (rop
.error
== NULL
)
5475 as_bad (_("bad register list"));
5477 as_bad (_("bad register list: %s"), rop
.error
);
5478 *input_line_pointer
= c
;
5479 ignore_rest_of_line ();
5483 *input_line_pointer
= c
;
5485 if (rop
.mode
== REGLST
)
5487 else if (rop
.mode
== DREG
)
5488 mask
= 1 << (rop
.reg
- DATA0
);
5489 else if (rop
.mode
== AREG
)
5490 mask
= 1 << (rop
.reg
- ADDR0
+ 8);
5491 else if (rop
.mode
== FPREG
)
5492 mask
= 1 << (rop
.reg
- FP0
+ 16);
5493 else if (rop
.mode
== CONTROL
5496 else if (rop
.mode
== CONTROL
5499 else if (rop
.mode
== CONTROL
5504 as_bad (_("bad register list"));
5505 ignore_rest_of_line ();
5509 S_SET_SEGMENT (line_label
, reg_section
);
5510 S_SET_VALUE (line_label
, ~mask
);
5511 symbol_set_frag (line_label
, &zero_address_frag
);
5514 mri_comment_end (stop
, stopc
);
5516 demand_empty_rest_of_line ();
5519 /* This structure is used for the MRI SAVE and RESTORE pseudo-ops. */
5523 struct save_opts
*next
;
5525 int symbols_case_sensitive
;
5533 /* FIXME: We don't save OPT S. */
5536 /* This variable holds the stack of saved options. */
5538 static struct save_opts
*save_stack
;
5540 /* The MRI SAVE pseudo-op. */
5544 int ignore ATTRIBUTE_UNUSED
;
5546 struct save_opts
*s
;
5548 s
= (struct save_opts
*) xmalloc (sizeof (struct save_opts
));
5549 s
->abspcadd
= m68k_abspcadd
;
5550 s
->symbols_case_sensitive
= symbols_case_sensitive
;
5551 s
->keep_locals
= flag_keep_locals
;
5552 s
->short_refs
= flag_short_refs
;
5553 s
->architecture
= current_architecture
;
5554 s
->quick
= m68k_quick
;
5555 s
->rel32
= m68k_rel32
;
5556 s
->listing
= listing
;
5557 s
->no_warnings
= flag_no_warnings
;
5559 s
->next
= save_stack
;
5562 demand_empty_rest_of_line ();
5565 /* The MRI RESTORE pseudo-op. */
5569 int ignore ATTRIBUTE_UNUSED
;
5571 struct save_opts
*s
;
5573 if (save_stack
== NULL
)
5575 as_bad (_("restore without save"));
5576 ignore_rest_of_line ();
5581 save_stack
= s
->next
;
5583 m68k_abspcadd
= s
->abspcadd
;
5584 symbols_case_sensitive
= s
->symbols_case_sensitive
;
5585 flag_keep_locals
= s
->keep_locals
;
5586 flag_short_refs
= s
->short_refs
;
5587 current_architecture
= s
->architecture
;
5588 m68k_quick
= s
->quick
;
5589 m68k_rel32
= s
->rel32
;
5590 listing
= s
->listing
;
5591 flag_no_warnings
= s
->no_warnings
;
5595 demand_empty_rest_of_line ();
5598 /* Types of MRI structured control directives. */
5600 enum mri_control_type
5608 /* This structure is used to stack the MRI structured control
5611 struct mri_control_info
5613 /* The directive within which this one is enclosed. */
5614 struct mri_control_info
*outer
;
5616 /* The type of directive. */
5617 enum mri_control_type type
;
5619 /* Whether an ELSE has been in an IF. */
5622 /* The add or sub statement at the end of a FOR. */
5625 /* The label of the top of a FOR or REPEAT loop. */
5628 /* The label to jump to for the next iteration, or the else
5629 expression of a conditional. */
5632 /* The label to jump to to break out of the loop, or the label past
5633 the end of a conditional. */
5637 /* The stack of MRI structured control directives. */
5639 static struct mri_control_info
*mri_control_stack
;
5641 /* The current MRI structured control directive index number, used to
5642 generate label names. */
5644 static int mri_control_index
;
5646 /* Some function prototypes. */
5648 static void mri_assemble
PARAMS ((char *));
5649 static char *mri_control_label
PARAMS ((void));
5650 static struct mri_control_info
*push_mri_control
5651 PARAMS ((enum mri_control_type
));
5652 static void pop_mri_control
PARAMS ((void));
5653 static int parse_mri_condition
PARAMS ((int *));
5654 static int parse_mri_control_operand
5655 PARAMS ((int *, char **, char **, char **, char **));
5656 static int swap_mri_condition
PARAMS ((int));
5657 static int reverse_mri_condition
PARAMS ((int));
5658 static void build_mri_control_operand
5659 PARAMS ((int, int, char *, char *, char *, char *, const char *,
5660 const char *, int));
5661 static void parse_mri_control_expression
5662 PARAMS ((char *, int, const char *, const char *, int));
5664 /* Assemble an instruction for an MRI structured control directive. */
5672 /* md_assemble expects the opcode to be in lower case. */
5673 for (s
= str
; *s
!= ' ' && *s
!= '\0'; s
++)
5675 if (isupper ((unsigned char) *s
))
5676 *s
= tolower ((unsigned char) *s
);
5682 /* Generate a new MRI label structured control directive label name. */
5685 mri_control_label ()
5689 n
= (char *) xmalloc (20);
5690 sprintf (n
, "%smc%d", FAKE_LABEL_NAME
, mri_control_index
);
5691 ++mri_control_index
;
5695 /* Create a new MRI structured control directive. */
5697 static struct mri_control_info
*
5698 push_mri_control (type
)
5699 enum mri_control_type type
;
5701 struct mri_control_info
*n
;
5703 n
= (struct mri_control_info
*) xmalloc (sizeof (struct mri_control_info
));
5707 if (type
== mri_if
|| type
== mri_while
)
5710 n
->top
= mri_control_label ();
5711 n
->next
= mri_control_label ();
5712 n
->bottom
= mri_control_label ();
5714 n
->outer
= mri_control_stack
;
5715 mri_control_stack
= n
;
5720 /* Pop off the stack of MRI structured control directives. */
5725 struct mri_control_info
*n
;
5727 n
= mri_control_stack
;
5728 mri_control_stack
= n
->outer
;
5736 /* Recognize a condition code in an MRI structured control expression. */
5739 parse_mri_condition (pcc
)
5744 know (*input_line_pointer
== '<');
5746 ++input_line_pointer
;
5747 c1
= *input_line_pointer
++;
5748 c2
= *input_line_pointer
++;
5750 if (*input_line_pointer
!= '>')
5752 as_bad (_("syntax error in structured control directive"));
5756 ++input_line_pointer
;
5764 *pcc
= (c1
<< 8) | c2
;
5769 /* Parse a single operand in an MRI structured control expression. */
5772 parse_mri_control_operand (pcc
, leftstart
, leftstop
, rightstart
, rightstop
)
5789 if (*input_line_pointer
== '<')
5791 /* It's just a condition code. */
5792 return parse_mri_condition (pcc
);
5795 /* Look ahead for the condition code. */
5796 for (s
= input_line_pointer
; *s
!= '\0'; ++s
)
5798 if (*s
== '<' && s
[1] != '\0' && s
[2] != '\0' && s
[3] == '>')
5803 as_bad (_("missing condition code in structured control directive"));
5807 *leftstart
= input_line_pointer
;
5809 if (*leftstop
> *leftstart
5810 && ((*leftstop
)[-1] == ' ' || (*leftstop
)[-1] == '\t'))
5813 input_line_pointer
= s
;
5814 if (! parse_mri_condition (pcc
))
5817 /* Look ahead for AND or OR or end of line. */
5818 for (s
= input_line_pointer
; *s
!= '\0'; ++s
)
5820 if ((strncasecmp (s
, "AND", 3) == 0
5821 && (s
[3] == '.' || ! is_part_of_name (s
[3])))
5822 || (strncasecmp (s
, "OR", 2) == 0
5823 && (s
[2] == '.' || ! is_part_of_name (s
[2]))))
5827 *rightstart
= input_line_pointer
;
5829 if (*rightstop
> *rightstart
5830 && ((*rightstop
)[-1] == ' ' || (*rightstop
)[-1] == '\t'))
5833 input_line_pointer
= s
;
5838 #define MCC(b1, b2) (((b1) << 8) | (b2))
5840 /* Swap the sense of a condition. This changes the condition so that
5841 it generates the same result when the operands are swapped. */
5844 swap_mri_condition (cc
)
5849 case MCC ('h', 'i'): return MCC ('c', 's');
5850 case MCC ('l', 's'): return MCC ('c', 'c');
5851 case MCC ('c', 'c'): return MCC ('l', 's');
5852 case MCC ('c', 's'): return MCC ('h', 'i');
5853 case MCC ('p', 'l'): return MCC ('m', 'i');
5854 case MCC ('m', 'i'): return MCC ('p', 'l');
5855 case MCC ('g', 'e'): return MCC ('l', 'e');
5856 case MCC ('l', 't'): return MCC ('g', 't');
5857 case MCC ('g', 't'): return MCC ('l', 't');
5858 case MCC ('l', 'e'): return MCC ('g', 'e');
5863 /* Reverse the sense of a condition. */
5866 reverse_mri_condition (cc
)
5871 case MCC ('h', 'i'): return MCC ('l', 's');
5872 case MCC ('l', 's'): return MCC ('h', 'i');
5873 case MCC ('c', 'c'): return MCC ('c', 's');
5874 case MCC ('c', 's'): return MCC ('c', 'c');
5875 case MCC ('n', 'e'): return MCC ('e', 'q');
5876 case MCC ('e', 'q'): return MCC ('n', 'e');
5877 case MCC ('v', 'c'): return MCC ('v', 's');
5878 case MCC ('v', 's'): return MCC ('v', 'c');
5879 case MCC ('p', 'l'): return MCC ('m', 'i');
5880 case MCC ('m', 'i'): return MCC ('p', 'l');
5881 case MCC ('g', 'e'): return MCC ('l', 't');
5882 case MCC ('l', 't'): return MCC ('g', 'e');
5883 case MCC ('g', 't'): return MCC ('l', 'e');
5884 case MCC ('l', 'e'): return MCC ('g', 't');
5889 /* Build an MRI structured control expression. This generates test
5890 and branch instructions. It goes to TRUELAB if the condition is
5891 true, and to FALSELAB if the condition is false. Exactly one of
5892 TRUELAB and FALSELAB will be NULL, meaning to fall through. QUAL
5893 is the size qualifier for the expression. EXTENT is the size to
5894 use for the branch. */
5897 build_mri_control_operand (qual
, cc
, leftstart
, leftstop
, rightstart
,
5898 rightstop
, truelab
, falselab
, extent
)
5905 const char *truelab
;
5906 const char *falselab
;
5912 if (leftstart
!= NULL
)
5914 struct m68k_op leftop
, rightop
;
5917 /* Swap the compare operands, if necessary, to produce a legal
5918 m68k compare instruction. Comparing a register operand with
5919 a non-register operand requires the register to be on the
5920 right (cmp, cmpa). Comparing an immediate value with
5921 anything requires the immediate value to be on the left
5926 (void) m68k_ip_op (leftstart
, &leftop
);
5931 (void) m68k_ip_op (rightstart
, &rightop
);
5934 if (rightop
.mode
== IMMED
5935 || ((leftop
.mode
== DREG
|| leftop
.mode
== AREG
)
5936 && (rightop
.mode
!= DREG
&& rightop
.mode
!= AREG
)))
5940 cc
= swap_mri_condition (cc
);
5942 leftstart
= rightstart
;
5945 leftstop
= rightstop
;
5950 if (truelab
== NULL
)
5952 cc
= reverse_mri_condition (cc
);
5956 if (leftstart
!= NULL
)
5958 buf
= (char *) xmalloc (20
5959 + (leftstop
- leftstart
)
5960 + (rightstop
- rightstart
));
5968 memcpy (s
, leftstart
, leftstop
- leftstart
);
5969 s
+= leftstop
- leftstart
;
5971 memcpy (s
, rightstart
, rightstop
- rightstart
);
5972 s
+= rightstop
- rightstart
;
5978 buf
= (char *) xmalloc (20 + strlen (truelab
));
5986 strcpy (s
, truelab
);
5991 /* Parse an MRI structured control expression. This generates test
5992 and branch instructions. STOP is where the expression ends. It
5993 goes to TRUELAB if the condition is true, and to FALSELAB if the
5994 condition is false. Exactly one of TRUELAB and FALSELAB will be
5995 NULL, meaning to fall through. QUAL is the size qualifier for the
5996 expression. EXTENT is the size to use for the branch. */
5999 parse_mri_control_expression (stop
, qual
, truelab
, falselab
, extent
)
6002 const char *truelab
;
6003 const char *falselab
;
6016 if (! parse_mri_control_operand (&cc
, &leftstart
, &leftstop
,
6017 &rightstart
, &rightstop
))
6023 if (strncasecmp (input_line_pointer
, "AND", 3) == 0)
6027 if (falselab
!= NULL
)
6030 flab
= mri_control_label ();
6032 build_mri_control_operand (qual
, cc
, leftstart
, leftstop
, rightstart
,
6033 rightstop
, (const char *) NULL
, flab
, extent
);
6035 input_line_pointer
+= 3;
6036 if (*input_line_pointer
!= '.'
6037 || input_line_pointer
[1] == '\0')
6041 qual
= input_line_pointer
[1];
6042 input_line_pointer
+= 2;
6045 if (! parse_mri_control_operand (&cc
, &leftstart
, &leftstop
,
6046 &rightstart
, &rightstop
))
6052 build_mri_control_operand (qual
, cc
, leftstart
, leftstop
, rightstart
,
6053 rightstop
, truelab
, falselab
, extent
);
6055 if (falselab
== NULL
)
6058 else if (strncasecmp (input_line_pointer
, "OR", 2) == 0)
6062 if (truelab
!= NULL
)
6065 tlab
= mri_control_label ();
6067 build_mri_control_operand (qual
, cc
, leftstart
, leftstop
, rightstart
,
6068 rightstop
, tlab
, (const char *) NULL
, extent
);
6070 input_line_pointer
+= 2;
6071 if (*input_line_pointer
!= '.'
6072 || input_line_pointer
[1] == '\0')
6076 qual
= input_line_pointer
[1];
6077 input_line_pointer
+= 2;
6080 if (! parse_mri_control_operand (&cc
, &leftstart
, &leftstop
,
6081 &rightstart
, &rightstop
))
6087 build_mri_control_operand (qual
, cc
, leftstart
, leftstop
, rightstart
,
6088 rightstop
, truelab
, falselab
, extent
);
6090 if (truelab
== NULL
)
6095 build_mri_control_operand (qual
, cc
, leftstart
, leftstop
, rightstart
,
6096 rightstop
, truelab
, falselab
, extent
);
6100 if (input_line_pointer
!= stop
)
6101 as_bad (_("syntax error in structured control directive"));
6104 /* Handle the MRI IF pseudo-op. This may be a structured control
6105 directive, or it may be a regular assembler conditional, depending
6114 struct mri_control_info
*n
;
6116 /* A structured control directive must end with THEN with an
6117 optional qualifier. */
6118 s
= input_line_pointer
;
6119 while (! is_end_of_line
[(unsigned char) *s
]
6120 && (! flag_mri
|| *s
!= '*'))
6123 while (s
> input_line_pointer
&& (*s
== ' ' || *s
== '\t'))
6126 if (s
- input_line_pointer
> 1
6130 if (s
- input_line_pointer
< 3
6131 || strncasecmp (s
- 3, "THEN", 4) != 0)
6135 as_bad (_("missing then"));
6136 ignore_rest_of_line ();
6140 /* It's a conditional. */
6145 /* Since this might be a conditional if, this pseudo-op will be
6146 called even if we are supported to be ignoring input. Double
6147 check now. Clobber *input_line_pointer so that ignore_input
6148 thinks that this is not a special pseudo-op. */
6149 c
= *input_line_pointer
;
6150 *input_line_pointer
= 0;
6151 if (ignore_input ())
6153 *input_line_pointer
= c
;
6154 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6155 ++input_line_pointer
;
6156 demand_empty_rest_of_line ();
6159 *input_line_pointer
= c
;
6161 n
= push_mri_control (mri_if
);
6163 parse_mri_control_expression (s
- 3, qual
, (const char *) NULL
,
6164 n
->next
, s
[1] == '.' ? s
[2] : '\0');
6167 input_line_pointer
= s
+ 3;
6169 input_line_pointer
= s
+ 1;
6173 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6174 ++input_line_pointer
;
6177 demand_empty_rest_of_line ();
6180 /* Handle the MRI else pseudo-op. If we are currently doing an MRI
6181 structured IF, associate the ELSE with the IF. Otherwise, assume
6182 it is a conditional else. */
6193 && (mri_control_stack
== NULL
6194 || mri_control_stack
->type
!= mri_if
6195 || mri_control_stack
->else_seen
))
6201 c
= *input_line_pointer
;
6202 *input_line_pointer
= 0;
6203 if (ignore_input ())
6205 *input_line_pointer
= c
;
6206 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6207 ++input_line_pointer
;
6208 demand_empty_rest_of_line ();
6211 *input_line_pointer
= c
;
6213 if (mri_control_stack
== NULL
6214 || mri_control_stack
->type
!= mri_if
6215 || mri_control_stack
->else_seen
)
6217 as_bad (_("else without matching if"));
6218 ignore_rest_of_line ();
6222 mri_control_stack
->else_seen
= 1;
6224 buf
= (char *) xmalloc (20 + strlen (mri_control_stack
->bottom
));
6227 sprintf (buf
, "bra%s %s", q
, mri_control_stack
->bottom
);
6231 colon (mri_control_stack
->next
);
6235 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6236 ++input_line_pointer
;
6239 demand_empty_rest_of_line ();
6242 /* Handle the MRI ENDI pseudo-op. */
6246 int ignore ATTRIBUTE_UNUSED
;
6248 if (mri_control_stack
== NULL
6249 || mri_control_stack
->type
!= mri_if
)
6251 as_bad (_("endi without matching if"));
6252 ignore_rest_of_line ();
6256 /* ignore_input will not return true for ENDI, so we don't need to
6257 worry about checking it again here. */
6259 if (! mri_control_stack
->else_seen
)
6260 colon (mri_control_stack
->next
);
6261 colon (mri_control_stack
->bottom
);
6267 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6268 ++input_line_pointer
;
6271 demand_empty_rest_of_line ();
6274 /* Handle the MRI BREAK pseudo-op. */
6277 s_mri_break (extent
)
6280 struct mri_control_info
*n
;
6284 n
= mri_control_stack
;
6286 && n
->type
!= mri_for
6287 && n
->type
!= mri_repeat
6288 && n
->type
!= mri_while
)
6292 as_bad (_("break outside of structured loop"));
6293 ignore_rest_of_line ();
6297 buf
= (char *) xmalloc (20 + strlen (n
->bottom
));
6300 sprintf (buf
, "bra%s %s", ex
, n
->bottom
);
6306 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6307 ++input_line_pointer
;
6310 demand_empty_rest_of_line ();
6313 /* Handle the MRI NEXT pseudo-op. */
6319 struct mri_control_info
*n
;
6323 n
= mri_control_stack
;
6325 && n
->type
!= mri_for
6326 && n
->type
!= mri_repeat
6327 && n
->type
!= mri_while
)
6331 as_bad (_("next outside of structured loop"));
6332 ignore_rest_of_line ();
6336 buf
= (char *) xmalloc (20 + strlen (n
->next
));
6339 sprintf (buf
, "bra%s %s", ex
, n
->next
);
6345 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6346 ++input_line_pointer
;
6349 demand_empty_rest_of_line ();
6352 /* Handle the MRI FOR pseudo-op. */
6358 const char *varstart
, *varstop
;
6359 const char *initstart
, *initstop
;
6360 const char *endstart
, *endstop
;
6361 const char *bystart
, *bystop
;
6365 struct mri_control_info
*n
;
6371 FOR.q var = init { TO | DOWNTO } end [ BY by ] DO.e
6375 varstart
= input_line_pointer
;
6377 /* Look for the '='. */
6378 while (! is_end_of_line
[(unsigned char) *input_line_pointer
]
6379 && *input_line_pointer
!= '=')
6380 ++input_line_pointer
;
6381 if (*input_line_pointer
!= '=')
6383 as_bad (_("missing ="));
6384 ignore_rest_of_line ();
6388 varstop
= input_line_pointer
;
6389 if (varstop
> varstart
6390 && (varstop
[-1] == ' ' || varstop
[-1] == '\t'))
6393 ++input_line_pointer
;
6395 initstart
= input_line_pointer
;
6397 /* Look for TO or DOWNTO. */
6400 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6402 if (strncasecmp (input_line_pointer
, "TO", 2) == 0
6403 && ! is_part_of_name (input_line_pointer
[2]))
6405 initstop
= input_line_pointer
;
6406 input_line_pointer
+= 2;
6409 if (strncasecmp (input_line_pointer
, "DOWNTO", 6) == 0
6410 && ! is_part_of_name (input_line_pointer
[6]))
6412 initstop
= input_line_pointer
;
6414 input_line_pointer
+= 6;
6417 ++input_line_pointer
;
6419 if (initstop
== NULL
)
6421 as_bad (_("missing to or downto"));
6422 ignore_rest_of_line ();
6425 if (initstop
> initstart
6426 && (initstop
[-1] == ' ' || initstop
[-1] == '\t'))
6430 endstart
= input_line_pointer
;
6432 /* Look for BY or DO. */
6435 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6437 if (strncasecmp (input_line_pointer
, "BY", 2) == 0
6438 && ! is_part_of_name (input_line_pointer
[2]))
6440 endstop
= input_line_pointer
;
6442 input_line_pointer
+= 2;
6445 if (strncasecmp (input_line_pointer
, "DO", 2) == 0
6446 && (input_line_pointer
[2] == '.'
6447 || ! is_part_of_name (input_line_pointer
[2])))
6449 endstop
= input_line_pointer
;
6450 input_line_pointer
+= 2;
6453 ++input_line_pointer
;
6455 if (endstop
== NULL
)
6457 as_bad (_("missing do"));
6458 ignore_rest_of_line ();
6461 if (endstop
> endstart
6462 && (endstop
[-1] == ' ' || endstop
[-1] == '\t'))
6468 bystop
= bystart
+ 2;
6473 bystart
= input_line_pointer
;
6477 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6479 if (strncasecmp (input_line_pointer
, "DO", 2) == 0
6480 && (input_line_pointer
[2] == '.'
6481 || ! is_part_of_name (input_line_pointer
[2])))
6483 bystop
= input_line_pointer
;
6484 input_line_pointer
+= 2;
6487 ++input_line_pointer
;
6491 as_bad (_("missing do"));
6492 ignore_rest_of_line ();
6495 if (bystop
> bystart
6496 && (bystop
[-1] == ' ' || bystop
[-1] == '\t'))
6500 if (*input_line_pointer
!= '.')
6504 extent
= input_line_pointer
[1];
6505 input_line_pointer
+= 2;
6508 /* We have fully parsed the FOR operands. Now build the loop. */
6510 n
= push_mri_control (mri_for
);
6512 buf
= (char *) xmalloc (50 + (input_line_pointer
- varstart
));
6523 memcpy (s
, initstart
, initstop
- initstart
);
6524 s
+= initstop
- initstart
;
6526 memcpy (s
, varstart
, varstop
- varstart
);
6527 s
+= varstop
- varstart
;
6541 memcpy (s
, endstart
, endstop
- endstart
);
6542 s
+= endstop
- endstart
;
6544 memcpy (s
, varstart
, varstop
- varstart
);
6545 s
+= varstop
- varstart
;
6553 sprintf (buf
, "blt%s %s", ex
, n
->bottom
);
6555 sprintf (buf
, "bgt%s %s", ex
, n
->bottom
);
6558 /* Put together the add or sub instruction used by ENDF. */
6568 memcpy (s
, bystart
, bystop
- bystart
);
6569 s
+= bystop
- bystart
;
6571 memcpy (s
, varstart
, varstop
- varstart
);
6572 s
+= varstop
- varstart
;
6578 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6579 ++input_line_pointer
;
6582 demand_empty_rest_of_line ();
6585 /* Handle the MRI ENDF pseudo-op. */
6589 int ignore ATTRIBUTE_UNUSED
;
6591 if (mri_control_stack
== NULL
6592 || mri_control_stack
->type
!= mri_for
)
6594 as_bad (_("endf without for"));
6595 ignore_rest_of_line ();
6599 colon (mri_control_stack
->next
);
6601 mri_assemble (mri_control_stack
->incr
);
6603 sprintf (mri_control_stack
->incr
, "bra %s", mri_control_stack
->top
);
6604 mri_assemble (mri_control_stack
->incr
);
6606 free (mri_control_stack
->incr
);
6608 colon (mri_control_stack
->bottom
);
6614 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6615 ++input_line_pointer
;
6618 demand_empty_rest_of_line ();
6621 /* Handle the MRI REPEAT pseudo-op. */
6624 s_mri_repeat (ignore
)
6625 int ignore ATTRIBUTE_UNUSED
;
6627 struct mri_control_info
*n
;
6629 n
= push_mri_control (mri_repeat
);
6633 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6634 ++input_line_pointer
;
6636 demand_empty_rest_of_line ();
6639 /* Handle the MRI UNTIL pseudo-op. */
6647 if (mri_control_stack
== NULL
6648 || mri_control_stack
->type
!= mri_repeat
)
6650 as_bad (_("until without repeat"));
6651 ignore_rest_of_line ();
6655 colon (mri_control_stack
->next
);
6657 for (s
= input_line_pointer
; ! is_end_of_line
[(unsigned char) *s
]; s
++)
6660 parse_mri_control_expression (s
, qual
, (const char *) NULL
,
6661 mri_control_stack
->top
, '\0');
6663 colon (mri_control_stack
->bottom
);
6665 input_line_pointer
= s
;
6671 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6672 ++input_line_pointer
;
6675 demand_empty_rest_of_line ();
6678 /* Handle the MRI WHILE pseudo-op. */
6686 struct mri_control_info
*n
;
6688 s
= input_line_pointer
;
6689 while (! is_end_of_line
[(unsigned char) *s
]
6690 && (! flag_mri
|| *s
!= '*'))
6693 while (*s
== ' ' || *s
== '\t')
6695 if (s
- input_line_pointer
> 1
6698 if (s
- input_line_pointer
< 2
6699 || strncasecmp (s
- 1, "DO", 2) != 0)
6701 as_bad (_("missing do"));
6702 ignore_rest_of_line ();
6706 n
= push_mri_control (mri_while
);
6710 parse_mri_control_expression (s
- 1, qual
, (const char *) NULL
, n
->bottom
,
6711 s
[1] == '.' ? s
[2] : '\0');
6713 input_line_pointer
= s
+ 1;
6714 if (*input_line_pointer
== '.')
6715 input_line_pointer
+= 2;
6719 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6720 ++input_line_pointer
;
6723 demand_empty_rest_of_line ();
6726 /* Handle the MRI ENDW pseudo-op. */
6730 int ignore ATTRIBUTE_UNUSED
;
6734 if (mri_control_stack
== NULL
6735 || mri_control_stack
->type
!= mri_while
)
6737 as_bad (_("endw without while"));
6738 ignore_rest_of_line ();
6742 buf
= (char *) xmalloc (20 + strlen (mri_control_stack
->next
));
6743 sprintf (buf
, "bra %s", mri_control_stack
->next
);
6747 colon (mri_control_stack
->bottom
);
6753 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6754 ++input_line_pointer
;
6757 demand_empty_rest_of_line ();
6762 * Invocation line includes a switch not recognized by the base assembler.
6763 * See if it's a processor-specific option. These are:
6765 * -[A]m[c]68000, -[A]m[c]68008, -[A]m[c]68010, -[A]m[c]68020, -[A]m[c]68030, -[A]m[c]68040
6766 * -[A]m[c]68881, -[A]m[c]68882, -[A]m[c]68851
6767 * Select the architecture. Instructions or features not
6768 * supported by the selected architecture cause fatal
6769 * errors. More than one may be specified. The default is
6770 * -m68020 -m68851 -m68881. Note that -m68008 is a synonym
6771 * for -m68000, and -m68882 is a synonym for -m68881.
6772 * -[A]m[c]no-68851, -[A]m[c]no-68881
6773 * Don't accept 688?1 instructions. (The "c" is kind of silly,
6774 * so don't use or document it, but that's the way the parsing
6777 * -pic Indicates PIC.
6778 * -k Indicates PIC. (Sun 3 only.)
6779 * --pcrel Never turn PC-relative branches into absolute jumps.
6782 * Permit `|' to be used in expressions.
6787 CONST
char *md_shortopts
= "lSA:m:kQ:V";
6789 CONST
char *md_shortopts
= "lSA:m:k";
6792 struct option md_longopts
[] = {
6793 #define OPTION_PIC (OPTION_MD_BASE)
6794 {"pic", no_argument
, NULL
, OPTION_PIC
},
6795 #define OPTION_REGISTER_PREFIX_OPTIONAL (OPTION_MD_BASE + 1)
6796 {"register-prefix-optional", no_argument
, NULL
,
6797 OPTION_REGISTER_PREFIX_OPTIONAL
},
6798 #define OPTION_BITWISE_OR (OPTION_MD_BASE + 2)
6799 {"bitwise-or", no_argument
, NULL
, OPTION_BITWISE_OR
},
6800 #define OPTION_BASE_SIZE_DEFAULT_16 (OPTION_MD_BASE + 3)
6801 {"base-size-default-16", no_argument
, NULL
, OPTION_BASE_SIZE_DEFAULT_16
},
6802 #define OPTION_BASE_SIZE_DEFAULT_32 (OPTION_MD_BASE + 4)
6803 {"base-size-default-32", no_argument
, NULL
, OPTION_BASE_SIZE_DEFAULT_32
},
6804 #define OPTION_DISP_SIZE_DEFAULT_16 (OPTION_MD_BASE + 5)
6805 {"disp-size-default-16", no_argument
, NULL
, OPTION_DISP_SIZE_DEFAULT_16
},
6806 #define OPTION_DISP_SIZE_DEFAULT_32 (OPTION_MD_BASE + 6)
6807 {"disp-size-default-32", no_argument
, NULL
, OPTION_DISP_SIZE_DEFAULT_32
},
6808 #define OPTION_PCREL (OPTION_MD_BASE + 7)
6809 {"pcrel", no_argument
, NULL
, OPTION_PCREL
},
6810 {NULL
, no_argument
, NULL
, 0}
6812 size_t md_longopts_size
= sizeof(md_longopts
);
6815 md_parse_option (c
, arg
)
6821 case 'l': /* -l means keep external to 2 bit offset
6822 rather than 16 bit one */
6823 flag_short_refs
= 1;
6826 case 'S': /* -S means that jbsr's always turn into
6828 flag_long_jumps
= 1;
6831 case OPTION_PCREL
: /* --pcrel means never turn PC-relative
6832 branches into absolute jumps. */
6833 flag_keep_pcrel
= 1;
6839 /* intentional fall-through */
6842 if (arg
[0] == 'n' && arg
[1] == 'o' && arg
[2] == '-')
6846 const char *oarg
= arg
;
6852 if (arg
[0] == 'c' && arg
[1] == '6')
6855 for (i
= 0; i
< n_archs
; i
++)
6856 if (!strcmp (arg
, archs
[i
].name
))
6861 as_bad (_("unrecognized option `%s'"), oarg
);
6864 arch
= archs
[i
].arch
;
6867 else if (arch
== m68851
)
6876 if (arg
[0] == 'c' && arg
[1] == '6')
6879 for (i
= 0; i
< n_archs
; i
++)
6880 if (!strcmp (arg
, archs
[i
].name
))
6882 unsigned long arch
= archs
[i
].arch
;
6883 if (cpu_of_arch (arch
))
6884 /* It's a cpu spec. */
6886 current_architecture
&= ~m68000up
;
6887 current_architecture
|= arch
;
6889 else if (arch
== m68881
)
6891 current_architecture
|= m68881
;
6894 else if (arch
== m68851
)
6896 current_architecture
|= m68851
;
6906 as_bad (_("unrecognized architecture specification `%s'"), arg
);
6915 break; /* -pic, Position Independent Code */
6917 case OPTION_REGISTER_PREFIX_OPTIONAL
:
6918 flag_reg_prefix_optional
= 1;
6919 reg_prefix_optional_seen
= 1;
6922 /* -V: SVR4 argument to print version ID. */
6924 print_version_id ();
6927 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
6928 should be emitted or not. FIXME: Not implemented. */
6932 case OPTION_BITWISE_OR
:
6937 n
= (char *) xmalloc (strlen (m68k_comment_chars
) + 1);
6939 for (s
= m68k_comment_chars
; *s
!= '\0'; s
++)
6943 m68k_comment_chars
= n
;
6947 case OPTION_BASE_SIZE_DEFAULT_16
:
6948 m68k_index_width_default
= SIZE_WORD
;
6951 case OPTION_BASE_SIZE_DEFAULT_32
:
6952 m68k_index_width_default
= SIZE_LONG
;
6955 case OPTION_DISP_SIZE_DEFAULT_16
:
6957 m68k_rel32_from_cmdline
= 1;
6960 case OPTION_DISP_SIZE_DEFAULT_32
:
6962 m68k_rel32_from_cmdline
= 1;
6973 md_show_usage (stream
)
6976 fprintf(stream
, _("\
6978 -l use 1 word for refs to undefined symbols [default 2]\n\
6979 -m68000 | -m68008 | -m68010 | -m68020 | -m68030 | -m68040 | -m68060\n\
6980 | -m68302 | -m68331 | -m68332 | -m68333 | -m68340 | -m68360\n\
6981 | -mcpu32 | -m5200\n\
6982 specify variant of 680X0 architecture [default 68020]\n\
6983 -m68881 | -m68882 | -mno-68881 | -mno-68882\n\
6984 target has/lacks floating-point coprocessor\n\
6985 [default yes for 68020, 68030, and cpu32]\n"));
6986 fprintf(stream
, _("\
6987 -m68851 | -mno-68851\n\
6988 target has/lacks memory-management unit coprocessor\n\
6989 [default yes for 68020 and up]\n\
6990 -pic, -k generate position independent code\n\
6991 -S turn jbsr into jsr\n\
6992 --pcrel never turn PC-relative branches into absolute jumps\n\
6993 --register-prefix-optional\n\
6994 recognize register names without prefix character\n\
6995 --bitwise-or do not treat `|' as a comment character\n"));
6996 fprintf (stream
, _("\
6997 --base-size-default-16 base reg without size is 16 bits\n\
6998 --base-size-default-32 base reg without size is 32 bits (default)\n\
6999 --disp-size-default-16 displacement with unknown size is 16 bits\n\
7000 --disp-size-default-32 displacement with unknown size is 32 bits (default)\n"));
7005 /* TEST2: Test md_assemble() */
7006 /* Warning, this routine probably doesn't work anymore */
7010 struct m68k_it the_ins
;
7018 if (!gets (buf
) || !*buf
)
7020 if (buf
[0] == '|' || buf
[1] == '.')
7022 for (cp
= buf
; *cp
; cp
++)
7027 memset (&the_ins
, '\0', sizeof (the_ins
));
7028 m68k_ip (&the_ins
, buf
);
7031 printf (_("Error %s in %s\n"), the_ins
.error
, buf
);
7035 printf (_("Opcode(%d.%s): "), the_ins
.numo
, the_ins
.args
);
7036 for (n
= 0; n
< the_ins
.numo
; n
++)
7037 printf (" 0x%x", the_ins
.opcode
[n
] & 0xffff);
7039 print_the_insn (&the_ins
.opcode
[0], stdout
);
7040 (void) putchar ('\n');
7042 for (n
= 0; n
< strlen (the_ins
.args
) / 2; n
++)
7044 if (the_ins
.operands
[n
].error
)
7046 printf ("op%d Error %s in %s\n", n
, the_ins
.operands
[n
].error
, buf
);
7049 printf ("mode %d, reg %d, ", the_ins
.operands
[n
].mode
, the_ins
.operands
[n
].reg
);
7050 if (the_ins
.operands
[n
].b_const
)
7051 printf ("Constant: '%.*s', ", 1 + the_ins
.operands
[n
].e_const
- the_ins
.operands
[n
].b_const
, the_ins
.operands
[n
].b_const
);
7052 printf ("ireg %d, isiz %d, imul %d, ", the_ins
.operands
[n
].ireg
, the_ins
.operands
[n
].isiz
, the_ins
.operands
[n
].imul
);
7053 if (the_ins
.operands
[n
].b_iadd
)
7054 printf ("Iadd: '%.*s',", 1 + the_ins
.operands
[n
].e_iadd
- the_ins
.operands
[n
].b_iadd
, the_ins
.operands
[n
].b_iadd
);
7055 (void) putchar ('\n');
7067 while (*str
&& *str
!= ' ')
7069 if (str
[-1] == ':' || str
[1] == '=')
7076 /* Possible states for relaxation:
7078 0 0 branch offset byte (bra, etc)
7082 1 0 indexed offsets byte a0@(32,d4:w:1) etc
7086 2 0 two-offset index word-word a0@(32,d4)@(45) etc
7093 /* We have no need to default values of symbols. */
7097 md_undefined_symbol (name
)
7098 char *name ATTRIBUTE_UNUSED
;
7103 /* Round up a section size to the appropriate boundary. */
7105 md_section_align (segment
, size
)
7106 segT segment ATTRIBUTE_UNUSED
;
7110 #ifdef BFD_ASSEMBLER
7111 /* For a.out, force the section size to be aligned. If we don't do
7112 this, BFD will align it for us, but it will not write out the
7113 final bytes of the section. This may be a bug in BFD, but it is
7114 easier to fix it here since that is how the other a.out targets
7118 align
= bfd_get_section_alignment (stdoutput
, segment
);
7119 size
= ((size
+ (1 << align
) - 1) & ((valueT
) -1 << align
));
7126 /* Exactly what point is a PC-relative offset relative TO?
7127 On the 68k, it is relative to the address of the first extension
7128 word. The difference between the addresses of the offset and the
7129 first extension word is stored in fx_pcrel_adjust. */
7131 md_pcrel_from (fixP
)
7136 /* Because fx_pcrel_adjust is a char, and may be unsigned, we store
7138 adjust
= fixP
->fx_pcrel_adjust
;
7141 return fixP
->fx_where
+ fixP
->fx_frag
->fr_address
- adjust
;
7144 #ifndef BFD_ASSEMBLER
7149 tc_coff_symbol_emit_hook (ignore
)
7150 symbolS
*ignore ATTRIBUTE_UNUSED
;
7155 tc_coff_sizemachdep (frag
)
7158 switch (frag
->fr_subtype
& 0x3)
7175 void m68k_elf_final_processing()
7177 /* Set file-specific flags if this is a cpu32 processor */
7178 if (cpu_of_arch (current_architecture
) & cpu32
)
7179 elf_elfheader (stdoutput
)->e_flags
|= EF_CPU32
;
7182 /* end of tc-m68k.c */