1 /* tc-m68k.c -- Assemble for the m68k family
2 Copyright 1987, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
4 Free Software Foundation, Inc.
6 This file is part of GAS, the GNU Assembler.
8 GAS is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
13 GAS is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GAS; see the file COPYING. If not, write to the Free
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
28 #include "opcode/m68k.h"
29 #include "m68k-parse.h"
35 /* This string holds the chars that always start a comment. If the
36 pre-processor is disabled, these aren't very useful. The macro
37 tc_comment_chars points to this. We use this, rather than the
38 usual comment_chars, so that the --bitwise-or option will work. */
39 #if defined (TE_SVR4) || defined (TE_DELTA)
40 const char *m68k_comment_chars
= "|#";
42 const char *m68k_comment_chars
= "|";
45 /* This array holds the chars that only start a comment at the beginning of
46 a line. If the line seems to have the form '# 123 filename'
47 .line and .file directives will appear in the pre-processed output */
48 /* Note that input_file.c hand checks for '#' at the beginning of the
49 first line of the input file. This is because the compiler outputs
50 #NO_APP at the beginning of its output. */
51 /* Also note that comments like this one will always work. */
52 const char line_comment_chars
[] = "#*";
54 const char line_separator_chars
[] = ";";
56 /* Chars that can be used to separate mant from exp in floating point nums */
57 CONST
char EXP_CHARS
[] = "eE";
59 /* Chars that mean this number is a floating point constant, as
60 in "0f12.456" or "0d1.2345e12". */
62 CONST
char FLT_CHARS
[] = "rRsSfFdDxXeEpP";
64 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
65 changed in read.c . Ideally it shouldn't have to know about it at all,
66 but nothing is ideal around here. */
68 const int md_reloc_size
= 8; /* Size of relocation record */
70 /* Are we trying to generate PIC code? If so, absolute references
71 ought to be made into linkage table references or pc-relative
72 references. Not implemented. For ELF there are other means
73 to denote pic relocations. */
76 static int flag_short_refs
; /* -l option */
77 static int flag_long_jumps
; /* -S option */
78 static int flag_keep_pcrel
; /* --pcrel option. */
80 #ifdef REGISTER_PREFIX_OPTIONAL
81 int flag_reg_prefix_optional
= REGISTER_PREFIX_OPTIONAL
;
83 int flag_reg_prefix_optional
;
86 /* Whether --register-prefix-optional was used on the command line. */
87 static int reg_prefix_optional_seen
;
89 /* The floating point coprocessor to use by default. */
90 static enum m68k_register m68k_float_copnum
= COP1
;
92 /* If this is non-zero, then references to number(%pc) will be taken
93 to refer to number, rather than to %pc + number. */
94 static int m68k_abspcadd
;
96 /* If this is non-zero, then the quick forms of the move, add, and sub
97 instructions are used when possible. */
98 static int m68k_quick
= 1;
100 /* If this is non-zero, then if the size is not specified for a base
101 or outer displacement, the assembler assumes that the size should
103 static int m68k_rel32
= 1;
105 /* This is non-zero if m68k_rel32 was set from the command line. */
106 static int m68k_rel32_from_cmdline
;
108 /* The default width to use for an index register when using a base
110 static enum m68k_size m68k_index_width_default
= SIZE_LONG
;
112 /* We want to warn if any text labels are misaligned. In order to get
113 the right line number, we need to record the line number for each
118 struct label_line
*next
;
125 /* The list of labels. */
127 static struct label_line
*labels
;
129 /* The current label. */
131 static struct label_line
*current_label
;
133 /* Its an arbitrary name: This means I don't approve of it */
134 /* See flames below */
135 static struct obstack robyn
;
139 const char *m_operands
;
140 unsigned long m_opcode
;
144 struct m68k_incant
*m_next
;
147 #define getone(x) ((((x)->m_opcode)>>16)&0xffff)
148 #define gettwo(x) (((x)->m_opcode)&0xffff)
150 static const enum m68k_register m68000_control_regs
[] = { 0 };
151 static const enum m68k_register m68010_control_regs
[] = {
155 static const enum m68k_register m68020_control_regs
[] = {
156 SFC
, DFC
, USP
, VBR
, CACR
, CAAR
, MSP
, ISP
,
159 static const enum m68k_register m68040_control_regs
[] = {
160 SFC
, DFC
, CACR
, TC
, ITT0
, ITT1
, DTT0
, DTT1
,
161 USP
, VBR
, MSP
, ISP
, MMUSR
, URP
, SRP
,
164 static const enum m68k_register m68060_control_regs
[] = {
165 SFC
, DFC
, CACR
, TC
, ITT0
, ITT1
, DTT0
, DTT1
, BUSCR
,
166 USP
, VBR
, URP
, SRP
, PCR
,
169 static const enum m68k_register mcf_control_regs
[] = {
170 CACR
, TC
, ITT0
, ITT1
, DTT0
, DTT1
, VBR
, ROMBAR
,
171 RAMBAR0
, RAMBAR1
, MBAR
,
174 #define cpu32_control_regs m68010_control_regs
176 static const enum m68k_register
*control_regs
;
178 /* internal form of a 68020 instruction */
182 const char *args
; /* list of opcode info */
185 int numo
; /* Number of shorts in opcode */
188 struct m68k_op operands
[6];
190 int nexp
; /* number of exprs in use */
191 struct m68k_exp exprs
[4];
193 int nfrag
; /* Number of frags we have to produce */
196 int fragoff
; /* Where in the current opcode the frag ends */
203 int nrel
; /* Num of reloc strucs in use */
210 /* In a pc relative address the difference between the address
211 of the offset and the address that the offset is relative
212 to. This depends on the addressing mode. Basically this
213 is the value to put in the offset field to address the
214 first byte of the offset, without regarding the special
215 significance of some values (in the branch instruction, for
219 /* Whether this expression needs special pic relocation, and if
221 enum pic_relocation pic_reloc
;
224 reloc
[5]; /* Five is enough??? */
227 #define cpu_of_arch(x) ((x) & (m68000up|mcf))
228 #define float_of_arch(x) ((x) & mfloat)
229 #define mmu_of_arch(x) ((x) & mmmu)
230 #define arch_coldfire_p(x) (((x) & mcf) != 0)
232 /* Macros for determining if cpu supports a specific addressing mode */
233 #define HAVE_LONG_BRANCH(x) ((x) & (m68020|m68030|m68040|m68060|cpu32|mcf5407))
235 static struct m68k_it the_ins
; /* the instruction being assembled */
237 #define op(ex) ((ex)->exp.X_op)
238 #define adds(ex) ((ex)->exp.X_add_symbol)
239 #define subs(ex) ((ex)->exp.X_op_symbol)
240 #define offs(ex) ((ex)->exp.X_add_number)
242 /* Macros for adding things to the m68k_it struct */
244 #define addword(w) the_ins.opcode[the_ins.numo++]=(w)
246 /* Static functions. */
248 static void insop
PARAMS ((int, const struct m68k_incant
*));
249 static void add_fix
PARAMS ((int, struct m68k_exp
*, int, int));
250 static void add_frag
PARAMS ((symbolS
*, offsetT
, int));
252 /* Like addword, but goes BEFORE general operands */
256 const struct m68k_incant
*opcode
;
259 for(z
=the_ins
.numo
;z
>opcode
->m_codenum
;--z
)
260 the_ins
.opcode
[z
]=the_ins
.opcode
[z
-1];
261 for(z
=0;z
<the_ins
.nrel
;z
++)
262 the_ins
.reloc
[z
].n
+=2;
263 for (z
= 0; z
< the_ins
.nfrag
; z
++)
264 the_ins
.fragb
[z
].fragoff
++;
265 the_ins
.opcode
[opcode
->m_codenum
]=w
;
269 /* The numo+1 kludge is so we can hit the low order byte of the prev word.
272 add_fix (width
, exp
, pc_rel
, pc_fix
)
274 struct m68k_exp
*exp
;
278 the_ins
.reloc
[the_ins
.nrel
].n
= ((width
== 'B' || width
== '3')
282 : (the_ins
.numo
*2)));
283 the_ins
.reloc
[the_ins
.nrel
].exp
= exp
->exp
;
284 the_ins
.reloc
[the_ins
.nrel
].wid
= width
;
285 the_ins
.reloc
[the_ins
.nrel
].pcrel_fix
= pc_fix
;
287 the_ins
.reloc
[the_ins
.nrel
].pic_reloc
= exp
->pic_reloc
;
289 the_ins
.reloc
[the_ins
.nrel
++].pcrel
= pc_rel
;
292 /* Cause an extra frag to be generated here, inserting up to 10 bytes
293 (that value is chosen in the frag_var call in md_assemble). TYPE
294 is the subtype of the frag to be generated; its primary type is
295 rs_machine_dependent.
297 The TYPE parameter is also used by md_convert_frag_1 and
298 md_estimate_size_before_relax. The appropriate type of fixup will
299 be emitted by md_convert_frag_1.
301 ADD becomes the FR_SYMBOL field of the frag, and OFF the FR_OFFSET. */
303 add_frag (add
, off
, type
)
308 the_ins
.fragb
[the_ins
.nfrag
].fragoff
=the_ins
.numo
;
309 the_ins
.fragb
[the_ins
.nfrag
].fadd
=add
;
310 the_ins
.fragb
[the_ins
.nfrag
].foff
=off
;
311 the_ins
.fragb
[the_ins
.nfrag
++].fragty
=type
;
315 (op (ex) != O_constant && op (ex) != O_big)
317 static char *crack_operand
PARAMS ((char *str
, struct m68k_op
*opP
));
318 static int get_num
PARAMS ((struct m68k_exp
*exp
, int ok
));
319 static void m68k_ip
PARAMS ((char *));
320 static void insert_reg
PARAMS ((const char *, int));
321 static void select_control_regs
PARAMS ((void));
322 static void init_regtable
PARAMS ((void));
323 static int reverse_16_bits
PARAMS ((int in
));
324 static int reverse_8_bits
PARAMS ((int in
));
325 static void install_gen_operand
PARAMS ((int mode
, int val
));
326 static void install_operand
PARAMS ((int mode
, int val
));
327 static void s_bss
PARAMS ((int));
328 static void s_data1
PARAMS ((int));
329 static void s_data2
PARAMS ((int));
330 static void s_even
PARAMS ((int));
331 static void s_proc
PARAMS ((int));
332 static void mri_chip
PARAMS ((void));
333 static void s_chip
PARAMS ((int));
334 static void s_fopt
PARAMS ((int));
335 static void s_opt
PARAMS ((int));
336 static void s_reg
PARAMS ((int));
337 static void s_restore
PARAMS ((int));
338 static void s_save
PARAMS ((int));
339 static void s_mri_if
PARAMS ((int));
340 static void s_mri_else
PARAMS ((int));
341 static void s_mri_endi
PARAMS ((int));
342 static void s_mri_break
PARAMS ((int));
343 static void s_mri_next
PARAMS ((int));
344 static void s_mri_for
PARAMS ((int));
345 static void s_mri_endf
PARAMS ((int));
346 static void s_mri_repeat
PARAMS ((int));
347 static void s_mri_until
PARAMS ((int));
348 static void s_mri_while
PARAMS ((int));
349 static void s_mri_endw
PARAMS ((int));
350 static void md_apply_fix_2
PARAMS ((fixS
*, offsetT
));
351 static void md_convert_frag_1
PARAMS ((fragS
*));
353 static int current_architecture
;
362 static const struct m68k_cpu archs
[] =
364 { m68000
, "68000", 0 },
365 { m68010
, "68010", 0 },
366 { m68020
, "68020", 0 },
367 { m68030
, "68030", 0 },
368 { m68040
, "68040", 0 },
369 { m68060
, "68060", 0 },
370 { cpu32
, "cpu32", 0 },
371 { m68881
, "68881", 0 },
372 { m68851
, "68851", 0 },
373 { mcf5200
, "5200", 0 },
374 { mcf5206e
, "5206e", 0 },
375 { mcf5307
, "5307", 0},
376 { mcf5407
, "5407", 0},
377 /* Aliases (effectively, so far as gas is concerned) for the above
379 { m68020
, "68k", 1 },
380 { m68000
, "68008", 1 },
381 { m68000
, "68302", 1 },
382 { m68000
, "68306", 1 },
383 { m68000
, "68307", 1 },
384 { m68000
, "68322", 1 },
385 { m68000
, "68356", 1 },
386 { m68000
, "68ec000", 1 },
387 { m68000
, "68hc000", 1 },
388 { m68000
, "68hc001", 1 },
389 { m68020
, "68ec020", 1 },
390 { m68030
, "68ec030", 1 },
391 { m68040
, "68ec040", 1 },
392 { m68060
, "68ec060", 1 },
393 { cpu32
, "68330", 1 },
394 { cpu32
, "68331", 1 },
395 { cpu32
, "68332", 1 },
396 { cpu32
, "68333", 1 },
397 { cpu32
, "68334", 1 },
398 { cpu32
, "68336", 1 },
399 { cpu32
, "68340", 1 },
400 { cpu32
, "68341", 1 },
401 { cpu32
, "68349", 1 },
402 { cpu32
, "68360", 1 },
403 { m68881
, "68882", 1 },
404 { mcf5200
, "5202", 1 },
405 { mcf5200
, "5204", 1 },
406 { mcf5200
, "5206", 1 },
409 static const int n_archs
= sizeof (archs
) / sizeof (archs
[0]);
411 /* This is the assembler relaxation table for m68k. m68k is a rich CISC
412 architecture and we have a lot of relaxation modes. */
414 /* Macros used in the relaxation code. */
415 #define TAB(x,y) (((x) << 2) + (y))
416 #define TABTYPE(x) ((x) >> 2)
418 /* Relaxation states. */
424 /* Here are all the relaxation modes we support. First we can relax ordinary
425 branches. On 68020 and higher and on CPU32 all branch instructions take
426 three forms, so on these CPUs all branches always remain as such. When we
427 have to expand to the LONG form on a 68000, though, we substitute an
428 absolute jump instead. This is a direct replacement for unconditional
429 branches and a branch over a jump for conditional branches. However, if the
430 user requires PIC and disables this with --pcrel, we can only relax between
431 BYTE and SHORT forms, punting if that isn't enough. This gives us four
432 different relaxation modes for branches: */
434 #define BRANCHBWL 1 /* branch byte, word, or long */
435 #define BRABSJUNC 2 /* absolute jump for LONG, unconditional */
436 #define BRABSJCOND 3 /* absolute jump for LONG, conditional */
437 #define BRANCHBW 4 /* branch byte or word */
439 /* We also relax coprocessor branches and DBcc's. All CPUs that support
440 coprocessor branches support them in word and long forms, so we have only
441 one relaxation mode for them. DBcc's are word only on all CPUs. We can
442 relax them to the LONG form with a branch-around sequence. This sequence
443 can use a long branch (if available) or an absolute jump (if acceptable).
444 This gives us two relaxation modes. If long branches are not available and
445 absolute jumps are not acceptable, we don't relax DBcc's. */
447 #define FBRANCH 5 /* coprocessor branch */
448 #define DBCCLBR 6 /* DBcc relaxable with a long branch */
449 #define DBCCABSJ 7 /* DBcc relaxable with an absolute jump */
451 /* That's all for instruction relaxation. However, we also relax PC-relative
452 operands. Specifically, we have three operand relaxation modes. On the
453 68000 PC-relative operands can only be 16-bit, but on 68020 and higher and
454 on CPU32 they may be 16-bit or 32-bit. For the latter we relax between the
455 two. Also PC+displacement+index operands in their simple form (with a non-
456 suppressed index without memory indirection) are supported on all CPUs, but
457 on the 68000 the displacement can be 8-bit only, whereas on 68020 and higher
458 and on CPU32 we relax it to SHORT and LONG forms as well using the extended
459 form of the PC+displacement+index operand. Finally, some absolute operands
460 can be relaxed down to 16-bit PC-relative. */
462 #define PCREL1632 8 /* 16-bit or 32-bit PC-relative */
463 #define PCINDEX 9 /* PC+displacement+index */
464 #define ABSTOPCREL 10 /* absolute relax down to 16-bit PC-relative */
466 /* Note that calls to frag_var need to specify the maximum expansion
467 needed; this is currently 10 bytes for DBCC. */
470 How far Forward this mode will reach:
471 How far Backward this mode will reach:
472 How many bytes this mode will add to the size of the frag
473 Which mode to go to if the offset won't fit in this one
475 relax_typeS md_relax_table
[] =
477 {1, 1, 0, 0}, /* First entries aren't used */
478 {1, 1, 0, 0}, /* For no good reason except */
479 {1, 1, 0, 0}, /* that the VAX doesn't either */
482 {(127), (-128), 0, TAB (BRANCHBWL
, SHORT
)},
483 {(32767), (-32768), 2, TAB (BRANCHBWL
, LONG
)},
487 {(127), (-128), 0, TAB (BRABSJUNC
, SHORT
)},
488 {(32767), (-32768), 2, TAB (BRABSJUNC
, LONG
)},
492 {(127), (-128), 0, TAB (BRABSJCOND
, SHORT
)},
493 {(32767), (-32768), 2, TAB (BRABSJCOND
, LONG
)},
497 {(127), (-128), 0, TAB (BRANCHBW
, SHORT
)},
502 {1, 1, 0, 0}, /* FBRANCH doesn't come BYTE */
503 {(32767), (-32768), 2, TAB (FBRANCH
, LONG
)},
507 {1, 1, 0, 0}, /* DBCC doesn't come BYTE */
508 {(32767), (-32768), 2, TAB (DBCCLBR
, LONG
)},
512 {1, 1, 0, 0}, /* DBCC doesn't come BYTE */
513 {(32767), (-32768), 2, TAB (DBCCABSJ
, LONG
)},
517 {1, 1, 0, 0}, /* PCREL1632 doesn't come BYTE */
518 {32767, -32768, 2, TAB (PCREL1632
, LONG
)},
522 {125, -130, 0, TAB (PCINDEX
, SHORT
)},
523 {32765, -32770, 2, TAB (PCINDEX
, LONG
)},
527 {1, 1, 0, 0}, /* ABSTOPCREL doesn't come BYTE */
528 {(32767), (-32768), 2, TAB (ABSTOPCREL
, LONG
)},
533 /* These are the machine dependent pseudo-ops. These are included so
534 the assembler can work on the output from the SUN C compiler, which
538 /* This table describes all the machine specific pseudo-ops the assembler
539 has to support. The fields are:
540 pseudo-op name without dot
541 function to call to execute this pseudo-op
542 Integer arg to pass to the function
544 const pseudo_typeS md_pseudo_table
[] =
546 {"data1", s_data1
, 0},
547 {"data2", s_data2
, 0},
550 {"skip", s_space
, 0},
552 #if defined (TE_SUN3) || defined (OBJ_ELF)
553 {"align", s_align_bytes
, 0},
556 {"swbeg", s_ignore
, 0},
558 {"extend", float_cons
, 'x'},
559 {"ldouble", float_cons
, 'x'},
561 /* The following pseudo-ops are supported for MRI compatibility. */
563 {"comline", s_space
, 1},
565 {"mask2", s_ignore
, 0},
568 {"restore", s_restore
, 0},
572 {"if.b", s_mri_if
, 'b'},
573 {"if.w", s_mri_if
, 'w'},
574 {"if.l", s_mri_if
, 'l'},
575 {"else", s_mri_else
, 0},
576 {"else.s", s_mri_else
, 's'},
577 {"else.l", s_mri_else
, 'l'},
578 {"endi", s_mri_endi
, 0},
579 {"break", s_mri_break
, 0},
580 {"break.s", s_mri_break
, 's'},
581 {"break.l", s_mri_break
, 'l'},
582 {"next", s_mri_next
, 0},
583 {"next.s", s_mri_next
, 's'},
584 {"next.l", s_mri_next
, 'l'},
585 {"for", s_mri_for
, 0},
586 {"for.b", s_mri_for
, 'b'},
587 {"for.w", s_mri_for
, 'w'},
588 {"for.l", s_mri_for
, 'l'},
589 {"endf", s_mri_endf
, 0},
590 {"repeat", s_mri_repeat
, 0},
591 {"until", s_mri_until
, 0},
592 {"until.b", s_mri_until
, 'b'},
593 {"until.w", s_mri_until
, 'w'},
594 {"until.l", s_mri_until
, 'l'},
595 {"while", s_mri_while
, 0},
596 {"while.b", s_mri_while
, 'b'},
597 {"while.w", s_mri_while
, 'w'},
598 {"while.l", s_mri_while
, 'l'},
599 {"endw", s_mri_endw
, 0},
604 /* The mote pseudo ops are put into the opcode table, since they
605 don't start with a . they look like opcodes to gas.
609 extern void obj_coff_section
PARAMS ((int));
612 CONST pseudo_typeS mote_pseudo_table
[] =
625 {"xdef", s_globl
, 0},
627 {"align", s_align_bytes
, 0},
629 {"align", s_align_ptwo
, 0},
632 {"sect", obj_coff_section
, 0},
633 {"section", obj_coff_section
, 0},
638 #define issbyte(x) ((x)>=-128 && (x)<=127)
639 #define isubyte(x) ((x)>=0 && (x)<=255)
640 #define issword(x) ((x)>=-32768 && (x)<=32767)
641 #define isuword(x) ((x)>=0 && (x)<=65535)
643 #define isbyte(x) ((x)>= -255 && (x)<=255)
644 #define isword(x) ((x)>=-65536 && (x)<=65535)
645 #define islong(x) (1)
647 extern char *input_line_pointer
;
649 static char mklower_table
[256];
650 #define mklower(c) (mklower_table[(unsigned char) (c)])
651 static char notend_table
[256];
652 static char alt_notend_table
[256];
654 (! (notend_table[(unsigned char) *s] \
656 && alt_notend_table[(unsigned char) s[1]])))
658 #if defined (M68KCOFF) && !defined (BFD_ASSEMBLER)
660 #ifdef NO_PCREL_RELOCS
663 make_pcrel_absolute(fixP
, add_number
)
667 register unsigned char *opcode
= fixP
->fx_frag
->fr_opcode
;
669 /* rewrite the PC relative instructions to absolute address ones.
670 * these are rumoured to be faster, and the apollo linker refuses
671 * to deal with the PC relative relocations.
673 if (opcode
[0] == 0x60 && opcode
[1] == 0xff) /* BRA -> JMP */
678 else if (opcode
[0] == 0x61 && opcode
[1] == 0xff) /* BSR -> JSR */
684 as_fatal (_("Unknown PC relative instruction"));
689 #endif /* NO_PCREL_RELOCS */
692 tc_coff_fix2rtype (fixP
)
695 if (fixP
->fx_tcbit
&& fixP
->fx_size
== 4)
696 return R_RELLONG_NEG
;
697 #ifdef NO_PCREL_RELOCS
698 know (fixP
->fx_pcrel
== 0);
699 return (fixP
->fx_size
== 1 ? R_RELBYTE
700 : fixP
->fx_size
== 2 ? R_DIR16
703 return (fixP
->fx_pcrel
?
704 (fixP
->fx_size
== 1 ? R_PCRBYTE
:
705 fixP
->fx_size
== 2 ? R_PCRWORD
:
707 (fixP
->fx_size
== 1 ? R_RELBYTE
:
708 fixP
->fx_size
== 2 ? R_RELWORD
:
717 /* Return zero if the reference to SYMBOL from within the same segment may
720 /* On an ELF system, we can't relax an externally visible symbol,
721 because it may be overridden by a shared library. However, if
722 TARGET_OS is "elf", then we presume that we are assembling for an
723 embedded system, in which case we don't have to worry about shared
724 libraries, and we can relax any external sym. */
726 #define relaxable_symbol(symbol) \
727 (!((S_IS_EXTERNAL (symbol) && strcmp (TARGET_OS, "elf") != 0) \
728 || S_IS_WEAK (symbol)))
730 /* Compute the relocation code for a fixup of SIZE bytes, using pc
731 relative relocation if PCREL is non-zero. PIC says whether a special
732 pic relocation was requested. */
734 static bfd_reloc_code_real_type get_reloc_code
735 PARAMS ((int, int, enum pic_relocation
));
737 static bfd_reloc_code_real_type
738 get_reloc_code (size
, pcrel
, pic
)
741 enum pic_relocation pic
;
749 return BFD_RELOC_8_GOT_PCREL
;
751 return BFD_RELOC_16_GOT_PCREL
;
753 return BFD_RELOC_32_GOT_PCREL
;
761 return BFD_RELOC_8_GOTOFF
;
763 return BFD_RELOC_16_GOTOFF
;
765 return BFD_RELOC_32_GOTOFF
;
773 return BFD_RELOC_8_PLT_PCREL
;
775 return BFD_RELOC_16_PLT_PCREL
;
777 return BFD_RELOC_32_PLT_PCREL
;
785 return BFD_RELOC_8_PLTOFF
;
787 return BFD_RELOC_16_PLTOFF
;
789 return BFD_RELOC_32_PLTOFF
;
799 return BFD_RELOC_8_PCREL
;
801 return BFD_RELOC_16_PCREL
;
803 return BFD_RELOC_32_PCREL
;
823 as_bad (_("Can not do %d byte pc-relative relocation"), size
);
825 as_bad (_("Can not do %d byte pc-relative pic relocation"), size
);
830 as_bad (_("Can not do %d byte relocation"), size
);
832 as_bad (_("Can not do %d byte pic relocation"), size
);
835 return BFD_RELOC_NONE
;
838 /* Here we decide which fixups can be adjusted to make them relative
839 to the beginning of the section instead of the symbol. Basically
840 we need to make sure that the dynamic relocations are done
841 correctly, so in some cases we force the original symbol to be
844 tc_m68k_fix_adjustable (fixP
)
847 /* Prevent all adjustments to global symbols. */
848 if (! relaxable_symbol (fixP
->fx_addsy
))
851 /* adjust_reloc_syms doesn't know about the GOT */
852 switch (fixP
->fx_r_type
)
854 case BFD_RELOC_8_GOT_PCREL
:
855 case BFD_RELOC_16_GOT_PCREL
:
856 case BFD_RELOC_32_GOT_PCREL
:
857 case BFD_RELOC_8_GOTOFF
:
858 case BFD_RELOC_16_GOTOFF
:
859 case BFD_RELOC_32_GOTOFF
:
860 case BFD_RELOC_8_PLT_PCREL
:
861 case BFD_RELOC_16_PLT_PCREL
:
862 case BFD_RELOC_32_PLT_PCREL
:
863 case BFD_RELOC_8_PLTOFF
:
864 case BFD_RELOC_16_PLTOFF
:
865 case BFD_RELOC_32_PLTOFF
:
868 case BFD_RELOC_VTABLE_INHERIT
:
869 case BFD_RELOC_VTABLE_ENTRY
:
879 #define get_reloc_code(SIZE,PCREL,OTHER) NO_RELOC
881 #define relaxable_symbol(symbol) 1
888 tc_gen_reloc (section
, fixp
)
893 bfd_reloc_code_real_type code
;
895 /* If the tcbit is set, then this was a fixup of a negative value
896 that was never resolved. We do not have a reloc to handle this,
897 so just return. We assume that other code will have detected this
898 situation and produced a helpful error message, so we just tell the
899 user that the reloc cannot be produced. */
903 as_bad (_("Unable to produce reloc against symbol '%s'"),
904 S_GET_NAME (fixp
->fx_addsy
));
908 if (fixp
->fx_r_type
!= BFD_RELOC_NONE
)
910 code
= fixp
->fx_r_type
;
912 /* Since DIFF_EXPR_OK is defined in tc-m68k.h, it is possible
913 that fixup_segment converted a non-PC relative reloc into a
914 PC relative reloc. In such a case, we need to convert the
921 code
= BFD_RELOC_8_PCREL
;
924 code
= BFD_RELOC_16_PCREL
;
927 code
= BFD_RELOC_32_PCREL
;
929 case BFD_RELOC_8_PCREL
:
930 case BFD_RELOC_16_PCREL
:
931 case BFD_RELOC_32_PCREL
:
932 case BFD_RELOC_8_GOT_PCREL
:
933 case BFD_RELOC_16_GOT_PCREL
:
934 case BFD_RELOC_32_GOT_PCREL
:
935 case BFD_RELOC_8_GOTOFF
:
936 case BFD_RELOC_16_GOTOFF
:
937 case BFD_RELOC_32_GOTOFF
:
938 case BFD_RELOC_8_PLT_PCREL
:
939 case BFD_RELOC_16_PLT_PCREL
:
940 case BFD_RELOC_32_PLT_PCREL
:
941 case BFD_RELOC_8_PLTOFF
:
942 case BFD_RELOC_16_PLTOFF
:
943 case BFD_RELOC_32_PLTOFF
:
946 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
947 _("Cannot make %s relocation PC relative"),
948 bfd_get_reloc_code_name (code
));
954 #define F(SZ,PCREL) (((SZ) << 1) + (PCREL))
955 switch (F (fixp
->fx_size
, fixp
->fx_pcrel
))
957 #define MAP(SZ,PCREL,TYPE) case F(SZ,PCREL): code = (TYPE); break
958 MAP (1, 0, BFD_RELOC_8
);
959 MAP (2, 0, BFD_RELOC_16
);
960 MAP (4, 0, BFD_RELOC_32
);
961 MAP (1, 1, BFD_RELOC_8_PCREL
);
962 MAP (2, 1, BFD_RELOC_16_PCREL
);
963 MAP (4, 1, BFD_RELOC_32_PCREL
);
971 reloc
= (arelent
*) xmalloc (sizeof (arelent
));
972 reloc
->sym_ptr_ptr
= (asymbol
**) xmalloc (sizeof (asymbol
*));
973 *reloc
->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
974 reloc
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
977 reloc
->addend
= fixp
->fx_addnumber
;
982 reloc
->addend
= fixp
->fx_addnumber
;
984 reloc
->addend
= (section
->vma
985 /* Explicit sign extension in case char is
987 + ((fixp
->fx_pcrel_adjust
& 0xff) ^ 0x80) - 0x80
989 + md_pcrel_from (fixp
));
992 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, code
);
993 assert (reloc
->howto
!= 0);
998 #endif /* BFD_ASSEMBLER */
1000 /* Handle of the OPCODE hash table. NULL means any use before
1001 m68k_ip_begin() will crash. */
1002 static struct hash_control
*op_hash
;
1004 /* Assemble an m68k instruction. */
1011 register struct m68k_op
*opP
;
1012 register const struct m68k_incant
*opcode
;
1013 register const char *s
;
1014 register int tmpreg
= 0, baseo
= 0, outro
= 0, nextword
;
1015 char *pdot
, *pdotmove
;
1016 enum m68k_size siz1
, siz2
;
1020 LITTLENUM_TYPE words
[6];
1021 LITTLENUM_TYPE
*wordp
;
1022 unsigned long ok_arch
= 0;
1024 if (*instring
== ' ')
1025 instring
++; /* skip leading whitespace */
1027 /* Scan up to end of operation-code, which MUST end in end-of-string
1028 or exactly 1 space. */
1030 for (p
= instring
; *p
!= '\0'; p
++)
1040 the_ins
.error
= _("No operator");
1044 /* p now points to the end of the opcode name, probably whitespace.
1045 Make sure the name is null terminated by clobbering the
1046 whitespace, look it up in the hash table, then fix it back.
1047 Remove a dot, first, since the opcode tables have none. */
1050 for (pdotmove
= pdot
; pdotmove
< p
; pdotmove
++)
1051 *pdotmove
= pdotmove
[1];
1057 opcode
= (const struct m68k_incant
*) hash_find (op_hash
, instring
);
1062 for (pdotmove
= p
; pdotmove
> pdot
; pdotmove
--)
1063 *pdotmove
= pdotmove
[-1];
1070 the_ins
.error
= _("Unknown operator");
1074 /* found a legitimate opcode, start matching operands */
1078 if (opcode
->m_operands
== 0)
1080 char *old
= input_line_pointer
;
1082 input_line_pointer
= p
;
1083 /* Ahh - it's a motorola style psuedo op */
1084 mote_pseudo_table
[opcode
->m_opnum
].poc_handler
1085 (mote_pseudo_table
[opcode
->m_opnum
].poc_val
);
1086 input_line_pointer
= old
;
1092 if (flag_mri
&& opcode
->m_opnum
== 0)
1094 /* In MRI mode, random garbage is allowed after an instruction
1095 which accepts no operands. */
1096 the_ins
.args
= opcode
->m_operands
;
1097 the_ins
.numargs
= opcode
->m_opnum
;
1098 the_ins
.numo
= opcode
->m_codenum
;
1099 the_ins
.opcode
[0] = getone (opcode
);
1100 the_ins
.opcode
[1] = gettwo (opcode
);
1104 for (opP
= &the_ins
.operands
[0]; *p
; opP
++)
1106 p
= crack_operand (p
, opP
);
1110 the_ins
.error
= opP
->error
;
1115 opsfound
= opP
- &the_ins
.operands
[0];
1117 /* This ugly hack is to support the floating pt opcodes in their
1118 standard form. Essentially, we fake a first enty of type COP#1 */
1119 if (opcode
->m_operands
[0] == 'I')
1123 for (n
= opsfound
; n
> 0; --n
)
1124 the_ins
.operands
[n
] = the_ins
.operands
[n
- 1];
1126 memset ((char *) (&the_ins
.operands
[0]), '\0',
1127 sizeof (the_ins
.operands
[0]));
1128 the_ins
.operands
[0].mode
= CONTROL
;
1129 the_ins
.operands
[0].reg
= m68k_float_copnum
;
1133 /* We've got the operands. Find an opcode that'll accept them */
1136 /* If we didn't get the right number of ops, or we have no
1137 common model with this pattern then reject this pattern. */
1139 ok_arch
|= opcode
->m_arch
;
1140 if (opsfound
!= opcode
->m_opnum
1141 || ((opcode
->m_arch
& current_architecture
) == 0))
1145 for (s
= opcode
->m_operands
, opP
= &the_ins
.operands
[0];
1149 /* Warning: this switch is huge! */
1150 /* I've tried to organize the cases into this order:
1151 non-alpha first, then alpha by letter. Lower-case
1152 goes directly before uppercase counterpart. */
1153 /* Code with multiple case ...: gets sorted by the lowest
1154 case ... it belongs to. I hope this makes sense. */
1260 if (opP
->reg
== PC
|| opP
->reg
== ZPC
)
1277 if (opP
->reg
== PC
|| opP
->reg
== ZPC
)
1296 if (opP
->reg
== PC
|| opP
->reg
== ZPC
)
1306 if (opP
->mode
!= IMMED
)
1308 else if (s
[1] == 'b'
1309 && ! isvar (&opP
->disp
)
1310 && (opP
->disp
.exp
.X_op
!= O_constant
1311 || ! isbyte (opP
->disp
.exp
.X_add_number
)))
1313 else if (s
[1] == 'B'
1314 && ! isvar (&opP
->disp
)
1315 && (opP
->disp
.exp
.X_op
!= O_constant
1316 || ! issbyte (opP
->disp
.exp
.X_add_number
)))
1318 else if (s
[1] == 'w'
1319 && ! isvar (&opP
->disp
)
1320 && (opP
->disp
.exp
.X_op
!= O_constant
1321 || ! isword (opP
->disp
.exp
.X_add_number
)))
1323 else if (s
[1] == 'W'
1324 && ! isvar (&opP
->disp
)
1325 && (opP
->disp
.exp
.X_op
!= O_constant
1326 || ! issword (opP
->disp
.exp
.X_add_number
)))
1332 if (opP
->mode
!= IMMED
)
1337 if (opP
->mode
== AREG
1338 || opP
->mode
== CONTROL
1339 || opP
->mode
== FPREG
1340 || opP
->mode
== IMMED
1341 || opP
->mode
== REGLST
1342 || (opP
->mode
!= ABSL
1344 || opP
->reg
== ZPC
)))
1349 if (opP
->mode
== CONTROL
1350 || opP
->mode
== FPREG
1351 || opP
->mode
== REGLST
1352 || opP
->mode
== IMMED
1353 || (opP
->mode
!= ABSL
1355 || opP
->reg
== ZPC
)))
1383 if (opP
->mode
== CONTROL
1384 || opP
->mode
== FPREG
1385 || opP
->mode
== REGLST
)
1390 if (opP
->mode
!= AINC
)
1395 if (opP
->mode
!= ADEC
)
1445 if (opP
->reg
== PC
|| opP
->reg
== ZPC
)
1466 case '~': /* For now! (JF FOO is this right?) */
1488 if (opP
->mode
!= CONTROL
1489 || (opP
->reg
!= TT0
&& opP
->reg
!= TT1
))
1494 if (opP
->mode
!= AREG
)
1499 if (opP
->mode
!= AINDR
)
1504 if (opP
->mode
!= ABSL
1506 && strncmp (instring
, "jbsr", 4) == 0))
1511 if (opP
->mode
!= CONTROL
|| opP
->reg
!= CCR
)
1516 if (opP
->mode
!= DISP
1518 || opP
->reg
> ADDR7
)
1523 if (opP
->mode
!= DREG
)
1528 if (opP
->reg
!= ACC
)
1533 if (opP
->mode
!= FPREG
)
1538 if (opP
->reg
!= MACSR
)
1543 if (opP
->reg
!= MASK
)
1548 if (opP
->mode
!= CONTROL
1555 if (opP
->mode
!= CONTROL
1557 || opP
->reg
> last_movec_reg
)
1561 const enum m68k_register
*rp
;
1562 for (rp
= control_regs
; *rp
; rp
++)
1563 if (*rp
== opP
->reg
)
1571 if (opP
->mode
!= IMMED
)
1577 if (opP
->mode
== DREG
1578 || opP
->mode
== AREG
1579 || opP
->mode
== FPREG
)
1588 opP
->mask
= 1 << (opP
->reg
- DATA0
);
1591 opP
->mask
= 1 << (opP
->reg
- ADDR0
+ 8);
1594 opP
->mask
= 1 << (opP
->reg
- FP0
+ 16);
1602 else if (opP
->mode
== CONTROL
)
1611 opP
->mask
= 1 << 24;
1614 opP
->mask
= 1 << 25;
1617 opP
->mask
= 1 << 26;
1626 else if (opP
->mode
!= REGLST
)
1628 else if (s
[1] == '8' && (opP
->mask
& 0x0ffffff) != 0)
1630 else if (s
[1] == '3' && (opP
->mask
& 0x7000000) != 0)
1635 if (opP
->mode
!= IMMED
)
1637 else if (opP
->disp
.exp
.X_op
!= O_constant
1638 || ! issbyte (opP
->disp
.exp
.X_add_number
))
1640 else if (! m68k_quick
1641 && instring
[3] != 'q'
1642 && instring
[4] != 'q')
1647 if (opP
->mode
!= DREG
1648 && opP
->mode
!= IMMED
1649 && opP
->mode
!= ABSL
)
1654 if (opP
->mode
!= IMMED
)
1656 else if (opP
->disp
.exp
.X_op
!= O_constant
1657 || opP
->disp
.exp
.X_add_number
< 1
1658 || opP
->disp
.exp
.X_add_number
> 8)
1660 else if (! m68k_quick
1661 && (strncmp (instring
, "add", 3) == 0
1662 || strncmp (instring
, "sub", 3) == 0)
1663 && instring
[3] != 'q')
1668 if (opP
->mode
!= DREG
&& opP
->mode
!= AREG
)
1673 if (opP
->mode
!= AINDR
1674 && (opP
->mode
!= BASE
1676 && opP
->reg
!= ZADDR0
)
1677 || opP
->disp
.exp
.X_op
!= O_absent
1678 || ((opP
->index
.reg
< DATA0
1679 || opP
->index
.reg
> DATA7
)
1680 && (opP
->index
.reg
< ADDR0
1681 || opP
->index
.reg
> ADDR7
))
1682 || opP
->index
.size
!= SIZE_UNSPEC
1683 || opP
->index
.scale
!= 1))
1688 if (opP
->mode
!= CONTROL
1689 || ! (opP
->reg
== FPI
1691 || opP
->reg
== FPC
))
1696 if (opP
->mode
!= CONTROL
|| opP
->reg
!= SR
)
1701 if (opP
->mode
!= IMMED
)
1703 else if (opP
->disp
.exp
.X_op
!= O_constant
1704 || opP
->disp
.exp
.X_add_number
< 0
1705 || opP
->disp
.exp
.X_add_number
> 7)
1710 if (opP
->mode
!= CONTROL
|| opP
->reg
!= USP
)
1714 /* JF these are out of order. We could put them
1715 in order if we were willing to put up with
1716 bunches of #ifdef m68851s in the code.
1718 Don't forget that you need these operands
1719 to use 68030 MMU instructions. */
1721 /* Memory addressing mode used by pflushr */
1723 if (opP
->mode
== CONTROL
1724 || opP
->mode
== FPREG
1725 || opP
->mode
== DREG
1726 || opP
->mode
== AREG
1727 || opP
->mode
== REGLST
)
1729 /* We should accept immediate operands, but they
1730 supposedly have to be quad word, and we don't
1731 handle that. I would like to see what a Motorola
1732 assembler does before doing something here. */
1733 if (opP
->mode
== IMMED
)
1738 if (opP
->mode
!= CONTROL
1739 || (opP
->reg
!= SFC
&& opP
->reg
!= DFC
))
1744 if (opP
->mode
!= CONTROL
|| opP
->reg
!= TC
)
1749 if (opP
->mode
!= CONTROL
|| opP
->reg
!= AC
)
1754 if (opP
->mode
!= CONTROL
1757 && opP
->reg
!= SCC
))
1762 if (opP
->mode
!= CONTROL
1768 if (opP
->mode
!= CONTROL
1771 && opP
->reg
!= CRP
))
1776 if (opP
->mode
!= CONTROL
1777 || (!(opP
->reg
>= BAD
&& opP
->reg
<= BAD
+ 7)
1778 && !(opP
->reg
>= BAC
&& opP
->reg
<= BAC
+ 7)))
1783 if (opP
->mode
!= CONTROL
|| opP
->reg
!= PSR
)
1788 if (opP
->mode
!= CONTROL
|| opP
->reg
!= PCSR
)
1793 if (opP
->mode
!= CONTROL
1800 } /* not a cache specifier. */
1804 if (opP
->mode
!= ABSL
)
1809 if (opP
->reg
< DATA0L
|| opP
->reg
> ADDR7U
)
1811 /* FIXME: kludge instead of fixing parser:
1812 upper/lower registers are *not* CONTROL
1813 registers, but ordinary ones. */
1814 if ((opP
->reg
>= DATA0L
&& opP
->reg
<= DATA7L
)
1815 || (opP
->reg
>= DATA0U
&& opP
->reg
<= DATA7U
))
1823 } /* switch on type of operand */
1827 } /* for each operand */
1828 } /* if immediately wrong */
1835 opcode
= opcode
->m_next
;
1840 && !(ok_arch
& current_architecture
))
1845 _("invalid instruction for this architecture; needs "));
1846 cp
= buf
+ strlen (buf
);
1850 strcpy (cp
, _("fpu (68040, 68060 or 68881/68882)"));
1853 strcpy (cp
, _("mmu (68030 or 68851)"));
1856 strcpy (cp
, _("68020 or higher"));
1859 strcpy (cp
, _("68000 or higher"));
1862 strcpy (cp
, _("68010 or higher"));
1866 int got_one
= 0, idx
;
1868 idx
< (int) (sizeof (archs
) / sizeof (archs
[0]));
1871 if ((archs
[idx
].arch
& ok_arch
)
1872 && ! archs
[idx
].alias
)
1876 strcpy (cp
, " or ");
1880 strcpy (cp
, archs
[idx
].name
);
1886 cp
= xmalloc (strlen (buf
) + 1);
1891 the_ins
.error
= _("operands mismatch");
1893 } /* Fell off the end */
1898 /* now assemble it */
1900 the_ins
.args
= opcode
->m_operands
;
1901 the_ins
.numargs
= opcode
->m_opnum
;
1902 the_ins
.numo
= opcode
->m_codenum
;
1903 the_ins
.opcode
[0] = getone (opcode
);
1904 the_ins
.opcode
[1] = gettwo (opcode
);
1906 for (s
= the_ins
.args
, opP
= &the_ins
.operands
[0]; *s
; s
+= 2, opP
++)
1908 /* This switch is a doozy.
1909 Watch the first step; its a big one! */
1937 tmpreg
= 0x3c; /* 7.4 */
1938 if (strchr ("bwl", s
[1]))
1939 nextword
= get_num (&opP
->disp
, 80);
1941 nextword
= get_num (&opP
->disp
, 0);
1942 if (isvar (&opP
->disp
))
1943 add_fix (s
[1], &opP
->disp
, 0, 0);
1947 if (!isbyte (nextword
))
1948 opP
->error
= _("operand out of range");
1953 if (!isword (nextword
))
1954 opP
->error
= _("operand out of range");
1959 if (!issword (nextword
))
1960 opP
->error
= _("operand out of range");
1965 addword (nextword
>> 16);
1992 /* We gotta put out some float */
1993 if (op (&opP
->disp
) != O_big
)
1998 /* Can other cases happen here? */
1999 if (op (&opP
->disp
) != O_constant
)
2002 val
= (valueT
) offs (&opP
->disp
);
2006 generic_bignum
[gencnt
] = (LITTLENUM_TYPE
) val
;
2007 val
>>= LITTLENUM_NUMBER_OF_BITS
;
2011 offs (&opP
->disp
) = gencnt
;
2013 if (offs (&opP
->disp
) > 0)
2015 if (offs (&opP
->disp
) > baseo
)
2017 as_warn (_("Bignum too big for %c format; truncated"),
2019 offs (&opP
->disp
) = baseo
;
2021 baseo
-= offs (&opP
->disp
);
2024 for (wordp
= generic_bignum
+ offs (&opP
->disp
) - 1;
2025 offs (&opP
->disp
)--;
2030 gen_to_words (words
, baseo
, (long) outro
);
2031 for (wordp
= words
; baseo
--; wordp
++)
2035 tmpreg
= opP
->reg
- DATA
; /* 0.dreg */
2038 tmpreg
= 0x08 + opP
->reg
- ADDR
; /* 1.areg */
2041 tmpreg
= 0x10 + opP
->reg
- ADDR
; /* 2.areg */
2044 tmpreg
= 0x20 + opP
->reg
- ADDR
; /* 4.areg */
2047 tmpreg
= 0x18 + opP
->reg
- ADDR
; /* 3.areg */
2051 nextword
= get_num (&opP
->disp
, 80);
2054 && ! isvar (&opP
->disp
)
2057 opP
->disp
.exp
.X_op
= O_symbol
;
2058 #ifndef BFD_ASSEMBLER
2059 opP
->disp
.exp
.X_add_symbol
= &abs_symbol
;
2061 opP
->disp
.exp
.X_add_symbol
=
2062 section_symbol (absolute_section
);
2066 /* Force into index mode. Hope this works */
2068 /* We do the first bit for 32-bit displacements, and the
2069 second bit for 16 bit ones. It is possible that we
2070 should make the default be WORD instead of LONG, but
2071 I think that'd break GCC, so we put up with a little
2072 inefficiency for the sake of working output. */
2074 if (!issword (nextword
)
2075 || (isvar (&opP
->disp
)
2076 && ((opP
->disp
.size
== SIZE_UNSPEC
2077 && flag_short_refs
== 0
2078 && cpu_of_arch (current_architecture
) >= m68020
2079 && ! arch_coldfire_p (current_architecture
))
2080 || opP
->disp
.size
== SIZE_LONG
)))
2082 if (cpu_of_arch (current_architecture
) < m68020
2083 || arch_coldfire_p (current_architecture
))
2085 _("displacement too large for this architecture; needs 68020 or higher");
2087 tmpreg
= 0x3B; /* 7.3 */
2089 tmpreg
= 0x30 + opP
->reg
- ADDR
; /* 6.areg */
2090 if (isvar (&opP
->disp
))
2094 if (opP
->disp
.size
== SIZE_LONG
2096 /* If the displacement needs pic
2097 relocation it cannot be relaxed. */
2098 || opP
->disp
.pic_reloc
!= pic_none
2103 add_fix ('l', &opP
->disp
, 1, 2);
2107 add_frag (adds (&opP
->disp
),
2109 TAB (PCREL1632
, SZ_UNDEF
));
2116 add_fix ('l', &opP
->disp
, 0, 0);
2121 addword (nextword
>> 16);
2126 tmpreg
= 0x3A; /* 7.2 */
2128 tmpreg
= 0x28 + opP
->reg
- ADDR
; /* 5.areg */
2130 if (isvar (&opP
->disp
))
2134 add_fix ('w', &opP
->disp
, 1, 0);
2137 add_fix ('w', &opP
->disp
, 0, 0);
2147 baseo
= get_num (&opP
->disp
, 80);
2148 if (opP
->mode
== POST
|| opP
->mode
== PRE
)
2149 outro
= get_num (&opP
->odisp
, 80);
2150 /* Figure out the `addressing mode'.
2151 Also turn on the BASE_DISABLE bit, if needed. */
2152 if (opP
->reg
== PC
|| opP
->reg
== ZPC
)
2154 tmpreg
= 0x3b; /* 7.3 */
2155 if (opP
->reg
== ZPC
)
2158 else if (opP
->reg
== 0)
2161 tmpreg
= 0x30; /* 6.garbage */
2163 else if (opP
->reg
>= ZADDR0
&& opP
->reg
<= ZADDR7
)
2166 tmpreg
= 0x30 + opP
->reg
- ZADDR0
;
2169 tmpreg
= 0x30 + opP
->reg
- ADDR
; /* 6.areg */
2171 siz1
= opP
->disp
.size
;
2172 if (opP
->mode
== POST
|| opP
->mode
== PRE
)
2173 siz2
= opP
->odisp
.size
;
2177 /* Index register stuff */
2178 if (opP
->index
.reg
!= 0
2179 && opP
->index
.reg
>= DATA
2180 && opP
->index
.reg
<= ADDR7
)
2182 nextword
|= (opP
->index
.reg
- DATA
) << 12;
2184 if (opP
->index
.size
== SIZE_LONG
2185 || (opP
->index
.size
== SIZE_UNSPEC
2186 && m68k_index_width_default
== SIZE_LONG
))
2189 if ((opP
->index
.scale
!= 1
2190 && cpu_of_arch (current_architecture
) < m68020
)
2191 || (opP
->index
.scale
== 8
2192 && arch_coldfire_p (current_architecture
)))
2195 _("scale factor invalid on this architecture; needs cpu32 or 68020 or higher");
2198 if (arch_coldfire_p (current_architecture
)
2199 && opP
->index
.size
== SIZE_WORD
)
2200 opP
->error
= _("invalid index size for coldfire");
2202 switch (opP
->index
.scale
)
2219 GET US OUT OF HERE! */
2221 /* Must be INDEX, with an index register. Address
2222 register cannot be ZERO-PC, and either :b was
2223 forced, or we know it will fit. For a 68000 or
2224 68010, force this mode anyways, because the
2225 larger modes aren't supported. */
2226 if (opP
->mode
== BASE
2227 && ((opP
->reg
>= ADDR0
2228 && opP
->reg
<= ADDR7
)
2231 if (siz1
== SIZE_BYTE
2232 || cpu_of_arch (current_architecture
) < m68020
2233 || arch_coldfire_p (current_architecture
)
2234 || (siz1
== SIZE_UNSPEC
2235 && ! isvar (&opP
->disp
)
2236 && issbyte (baseo
)))
2238 nextword
+= baseo
& 0xff;
2240 if (isvar (&opP
->disp
))
2242 /* Do a byte relocation. If it doesn't
2243 fit (possible on m68000) let the
2244 fixup processing complain later. */
2246 add_fix ('B', &opP
->disp
, 1, 1);
2248 add_fix ('B', &opP
->disp
, 0, 0);
2250 else if (siz1
!= SIZE_BYTE
)
2252 if (siz1
!= SIZE_UNSPEC
)
2253 as_warn (_("Forcing byte displacement"));
2254 if (! issbyte (baseo
))
2255 opP
->error
= _("byte displacement out of range");
2260 else if (siz1
== SIZE_UNSPEC
2262 && isvar (&opP
->disp
)
2263 && subs (&opP
->disp
) == NULL
2265 /* If the displacement needs pic
2266 relocation it cannot be relaxed. */
2267 && opP
->disp
.pic_reloc
== pic_none
2271 /* The code in md_convert_frag_1 needs to be
2272 able to adjust nextword. Call frag_grow
2273 to ensure that we have enough space in
2274 the frag obstack to make all the bytes
2277 nextword
+= baseo
& 0xff;
2279 add_frag (adds (&opP
->disp
), offs (&opP
->disp
),
2280 TAB (PCINDEX
, SZ_UNDEF
));
2288 nextword
|= 0x40; /* No index reg */
2289 if (opP
->index
.reg
>= ZDATA0
2290 && opP
->index
.reg
<= ZDATA7
)
2291 nextword
|= (opP
->index
.reg
- ZDATA0
) << 12;
2292 else if (opP
->index
.reg
>= ZADDR0
2293 || opP
->index
.reg
<= ZADDR7
)
2294 nextword
|= (opP
->index
.reg
- ZADDR0
+ 8) << 12;
2297 /* It isn't simple. */
2299 if (cpu_of_arch (current_architecture
) < m68020
2300 || arch_coldfire_p (current_architecture
))
2302 _("invalid operand mode for this architecture; needs 68020 or higher");
2305 /* If the guy specified a width, we assume that it is
2306 wide enough. Maybe it isn't. If so, we lose. */
2310 if (isvar (&opP
->disp
)
2312 : ! issword (baseo
))
2317 else if (! isvar (&opP
->disp
) && baseo
== 0)
2326 as_warn (_(":b not permitted; defaulting to :w"));
2336 /* Figure out innner displacement stuff */
2337 if (opP
->mode
== POST
|| opP
->mode
== PRE
)
2339 if (cpu_of_arch (current_architecture
) & cpu32
)
2340 opP
->error
= _("invalid operand mode for this architecture; needs 68020 or higher");
2344 if (isvar (&opP
->odisp
)
2346 : ! issword (outro
))
2351 else if (! isvar (&opP
->odisp
) && outro
== 0)
2360 as_warn (_(":b not permitted; defaulting to :w"));
2369 if (opP
->mode
== POST
2370 && (nextword
& 0x40) == 0)
2375 if (siz1
!= SIZE_UNSPEC
&& isvar (&opP
->disp
))
2377 if (opP
->reg
== PC
|| opP
->reg
== ZPC
)
2378 add_fix (siz1
== SIZE_LONG
? 'l' : 'w', &opP
->disp
, 1, 2);
2380 add_fix (siz1
== SIZE_LONG
? 'l' : 'w', &opP
->disp
, 0, 0);
2382 if (siz1
== SIZE_LONG
)
2383 addword (baseo
>> 16);
2384 if (siz1
!= SIZE_UNSPEC
)
2387 if (siz2
!= SIZE_UNSPEC
&& isvar (&opP
->odisp
))
2388 add_fix (siz2
== SIZE_LONG
? 'l' : 'w', &opP
->odisp
, 0, 0);
2389 if (siz2
== SIZE_LONG
)
2390 addword (outro
>> 16);
2391 if (siz2
!= SIZE_UNSPEC
)
2397 nextword
= get_num (&opP
->disp
, 80);
2398 switch (opP
->disp
.size
)
2403 if (!isvar (&opP
->disp
) && issword (offs (&opP
->disp
)))
2405 tmpreg
= 0x38; /* 7.0 */
2409 if (isvar (&opP
->disp
)
2410 && !subs (&opP
->disp
)
2411 && adds (&opP
->disp
)
2413 /* If the displacement needs pic relocation it
2414 cannot be relaxed. */
2415 && opP
->disp
.pic_reloc
== pic_none
2418 && !strchr ("~%&$?", s
[0]))
2420 tmpreg
= 0x3A; /* 7.2 */
2421 add_frag (adds (&opP
->disp
),
2423 TAB (ABSTOPCREL
, SZ_UNDEF
));
2426 /* Fall through into long */
2428 if (isvar (&opP
->disp
))
2429 add_fix ('l', &opP
->disp
, 0, 0);
2431 tmpreg
= 0x39;/* 7.1 mode */
2432 addword (nextword
>> 16);
2437 as_bad (_("unsupported byte value; use a different suffix"));
2439 case SIZE_WORD
: /* Word */
2440 if (isvar (&opP
->disp
))
2441 add_fix ('w', &opP
->disp
, 0, 0);
2443 tmpreg
= 0x38;/* 7.0 mode */
2451 as_bad (_("unknown/incorrect operand"));
2454 install_gen_operand (s
[1], tmpreg
);
2460 { /* JF: I hate floating point! */
2475 tmpreg
= get_num (&opP
->disp
, tmpreg
);
2476 if (isvar (&opP
->disp
))
2477 add_fix (s
[1], &opP
->disp
, 0, 0);
2480 case 'b': /* Danger: These do no check for
2481 certain types of overflow.
2483 if (!isbyte (tmpreg
))
2484 opP
->error
= _("out of range");
2485 insop (tmpreg
, opcode
);
2486 if (isvar (&opP
->disp
))
2487 the_ins
.reloc
[the_ins
.nrel
- 1].n
=
2488 (opcode
->m_codenum
) * 2 + 1;
2491 if (!issbyte (tmpreg
))
2492 opP
->error
= _("out of range");
2493 the_ins
.opcode
[the_ins
.numo
- 1] |= tmpreg
& 0xff;
2494 if (isvar (&opP
->disp
))
2495 the_ins
.reloc
[the_ins
.nrel
- 1].n
= opcode
->m_codenum
* 2 - 1;
2498 if (!isword (tmpreg
))
2499 opP
->error
= _("out of range");
2500 insop (tmpreg
, opcode
);
2501 if (isvar (&opP
->disp
))
2502 the_ins
.reloc
[the_ins
.nrel
- 1].n
= (opcode
->m_codenum
) * 2;
2505 if (!issword (tmpreg
))
2506 opP
->error
= _("out of range");
2507 insop (tmpreg
, opcode
);
2508 if (isvar (&opP
->disp
))
2509 the_ins
.reloc
[the_ins
.nrel
- 1].n
= (opcode
->m_codenum
) * 2;
2512 /* Because of the way insop works, we put these two out
2514 insop (tmpreg
, opcode
);
2515 insop (tmpreg
>> 16, opcode
);
2516 if (isvar (&opP
->disp
))
2517 the_ins
.reloc
[the_ins
.nrel
- 1].n
= (opcode
->m_codenum
) * 2;
2524 install_operand (s
[1], tmpreg
);
2535 install_operand (s
[1], opP
->reg
- ADDR
);
2539 tmpreg
= get_num (&opP
->disp
, 80);
2543 add_fix ('B', &opP
->disp
, 1, -1);
2546 add_fix ('w', &opP
->disp
, 1, 0);
2551 if (! HAVE_LONG_BRANCH (current_architecture
))
2552 as_warn (_("Can't use long branches on 68000/68010/5200"));
2553 the_ins
.opcode
[0] |= 0xff;
2554 add_fix ('l', &opP
->disp
, 1, 0);
2559 if (subs (&opP
->disp
)) /* We can't relax it */
2563 /* If the displacement needs pic relocation it cannot be
2565 if (opP
->disp
.pic_reloc
!= pic_none
)
2568 /* This could either be a symbol, or an absolute
2569 address. If it's an absolute address, turn it into
2570 an absolute jump right here and keep it out of the
2572 if (adds (&opP
->disp
) == 0)
2574 if (the_ins
.opcode
[0] == 0x6000) /* jbra */
2575 the_ins
.opcode
[0] = 0x4EF1;
2576 else if (the_ins
.opcode
[0] == 0x6100) /* jbsr */
2577 the_ins
.opcode
[0] = 0x4EB1;
2580 the_ins
.opcode
[0] ^= 0x0100;
2581 the_ins
.opcode
[0] |= 0x0006;
2584 add_fix ('l', &opP
->disp
, 0, 0);
2590 /* Now we know it's going into the relaxer. Now figure
2591 out which mode. We try in this order of preference:
2592 long branch, absolute jump, byte/word branches only. */
2593 if (HAVE_LONG_BRANCH (current_architecture
))
2594 add_frag (adds (&opP
->disp
), offs (&opP
->disp
),
2595 TAB (BRANCHBWL
, SZ_UNDEF
));
2596 else if (! flag_keep_pcrel
)
2598 if ((the_ins
.opcode
[0] == 0x6000)
2599 || (the_ins
.opcode
[0] == 0x6100))
2600 add_frag (adds (&opP
->disp
), offs (&opP
->disp
),
2601 TAB (BRABSJUNC
, SZ_UNDEF
));
2603 add_frag (adds (&opP
->disp
), offs (&opP
->disp
),
2604 TAB (BRABSJCOND
, SZ_UNDEF
));
2607 add_frag (adds (&opP
->disp
), offs (&opP
->disp
),
2608 TAB (BRANCHBW
, SZ_UNDEF
));
2611 if (isvar (&opP
->disp
))
2613 /* Check for DBcc instructions. We can relax them,
2614 but only if we have long branches and/or absolute
2616 if (((the_ins
.opcode
[0] & 0xf0f8) == 0x50c8)
2617 && (HAVE_LONG_BRANCH (current_architecture
)
2618 || (! flag_keep_pcrel
)))
2620 if (HAVE_LONG_BRANCH (current_architecture
))
2621 add_frag (adds (&opP
->disp
), offs (&opP
->disp
),
2622 TAB (DBCCLBR
, SZ_UNDEF
));
2624 add_frag (adds (&opP
->disp
), offs (&opP
->disp
),
2625 TAB (DBCCABSJ
, SZ_UNDEF
));
2628 add_fix ('w', &opP
->disp
, 1, 0);
2632 case 'C': /* Fixed size LONG coproc branches */
2633 add_fix ('l', &opP
->disp
, 1, 0);
2637 case 'c': /* Var size Coprocesssor branches */
2638 if (subs (&opP
->disp
) || (adds (&opP
->disp
) == 0))
2640 the_ins
.opcode
[the_ins
.numo
- 1] |= 0x40;
2641 add_fix ('l', &opP
->disp
, 1, 0);
2646 add_frag (adds (&opP
->disp
), offs (&opP
->disp
),
2647 TAB (FBRANCH
, SZ_UNDEF
));
2654 case 'C': /* Ignore it */
2657 case 'd': /* JF this is a kludge */
2658 install_operand ('s', opP
->reg
- ADDR
);
2659 tmpreg
= get_num (&opP
->disp
, 80);
2660 if (!issword (tmpreg
))
2662 as_warn (_("Expression out of range, using 0"));
2669 install_operand (s
[1], opP
->reg
- DATA
);
2672 case 'E': /* Ignore it */
2676 install_operand (s
[1], opP
->reg
- FP0
);
2679 case 'G': /* Ignore it */
2684 tmpreg
= opP
->reg
- COP0
;
2685 install_operand (s
[1], tmpreg
);
2688 case 'J': /* JF foo */
2761 install_operand (s
[1], tmpreg
);
2765 tmpreg
= get_num (&opP
->disp
, 55);
2766 install_operand (s
[1], tmpreg
& 0x7f);
2773 if (tmpreg
& 0x7FF0000)
2774 as_bad (_("Floating point register in register list"));
2775 insop (reverse_16_bits (tmpreg
), opcode
);
2779 if (tmpreg
& 0x700FFFF)
2780 as_bad (_("Wrong register in floating-point reglist"));
2781 install_operand (s
[1], reverse_8_bits (tmpreg
>> 16));
2789 if (tmpreg
& 0x7FF0000)
2790 as_bad (_("Floating point register in register list"));
2791 insop (tmpreg
, opcode
);
2793 else if (s
[1] == '8')
2795 if (tmpreg
& 0x0FFFFFF)
2796 as_bad (_("incorrect register in reglist"));
2797 install_operand (s
[1], tmpreg
>> 24);
2801 if (tmpreg
& 0x700FFFF)
2802 as_bad (_("wrong register in floating-point reglist"));
2804 install_operand (s
[1], tmpreg
>> 16);
2809 install_operand (s
[1], get_num (&opP
->disp
, 60));
2813 tmpreg
= ((opP
->mode
== DREG
)
2814 ? 0x20 + (int) (opP
->reg
- DATA
)
2815 : (get_num (&opP
->disp
, 40) & 0x1F));
2816 install_operand (s
[1], tmpreg
);
2820 tmpreg
= get_num (&opP
->disp
, 10);
2823 install_operand (s
[1], tmpreg
);
2827 /* This depends on the fact that ADDR registers are eight
2828 more than their corresponding DATA regs, so the result
2829 will have the ADDR_REG bit set */
2830 install_operand (s
[1], opP
->reg
- DATA
);
2834 if (opP
->mode
== AINDR
)
2835 install_operand (s
[1], opP
->reg
- DATA
);
2837 install_operand (s
[1], opP
->index
.reg
- DATA
);
2841 if (opP
->reg
== FPI
)
2843 else if (opP
->reg
== FPS
)
2845 else if (opP
->reg
== FPC
)
2849 install_operand (s
[1], tmpreg
);
2852 case 'S': /* Ignore it */
2856 install_operand (s
[1], get_num (&opP
->disp
, 30));
2859 case 'U': /* Ignore it */
2878 as_fatal (_("failed sanity check"));
2879 } /* switch on cache token */
2880 install_operand (s
[1], tmpreg
);
2883 /* JF: These are out of order, I fear. */
2896 install_operand (s
[1], tmpreg
);
2922 install_operand (s
[1], tmpreg
);
2926 if (opP
->reg
== VAL
)
2945 install_operand (s
[1], tmpreg
);
2959 tmpreg
= (4 << 10) | ((opP
->reg
- BAD
) << 2);
2970 tmpreg
= (5 << 10) | ((opP
->reg
- BAC
) << 2);
2976 install_operand (s
[1], tmpreg
);
2979 know (opP
->reg
== PSR
);
2982 know (opP
->reg
== PCSR
);
2997 install_operand (s
[1], tmpreg
);
3000 tmpreg
= get_num (&opP
->disp
, 20);
3001 install_operand (s
[1], tmpreg
);
3003 case '_': /* used only for move16 absolute 32-bit address */
3004 if (isvar (&opP
->disp
))
3005 add_fix ('l', &opP
->disp
, 0, 0);
3006 tmpreg
= get_num (&opP
->disp
, 80);
3007 addword (tmpreg
>> 16);
3008 addword (tmpreg
& 0xFFFF);
3011 install_operand (s
[1], opP
->reg
- DATA0L
);
3012 opP
->reg
-= (DATA0L
);
3013 opP
->reg
&= 0x0F; /* remove upper/lower bit */
3020 /* By the time whe get here (FINALLY) the_ins contains the complete
3021 instruction, ready to be emitted. . . */
3025 reverse_16_bits (in
)
3031 static int mask
[16] =
3033 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
3034 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000
3036 for (n
= 0; n
< 16; n
++)
3039 out
|= mask
[15 - n
];
3042 } /* reverse_16_bits() */
3051 static int mask
[8] =
3053 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
3056 for (n
= 0; n
< 8; n
++)
3062 } /* reverse_8_bits() */
3064 /* Cause an extra frag to be generated here, inserting up to 10 bytes
3065 (that value is chosen in the frag_var call in md_assemble). TYPE
3066 is the subtype of the frag to be generated; its primary type is
3067 rs_machine_dependent.
3069 The TYPE parameter is also used by md_convert_frag_1 and
3070 md_estimate_size_before_relax. The appropriate type of fixup will
3071 be emitted by md_convert_frag_1.
3073 ADD becomes the FR_SYMBOL field of the frag, and OFF the FR_OFFSET. */
3075 install_operand (mode
, val
)
3082 the_ins
.opcode
[0] |= val
& 0xFF; /* JF FF is for M kludge */
3085 the_ins
.opcode
[0] |= val
<< 9;
3088 the_ins
.opcode
[1] |= val
<< 12;
3091 the_ins
.opcode
[1] |= val
<< 6;
3094 the_ins
.opcode
[1] |= val
;
3097 the_ins
.opcode
[2] |= val
<< 12;
3100 the_ins
.opcode
[2] |= val
<< 6;
3103 /* DANGER! This is a hack to force cas2l and cas2w cmds to be
3104 three words long! */
3106 the_ins
.opcode
[2] |= val
;
3109 the_ins
.opcode
[1] |= val
<< 7;
3112 the_ins
.opcode
[1] |= val
<< 10;
3116 the_ins
.opcode
[1] |= val
<< 5;
3121 the_ins
.opcode
[1] |= (val
<< 10) | (val
<< 7);
3124 the_ins
.opcode
[1] |= (val
<< 12) | val
;
3127 the_ins
.opcode
[0] |= val
= 0xff;
3130 the_ins
.opcode
[0] |= val
<< 9;
3133 the_ins
.opcode
[1] |= val
;
3136 the_ins
.opcode
[1] |= val
;
3137 the_ins
.numo
++; /* What a hack */
3140 the_ins
.opcode
[1] |= val
<< 4;
3148 the_ins
.opcode
[0] |= (val
<< 6);
3151 the_ins
.opcode
[1] = (val
>> 16);
3152 the_ins
.opcode
[2] = val
& 0xffff;
3155 the_ins
.opcode
[0] |= ((val
& 0x8) << (6 - 3));
3156 the_ins
.opcode
[0] |= ((val
& 0x7) << 9);
3157 the_ins
.opcode
[1] |= ((val
& 0x10) << (7 - 4));
3160 the_ins
.opcode
[0] |= ((val
& 0x8) << (6 - 3));
3161 the_ins
.opcode
[0] |= ((val
& 0x7) << 9);
3164 the_ins
.opcode
[1] |= val
<< 12;
3165 the_ins
.opcode
[1] |= ((val
& 0x10) << (7 - 4));
3168 the_ins
.opcode
[0] |= (val
& 0xF);
3169 the_ins
.opcode
[1] |= ((val
& 0x10) << (6 - 4));
3172 the_ins
.opcode
[1] |= (val
& 0xF);
3173 the_ins
.opcode
[1] |= ((val
& 0x10) << (6 - 4));
3176 the_ins
.opcode
[1] |= ((val
!= 1) << 10);
3180 as_fatal (_("failed sanity check."));
3182 } /* install_operand() */
3185 install_gen_operand (mode
, val
)
3192 the_ins
.opcode
[0] |= val
;
3195 /* This is a kludge!!! */
3196 the_ins
.opcode
[0] |= (val
& 0x07) << 9 | (val
& 0x38) << 3;
3205 the_ins
.opcode
[0] |= val
;
3207 /* more stuff goes here */
3209 as_fatal (_("failed sanity check."));
3211 } /* install_gen_operand() */
3214 * verify that we have some number of paren pairs, do m68k_ip_op(), and
3215 * then deal with the bitfield hack.
3219 crack_operand (str
, opP
)
3221 register struct m68k_op
*opP
;
3223 register int parens
;
3225 register char *beg_str
;
3233 for (parens
= 0; *str
&& (parens
> 0 || inquote
|| notend (str
)); str
++)
3239 else if (*str
== ')')
3243 opP
->error
= _("Extra )");
3249 if (flag_mri
&& *str
== '\'')
3250 inquote
= ! inquote
;
3252 if (!*str
&& parens
)
3254 opP
->error
= _("Missing )");
3259 if (m68k_ip_op (beg_str
, opP
) != 0)
3266 c
= *++str
; /* JF bitfield hack */
3271 as_bad (_("Missing operand"));
3274 /* Detect MRI REG symbols and convert them to REGLSTs. */
3275 if (opP
->mode
== CONTROL
&& (int)opP
->reg
< 0)
3278 opP
->mask
= ~(int)opP
->reg
;
3285 /* This is the guts of the machine-dependent assembler. STR points to a
3286 machine dependent instruction. This function is supposed to emit
3287 the frags/bytes it assembles to.
3291 insert_reg (regname
, regnum
)
3292 const char *regname
;
3298 #ifdef REGISTER_PREFIX
3299 if (!flag_reg_prefix_optional
)
3301 buf
[0] = REGISTER_PREFIX
;
3302 strcpy (buf
+ 1, regname
);
3307 symbol_table_insert (symbol_new (regname
, reg_section
, regnum
,
3308 &zero_address_frag
));
3310 for (i
= 0; regname
[i
]; i
++)
3311 buf
[i
] = islower (regname
[i
]) ? toupper (regname
[i
]) : regname
[i
];
3314 symbol_table_insert (symbol_new (buf
, reg_section
, regnum
,
3315 &zero_address_frag
));
3324 static const struct init_entry init_table
[] =
3383 /* control registers */
3384 { "sfc", SFC
}, /* Source Function Code */
3386 { "dfc", DFC
}, /* Destination Function Code */
3388 { "cacr", CACR
}, /* Cache Control Register */
3389 { "caar", CAAR
}, /* Cache Address Register */
3391 { "usp", USP
}, /* User Stack Pointer */
3392 { "vbr", VBR
}, /* Vector Base Register */
3393 { "msp", MSP
}, /* Master Stack Pointer */
3394 { "isp", ISP
}, /* Interrupt Stack Pointer */
3396 { "itt0", ITT0
}, /* Instruction Transparent Translation Reg 0 */
3397 { "itt1", ITT1
}, /* Instruction Transparent Translation Reg 1 */
3398 { "dtt0", DTT0
}, /* Data Transparent Translation Register 0 */
3399 { "dtt1", DTT1
}, /* Data Transparent Translation Register 1 */
3401 /* 68ec040 versions of same */
3402 { "iacr0", ITT0
}, /* Instruction Access Control Register 0 */
3403 { "iacr1", ITT1
}, /* Instruction Access Control Register 0 */
3404 { "dacr0", DTT0
}, /* Data Access Control Register 0 */
3405 { "dacr1", DTT1
}, /* Data Access Control Register 0 */
3407 /* mcf5200 versions of same. The ColdFire programmer's reference
3408 manual indicated that the order is 2,3,0,1, but Ken Rose
3409 <rose@netcom.com> says that 0,1,2,3 is the correct order. */
3410 { "acr0", ITT0
}, /* Access Control Unit 0 */
3411 { "acr1", ITT1
}, /* Access Control Unit 1 */
3412 { "acr2", DTT0
}, /* Access Control Unit 2 */
3413 { "acr3", DTT1
}, /* Access Control Unit 3 */
3415 { "tc", TC
}, /* MMU Translation Control Register */
3418 { "mmusr", MMUSR
}, /* MMU Status Register */
3419 { "srp", SRP
}, /* User Root Pointer */
3420 { "urp", URP
}, /* Supervisor Root Pointer */
3425 { "rombar", ROMBAR
}, /* ROM Base Address Register */
3426 { "rambar0", RAMBAR0
}, /* ROM Base Address Register */
3427 { "rambar1", RAMBAR1
}, /* ROM Base Address Register */
3428 { "mbar", MBAR
}, /* Module Base Address Register */
3429 /* end of control registers */
3463 /* 68ec030 versions of same */
3466 /* 68ec030 access control unit, identical to 030 MMU status reg */
3469 /* Suppressed data and address registers. */
3487 /* Upper and lower data and address registers, used by macw and msacw. */
3531 for (i
= 0; init_table
[i
].name
; i
++)
3532 insert_reg (init_table
[i
].name
, init_table
[i
].number
);
3535 static int no_68851
, no_68881
;
3538 /* a.out machine type. Default to 68020. */
3539 int m68k_aout_machtype
= 2;
3551 int shorts_this_frag
;
3554 /* In MRI mode, the instruction and operands are separated by a
3555 space. Anything following the operands is a comment. The label
3556 has already been removed. */
3564 for (s
= str
; *s
!= '\0'; s
++)
3566 if ((*s
== ' ' || *s
== '\t') && ! inquote
)
3584 inquote
= ! inquote
;
3589 memset ((char *) (&the_ins
), '\0', sizeof (the_ins
));
3594 for (n
= 0; n
< the_ins
.numargs
; n
++)
3595 if (the_ins
.operands
[n
].error
)
3597 er
= the_ins
.operands
[n
].error
;
3603 as_bad (_("%s -- statement `%s' ignored"), er
, str
);
3607 /* If there is a current label, record that it marks an instruction. */
3608 if (current_label
!= NULL
)
3610 current_label
->text
= 1;
3611 current_label
= NULL
;
3614 if (the_ins
.nfrag
== 0)
3616 /* No frag hacking involved; just put it out */
3617 toP
= frag_more (2 * the_ins
.numo
);
3618 fromP
= &the_ins
.opcode
[0];
3619 for (m
= the_ins
.numo
; m
; --m
)
3621 md_number_to_chars (toP
, (long) (*fromP
), 2);
3625 /* put out symbol-dependent info */
3626 for (m
= 0; m
< the_ins
.nrel
; m
++)
3628 switch (the_ins
.reloc
[m
].wid
)
3647 as_fatal (_("Don't know how to figure width of %c in md_assemble()"),
3648 the_ins
.reloc
[m
].wid
);
3651 fixP
= fix_new_exp (frag_now
,
3652 ((toP
- frag_now
->fr_literal
)
3653 - the_ins
.numo
* 2 + the_ins
.reloc
[m
].n
),
3655 &the_ins
.reloc
[m
].exp
,
3656 the_ins
.reloc
[m
].pcrel
,
3657 get_reloc_code (n
, the_ins
.reloc
[m
].pcrel
,
3658 the_ins
.reloc
[m
].pic_reloc
));
3659 fixP
->fx_pcrel_adjust
= the_ins
.reloc
[m
].pcrel_fix
;
3660 if (the_ins
.reloc
[m
].wid
== 'B')
3661 fixP
->fx_signed
= 1;
3666 /* There's some frag hacking */
3667 for (n
= 0, fromP
= &the_ins
.opcode
[0]; n
< the_ins
.nfrag
; n
++)
3672 wid
= 2 * the_ins
.fragb
[n
].fragoff
;
3674 wid
= 2 * (the_ins
.numo
- the_ins
.fragb
[n
- 1].fragoff
);
3675 toP
= frag_more (wid
);
3677 shorts_this_frag
= 0;
3678 for (m
= wid
/ 2; m
; --m
)
3680 md_number_to_chars (toP
, (long) (*fromP
), 2);
3685 for (m
= 0; m
< the_ins
.nrel
; m
++)
3687 if ((the_ins
.reloc
[m
].n
) >= 2 * shorts_this_frag
)
3689 the_ins
.reloc
[m
].n
-= 2 * shorts_this_frag
;
3692 wid
= the_ins
.reloc
[m
].wid
;
3695 the_ins
.reloc
[m
].wid
= 0;
3696 wid
= (wid
== 'b') ? 1 : (wid
== 'w') ? 2 : (wid
== 'l') ? 4 : 4000;
3698 fixP
= fix_new_exp (frag_now
,
3699 ((toP
- frag_now
->fr_literal
)
3700 - the_ins
.numo
* 2 + the_ins
.reloc
[m
].n
),
3702 &the_ins
.reloc
[m
].exp
,
3703 the_ins
.reloc
[m
].pcrel
,
3704 get_reloc_code (wid
, the_ins
.reloc
[m
].pcrel
,
3705 the_ins
.reloc
[m
].pic_reloc
));
3706 fixP
->fx_pcrel_adjust
= the_ins
.reloc
[m
].pcrel_fix
;
3708 (void) frag_var (rs_machine_dependent
, 10, 0,
3709 (relax_substateT
) (the_ins
.fragb
[n
].fragty
),
3710 the_ins
.fragb
[n
].fadd
, the_ins
.fragb
[n
].foff
, to_beg_P
);
3712 n
= (the_ins
.numo
- the_ins
.fragb
[n
- 1].fragoff
);
3713 shorts_this_frag
= 0;
3716 toP
= frag_more (n
* sizeof (short));
3719 md_number_to_chars (toP
, (long) (*fromP
), 2);
3725 for (m
= 0; m
< the_ins
.nrel
; m
++)
3729 wid
= the_ins
.reloc
[m
].wid
;
3732 the_ins
.reloc
[m
].wid
= 0;
3733 wid
= (wid
== 'b') ? 1 : (wid
== 'w') ? 2 : (wid
== 'l') ? 4 : 4000;
3735 fixP
= fix_new_exp (frag_now
,
3736 ((the_ins
.reloc
[m
].n
+ toP
- frag_now
->fr_literal
)
3737 - shorts_this_frag
* 2),
3739 &the_ins
.reloc
[m
].exp
,
3740 the_ins
.reloc
[m
].pcrel
,
3741 get_reloc_code (wid
, the_ins
.reloc
[m
].pcrel
,
3742 the_ins
.reloc
[m
].pic_reloc
));
3743 fixP
->fx_pcrel_adjust
= the_ins
.reloc
[m
].pcrel_fix
;
3751 * md_begin -- set up hash tables with 68000 instructions.
3752 * similar to what the vax assembler does. ---phr
3754 /* RMS claims the thing to do is take the m68k-opcode.h table, and make
3755 a copy of it at runtime, adding in the information we want but isn't
3756 there. I think it'd be better to have an awk script hack the table
3757 at compile time. Or even just xstr the table and use it as-is. But
3758 my lord ghod hath spoken, so we do it this way. Excuse the ugly var
3761 register const struct m68k_opcode
*ins
;
3762 register struct m68k_incant
*hack
, *slak
;
3763 register const char *retval
= 0; /* empty string, or error msg text */
3769 flag_reg_prefix_optional
= 1;
3771 if (! m68k_rel32_from_cmdline
)
3775 op_hash
= hash_new ();
3777 obstack_begin (&robyn
, 4000);
3778 for (i
= 0; i
< m68k_numopcodes
; i
++)
3780 hack
= slak
= (struct m68k_incant
*) obstack_alloc (&robyn
, sizeof (struct m68k_incant
));
3783 ins
= &m68k_opcodes
[i
];
3784 /* We *could* ignore insns that don't match our arch here
3785 but just leaving them out of the hash. */
3786 slak
->m_operands
= ins
->args
;
3787 slak
->m_opnum
= strlen (slak
->m_operands
) / 2;
3788 slak
->m_arch
= ins
->arch
;
3789 slak
->m_opcode
= ins
->opcode
;
3790 /* This is kludgey */
3791 slak
->m_codenum
= ((ins
->match
) & 0xffffL
) ? 2 : 1;
3792 if (i
+ 1 != m68k_numopcodes
3793 && !strcmp (ins
->name
, m68k_opcodes
[i
+ 1].name
))
3795 slak
->m_next
= (struct m68k_incant
*) obstack_alloc (&robyn
, sizeof (struct m68k_incant
));
3800 slak
= slak
->m_next
;
3804 retval
= hash_insert (op_hash
, ins
->name
, (char *) hack
);
3806 as_fatal (_("Internal Error: Can't hash %s: %s"), ins
->name
, retval
);
3809 for (i
= 0; i
< m68k_numaliases
; i
++)
3811 const char *name
= m68k_opcode_aliases
[i
].primary
;
3812 const char *alias
= m68k_opcode_aliases
[i
].alias
;
3813 PTR val
= hash_find (op_hash
, name
);
3815 as_fatal (_("Internal Error: Can't find %s in hash table"), name
);
3816 retval
= hash_insert (op_hash
, alias
, val
);
3818 as_fatal (_("Internal Error: Can't hash %s: %s"), alias
, retval
);
3821 /* In MRI mode, all unsized branches are variable sized. Normally,
3822 they are word sized. */
3825 static struct m68k_opcode_alias mri_aliases
[] =
3846 i
< (int) (sizeof mri_aliases
/ sizeof mri_aliases
[0]);
3849 const char *name
= mri_aliases
[i
].primary
;
3850 const char *alias
= mri_aliases
[i
].alias
;
3851 PTR val
= hash_find (op_hash
, name
);
3853 as_fatal (_("Internal Error: Can't find %s in hash table"), name
);
3854 retval
= hash_jam (op_hash
, alias
, val
);
3856 as_fatal (_("Internal Error: Can't hash %s: %s"), alias
, retval
);
3860 for (i
= 0; i
< (int) sizeof (mklower_table
); i
++)
3861 mklower_table
[i
] = (isupper (c
= (char) i
)) ? tolower (c
) : c
;
3863 for (i
= 0; i
< (int) sizeof (notend_table
); i
++)
3865 notend_table
[i
] = 0;
3866 alt_notend_table
[i
] = 0;
3868 notend_table
[','] = 1;
3869 notend_table
['{'] = 1;
3870 notend_table
['}'] = 1;
3871 alt_notend_table
['a'] = 1;
3872 alt_notend_table
['A'] = 1;
3873 alt_notend_table
['d'] = 1;
3874 alt_notend_table
['D'] = 1;
3875 alt_notend_table
['#'] = 1;
3876 alt_notend_table
['&'] = 1;
3877 alt_notend_table
['f'] = 1;
3878 alt_notend_table
['F'] = 1;
3879 #ifdef REGISTER_PREFIX
3880 alt_notend_table
[REGISTER_PREFIX
] = 1;
3883 /* We need to put '(' in alt_notend_table to handle
3884 cas2 %d0:%d2,%d3:%d4,(%a0):(%a1)
3886 alt_notend_table
['('] = 1;
3888 /* We need to put '@' in alt_notend_table to handle
3889 cas2 %d0:%d2,%d3:%d4,@(%d0):@(%d1)
3891 alt_notend_table
['@'] = 1;
3893 /* We need to put digits in alt_notend_table to handle
3894 bfextu %d0{24:1},%d0
3896 alt_notend_table
['0'] = 1;
3897 alt_notend_table
['1'] = 1;
3898 alt_notend_table
['2'] = 1;
3899 alt_notend_table
['3'] = 1;
3900 alt_notend_table
['4'] = 1;
3901 alt_notend_table
['5'] = 1;
3902 alt_notend_table
['6'] = 1;
3903 alt_notend_table
['7'] = 1;
3904 alt_notend_table
['8'] = 1;
3905 alt_notend_table
['9'] = 1;
3907 #ifndef MIT_SYNTAX_ONLY
3908 /* Insert pseudo ops, these have to go into the opcode table since
3909 gas expects pseudo ops to start with a dot */
3912 while (mote_pseudo_table
[n
].poc_name
)
3914 hack
= (struct m68k_incant
*)
3915 obstack_alloc (&robyn
, sizeof (struct m68k_incant
));
3916 hash_insert (op_hash
,
3917 mote_pseudo_table
[n
].poc_name
, (char *) hack
);
3918 hack
->m_operands
= 0;
3928 record_alignment (text_section
, 2);
3929 record_alignment (data_section
, 2);
3930 record_alignment (bss_section
, 2);
3935 select_control_regs ()
3937 /* Note which set of "movec" control registers is available. */
3938 switch (cpu_of_arch (current_architecture
))
3941 control_regs
= m68000_control_regs
;
3944 control_regs
= m68010_control_regs
;
3948 control_regs
= m68020_control_regs
;
3951 control_regs
= m68040_control_regs
;
3954 control_regs
= m68060_control_regs
;
3957 control_regs
= cpu32_control_regs
;
3963 control_regs
= mcf_control_regs
;
3971 m68k_init_after_args ()
3973 if (cpu_of_arch (current_architecture
) == 0)
3976 const char *default_cpu
= TARGET_CPU
;
3978 if (*default_cpu
== 'm')
3980 for (i
= 0; i
< n_archs
; i
++)
3981 if (strcasecmp (default_cpu
, archs
[i
].name
) == 0)
3985 as_bad (_("unrecognized default cpu `%s' ???"), TARGET_CPU
);
3986 current_architecture
|= m68020
;
3989 current_architecture
|= archs
[i
].arch
;
3991 /* Permit m68881 specification with all cpus; those that can't work
3992 with a coprocessor could be doing emulation. */
3993 if (current_architecture
& m68851
)
3995 if (current_architecture
& m68040
)
3997 as_warn (_("68040 and 68851 specified; mmu instructions may assemble incorrectly"));
4000 /* What other incompatibilities could we check for? */
4002 /* Toss in some default assumptions about coprocessors. */
4004 && (cpu_of_arch (current_architecture
)
4005 /* Can CPU32 have a 68881 coprocessor?? */
4006 & (m68020
| m68030
| cpu32
)))
4008 current_architecture
|= m68881
;
4011 && (cpu_of_arch (current_architecture
) & m68020up
) != 0
4012 && (cpu_of_arch (current_architecture
) & m68040up
) == 0)
4014 current_architecture
|= m68851
;
4016 if (no_68881
&& (current_architecture
& m68881
))
4017 as_bad (_("options for 68881 and no-68881 both given"));
4018 if (no_68851
&& (current_architecture
& m68851
))
4019 as_bad (_("options for 68851 and no-68851 both given"));
4022 /* Work out the magic number. This isn't very general. */
4023 if (current_architecture
& m68000
)
4024 m68k_aout_machtype
= 0;
4025 else if (current_architecture
& m68010
)
4026 m68k_aout_machtype
= 1;
4027 else if (current_architecture
& m68020
)
4028 m68k_aout_machtype
= 2;
4030 m68k_aout_machtype
= 2;
4033 /* Note which set of "movec" control registers is available. */
4034 select_control_regs ();
4036 if (cpu_of_arch (current_architecture
) < m68020
4037 || arch_coldfire_p (current_architecture
))
4038 md_relax_table
[TAB (PCINDEX
, BYTE
)].rlx_more
= 0;
4041 /* This is called when a label is defined. */
4044 m68k_frob_label (sym
)
4047 struct label_line
*n
;
4049 n
= (struct label_line
*) xmalloc (sizeof *n
);
4052 as_where (&n
->file
, &n
->line
);
4058 /* This is called when a value that is not an instruction is emitted. */
4061 m68k_flush_pending_output ()
4063 current_label
= NULL
;
4066 /* This is called at the end of the assembly, when the final value of
4067 the label is known. We warn if this is a text symbol aligned at an
4071 m68k_frob_symbol (sym
)
4074 if (S_GET_SEGMENT (sym
) == reg_section
4075 && (int) S_GET_VALUE (sym
) < 0)
4077 S_SET_SEGMENT (sym
, absolute_section
);
4078 S_SET_VALUE (sym
, ~(int)S_GET_VALUE (sym
));
4080 else if ((S_GET_VALUE (sym
) & 1) != 0)
4082 struct label_line
*l
;
4084 for (l
= labels
; l
!= NULL
; l
= l
->next
)
4086 if (l
->label
== sym
)
4089 as_warn_where (l
->file
, l
->line
,
4090 _("text label `%s' aligned to odd boundary"),
4098 /* This is called if we go in or out of MRI mode because of the .mri
4102 m68k_mri_mode_change (on
)
4107 if (! flag_reg_prefix_optional
)
4109 flag_reg_prefix_optional
= 1;
4110 #ifdef REGISTER_PREFIX
4115 if (! m68k_rel32_from_cmdline
)
4120 if (! reg_prefix_optional_seen
)
4122 #ifdef REGISTER_PREFIX_OPTIONAL
4123 flag_reg_prefix_optional
= REGISTER_PREFIX_OPTIONAL
;
4125 flag_reg_prefix_optional
= 0;
4127 #ifdef REGISTER_PREFIX
4132 if (! m68k_rel32_from_cmdline
)
4137 /* Equal to MAX_PRECISION in atof-ieee.c */
4138 #define MAX_LITTLENUMS 6
4140 /* Turn a string in input_line_pointer into a floating point constant
4141 of type TYPE, and store the appropriate bytes in *LITP. The number
4142 of LITTLENUMS emitted is stored in *SIZEP. An error message is
4143 returned, or NULL on OK. */
4146 md_atof (type
, litP
, sizeP
)
4152 LITTLENUM_TYPE words
[MAX_LITTLENUMS
];
4153 LITTLENUM_TYPE
*wordP
;
4184 return _("Bad call to MD_ATOF()");
4186 t
= atof_ieee (input_line_pointer
, type
, words
);
4188 input_line_pointer
= t
;
4190 *sizeP
= prec
* sizeof (LITTLENUM_TYPE
);
4191 for (wordP
= words
; prec
--;)
4193 md_number_to_chars (litP
, (long) (*wordP
++), sizeof (LITTLENUM_TYPE
));
4194 litP
+= sizeof (LITTLENUM_TYPE
);
4200 md_number_to_chars (buf
, val
, n
)
4205 number_to_chars_bigendian (buf
, val
, n
);
4209 md_apply_fix_2 (fixP
, val
)
4213 addressT upper_limit
;
4214 offsetT lower_limit
;
4216 /* This is unnecessary but it convinces the native rs6000 compiler
4217 to generate the code we want. */
4218 char *buf
= fixP
->fx_frag
->fr_literal
;
4219 buf
+= fixP
->fx_where
;
4220 /* end ibm compiler workaround */
4222 val
= ((val
& 0xffffffff) ^ 0x80000000) - 0x80000000;
4227 memset (buf
, 0, fixP
->fx_size
);
4228 fixP
->fx_addnumber
= val
; /* Remember value for emit_reloc */
4230 if (fixP
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
4231 && !S_IS_DEFINED (fixP
->fx_addsy
)
4232 && !S_IS_WEAK (fixP
->fx_addsy
))
4233 S_SET_WEAK (fixP
->fx_addsy
);
4238 #ifdef BFD_ASSEMBLER
4239 if (fixP
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
4240 || fixP
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
)
4244 switch (fixP
->fx_size
)
4246 /* The cast to offsetT below are necessary to make code correct for
4247 machines where ints are smaller than offsetT */
4251 lower_limit
= - (offsetT
) 0x80;
4254 *buf
++ = (val
>> 8);
4256 upper_limit
= 0x7fff;
4257 lower_limit
= - (offsetT
) 0x8000;
4260 *buf
++ = (val
>> 24);
4261 *buf
++ = (val
>> 16);
4262 *buf
++ = (val
>> 8);
4264 upper_limit
= 0x7fffffff;
4265 lower_limit
= - (offsetT
) 0x7fffffff - 1; /* avoid constant overflow */
4268 BAD_CASE (fixP
->fx_size
);
4271 /* Fix up a negative reloc. */
4272 if (fixP
->fx_addsy
== NULL
&& fixP
->fx_subsy
!= NULL
)
4274 fixP
->fx_addsy
= fixP
->fx_subsy
;
4275 fixP
->fx_subsy
= NULL
;
4279 /* For non-pc-relative values, it's conceivable we might get something
4280 like "0xff" for a byte field. So extend the upper part of the range
4281 to accept such numbers. We arbitrarily disallow "-0xff" or "0xff+0xff",
4282 so that we can do any range checking at all. */
4283 if (! fixP
->fx_pcrel
&& ! fixP
->fx_signed
)
4284 upper_limit
= upper_limit
* 2 + 1;
4286 if ((addressT
) val
> upper_limit
4287 && (val
> 0 || val
< lower_limit
))
4288 as_bad_where (fixP
->fx_file
, fixP
->fx_line
, _("value out of range"));
4290 /* A one byte PC-relative reloc means a short branch. We can't use
4291 a short branch with a value of 0 or -1, because those indicate
4292 different opcodes (branches with longer offsets). fixup_segment
4293 in write.c may have clobbered fx_pcrel, so we need to examine the
4296 #ifdef BFD_ASSEMBLER
4297 || fixP
->fx_r_type
== BFD_RELOC_8_PCREL
4300 && fixP
->fx_size
== 1
4301 && (fixP
->fx_addsy
== NULL
4302 || S_IS_DEFINED (fixP
->fx_addsy
))
4303 && (val
== 0 || val
== -1))
4304 as_bad_where (fixP
->fx_file
, fixP
->fx_line
, _("invalid byte branch offset"));
4307 #ifdef BFD_ASSEMBLER
4309 md_apply_fix (fixP
, valp
)
4313 md_apply_fix_2 (fixP
, (addressT
) *valp
);
4317 void md_apply_fix (fixP
, val
)
4321 md_apply_fix_2 (fixP
, (addressT
) val
);
4325 /* *fragP has been relaxed to its final size, and now needs to have
4326 the bytes inside it modified to conform to the new size There is UGLY
4330 md_convert_frag_1 (fragP
)
4331 register fragS
*fragP
;
4336 /* Address in object code of the displacement. */
4337 register int object_address
= fragP
->fr_fix
+ fragP
->fr_address
;
4339 /* Address in gas core of the place to store the displacement. */
4340 /* This convinces the native rs6000 compiler to generate the code we
4342 register char *buffer_address
= fragP
->fr_literal
;
4343 buffer_address
+= fragP
->fr_fix
;
4344 /* end ibm compiler workaround */
4346 /* The displacement of the address, from current location. */
4347 disp
= fragP
->fr_symbol
? S_GET_VALUE (fragP
->fr_symbol
) : 0;
4348 disp
= (disp
+ fragP
->fr_offset
) - object_address
;
4350 #ifdef BFD_ASSEMBLER
4351 disp
+= symbol_get_frag (fragP
->fr_symbol
)->fr_address
;
4354 switch (fragP
->fr_subtype
)
4356 case TAB (BRANCHBWL
, BYTE
):
4357 case TAB (BRABSJUNC
, BYTE
):
4358 case TAB (BRABSJCOND
, BYTE
):
4359 case TAB (BRANCHBW
, BYTE
):
4360 know (issbyte (disp
));
4362 as_bad (_("short branch with zero offset: use :w"));
4363 fixP
= fix_new (fragP
, fragP
->fr_fix
- 1, 1, fragP
->fr_symbol
,
4364 fragP
->fr_offset
, 1, RELAX_RELOC_PC8
);
4365 fixP
->fx_pcrel_adjust
= -1;
4367 case TAB (BRANCHBWL
, SHORT
):
4368 case TAB (BRABSJUNC
, SHORT
):
4369 case TAB (BRABSJCOND
, SHORT
):
4370 case TAB (BRANCHBW
, SHORT
):
4371 fragP
->fr_opcode
[1] = 0x00;
4372 fix_new (fragP
, fragP
->fr_fix
, 2, fragP
->fr_symbol
, fragP
->fr_offset
,
4373 1, RELAX_RELOC_PC16
);
4376 case TAB (BRANCHBWL
, LONG
):
4377 fragP
->fr_opcode
[1] = (char) 0xFF;
4378 fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
, fragP
->fr_offset
,
4379 1, RELAX_RELOC_PC32
);
4382 case TAB (BRABSJUNC
, LONG
):
4383 if (fragP
->fr_opcode
[0] == 0x61) /* jbsr */
4385 fragP
->fr_opcode
[0] = 0x4E;
4386 fragP
->fr_opcode
[1] = (char) 0xB9; /* JSR with ABSL LONG operand */
4387 fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
, fragP
->fr_offset
,
4388 0, RELAX_RELOC_ABS32
);
4391 else if (fragP
->fr_opcode
[0] == 0x60) /* jbra */
4393 fragP
->fr_opcode
[0] = 0x4E;
4394 fragP
->fr_opcode
[1] = (char) 0xF9; /* JMP with ABSL LONG operand */
4395 fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
, fragP
->fr_offset
,
4396 0, RELAX_RELOC_ABS32
);
4401 /* This cannot happen, because jbsr and jbra are the only two
4402 unconditional branches. */
4406 case TAB (BRABSJCOND
, LONG
):
4407 /* Only Bcc 68000 instructions can come here. */
4408 /* Change bcc into b!cc/jmp absl long. */
4410 fragP
->fr_opcode
[0] ^= 0x01; /* invert bcc */
4411 fragP
->fr_opcode
[1] = 0x6;/* branch offset = 6 */
4413 /* JF: these used to be fr_opcode[2,3], but they may be in a
4414 different frag, in which case refering to them is a no-no.
4415 Only fr_opcode[0,1] are guaranteed to work. */
4416 *buffer_address
++ = 0x4e; /* put in jmp long (0x4ef9) */
4417 *buffer_address
++ = (char) 0xf9;
4418 fragP
->fr_fix
+= 2; /* account for jmp instruction */
4419 fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
4420 fragP
->fr_offset
, 0, RELAX_RELOC_ABS32
);
4423 case TAB (FBRANCH
, SHORT
):
4424 know ((fragP
->fr_opcode
[1] & 0x40) == 0);
4425 fix_new (fragP
, fragP
->fr_fix
, 2, fragP
->fr_symbol
, fragP
->fr_offset
,
4426 1, RELAX_RELOC_PC16
);
4429 case TAB (FBRANCH
, LONG
):
4430 fragP
->fr_opcode
[1] |= 0x40; /* Turn on LONG bit */
4431 fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
, fragP
->fr_offset
,
4432 1, RELAX_RELOC_PC32
);
4435 case TAB (DBCCLBR
, SHORT
):
4436 case TAB (DBCCABSJ
, SHORT
):
4437 fix_new (fragP
, fragP
->fr_fix
, 2, fragP
->fr_symbol
, fragP
->fr_offset
,
4438 1, RELAX_RELOC_PC16
);
4441 case TAB (DBCCLBR
, LONG
):
4442 /* only DBcc instructions can come here */
4443 /* Change dbcc into dbcc/bral. */
4445 /* JF: these used to be fr_opcode[2-7], but that's wrong */
4446 *buffer_address
++ = 0x00; /* branch offset = 4 */
4447 *buffer_address
++ = 0x04;
4448 *buffer_address
++ = 0x60; /* put in bra pc+6 */
4449 *buffer_address
++ = 0x06;
4450 *buffer_address
++ = 0x60; /* Put in bral (0x60ff). */
4451 *buffer_address
++ = (char) 0xff;
4453 fragP
->fr_fix
+= 6; /* account for bra/jmp instructions */
4454 fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
, fragP
->fr_offset
, 1,
4458 case TAB (DBCCABSJ
, LONG
):
4459 /* only DBcc instructions can come here */
4460 /* Change dbcc into dbcc/jmp. */
4462 /* JF: these used to be fr_opcode[2-7], but that's wrong */
4463 *buffer_address
++ = 0x00; /* branch offset = 4 */
4464 *buffer_address
++ = 0x04;
4465 *buffer_address
++ = 0x60; /* put in bra pc+6 */
4466 *buffer_address
++ = 0x06;
4467 *buffer_address
++ = 0x4e; /* Put in jmp long (0x4ef9). */
4468 *buffer_address
++ = (char) 0xf9;
4470 fragP
->fr_fix
+= 6; /* account for bra/jmp instructions */
4471 fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
, fragP
->fr_offset
, 0,
4475 case TAB (PCREL1632
, SHORT
):
4476 fragP
->fr_opcode
[1] &= ~0x3F;
4477 fragP
->fr_opcode
[1] |= 0x3A; /* 072 - mode 7.2 */
4478 fix_new (fragP
, (int) (fragP
->fr_fix
), 2, fragP
->fr_symbol
,
4479 fragP
->fr_offset
, 1, RELAX_RELOC_PC16
);
4482 case TAB (PCREL1632
, LONG
):
4483 /* Already set to mode 7.3; this indicates: PC indirect with
4484 suppressed index, 32-bit displacement. */
4485 *buffer_address
++ = 0x01;
4486 *buffer_address
++ = 0x70;
4488 fixP
= fix_new (fragP
, (int) (fragP
->fr_fix
), 4, fragP
->fr_symbol
,
4489 fragP
->fr_offset
, 1, RELAX_RELOC_PC32
);
4490 fixP
->fx_pcrel_adjust
= 2;
4493 case TAB (PCINDEX
, BYTE
):
4494 assert (fragP
->fr_fix
>= 2);
4495 buffer_address
[-2] &= ~1;
4496 fixP
= fix_new (fragP
, fragP
->fr_fix
- 1, 1, fragP
->fr_symbol
,
4497 fragP
->fr_offset
, 1, RELAX_RELOC_PC8
);
4498 fixP
->fx_pcrel_adjust
= 1;
4500 case TAB (PCINDEX
, SHORT
):
4501 assert (fragP
->fr_fix
>= 2);
4502 buffer_address
[-2] |= 0x1;
4503 buffer_address
[-1] = 0x20;
4504 fixP
= fix_new (fragP
, (int) (fragP
->fr_fix
), 2, fragP
->fr_symbol
,
4505 fragP
->fr_offset
, 1, RELAX_RELOC_PC16
);
4506 fixP
->fx_pcrel_adjust
= 2;
4509 case TAB (PCINDEX
, LONG
):
4510 assert (fragP
->fr_fix
>= 2);
4511 buffer_address
[-2] |= 0x1;
4512 buffer_address
[-1] = 0x30;
4513 fixP
= fix_new (fragP
, (int) (fragP
->fr_fix
), 4, fragP
->fr_symbol
,
4514 fragP
->fr_offset
, 1, RELAX_RELOC_PC32
);
4515 fixP
->fx_pcrel_adjust
= 2;
4518 case TAB (ABSTOPCREL
, SHORT
):
4519 fix_new (fragP
, fragP
->fr_fix
, 2, fragP
->fr_symbol
, fragP
->fr_offset
,
4520 1, RELAX_RELOC_PC16
);
4523 case TAB (ABSTOPCREL
, LONG
):
4524 /* The thing to do here is force it to ABSOLUTE LONG, since
4525 ABSTOPCREL is really trying to shorten an ABSOLUTE address anyway */
4526 if ((fragP
->fr_opcode
[1] & 0x3F) != 0x3A)
4528 fragP
->fr_opcode
[1] &= ~0x3F;
4529 fragP
->fr_opcode
[1] |= 0x39; /* Mode 7.1 */
4530 fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
, fragP
->fr_offset
,
4531 0, RELAX_RELOC_ABS32
);
4537 #ifndef BFD_ASSEMBLER
4540 md_convert_frag (headers
, sec
, fragP
)
4541 object_headers
*headers ATTRIBUTE_UNUSED
;
4542 segT sec ATTRIBUTE_UNUSED
;
4545 md_convert_frag_1 (fragP
);
4551 md_convert_frag (abfd
, sec
, fragP
)
4552 bfd
*abfd ATTRIBUTE_UNUSED
;
4553 segT sec ATTRIBUTE_UNUSED
;
4556 md_convert_frag_1 (fragP
);
4560 /* Force truly undefined symbols to their maximum size, and generally set up
4561 the frag list to be relaxed
4564 md_estimate_size_before_relax (fragP
, segment
)
4565 register fragS
*fragP
;
4570 old_fix
= fragP
->fr_fix
;
4572 /* Handle SZ_UNDEF first, it can be changed to BYTE or SHORT. */
4573 switch (fragP
->fr_subtype
)
4575 case TAB (BRANCHBWL
, SZ_UNDEF
):
4576 case TAB (BRABSJUNC
, SZ_UNDEF
):
4577 case TAB (BRABSJCOND
, SZ_UNDEF
):
4579 if (S_GET_SEGMENT (fragP
->fr_symbol
) == segment
4580 && relaxable_symbol (fragP
->fr_symbol
))
4582 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), BYTE
);
4584 else if (flag_short_refs
)
4586 /* Symbol is undefined and we want short ref. */
4587 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), SHORT
);
4591 /* Symbol is still undefined. Make it LONG. */
4592 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), LONG
);
4597 case TAB (BRANCHBW
, SZ_UNDEF
):
4599 if (S_GET_SEGMENT (fragP
->fr_symbol
) == segment
4600 && relaxable_symbol (fragP
->fr_symbol
))
4602 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), BYTE
);
4606 /* Symbol is undefined and we don't have long branches. */
4607 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), SHORT
);
4612 case TAB (FBRANCH
, SZ_UNDEF
):
4613 case TAB (DBCCLBR
, SZ_UNDEF
):
4614 case TAB (DBCCABSJ
, SZ_UNDEF
):
4615 case TAB (PCREL1632
, SZ_UNDEF
):
4617 if ((S_GET_SEGMENT (fragP
->fr_symbol
) == segment
4618 && relaxable_symbol (fragP
->fr_symbol
))
4621 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), SHORT
);
4625 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), LONG
);
4630 case TAB (PCINDEX
, SZ_UNDEF
):
4631 if ((S_GET_SEGMENT (fragP
->fr_symbol
) == segment
4632 && relaxable_symbol (fragP
->fr_symbol
)))
4634 fragP
->fr_subtype
= TAB (PCINDEX
, BYTE
);
4638 fragP
->fr_subtype
= TAB (PCINDEX
, LONG
);
4642 case TAB (ABSTOPCREL
, SZ_UNDEF
):
4644 if ((S_GET_SEGMENT (fragP
->fr_symbol
) == segment
4645 && relaxable_symbol (fragP
->fr_symbol
)))
4647 fragP
->fr_subtype
= TAB (ABSTOPCREL
, SHORT
);
4651 fragP
->fr_subtype
= TAB (ABSTOPCREL
, LONG
);
4660 /* Now that SZ_UNDEF are taken care of, check others. */
4661 switch (fragP
->fr_subtype
)
4663 case TAB (BRANCHBWL
, BYTE
):
4664 case TAB (BRABSJUNC
, BYTE
):
4665 case TAB (BRABSJCOND
, BYTE
):
4666 case TAB (BRANCHBW
, BYTE
):
4667 /* We can't do a short jump to the next instruction, so in that
4668 case we force word mode. At this point S_GET_VALUE should
4669 return the offset of the symbol within its frag. If the
4670 symbol is at the start of a frag, and it is the next frag
4671 with any data in it (usually this is just the next frag, but
4672 assembler listings may introduce empty frags), we must use
4674 if (fragP
->fr_symbol
&& S_GET_VALUE (fragP
->fr_symbol
) == 0)
4679 stop
= symbol_get_frag (fragP
->fr_symbol
);
4680 for (l
= fragP
->fr_next
; l
!= stop
; l
= l
->fr_next
)
4681 if (l
->fr_fix
+ l
->fr_var
!= 0)
4685 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), SHORT
);
4692 fragP
->fr_var
= md_relax_table
[fragP
->fr_subtype
].rlx_length
;
4693 return fragP
->fr_var
+ fragP
->fr_fix
- old_fix
;
4696 #if defined(OBJ_AOUT) | defined(OBJ_BOUT)
4697 /* the bit-field entries in the relocation_info struct plays hell
4698 with the byte-order problems of cross-assembly. So as a hack,
4699 I added this mach. dependent ri twiddler. Ugly, but it gets
4701 /* on m68k: first 4 bytes are normal unsigned long, next three bytes
4702 are symbolnum, most sig. byte first. Last byte is broken up with
4703 bit 7 as pcrel, bits 6 & 5 as length, bit 4 as pcrel, and the lower
4704 nibble as nuthin. (on Sun 3 at least) */
4705 /* Translate the internal relocation information into target-specific
4709 md_ri_to_chars (the_bytes
, ri
)
4711 struct reloc_info_generic
*ri
;
4714 md_number_to_chars (the_bytes
, ri
->r_address
, 4);
4715 /* now the fun stuff */
4716 the_bytes
[4] = (ri
->r_symbolnum
>> 16) & 0x0ff;
4717 the_bytes
[5] = (ri
->r_symbolnum
>> 8) & 0x0ff;
4718 the_bytes
[6] = ri
->r_symbolnum
& 0x0ff;
4719 the_bytes
[7] = (((ri
->r_pcrel
<< 7) & 0x80) | ((ri
->r_length
<< 5) & 0x60) |
4720 ((ri
->r_extern
<< 4) & 0x10));
4723 #endif /* comment */
4725 #ifndef BFD_ASSEMBLER
4727 tc_aout_fix_to_chars (where
, fixP
, segment_address_in_file
)
4730 relax_addressT segment_address_in_file
;
4733 * In: length of relocation (or of address) in chars: 1, 2 or 4.
4734 * Out: GNU LD relocation length code: 0, 1, or 2.
4737 static CONST
unsigned char nbytes_r_length
[] = {42, 0, 1, 42, 2};
4740 know (fixP
->fx_addsy
!= NULL
);
4742 md_number_to_chars (where
,
4743 fixP
->fx_frag
->fr_address
+ fixP
->fx_where
- segment_address_in_file
,
4746 r_symbolnum
= (S_IS_DEFINED (fixP
->fx_addsy
)
4747 ? S_GET_TYPE (fixP
->fx_addsy
)
4748 : fixP
->fx_addsy
->sy_number
);
4750 where
[4] = (r_symbolnum
>> 16) & 0x0ff;
4751 where
[5] = (r_symbolnum
>> 8) & 0x0ff;
4752 where
[6] = r_symbolnum
& 0x0ff;
4753 where
[7] = (((fixP
->fx_pcrel
<< 7) & 0x80) | ((nbytes_r_length
[fixP
->fx_size
] << 5) & 0x60) |
4754 (((!S_IS_DEFINED (fixP
->fx_addsy
)) << 4) & 0x10));
4758 #endif /* OBJ_AOUT or OBJ_BOUT */
4760 #ifndef WORKING_DOT_WORD
4761 CONST
int md_short_jump_size
= 4;
4762 CONST
int md_long_jump_size
= 6;
4765 md_create_short_jump (ptr
, from_addr
, to_addr
, frag
, to_symbol
)
4767 addressT from_addr
, to_addr
;
4768 fragS
*frag ATTRIBUTE_UNUSED
;
4769 symbolS
*to_symbol ATTRIBUTE_UNUSED
;
4773 offset
= to_addr
- (from_addr
+ 2);
4775 md_number_to_chars (ptr
, (valueT
) 0x6000, 2);
4776 md_number_to_chars (ptr
+ 2, (valueT
) offset
, 2);
4780 md_create_long_jump (ptr
, from_addr
, to_addr
, frag
, to_symbol
)
4782 addressT from_addr
, to_addr
;
4788 if (!HAVE_LONG_BRANCH(current_architecture
))
4790 offset
= to_addr
- S_GET_VALUE (to_symbol
);
4791 md_number_to_chars (ptr
, (valueT
) 0x4EF9, 2);
4792 md_number_to_chars (ptr
+ 2, (valueT
) offset
, 4);
4793 fix_new (frag
, (ptr
+ 2) - frag
->fr_literal
, 4, to_symbol
, (offsetT
) 0,
4798 offset
= to_addr
- (from_addr
+ 2);
4799 md_number_to_chars (ptr
, (valueT
) 0x60ff, 2);
4800 md_number_to_chars (ptr
+ 2, (valueT
) offset
, 4);
4806 /* Different values of OK tell what its OK to return. Things that
4807 aren't OK are an error (what a shock, no?)
4810 10: Absolute 1:8 only
4811 20: Absolute 0:7 only
4812 30: absolute 0:15 only
4813 40: Absolute 0:31 only
4814 50: absolute 0:127 only
4815 55: absolute -64:63 only
4816 60: absolute -128:127 only
4817 70: absolute 0:4095 only
4824 struct m68k_exp
*exp
;
4827 if (exp
->exp
.X_op
== O_absent
)
4829 /* Do the same thing the VAX asm does */
4830 op (exp
) = O_constant
;
4836 as_warn (_("expression out of range: defaulting to 1"));
4840 else if (exp
->exp
.X_op
== O_constant
)
4845 if (offs (exp
) < 1 || offs (exp
) > 8)
4847 as_warn (_("expression out of range: defaulting to 1"));
4852 if (offs (exp
) < 0 || offs (exp
) > 7)
4856 if (offs (exp
) < 0 || offs (exp
) > 15)
4860 if (offs (exp
) < 0 || offs (exp
) > 32)
4864 if (offs (exp
) < 0 || offs (exp
) > 127)
4868 if (offs (exp
) < -64 || offs (exp
) > 63)
4872 if (offs (exp
) < -128 || offs (exp
) > 127)
4876 if (offs (exp
) < 0 || offs (exp
) > 4095)
4879 as_warn (_("expression out of range: defaulting to 0"));
4887 else if (exp
->exp
.X_op
== O_big
)
4889 if (offs (exp
) <= 0 /* flonum */
4890 && (ok
== 80 /* no bignums */
4891 || (ok
> 10 /* small-int ranges including 0 ok */
4892 /* If we have a flonum zero, a zero integer should
4893 do as well (e.g., in moveq). */
4894 && generic_floating_point_number
.exponent
== 0
4895 && generic_floating_point_number
.low
[0] == 0)))
4897 /* HACK! Turn it into a long */
4898 LITTLENUM_TYPE words
[6];
4900 gen_to_words (words
, 2, 8L); /* These numbers are magic! */
4901 op (exp
) = O_constant
;
4904 offs (exp
) = words
[1] | (words
[0] << 16);
4908 op (exp
) = O_constant
;
4911 offs (exp
) = (ok
== 10) ? 1 : 0;
4912 as_warn (_("Can't deal with expression; defaulting to %ld"),
4918 if (ok
>= 10 && ok
<= 70)
4920 op (exp
) = O_constant
;
4923 offs (exp
) = (ok
== 10) ? 1 : 0;
4924 as_warn (_("Can't deal with expression; defaulting to %ld"),
4929 if (exp
->size
!= SIZE_UNSPEC
)
4937 if (!isbyte (offs (exp
)))
4938 as_warn (_("expression doesn't fit in BYTE"));
4941 if (!isword (offs (exp
)))
4942 as_warn (_("expression doesn't fit in WORD"));
4950 /* These are the back-ends for the various machine dependent pseudo-ops. */
4954 int ignore ATTRIBUTE_UNUSED
;
4956 subseg_set (data_section
, 1);
4957 demand_empty_rest_of_line ();
4962 int ignore ATTRIBUTE_UNUSED
;
4964 subseg_set (data_section
, 2);
4965 demand_empty_rest_of_line ();
4970 int ignore ATTRIBUTE_UNUSED
;
4972 /* We don't support putting frags in the BSS segment, we fake it
4973 by marking in_bss, then looking at s_skip for clues. */
4975 subseg_set (bss_section
, 0);
4976 demand_empty_rest_of_line ();
4981 int ignore ATTRIBUTE_UNUSED
;
4984 register long temp_fill
;
4986 temp
= 1; /* JF should be 2? */
4987 temp_fill
= get_absolute_expression ();
4988 if (!need_pass_2
) /* Never make frag if expect extra pass. */
4989 frag_align (temp
, (int) temp_fill
, 0);
4990 demand_empty_rest_of_line ();
4991 record_alignment (now_seg
, temp
);
4996 int ignore ATTRIBUTE_UNUSED
;
4998 demand_empty_rest_of_line ();
5001 /* Pseudo-ops handled for MRI compatibility. */
5003 /* This function returns non-zero if the argument is a conditional
5004 pseudo-op. This is called when checking whether a pending
5005 alignment is needed. */
5008 m68k_conditional_pseudoop (pop
)
5011 return (pop
->poc_handler
== s_mri_if
5012 || pop
->poc_handler
== s_mri_else
);
5015 /* Handle an MRI style chip specification. */
5024 s
= input_line_pointer
;
5025 /* We can't use get_symbol_end since the processor names are not proper
5027 while (is_part_of_name (c
= *input_line_pointer
++))
5029 *--input_line_pointer
= 0;
5030 for (i
= 0; i
< n_archs
; i
++)
5031 if (strcasecmp (s
, archs
[i
].name
) == 0)
5035 as_bad (_("%s: unrecognized processor name"), s
);
5036 *input_line_pointer
= c
;
5037 ignore_rest_of_line ();
5040 *input_line_pointer
= c
;
5042 if (*input_line_pointer
== '/')
5043 current_architecture
= 0;
5045 current_architecture
&= m68881
| m68851
;
5046 current_architecture
|= archs
[i
].arch
;
5048 while (*input_line_pointer
== '/')
5050 ++input_line_pointer
;
5051 s
= input_line_pointer
;
5052 /* We can't use get_symbol_end since the processor names are not
5054 while (is_part_of_name (c
= *input_line_pointer
++))
5056 *--input_line_pointer
= 0;
5057 if (strcmp (s
, "68881") == 0)
5058 current_architecture
|= m68881
;
5059 else if (strcmp (s
, "68851") == 0)
5060 current_architecture
|= m68851
;
5061 *input_line_pointer
= c
;
5064 /* Update info about available control registers. */
5065 select_control_regs ();
5068 /* The MRI CHIP pseudo-op. */
5072 int ignore ATTRIBUTE_UNUSED
;
5078 stop
= mri_comment_field (&stopc
);
5081 mri_comment_end (stop
, stopc
);
5082 demand_empty_rest_of_line ();
5085 /* The MRI FOPT pseudo-op. */
5089 int ignore ATTRIBUTE_UNUSED
;
5093 if (strncasecmp (input_line_pointer
, "ID=", 3) == 0)
5097 input_line_pointer
+= 3;
5098 temp
= get_absolute_expression ();
5099 if (temp
< 0 || temp
> 7)
5100 as_bad (_("bad coprocessor id"));
5102 m68k_float_copnum
= COP0
+ temp
;
5106 as_bad (_("unrecognized fopt option"));
5107 ignore_rest_of_line ();
5111 demand_empty_rest_of_line ();
5114 /* The structure used to handle the MRI OPT pseudo-op. */
5118 /* The name of the option. */
5121 /* If this is not NULL, just call this function. The first argument
5122 is the ARG field of this structure, the second argument is
5123 whether the option was negated. */
5124 void (*pfn
) PARAMS ((int arg
, int on
));
5126 /* If this is not NULL, and the PFN field is NULL, set the variable
5127 this points to. Set it to the ARG field if the option was not
5128 negated, and the NOTARG field otherwise. */
5131 /* The value to pass to PFN or to assign to *PVAR. */
5134 /* The value to assign to *PVAR if the option is negated. If PFN is
5135 NULL, and PVAR is not NULL, and ARG and NOTARG are the same, then
5136 the option may not be negated. */
5140 /* The table used to handle the MRI OPT pseudo-op. */
5142 static void skip_to_comma
PARAMS ((int, int));
5143 static void opt_nest
PARAMS ((int, int));
5144 static void opt_chip
PARAMS ((int, int));
5145 static void opt_list
PARAMS ((int, int));
5146 static void opt_list_symbols
PARAMS ((int, int));
5148 static const struct opt_action opt_table
[] =
5150 { "abspcadd", 0, &m68k_abspcadd
, 1, 0 },
5152 /* We do relaxing, so there is little use for these options. */
5153 { "b", 0, 0, 0, 0 },
5154 { "brs", 0, 0, 0, 0 },
5155 { "brb", 0, 0, 0, 0 },
5156 { "brl", 0, 0, 0, 0 },
5157 { "brw", 0, 0, 0, 0 },
5159 { "c", 0, 0, 0, 0 },
5160 { "cex", 0, 0, 0, 0 },
5161 { "case", 0, &symbols_case_sensitive
, 1, 0 },
5162 { "cl", 0, 0, 0, 0 },
5163 { "cre", 0, 0, 0, 0 },
5164 { "d", 0, &flag_keep_locals
, 1, 0 },
5165 { "e", 0, 0, 0, 0 },
5166 { "f", 0, &flag_short_refs
, 1, 0 },
5167 { "frs", 0, &flag_short_refs
, 1, 0 },
5168 { "frl", 0, &flag_short_refs
, 0, 1 },
5169 { "g", 0, 0, 0, 0 },
5170 { "i", 0, 0, 0, 0 },
5171 { "m", 0, 0, 0, 0 },
5172 { "mex", 0, 0, 0, 0 },
5173 { "mc", 0, 0, 0, 0 },
5174 { "md", 0, 0, 0, 0 },
5175 { "nest", opt_nest
, 0, 0, 0 },
5176 { "next", skip_to_comma
, 0, 0, 0 },
5177 { "o", 0, 0, 0, 0 },
5178 { "old", 0, 0, 0, 0 },
5179 { "op", skip_to_comma
, 0, 0, 0 },
5180 { "pco", 0, 0, 0, 0 },
5181 { "p", opt_chip
, 0, 0, 0 },
5182 { "pcr", 0, 0, 0, 0 },
5183 { "pcs", 0, 0, 0, 0 },
5184 { "r", 0, 0, 0, 0 },
5185 { "quick", 0, &m68k_quick
, 1, 0 },
5186 { "rel32", 0, &m68k_rel32
, 1, 0 },
5187 { "s", opt_list
, 0, 0, 0 },
5188 { "t", opt_list_symbols
, 0, 0, 0 },
5189 { "w", 0, &flag_no_warnings
, 0, 1 },
5193 #define OPTCOUNT ((int) (sizeof opt_table / sizeof opt_table[0]))
5195 /* The MRI OPT pseudo-op. */
5199 int ignore ATTRIBUTE_UNUSED
;
5207 const struct opt_action
*o
;
5212 if (*input_line_pointer
== '-')
5214 ++input_line_pointer
;
5217 else if (strncasecmp (input_line_pointer
, "NO", 2) == 0)
5219 input_line_pointer
+= 2;
5223 s
= input_line_pointer
;
5224 c
= get_symbol_end ();
5226 for (i
= 0, o
= opt_table
; i
< OPTCOUNT
; i
++, o
++)
5228 if (strcasecmp (s
, o
->name
) == 0)
5232 /* Restore input_line_pointer now in case the option
5234 *input_line_pointer
= c
;
5235 (*o
->pfn
) (o
->arg
, t
);
5237 else if (o
->pvar
!= NULL
)
5239 if (! t
&& o
->arg
== o
->notarg
)
5240 as_bad (_("option `%s' may not be negated"), s
);
5241 *input_line_pointer
= c
;
5242 *o
->pvar
= t
? o
->arg
: o
->notarg
;
5245 *input_line_pointer
= c
;
5251 as_bad (_("option `%s' not recognized"), s
);
5252 *input_line_pointer
= c
;
5255 while (*input_line_pointer
++ == ',');
5257 /* Move back to terminating character. */
5258 --input_line_pointer
;
5259 demand_empty_rest_of_line ();
5262 /* Skip ahead to a comma. This is used for OPT options which we do
5263 not suppor tand which take arguments. */
5266 skip_to_comma (arg
, on
)
5267 int arg ATTRIBUTE_UNUSED
;
5268 int on ATTRIBUTE_UNUSED
;
5270 while (*input_line_pointer
!= ','
5271 && ! is_end_of_line
[(unsigned char) *input_line_pointer
])
5272 ++input_line_pointer
;
5275 /* Handle the OPT NEST=depth option. */
5279 int arg ATTRIBUTE_UNUSED
;
5280 int on ATTRIBUTE_UNUSED
;
5282 if (*input_line_pointer
!= '=')
5284 as_bad (_("bad format of OPT NEST=depth"));
5288 ++input_line_pointer
;
5289 max_macro_nest
= get_absolute_expression ();
5292 /* Handle the OPT P=chip option. */
5296 int arg ATTRIBUTE_UNUSED
;
5297 int on ATTRIBUTE_UNUSED
;
5299 if (*input_line_pointer
!= '=')
5301 /* This is just OPT P, which we do not support. */
5305 ++input_line_pointer
;
5309 /* Handle the OPT S option. */
5313 int arg ATTRIBUTE_UNUSED
;
5319 /* Handle the OPT T option. */
5322 opt_list_symbols (arg
, on
)
5323 int arg ATTRIBUTE_UNUSED
;
5327 listing
|= LISTING_SYMBOLS
;
5329 listing
&=~ LISTING_SYMBOLS
;
5332 /* Handle the MRI REG pseudo-op. */
5336 int ignore ATTRIBUTE_UNUSED
;
5345 if (line_label
== NULL
)
5347 as_bad (_("missing label"));
5348 ignore_rest_of_line ();
5353 stop
= mri_comment_field (&stopc
);
5357 s
= input_line_pointer
;
5358 while (isalnum ((unsigned char) *input_line_pointer
)
5359 #ifdef REGISTER_PREFIX
5360 || *input_line_pointer
== REGISTER_PREFIX
5362 || *input_line_pointer
== '/'
5363 || *input_line_pointer
== '-')
5364 ++input_line_pointer
;
5365 c
= *input_line_pointer
;
5366 *input_line_pointer
= '\0';
5368 if (m68k_ip_op (s
, &rop
) != 0)
5370 if (rop
.error
== NULL
)
5371 as_bad (_("bad register list"));
5373 as_bad (_("bad register list: %s"), rop
.error
);
5374 *input_line_pointer
= c
;
5375 ignore_rest_of_line ();
5379 *input_line_pointer
= c
;
5381 if (rop
.mode
== REGLST
)
5383 else if (rop
.mode
== DREG
)
5384 mask
= 1 << (rop
.reg
- DATA0
);
5385 else if (rop
.mode
== AREG
)
5386 mask
= 1 << (rop
.reg
- ADDR0
+ 8);
5387 else if (rop
.mode
== FPREG
)
5388 mask
= 1 << (rop
.reg
- FP0
+ 16);
5389 else if (rop
.mode
== CONTROL
5392 else if (rop
.mode
== CONTROL
5395 else if (rop
.mode
== CONTROL
5400 as_bad (_("bad register list"));
5401 ignore_rest_of_line ();
5405 S_SET_SEGMENT (line_label
, reg_section
);
5406 S_SET_VALUE (line_label
, ~mask
);
5407 symbol_set_frag (line_label
, &zero_address_frag
);
5410 mri_comment_end (stop
, stopc
);
5412 demand_empty_rest_of_line ();
5415 /* This structure is used for the MRI SAVE and RESTORE pseudo-ops. */
5419 struct save_opts
*next
;
5421 int symbols_case_sensitive
;
5429 /* FIXME: We don't save OPT S. */
5432 /* This variable holds the stack of saved options. */
5434 static struct save_opts
*save_stack
;
5436 /* The MRI SAVE pseudo-op. */
5440 int ignore ATTRIBUTE_UNUSED
;
5442 struct save_opts
*s
;
5444 s
= (struct save_opts
*) xmalloc (sizeof (struct save_opts
));
5445 s
->abspcadd
= m68k_abspcadd
;
5446 s
->symbols_case_sensitive
= symbols_case_sensitive
;
5447 s
->keep_locals
= flag_keep_locals
;
5448 s
->short_refs
= flag_short_refs
;
5449 s
->architecture
= current_architecture
;
5450 s
->quick
= m68k_quick
;
5451 s
->rel32
= m68k_rel32
;
5452 s
->listing
= listing
;
5453 s
->no_warnings
= flag_no_warnings
;
5455 s
->next
= save_stack
;
5458 demand_empty_rest_of_line ();
5461 /* The MRI RESTORE pseudo-op. */
5465 int ignore ATTRIBUTE_UNUSED
;
5467 struct save_opts
*s
;
5469 if (save_stack
== NULL
)
5471 as_bad (_("restore without save"));
5472 ignore_rest_of_line ();
5477 save_stack
= s
->next
;
5479 m68k_abspcadd
= s
->abspcadd
;
5480 symbols_case_sensitive
= s
->symbols_case_sensitive
;
5481 flag_keep_locals
= s
->keep_locals
;
5482 flag_short_refs
= s
->short_refs
;
5483 current_architecture
= s
->architecture
;
5484 m68k_quick
= s
->quick
;
5485 m68k_rel32
= s
->rel32
;
5486 listing
= s
->listing
;
5487 flag_no_warnings
= s
->no_warnings
;
5491 demand_empty_rest_of_line ();
5494 /* Types of MRI structured control directives. */
5496 enum mri_control_type
5504 /* This structure is used to stack the MRI structured control
5507 struct mri_control_info
5509 /* The directive within which this one is enclosed. */
5510 struct mri_control_info
*outer
;
5512 /* The type of directive. */
5513 enum mri_control_type type
;
5515 /* Whether an ELSE has been in an IF. */
5518 /* The add or sub statement at the end of a FOR. */
5521 /* The label of the top of a FOR or REPEAT loop. */
5524 /* The label to jump to for the next iteration, or the else
5525 expression of a conditional. */
5528 /* The label to jump to to break out of the loop, or the label past
5529 the end of a conditional. */
5533 /* The stack of MRI structured control directives. */
5535 static struct mri_control_info
*mri_control_stack
;
5537 /* The current MRI structured control directive index number, used to
5538 generate label names. */
5540 static int mri_control_index
;
5542 /* Some function prototypes. */
5544 static void mri_assemble
PARAMS ((char *));
5545 static char *mri_control_label
PARAMS ((void));
5546 static struct mri_control_info
*push_mri_control
5547 PARAMS ((enum mri_control_type
));
5548 static void pop_mri_control
PARAMS ((void));
5549 static int parse_mri_condition
PARAMS ((int *));
5550 static int parse_mri_control_operand
5551 PARAMS ((int *, char **, char **, char **, char **));
5552 static int swap_mri_condition
PARAMS ((int));
5553 static int reverse_mri_condition
PARAMS ((int));
5554 static void build_mri_control_operand
5555 PARAMS ((int, int, char *, char *, char *, char *, const char *,
5556 const char *, int));
5557 static void parse_mri_control_expression
5558 PARAMS ((char *, int, const char *, const char *, int));
5560 /* Assemble an instruction for an MRI structured control directive. */
5568 /* md_assemble expects the opcode to be in lower case. */
5569 for (s
= str
; *s
!= ' ' && *s
!= '\0'; s
++)
5571 if (isupper ((unsigned char) *s
))
5572 *s
= tolower ((unsigned char) *s
);
5578 /* Generate a new MRI label structured control directive label name. */
5581 mri_control_label ()
5585 n
= (char *) xmalloc (20);
5586 sprintf (n
, "%smc%d", FAKE_LABEL_NAME
, mri_control_index
);
5587 ++mri_control_index
;
5591 /* Create a new MRI structured control directive. */
5593 static struct mri_control_info
*
5594 push_mri_control (type
)
5595 enum mri_control_type type
;
5597 struct mri_control_info
*n
;
5599 n
= (struct mri_control_info
*) xmalloc (sizeof (struct mri_control_info
));
5603 if (type
== mri_if
|| type
== mri_while
)
5606 n
->top
= mri_control_label ();
5607 n
->next
= mri_control_label ();
5608 n
->bottom
= mri_control_label ();
5610 n
->outer
= mri_control_stack
;
5611 mri_control_stack
= n
;
5616 /* Pop off the stack of MRI structured control directives. */
5621 struct mri_control_info
*n
;
5623 n
= mri_control_stack
;
5624 mri_control_stack
= n
->outer
;
5632 /* Recognize a condition code in an MRI structured control expression. */
5635 parse_mri_condition (pcc
)
5640 know (*input_line_pointer
== '<');
5642 ++input_line_pointer
;
5643 c1
= *input_line_pointer
++;
5644 c2
= *input_line_pointer
++;
5646 if (*input_line_pointer
!= '>')
5648 as_bad (_("syntax error in structured control directive"));
5652 ++input_line_pointer
;
5660 *pcc
= (c1
<< 8) | c2
;
5665 /* Parse a single operand in an MRI structured control expression. */
5668 parse_mri_control_operand (pcc
, leftstart
, leftstop
, rightstart
, rightstop
)
5685 if (*input_line_pointer
== '<')
5687 /* It's just a condition code. */
5688 return parse_mri_condition (pcc
);
5691 /* Look ahead for the condition code. */
5692 for (s
= input_line_pointer
; *s
!= '\0'; ++s
)
5694 if (*s
== '<' && s
[1] != '\0' && s
[2] != '\0' && s
[3] == '>')
5699 as_bad (_("missing condition code in structured control directive"));
5703 *leftstart
= input_line_pointer
;
5705 if (*leftstop
> *leftstart
5706 && ((*leftstop
)[-1] == ' ' || (*leftstop
)[-1] == '\t'))
5709 input_line_pointer
= s
;
5710 if (! parse_mri_condition (pcc
))
5713 /* Look ahead for AND or OR or end of line. */
5714 for (s
= input_line_pointer
; *s
!= '\0'; ++s
)
5716 if ((strncasecmp (s
, "AND", 3) == 0
5717 && (s
[3] == '.' || ! is_part_of_name (s
[3])))
5718 || (strncasecmp (s
, "OR", 2) == 0
5719 && (s
[2] == '.' || ! is_part_of_name (s
[2]))))
5723 *rightstart
= input_line_pointer
;
5725 if (*rightstop
> *rightstart
5726 && ((*rightstop
)[-1] == ' ' || (*rightstop
)[-1] == '\t'))
5729 input_line_pointer
= s
;
5734 #define MCC(b1, b2) (((b1) << 8) | (b2))
5736 /* Swap the sense of a condition. This changes the condition so that
5737 it generates the same result when the operands are swapped. */
5740 swap_mri_condition (cc
)
5745 case MCC ('h', 'i'): return MCC ('c', 's');
5746 case MCC ('l', 's'): return MCC ('c', 'c');
5747 case MCC ('c', 'c'): return MCC ('l', 's');
5748 case MCC ('c', 's'): return MCC ('h', 'i');
5749 case MCC ('p', 'l'): return MCC ('m', 'i');
5750 case MCC ('m', 'i'): return MCC ('p', 'l');
5751 case MCC ('g', 'e'): return MCC ('l', 'e');
5752 case MCC ('l', 't'): return MCC ('g', 't');
5753 case MCC ('g', 't'): return MCC ('l', 't');
5754 case MCC ('l', 'e'): return MCC ('g', 'e');
5759 /* Reverse the sense of a condition. */
5762 reverse_mri_condition (cc
)
5767 case MCC ('h', 'i'): return MCC ('l', 's');
5768 case MCC ('l', 's'): return MCC ('h', 'i');
5769 case MCC ('c', 'c'): return MCC ('c', 's');
5770 case MCC ('c', 's'): return MCC ('c', 'c');
5771 case MCC ('n', 'e'): return MCC ('e', 'q');
5772 case MCC ('e', 'q'): return MCC ('n', 'e');
5773 case MCC ('v', 'c'): return MCC ('v', 's');
5774 case MCC ('v', 's'): return MCC ('v', 'c');
5775 case MCC ('p', 'l'): return MCC ('m', 'i');
5776 case MCC ('m', 'i'): return MCC ('p', 'l');
5777 case MCC ('g', 'e'): return MCC ('l', 't');
5778 case MCC ('l', 't'): return MCC ('g', 'e');
5779 case MCC ('g', 't'): return MCC ('l', 'e');
5780 case MCC ('l', 'e'): return MCC ('g', 't');
5785 /* Build an MRI structured control expression. This generates test
5786 and branch instructions. It goes to TRUELAB if the condition is
5787 true, and to FALSELAB if the condition is false. Exactly one of
5788 TRUELAB and FALSELAB will be NULL, meaning to fall through. QUAL
5789 is the size qualifier for the expression. EXTENT is the size to
5790 use for the branch. */
5793 build_mri_control_operand (qual
, cc
, leftstart
, leftstop
, rightstart
,
5794 rightstop
, truelab
, falselab
, extent
)
5801 const char *truelab
;
5802 const char *falselab
;
5808 if (leftstart
!= NULL
)
5810 struct m68k_op leftop
, rightop
;
5813 /* Swap the compare operands, if necessary, to produce a legal
5814 m68k compare instruction. Comparing a register operand with
5815 a non-register operand requires the register to be on the
5816 right (cmp, cmpa). Comparing an immediate value with
5817 anything requires the immediate value to be on the left
5822 (void) m68k_ip_op (leftstart
, &leftop
);
5827 (void) m68k_ip_op (rightstart
, &rightop
);
5830 if (rightop
.mode
== IMMED
5831 || ((leftop
.mode
== DREG
|| leftop
.mode
== AREG
)
5832 && (rightop
.mode
!= DREG
&& rightop
.mode
!= AREG
)))
5836 cc
= swap_mri_condition (cc
);
5838 leftstart
= rightstart
;
5841 leftstop
= rightstop
;
5846 if (truelab
== NULL
)
5848 cc
= reverse_mri_condition (cc
);
5852 if (leftstart
!= NULL
)
5854 buf
= (char *) xmalloc (20
5855 + (leftstop
- leftstart
)
5856 + (rightstop
- rightstart
));
5864 memcpy (s
, leftstart
, leftstop
- leftstart
);
5865 s
+= leftstop
- leftstart
;
5867 memcpy (s
, rightstart
, rightstop
- rightstart
);
5868 s
+= rightstop
- rightstart
;
5874 buf
= (char *) xmalloc (20 + strlen (truelab
));
5882 strcpy (s
, truelab
);
5887 /* Parse an MRI structured control expression. This generates test
5888 and branch instructions. STOP is where the expression ends. It
5889 goes to TRUELAB if the condition is true, and to FALSELAB if the
5890 condition is false. Exactly one of TRUELAB and FALSELAB will be
5891 NULL, meaning to fall through. QUAL is the size qualifier for the
5892 expression. EXTENT is the size to use for the branch. */
5895 parse_mri_control_expression (stop
, qual
, truelab
, falselab
, extent
)
5898 const char *truelab
;
5899 const char *falselab
;
5912 if (! parse_mri_control_operand (&cc
, &leftstart
, &leftstop
,
5913 &rightstart
, &rightstop
))
5919 if (strncasecmp (input_line_pointer
, "AND", 3) == 0)
5923 if (falselab
!= NULL
)
5926 flab
= mri_control_label ();
5928 build_mri_control_operand (qual
, cc
, leftstart
, leftstop
, rightstart
,
5929 rightstop
, (const char *) NULL
, flab
, extent
);
5931 input_line_pointer
+= 3;
5932 if (*input_line_pointer
!= '.'
5933 || input_line_pointer
[1] == '\0')
5937 qual
= input_line_pointer
[1];
5938 input_line_pointer
+= 2;
5941 if (! parse_mri_control_operand (&cc
, &leftstart
, &leftstop
,
5942 &rightstart
, &rightstop
))
5948 build_mri_control_operand (qual
, cc
, leftstart
, leftstop
, rightstart
,
5949 rightstop
, truelab
, falselab
, extent
);
5951 if (falselab
== NULL
)
5954 else if (strncasecmp (input_line_pointer
, "OR", 2) == 0)
5958 if (truelab
!= NULL
)
5961 tlab
= mri_control_label ();
5963 build_mri_control_operand (qual
, cc
, leftstart
, leftstop
, rightstart
,
5964 rightstop
, tlab
, (const char *) NULL
, extent
);
5966 input_line_pointer
+= 2;
5967 if (*input_line_pointer
!= '.'
5968 || input_line_pointer
[1] == '\0')
5972 qual
= input_line_pointer
[1];
5973 input_line_pointer
+= 2;
5976 if (! parse_mri_control_operand (&cc
, &leftstart
, &leftstop
,
5977 &rightstart
, &rightstop
))
5983 build_mri_control_operand (qual
, cc
, leftstart
, leftstop
, rightstart
,
5984 rightstop
, truelab
, falselab
, extent
);
5986 if (truelab
== NULL
)
5991 build_mri_control_operand (qual
, cc
, leftstart
, leftstop
, rightstart
,
5992 rightstop
, truelab
, falselab
, extent
);
5996 if (input_line_pointer
!= stop
)
5997 as_bad (_("syntax error in structured control directive"));
6000 /* Handle the MRI IF pseudo-op. This may be a structured control
6001 directive, or it may be a regular assembler conditional, depending
6010 struct mri_control_info
*n
;
6012 /* A structured control directive must end with THEN with an
6013 optional qualifier. */
6014 s
= input_line_pointer
;
6015 while (! is_end_of_line
[(unsigned char) *s
]
6016 && (! flag_mri
|| *s
!= '*'))
6019 while (s
> input_line_pointer
&& (*s
== ' ' || *s
== '\t'))
6022 if (s
- input_line_pointer
> 1
6026 if (s
- input_line_pointer
< 3
6027 || strncasecmp (s
- 3, "THEN", 4) != 0)
6031 as_bad (_("missing then"));
6032 ignore_rest_of_line ();
6036 /* It's a conditional. */
6041 /* Since this might be a conditional if, this pseudo-op will be
6042 called even if we are supported to be ignoring input. Double
6043 check now. Clobber *input_line_pointer so that ignore_input
6044 thinks that this is not a special pseudo-op. */
6045 c
= *input_line_pointer
;
6046 *input_line_pointer
= 0;
6047 if (ignore_input ())
6049 *input_line_pointer
= c
;
6050 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6051 ++input_line_pointer
;
6052 demand_empty_rest_of_line ();
6055 *input_line_pointer
= c
;
6057 n
= push_mri_control (mri_if
);
6059 parse_mri_control_expression (s
- 3, qual
, (const char *) NULL
,
6060 n
->next
, s
[1] == '.' ? s
[2] : '\0');
6063 input_line_pointer
= s
+ 3;
6065 input_line_pointer
= s
+ 1;
6069 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6070 ++input_line_pointer
;
6073 demand_empty_rest_of_line ();
6076 /* Handle the MRI else pseudo-op. If we are currently doing an MRI
6077 structured IF, associate the ELSE with the IF. Otherwise, assume
6078 it is a conditional else. */
6089 && (mri_control_stack
== NULL
6090 || mri_control_stack
->type
!= mri_if
6091 || mri_control_stack
->else_seen
))
6097 c
= *input_line_pointer
;
6098 *input_line_pointer
= 0;
6099 if (ignore_input ())
6101 *input_line_pointer
= c
;
6102 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6103 ++input_line_pointer
;
6104 demand_empty_rest_of_line ();
6107 *input_line_pointer
= c
;
6109 if (mri_control_stack
== NULL
6110 || mri_control_stack
->type
!= mri_if
6111 || mri_control_stack
->else_seen
)
6113 as_bad (_("else without matching if"));
6114 ignore_rest_of_line ();
6118 mri_control_stack
->else_seen
= 1;
6120 buf
= (char *) xmalloc (20 + strlen (mri_control_stack
->bottom
));
6123 sprintf (buf
, "bra%s %s", q
, mri_control_stack
->bottom
);
6127 colon (mri_control_stack
->next
);
6131 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6132 ++input_line_pointer
;
6135 demand_empty_rest_of_line ();
6138 /* Handle the MRI ENDI pseudo-op. */
6142 int ignore ATTRIBUTE_UNUSED
;
6144 if (mri_control_stack
== NULL
6145 || mri_control_stack
->type
!= mri_if
)
6147 as_bad (_("endi without matching if"));
6148 ignore_rest_of_line ();
6152 /* ignore_input will not return true for ENDI, so we don't need to
6153 worry about checking it again here. */
6155 if (! mri_control_stack
->else_seen
)
6156 colon (mri_control_stack
->next
);
6157 colon (mri_control_stack
->bottom
);
6163 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6164 ++input_line_pointer
;
6167 demand_empty_rest_of_line ();
6170 /* Handle the MRI BREAK pseudo-op. */
6173 s_mri_break (extent
)
6176 struct mri_control_info
*n
;
6180 n
= mri_control_stack
;
6182 && n
->type
!= mri_for
6183 && n
->type
!= mri_repeat
6184 && n
->type
!= mri_while
)
6188 as_bad (_("break outside of structured loop"));
6189 ignore_rest_of_line ();
6193 buf
= (char *) xmalloc (20 + strlen (n
->bottom
));
6196 sprintf (buf
, "bra%s %s", ex
, n
->bottom
);
6202 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6203 ++input_line_pointer
;
6206 demand_empty_rest_of_line ();
6209 /* Handle the MRI NEXT pseudo-op. */
6215 struct mri_control_info
*n
;
6219 n
= mri_control_stack
;
6221 && n
->type
!= mri_for
6222 && n
->type
!= mri_repeat
6223 && n
->type
!= mri_while
)
6227 as_bad (_("next outside of structured loop"));
6228 ignore_rest_of_line ();
6232 buf
= (char *) xmalloc (20 + strlen (n
->next
));
6235 sprintf (buf
, "bra%s %s", ex
, n
->next
);
6241 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6242 ++input_line_pointer
;
6245 demand_empty_rest_of_line ();
6248 /* Handle the MRI FOR pseudo-op. */
6254 const char *varstart
, *varstop
;
6255 const char *initstart
, *initstop
;
6256 const char *endstart
, *endstop
;
6257 const char *bystart
, *bystop
;
6261 struct mri_control_info
*n
;
6267 FOR.q var = init { TO | DOWNTO } end [ BY by ] DO.e
6271 varstart
= input_line_pointer
;
6273 /* Look for the '='. */
6274 while (! is_end_of_line
[(unsigned char) *input_line_pointer
]
6275 && *input_line_pointer
!= '=')
6276 ++input_line_pointer
;
6277 if (*input_line_pointer
!= '=')
6279 as_bad (_("missing ="));
6280 ignore_rest_of_line ();
6284 varstop
= input_line_pointer
;
6285 if (varstop
> varstart
6286 && (varstop
[-1] == ' ' || varstop
[-1] == '\t'))
6289 ++input_line_pointer
;
6291 initstart
= input_line_pointer
;
6293 /* Look for TO or DOWNTO. */
6296 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6298 if (strncasecmp (input_line_pointer
, "TO", 2) == 0
6299 && ! is_part_of_name (input_line_pointer
[2]))
6301 initstop
= input_line_pointer
;
6302 input_line_pointer
+= 2;
6305 if (strncasecmp (input_line_pointer
, "DOWNTO", 6) == 0
6306 && ! is_part_of_name (input_line_pointer
[6]))
6308 initstop
= input_line_pointer
;
6310 input_line_pointer
+= 6;
6313 ++input_line_pointer
;
6315 if (initstop
== NULL
)
6317 as_bad (_("missing to or downto"));
6318 ignore_rest_of_line ();
6321 if (initstop
> initstart
6322 && (initstop
[-1] == ' ' || initstop
[-1] == '\t'))
6326 endstart
= input_line_pointer
;
6328 /* Look for BY or DO. */
6331 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6333 if (strncasecmp (input_line_pointer
, "BY", 2) == 0
6334 && ! is_part_of_name (input_line_pointer
[2]))
6336 endstop
= input_line_pointer
;
6338 input_line_pointer
+= 2;
6341 if (strncasecmp (input_line_pointer
, "DO", 2) == 0
6342 && (input_line_pointer
[2] == '.'
6343 || ! is_part_of_name (input_line_pointer
[2])))
6345 endstop
= input_line_pointer
;
6346 input_line_pointer
+= 2;
6349 ++input_line_pointer
;
6351 if (endstop
== NULL
)
6353 as_bad (_("missing do"));
6354 ignore_rest_of_line ();
6357 if (endstop
> endstart
6358 && (endstop
[-1] == ' ' || endstop
[-1] == '\t'))
6364 bystop
= bystart
+ 2;
6369 bystart
= input_line_pointer
;
6373 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6375 if (strncasecmp (input_line_pointer
, "DO", 2) == 0
6376 && (input_line_pointer
[2] == '.'
6377 || ! is_part_of_name (input_line_pointer
[2])))
6379 bystop
= input_line_pointer
;
6380 input_line_pointer
+= 2;
6383 ++input_line_pointer
;
6387 as_bad (_("missing do"));
6388 ignore_rest_of_line ();
6391 if (bystop
> bystart
6392 && (bystop
[-1] == ' ' || bystop
[-1] == '\t'))
6396 if (*input_line_pointer
!= '.')
6400 extent
= input_line_pointer
[1];
6401 input_line_pointer
+= 2;
6404 /* We have fully parsed the FOR operands. Now build the loop. */
6406 n
= push_mri_control (mri_for
);
6408 buf
= (char *) xmalloc (50 + (input_line_pointer
- varstart
));
6419 memcpy (s
, initstart
, initstop
- initstart
);
6420 s
+= initstop
- initstart
;
6422 memcpy (s
, varstart
, varstop
- varstart
);
6423 s
+= varstop
- varstart
;
6437 memcpy (s
, endstart
, endstop
- endstart
);
6438 s
+= endstop
- endstart
;
6440 memcpy (s
, varstart
, varstop
- varstart
);
6441 s
+= varstop
- varstart
;
6449 sprintf (buf
, "blt%s %s", ex
, n
->bottom
);
6451 sprintf (buf
, "bgt%s %s", ex
, n
->bottom
);
6454 /* Put together the add or sub instruction used by ENDF. */
6464 memcpy (s
, bystart
, bystop
- bystart
);
6465 s
+= bystop
- bystart
;
6467 memcpy (s
, varstart
, varstop
- varstart
);
6468 s
+= varstop
- varstart
;
6474 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6475 ++input_line_pointer
;
6478 demand_empty_rest_of_line ();
6481 /* Handle the MRI ENDF pseudo-op. */
6485 int ignore ATTRIBUTE_UNUSED
;
6487 if (mri_control_stack
== NULL
6488 || mri_control_stack
->type
!= mri_for
)
6490 as_bad (_("endf without for"));
6491 ignore_rest_of_line ();
6495 colon (mri_control_stack
->next
);
6497 mri_assemble (mri_control_stack
->incr
);
6499 sprintf (mri_control_stack
->incr
, "bra %s", mri_control_stack
->top
);
6500 mri_assemble (mri_control_stack
->incr
);
6502 free (mri_control_stack
->incr
);
6504 colon (mri_control_stack
->bottom
);
6510 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6511 ++input_line_pointer
;
6514 demand_empty_rest_of_line ();
6517 /* Handle the MRI REPEAT pseudo-op. */
6520 s_mri_repeat (ignore
)
6521 int ignore ATTRIBUTE_UNUSED
;
6523 struct mri_control_info
*n
;
6525 n
= push_mri_control (mri_repeat
);
6529 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6530 ++input_line_pointer
;
6532 demand_empty_rest_of_line ();
6535 /* Handle the MRI UNTIL pseudo-op. */
6543 if (mri_control_stack
== NULL
6544 || mri_control_stack
->type
!= mri_repeat
)
6546 as_bad (_("until without repeat"));
6547 ignore_rest_of_line ();
6551 colon (mri_control_stack
->next
);
6553 for (s
= input_line_pointer
; ! is_end_of_line
[(unsigned char) *s
]; s
++)
6556 parse_mri_control_expression (s
, qual
, (const char *) NULL
,
6557 mri_control_stack
->top
, '\0');
6559 colon (mri_control_stack
->bottom
);
6561 input_line_pointer
= s
;
6567 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6568 ++input_line_pointer
;
6571 demand_empty_rest_of_line ();
6574 /* Handle the MRI WHILE pseudo-op. */
6582 struct mri_control_info
*n
;
6584 s
= input_line_pointer
;
6585 while (! is_end_of_line
[(unsigned char) *s
]
6586 && (! flag_mri
|| *s
!= '*'))
6589 while (*s
== ' ' || *s
== '\t')
6591 if (s
- input_line_pointer
> 1
6594 if (s
- input_line_pointer
< 2
6595 || strncasecmp (s
- 1, "DO", 2) != 0)
6597 as_bad (_("missing do"));
6598 ignore_rest_of_line ();
6602 n
= push_mri_control (mri_while
);
6606 parse_mri_control_expression (s
- 1, qual
, (const char *) NULL
, n
->bottom
,
6607 s
[1] == '.' ? s
[2] : '\0');
6609 input_line_pointer
= s
+ 1;
6610 if (*input_line_pointer
== '.')
6611 input_line_pointer
+= 2;
6615 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6616 ++input_line_pointer
;
6619 demand_empty_rest_of_line ();
6622 /* Handle the MRI ENDW pseudo-op. */
6626 int ignore ATTRIBUTE_UNUSED
;
6630 if (mri_control_stack
== NULL
6631 || mri_control_stack
->type
!= mri_while
)
6633 as_bad (_("endw without while"));
6634 ignore_rest_of_line ();
6638 buf
= (char *) xmalloc (20 + strlen (mri_control_stack
->next
));
6639 sprintf (buf
, "bra %s", mri_control_stack
->next
);
6643 colon (mri_control_stack
->bottom
);
6649 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6650 ++input_line_pointer
;
6653 demand_empty_rest_of_line ();
6658 * Invocation line includes a switch not recognized by the base assembler.
6659 * See if it's a processor-specific option. These are:
6661 * -[A]m[c]68000, -[A]m[c]68008, -[A]m[c]68010, -[A]m[c]68020, -[A]m[c]68030, -[A]m[c]68040
6662 * -[A]m[c]68881, -[A]m[c]68882, -[A]m[c]68851
6663 * Select the architecture. Instructions or features not
6664 * supported by the selected architecture cause fatal
6665 * errors. More than one may be specified. The default is
6666 * -m68020 -m68851 -m68881. Note that -m68008 is a synonym
6667 * for -m68000, and -m68882 is a synonym for -m68881.
6668 * -[A]m[c]no-68851, -[A]m[c]no-68881
6669 * Don't accept 688?1 instructions. (The "c" is kind of silly,
6670 * so don't use or document it, but that's the way the parsing
6673 * -pic Indicates PIC.
6674 * -k Indicates PIC. (Sun 3 only.)
6675 * --pcrel Never turn PC-relative branches into absolute jumps.
6678 * Permit `|' to be used in expressions.
6683 CONST
char *md_shortopts
= "lSA:m:kQ:V";
6685 CONST
char *md_shortopts
= "lSA:m:k";
6688 struct option md_longopts
[] = {
6689 #define OPTION_PIC (OPTION_MD_BASE)
6690 {"pic", no_argument
, NULL
, OPTION_PIC
},
6691 #define OPTION_REGISTER_PREFIX_OPTIONAL (OPTION_MD_BASE + 1)
6692 {"register-prefix-optional", no_argument
, NULL
,
6693 OPTION_REGISTER_PREFIX_OPTIONAL
},
6694 #define OPTION_BITWISE_OR (OPTION_MD_BASE + 2)
6695 {"bitwise-or", no_argument
, NULL
, OPTION_BITWISE_OR
},
6696 #define OPTION_BASE_SIZE_DEFAULT_16 (OPTION_MD_BASE + 3)
6697 {"base-size-default-16", no_argument
, NULL
, OPTION_BASE_SIZE_DEFAULT_16
},
6698 #define OPTION_BASE_SIZE_DEFAULT_32 (OPTION_MD_BASE + 4)
6699 {"base-size-default-32", no_argument
, NULL
, OPTION_BASE_SIZE_DEFAULT_32
},
6700 #define OPTION_DISP_SIZE_DEFAULT_16 (OPTION_MD_BASE + 5)
6701 {"disp-size-default-16", no_argument
, NULL
, OPTION_DISP_SIZE_DEFAULT_16
},
6702 #define OPTION_DISP_SIZE_DEFAULT_32 (OPTION_MD_BASE + 6)
6703 {"disp-size-default-32", no_argument
, NULL
, OPTION_DISP_SIZE_DEFAULT_32
},
6704 #define OPTION_PCREL (OPTION_MD_BASE + 7)
6705 {"pcrel", no_argument
, NULL
, OPTION_PCREL
},
6706 {NULL
, no_argument
, NULL
, 0}
6708 size_t md_longopts_size
= sizeof (md_longopts
);
6711 md_parse_option (c
, arg
)
6717 case 'l': /* -l means keep external to 2 bit offset
6718 rather than 16 bit one */
6719 flag_short_refs
= 1;
6722 case 'S': /* -S means that jbsr's always turn into
6724 flag_long_jumps
= 1;
6727 case OPTION_PCREL
: /* --pcrel means never turn PC-relative
6728 branches into absolute jumps. */
6729 flag_keep_pcrel
= 1;
6735 /* intentional fall-through */
6738 if (arg
[0] == 'n' && arg
[1] == 'o' && arg
[2] == '-')
6742 const char *oarg
= arg
;
6748 if (arg
[0] == 'c' && arg
[1] == '6')
6751 for (i
= 0; i
< n_archs
; i
++)
6752 if (!strcmp (arg
, archs
[i
].name
))
6757 as_bad (_("unrecognized option `%s'"), oarg
);
6760 arch
= archs
[i
].arch
;
6763 else if (arch
== m68851
)
6772 if (arg
[0] == 'c' && arg
[1] == '6')
6775 for (i
= 0; i
< n_archs
; i
++)
6776 if (!strcmp (arg
, archs
[i
].name
))
6778 unsigned long arch
= archs
[i
].arch
;
6779 if (cpu_of_arch (arch
))
6780 /* It's a cpu spec. */
6782 current_architecture
&= ~m68000up
;
6783 current_architecture
|= arch
;
6785 else if (arch
== m68881
)
6787 current_architecture
|= m68881
;
6790 else if (arch
== m68851
)
6792 current_architecture
|= m68851
;
6802 as_bad (_("unrecognized architecture specification `%s'"), arg
);
6811 break; /* -pic, Position Independent Code */
6813 case OPTION_REGISTER_PREFIX_OPTIONAL
:
6814 flag_reg_prefix_optional
= 1;
6815 reg_prefix_optional_seen
= 1;
6818 /* -V: SVR4 argument to print version ID. */
6820 print_version_id ();
6823 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
6824 should be emitted or not. FIXME: Not implemented. */
6828 case OPTION_BITWISE_OR
:
6833 n
= (char *) xmalloc (strlen (m68k_comment_chars
) + 1);
6835 for (s
= m68k_comment_chars
; *s
!= '\0'; s
++)
6839 m68k_comment_chars
= n
;
6843 case OPTION_BASE_SIZE_DEFAULT_16
:
6844 m68k_index_width_default
= SIZE_WORD
;
6847 case OPTION_BASE_SIZE_DEFAULT_32
:
6848 m68k_index_width_default
= SIZE_LONG
;
6851 case OPTION_DISP_SIZE_DEFAULT_16
:
6853 m68k_rel32_from_cmdline
= 1;
6856 case OPTION_DISP_SIZE_DEFAULT_32
:
6858 m68k_rel32_from_cmdline
= 1;
6869 md_show_usage (stream
)
6872 fprintf (stream
, _("\
6874 -l use 1 word for refs to undefined symbols [default 2]\n\
6875 -m68000 | -m68008 | -m68010 | -m68020 | -m68030 | -m68040 | -m68060\n\
6876 | -m68302 | -m68331 | -m68332 | -m68333 | -m68340 | -m68360\n\
6877 | -mcpu32 | -m5200\n\
6878 specify variant of 680X0 architecture [default 68020]\n\
6879 -m68881 | -m68882 | -mno-68881 | -mno-68882\n\
6880 target has/lacks floating-point coprocessor\n\
6881 [default yes for 68020, 68030, and cpu32]\n"));
6882 fprintf (stream
, _("\
6883 -m68851 | -mno-68851\n\
6884 target has/lacks memory-management unit coprocessor\n\
6885 [default yes for 68020 and up]\n\
6886 -pic, -k generate position independent code\n\
6887 -S turn jbsr into jsr\n\
6888 --pcrel never turn PC-relative branches into absolute jumps\n\
6889 --register-prefix-optional\n\
6890 recognize register names without prefix character\n\
6891 --bitwise-or do not treat `|' as a comment character\n"));
6892 fprintf (stream
, _("\
6893 --base-size-default-16 base reg without size is 16 bits\n\
6894 --base-size-default-32 base reg without size is 32 bits (default)\n\
6895 --disp-size-default-16 displacement with unknown size is 16 bits\n\
6896 --disp-size-default-32 displacement with unknown size is 32 bits (default)\n"));
6901 /* TEST2: Test md_assemble() */
6902 /* Warning, this routine probably doesn't work anymore */
6906 struct m68k_it the_ins
;
6914 if (!gets (buf
) || !*buf
)
6916 if (buf
[0] == '|' || buf
[1] == '.')
6918 for (cp
= buf
; *cp
; cp
++)
6923 memset (&the_ins
, '\0', sizeof (the_ins
));
6924 m68k_ip (&the_ins
, buf
);
6927 printf (_("Error %s in %s\n"), the_ins
.error
, buf
);
6931 printf (_("Opcode(%d.%s): "), the_ins
.numo
, the_ins
.args
);
6932 for (n
= 0; n
< the_ins
.numo
; n
++)
6933 printf (" 0x%x", the_ins
.opcode
[n
] & 0xffff);
6935 print_the_insn (&the_ins
.opcode
[0], stdout
);
6936 (void) putchar ('\n');
6938 for (n
= 0; n
< strlen (the_ins
.args
) / 2; n
++)
6940 if (the_ins
.operands
[n
].error
)
6942 printf ("op%d Error %s in %s\n", n
, the_ins
.operands
[n
].error
, buf
);
6945 printf ("mode %d, reg %d, ", the_ins
.operands
[n
].mode
, the_ins
.operands
[n
].reg
);
6946 if (the_ins
.operands
[n
].b_const
)
6947 printf ("Constant: '%.*s', ", 1 + the_ins
.operands
[n
].e_const
- the_ins
.operands
[n
].b_const
, the_ins
.operands
[n
].b_const
);
6948 printf ("ireg %d, isiz %d, imul %d, ", the_ins
.operands
[n
].ireg
, the_ins
.operands
[n
].isiz
, the_ins
.operands
[n
].imul
);
6949 if (the_ins
.operands
[n
].b_iadd
)
6950 printf ("Iadd: '%.*s',", 1 + the_ins
.operands
[n
].e_iadd
- the_ins
.operands
[n
].b_iadd
, the_ins
.operands
[n
].b_iadd
);
6951 (void) putchar ('\n');
6963 while (*str
&& *str
!= ' ')
6965 if (str
[-1] == ':' || str
[1] == '=')
6972 /* Possible states for relaxation:
6974 0 0 branch offset byte (bra, etc)
6978 1 0 indexed offsets byte a0@(32,d4:w:1) etc
6982 2 0 two-offset index word-word a0@(32,d4)@(45) etc
6989 /* We have no need to default values of symbols. */
6992 md_undefined_symbol (name
)
6993 char *name ATTRIBUTE_UNUSED
;
6998 /* Round up a section size to the appropriate boundary. */
7000 md_section_align (segment
, size
)
7001 segT segment ATTRIBUTE_UNUSED
;
7005 #ifdef BFD_ASSEMBLER
7006 /* For a.out, force the section size to be aligned. If we don't do
7007 this, BFD will align it for us, but it will not write out the
7008 final bytes of the section. This may be a bug in BFD, but it is
7009 easier to fix it here since that is how the other a.out targets
7013 align
= bfd_get_section_alignment (stdoutput
, segment
);
7014 size
= ((size
+ (1 << align
) - 1) & ((valueT
) -1 << align
));
7021 /* Exactly what point is a PC-relative offset relative TO?
7022 On the 68k, it is relative to the address of the first extension
7023 word. The difference between the addresses of the offset and the
7024 first extension word is stored in fx_pcrel_adjust. */
7026 md_pcrel_from (fixP
)
7031 /* Because fx_pcrel_adjust is a char, and may be unsigned, we explicitly
7032 sign extend the value here. */
7033 adjust
= ((fixP
->fx_pcrel_adjust
& 0xff) ^ 0x80) - 0x80;
7036 return fixP
->fx_where
+ fixP
->fx_frag
->fr_address
- adjust
;
7039 #ifndef BFD_ASSEMBLER
7043 tc_coff_symbol_emit_hook (ignore
)
7044 symbolS
*ignore ATTRIBUTE_UNUSED
;
7049 tc_coff_sizemachdep (frag
)
7052 switch (frag
->fr_subtype
& 0x3)
7069 void m68k_elf_final_processing()
7071 /* Set file-specific flags if this is a cpu32 processor */
7072 if (cpu_of_arch (current_architecture
) & cpu32
)
7073 elf_elfheader (stdoutput
)->e_flags
|= EF_CPU32
;