1 /* tc-m68k.c -- Assemble for the m68k family
2 Copyright 1987, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
4 Free Software Foundation, Inc.
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 3, 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, 51 Franklin Street - Fifth Floor, Boston, MA
24 #include "safe-ctype.h"
27 #include "dwarf2dbg.h"
28 #include "dw2gencfi.h"
30 #include "opcode/m68k.h"
31 #include "m68k-parse.h"
42 static void m68k_elf_cons (int);
45 /* This string holds the chars that always start a comment. If the
46 pre-processor is disabled, these aren't very useful. The macro
47 tc_comment_chars points to this. We use this, rather than the
48 usual comment_chars, so that the --bitwise-or option will work. */
49 #if defined (TE_SVR4) || defined (TE_DELTA)
50 const char *m68k_comment_chars
= "|#";
52 const char *m68k_comment_chars
= "|";
55 /* This array holds the chars that only start a comment at the beginning of
56 a line. If the line seems to have the form '# 123 filename'
57 .line and .file directives will appear in the pre-processed output */
58 /* Note that input_file.c hand checks for '#' at the beginning of the
59 first line of the input file. This is because the compiler outputs
60 #NO_APP at the beginning of its output. */
61 /* Also note that comments like this one will always work. */
62 const char line_comment_chars
[] = "#*";
64 const char line_separator_chars
[] = ";";
66 /* Chars that can be used to separate mant from exp in floating point nums. */
67 const char EXP_CHARS
[] = "eE";
69 /* Chars that mean this number is a floating point constant, as
70 in "0f12.456" or "0d1.2345e12". */
72 const char FLT_CHARS
[] = "rRsSfFdDxXeEpP";
74 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
75 changed in read.c . Ideally it shouldn't have to know about it at all,
76 but nothing is ideal around here. */
78 /* Are we trying to generate PIC code? If so, absolute references
79 ought to be made into linkage table references or pc-relative
80 references. Not implemented. For ELF there are other means
81 to denote pic relocations. */
84 static int flag_short_refs
; /* -l option. */
85 static int flag_long_jumps
; /* -S option. */
86 static int flag_keep_pcrel
; /* --pcrel option. */
88 #ifdef REGISTER_PREFIX_OPTIONAL
89 int flag_reg_prefix_optional
= REGISTER_PREFIX_OPTIONAL
;
91 int flag_reg_prefix_optional
;
94 /* Whether --register-prefix-optional was used on the command line. */
95 static int reg_prefix_optional_seen
;
97 /* The floating point coprocessor to use by default. */
98 static enum m68k_register m68k_float_copnum
= COP1
;
100 /* If this is non-zero, then references to number(%pc) will be taken
101 to refer to number, rather than to %pc + number. */
102 static int m68k_abspcadd
;
104 /* If this is non-zero, then the quick forms of the move, add, and sub
105 instructions are used when possible. */
106 static int m68k_quick
= 1;
108 /* If this is non-zero, then if the size is not specified for a base
109 or outer displacement, the assembler assumes that the size should
111 static int m68k_rel32
= 1;
113 /* This is non-zero if m68k_rel32 was set from the command line. */
114 static int m68k_rel32_from_cmdline
;
116 /* The default width to use for an index register when using a base
118 static enum m68k_size m68k_index_width_default
= SIZE_LONG
;
120 /* We want to warn if any text labels are misaligned. In order to get
121 the right line number, we need to record the line number for each
125 struct label_line
*next
;
132 /* The list of labels. */
134 static struct label_line
*labels
;
136 /* The current label. */
138 static struct label_line
*current_label
;
140 /* Pointer to list holding the opcodes sorted by name. */
141 static struct m68k_opcode
const ** m68k_sorted_opcodes
;
143 /* Its an arbitrary name: This means I don't approve of it.
145 static struct obstack robyn
;
149 const char *m_operands
;
150 unsigned long m_opcode
;
154 struct m68k_incant
*m_next
;
157 #define getone(x) ((((x)->m_opcode)>>16)&0xffff)
158 #define gettwo(x) (((x)->m_opcode)&0xffff)
160 static const enum m68k_register m68000_ctrl
[] = { 0 };
161 static const enum m68k_register m68010_ctrl
[] = {
165 static const enum m68k_register m68020_ctrl
[] = {
166 SFC
, DFC
, USP
, VBR
, CACR
, CAAR
, MSP
, ISP
,
169 static const enum m68k_register m68040_ctrl
[] = {
170 SFC
, DFC
, CACR
, TC
, ITT0
, ITT1
, DTT0
, DTT1
,
171 USP
, VBR
, MSP
, ISP
, MMUSR
, URP
, SRP
,
174 static const enum m68k_register m68060_ctrl
[] = {
175 SFC
, DFC
, CACR
, TC
, ITT0
, ITT1
, DTT0
, DTT1
, BUSCR
,
176 USP
, VBR
, URP
, SRP
, PCR
,
179 static const enum m68k_register mcf_ctrl
[] = {
180 CACR
, TC
, ACR0
, ACR1
, ACR2
, ACR3
, VBR
, ROMBAR
,
181 RAMBAR0
, RAMBAR1
, RAMBAR
, MBAR
,
184 static const enum m68k_register mcf51_ctrl
[] = {
188 static const enum m68k_register mcf5206_ctrl
[] = {
189 CACR
, ACR0
, ACR1
, VBR
, RAMBAR0
, RAMBAR_ALT
, MBAR
,
192 static const enum m68k_register mcf5208_ctrl
[] = {
193 CACR
, ACR0
, ACR1
, VBR
, RAMBAR
, RAMBAR1
,
196 static const enum m68k_register mcf5210a_ctrl
[] = {
197 VBR
, CACR
, ACR0
, ACR1
, ROMBAR
, RAMBAR
, RAMBAR1
, MBAR
,
200 static const enum m68k_register mcf5213_ctrl
[] = {
201 VBR
, RAMBAR
, RAMBAR1
, FLASHBAR
,
204 static const enum m68k_register mcf5216_ctrl
[] = {
205 VBR
, CACR
, ACR0
, ACR1
, FLASHBAR
, RAMBAR
, RAMBAR1
,
208 static const enum m68k_register mcf5221x_ctrl
[] = {
209 VBR
, FLASHBAR
, RAMBAR
, RAMBAR1
,
212 static const enum m68k_register mcf52223_ctrl
[] = {
213 VBR
, CACR
, ACR0
, ACR1
, FLASHBAR
, RAMBAR
, RAMBAR1
,
216 static const enum m68k_register mcf52235_ctrl
[] = {
217 VBR
, FLASHBAR
, RAMBAR
, RAMBAR1
,
220 static const enum m68k_register mcf5225_ctrl
[] = {
221 VBR
, CACR
, ACR0
, ACR1
, FLASHBAR
, RAMBAR
, MBAR
, RAMBAR1
,
224 static const enum m68k_register mcf52259_ctrl
[] = {
225 VBR
, FLASHBAR
, RAMBAR
, RAMBAR1
,
228 static const enum m68k_register mcf52277_ctrl
[] = {
229 VBR
, CACR
, ACR0
, ACR1
, RAMBAR
, RAMBAR1
,
232 static const enum m68k_register mcf5235_ctrl
[] = {
233 VBR
, CACR
, ACR0
, ACR1
, RAMBAR
, RAMBAR1
,
236 static const enum m68k_register mcf5249_ctrl
[] = {
237 VBR
, CACR
, ACR0
, ACR1
, RAMBAR0
, RAMBAR1
, RAMBAR
, MBAR
, MBAR2
,
240 static const enum m68k_register mcf5250_ctrl
[] = {
244 static const enum m68k_register mcf5253_ctrl
[] = {
245 VBR
, CACR
, ACR0
, ACR1
, RAMBAR0
, RAMBAR1
, RAMBAR
, MBAR
, MBAR2
,
248 static const enum m68k_register mcf5271_ctrl
[] = {
249 VBR
, CACR
, ACR0
, ACR1
, RAMBAR
, RAMBAR1
,
252 static const enum m68k_register mcf5272_ctrl
[] = {
253 VBR
, CACR
, ACR0
, ACR1
, ROMBAR
, RAMBAR_ALT
, RAMBAR0
, MBAR
,
256 static const enum m68k_register mcf5275_ctrl
[] = {
257 VBR
, CACR
, ACR0
, ACR1
, RAMBAR
, RAMBAR1
,
260 static const enum m68k_register mcf5282_ctrl
[] = {
261 VBR
, CACR
, ACR0
, ACR1
, FLASHBAR
, RAMBAR
, RAMBAR1
,
264 static const enum m68k_register mcf53017_ctrl
[] = {
265 VBR
, CACR
, ACR0
, ACR1
, RAMBAR
, RAMBAR1
,
268 static const enum m68k_register mcf5307_ctrl
[] = {
269 VBR
, CACR
, ACR0
, ACR1
, RAMBAR0
, RAMBAR_ALT
, MBAR
,
272 static const enum m68k_register mcf5329_ctrl
[] = {
273 VBR
, CACR
, ACR0
, ACR1
, RAMBAR
, RAMBAR1
,
276 static const enum m68k_register mcf5373_ctrl
[] = {
277 VBR
, CACR
, ACR0
, ACR1
, RAMBAR
, RAMBAR1
,
280 static const enum m68k_register mcfv4e_ctrl
[] = {
281 CACR
, ASID
, ACR0
, ACR1
, ACR2
, ACR3
, MMUBAR
,
282 VBR
, PC
, ROMBAR0
, ROMBAR1
, RAMBAR0
, RAMBAR1
,
284 MPCR
/* Multiprocessor Control register */,
285 EDRAMBAR
/* Embedded DRAM Base Address Register */,
286 /* Permutation control registers. */
287 PCR1U0
, PCR1L0
, PCR1U1
, PCR1L1
, PCR2U0
, PCR2L0
, PCR2U1
, PCR2L1
,
288 PCR3U0
, PCR3L0
, PCR3U1
, PCR3L1
,
290 TC
/* ASID */, BUSCR
/* MMUBAR */,
291 ITT0
/* ACR0 */, ITT1
/* ACR1 */, DTT0
/* ACR2 */, DTT1
/* ACR3 */,
292 MBAR1
/* MBAR */, MBAR2
/* SECMBAR */, MBAR0
/* SECMBAR */,
293 ROMBAR
/* ROMBAR0 */, RAMBAR
/* RAMBAR1 */,
296 static const enum m68k_register mcf5407_ctrl
[] = {
297 CACR
, ASID
, ACR0
, ACR1
, ACR2
, ACR3
,
298 VBR
, PC
, RAMBAR0
, RAMBAR1
, MBAR
,
301 ITT0
/* ACR0 */, ITT1
/* ACR1 */, DTT0
/* ACR2 */, DTT1
/* ACR3 */,
302 MBAR1
/* MBAR */, RAMBAR
/* RAMBAR1 */,
305 static const enum m68k_register mcf54455_ctrl
[] = {
306 CACR
, ASID
, ACR0
, ACR1
, ACR2
, ACR3
, MMUBAR
,
307 VBR
, PC
, RAMBAR1
, MBAR
,
309 TC
/* ASID */, BUSCR
/* MMUBAR */,
310 ITT0
/* ACR0 */, ITT1
/* ACR1 */, DTT0
/* ACR2 */, DTT1
/* ACR3 */,
311 MBAR1
/* MBAR */, RAMBAR
/* RAMBAR1 */,
314 static const enum m68k_register mcf5475_ctrl
[] = {
315 CACR
, ASID
, ACR0
, ACR1
, ACR2
, ACR3
, MMUBAR
,
316 VBR
, PC
, RAMBAR0
, RAMBAR1
, MBAR
,
318 TC
/* ASID */, BUSCR
/* MMUBAR */,
319 ITT0
/* ACR0 */, ITT1
/* ACR1 */, DTT0
/* ACR2 */, DTT1
/* ACR3 */,
320 MBAR1
/* MBAR */, RAMBAR
/* RAMBAR1 */,
323 static const enum m68k_register mcf5485_ctrl
[] = {
324 CACR
, ASID
, ACR0
, ACR1
, ACR2
, ACR3
, MMUBAR
,
325 VBR
, PC
, RAMBAR0
, RAMBAR1
, MBAR
,
327 TC
/* ASID */, BUSCR
/* MMUBAR */,
328 ITT0
/* ACR0 */, ITT1
/* ACR1 */, DTT0
/* ACR2 */, DTT1
/* ACR3 */,
329 MBAR1
/* MBAR */, RAMBAR
/* RAMBAR1 */,
332 static const enum m68k_register fido_ctrl
[] = {
333 SFC
, DFC
, USP
, VBR
, CAC
, MBO
,
336 #define cpu32_ctrl m68010_ctrl
338 static const enum m68k_register
*control_regs
;
340 /* Internal form of a 68020 instruction. */
344 const char *args
; /* List of opcode info. */
347 int numo
; /* Number of shorts in opcode. */
350 struct m68k_op operands
[6];
352 int nexp
; /* Number of exprs in use. */
353 struct m68k_exp exprs
[4];
355 int nfrag
; /* Number of frags we have to produce. */
358 int fragoff
; /* Where in the current opcode the frag ends. */
365 int nrel
; /* Num of reloc strucs in use. */
372 /* In a pc relative address the difference between the address
373 of the offset and the address that the offset is relative
374 to. This depends on the addressing mode. Basically this
375 is the value to put in the offset field to address the
376 first byte of the offset, without regarding the special
377 significance of some values (in the branch instruction, for
381 /* Whether this expression needs special pic relocation, and if
383 enum pic_relocation pic_reloc
;
386 reloc
[5]; /* Five is enough??? */
389 #define cpu_of_arch(x) ((x) & (m68000up | mcfisa_a | fido_a))
390 #define float_of_arch(x) ((x) & mfloat)
391 #define mmu_of_arch(x) ((x) & mmmu)
392 #define arch_coldfire_p(x) ((x) & mcfisa_a)
393 #define arch_coldfire_fpu(x) ((x) & cfloat)
395 /* Macros for determining if cpu supports a specific addressing mode. */
396 #define HAVE_LONG_DISP(x) \
397 ((x) & (m68020|m68030|m68040|m68060|cpu32|fido_a|mcfisa_b|mcfisa_c))
398 #define HAVE_LONG_CALL(x) \
399 ((x) & (m68020|m68030|m68040|m68060|cpu32|fido_a|mcfisa_b|mcfisa_c))
400 #define HAVE_LONG_COND(x) \
401 ((x) & (m68020|m68030|m68040|m68060|cpu32|fido_a|mcfisa_b|mcfisa_c))
402 #define HAVE_LONG_BRANCH(x) \
403 ((x) & (m68020|m68030|m68040|m68060|cpu32|fido_a|mcfisa_b))
404 #define LONG_BRANCH_VIA_COND(x) (HAVE_LONG_COND(x) && !HAVE_LONG_BRANCH(x))
406 static struct m68k_it the_ins
; /* The instruction being assembled. */
408 #define op(ex) ((ex)->exp.X_op)
409 #define adds(ex) ((ex)->exp.X_add_symbol)
410 #define subs(ex) ((ex)->exp.X_op_symbol)
411 #define offs(ex) ((ex)->exp.X_add_number)
413 /* Macros for adding things to the m68k_it struct. */
414 #define addword(w) (the_ins.opcode[the_ins.numo++] = (w))
416 /* Like addword, but goes BEFORE general operands. */
419 insop (int w
, const struct m68k_incant
*opcode
)
422 for (z
= the_ins
.numo
; z
> opcode
->m_codenum
; --z
)
423 the_ins
.opcode
[z
] = the_ins
.opcode
[z
- 1];
424 for (z
= 0; z
< the_ins
.nrel
; z
++)
425 the_ins
.reloc
[z
].n
+= 2;
426 for (z
= 0; z
< the_ins
.nfrag
; z
++)
427 the_ins
.fragb
[z
].fragoff
++;
428 the_ins
.opcode
[opcode
->m_codenum
] = w
;
432 /* The numo+1 kludge is so we can hit the low order byte of the prev word.
435 add_fix (int width
, struct m68k_exp
*exp
, int pc_rel
, int pc_fix
)
437 the_ins
.reloc
[the_ins
.nrel
].n
= (width
== 'B' || width
== '3'
438 ? the_ins
.numo
* 2 - 1
440 ? the_ins
.numo
* 2 + 1
441 : the_ins
.numo
* 2));
442 the_ins
.reloc
[the_ins
.nrel
].exp
= exp
->exp
;
443 the_ins
.reloc
[the_ins
.nrel
].wid
= width
;
444 the_ins
.reloc
[the_ins
.nrel
].pcrel_fix
= pc_fix
;
446 the_ins
.reloc
[the_ins
.nrel
].pic_reloc
= exp
->pic_reloc
;
448 the_ins
.reloc
[the_ins
.nrel
++].pcrel
= pc_rel
;
451 /* Cause an extra frag to be generated here, inserting up to 10 bytes
452 (that value is chosen in the frag_var call in md_assemble). TYPE
453 is the subtype of the frag to be generated; its primary type is
454 rs_machine_dependent.
456 The TYPE parameter is also used by md_convert_frag_1 and
457 md_estimate_size_before_relax. The appropriate type of fixup will
458 be emitted by md_convert_frag_1.
460 ADD becomes the FR_SYMBOL field of the frag, and OFF the FR_OFFSET. */
462 add_frag (symbolS
*add
, offsetT off
, int type
)
464 the_ins
.fragb
[the_ins
.nfrag
].fragoff
= the_ins
.numo
;
465 the_ins
.fragb
[the_ins
.nfrag
].fadd
= add
;
466 the_ins
.fragb
[the_ins
.nfrag
].foff
= off
;
467 the_ins
.fragb
[the_ins
.nfrag
++].fragty
= type
;
471 (op (ex) != O_constant && op (ex) != O_big)
473 static char *crack_operand (char *str
, struct m68k_op
*opP
);
474 static int get_num (struct m68k_exp
*exp
, int ok
);
475 static int reverse_16_bits (int in
);
476 static int reverse_8_bits (int in
);
477 static void install_gen_operand (int mode
, int val
);
478 static void install_operand (int mode
, int val
);
479 static void s_bss (int);
480 static void s_data1 (int);
481 static void s_data2 (int);
482 static void s_even (int);
483 static void s_proc (int);
484 static void s_chip (int);
485 static void s_fopt (int);
486 static void s_opt (int);
487 static void s_reg (int);
488 static void s_restore (int);
489 static void s_save (int);
490 static void s_mri_if (int);
491 static void s_mri_else (int);
492 static void s_mri_endi (int);
493 static void s_mri_break (int);
494 static void s_mri_next (int);
495 static void s_mri_for (int);
496 static void s_mri_endf (int);
497 static void s_mri_repeat (int);
498 static void s_mri_until (int);
499 static void s_mri_while (int);
500 static void s_mri_endw (int);
501 static void s_m68k_cpu (int);
502 static void s_m68k_arch (int);
506 unsigned long arch
; /* Architecture features. */
507 const enum m68k_register
*control_regs
; /* Control regs on chip */
508 const char *name
; /* Name */
509 int alias
; /* Alias for a cannonical name. If 1, then
510 succeeds canonical name, if -1 then
511 succeeds canonical name, if <-1 ||>1 this is a
512 deprecated name, and the next/previous name
516 /* We hold flags for features explicitly enabled and explicitly
518 static int current_architecture
;
519 static int not_current_architecture
;
520 static const struct m68k_cpu
*selected_arch
;
521 static const struct m68k_cpu
*selected_cpu
;
522 static int initialized
;
524 /* Architecture models. */
525 static const struct m68k_cpu m68k_archs
[] =
527 {m68000
, m68000_ctrl
, "68000", 0},
528 {m68010
, m68010_ctrl
, "68010", 0},
529 {m68020
|m68881
|m68851
, m68020_ctrl
, "68020", 0},
530 {m68030
|m68881
|m68851
, m68020_ctrl
, "68030", 0},
531 {m68040
, m68040_ctrl
, "68040", 0},
532 {m68060
, m68060_ctrl
, "68060", 0},
533 {cpu32
|m68881
, cpu32_ctrl
, "cpu32", 0},
534 {fido_a
, fido_ctrl
, "fidoa", 0},
535 {mcfisa_a
|mcfhwdiv
, NULL
, "isaa", 0},
536 {mcfisa_a
|mcfhwdiv
|mcfisa_aa
|mcfusp
, NULL
, "isaaplus", 0},
537 {mcfisa_a
|mcfhwdiv
|mcfisa_b
|mcfusp
, NULL
, "isab", 0},
538 {mcfisa_a
|mcfhwdiv
|mcfisa_c
|mcfusp
, NULL
, "isac", 0},
539 {mcfisa_a
|mcfhwdiv
|mcfisa_b
|mcfmac
|mcfusp
, mcf_ctrl
, "cfv4", 0},
540 {mcfisa_a
|mcfhwdiv
|mcfisa_b
|mcfemac
|mcfusp
|cfloat
, mcfv4e_ctrl
, "cfv4e", 0},
544 /* For -mno-mac we want to turn off all types of mac. */
545 static const unsigned no_mac
= mcfmac
| mcfemac
;
547 /* Architecture extensions, here 'alias' -1 for m68k, +1 for cf and 0
549 static const struct m68k_cpu m68k_extensions
[] =
551 {m68851
, NULL
, "68851", -1},
552 {m68881
, NULL
, "68881", -1},
553 {m68881
, NULL
, "68882", -1},
555 {cfloat
|m68881
, NULL
, "float", 0},
557 {mcfhwdiv
, NULL
, "div", 1},
558 {mcfusp
, NULL
, "usp", 1},
559 {mcfmac
, (void *)&no_mac
, "mac", 1},
560 {mcfemac
, NULL
, "emac", 1},
566 static const struct m68k_cpu m68k_cpus
[] =
568 {m68000
, m68000_ctrl
, "68000", 0},
569 {m68000
, m68000_ctrl
, "68ec000", 1},
570 {m68000
, m68000_ctrl
, "68hc000", 1},
571 {m68000
, m68000_ctrl
, "68hc001", 1},
572 {m68000
, m68000_ctrl
, "68008", 1},
573 {m68000
, m68000_ctrl
, "68302", 1},
574 {m68000
, m68000_ctrl
, "68306", 1},
575 {m68000
, m68000_ctrl
, "68307", 1},
576 {m68000
, m68000_ctrl
, "68322", 1},
577 {m68000
, m68000_ctrl
, "68356", 1},
578 {m68010
, m68010_ctrl
, "68010", 0},
579 {m68020
|m68881
|m68851
, m68020_ctrl
, "68020", 0},
580 {m68020
|m68881
|m68851
, m68020_ctrl
, "68k", 1},
581 {m68020
|m68881
|m68851
, m68020_ctrl
, "68ec020", 1},
582 {m68030
|m68881
|m68851
, m68020_ctrl
, "68030", 0},
583 {m68030
|m68881
|m68851
, m68020_ctrl
, "68ec030", 1},
584 {m68040
, m68040_ctrl
, "68040", 0},
585 {m68040
, m68040_ctrl
, "68ec040", 1},
586 {m68060
, m68060_ctrl
, "68060", 0},
587 {m68060
, m68060_ctrl
, "68ec060", 1},
589 {cpu32
|m68881
, cpu32_ctrl
, "cpu32", 0},
590 {cpu32
|m68881
, cpu32_ctrl
, "68330", 1},
591 {cpu32
|m68881
, cpu32_ctrl
, "68331", 1},
592 {cpu32
|m68881
, cpu32_ctrl
, "68332", 1},
593 {cpu32
|m68881
, cpu32_ctrl
, "68333", 1},
594 {cpu32
|m68881
, cpu32_ctrl
, "68334", 1},
595 {cpu32
|m68881
, cpu32_ctrl
, "68336", 1},
596 {cpu32
|m68881
, cpu32_ctrl
, "68340", 1},
597 {cpu32
|m68881
, cpu32_ctrl
, "68341", 1},
598 {cpu32
|m68881
, cpu32_ctrl
, "68349", 1},
599 {cpu32
|m68881
, cpu32_ctrl
, "68360", 1},
601 {mcfisa_a
|mcfisa_c
|mcfusp
, mcf51_ctrl
, "51", 0},
602 {mcfisa_a
|mcfisa_c
|mcfusp
, mcf51_ctrl
, "51ac", 1},
603 {mcfisa_a
|mcfisa_c
|mcfusp
, mcf51_ctrl
, "51cn", 1},
604 {mcfisa_a
|mcfisa_c
|mcfusp
|mcfmac
, mcf51_ctrl
, "51em", 1},
605 {mcfisa_a
|mcfisa_c
|mcfusp
, mcf51_ctrl
, "51jm", 1},
606 {mcfisa_a
|mcfisa_c
|mcfusp
, mcf51_ctrl
, "51qe", 1},
608 {mcfisa_a
, mcf_ctrl
, "5200", 0},
609 {mcfisa_a
, mcf_ctrl
, "5202", 1},
610 {mcfisa_a
, mcf_ctrl
, "5204", 1},
611 {mcfisa_a
, mcf5206_ctrl
, "5206", 1},
613 {mcfisa_a
|mcfhwdiv
|mcfmac
, mcf5206_ctrl
, "5206e", 0},
615 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5208_ctrl
, "5207", -1},
616 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5208_ctrl
, "5208", 0},
618 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfmac
|mcfusp
, mcf5210a_ctrl
, "5210a", 0},
619 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfmac
|mcfusp
, mcf5210a_ctrl
, "5211a", 1},
621 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfmac
|mcfusp
, mcf5213_ctrl
, "5211", -1},
622 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfmac
|mcfusp
, mcf5213_ctrl
, "5212", -1},
623 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfmac
|mcfusp
, mcf5213_ctrl
, "5213", 0},
625 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5216_ctrl
, "5214", -1},
626 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5216_ctrl
, "5216", 0},
627 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5216_ctrl
, "521x", 2},
629 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfmac
|mcfusp
, mcf5221x_ctrl
, "5221x", 0},
631 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfmac
|mcfusp
, mcf52223_ctrl
, "52221", -1},
632 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfmac
|mcfusp
, mcf52223_ctrl
, "52223", 0},
634 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf52235_ctrl
, "52230", -1},
635 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf52235_ctrl
, "52233", -1},
636 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf52235_ctrl
, "52234", -1},
637 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf52235_ctrl
, "52235", 0},
639 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfmac
|mcfusp
, mcf5225_ctrl
, "5224", -1},
640 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfmac
|mcfusp
, mcf5225_ctrl
, "5225", 0},
642 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf52277_ctrl
, "52274", -1},
643 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf52277_ctrl
, "52277", 0},
645 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5235_ctrl
, "5232", -1},
646 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5235_ctrl
, "5233", -1},
647 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5235_ctrl
, "5234", -1},
648 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5235_ctrl
, "5235", -1},
649 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5235_ctrl
, "523x", 0},
651 {mcfisa_a
|mcfhwdiv
|mcfemac
, mcf5249_ctrl
, "5249", 0},
652 {mcfisa_a
|mcfhwdiv
|mcfemac
, mcf5250_ctrl
, "5250", 0},
653 {mcfisa_a
|mcfhwdiv
|mcfemac
, mcf5253_ctrl
, "5253", 0},
655 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf52259_ctrl
, "52252", -1},
656 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf52259_ctrl
, "52254", -1},
657 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf52259_ctrl
, "52255", -1},
658 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf52259_ctrl
, "52256", -1},
659 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf52259_ctrl
, "52258", -1},
660 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf52259_ctrl
, "52259", 0},
662 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5271_ctrl
, "5270", -1},
663 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5271_ctrl
, "5271", 0},
665 {mcfisa_a
|mcfhwdiv
|mcfmac
, mcf5272_ctrl
, "5272", 0},
667 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5275_ctrl
, "5274", -1},
668 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5275_ctrl
, "5275", 0},
670 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5282_ctrl
, "5280", -1},
671 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5282_ctrl
, "5281", -1},
672 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5282_ctrl
, "5282", -1},
673 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5282_ctrl
, "528x", 0},
675 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf53017_ctrl
, "53011", -1},
676 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf53017_ctrl
, "53012", -1},
677 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf53017_ctrl
, "53013", -1},
678 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf53017_ctrl
, "53014", -1},
679 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf53017_ctrl
, "53015", -1},
680 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf53017_ctrl
, "53016", -1},
681 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf53017_ctrl
, "53017", 0},
683 {mcfisa_a
|mcfhwdiv
|mcfmac
, mcf5307_ctrl
, "5307", 0},
685 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5329_ctrl
, "5327", -1},
686 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5329_ctrl
, "5328", -1},
687 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5329_ctrl
, "5329", -1},
688 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5329_ctrl
, "532x", 0},
690 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5373_ctrl
, "5372", -1},
691 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5373_ctrl
, "5373", -1},
692 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5373_ctrl
, "537x", 0},
694 {mcfisa_a
|mcfisa_b
|mcfhwdiv
|mcfmac
, mcf5407_ctrl
, "5407",0},
696 {mcfisa_a
|mcfisa_c
|mcfhwdiv
|mcfemac
|mcfusp
, mcf54455_ctrl
, "54450", -1},
697 {mcfisa_a
|mcfisa_c
|mcfhwdiv
|mcfemac
|mcfusp
, mcf54455_ctrl
, "54451", -1},
698 {mcfisa_a
|mcfisa_c
|mcfhwdiv
|mcfemac
|mcfusp
, mcf54455_ctrl
, "54452", -1},
699 {mcfisa_a
|mcfisa_c
|mcfhwdiv
|mcfemac
|mcfusp
, mcf54455_ctrl
, "54453", -1},
700 {mcfisa_a
|mcfisa_c
|mcfhwdiv
|mcfemac
|mcfusp
, mcf54455_ctrl
, "54454", -1},
701 {mcfisa_a
|mcfisa_c
|mcfhwdiv
|mcfemac
|mcfusp
, mcf54455_ctrl
, "54455", 0},
703 {mcfisa_a
|mcfisa_b
|mcfhwdiv
|mcfemac
|mcfusp
|cfloat
, mcf5475_ctrl
, "5470", -1},
704 {mcfisa_a
|mcfisa_b
|mcfhwdiv
|mcfemac
|mcfusp
|cfloat
, mcf5475_ctrl
, "5471", -1},
705 {mcfisa_a
|mcfisa_b
|mcfhwdiv
|mcfemac
|mcfusp
|cfloat
, mcf5475_ctrl
, "5472", -1},
706 {mcfisa_a
|mcfisa_b
|mcfhwdiv
|mcfemac
|mcfusp
|cfloat
, mcf5475_ctrl
, "5473", -1},
707 {mcfisa_a
|mcfisa_b
|mcfhwdiv
|mcfemac
|mcfusp
|cfloat
, mcf5475_ctrl
, "5474", -1},
708 {mcfisa_a
|mcfisa_b
|mcfhwdiv
|mcfemac
|mcfusp
|cfloat
, mcf5475_ctrl
, "5475", -1},
709 {mcfisa_a
|mcfisa_b
|mcfhwdiv
|mcfemac
|mcfusp
|cfloat
, mcf5475_ctrl
, "547x", 0},
711 {mcfisa_a
|mcfisa_b
|mcfhwdiv
|mcfemac
|mcfusp
|cfloat
, mcf5485_ctrl
, "5480", -1},
712 {mcfisa_a
|mcfisa_b
|mcfhwdiv
|mcfemac
|mcfusp
|cfloat
, mcf5485_ctrl
, "5481", -1},
713 {mcfisa_a
|mcfisa_b
|mcfhwdiv
|mcfemac
|mcfusp
|cfloat
, mcf5485_ctrl
, "5482", -1},
714 {mcfisa_a
|mcfisa_b
|mcfhwdiv
|mcfemac
|mcfusp
|cfloat
, mcf5485_ctrl
, "5483", -1},
715 {mcfisa_a
|mcfisa_b
|mcfhwdiv
|mcfemac
|mcfusp
|cfloat
, mcf5485_ctrl
, "5484", -1},
716 {mcfisa_a
|mcfisa_b
|mcfhwdiv
|mcfemac
|mcfusp
|cfloat
, mcf5485_ctrl
, "5485", -1},
717 {mcfisa_a
|mcfisa_b
|mcfhwdiv
|mcfemac
|mcfusp
|cfloat
, mcf5485_ctrl
, "548x", 0},
719 {fido_a
, fido_ctrl
, "fidoa", 0},
720 {fido_a
, fido_ctrl
, "fido", 1},
725 static const struct m68k_cpu
*m68k_lookup_cpu
726 (const char *, const struct m68k_cpu
*, int, int *);
727 static int m68k_set_arch (const char *, int, int);
728 static int m68k_set_cpu (const char *, int, int);
729 static int m68k_set_extension (const char *, int, int);
730 static void m68k_init_arch (void);
732 /* This is the assembler relaxation table for m68k. m68k is a rich CISC
733 architecture and we have a lot of relaxation modes. */
735 /* Macros used in the relaxation code. */
736 #define TAB(x,y) (((x) << 2) + (y))
737 #define TABTYPE(x) ((x) >> 2)
739 /* Relaxation states. */
745 /* Here are all the relaxation modes we support. First we can relax ordinary
746 branches. On 68020 and higher and on CPU32 all branch instructions take
747 three forms, so on these CPUs all branches always remain as such. When we
748 have to expand to the LONG form on a 68000, though, we substitute an
749 absolute jump instead. This is a direct replacement for unconditional
750 branches and a branch over a jump for conditional branches. However, if the
751 user requires PIC and disables this with --pcrel, we can only relax between
752 BYTE and SHORT forms, punting if that isn't enough. This gives us four
753 different relaxation modes for branches: */
755 #define BRANCHBWL 0 /* Branch byte, word, or long. */
756 #define BRABSJUNC 1 /* Absolute jump for LONG, unconditional. */
757 #define BRABSJCOND 2 /* Absolute jump for LONG, conditional. */
758 #define BRANCHBW 3 /* Branch byte or word. */
760 /* We also relax coprocessor branches and DBcc's. All CPUs that support
761 coprocessor branches support them in word and long forms, so we have only
762 one relaxation mode for them. DBcc's are word only on all CPUs. We can
763 relax them to the LONG form with a branch-around sequence. This sequence
764 can use a long branch (if available) or an absolute jump (if acceptable).
765 This gives us two relaxation modes. If long branches are not available and
766 absolute jumps are not acceptable, we don't relax DBcc's. */
768 #define FBRANCH 4 /* Coprocessor branch. */
769 #define DBCCLBR 5 /* DBcc relaxable with a long branch. */
770 #define DBCCABSJ 6 /* DBcc relaxable with an absolute jump. */
772 /* That's all for instruction relaxation. However, we also relax PC-relative
773 operands. Specifically, we have three operand relaxation modes. On the
774 68000 PC-relative operands can only be 16-bit, but on 68020 and higher and
775 on CPU32 they may be 16-bit or 32-bit. For the latter we relax between the
776 two. Also PC+displacement+index operands in their simple form (with a non-
777 suppressed index without memory indirection) are supported on all CPUs, but
778 on the 68000 the displacement can be 8-bit only, whereas on 68020 and higher
779 and on CPU32 we relax it to SHORT and LONG forms as well using the extended
780 form of the PC+displacement+index operand. Finally, some absolute operands
781 can be relaxed down to 16-bit PC-relative. */
783 #define PCREL1632 7 /* 16-bit or 32-bit PC-relative. */
784 #define PCINDEX 8 /* PC + displacement + index. */
785 #define ABSTOPCREL 9 /* Absolute relax down to 16-bit PC-relative. */
787 /* This relaxation is required for branches where there is no long
788 branch and we are in pcrel mode. We generate a bne/beq pair. */
789 #define BRANCHBWPL 10 /* Branch byte, word or pair of longs
792 /* Note that calls to frag_var need to specify the maximum expansion
793 needed; this is currently 12 bytes for bne/beq pair. */
794 #define FRAG_VAR_SIZE 12
797 How far Forward this mode will reach:
798 How far Backward this mode will reach:
799 How many bytes this mode will add to the size of the frag
800 Which mode to go to if the offset won't fit in this one
802 Please check tc-m68k.h:md_prepare_relax_scan if changing this table. */
803 relax_typeS md_relax_table
[] =
805 { 127, -128, 0, TAB (BRANCHBWL
, SHORT
) },
806 { 32767, -32768, 2, TAB (BRANCHBWL
, LONG
) },
810 { 127, -128, 0, TAB (BRABSJUNC
, SHORT
) },
811 { 32767, -32768, 2, TAB (BRABSJUNC
, LONG
) },
815 { 127, -128, 0, TAB (BRABSJCOND
, SHORT
) },
816 { 32767, -32768, 2, TAB (BRABSJCOND
, LONG
) },
820 { 127, -128, 0, TAB (BRANCHBW
, SHORT
) },
825 { 1, 1, 0, 0 }, /* FBRANCH doesn't come BYTE. */
826 { 32767, -32768, 2, TAB (FBRANCH
, LONG
) },
830 { 1, 1, 0, 0 }, /* DBCC doesn't come BYTE. */
831 { 32767, -32768, 2, TAB (DBCCLBR
, LONG
) },
835 { 1, 1, 0, 0 }, /* DBCC doesn't come BYTE. */
836 { 32767, -32768, 2, TAB (DBCCABSJ
, LONG
) },
840 { 1, 1, 0, 0 }, /* PCREL1632 doesn't come BYTE. */
841 { 32767, -32768, 2, TAB (PCREL1632
, LONG
) },
845 { 125, -130, 0, TAB (PCINDEX
, SHORT
) },
846 { 32765, -32770, 2, TAB (PCINDEX
, LONG
) },
850 { 1, 1, 0, 0 }, /* ABSTOPCREL doesn't come BYTE. */
851 { 32767, -32768, 2, TAB (ABSTOPCREL
, LONG
) },
855 { 127, -128, 0, TAB (BRANCHBWPL
, SHORT
) },
856 { 32767, -32768, 2, TAB (BRANCHBWPL
, LONG
) },
861 /* These are the machine dependent pseudo-ops. These are included so
862 the assembler can work on the output from the SUN C compiler, which
865 /* This table describes all the machine specific pseudo-ops the assembler
866 has to support. The fields are:
867 pseudo-op name without dot
868 function to call to execute this pseudo-op
869 Integer arg to pass to the function. */
870 const pseudo_typeS md_pseudo_table
[] =
872 {"data1", s_data1
, 0},
873 {"data2", s_data2
, 0},
876 {"skip", s_space
, 0},
878 #if defined (TE_SUN3) || defined (OBJ_ELF)
879 {"align", s_align_bytes
, 0},
882 {"swbeg", s_ignore
, 0},
883 {"long", m68k_elf_cons
, 4},
885 {"extend", float_cons
, 'x'},
886 {"ldouble", float_cons
, 'x'},
888 {"arch", s_m68k_arch
, 0},
889 {"cpu", s_m68k_cpu
, 0},
891 /* The following pseudo-ops are supported for MRI compatibility. */
893 {"comline", s_space
, 1},
895 {"mask2", s_ignore
, 0},
898 {"restore", s_restore
, 0},
902 {"if.b", s_mri_if
, 'b'},
903 {"if.w", s_mri_if
, 'w'},
904 {"if.l", s_mri_if
, 'l'},
905 {"else", s_mri_else
, 0},
906 {"else.s", s_mri_else
, 's'},
907 {"else.l", s_mri_else
, 'l'},
908 {"endi", s_mri_endi
, 0},
909 {"break", s_mri_break
, 0},
910 {"break.s", s_mri_break
, 's'},
911 {"break.l", s_mri_break
, 'l'},
912 {"next", s_mri_next
, 0},
913 {"next.s", s_mri_next
, 's'},
914 {"next.l", s_mri_next
, 'l'},
915 {"for", s_mri_for
, 0},
916 {"for.b", s_mri_for
, 'b'},
917 {"for.w", s_mri_for
, 'w'},
918 {"for.l", s_mri_for
, 'l'},
919 {"endf", s_mri_endf
, 0},
920 {"repeat", s_mri_repeat
, 0},
921 {"until", s_mri_until
, 0},
922 {"until.b", s_mri_until
, 'b'},
923 {"until.w", s_mri_until
, 'w'},
924 {"until.l", s_mri_until
, 'l'},
925 {"while", s_mri_while
, 0},
926 {"while.b", s_mri_while
, 'b'},
927 {"while.w", s_mri_while
, 'w'},
928 {"while.l", s_mri_while
, 'l'},
929 {"endw", s_mri_endw
, 0},
934 /* The mote pseudo ops are put into the opcode table, since they
935 don't start with a . they look like opcodes to gas. */
937 const pseudo_typeS mote_pseudo_table
[] =
950 {"xdef", s_globl
, 0},
952 {"align", s_align_bytes
, 0},
954 {"align", s_align_ptwo
, 0},
957 {"sect", obj_coff_section
, 0},
958 {"section", obj_coff_section
, 0},
963 /* Truncate and sign-extend at 32 bits, so that building on a 64-bit host
964 gives identical results to a 32-bit host. */
965 #define TRUNC(X) ((valueT) (X) & 0xffffffff)
966 #define SEXT(X) ((TRUNC (X) ^ 0x80000000) - 0x80000000)
968 #define issbyte(x) ((valueT) SEXT (x) + 0x80 < 0x100)
969 #define isubyte(x) ((valueT) TRUNC (x) < 0x100)
970 #define issword(x) ((valueT) SEXT (x) + 0x8000 < 0x10000)
971 #define isuword(x) ((valueT) TRUNC (x) < 0x10000)
973 #define isbyte(x) ((valueT) SEXT (x) + 0xff < 0x1ff)
974 #define isword(x) ((valueT) SEXT (x) + 0xffff < 0x1ffff)
975 #define islong(x) (1)
977 static char notend_table
[256];
978 static char alt_notend_table
[256];
980 (! (notend_table[(unsigned char) *s] \
982 && alt_notend_table[(unsigned char) s[1]])))
986 /* Return zero if the reference to SYMBOL from within the same segment may
989 /* On an ELF system, we can't relax an externally visible symbol,
990 because it may be overridden by a shared library. However, if
991 TARGET_OS is "elf", then we presume that we are assembling for an
992 embedded system, in which case we don't have to worry about shared
993 libraries, and we can relax any external sym. */
995 #define relaxable_symbol(symbol) \
996 (!((S_IS_EXTERNAL (symbol) && EXTERN_FORCE_RELOC) \
997 || S_IS_WEAK (symbol)))
999 /* Compute the relocation code for a fixup of SIZE bytes, using pc
1000 relative relocation if PCREL is non-zero. PIC says whether a special
1001 pic relocation was requested. */
1003 static bfd_reloc_code_real_type
1004 get_reloc_code (int size
, int pcrel
, enum pic_relocation pic
)
1012 return BFD_RELOC_8_GOT_PCREL
;
1014 return BFD_RELOC_16_GOT_PCREL
;
1016 return BFD_RELOC_32_GOT_PCREL
;
1024 return BFD_RELOC_8_GOTOFF
;
1026 return BFD_RELOC_16_GOTOFF
;
1028 return BFD_RELOC_32_GOTOFF
;
1036 return BFD_RELOC_8_PLT_PCREL
;
1038 return BFD_RELOC_16_PLT_PCREL
;
1040 return BFD_RELOC_32_PLT_PCREL
;
1048 return BFD_RELOC_8_PLTOFF
;
1050 return BFD_RELOC_16_PLTOFF
;
1052 return BFD_RELOC_32_PLTOFF
;
1060 return BFD_RELOC_68K_TLS_GD8
;
1062 return BFD_RELOC_68K_TLS_GD16
;
1064 return BFD_RELOC_68K_TLS_GD32
;
1072 return BFD_RELOC_68K_TLS_LDM8
;
1074 return BFD_RELOC_68K_TLS_LDM16
;
1076 return BFD_RELOC_68K_TLS_LDM32
;
1084 return BFD_RELOC_68K_TLS_LDO8
;
1086 return BFD_RELOC_68K_TLS_LDO16
;
1088 return BFD_RELOC_68K_TLS_LDO32
;
1096 return BFD_RELOC_68K_TLS_IE8
;
1098 return BFD_RELOC_68K_TLS_IE16
;
1100 return BFD_RELOC_68K_TLS_IE32
;
1108 return BFD_RELOC_68K_TLS_LE8
;
1110 return BFD_RELOC_68K_TLS_LE16
;
1112 return BFD_RELOC_68K_TLS_LE32
;
1122 return BFD_RELOC_8_PCREL
;
1124 return BFD_RELOC_16_PCREL
;
1126 return BFD_RELOC_32_PCREL
;
1136 return BFD_RELOC_16
;
1138 return BFD_RELOC_32
;
1145 if (pic
== pic_none
)
1146 as_bad (_("Can not do %d byte pc-relative relocation"), size
);
1148 as_bad (_("Can not do %d byte pc-relative pic relocation"), size
);
1152 if (pic
== pic_none
)
1153 as_bad (_("Can not do %d byte relocation"), size
);
1155 as_bad (_("Can not do %d byte pic relocation"), size
);
1158 return BFD_RELOC_NONE
;
1161 /* Here we decide which fixups can be adjusted to make them relative
1162 to the beginning of the section instead of the symbol. Basically
1163 we need to make sure that the dynamic relocations are done
1164 correctly, so in some cases we force the original symbol to be
1167 tc_m68k_fix_adjustable (fixS
*fixP
)
1169 /* Adjust_reloc_syms doesn't know about the GOT. */
1170 switch (fixP
->fx_r_type
)
1172 case BFD_RELOC_8_GOT_PCREL
:
1173 case BFD_RELOC_16_GOT_PCREL
:
1174 case BFD_RELOC_32_GOT_PCREL
:
1175 case BFD_RELOC_8_GOTOFF
:
1176 case BFD_RELOC_16_GOTOFF
:
1177 case BFD_RELOC_32_GOTOFF
:
1178 case BFD_RELOC_8_PLT_PCREL
:
1179 case BFD_RELOC_16_PLT_PCREL
:
1180 case BFD_RELOC_32_PLT_PCREL
:
1181 case BFD_RELOC_8_PLTOFF
:
1182 case BFD_RELOC_16_PLTOFF
:
1183 case BFD_RELOC_32_PLTOFF
:
1184 case BFD_RELOC_68K_TLS_GD32
:
1185 case BFD_RELOC_68K_TLS_GD16
:
1186 case BFD_RELOC_68K_TLS_GD8
:
1187 case BFD_RELOC_68K_TLS_LDM32
:
1188 case BFD_RELOC_68K_TLS_LDM16
:
1189 case BFD_RELOC_68K_TLS_LDM8
:
1190 case BFD_RELOC_68K_TLS_LDO32
:
1191 case BFD_RELOC_68K_TLS_LDO16
:
1192 case BFD_RELOC_68K_TLS_LDO8
:
1193 case BFD_RELOC_68K_TLS_IE32
:
1194 case BFD_RELOC_68K_TLS_IE16
:
1195 case BFD_RELOC_68K_TLS_IE8
:
1196 case BFD_RELOC_68K_TLS_LE32
:
1197 case BFD_RELOC_68K_TLS_LE16
:
1198 case BFD_RELOC_68K_TLS_LE8
:
1201 case BFD_RELOC_VTABLE_INHERIT
:
1202 case BFD_RELOC_VTABLE_ENTRY
:
1210 #else /* !OBJ_ELF */
1212 #define get_reloc_code(SIZE,PCREL,OTHER) NO_RELOC
1214 /* PR gas/3041 Weak symbols are not relaxable
1215 because they must be treated as extern. */
1216 #define relaxable_symbol(symbol) (!(S_IS_WEAK (symbol)))
1218 #endif /* OBJ_ELF */
1221 tc_gen_reloc (asection
*section ATTRIBUTE_UNUSED
, fixS
*fixp
)
1224 bfd_reloc_code_real_type code
;
1226 /* If the tcbit is set, then this was a fixup of a negative value
1227 that was never resolved. We do not have a reloc to handle this,
1228 so just return. We assume that other code will have detected this
1229 situation and produced a helpful error message, so we just tell the
1230 user that the reloc cannot be produced. */
1234 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
1235 _("Unable to produce reloc against symbol '%s'"),
1236 S_GET_NAME (fixp
->fx_addsy
));
1240 if (fixp
->fx_r_type
!= BFD_RELOC_NONE
)
1242 code
= fixp
->fx_r_type
;
1244 /* Since DIFF_EXPR_OK is defined in tc-m68k.h, it is possible
1245 that fixup_segment converted a non-PC relative reloc into a
1246 PC relative reloc. In such a case, we need to convert the
1253 code
= BFD_RELOC_8_PCREL
;
1256 code
= BFD_RELOC_16_PCREL
;
1259 code
= BFD_RELOC_32_PCREL
;
1261 case BFD_RELOC_8_PCREL
:
1262 case BFD_RELOC_16_PCREL
:
1263 case BFD_RELOC_32_PCREL
:
1264 case BFD_RELOC_8_GOT_PCREL
:
1265 case BFD_RELOC_16_GOT_PCREL
:
1266 case BFD_RELOC_32_GOT_PCREL
:
1267 case BFD_RELOC_8_GOTOFF
:
1268 case BFD_RELOC_16_GOTOFF
:
1269 case BFD_RELOC_32_GOTOFF
:
1270 case BFD_RELOC_8_PLT_PCREL
:
1271 case BFD_RELOC_16_PLT_PCREL
:
1272 case BFD_RELOC_32_PLT_PCREL
:
1273 case BFD_RELOC_8_PLTOFF
:
1274 case BFD_RELOC_16_PLTOFF
:
1275 case BFD_RELOC_32_PLTOFF
:
1276 case BFD_RELOC_68K_TLS_GD32
:
1277 case BFD_RELOC_68K_TLS_GD16
:
1278 case BFD_RELOC_68K_TLS_GD8
:
1279 case BFD_RELOC_68K_TLS_LDM32
:
1280 case BFD_RELOC_68K_TLS_LDM16
:
1281 case BFD_RELOC_68K_TLS_LDM8
:
1282 case BFD_RELOC_68K_TLS_LDO32
:
1283 case BFD_RELOC_68K_TLS_LDO16
:
1284 case BFD_RELOC_68K_TLS_LDO8
:
1285 case BFD_RELOC_68K_TLS_IE32
:
1286 case BFD_RELOC_68K_TLS_IE16
:
1287 case BFD_RELOC_68K_TLS_IE8
:
1288 case BFD_RELOC_68K_TLS_LE32
:
1289 case BFD_RELOC_68K_TLS_LE16
:
1290 case BFD_RELOC_68K_TLS_LE8
:
1293 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
1294 _("Cannot make %s relocation PC relative"),
1295 bfd_get_reloc_code_name (code
));
1301 #define F(SZ,PCREL) (((SZ) << 1) + (PCREL))
1302 switch (F (fixp
->fx_size
, fixp
->fx_pcrel
))
1304 #define MAP(SZ,PCREL,TYPE) case F(SZ,PCREL): code = (TYPE); break
1305 MAP (1, 0, BFD_RELOC_8
);
1306 MAP (2, 0, BFD_RELOC_16
);
1307 MAP (4, 0, BFD_RELOC_32
);
1308 MAP (1, 1, BFD_RELOC_8_PCREL
);
1309 MAP (2, 1, BFD_RELOC_16_PCREL
);
1310 MAP (4, 1, BFD_RELOC_32_PCREL
);
1318 reloc
= (arelent
*) xmalloc (sizeof (arelent
));
1319 reloc
->sym_ptr_ptr
= (asymbol
**) xmalloc (sizeof (asymbol
*));
1320 *reloc
->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
1321 reloc
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
1324 reloc
->addend
= fixp
->fx_addnumber
;
1325 else if (OUTPUT_FLAVOR
== bfd_target_aout_flavour
1327 && S_IS_WEAK (fixp
->fx_addsy
)
1328 && ! bfd_is_und_section (S_GET_SEGMENT (fixp
->fx_addsy
)))
1330 /* PR gas/3041 References to weak symbols must be treated as extern
1331 in order to be overridable by the linker, even if they are defined
1332 in the same object file. So the original addend must be written
1333 "as is" into the output section without further processing.
1334 The addend value must be hacked here in order to force
1335 bfd_install_relocation() to write the original value into the
1337 1) MD_APPLY_SYM_VALUE() is set to 1 for m68k/a.out, so the symbol
1338 value has already been added to the addend in fixup_segment(). We
1340 2) bfd_install_relocation() will incorrectly treat this symbol as
1341 resolved, so it will write the symbol value plus its addend and
1342 section VMA. As a workaround we can tweak the addend value here in
1343 order to get the original value in the section after the call to
1344 bfd_install_relocation(). */
1345 reloc
->addend
= fixp
->fx_addnumber
1346 /* Fix because of MD_APPLY_SYM_VALUE() */
1347 - S_GET_VALUE (fixp
->fx_addsy
)
1348 /* Fix for bfd_install_relocation() */
1349 - (S_GET_VALUE (fixp
->fx_addsy
)
1350 + S_GET_SEGMENT (fixp
->fx_addsy
)->vma
);
1355 if (!fixp
->fx_pcrel
)
1356 reloc
->addend
= fixp
->fx_addnumber
;
1358 reloc
->addend
= (section
->vma
1359 /* Explicit sign extension in case char is
1361 + ((fixp
->fx_pcrel_adjust
& 0xff) ^ 0x80) - 0x80
1362 + fixp
->fx_addnumber
1363 + md_pcrel_from (fixp
));
1366 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, code
);
1367 gas_assert (reloc
->howto
!= 0);
1372 /* Handle of the OPCODE hash table. NULL means any use before
1373 m68k_ip_begin() will crash. */
1374 static struct hash_control
*op_hash
;
1376 /* Assemble an m68k instruction. */
1379 m68k_ip (char *instring
)
1382 register struct m68k_op
*opP
;
1383 register const struct m68k_incant
*opcode
;
1384 register const char *s
;
1385 register int tmpreg
= 0, baseo
= 0, outro
= 0, nextword
;
1386 char *pdot
, *pdotmove
;
1387 enum m68k_size siz1
, siz2
;
1391 struct m68k_op operands_backup
[6];
1392 LITTLENUM_TYPE words
[6];
1393 LITTLENUM_TYPE
*wordp
;
1394 unsigned long ok_arch
= 0;
1396 if (*instring
== ' ')
1397 instring
++; /* Skip leading whitespace. */
1399 /* Scan up to end of operation-code, which MUST end in end-of-string
1400 or exactly 1 space. */
1402 for (p
= instring
; *p
!= '\0'; p
++)
1412 the_ins
.error
= _("No operator");
1416 /* p now points to the end of the opcode name, probably whitespace.
1417 Make sure the name is null terminated by clobbering the
1418 whitespace, look it up in the hash table, then fix it back.
1419 Remove a dot, first, since the opcode tables have none. */
1422 for (pdotmove
= pdot
; pdotmove
< p
; pdotmove
++)
1423 *pdotmove
= pdotmove
[1];
1429 opcode
= (const struct m68k_incant
*) hash_find (op_hash
, instring
);
1434 for (pdotmove
= p
; pdotmove
> pdot
; pdotmove
--)
1435 *pdotmove
= pdotmove
[-1];
1442 the_ins
.error
= _("Unknown operator");
1446 /* Found a legitimate opcode, start matching operands. */
1450 if (opcode
->m_operands
== 0)
1452 char *old
= input_line_pointer
;
1454 input_line_pointer
= p
;
1455 /* Ahh - it's a motorola style psuedo op. */
1456 mote_pseudo_table
[opcode
->m_opnum
].poc_handler
1457 (mote_pseudo_table
[opcode
->m_opnum
].poc_val
);
1458 input_line_pointer
= old
;
1464 if (flag_mri
&& opcode
->m_opnum
== 0)
1466 /* In MRI mode, random garbage is allowed after an instruction
1467 which accepts no operands. */
1468 the_ins
.args
= opcode
->m_operands
;
1469 the_ins
.numargs
= opcode
->m_opnum
;
1470 the_ins
.numo
= opcode
->m_codenum
;
1471 the_ins
.opcode
[0] = getone (opcode
);
1472 the_ins
.opcode
[1] = gettwo (opcode
);
1476 for (opP
= &the_ins
.operands
[0]; *p
; opP
++)
1478 p
= crack_operand (p
, opP
);
1482 the_ins
.error
= opP
->error
;
1487 opsfound
= opP
- &the_ins
.operands
[0];
1489 /* This ugly hack is to support the floating pt opcodes in their
1490 standard form. Essentially, we fake a first enty of type COP#1 */
1491 if (opcode
->m_operands
[0] == 'I')
1495 for (n
= opsfound
; n
> 0; --n
)
1496 the_ins
.operands
[n
] = the_ins
.operands
[n
- 1];
1498 memset (&the_ins
.operands
[0], '\0', sizeof (the_ins
.operands
[0]));
1499 the_ins
.operands
[0].mode
= CONTROL
;
1500 the_ins
.operands
[0].reg
= m68k_float_copnum
;
1504 /* We've got the operands. Find an opcode that'll accept them. */
1507 /* If we didn't get the right number of ops, or we have no
1508 common model with this pattern then reject this pattern. */
1510 ok_arch
|= opcode
->m_arch
;
1511 if (opsfound
!= opcode
->m_opnum
1512 || ((opcode
->m_arch
& current_architecture
) == 0))
1518 /* Make a copy of the operands of this insn so that
1519 we can modify them safely, should we want to. */
1520 gas_assert (opsfound
<= (int) ARRAY_SIZE (operands_backup
));
1521 for (i
= 0; i
< opsfound
; i
++)
1522 operands_backup
[i
] = the_ins
.operands
[i
];
1524 for (s
= opcode
->m_operands
, opP
= &operands_backup
[0];
1528 /* Warning: this switch is huge! */
1529 /* I've tried to organize the cases into this order:
1530 non-alpha first, then alpha by letter. Lower-case
1531 goes directly before uppercase counterpart. */
1532 /* Code with multiple case ...: gets sorted by the lowest
1533 case ... it belongs to. I hope this makes sense. */
1639 if (opP
->reg
== PC
|| opP
->reg
== ZPC
)
1656 if (opP
->reg
== PC
|| opP
->reg
== ZPC
)
1675 if (opP
->reg
== PC
|| opP
->reg
== ZPC
)
1685 if (opP
->mode
!= IMMED
)
1687 else if (s
[1] == 'b'
1688 && ! isvar (&opP
->disp
)
1689 && (opP
->disp
.exp
.X_op
!= O_constant
1690 || ! isbyte (opP
->disp
.exp
.X_add_number
)))
1692 else if (s
[1] == 'B'
1693 && ! isvar (&opP
->disp
)
1694 && (opP
->disp
.exp
.X_op
!= O_constant
1695 || ! issbyte (opP
->disp
.exp
.X_add_number
)))
1697 else if (s
[1] == 'w'
1698 && ! isvar (&opP
->disp
)
1699 && (opP
->disp
.exp
.X_op
!= O_constant
1700 || ! isword (opP
->disp
.exp
.X_add_number
)))
1702 else if (s
[1] == 'W'
1703 && ! isvar (&opP
->disp
)
1704 && (opP
->disp
.exp
.X_op
!= O_constant
1705 || ! issword (opP
->disp
.exp
.X_add_number
)))
1711 if (opP
->mode
!= IMMED
)
1716 if (opP
->mode
== AREG
1717 || opP
->mode
== CONTROL
1718 || opP
->mode
== FPREG
1719 || opP
->mode
== IMMED
1720 || opP
->mode
== REGLST
1721 || (opP
->mode
!= ABSL
1723 || opP
->reg
== ZPC
)))
1728 if (opP
->mode
== CONTROL
1729 || opP
->mode
== FPREG
1730 || opP
->mode
== REGLST
1731 || opP
->mode
== IMMED
1732 || (opP
->mode
!= ABSL
1734 || opP
->reg
== ZPC
)))
1762 if (opP
->mode
== CONTROL
1763 || opP
->mode
== FPREG
1764 || opP
->mode
== REGLST
)
1769 if (opP
->mode
!= AINC
)
1774 if (opP
->mode
!= ADEC
)
1824 if (opP
->reg
== PC
|| opP
->reg
== ZPC
)
1845 case '~': /* For now! (JF FOO is this right?) */
1867 if (opP
->mode
!= CONTROL
1868 || (opP
->reg
!= TT0
&& opP
->reg
!= TT1
))
1873 if (opP
->mode
!= AREG
)
1878 if (opP
->mode
!= AINDR
)
1883 if (opP
->mode
!= AINDR
&& opP
->mode
!= AINC
&& opP
->mode
!= ADEC
1884 && (opP
->mode
!= DISP
1886 || opP
->reg
> ADDR7
))
1891 if (opP
->mode
!= ABSL
1893 && strncmp (instring
, "jbsr", 4) == 0))
1916 if (opP
->mode
!= CONTROL
|| opP
->reg
!= CCR
)
1921 if (opP
->mode
!= DISP
1923 || opP
->reg
> ADDR7
)
1928 if (opP
->mode
!= DREG
)
1933 if (opP
->reg
!= ACC
)
1938 if (opP
->reg
!= ACC
&& opP
->reg
!= ACC1
1939 && opP
->reg
!= ACC2
&& opP
->reg
!= ACC3
)
1944 if (opP
->mode
!= FPREG
)
1949 if (opP
->reg
!= MACSR
)
1954 if (opP
->reg
!= ACCEXT01
&& opP
->reg
!= ACCEXT23
)
1959 if (opP
->reg
!= MASK
)
1964 if (opP
->mode
!= CONTROL
1971 if (opP
->mode
!= LSH
&& opP
->mode
!= RSH
)
1976 if (opP
->mode
!= CONTROL
1978 || opP
->reg
> last_movec_reg
1983 const enum m68k_register
*rp
;
1985 for (rp
= control_regs
; *rp
; rp
++)
1987 if (*rp
== opP
->reg
)
1989 /* In most CPUs RAMBAR refers to control reg
1990 c05 (RAMBAR1), but a few CPUs have it
1991 refer to c04 (RAMBAR0). */
1992 else if (*rp
== RAMBAR_ALT
&& opP
->reg
== RAMBAR
)
1994 opP
->reg
= RAMBAR_ALT
;
2004 if (opP
->mode
!= IMMED
)
2010 if (opP
->mode
== DREG
2011 || opP
->mode
== AREG
2012 || opP
->mode
== FPREG
)
2021 opP
->mask
= 1 << (opP
->reg
- DATA0
);
2024 opP
->mask
= 1 << (opP
->reg
- ADDR0
+ 8);
2027 opP
->mask
= 1 << (opP
->reg
- FP0
+ 16);
2035 else if (opP
->mode
== CONTROL
)
2044 opP
->mask
= 1 << 24;
2047 opP
->mask
= 1 << 25;
2050 opP
->mask
= 1 << 26;
2059 else if (opP
->mode
!= REGLST
)
2061 else if (s
[1] == '8' && (opP
->mask
& 0x0ffffff) != 0)
2063 else if (s
[1] == '3' && (opP
->mask
& 0x7000000) != 0)
2068 if (opP
->mode
!= IMMED
)
2070 else if (opP
->disp
.exp
.X_op
!= O_constant
2071 || ! issbyte (opP
->disp
.exp
.X_add_number
))
2073 else if (! m68k_quick
2074 && instring
[3] != 'q'
2075 && instring
[4] != 'q')
2080 if (opP
->mode
!= DREG
2081 && opP
->mode
!= IMMED
2082 && opP
->mode
!= ABSL
)
2087 if (opP
->mode
!= IMMED
)
2089 else if (opP
->disp
.exp
.X_op
!= O_constant
2090 || TRUNC (opP
->disp
.exp
.X_add_number
) - 1 > 7)
2092 else if (! m68k_quick
2093 && (strncmp (instring
, "add", 3) == 0
2094 || strncmp (instring
, "sub", 3) == 0)
2095 && instring
[3] != 'q')
2100 if (opP
->mode
!= DREG
&& opP
->mode
!= AREG
)
2105 if (opP
->mode
!= AINDR
2106 && (opP
->mode
!= BASE
2108 && opP
->reg
!= ZADDR0
)
2109 || opP
->disp
.exp
.X_op
!= O_absent
2110 || ((opP
->index
.reg
< DATA0
2111 || opP
->index
.reg
> DATA7
)
2112 && (opP
->index
.reg
< ADDR0
2113 || opP
->index
.reg
> ADDR7
))
2114 || opP
->index
.size
!= SIZE_UNSPEC
2115 || opP
->index
.scale
!= 1))
2120 if (opP
->mode
!= CONTROL
2121 || ! (opP
->reg
== FPI
2123 || opP
->reg
== FPC
))
2128 if (opP
->mode
!= CONTROL
|| opP
->reg
!= SR
)
2133 if (opP
->mode
!= IMMED
)
2135 else if (opP
->disp
.exp
.X_op
!= O_constant
2136 || TRUNC (opP
->disp
.exp
.X_add_number
) > 7)
2141 if (opP
->mode
!= CONTROL
|| opP
->reg
!= USP
)
2146 if (opP
->mode
!= IMMED
)
2148 else if (opP
->disp
.exp
.X_op
!= O_constant
2149 || (TRUNC (opP
->disp
.exp
.X_add_number
) != 0xffffffff
2150 && TRUNC (opP
->disp
.exp
.X_add_number
) - 1 > 6))
2155 if (opP
->mode
!= IMMED
)
2157 else if (opP
->disp
.exp
.X_op
!= O_constant
2158 || TRUNC (opP
->disp
.exp
.X_add_number
) - 1 > 7)
2163 if (opP
->mode
!= IMMED
)
2165 else if (opP
->disp
.exp
.X_op
!= O_constant
2166 || TRUNC (opP
->disp
.exp
.X_add_number
) > 511)
2170 /* JF these are out of order. We could put them
2171 in order if we were willing to put up with
2172 bunches of #ifdef m68851s in the code.
2174 Don't forget that you need these operands
2175 to use 68030 MMU instructions. */
2177 /* Memory addressing mode used by pflushr. */
2179 if (opP
->mode
== CONTROL
2180 || opP
->mode
== FPREG
2181 || opP
->mode
== DREG
2182 || opP
->mode
== AREG
2183 || opP
->mode
== REGLST
)
2185 /* We should accept immediate operands, but they
2186 supposedly have to be quad word, and we don't
2187 handle that. I would like to see what a Motorola
2188 assembler does before doing something here. */
2189 if (opP
->mode
== IMMED
)
2194 if (opP
->mode
!= CONTROL
2195 || (opP
->reg
!= SFC
&& opP
->reg
!= DFC
))
2200 if (opP
->mode
!= CONTROL
|| opP
->reg
!= TC
)
2205 if (opP
->mode
!= CONTROL
|| opP
->reg
!= AC
)
2210 if (opP
->mode
!= CONTROL
2213 && opP
->reg
!= SCC
))
2218 if (opP
->mode
!= CONTROL
2224 if (opP
->mode
!= CONTROL
2227 && opP
->reg
!= CRP
))
2251 if (opP
->mode
!= CONTROL
2252 || (!(opP
->reg
>= BAD
&& opP
->reg
<= BAD
+ 7)
2253 && !(opP
->reg
>= BAC
&& opP
->reg
<= BAC
+ 7)))
2258 if (opP
->mode
!= CONTROL
|| opP
->reg
!= PSR
)
2263 if (opP
->mode
!= CONTROL
|| opP
->reg
!= PCSR
)
2268 if (opP
->mode
!= CONTROL
2277 if (opP
->mode
!= ABSL
)
2282 if (opP
->reg
< DATA0L
|| opP
->reg
> ADDR7U
)
2284 /* FIXME: kludge instead of fixing parser:
2285 upper/lower registers are *not* CONTROL
2286 registers, but ordinary ones. */
2287 if ((opP
->reg
>= DATA0L
&& opP
->reg
<= DATA7L
)
2288 || (opP
->reg
>= DATA0U
&& opP
->reg
<= DATA7U
))
2295 if (!(opP
->mode
== AINDR
2296 || (opP
->mode
== DISP
2297 && !(opP
->reg
== PC
|| opP
->reg
== ZPC
))))
2302 if (!(opP
->mode
== AINDR
|| opP
->mode
== DISP
))
2314 /* Since we have found the correct instruction, copy
2315 in the modifications that we may have made. */
2317 for (i
= 0; i
< opsfound
; i
++)
2318 the_ins
.operands
[i
] = operands_backup
[i
];
2324 opcode
= opcode
->m_next
;
2329 && !(ok_arch
& current_architecture
))
2331 const struct m68k_cpu
*cpu
;
2334 char *buf
= xmalloc (space
+ 1);
2338 the_ins
.error
= buf
;
2339 /* Make sure there's a NUL at the end of the buffer -- strncpy
2340 won't write one when it runs out of buffer. */
2342 #define APPEND(STRING) \
2343 (strncpy (buf, STRING, space), len = strlen (buf), buf += len, space -= len)
2345 APPEND (_("invalid instruction for this architecture; needs "));
2349 APPEND ("ColdFire ISA_A");
2352 APPEND ("ColdFire ");
2353 APPEND (_("hardware divide"));
2356 APPEND ("ColdFire ISA_A+");
2359 APPEND ("ColdFire ISA_B");
2362 APPEND ("ColdFire ISA_C");
2365 APPEND ("ColdFire fpu");
2368 APPEND ("M68K fpu");
2371 APPEND ("M68K mmu");
2375 APPEND (_("or higher"));
2379 APPEND (_("or higher"));
2383 APPEND (_("or higher"));
2391 for (cpu
= m68k_cpus
; cpu
->name
; cpu
++)
2392 if (!cpu
->alias
&& (cpu
->arch
& ok_arch
))
2394 const struct m68k_cpu
*alias
;
2395 int seen_master
= 0;
2401 for (alias
= cpu
; alias
!= m68k_cpus
; alias
--)
2402 if (alias
[-1].alias
>= 0)
2404 for (; !seen_master
|| alias
->alias
> 0; alias
++)
2414 APPEND (alias
->name
);
2427 /* We ran out of space, so replace the end of the list
2432 strcpy (buf
, " ...");
2436 the_ins
.error
= _("operands mismatch");
2443 /* Now assemble it. */
2444 the_ins
.args
= opcode
->m_operands
;
2445 the_ins
.numargs
= opcode
->m_opnum
;
2446 the_ins
.numo
= opcode
->m_codenum
;
2447 the_ins
.opcode
[0] = getone (opcode
);
2448 the_ins
.opcode
[1] = gettwo (opcode
);
2450 for (s
= the_ins
.args
, opP
= &the_ins
.operands
[0]; *s
; s
+= 2, opP
++)
2455 /* This switch is a doozy.
2456 Watch the first step; its a big one! */
2489 tmpreg
= 0x3c; /* 7.4 */
2490 if (strchr ("bwl", s
[1]))
2491 nextword
= get_num (&opP
->disp
, 90);
2493 nextword
= get_num (&opP
->disp
, 0);
2494 if (isvar (&opP
->disp
))
2495 add_fix (s
[1], &opP
->disp
, 0, 0);
2499 if (!isbyte (nextword
))
2500 opP
->error
= _("operand out of range");
2505 if (!isword (nextword
))
2506 opP
->error
= _("operand out of range");
2511 if (!issword (nextword
))
2512 opP
->error
= _("operand out of range");
2517 addword (nextword
>> 16);
2544 /* We gotta put out some float. */
2545 if (op (&opP
->disp
) != O_big
)
2550 /* Can other cases happen here? */
2551 if (op (&opP
->disp
) != O_constant
)
2554 val
= (valueT
) offs (&opP
->disp
);
2558 generic_bignum
[gencnt
] = (LITTLENUM_TYPE
) val
;
2559 val
>>= LITTLENUM_NUMBER_OF_BITS
;
2563 offs (&opP
->disp
) = gencnt
;
2565 if (offs (&opP
->disp
) > 0)
2567 if (offs (&opP
->disp
) > baseo
)
2569 as_warn (_("Bignum too big for %c format; truncated"),
2571 offs (&opP
->disp
) = baseo
;
2573 baseo
-= offs (&opP
->disp
);
2576 for (wordp
= generic_bignum
+ offs (&opP
->disp
) - 1;
2577 offs (&opP
->disp
)--;
2582 gen_to_words (words
, baseo
, (long) outro
);
2583 for (wordp
= words
; baseo
--; wordp
++)
2587 tmpreg
= opP
->reg
- DATA
; /* 0.dreg */
2590 tmpreg
= 0x08 + opP
->reg
- ADDR
; /* 1.areg */
2593 tmpreg
= 0x10 + opP
->reg
- ADDR
; /* 2.areg */
2596 tmpreg
= 0x20 + opP
->reg
- ADDR
; /* 4.areg */
2599 tmpreg
= 0x18 + opP
->reg
- ADDR
; /* 3.areg */
2603 nextword
= get_num (&opP
->disp
, 90);
2605 /* Convert mode 5 addressing with a zero offset into
2606 mode 2 addressing to reduce the instruction size by a
2608 if (! isvar (&opP
->disp
)
2610 && (opP
->disp
.size
== SIZE_UNSPEC
)
2611 && (opP
->reg
>= ADDR0
)
2612 && (opP
->reg
<= ADDR7
))
2614 tmpreg
= 0x10 + opP
->reg
- ADDR
; /* 2.areg */
2619 && ! isvar (&opP
->disp
)
2622 opP
->disp
.exp
.X_op
= O_symbol
;
2623 opP
->disp
.exp
.X_add_symbol
=
2624 section_symbol (absolute_section
);
2627 /* Force into index mode. Hope this works. */
2629 /* We do the first bit for 32-bit displacements, and the
2630 second bit for 16 bit ones. It is possible that we
2631 should make the default be WORD instead of LONG, but
2632 I think that'd break GCC, so we put up with a little
2633 inefficiency for the sake of working output. */
2635 if (!issword (nextword
)
2636 || (isvar (&opP
->disp
)
2637 && ((opP
->disp
.size
== SIZE_UNSPEC
2638 && flag_short_refs
== 0
2639 && cpu_of_arch (current_architecture
) >= m68020
2640 && ! arch_coldfire_p (current_architecture
))
2641 || opP
->disp
.size
== SIZE_LONG
)))
2643 if (cpu_of_arch (current_architecture
) < m68020
2644 || arch_coldfire_p (current_architecture
))
2646 _("displacement too large for this architecture; needs 68020 or higher");
2648 tmpreg
= 0x3B; /* 7.3 */
2650 tmpreg
= 0x30 + opP
->reg
- ADDR
; /* 6.areg */
2651 if (isvar (&opP
->disp
))
2655 if (opP
->disp
.size
== SIZE_LONG
2657 /* If the displacement needs pic
2658 relocation it cannot be relaxed. */
2659 || opP
->disp
.pic_reloc
!= pic_none
2664 add_fix ('l', &opP
->disp
, 1, 2);
2668 add_frag (adds (&opP
->disp
),
2669 SEXT (offs (&opP
->disp
)),
2670 TAB (PCREL1632
, SZ_UNDEF
));
2677 add_fix ('l', &opP
->disp
, 0, 0);
2682 addword (nextword
>> 16);
2687 tmpreg
= 0x3A; /* 7.2 */
2689 tmpreg
= 0x28 + opP
->reg
- ADDR
; /* 5.areg */
2691 if (isvar (&opP
->disp
))
2695 add_fix ('w', &opP
->disp
, 1, 0);
2698 add_fix ('w', &opP
->disp
, 0, 0);
2708 baseo
= get_num (&opP
->disp
, 90);
2709 if (opP
->mode
== POST
|| opP
->mode
== PRE
)
2710 outro
= get_num (&opP
->odisp
, 90);
2711 /* Figure out the `addressing mode'.
2712 Also turn on the BASE_DISABLE bit, if needed. */
2713 if (opP
->reg
== PC
|| opP
->reg
== ZPC
)
2715 tmpreg
= 0x3b; /* 7.3 */
2716 if (opP
->reg
== ZPC
)
2719 else if (opP
->reg
== 0)
2722 tmpreg
= 0x30; /* 6.garbage */
2724 else if (opP
->reg
>= ZADDR0
&& opP
->reg
<= ZADDR7
)
2727 tmpreg
= 0x30 + opP
->reg
- ZADDR0
;
2730 tmpreg
= 0x30 + opP
->reg
- ADDR
; /* 6.areg */
2732 siz1
= opP
->disp
.size
;
2733 if (opP
->mode
== POST
|| opP
->mode
== PRE
)
2734 siz2
= opP
->odisp
.size
;
2738 /* Index register stuff. */
2739 if (opP
->index
.reg
!= 0
2740 && opP
->index
.reg
>= DATA
2741 && opP
->index
.reg
<= ADDR7
)
2743 nextword
|= (opP
->index
.reg
- DATA
) << 12;
2745 if (opP
->index
.size
== SIZE_LONG
2746 || (opP
->index
.size
== SIZE_UNSPEC
2747 && m68k_index_width_default
== SIZE_LONG
))
2750 if ((opP
->index
.scale
!= 1
2751 && cpu_of_arch (current_architecture
) < m68020
)
2752 || (opP
->index
.scale
== 8
2753 && (arch_coldfire_p (current_architecture
)
2754 && !arch_coldfire_fpu (current_architecture
))))
2757 _("scale factor invalid on this architecture; needs cpu32 or 68020 or higher");
2760 if (arch_coldfire_p (current_architecture
)
2761 && opP
->index
.size
== SIZE_WORD
)
2762 opP
->error
= _("invalid index size for coldfire");
2764 switch (opP
->index
.scale
)
2781 GET US OUT OF HERE! */
2783 /* Must be INDEX, with an index register. Address
2784 register cannot be ZERO-PC, and either :b was
2785 forced, or we know it will fit. For a 68000 or
2786 68010, force this mode anyways, because the
2787 larger modes aren't supported. */
2788 if (opP
->mode
== BASE
2789 && ((opP
->reg
>= ADDR0
2790 && opP
->reg
<= ADDR7
)
2793 if (siz1
== SIZE_BYTE
2794 || cpu_of_arch (current_architecture
) < m68020
2795 || arch_coldfire_p (current_architecture
)
2796 || (siz1
== SIZE_UNSPEC
2797 && ! isvar (&opP
->disp
)
2798 && issbyte (baseo
)))
2800 nextword
+= baseo
& 0xff;
2802 if (isvar (&opP
->disp
))
2804 /* Do a byte relocation. If it doesn't
2805 fit (possible on m68000) let the
2806 fixup processing complain later. */
2808 add_fix ('B', &opP
->disp
, 1, 1);
2810 add_fix ('B', &opP
->disp
, 0, 0);
2812 else if (siz1
!= SIZE_BYTE
)
2814 if (siz1
!= SIZE_UNSPEC
)
2815 as_warn (_("Forcing byte displacement"));
2816 if (! issbyte (baseo
))
2817 opP
->error
= _("byte displacement out of range");
2822 else if (siz1
== SIZE_UNSPEC
2824 && isvar (&opP
->disp
)
2825 && subs (&opP
->disp
) == NULL
2827 /* If the displacement needs pic
2828 relocation it cannot be relaxed. */
2829 && opP
->disp
.pic_reloc
== pic_none
2833 /* The code in md_convert_frag_1 needs to be
2834 able to adjust nextword. Call frag_grow
2835 to ensure that we have enough space in
2836 the frag obstack to make all the bytes
2839 nextword
+= baseo
& 0xff;
2841 add_frag (adds (&opP
->disp
),
2842 SEXT (offs (&opP
->disp
)),
2843 TAB (PCINDEX
, SZ_UNDEF
));
2851 nextword
|= 0x40; /* No index reg. */
2852 if (opP
->index
.reg
>= ZDATA0
2853 && opP
->index
.reg
<= ZDATA7
)
2854 nextword
|= (opP
->index
.reg
- ZDATA0
) << 12;
2855 else if (opP
->index
.reg
>= ZADDR0
2856 || opP
->index
.reg
<= ZADDR7
)
2857 nextword
|= (opP
->index
.reg
- ZADDR0
+ 8) << 12;
2860 /* It isn't simple. */
2862 if (cpu_of_arch (current_architecture
) < m68020
2863 || arch_coldfire_p (current_architecture
))
2865 _("invalid operand mode for this architecture; needs 68020 or higher");
2868 /* If the guy specified a width, we assume that it is
2869 wide enough. Maybe it isn't. If so, we lose. */
2873 if (isvar (&opP
->disp
)
2875 : ! issword (baseo
))
2880 else if (! isvar (&opP
->disp
) && baseo
== 0)
2889 as_warn (_(":b not permitted; defaulting to :w"));
2899 /* Figure out inner displacement stuff. */
2900 if (opP
->mode
== POST
|| opP
->mode
== PRE
)
2902 if (cpu_of_arch (current_architecture
) & cpu32
)
2903 opP
->error
= _("invalid operand mode for this architecture; needs 68020 or higher");
2907 if (isvar (&opP
->odisp
)
2909 : ! issword (outro
))
2914 else if (! isvar (&opP
->odisp
) && outro
== 0)
2923 as_warn (_(":b not permitted; defaulting to :w"));
2932 if (opP
->mode
== POST
2933 && (nextword
& 0x40) == 0)
2938 if (siz1
!= SIZE_UNSPEC
&& isvar (&opP
->disp
))
2940 if (opP
->reg
== PC
|| opP
->reg
== ZPC
)
2941 add_fix (siz1
== SIZE_LONG
? 'l' : 'w', &opP
->disp
, 1, 2);
2943 add_fix (siz1
== SIZE_LONG
? 'l' : 'w', &opP
->disp
, 0, 0);
2945 if (siz1
== SIZE_LONG
)
2946 addword (baseo
>> 16);
2947 if (siz1
!= SIZE_UNSPEC
)
2950 if (siz2
!= SIZE_UNSPEC
&& isvar (&opP
->odisp
))
2951 add_fix (siz2
== SIZE_LONG
? 'l' : 'w', &opP
->odisp
, 0, 0);
2952 if (siz2
== SIZE_LONG
)
2953 addword (outro
>> 16);
2954 if (siz2
!= SIZE_UNSPEC
)
2960 nextword
= get_num (&opP
->disp
, 90);
2961 switch (opP
->disp
.size
)
2966 if (!isvar (&opP
->disp
) && issword (offs (&opP
->disp
)))
2968 tmpreg
= 0x38; /* 7.0 */
2972 if (isvar (&opP
->disp
)
2973 && !subs (&opP
->disp
)
2974 && adds (&opP
->disp
)
2976 /* If the displacement needs pic relocation it
2977 cannot be relaxed. */
2978 && opP
->disp
.pic_reloc
== pic_none
2981 && !strchr ("~%&$?", s
[0]))
2983 tmpreg
= 0x3A; /* 7.2 */
2984 add_frag (adds (&opP
->disp
),
2985 SEXT (offs (&opP
->disp
)),
2986 TAB (ABSTOPCREL
, SZ_UNDEF
));
2989 /* Fall through into long. */
2991 if (isvar (&opP
->disp
))
2992 add_fix ('l', &opP
->disp
, 0, 0);
2994 tmpreg
= 0x39;/* 7.1 mode */
2995 addword (nextword
>> 16);
3000 as_bad (_("unsupported byte value; use a different suffix"));
3004 if (isvar (&opP
->disp
))
3005 add_fix ('w', &opP
->disp
, 0, 0);
3007 tmpreg
= 0x38;/* 7.0 mode */
3015 as_bad (_("unknown/incorrect operand"));
3019 /* If s[0] is '4', then this is for the mac instructions
3020 that can have a trailing_ampersand set. If so, set 0x100
3021 bit on tmpreg so install_gen_operand can check for it and
3022 set the appropriate bit (word2, bit 5). */
3025 if (opP
->trailing_ampersand
)
3028 install_gen_operand (s
[1], tmpreg
);
3034 { /* JF: I hate floating point! */
3049 tmpreg
= get_num (&opP
->disp
, tmpreg
);
3050 if (isvar (&opP
->disp
))
3051 add_fix (s
[1], &opP
->disp
, 0, 0);
3054 case 'b': /* Danger: These do no check for
3055 certain types of overflow.
3057 if (!isbyte (tmpreg
))
3058 opP
->error
= _("out of range");
3059 insop (tmpreg
, opcode
);
3060 if (isvar (&opP
->disp
))
3061 the_ins
.reloc
[the_ins
.nrel
- 1].n
=
3062 (opcode
->m_codenum
) * 2 + 1;
3065 if (!issbyte (tmpreg
))
3066 opP
->error
= _("out of range");
3067 the_ins
.opcode
[the_ins
.numo
- 1] |= tmpreg
& 0xff;
3068 if (isvar (&opP
->disp
))
3069 the_ins
.reloc
[the_ins
.nrel
- 1].n
= opcode
->m_codenum
* 2 - 1;
3072 if (!isword (tmpreg
))
3073 opP
->error
= _("out of range");
3074 insop (tmpreg
, opcode
);
3075 if (isvar (&opP
->disp
))
3076 the_ins
.reloc
[the_ins
.nrel
- 1].n
= (opcode
->m_codenum
) * 2;
3079 if (!issword (tmpreg
))
3080 opP
->error
= _("out of range");
3081 insop (tmpreg
, opcode
);
3082 if (isvar (&opP
->disp
))
3083 the_ins
.reloc
[the_ins
.nrel
- 1].n
= (opcode
->m_codenum
) * 2;
3086 /* Because of the way insop works, we put these two out
3088 insop (tmpreg
, opcode
);
3089 insop (tmpreg
>> 16, opcode
);
3090 if (isvar (&opP
->disp
))
3091 the_ins
.reloc
[the_ins
.nrel
- 1].n
= (opcode
->m_codenum
) * 2;
3098 install_operand (s
[1], tmpreg
);
3109 install_operand (s
[1], opP
->reg
- ADDR
);
3113 tmpreg
= get_num (&opP
->disp
, 90);
3118 add_fix ('B', &opP
->disp
, 1, -1);
3121 add_fix ('w', &opP
->disp
, 1, 0);
3126 the_ins
.opcode
[0] |= 0xff;
3127 add_fix ('l', &opP
->disp
, 1, 0);
3131 case 'g': /* Conditional branch */
3132 have_disp
= HAVE_LONG_CALL (current_architecture
);
3135 case 'b': /* Unconditional branch */
3136 have_disp
= HAVE_LONG_BRANCH (current_architecture
);
3137 use_pl
= LONG_BRANCH_VIA_COND (current_architecture
);
3140 case 's': /* Unconditional subroutine */
3141 have_disp
= HAVE_LONG_CALL (current_architecture
);
3144 if (subs (&opP
->disp
) /* We can't relax it. */
3146 /* If the displacement needs pic relocation it cannot be
3148 || opP
->disp
.pic_reloc
!= pic_none
3153 as_warn (_("Can't use long branches on this architecture"));
3157 /* This could either be a symbol, or an absolute
3158 address. If it's an absolute address, turn it into
3159 an absolute jump right here and keep it out of the
3161 if (adds (&opP
->disp
) == 0)
3163 if (the_ins
.opcode
[0] == 0x6000) /* jbra */
3164 the_ins
.opcode
[0] = 0x4EF9;
3165 else if (the_ins
.opcode
[0] == 0x6100) /* jbsr */
3166 the_ins
.opcode
[0] = 0x4EB9;
3169 the_ins
.opcode
[0] ^= 0x0100;
3170 the_ins
.opcode
[0] |= 0x0006;
3173 add_fix ('l', &opP
->disp
, 0, 0);
3179 /* Now we know it's going into the relaxer. Now figure
3180 out which mode. We try in this order of preference:
3181 long branch, absolute jump, byte/word branches only. */
3183 add_frag (adds (&opP
->disp
),
3184 SEXT (offs (&opP
->disp
)),
3185 TAB (BRANCHBWL
, SZ_UNDEF
));
3186 else if (! flag_keep_pcrel
)
3188 if ((the_ins
.opcode
[0] == 0x6000)
3189 || (the_ins
.opcode
[0] == 0x6100))
3190 add_frag (adds (&opP
->disp
),
3191 SEXT (offs (&opP
->disp
)),
3192 TAB (BRABSJUNC
, SZ_UNDEF
));
3194 add_frag (adds (&opP
->disp
),
3195 SEXT (offs (&opP
->disp
)),
3196 TAB (BRABSJCOND
, SZ_UNDEF
));
3199 add_frag (adds (&opP
->disp
),
3200 SEXT (offs (&opP
->disp
)),
3201 (use_pl
? TAB (BRANCHBWPL
, SZ_UNDEF
)
3202 : TAB (BRANCHBW
, SZ_UNDEF
)));
3205 if (isvar (&opP
->disp
))
3207 /* Check for DBcc instructions. We can relax them,
3208 but only if we have long branches and/or absolute
3210 if (((the_ins
.opcode
[0] & 0xf0f8) == 0x50c8)
3211 && (HAVE_LONG_BRANCH (current_architecture
)
3212 || ! flag_keep_pcrel
))
3214 if (HAVE_LONG_BRANCH (current_architecture
))
3215 add_frag (adds (&opP
->disp
),
3216 SEXT (offs (&opP
->disp
)),
3217 TAB (DBCCLBR
, SZ_UNDEF
));
3219 add_frag (adds (&opP
->disp
),
3220 SEXT (offs (&opP
->disp
)),
3221 TAB (DBCCABSJ
, SZ_UNDEF
));
3224 add_fix ('w', &opP
->disp
, 1, 0);
3228 case 'C': /* Fixed size LONG coproc branches. */
3229 add_fix ('l', &opP
->disp
, 1, 0);
3233 case 'c': /* Var size Coprocesssor branches. */
3234 if (subs (&opP
->disp
) || (adds (&opP
->disp
) == 0))
3236 the_ins
.opcode
[the_ins
.numo
- 1] |= 0x40;
3237 add_fix ('l', &opP
->disp
, 1, 0);
3242 add_frag (adds (&opP
->disp
),
3243 SEXT (offs (&opP
->disp
)),
3244 TAB (FBRANCH
, SZ_UNDEF
));
3251 case 'C': /* Ignore it. */
3254 case 'd': /* JF this is a kludge. */
3255 install_operand ('s', opP
->reg
- ADDR
);
3256 tmpreg
= get_num (&opP
->disp
, 90);
3257 if (!issword (tmpreg
))
3259 as_warn (_("Expression out of range, using 0"));
3266 install_operand (s
[1], opP
->reg
- DATA
);
3269 case 'e': /* EMAC ACCx, reg/reg. */
3270 install_operand (s
[1], opP
->reg
- ACC
);
3273 case 'E': /* Ignore it. */
3277 install_operand (s
[1], opP
->reg
- FP0
);
3280 case 'g': /* EMAC ACCEXTx. */
3281 install_operand (s
[1], opP
->reg
- ACCEXT01
);
3284 case 'G': /* Ignore it. */
3289 tmpreg
= opP
->reg
- COP0
;
3290 install_operand (s
[1], tmpreg
);
3293 case 'i': /* MAC/EMAC scale factor. */
3294 install_operand (s
[1], opP
->mode
== LSH
? 0x1 : 0x3);
3297 case 'J': /* JF foo. */
3438 install_operand (s
[1], tmpreg
);
3442 tmpreg
= get_num (&opP
->disp
, 55);
3443 install_operand (s
[1], tmpreg
& 0x7f);
3450 if (tmpreg
& 0x7FF0000)
3451 as_bad (_("Floating point register in register list"));
3452 insop (reverse_16_bits (tmpreg
), opcode
);
3456 if (tmpreg
& 0x700FFFF)
3457 as_bad (_("Wrong register in floating-point reglist"));
3458 install_operand (s
[1], reverse_8_bits (tmpreg
>> 16));
3466 if (tmpreg
& 0x7FF0000)
3467 as_bad (_("Floating point register in register list"));
3468 insop (tmpreg
, opcode
);
3470 else if (s
[1] == '8')
3472 if (tmpreg
& 0x0FFFFFF)
3473 as_bad (_("incorrect register in reglist"));
3474 install_operand (s
[1], tmpreg
>> 24);
3478 if (tmpreg
& 0x700FFFF)
3479 as_bad (_("wrong register in floating-point reglist"));
3481 install_operand (s
[1], tmpreg
>> 16);
3486 install_operand (s
[1], get_num (&opP
->disp
, 60));
3490 tmpreg
= ((opP
->mode
== DREG
)
3491 ? 0x20 + (int) (opP
->reg
- DATA
)
3492 : (get_num (&opP
->disp
, 40) & 0x1F));
3493 install_operand (s
[1], tmpreg
);
3497 tmpreg
= get_num (&opP
->disp
, 10);
3500 install_operand (s
[1], tmpreg
);
3504 /* This depends on the fact that ADDR registers are eight
3505 more than their corresponding DATA regs, so the result
3506 will have the ADDR_REG bit set. */
3507 install_operand (s
[1], opP
->reg
- DATA
);
3511 if (opP
->mode
== AINDR
)
3512 install_operand (s
[1], opP
->reg
- DATA
);
3514 install_operand (s
[1], opP
->index
.reg
- DATA
);
3518 if (opP
->reg
== FPI
)
3520 else if (opP
->reg
== FPS
)
3522 else if (opP
->reg
== FPC
)
3526 install_operand (s
[1], tmpreg
);
3529 case 'S': /* Ignore it. */
3533 install_operand (s
[1], get_num (&opP
->disp
, 30));
3536 case 'U': /* Ignore it. */
3555 as_fatal (_("failed sanity check"));
3556 } /* switch on cache token. */
3557 install_operand (s
[1], tmpreg
);
3560 /* JF: These are out of order, I fear. */
3573 install_operand (s
[1], tmpreg
);
3599 install_operand (s
[1], tmpreg
);
3603 if (opP
->reg
== VAL
)
3622 install_operand (s
[1], tmpreg
);
3636 tmpreg
= (4 << 10) | ((opP
->reg
- BAD
) << 2);
3647 tmpreg
= (5 << 10) | ((opP
->reg
- BAC
) << 2);
3653 install_operand (s
[1], tmpreg
);
3656 know (opP
->reg
== PSR
);
3659 know (opP
->reg
== PCSR
);
3674 install_operand (s
[1], tmpreg
);
3677 tmpreg
= get_num (&opP
->disp
, 20);
3678 install_operand (s
[1], tmpreg
);
3680 case '_': /* used only for move16 absolute 32-bit address. */
3681 if (isvar (&opP
->disp
))
3682 add_fix ('l', &opP
->disp
, 0, 0);
3683 tmpreg
= get_num (&opP
->disp
, 90);
3684 addword (tmpreg
>> 16);
3685 addword (tmpreg
& 0xFFFF);
3688 install_operand (s
[1], opP
->reg
- DATA0L
);
3689 opP
->reg
-= (DATA0L
);
3690 opP
->reg
&= 0x0F; /* remove upper/lower bit. */
3693 tmpreg
= get_num (&opP
->disp
, 80);
3696 install_operand (s
[1], tmpreg
);
3699 tmpreg
= get_num (&opP
->disp
, 10);
3700 install_operand (s
[1], tmpreg
- 1);
3703 tmpreg
= get_num (&opP
->disp
, 65);
3704 install_operand (s
[1], tmpreg
);
3711 /* By the time whe get here (FINALLY) the_ins contains the complete
3712 instruction, ready to be emitted. . . */
3716 reverse_16_bits (int in
)
3721 static int mask
[16] =
3723 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
3724 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000
3726 for (n
= 0; n
< 16; n
++)
3729 out
|= mask
[15 - n
];
3732 } /* reverse_16_bits() */
3735 reverse_8_bits (int in
)
3740 static int mask
[8] =
3742 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
3745 for (n
= 0; n
< 8; n
++)
3751 } /* reverse_8_bits() */
3753 /* Cause an extra frag to be generated here, inserting up to
3754 FRAG_VAR_SIZE bytes. TYPE is the subtype of the frag to be
3755 generated; its primary type is rs_machine_dependent.
3757 The TYPE parameter is also used by md_convert_frag_1 and
3758 md_estimate_size_before_relax. The appropriate type of fixup will
3759 be emitted by md_convert_frag_1.
3761 ADD becomes the FR_SYMBOL field of the frag, and OFF the FR_OFFSET. */
3763 install_operand (int mode
, int val
)
3768 the_ins
.opcode
[0] |= val
& 0xFF; /* JF FF is for M kludge. */
3771 the_ins
.opcode
[0] |= val
<< 9;
3774 the_ins
.opcode
[1] |= val
<< 9;
3777 the_ins
.opcode
[1] |= val
<< 12;
3780 the_ins
.opcode
[1] |= val
<< 6;
3783 the_ins
.opcode
[1] |= val
;
3786 the_ins
.opcode
[2] |= val
<< 12;
3789 the_ins
.opcode
[2] |= val
<< 6;
3792 /* DANGER! This is a hack to force cas2l and cas2w cmds to be
3793 three words long! */
3795 the_ins
.opcode
[2] |= val
;
3798 the_ins
.opcode
[1] |= val
<< 7;
3801 the_ins
.opcode
[1] |= val
<< 10;
3805 the_ins
.opcode
[1] |= val
<< 5;
3810 the_ins
.opcode
[1] |= (val
<< 10) | (val
<< 7);
3813 the_ins
.opcode
[1] |= (val
<< 12) | val
;
3816 the_ins
.opcode
[0] |= val
= 0xff;
3819 the_ins
.opcode
[0] |= val
<< 9;
3822 the_ins
.opcode
[1] |= val
;
3825 the_ins
.opcode
[1] |= val
;
3826 the_ins
.numo
++; /* What a hack. */
3829 the_ins
.opcode
[1] |= val
<< 4;
3837 the_ins
.opcode
[0] |= (val
<< 6);
3840 the_ins
.opcode
[1] = (val
>> 16);
3841 the_ins
.opcode
[2] = val
& 0xffff;
3844 the_ins
.opcode
[0] |= ((val
& 0x8) << (6 - 3));
3845 the_ins
.opcode
[0] |= ((val
& 0x7) << 9);
3846 the_ins
.opcode
[1] |= ((val
& 0x10) << (7 - 4));
3848 case 'n': /* MAC/EMAC Rx on !load. */
3849 the_ins
.opcode
[0] |= ((val
& 0x8) << (6 - 3));
3850 the_ins
.opcode
[0] |= ((val
& 0x7) << 9);
3851 the_ins
.opcode
[1] |= ((val
& 0x10) << (7 - 4));
3853 case 'o': /* MAC/EMAC Rx on load. */
3854 the_ins
.opcode
[1] |= val
<< 12;
3855 the_ins
.opcode
[1] |= ((val
& 0x10) << (7 - 4));
3857 case 'M': /* MAC/EMAC Ry on !load. */
3858 the_ins
.opcode
[0] |= (val
& 0xF);
3859 the_ins
.opcode
[1] |= ((val
& 0x10) << (6 - 4));
3861 case 'N': /* MAC/EMAC Ry on load. */
3862 the_ins
.opcode
[1] |= (val
& 0xF);
3863 the_ins
.opcode
[1] |= ((val
& 0x10) << (6 - 4));
3866 the_ins
.opcode
[1] |= ((val
!= 1) << 10);
3869 the_ins
.opcode
[0] |= ((val
& 0x3) << 9);
3872 the_ins
.opcode
[0] |= ((val
& 0x3) << 0);
3874 case 'G': /* EMAC accumulator in a EMAC load instruction. */
3875 the_ins
.opcode
[0] |= ((~val
& 0x1) << 7);
3876 the_ins
.opcode
[1] |= ((val
& 0x2) << (4 - 1));
3878 case 'H': /* EMAC accumulator in a EMAC non-load instruction. */
3879 the_ins
.opcode
[0] |= ((val
& 0x1) << 7);
3880 the_ins
.opcode
[1] |= ((val
& 0x2) << (4 - 1));
3883 the_ins
.opcode
[1] |= ((val
& 0x3) << 9);
3886 the_ins
.opcode
[0] |= (val
& 0x1) <<10;
3890 as_fatal (_("failed sanity check."));
3895 install_gen_operand (int mode
, int val
)
3899 case '/': /* Special for mask loads for mac/msac insns with
3900 possible mask; trailing_ampersend set in bit 8. */
3901 the_ins
.opcode
[0] |= (val
& 0x3f);
3902 the_ins
.opcode
[1] |= (((val
& 0x100) >> 8) << 5);
3905 the_ins
.opcode
[0] |= val
;
3908 /* This is a kludge!!! */
3909 the_ins
.opcode
[0] |= (val
& 0x07) << 9 | (val
& 0x38) << 3;
3918 the_ins
.opcode
[0] |= val
;
3920 /* more stuff goes here. */
3922 as_fatal (_("failed sanity check."));
3926 /* Verify that we have some number of paren pairs, do m68k_ip_op(), and
3927 then deal with the bitfield hack. */
3930 crack_operand (char *str
, struct m68k_op
*opP
)
3932 register int parens
;
3934 register char *beg_str
;
3942 for (parens
= 0; *str
&& (parens
> 0 || inquote
|| notend (str
)); str
++)
3948 else if (*str
== ')')
3952 opP
->error
= _("Extra )");
3958 if (flag_mri
&& *str
== '\'')
3959 inquote
= ! inquote
;
3961 if (!*str
&& parens
)
3963 opP
->error
= _("Missing )");
3968 if (m68k_ip_op (beg_str
, opP
) != 0)
3975 c
= *++str
; /* JF bitfield hack. */
3980 as_bad (_("Missing operand"));
3983 /* Detect MRI REG symbols and convert them to REGLSTs. */
3984 if (opP
->mode
== CONTROL
&& (int)opP
->reg
< 0)
3987 opP
->mask
= ~(int)opP
->reg
;
3994 /* This is the guts of the machine-dependent assembler. STR points to a
3995 machine dependent instruction. This function is supposed to emit
3996 the frags/bytes it assembles to.
4000 insert_reg (const char *regname
, int regnum
)
4005 #ifdef REGISTER_PREFIX
4006 if (!flag_reg_prefix_optional
)
4008 buf
[0] = REGISTER_PREFIX
;
4009 strcpy (buf
+ 1, regname
);
4014 symbol_table_insert (symbol_new (regname
, reg_section
, regnum
,
4015 &zero_address_frag
));
4017 for (i
= 0; regname
[i
]; i
++)
4018 buf
[i
] = TOUPPER (regname
[i
]);
4021 symbol_table_insert (symbol_new (buf
, reg_section
, regnum
,
4022 &zero_address_frag
));
4031 static const struct init_entry init_table
[] =
4091 { "accext01", ACCEXT01
},
4092 { "accext23", ACCEXT23
},
4096 /* Control registers. */
4097 { "sfc", SFC
}, /* Source Function Code. */
4099 { "dfc", DFC
}, /* Destination Function Code. */
4101 { "cacr", CACR
}, /* Cache Control Register. */
4102 { "caar", CAAR
}, /* Cache Address Register. */
4103 { "cpucr", CPUCR
}, /* CPU Control Register. */
4105 { "usp", USP
}, /* User Stack Pointer. */
4106 { "vbr", VBR
}, /* Vector Base Register. */
4107 { "msp", MSP
}, /* Master Stack Pointer. */
4108 { "isp", ISP
}, /* Interrupt Stack Pointer. */
4110 { "itt0", ITT0
}, /* Instruction Transparent Translation Reg 0. */
4111 { "itt1", ITT1
}, /* Instruction Transparent Translation Reg 1. */
4112 { "dtt0", DTT0
}, /* Data Transparent Translation Register 0. */
4113 { "dtt1", DTT1
}, /* Data Transparent Translation Register 1. */
4115 /* 68ec040 versions of same */
4116 { "iacr0", ITT0
}, /* Instruction Access Control Register 0. */
4117 { "iacr1", ITT1
}, /* Instruction Access Control Register 0. */
4118 { "dacr0", DTT0
}, /* Data Access Control Register 0. */
4119 { "dacr1", DTT1
}, /* Data Access Control Register 0. */
4121 /* Coldfire versions of same. The ColdFire programmer's reference
4122 manual indicated that the order is 2,3,0,1, but Ken Rose
4123 <rose@netcom.com> says that 0,1,2,3 is the correct order. */
4124 { "acr0", ACR0
}, /* Access Control Unit 0. */
4125 { "acr1", ACR1
}, /* Access Control Unit 1. */
4126 { "acr2", ACR2
}, /* Access Control Unit 2. */
4127 { "acr3", ACR3
}, /* Access Control Unit 3. */
4129 { "tc", TC
}, /* MMU Translation Control Register. */
4133 { "mmusr", MMUSR
}, /* MMU Status Register. */
4134 { "srp", SRP
}, /* User Root Pointer. */
4135 { "urp", URP
}, /* Supervisor Root Pointer. */
4138 { "mmubar", MMUBAR
},
4141 { "rombar", ROMBAR
}, /* ROM Base Address Register. */
4142 { "rambar0", RAMBAR0
}, /* ROM Base Address Register. */
4143 { "rambar1", RAMBAR1
}, /* ROM Base Address Register. */
4144 { "mbar", MBAR
}, /* Module Base Address Register. */
4146 { "mbar0", MBAR0
}, /* mcfv4e registers. */
4147 { "mbar1", MBAR1
}, /* mcfv4e registers. */
4148 { "rombar0", ROMBAR0
}, /* mcfv4e registers. */
4149 { "rombar1", ROMBAR1
}, /* mcfv4e registers. */
4150 { "mpcr", MPCR
}, /* mcfv4e registers. */
4151 { "edrambar", EDRAMBAR
}, /* mcfv4e registers. */
4152 { "secmbar", SECMBAR
}, /* mcfv4e registers. */
4153 { "asid", TC
}, /* mcfv4e registers. */
4154 { "mmubar", BUSCR
}, /* mcfv4e registers. */
4155 { "pcr1u0", PCR1U0
}, /* mcfv4e registers. */
4156 { "pcr1l0", PCR1L0
}, /* mcfv4e registers. */
4157 { "pcr2u0", PCR2U0
}, /* mcfv4e registers. */
4158 { "pcr2l0", PCR2L0
}, /* mcfv4e registers. */
4159 { "pcr3u0", PCR3U0
}, /* mcfv4e registers. */
4160 { "pcr3l0", PCR3L0
}, /* mcfv4e registers. */
4161 { "pcr1u1", PCR1U1
}, /* mcfv4e registers. */
4162 { "pcr1l1", PCR1L1
}, /* mcfv4e registers. */
4163 { "pcr2u1", PCR2U1
}, /* mcfv4e registers. */
4164 { "pcr2l1", PCR2L1
}, /* mcfv4e registers. */
4165 { "pcr3u1", PCR3U1
}, /* mcfv4e registers. */
4166 { "pcr3l1", PCR3L1
}, /* mcfv4e registers. */
4168 { "flashbar", FLASHBAR
}, /* mcf528x registers. */
4169 { "rambar", RAMBAR
}, /* mcf528x registers. */
4171 { "mbar2", MBAR2
}, /* mcf5249 registers. */
4173 { "cac", CAC
}, /* fido registers. */
4174 { "mbb", MBO
}, /* fido registers (obsolete). */
4175 { "mbo", MBO
}, /* fido registers. */
4176 /* End of control registers. */
4210 /* 68ec030 versions of same. */
4213 /* 68ec030 access control unit, identical to 030 MMU status reg. */
4216 /* Suppressed data and address registers. */
4234 /* Upper and lower data and address registers, used by macw and msacw. */
4275 init_regtable (void)
4278 for (i
= 0; init_table
[i
].name
; i
++)
4279 insert_reg (init_table
[i
].name
, init_table
[i
].number
);
4283 md_assemble (char *str
)
4290 int shorts_this_frag
;
4293 if (!selected_cpu
&& !selected_arch
)
4295 /* We've not selected an architecture yet. Set the default
4296 now. We do this lazily so that an initial .cpu or .arch directive
4298 if (!m68k_set_cpu (TARGET_CPU
, 1, 1))
4299 as_bad (_("unrecognized default cpu `%s'"), TARGET_CPU
);
4304 /* In MRI mode, the instruction and operands are separated by a
4305 space. Anything following the operands is a comment. The label
4306 has already been removed. */
4314 for (s
= str
; *s
!= '\0'; s
++)
4316 if ((*s
== ' ' || *s
== '\t') && ! inquote
)
4334 inquote
= ! inquote
;
4339 memset (&the_ins
, '\0', sizeof (the_ins
));
4344 for (n
= 0; n
< the_ins
.numargs
; n
++)
4345 if (the_ins
.operands
[n
].error
)
4347 er
= the_ins
.operands
[n
].error
;
4353 as_bad (_("%s -- statement `%s' ignored"), er
, str
);
4357 /* If there is a current label, record that it marks an instruction. */
4358 if (current_label
!= NULL
)
4360 current_label
->text
= 1;
4361 current_label
= NULL
;
4365 /* Tie dwarf2 debug info to the address at the start of the insn. */
4366 dwarf2_emit_insn (0);
4369 if (the_ins
.nfrag
== 0)
4371 /* No frag hacking involved; just put it out. */
4372 toP
= frag_more (2 * the_ins
.numo
);
4373 fromP
= &the_ins
.opcode
[0];
4374 for (m
= the_ins
.numo
; m
; --m
)
4376 md_number_to_chars (toP
, (long) (*fromP
), 2);
4380 /* Put out symbol-dependent info. */
4381 for (m
= 0; m
< the_ins
.nrel
; m
++)
4383 switch (the_ins
.reloc
[m
].wid
)
4402 as_fatal (_("Don't know how to figure width of %c in md_assemble()"),
4403 the_ins
.reloc
[m
].wid
);
4406 fixP
= fix_new_exp (frag_now
,
4407 ((toP
- frag_now
->fr_literal
)
4408 - the_ins
.numo
* 2 + the_ins
.reloc
[m
].n
),
4410 &the_ins
.reloc
[m
].exp
,
4411 the_ins
.reloc
[m
].pcrel
,
4412 get_reloc_code (n
, the_ins
.reloc
[m
].pcrel
,
4413 the_ins
.reloc
[m
].pic_reloc
));
4414 fixP
->fx_pcrel_adjust
= the_ins
.reloc
[m
].pcrel_fix
;
4415 if (the_ins
.reloc
[m
].wid
== 'B')
4416 fixP
->fx_signed
= 1;
4421 /* There's some frag hacking. */
4423 /* Calculate the max frag size. */
4426 wid
= 2 * the_ins
.fragb
[0].fragoff
;
4427 for (n
= 1; n
< the_ins
.nfrag
; n
++)
4428 wid
+= 2 * (the_ins
.numo
- the_ins
.fragb
[n
- 1].fragoff
);
4429 /* frag_var part. */
4430 wid
+= FRAG_VAR_SIZE
;
4431 /* Make sure the whole insn fits in one chunk, in particular that
4432 the var part is attached, as we access one byte before the
4433 variable frag for byte branches. */
4437 for (n
= 0, fromP
= &the_ins
.opcode
[0]; n
< the_ins
.nfrag
; n
++)
4442 wid
= 2 * the_ins
.fragb
[n
].fragoff
;
4444 wid
= 2 * (the_ins
.numo
- the_ins
.fragb
[n
- 1].fragoff
);
4445 toP
= frag_more (wid
);
4447 shorts_this_frag
= 0;
4448 for (m
= wid
/ 2; m
; --m
)
4450 md_number_to_chars (toP
, (long) (*fromP
), 2);
4455 for (m
= 0; m
< the_ins
.nrel
; m
++)
4457 if ((the_ins
.reloc
[m
].n
) >= 2 * shorts_this_frag
)
4459 the_ins
.reloc
[m
].n
-= 2 * shorts_this_frag
;
4462 wid
= the_ins
.reloc
[m
].wid
;
4465 the_ins
.reloc
[m
].wid
= 0;
4466 wid
= (wid
== 'b') ? 1 : (wid
== 'w') ? 2 : (wid
== 'l') ? 4 : 4000;
4468 fixP
= fix_new_exp (frag_now
,
4469 ((toP
- frag_now
->fr_literal
)
4470 - the_ins
.numo
* 2 + the_ins
.reloc
[m
].n
),
4472 &the_ins
.reloc
[m
].exp
,
4473 the_ins
.reloc
[m
].pcrel
,
4474 get_reloc_code (wid
, the_ins
.reloc
[m
].pcrel
,
4475 the_ins
.reloc
[m
].pic_reloc
));
4476 fixP
->fx_pcrel_adjust
= the_ins
.reloc
[m
].pcrel_fix
;
4478 (void) frag_var (rs_machine_dependent
, FRAG_VAR_SIZE
, 0,
4479 (relax_substateT
) (the_ins
.fragb
[n
].fragty
),
4480 the_ins
.fragb
[n
].fadd
, the_ins
.fragb
[n
].foff
, to_beg_P
);
4482 n
= (the_ins
.numo
- the_ins
.fragb
[n
- 1].fragoff
);
4483 shorts_this_frag
= 0;
4486 toP
= frag_more (n
* 2);
4489 md_number_to_chars (toP
, (long) (*fromP
), 2);
4495 for (m
= 0; m
< the_ins
.nrel
; m
++)
4499 wid
= the_ins
.reloc
[m
].wid
;
4502 the_ins
.reloc
[m
].wid
= 0;
4503 wid
= (wid
== 'b') ? 1 : (wid
== 'w') ? 2 : (wid
== 'l') ? 4 : 4000;
4505 fixP
= fix_new_exp (frag_now
,
4506 ((the_ins
.reloc
[m
].n
+ toP
- frag_now
->fr_literal
)
4507 - shorts_this_frag
* 2),
4509 &the_ins
.reloc
[m
].exp
,
4510 the_ins
.reloc
[m
].pcrel
,
4511 get_reloc_code (wid
, the_ins
.reloc
[m
].pcrel
,
4512 the_ins
.reloc
[m
].pic_reloc
));
4513 fixP
->fx_pcrel_adjust
= the_ins
.reloc
[m
].pcrel_fix
;
4517 /* Comparison function used by qsort to rank the opcode entries by name. */
4520 m68k_compare_opcode (const void * v1
, const void * v2
)
4522 struct m68k_opcode
* op1
, * op2
;
4528 op1
= *(struct m68k_opcode
**) v1
;
4529 op2
= *(struct m68k_opcode
**) v2
;
4531 /* Compare the two names. If different, return the comparison.
4532 If the same, return the order they are in the opcode table. */
4533 ret
= strcmp (op1
->name
, op2
->name
);
4544 const struct m68k_opcode
*ins
;
4545 struct m68k_incant
*hack
, *slak
;
4546 const char *retval
= 0; /* Empty string, or error msg text. */
4549 /* Set up hash tables with 68000 instructions.
4550 similar to what the vax assembler does. */
4551 /* RMS claims the thing to do is take the m68k-opcode.h table, and make
4552 a copy of it at runtime, adding in the information we want but isn't
4553 there. I think it'd be better to have an awk script hack the table
4554 at compile time. Or even just xstr the table and use it as-is. But
4555 my lord ghod hath spoken, so we do it this way. Excuse the ugly var
4560 flag_reg_prefix_optional
= 1;
4562 if (! m68k_rel32_from_cmdline
)
4566 /* First sort the opcode table into alphabetical order to seperate
4567 the order that the assembler wants to see the opcodes from the
4568 order that the disassembler wants to see them. */
4569 m68k_sorted_opcodes
= xmalloc (m68k_numopcodes
* sizeof (* m68k_sorted_opcodes
));
4570 if (!m68k_sorted_opcodes
)
4571 as_fatal (_("Internal Error: Can't allocate m68k_sorted_opcodes of size %d"),
4572 m68k_numopcodes
* ((int) sizeof (* m68k_sorted_opcodes
)));
4574 for (i
= m68k_numopcodes
; i
--;)
4575 m68k_sorted_opcodes
[i
] = m68k_opcodes
+ i
;
4577 qsort (m68k_sorted_opcodes
, m68k_numopcodes
,
4578 sizeof (m68k_sorted_opcodes
[0]), m68k_compare_opcode
);
4580 op_hash
= hash_new ();
4582 obstack_begin (&robyn
, 4000);
4583 for (i
= 0; i
< m68k_numopcodes
; i
++)
4585 hack
= slak
= obstack_alloc (&robyn
, sizeof (struct m68k_incant
));
4588 ins
= m68k_sorted_opcodes
[i
];
4590 /* We must enter all insns into the table, because .arch and
4591 .cpu directives can change things. */
4592 slak
->m_operands
= ins
->args
;
4593 slak
->m_arch
= ins
->arch
;
4594 slak
->m_opcode
= ins
->opcode
;
4596 /* In most cases we can determine the number of opcode words
4597 by checking the second word of the mask. Unfortunately
4598 some instructions have 2 opcode words, but no fixed bits
4599 in the second word. A leading dot in the operands
4600 string also indicates 2 opcodes. */
4601 if (*slak
->m_operands
== '.')
4604 slak
->m_codenum
= 2;
4606 else if (ins
->match
& 0xffffL
)
4607 slak
->m_codenum
= 2;
4609 slak
->m_codenum
= 1;
4610 slak
->m_opnum
= strlen (slak
->m_operands
) / 2;
4612 if (i
+ 1 != m68k_numopcodes
4613 && !strcmp (ins
->name
, m68k_sorted_opcodes
[i
+ 1]->name
))
4615 slak
->m_next
= obstack_alloc (&robyn
, sizeof (struct m68k_incant
));
4620 slak
= slak
->m_next
;
4624 retval
= hash_insert (op_hash
, ins
->name
, (char *) hack
);
4626 as_fatal (_("Internal Error: Can't hash %s: %s"), ins
->name
, retval
);
4629 for (i
= 0; i
< m68k_numaliases
; i
++)
4631 const char *name
= m68k_opcode_aliases
[i
].primary
;
4632 const char *alias
= m68k_opcode_aliases
[i
].alias
;
4633 void *val
= hash_find (op_hash
, name
);
4636 as_fatal (_("Internal Error: Can't find %s in hash table"), name
);
4637 retval
= hash_insert (op_hash
, alias
, val
);
4639 as_fatal (_("Internal Error: Can't hash %s: %s"), alias
, retval
);
4642 /* In MRI mode, all unsized branches are variable sized. Normally,
4643 they are word sized. */
4646 static struct m68k_opcode_alias mri_aliases
[] =
4667 i
< (int) (sizeof mri_aliases
/ sizeof mri_aliases
[0]);
4670 const char *name
= mri_aliases
[i
].primary
;
4671 const char *alias
= mri_aliases
[i
].alias
;
4672 void *val
= hash_find (op_hash
, name
);
4675 as_fatal (_("Internal Error: Can't find %s in hash table"), name
);
4676 retval
= hash_jam (op_hash
, alias
, val
);
4678 as_fatal (_("Internal Error: Can't hash %s: %s"), alias
, retval
);
4682 for (i
= 0; i
< (int) sizeof (notend_table
); i
++)
4684 notend_table
[i
] = 0;
4685 alt_notend_table
[i
] = 0;
4688 notend_table
[','] = 1;
4689 notend_table
['{'] = 1;
4690 notend_table
['}'] = 1;
4691 alt_notend_table
['a'] = 1;
4692 alt_notend_table
['A'] = 1;
4693 alt_notend_table
['d'] = 1;
4694 alt_notend_table
['D'] = 1;
4695 alt_notend_table
['#'] = 1;
4696 alt_notend_table
['&'] = 1;
4697 alt_notend_table
['f'] = 1;
4698 alt_notend_table
['F'] = 1;
4699 #ifdef REGISTER_PREFIX
4700 alt_notend_table
[REGISTER_PREFIX
] = 1;
4703 /* We need to put '(' in alt_notend_table to handle
4704 cas2 %d0:%d2,%d3:%d4,(%a0):(%a1) */
4705 alt_notend_table
['('] = 1;
4707 /* We need to put '@' in alt_notend_table to handle
4708 cas2 %d0:%d2,%d3:%d4,@(%d0):@(%d1) */
4709 alt_notend_table
['@'] = 1;
4711 /* We need to put digits in alt_notend_table to handle
4712 bfextu %d0{24:1},%d0 */
4713 alt_notend_table
['0'] = 1;
4714 alt_notend_table
['1'] = 1;
4715 alt_notend_table
['2'] = 1;
4716 alt_notend_table
['3'] = 1;
4717 alt_notend_table
['4'] = 1;
4718 alt_notend_table
['5'] = 1;
4719 alt_notend_table
['6'] = 1;
4720 alt_notend_table
['7'] = 1;
4721 alt_notend_table
['8'] = 1;
4722 alt_notend_table
['9'] = 1;
4724 #ifndef MIT_SYNTAX_ONLY
4725 /* Insert pseudo ops, these have to go into the opcode table since
4726 gas expects pseudo ops to start with a dot. */
4730 while (mote_pseudo_table
[n
].poc_name
)
4732 hack
= obstack_alloc (&robyn
, sizeof (struct m68k_incant
));
4733 hash_insert (op_hash
,
4734 mote_pseudo_table
[n
].poc_name
, (char *) hack
);
4735 hack
->m_operands
= 0;
4745 record_alignment (text_section
, 2);
4746 record_alignment (data_section
, 2);
4747 record_alignment (bss_section
, 2);
4752 /* This is called when a label is defined. */
4755 m68k_frob_label (symbolS
*sym
)
4757 struct label_line
*n
;
4759 n
= (struct label_line
*) xmalloc (sizeof *n
);
4762 as_where (&n
->file
, &n
->line
);
4768 dwarf2_emit_label (sym
);
4772 /* This is called when a value that is not an instruction is emitted. */
4775 m68k_flush_pending_output (void)
4777 current_label
= NULL
;
4780 /* This is called at the end of the assembly, when the final value of
4781 the label is known. We warn if this is a text symbol aligned at an
4785 m68k_frob_symbol (symbolS
*sym
)
4787 if (S_GET_SEGMENT (sym
) == reg_section
4788 && (int) S_GET_VALUE (sym
) < 0)
4790 S_SET_SEGMENT (sym
, absolute_section
);
4791 S_SET_VALUE (sym
, ~(int)S_GET_VALUE (sym
));
4793 else if ((S_GET_VALUE (sym
) & 1) != 0)
4795 struct label_line
*l
;
4797 for (l
= labels
; l
!= NULL
; l
= l
->next
)
4799 if (l
->label
== sym
)
4802 as_warn_where (l
->file
, l
->line
,
4803 _("text label `%s' aligned to odd boundary"),
4811 /* This is called if we go in or out of MRI mode because of the .mri
4815 m68k_mri_mode_change (int on
)
4819 if (! flag_reg_prefix_optional
)
4821 flag_reg_prefix_optional
= 1;
4822 #ifdef REGISTER_PREFIX
4827 if (! m68k_rel32_from_cmdline
)
4832 if (! reg_prefix_optional_seen
)
4834 #ifdef REGISTER_PREFIX_OPTIONAL
4835 flag_reg_prefix_optional
= REGISTER_PREFIX_OPTIONAL
;
4837 flag_reg_prefix_optional
= 0;
4839 #ifdef REGISTER_PREFIX
4844 if (! m68k_rel32_from_cmdline
)
4850 md_atof (int type
, char *litP
, int *sizeP
)
4852 return ieee_md_atof (type
, litP
, sizeP
, TRUE
);
4856 md_number_to_chars (char *buf
, valueT val
, int n
)
4858 number_to_chars_bigendian (buf
, val
, n
);
4862 md_apply_fix (fixS
*fixP
, valueT
*valP
, segT seg ATTRIBUTE_UNUSED
)
4864 offsetT val
= *valP
;
4865 addressT upper_limit
;
4866 offsetT lower_limit
;
4868 /* This is unnecessary but it convinces the native rs6000 compiler
4869 to generate the code we want. */
4870 char *buf
= fixP
->fx_frag
->fr_literal
;
4871 buf
+= fixP
->fx_where
;
4872 /* End ibm compiler workaround. */
4876 if (fixP
->fx_addsy
== NULL
&& fixP
->fx_pcrel
== 0)
4882 memset (buf
, 0, fixP
->fx_size
);
4883 fixP
->fx_addnumber
= val
; /* Remember value for emit_reloc. */
4885 if (fixP
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
4886 && !S_IS_DEFINED (fixP
->fx_addsy
)
4887 && !S_IS_WEAK (fixP
->fx_addsy
))
4888 S_SET_WEAK (fixP
->fx_addsy
);
4890 switch (fixP
->fx_r_type
)
4892 case BFD_RELOC_68K_TLS_GD32
:
4893 case BFD_RELOC_68K_TLS_GD16
:
4894 case BFD_RELOC_68K_TLS_GD8
:
4895 case BFD_RELOC_68K_TLS_LDM32
:
4896 case BFD_RELOC_68K_TLS_LDM16
:
4897 case BFD_RELOC_68K_TLS_LDM8
:
4898 case BFD_RELOC_68K_TLS_LDO32
:
4899 case BFD_RELOC_68K_TLS_LDO16
:
4900 case BFD_RELOC_68K_TLS_LDO8
:
4901 case BFD_RELOC_68K_TLS_IE32
:
4902 case BFD_RELOC_68K_TLS_IE16
:
4903 case BFD_RELOC_68K_TLS_IE8
:
4904 case BFD_RELOC_68K_TLS_LE32
:
4905 case BFD_RELOC_68K_TLS_LE16
:
4906 case BFD_RELOC_68K_TLS_LE8
:
4907 S_SET_THREAD_LOCAL (fixP
->fx_addsy
);
4916 #elif defined(OBJ_AOUT)
4917 /* PR gas/3041 Do not fix frags referencing a weak symbol. */
4918 if (fixP
->fx_addsy
&& S_IS_WEAK (fixP
->fx_addsy
))
4920 memset (buf
, 0, fixP
->fx_size
);
4921 fixP
->fx_addnumber
= val
; /* Remember value for emit_reloc. */
4926 if (fixP
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
4927 || fixP
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
)
4930 switch (fixP
->fx_size
)
4932 /* The cast to offsetT below are necessary to make code
4933 correct for machines where ints are smaller than offsetT. */
4937 lower_limit
= - (offsetT
) 0x80;
4940 *buf
++ = (val
>> 8);
4942 upper_limit
= 0x7fff;
4943 lower_limit
= - (offsetT
) 0x8000;
4946 *buf
++ = (val
>> 24);
4947 *buf
++ = (val
>> 16);
4948 *buf
++ = (val
>> 8);
4950 upper_limit
= 0x7fffffff;
4951 lower_limit
= - (offsetT
) 0x7fffffff - 1; /* Avoid constant overflow. */
4954 BAD_CASE (fixP
->fx_size
);
4957 /* Fix up a negative reloc. */
4958 if (fixP
->fx_addsy
== NULL
&& fixP
->fx_subsy
!= NULL
)
4960 fixP
->fx_addsy
= fixP
->fx_subsy
;
4961 fixP
->fx_subsy
= NULL
;
4965 /* For non-pc-relative values, it's conceivable we might get something
4966 like "0xff" for a byte field. So extend the upper part of the range
4967 to accept such numbers. We arbitrarily disallow "-0xff" or "0xff+0xff",
4968 so that we can do any range checking at all. */
4969 if (! fixP
->fx_pcrel
&& ! fixP
->fx_signed
)
4970 upper_limit
= upper_limit
* 2 + 1;
4972 if ((addressT
) val
> upper_limit
4973 && (val
> 0 || val
< lower_limit
))
4974 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
4975 _("value %ld out of range"), (long)val
);
4977 /* A one byte PC-relative reloc means a short branch. We can't use
4978 a short branch with a value of 0 or -1, because those indicate
4979 different opcodes (branches with longer offsets). fixup_segment
4980 in write.c may have clobbered fx_pcrel, so we need to examine the
4983 || fixP
->fx_r_type
== BFD_RELOC_8_PCREL
)
4984 && fixP
->fx_size
== 1
4985 && (fixP
->fx_addsy
== NULL
4986 || S_IS_DEFINED (fixP
->fx_addsy
))
4987 && (val
== 0 || val
== -1))
4988 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
4989 _("invalid byte branch offset"));
4992 /* *fragP has been relaxed to its final size, and now needs to have
4993 the bytes inside it modified to conform to the new size There is UGLY
4997 md_convert_frag_1 (fragS
*fragP
)
5002 /* Address in object code of the displacement. */
5003 register int object_address
= fragP
->fr_fix
+ fragP
->fr_address
;
5005 /* Address in gas core of the place to store the displacement. */
5006 /* This convinces the native rs6000 compiler to generate the code we
5008 register char *buffer_address
= fragP
->fr_literal
;
5009 buffer_address
+= fragP
->fr_fix
;
5010 /* End ibm compiler workaround. */
5012 /* The displacement of the address, from current location. */
5013 disp
= fragP
->fr_symbol
? S_GET_VALUE (fragP
->fr_symbol
) : 0;
5014 disp
= (disp
+ fragP
->fr_offset
) - object_address
;
5016 switch (fragP
->fr_subtype
)
5018 case TAB (BRANCHBWL
, BYTE
):
5019 case TAB (BRABSJUNC
, BYTE
):
5020 case TAB (BRABSJCOND
, BYTE
):
5021 case TAB (BRANCHBW
, BYTE
):
5022 case TAB (BRANCHBWPL
, BYTE
):
5023 know (issbyte (disp
));
5025 as_bad_where (fragP
->fr_file
, fragP
->fr_line
,
5026 _("short branch with zero offset: use :w"));
5027 fixP
= fix_new (fragP
, fragP
->fr_fix
- 1, 1, fragP
->fr_symbol
,
5028 fragP
->fr_offset
, 1, RELAX_RELOC_PC8
);
5029 fixP
->fx_pcrel_adjust
= -1;
5031 case TAB (BRANCHBWL
, SHORT
):
5032 case TAB (BRABSJUNC
, SHORT
):
5033 case TAB (BRABSJCOND
, SHORT
):
5034 case TAB (BRANCHBW
, SHORT
):
5035 case TAB (BRANCHBWPL
, SHORT
):
5036 fragP
->fr_opcode
[1] = 0x00;
5037 fixP
= fix_new (fragP
, fragP
->fr_fix
, 2, fragP
->fr_symbol
,
5038 fragP
->fr_offset
, 1, RELAX_RELOC_PC16
);
5041 case TAB (BRANCHBWL
, LONG
):
5042 fragP
->fr_opcode
[1] = (char) 0xFF;
5043 fixP
= fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
5044 fragP
->fr_offset
, 1, RELAX_RELOC_PC32
);
5047 case TAB (BRANCHBWPL
, LONG
):
5048 /* Here we are converting an unconditional branch into a pair of
5049 conditional branches, in order to get the range. */
5050 fragP
->fr_opcode
[0] = 0x66; /* bne */
5051 fragP
->fr_opcode
[1] = 0xFF;
5052 fixP
= fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
5053 fragP
->fr_offset
, 1, RELAX_RELOC_PC32
);
5054 fixP
->fx_file
= fragP
->fr_file
;
5055 fixP
->fx_line
= fragP
->fr_line
;
5056 fragP
->fr_fix
+= 4; /* Skip first offset */
5057 buffer_address
+= 4;
5058 *buffer_address
++ = 0x67; /* beq */
5059 *buffer_address
++ = 0xff;
5060 fragP
->fr_fix
+= 2; /* Skip second branch opcode */
5061 fixP
= fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
5062 fragP
->fr_offset
, 1, RELAX_RELOC_PC32
);
5065 case TAB (BRABSJUNC
, LONG
):
5066 if (fragP
->fr_opcode
[0] == 0x61) /* jbsr */
5068 if (flag_keep_pcrel
)
5069 as_bad_where (fragP
->fr_file
, fragP
->fr_line
,
5070 _("Conversion of PC relative BSR to absolute JSR"));
5071 fragP
->fr_opcode
[0] = 0x4E;
5072 fragP
->fr_opcode
[1] = (char) 0xB9; /* JSR with ABSL LONG operand. */
5073 fixP
= fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
5074 fragP
->fr_offset
, 0, RELAX_RELOC_ABS32
);
5077 else if (fragP
->fr_opcode
[0] == 0x60) /* jbra */
5079 if (flag_keep_pcrel
)
5080 as_bad_where (fragP
->fr_file
, fragP
->fr_line
,
5081 _("Conversion of PC relative branch to absolute jump"));
5082 fragP
->fr_opcode
[0] = 0x4E;
5083 fragP
->fr_opcode
[1] = (char) 0xF9; /* JMP with ABSL LONG operand. */
5084 fixP
= fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
5085 fragP
->fr_offset
, 0, RELAX_RELOC_ABS32
);
5090 /* This cannot happen, because jbsr and jbra are the only two
5091 unconditional branches. */
5095 case TAB (BRABSJCOND
, LONG
):
5096 if (flag_keep_pcrel
)
5097 as_bad_where (fragP
->fr_file
, fragP
->fr_line
,
5098 _("Conversion of PC relative conditional branch to absolute jump"));
5100 /* Only Bcc 68000 instructions can come here
5101 Change bcc into b!cc/jmp absl long. */
5102 fragP
->fr_opcode
[0] ^= 0x01; /* Invert bcc. */
5103 fragP
->fr_opcode
[1] = 0x06; /* Branch offset = 6. */
5105 /* JF: these used to be fr_opcode[2,3], but they may be in a
5106 different frag, in which case referring to them is a no-no.
5107 Only fr_opcode[0,1] are guaranteed to work. */
5108 *buffer_address
++ = 0x4e; /* put in jmp long (0x4ef9) */
5109 *buffer_address
++ = (char) 0xf9;
5110 fragP
->fr_fix
+= 2; /* Account for jmp instruction. */
5111 fixP
= fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
5112 fragP
->fr_offset
, 0, RELAX_RELOC_ABS32
);
5115 case TAB (FBRANCH
, SHORT
):
5116 know ((fragP
->fr_opcode
[1] & 0x40) == 0);
5117 fixP
= fix_new (fragP
, fragP
->fr_fix
, 2, fragP
->fr_symbol
,
5118 fragP
->fr_offset
, 1, RELAX_RELOC_PC16
);
5121 case TAB (FBRANCH
, LONG
):
5122 fragP
->fr_opcode
[1] |= 0x40; /* Turn on LONG bit. */
5123 fixP
= fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
5124 fragP
->fr_offset
, 1, RELAX_RELOC_PC32
);
5127 case TAB (DBCCLBR
, SHORT
):
5128 case TAB (DBCCABSJ
, SHORT
):
5129 fixP
= fix_new (fragP
, fragP
->fr_fix
, 2, fragP
->fr_symbol
,
5130 fragP
->fr_offset
, 1, RELAX_RELOC_PC16
);
5133 case TAB (DBCCLBR
, LONG
):
5134 /* Only DBcc instructions can come here.
5135 Change dbcc into dbcc/bral.
5136 JF: these used to be fr_opcode[2-7], but that's wrong. */
5137 if (flag_keep_pcrel
)
5138 as_bad_where (fragP
->fr_file
, fragP
->fr_line
,
5139 _("Conversion of DBcc to absolute jump"));
5141 *buffer_address
++ = 0x00; /* Branch offset = 4. */
5142 *buffer_address
++ = 0x04;
5143 *buffer_address
++ = 0x60; /* Put in bra pc+6. */
5144 *buffer_address
++ = 0x06;
5145 *buffer_address
++ = 0x60; /* Put in bral (0x60ff). */
5146 *buffer_address
++ = (char) 0xff;
5148 fragP
->fr_fix
+= 6; /* Account for bra/jmp instructions. */
5149 fixP
= fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
5150 fragP
->fr_offset
, 1, RELAX_RELOC_PC32
);
5153 case TAB (DBCCABSJ
, LONG
):
5154 /* Only DBcc instructions can come here.
5155 Change dbcc into dbcc/jmp.
5156 JF: these used to be fr_opcode[2-7], but that's wrong. */
5157 if (flag_keep_pcrel
)
5158 as_bad_where (fragP
->fr_file
, fragP
->fr_line
,
5159 _("Conversion of PC relative conditional branch to absolute jump"));
5161 *buffer_address
++ = 0x00; /* Branch offset = 4. */
5162 *buffer_address
++ = 0x04;
5163 *buffer_address
++ = 0x60; /* Put in bra pc + 6. */
5164 *buffer_address
++ = 0x06;
5165 *buffer_address
++ = 0x4e; /* Put in jmp long (0x4ef9). */
5166 *buffer_address
++ = (char) 0xf9;
5168 fragP
->fr_fix
+= 6; /* Account for bra/jmp instructions. */
5169 fixP
= fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
5170 fragP
->fr_offset
, 0, RELAX_RELOC_ABS32
);
5173 case TAB (PCREL1632
, SHORT
):
5174 fragP
->fr_opcode
[1] &= ~0x3F;
5175 fragP
->fr_opcode
[1] |= 0x3A; /* 072 - mode 7.2 */
5176 fixP
= fix_new (fragP
, (int) (fragP
->fr_fix
), 2, fragP
->fr_symbol
,
5177 fragP
->fr_offset
, 1, RELAX_RELOC_PC16
);
5180 case TAB (PCREL1632
, LONG
):
5181 /* Already set to mode 7.3; this indicates: PC indirect with
5182 suppressed index, 32-bit displacement. */
5183 *buffer_address
++ = 0x01;
5184 *buffer_address
++ = 0x70;
5186 fixP
= fix_new (fragP
, (int) (fragP
->fr_fix
), 4, fragP
->fr_symbol
,
5187 fragP
->fr_offset
, 1, RELAX_RELOC_PC32
);
5188 fixP
->fx_pcrel_adjust
= 2;
5191 case TAB (PCINDEX
, BYTE
):
5192 gas_assert (fragP
->fr_fix
>= 2);
5193 buffer_address
[-2] &= ~1;
5194 fixP
= fix_new (fragP
, fragP
->fr_fix
- 1, 1, fragP
->fr_symbol
,
5195 fragP
->fr_offset
, 1, RELAX_RELOC_PC8
);
5196 fixP
->fx_pcrel_adjust
= 1;
5198 case TAB (PCINDEX
, SHORT
):
5199 gas_assert (fragP
->fr_fix
>= 2);
5200 buffer_address
[-2] |= 0x1;
5201 buffer_address
[-1] = 0x20;
5202 fixP
= fix_new (fragP
, (int) (fragP
->fr_fix
), 2, fragP
->fr_symbol
,
5203 fragP
->fr_offset
, 1, RELAX_RELOC_PC16
);
5204 fixP
->fx_pcrel_adjust
= 2;
5207 case TAB (PCINDEX
, LONG
):
5208 gas_assert (fragP
->fr_fix
>= 2);
5209 buffer_address
[-2] |= 0x1;
5210 buffer_address
[-1] = 0x30;
5211 fixP
= fix_new (fragP
, (int) (fragP
->fr_fix
), 4, fragP
->fr_symbol
,
5212 fragP
->fr_offset
, 1, RELAX_RELOC_PC32
);
5213 fixP
->fx_pcrel_adjust
= 2;
5216 case TAB (ABSTOPCREL
, SHORT
):
5217 fixP
= fix_new (fragP
, fragP
->fr_fix
, 2, fragP
->fr_symbol
,
5218 fragP
->fr_offset
, 1, RELAX_RELOC_PC16
);
5221 case TAB (ABSTOPCREL
, LONG
):
5222 if (flag_keep_pcrel
)
5223 as_bad_where (fragP
->fr_file
, fragP
->fr_line
,
5224 _("Conversion of PC relative displacement to absolute"));
5225 /* The thing to do here is force it to ABSOLUTE LONG, since
5226 ABSTOPCREL is really trying to shorten an ABSOLUTE address anyway. */
5227 if ((fragP
->fr_opcode
[1] & 0x3F) != 0x3A)
5229 fragP
->fr_opcode
[1] &= ~0x3F;
5230 fragP
->fr_opcode
[1] |= 0x39; /* Mode 7.1 */
5231 fixP
= fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
5232 fragP
->fr_offset
, 0, RELAX_RELOC_ABS32
);
5238 fixP
->fx_file
= fragP
->fr_file
;
5239 fixP
->fx_line
= fragP
->fr_line
;
5244 md_convert_frag (bfd
*abfd ATTRIBUTE_UNUSED
,
5245 segT sec ATTRIBUTE_UNUSED
,
5248 md_convert_frag_1 (fragP
);
5251 /* Force truly undefined symbols to their maximum size, and generally set up
5252 the frag list to be relaxed
5255 md_estimate_size_before_relax (fragS
*fragP
, segT segment
)
5257 /* Handle SZ_UNDEF first, it can be changed to BYTE or SHORT. */
5258 switch (fragP
->fr_subtype
)
5260 case TAB (BRANCHBWL
, SZ_UNDEF
):
5261 case TAB (BRANCHBWPL
, SZ_UNDEF
):
5262 case TAB (BRABSJUNC
, SZ_UNDEF
):
5263 case TAB (BRABSJCOND
, SZ_UNDEF
):
5265 if (S_GET_SEGMENT (fragP
->fr_symbol
) == segment
5266 && relaxable_symbol (fragP
->fr_symbol
))
5268 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), BYTE
);
5270 else if (flag_short_refs
)
5272 /* Symbol is undefined and we want short ref. */
5273 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), SHORT
);
5277 /* Symbol is still undefined. Make it LONG. */
5278 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), LONG
);
5283 case TAB (BRANCHBW
, SZ_UNDEF
):
5285 if (S_GET_SEGMENT (fragP
->fr_symbol
) == segment
5286 && relaxable_symbol (fragP
->fr_symbol
))
5288 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), BYTE
);
5292 /* Symbol is undefined and we don't have long branches. */
5293 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), SHORT
);
5298 case TAB (FBRANCH
, SZ_UNDEF
):
5299 case TAB (DBCCLBR
, SZ_UNDEF
):
5300 case TAB (DBCCABSJ
, SZ_UNDEF
):
5301 case TAB (PCREL1632
, SZ_UNDEF
):
5303 if ((S_GET_SEGMENT (fragP
->fr_symbol
) == segment
5304 && relaxable_symbol (fragP
->fr_symbol
))
5307 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), SHORT
);
5311 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), LONG
);
5316 case TAB (PCINDEX
, SZ_UNDEF
):
5317 if ((S_GET_SEGMENT (fragP
->fr_symbol
) == segment
5318 && relaxable_symbol (fragP
->fr_symbol
)))
5320 fragP
->fr_subtype
= TAB (PCINDEX
, BYTE
);
5324 fragP
->fr_subtype
= TAB (PCINDEX
, LONG
);
5328 case TAB (ABSTOPCREL
, SZ_UNDEF
):
5330 if ((S_GET_SEGMENT (fragP
->fr_symbol
) == segment
5331 && relaxable_symbol (fragP
->fr_symbol
)))
5333 fragP
->fr_subtype
= TAB (ABSTOPCREL
, SHORT
);
5337 fragP
->fr_subtype
= TAB (ABSTOPCREL
, LONG
);
5346 /* Now that SZ_UNDEF are taken care of, check others. */
5347 switch (fragP
->fr_subtype
)
5349 case TAB (BRANCHBWL
, BYTE
):
5350 case TAB (BRABSJUNC
, BYTE
):
5351 case TAB (BRABSJCOND
, BYTE
):
5352 case TAB (BRANCHBW
, BYTE
):
5353 /* We can't do a short jump to the next instruction, so in that
5354 case we force word mode. If the symbol is at the start of a
5355 frag, and it is the next frag with any data in it (usually
5356 this is just the next frag, but assembler listings may
5357 introduce empty frags), we must use word mode. */
5358 if (fragP
->fr_symbol
)
5362 sym_frag
= symbol_get_frag (fragP
->fr_symbol
);
5363 if (S_GET_VALUE (fragP
->fr_symbol
) == sym_frag
->fr_address
)
5367 for (l
= fragP
->fr_next
; l
&& l
!= sym_frag
; l
= l
->fr_next
)
5371 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), SHORT
);
5378 return md_relax_table
[fragP
->fr_subtype
].rlx_length
;
5381 #if defined(OBJ_AOUT) | defined(OBJ_BOUT)
5382 /* the bit-field entries in the relocation_info struct plays hell
5383 with the byte-order problems of cross-assembly. So as a hack,
5384 I added this mach. dependent ri twiddler. Ugly, but it gets
5386 /* on m68k: first 4 bytes are normal unsigned long, next three bytes
5387 are symbolnum, most sig. byte first. Last byte is broken up with
5388 bit 7 as pcrel, bits 6 & 5 as length, bit 4 as pcrel, and the lower
5389 nibble as nuthin. (on Sun 3 at least) */
5390 /* Translate the internal relocation information into target-specific
5394 md_ri_to_chars (char *the_bytes
, struct reloc_info_generic
*ri
)
5397 md_number_to_chars (the_bytes
, ri
->r_address
, 4);
5398 /* Now the fun stuff. */
5399 the_bytes
[4] = (ri
->r_symbolnum
>> 16) & 0x0ff;
5400 the_bytes
[5] = (ri
->r_symbolnum
>> 8) & 0x0ff;
5401 the_bytes
[6] = ri
->r_symbolnum
& 0x0ff;
5402 the_bytes
[7] = (((ri
->r_pcrel
<< 7) & 0x80)
5403 | ((ri
->r_length
<< 5) & 0x60)
5404 | ((ri
->r_extern
<< 4) & 0x10));
5409 #endif /* OBJ_AOUT or OBJ_BOUT */
5411 #ifndef WORKING_DOT_WORD
5412 int md_short_jump_size
= 4;
5413 int md_long_jump_size
= 6;
5416 md_create_short_jump (char *ptr
, addressT from_addr
, addressT to_addr
,
5417 fragS
*frag ATTRIBUTE_UNUSED
,
5418 symbolS
*to_symbol ATTRIBUTE_UNUSED
)
5422 offset
= to_addr
- (from_addr
+ 2);
5424 md_number_to_chars (ptr
, (valueT
) 0x6000, 2);
5425 md_number_to_chars (ptr
+ 2, (valueT
) offset
, 2);
5429 md_create_long_jump (char *ptr
, addressT from_addr
, addressT to_addr
,
5430 fragS
*frag
, symbolS
*to_symbol
)
5434 if (!HAVE_LONG_BRANCH (current_architecture
))
5436 if (flag_keep_pcrel
)
5437 as_fatal (_("Tried to convert PC relative branch to absolute jump"));
5438 offset
= to_addr
- S_GET_VALUE (to_symbol
);
5439 md_number_to_chars (ptr
, (valueT
) 0x4EF9, 2);
5440 md_number_to_chars (ptr
+ 2, (valueT
) offset
, 4);
5441 fix_new (frag
, (ptr
+ 2) - frag
->fr_literal
, 4, to_symbol
, (offsetT
) 0,
5446 offset
= to_addr
- (from_addr
+ 2);
5447 md_number_to_chars (ptr
, (valueT
) 0x60ff, 2);
5448 md_number_to_chars (ptr
+ 2, (valueT
) offset
, 4);
5454 /* Different values of OK tell what its OK to return. Things that
5455 aren't OK are an error (what a shock, no?)
5458 10: Absolute 1:8 only
5459 20: Absolute 0:7 only
5460 30: absolute 0:15 only
5461 40: Absolute 0:31 only
5462 50: absolute 0:127 only
5463 55: absolute -64:63 only
5464 60: absolute -128:127 only
5465 65: absolute 0:511 only
5466 70: absolute 0:4095 only
5467 80: absolute -1, 1:7 only
5471 get_num (struct m68k_exp
*exp
, int ok
)
5473 if (exp
->exp
.X_op
== O_absent
)
5475 /* Do the same thing the VAX asm does. */
5476 op (exp
) = O_constant
;
5482 as_warn (_("expression out of range: defaulting to 1"));
5486 else if (exp
->exp
.X_op
== O_constant
)
5491 if ((valueT
) TRUNC (offs (exp
)) - 1 > 7)
5493 as_warn (_("expression out of range: defaulting to 1"));
5498 if ((valueT
) TRUNC (offs (exp
)) > 7)
5502 if ((valueT
) TRUNC (offs (exp
)) > 15)
5506 if ((valueT
) TRUNC (offs (exp
)) > 32)
5510 if ((valueT
) TRUNC (offs (exp
)) > 127)
5514 if ((valueT
) SEXT (offs (exp
)) + 64 > 127)
5518 if ((valueT
) SEXT (offs (exp
)) + 128 > 255)
5522 if ((valueT
) TRUNC (offs (exp
)) > 511)
5526 if ((valueT
) TRUNC (offs (exp
)) > 4095)
5529 as_warn (_("expression out of range: defaulting to 0"));
5534 if ((valueT
) TRUNC (offs (exp
)) != 0xffffffff
5535 && (valueT
) TRUNC (offs (exp
)) - 1 > 6)
5537 as_warn (_("expression out of range: defaulting to 1"));
5545 else if (exp
->exp
.X_op
== O_big
)
5547 if (offs (exp
) <= 0 /* flonum. */
5548 && (ok
== 90 /* no bignums */
5549 || (ok
> 10 /* Small-int ranges including 0 ok. */
5550 /* If we have a flonum zero, a zero integer should
5551 do as well (e.g., in moveq). */
5552 && generic_floating_point_number
.exponent
== 0
5553 && generic_floating_point_number
.low
[0] == 0)))
5555 /* HACK! Turn it into a long. */
5556 LITTLENUM_TYPE words
[6];
5558 gen_to_words (words
, 2, 8L); /* These numbers are magic! */
5559 op (exp
) = O_constant
;
5562 offs (exp
) = words
[1] | (words
[0] << 16);
5566 op (exp
) = O_constant
;
5569 offs (exp
) = (ok
== 10) ? 1 : 0;
5570 as_warn (_("Can't deal with expression; defaulting to %ld"),
5576 if (ok
>= 10 && ok
<= 80)
5578 op (exp
) = O_constant
;
5581 offs (exp
) = (ok
== 10) ? 1 : 0;
5582 as_warn (_("Can't deal with expression; defaulting to %ld"),
5587 if (exp
->size
!= SIZE_UNSPEC
)
5595 if (!isbyte (offs (exp
)))
5596 as_warn (_("expression doesn't fit in BYTE"));
5599 if (!isword (offs (exp
)))
5600 as_warn (_("expression doesn't fit in WORD"));
5608 /* These are the back-ends for the various machine dependent pseudo-ops. */
5611 s_data1 (int ignore ATTRIBUTE_UNUSED
)
5613 subseg_set (data_section
, 1);
5614 demand_empty_rest_of_line ();
5618 s_data2 (int ignore ATTRIBUTE_UNUSED
)
5620 subseg_set (data_section
, 2);
5621 demand_empty_rest_of_line ();
5625 s_bss (int ignore ATTRIBUTE_UNUSED
)
5627 /* We don't support putting frags in the BSS segment, we fake it
5628 by marking in_bss, then looking at s_skip for clues. */
5630 subseg_set (bss_section
, 0);
5631 demand_empty_rest_of_line ();
5635 s_even (int ignore ATTRIBUTE_UNUSED
)
5638 register long temp_fill
;
5640 temp
= 1; /* JF should be 2? */
5641 temp_fill
= get_absolute_expression ();
5642 if (!need_pass_2
) /* Never make frag if expect extra pass. */
5643 frag_align (temp
, (int) temp_fill
, 0);
5644 demand_empty_rest_of_line ();
5645 record_alignment (now_seg
, temp
);
5649 s_proc (int ignore ATTRIBUTE_UNUSED
)
5651 demand_empty_rest_of_line ();
5654 /* Pseudo-ops handled for MRI compatibility. */
5656 /* This function returns non-zero if the argument is a conditional
5657 pseudo-op. This is called when checking whether a pending
5658 alignment is needed. */
5661 m68k_conditional_pseudoop (pseudo_typeS
*pop
)
5663 return (pop
->poc_handler
== s_mri_if
5664 || pop
->poc_handler
== s_mri_else
);
5667 /* Handle an MRI style chip specification. */
5676 s
= input_line_pointer
;
5677 /* We can't use get_symbol_end since the processor names are not proper
5679 while (is_part_of_name (c
= *input_line_pointer
++))
5681 *--input_line_pointer
= 0;
5682 for (i
= 0; m68k_cpus
[i
].name
; i
++)
5683 if (strcasecmp (s
, m68k_cpus
[i
].name
) == 0)
5685 if (!m68k_cpus
[i
].name
)
5687 as_bad (_("%s: unrecognized processor name"), s
);
5688 *input_line_pointer
= c
;
5689 ignore_rest_of_line ();
5692 *input_line_pointer
= c
;
5694 if (*input_line_pointer
== '/')
5695 current_architecture
= 0;
5697 current_architecture
&= m68881
| m68851
;
5698 current_architecture
|= m68k_cpus
[i
].arch
& ~(m68881
| m68851
);
5699 control_regs
= m68k_cpus
[i
].control_regs
;
5701 while (*input_line_pointer
== '/')
5703 ++input_line_pointer
;
5704 s
= input_line_pointer
;
5705 /* We can't use get_symbol_end since the processor names are not
5707 while (is_part_of_name (c
= *input_line_pointer
++))
5709 *--input_line_pointer
= 0;
5710 if (strcmp (s
, "68881") == 0)
5711 current_architecture
|= m68881
;
5712 else if (strcmp (s
, "68851") == 0)
5713 current_architecture
|= m68851
;
5714 *input_line_pointer
= c
;
5718 /* The MRI CHIP pseudo-op. */
5721 s_chip (int ignore ATTRIBUTE_UNUSED
)
5727 stop
= mri_comment_field (&stopc
);
5730 mri_comment_end (stop
, stopc
);
5731 demand_empty_rest_of_line ();
5734 /* The MRI FOPT pseudo-op. */
5737 s_fopt (int ignore ATTRIBUTE_UNUSED
)
5741 if (strncasecmp (input_line_pointer
, "ID=", 3) == 0)
5745 input_line_pointer
+= 3;
5746 temp
= get_absolute_expression ();
5747 if (temp
< 0 || temp
> 7)
5748 as_bad (_("bad coprocessor id"));
5750 m68k_float_copnum
= COP0
+ temp
;
5754 as_bad (_("unrecognized fopt option"));
5755 ignore_rest_of_line ();
5759 demand_empty_rest_of_line ();
5762 /* The structure used to handle the MRI OPT pseudo-op. */
5766 /* The name of the option. */
5769 /* If this is not NULL, just call this function. The first argument
5770 is the ARG field of this structure, the second argument is
5771 whether the option was negated. */
5772 void (*pfn
) (int arg
, int on
);
5774 /* If this is not NULL, and the PFN field is NULL, set the variable
5775 this points to. Set it to the ARG field if the option was not
5776 negated, and the NOTARG field otherwise. */
5779 /* The value to pass to PFN or to assign to *PVAR. */
5782 /* The value to assign to *PVAR if the option is negated. If PFN is
5783 NULL, and PVAR is not NULL, and ARG and NOTARG are the same, then
5784 the option may not be negated. */
5788 /* The table used to handle the MRI OPT pseudo-op. */
5790 static void skip_to_comma (int, int);
5791 static void opt_nest (int, int);
5792 static void opt_chip (int, int);
5793 static void opt_list (int, int);
5794 static void opt_list_symbols (int, int);
5796 static const struct opt_action opt_table
[] =
5798 { "abspcadd", 0, &m68k_abspcadd
, 1, 0 },
5800 /* We do relaxing, so there is little use for these options. */
5801 { "b", 0, 0, 0, 0 },
5802 { "brs", 0, 0, 0, 0 },
5803 { "brb", 0, 0, 0, 0 },
5804 { "brl", 0, 0, 0, 0 },
5805 { "brw", 0, 0, 0, 0 },
5807 { "c", 0, 0, 0, 0 },
5808 { "cex", 0, 0, 0, 0 },
5809 { "case", 0, &symbols_case_sensitive
, 1, 0 },
5810 { "cl", 0, 0, 0, 0 },
5811 { "cre", 0, 0, 0, 0 },
5812 { "d", 0, &flag_keep_locals
, 1, 0 },
5813 { "e", 0, 0, 0, 0 },
5814 { "f", 0, &flag_short_refs
, 1, 0 },
5815 { "frs", 0, &flag_short_refs
, 1, 0 },
5816 { "frl", 0, &flag_short_refs
, 0, 1 },
5817 { "g", 0, 0, 0, 0 },
5818 { "i", 0, 0, 0, 0 },
5819 { "m", 0, 0, 0, 0 },
5820 { "mex", 0, 0, 0, 0 },
5821 { "mc", 0, 0, 0, 0 },
5822 { "md", 0, 0, 0, 0 },
5823 { "nest", opt_nest
, 0, 0, 0 },
5824 { "next", skip_to_comma
, 0, 0, 0 },
5825 { "o", 0, 0, 0, 0 },
5826 { "old", 0, 0, 0, 0 },
5827 { "op", skip_to_comma
, 0, 0, 0 },
5828 { "pco", 0, 0, 0, 0 },
5829 { "p", opt_chip
, 0, 0, 0 },
5830 { "pcr", 0, 0, 0, 0 },
5831 { "pcs", 0, 0, 0, 0 },
5832 { "r", 0, 0, 0, 0 },
5833 { "quick", 0, &m68k_quick
, 1, 0 },
5834 { "rel32", 0, &m68k_rel32
, 1, 0 },
5835 { "s", opt_list
, 0, 0, 0 },
5836 { "t", opt_list_symbols
, 0, 0, 0 },
5837 { "w", 0, &flag_no_warnings
, 0, 1 },
5841 #define OPTCOUNT ((int) (sizeof opt_table / sizeof opt_table[0]))
5843 /* The MRI OPT pseudo-op. */
5846 s_opt (int ignore ATTRIBUTE_UNUSED
)
5854 const struct opt_action
*o
;
5859 if (*input_line_pointer
== '-')
5861 ++input_line_pointer
;
5864 else if (strncasecmp (input_line_pointer
, "NO", 2) == 0)
5866 input_line_pointer
+= 2;
5870 s
= input_line_pointer
;
5871 c
= get_symbol_end ();
5873 for (i
= 0, o
= opt_table
; i
< OPTCOUNT
; i
++, o
++)
5875 if (strcasecmp (s
, o
->name
) == 0)
5879 /* Restore input_line_pointer now in case the option
5881 *input_line_pointer
= c
;
5882 (*o
->pfn
) (o
->arg
, t
);
5884 else if (o
->pvar
!= NULL
)
5886 if (! t
&& o
->arg
== o
->notarg
)
5887 as_bad (_("option `%s' may not be negated"), s
);
5888 *input_line_pointer
= c
;
5889 *o
->pvar
= t
? o
->arg
: o
->notarg
;
5892 *input_line_pointer
= c
;
5898 as_bad (_("option `%s' not recognized"), s
);
5899 *input_line_pointer
= c
;
5902 while (*input_line_pointer
++ == ',');
5904 /* Move back to terminating character. */
5905 --input_line_pointer
;
5906 demand_empty_rest_of_line ();
5909 /* Skip ahead to a comma. This is used for OPT options which we do
5910 not support and which take arguments. */
5913 skip_to_comma (int arg ATTRIBUTE_UNUSED
, int on ATTRIBUTE_UNUSED
)
5915 while (*input_line_pointer
!= ','
5916 && ! is_end_of_line
[(unsigned char) *input_line_pointer
])
5917 ++input_line_pointer
;
5920 /* Handle the OPT NEST=depth option. */
5923 opt_nest (int arg ATTRIBUTE_UNUSED
, int on ATTRIBUTE_UNUSED
)
5925 if (*input_line_pointer
!= '=')
5927 as_bad (_("bad format of OPT NEST=depth"));
5931 ++input_line_pointer
;
5932 max_macro_nest
= get_absolute_expression ();
5935 /* Handle the OPT P=chip option. */
5938 opt_chip (int arg ATTRIBUTE_UNUSED
, int on ATTRIBUTE_UNUSED
)
5940 if (*input_line_pointer
!= '=')
5942 /* This is just OPT P, which we do not support. */
5946 ++input_line_pointer
;
5950 /* Handle the OPT S option. */
5953 opt_list (int arg ATTRIBUTE_UNUSED
, int on
)
5958 /* Handle the OPT T option. */
5961 opt_list_symbols (int arg ATTRIBUTE_UNUSED
, int on
)
5964 listing
|= LISTING_SYMBOLS
;
5966 listing
&= ~LISTING_SYMBOLS
;
5969 /* Handle the MRI REG pseudo-op. */
5972 s_reg (int ignore ATTRIBUTE_UNUSED
)
5981 if (line_label
== NULL
)
5983 as_bad (_("missing label"));
5984 ignore_rest_of_line ();
5989 stop
= mri_comment_field (&stopc
);
5993 s
= input_line_pointer
;
5994 while (ISALNUM (*input_line_pointer
)
5995 #ifdef REGISTER_PREFIX
5996 || *input_line_pointer
== REGISTER_PREFIX
5998 || *input_line_pointer
== '/'
5999 || *input_line_pointer
== '-')
6000 ++input_line_pointer
;
6001 c
= *input_line_pointer
;
6002 *input_line_pointer
= '\0';
6004 if (m68k_ip_op (s
, &rop
) != 0)
6006 if (rop
.error
== NULL
)
6007 as_bad (_("bad register list"));
6009 as_bad (_("bad register list: %s"), rop
.error
);
6010 *input_line_pointer
= c
;
6011 ignore_rest_of_line ();
6015 *input_line_pointer
= c
;
6017 if (rop
.mode
== REGLST
)
6019 else if (rop
.mode
== DREG
)
6020 mask
= 1 << (rop
.reg
- DATA0
);
6021 else if (rop
.mode
== AREG
)
6022 mask
= 1 << (rop
.reg
- ADDR0
+ 8);
6023 else if (rop
.mode
== FPREG
)
6024 mask
= 1 << (rop
.reg
- FP0
+ 16);
6025 else if (rop
.mode
== CONTROL
6028 else if (rop
.mode
== CONTROL
6031 else if (rop
.mode
== CONTROL
6036 as_bad (_("bad register list"));
6037 ignore_rest_of_line ();
6041 S_SET_SEGMENT (line_label
, reg_section
);
6042 S_SET_VALUE (line_label
, ~mask
);
6043 symbol_set_frag (line_label
, &zero_address_frag
);
6046 mri_comment_end (stop
, stopc
);
6048 demand_empty_rest_of_line ();
6051 /* This structure is used for the MRI SAVE and RESTORE pseudo-ops. */
6055 struct save_opts
*next
;
6057 int symbols_case_sensitive
;
6061 const enum m68k_register
*control_regs
;
6066 /* FIXME: We don't save OPT S. */
6069 /* This variable holds the stack of saved options. */
6071 static struct save_opts
*save_stack
;
6073 /* The MRI SAVE pseudo-op. */
6076 s_save (int ignore ATTRIBUTE_UNUSED
)
6078 struct save_opts
*s
;
6080 s
= (struct save_opts
*) xmalloc (sizeof (struct save_opts
));
6081 s
->abspcadd
= m68k_abspcadd
;
6082 s
->symbols_case_sensitive
= symbols_case_sensitive
;
6083 s
->keep_locals
= flag_keep_locals
;
6084 s
->short_refs
= flag_short_refs
;
6085 s
->architecture
= current_architecture
;
6086 s
->control_regs
= control_regs
;
6087 s
->quick
= m68k_quick
;
6088 s
->rel32
= m68k_rel32
;
6089 s
->listing
= listing
;
6090 s
->no_warnings
= flag_no_warnings
;
6092 s
->next
= save_stack
;
6095 demand_empty_rest_of_line ();
6098 /* The MRI RESTORE pseudo-op. */
6101 s_restore (int ignore ATTRIBUTE_UNUSED
)
6103 struct save_opts
*s
;
6105 if (save_stack
== NULL
)
6107 as_bad (_("restore without save"));
6108 ignore_rest_of_line ();
6113 save_stack
= s
->next
;
6115 m68k_abspcadd
= s
->abspcadd
;
6116 symbols_case_sensitive
= s
->symbols_case_sensitive
;
6117 flag_keep_locals
= s
->keep_locals
;
6118 flag_short_refs
= s
->short_refs
;
6119 current_architecture
= s
->architecture
;
6120 control_regs
= s
->control_regs
;
6121 m68k_quick
= s
->quick
;
6122 m68k_rel32
= s
->rel32
;
6123 listing
= s
->listing
;
6124 flag_no_warnings
= s
->no_warnings
;
6128 demand_empty_rest_of_line ();
6131 /* Types of MRI structured control directives. */
6133 enum mri_control_type
6141 /* This structure is used to stack the MRI structured control
6144 struct mri_control_info
6146 /* The directive within which this one is enclosed. */
6147 struct mri_control_info
*outer
;
6149 /* The type of directive. */
6150 enum mri_control_type type
;
6152 /* Whether an ELSE has been in an IF. */
6155 /* The add or sub statement at the end of a FOR. */
6158 /* The label of the top of a FOR or REPEAT loop. */
6161 /* The label to jump to for the next iteration, or the else
6162 expression of a conditional. */
6165 /* The label to jump to to break out of the loop, or the label past
6166 the end of a conditional. */
6170 /* The stack of MRI structured control directives. */
6172 static struct mri_control_info
*mri_control_stack
;
6174 /* The current MRI structured control directive index number, used to
6175 generate label names. */
6177 static int mri_control_index
;
6179 /* Assemble an instruction for an MRI structured control directive. */
6182 mri_assemble (char *str
)
6186 /* md_assemble expects the opcode to be in lower case. */
6187 for (s
= str
; *s
!= ' ' && *s
!= '\0'; s
++)
6193 /* Generate a new MRI label structured control directive label name. */
6196 mri_control_label (void)
6200 n
= (char *) xmalloc (20);
6201 sprintf (n
, "%smc%d", FAKE_LABEL_NAME
, mri_control_index
);
6202 ++mri_control_index
;
6206 /* Create a new MRI structured control directive. */
6208 static struct mri_control_info
*
6209 push_mri_control (enum mri_control_type type
)
6211 struct mri_control_info
*n
;
6213 n
= (struct mri_control_info
*) xmalloc (sizeof (struct mri_control_info
));
6217 if (type
== mri_if
|| type
== mri_while
)
6220 n
->top
= mri_control_label ();
6221 n
->next
= mri_control_label ();
6222 n
->bottom
= mri_control_label ();
6224 n
->outer
= mri_control_stack
;
6225 mri_control_stack
= n
;
6230 /* Pop off the stack of MRI structured control directives. */
6233 pop_mri_control (void)
6235 struct mri_control_info
*n
;
6237 n
= mri_control_stack
;
6238 mri_control_stack
= n
->outer
;
6246 /* Recognize a condition code in an MRI structured control expression. */
6249 parse_mri_condition (int *pcc
)
6253 know (*input_line_pointer
== '<');
6255 ++input_line_pointer
;
6256 c1
= *input_line_pointer
++;
6257 c2
= *input_line_pointer
++;
6259 if (*input_line_pointer
!= '>')
6261 as_bad (_("syntax error in structured control directive"));
6265 ++input_line_pointer
;
6271 *pcc
= (c1
<< 8) | c2
;
6276 /* Parse a single operand in an MRI structured control expression. */
6279 parse_mri_control_operand (int *pcc
, char **leftstart
, char **leftstop
,
6280 char **rightstart
, char **rightstop
)
6292 if (*input_line_pointer
== '<')
6294 /* It's just a condition code. */
6295 return parse_mri_condition (pcc
);
6298 /* Look ahead for the condition code. */
6299 for (s
= input_line_pointer
; *s
!= '\0'; ++s
)
6301 if (*s
== '<' && s
[1] != '\0' && s
[2] != '\0' && s
[3] == '>')
6306 as_bad (_("missing condition code in structured control directive"));
6310 *leftstart
= input_line_pointer
;
6312 if (*leftstop
> *leftstart
6313 && ((*leftstop
)[-1] == ' ' || (*leftstop
)[-1] == '\t'))
6316 input_line_pointer
= s
;
6317 if (! parse_mri_condition (pcc
))
6320 /* Look ahead for AND or OR or end of line. */
6321 for (s
= input_line_pointer
; *s
!= '\0'; ++s
)
6323 /* We must make sure we don't misinterpret AND/OR at the end of labels!
6324 if d0 <eq> #FOOAND and d1 <ne> #BAROR then
6326 if ((s
== input_line_pointer
6329 && ((strncasecmp (s
, "AND", 3) == 0
6330 && (s
[3] == '.' || ! is_part_of_name (s
[3])))
6331 || (strncasecmp (s
, "OR", 2) == 0
6332 && (s
[2] == '.' || ! is_part_of_name (s
[2])))))
6336 *rightstart
= input_line_pointer
;
6338 if (*rightstop
> *rightstart
6339 && ((*rightstop
)[-1] == ' ' || (*rightstop
)[-1] == '\t'))
6342 input_line_pointer
= s
;
6347 #define MCC(b1, b2) (((b1) << 8) | (b2))
6349 /* Swap the sense of a condition. This changes the condition so that
6350 it generates the same result when the operands are swapped. */
6353 swap_mri_condition (int cc
)
6357 case MCC ('h', 'i'): return MCC ('c', 's');
6358 case MCC ('l', 's'): return MCC ('c', 'c');
6359 /* <HS> is an alias for <CC>. */
6360 case MCC ('h', 's'):
6361 case MCC ('c', 'c'): return MCC ('l', 's');
6362 /* <LO> is an alias for <CS>. */
6363 case MCC ('l', 'o'):
6364 case MCC ('c', 's'): return MCC ('h', 'i');
6365 case MCC ('p', 'l'): return MCC ('m', 'i');
6366 case MCC ('m', 'i'): return MCC ('p', 'l');
6367 case MCC ('g', 'e'): return MCC ('l', 'e');
6368 case MCC ('l', 't'): return MCC ('g', 't');
6369 case MCC ('g', 't'): return MCC ('l', 't');
6370 case MCC ('l', 'e'): return MCC ('g', 'e');
6371 /* Issue a warning for conditions we can not swap. */
6372 case MCC ('n', 'e'): return MCC ('n', 'e'); /* no problem here */
6373 case MCC ('e', 'q'): return MCC ('e', 'q'); /* also no problem */
6374 case MCC ('v', 'c'):
6375 case MCC ('v', 's'):
6377 as_warn (_("Condition <%c%c> in structured control directive can not be encoded correctly"),
6378 (char) (cc
>> 8), (char) (cc
));
6384 /* Reverse the sense of a condition. */
6387 reverse_mri_condition (int cc
)
6391 case MCC ('h', 'i'): return MCC ('l', 's');
6392 case MCC ('l', 's'): return MCC ('h', 'i');
6393 /* <HS> is an alias for <CC> */
6394 case MCC ('h', 's'): return MCC ('l', 'o');
6395 case MCC ('c', 'c'): return MCC ('c', 's');
6396 /* <LO> is an alias for <CS> */
6397 case MCC ('l', 'o'): return MCC ('h', 's');
6398 case MCC ('c', 's'): return MCC ('c', 'c');
6399 case MCC ('n', 'e'): return MCC ('e', 'q');
6400 case MCC ('e', 'q'): return MCC ('n', 'e');
6401 case MCC ('v', 'c'): return MCC ('v', 's');
6402 case MCC ('v', 's'): return MCC ('v', 'c');
6403 case MCC ('p', 'l'): return MCC ('m', 'i');
6404 case MCC ('m', 'i'): return MCC ('p', 'l');
6405 case MCC ('g', 'e'): return MCC ('l', 't');
6406 case MCC ('l', 't'): return MCC ('g', 'e');
6407 case MCC ('g', 't'): return MCC ('l', 'e');
6408 case MCC ('l', 'e'): return MCC ('g', 't');
6413 /* Build an MRI structured control expression. This generates test
6414 and branch instructions. It goes to TRUELAB if the condition is
6415 true, and to FALSELAB if the condition is false. Exactly one of
6416 TRUELAB and FALSELAB will be NULL, meaning to fall through. QUAL
6417 is the size qualifier for the expression. EXTENT is the size to
6418 use for the branch. */
6421 build_mri_control_operand (int qual
, int cc
, char *leftstart
, char *leftstop
,
6422 char *rightstart
, char *rightstop
,
6423 const char *truelab
, const char *falselab
,
6429 if (leftstart
!= NULL
)
6431 struct m68k_op leftop
, rightop
;
6434 /* Swap the compare operands, if necessary, to produce a legal
6435 m68k compare instruction. Comparing a register operand with
6436 a non-register operand requires the register to be on the
6437 right (cmp, cmpa). Comparing an immediate value with
6438 anything requires the immediate value to be on the left
6443 (void) m68k_ip_op (leftstart
, &leftop
);
6448 (void) m68k_ip_op (rightstart
, &rightop
);
6451 if (rightop
.mode
== IMMED
6452 || ((leftop
.mode
== DREG
|| leftop
.mode
== AREG
)
6453 && (rightop
.mode
!= DREG
&& rightop
.mode
!= AREG
)))
6457 /* Correct conditional handling:
6458 if #1 <lt> d0 then ;means if (1 < d0)
6464 cmp #1,d0 if we do *not* swap the operands
6465 bgt true we need the swapped condition!
6472 leftstart
= rightstart
;
6475 leftstop
= rightstop
;
6480 cc
= swap_mri_condition (cc
);
6484 if (truelab
== NULL
)
6486 cc
= reverse_mri_condition (cc
);
6490 if (leftstart
!= NULL
)
6492 buf
= (char *) xmalloc (20
6493 + (leftstop
- leftstart
)
6494 + (rightstop
- rightstart
));
6500 *s
++ = TOLOWER (qual
);
6502 memcpy (s
, leftstart
, leftstop
- leftstart
);
6503 s
+= leftstop
- leftstart
;
6505 memcpy (s
, rightstart
, rightstop
- rightstart
);
6506 s
+= rightstop
- rightstart
;
6512 buf
= (char *) xmalloc (20 + strlen (truelab
));
6518 *s
++ = TOLOWER (extent
);
6520 strcpy (s
, truelab
);
6525 /* Parse an MRI structured control expression. This generates test
6526 and branch instructions. STOP is where the expression ends. It
6527 goes to TRUELAB if the condition is true, and to FALSELAB if the
6528 condition is false. Exactly one of TRUELAB and FALSELAB will be
6529 NULL, meaning to fall through. QUAL is the size qualifier for the
6530 expression. EXTENT is the size to use for the branch. */
6533 parse_mri_control_expression (char *stop
, int qual
, const char *truelab
,
6534 const char *falselab
, int extent
)
6546 if (! parse_mri_control_operand (&cc
, &leftstart
, &leftstop
,
6547 &rightstart
, &rightstop
))
6553 if (strncasecmp (input_line_pointer
, "AND", 3) == 0)
6557 if (falselab
!= NULL
)
6560 flab
= mri_control_label ();
6562 build_mri_control_operand (qual
, cc
, leftstart
, leftstop
, rightstart
,
6563 rightstop
, (const char *) NULL
, flab
, extent
);
6565 input_line_pointer
+= 3;
6566 if (*input_line_pointer
!= '.'
6567 || input_line_pointer
[1] == '\0')
6571 qual
= input_line_pointer
[1];
6572 input_line_pointer
+= 2;
6575 if (! parse_mri_control_operand (&cc
, &leftstart
, &leftstop
,
6576 &rightstart
, &rightstop
))
6582 build_mri_control_operand (qual
, cc
, leftstart
, leftstop
, rightstart
,
6583 rightstop
, truelab
, falselab
, extent
);
6585 if (falselab
== NULL
)
6588 else if (strncasecmp (input_line_pointer
, "OR", 2) == 0)
6592 if (truelab
!= NULL
)
6595 tlab
= mri_control_label ();
6597 build_mri_control_operand (qual
, cc
, leftstart
, leftstop
, rightstart
,
6598 rightstop
, tlab
, (const char *) NULL
, extent
);
6600 input_line_pointer
+= 2;
6601 if (*input_line_pointer
!= '.'
6602 || input_line_pointer
[1] == '\0')
6606 qual
= input_line_pointer
[1];
6607 input_line_pointer
+= 2;
6610 if (! parse_mri_control_operand (&cc
, &leftstart
, &leftstop
,
6611 &rightstart
, &rightstop
))
6617 build_mri_control_operand (qual
, cc
, leftstart
, leftstop
, rightstart
,
6618 rightstop
, truelab
, falselab
, extent
);
6620 if (truelab
== NULL
)
6625 build_mri_control_operand (qual
, cc
, leftstart
, leftstop
, rightstart
,
6626 rightstop
, truelab
, falselab
, extent
);
6630 if (input_line_pointer
!= stop
)
6631 as_bad (_("syntax error in structured control directive"));
6634 /* Handle the MRI IF pseudo-op. This may be a structured control
6635 directive, or it may be a regular assembler conditional, depending
6643 struct mri_control_info
*n
;
6645 /* A structured control directive must end with THEN with an
6646 optional qualifier. */
6647 s
= input_line_pointer
;
6648 /* We only accept '*' as introduction of comments if preceded by white space
6649 or at first column of a line (I think this can't actually happen here?)
6650 This is important when assembling:
6651 if d0 <ne> 12(a0,d0*2) then
6652 if d0 <ne> #CONST*20 then. */
6653 while (! (is_end_of_line
[(unsigned char) *s
]
6656 && (s
== input_line_pointer
6658 || *(s
-1) == '\t'))))
6661 while (s
> input_line_pointer
&& (*s
== ' ' || *s
== '\t'))
6664 if (s
- input_line_pointer
> 1
6668 if (s
- input_line_pointer
< 3
6669 || strncasecmp (s
- 3, "THEN", 4) != 0)
6673 as_bad (_("missing then"));
6674 ignore_rest_of_line ();
6678 /* It's a conditional. */
6683 /* Since this might be a conditional if, this pseudo-op will be
6684 called even if we are supported to be ignoring input. Double
6685 check now. Clobber *input_line_pointer so that ignore_input
6686 thinks that this is not a special pseudo-op. */
6687 c
= *input_line_pointer
;
6688 *input_line_pointer
= 0;
6689 if (ignore_input ())
6691 *input_line_pointer
= c
;
6692 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6693 ++input_line_pointer
;
6694 demand_empty_rest_of_line ();
6697 *input_line_pointer
= c
;
6699 n
= push_mri_control (mri_if
);
6701 parse_mri_control_expression (s
- 3, qual
, (const char *) NULL
,
6702 n
->next
, s
[1] == '.' ? s
[2] : '\0');
6705 input_line_pointer
= s
+ 3;
6707 input_line_pointer
= s
+ 1;
6711 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6712 ++input_line_pointer
;
6715 demand_empty_rest_of_line ();
6718 /* Handle the MRI else pseudo-op. If we are currently doing an MRI
6719 structured IF, associate the ELSE with the IF. Otherwise, assume
6720 it is a conditional else. */
6723 s_mri_else (int qual
)
6730 && (mri_control_stack
== NULL
6731 || mri_control_stack
->type
!= mri_if
6732 || mri_control_stack
->else_seen
))
6738 c
= *input_line_pointer
;
6739 *input_line_pointer
= 0;
6740 if (ignore_input ())
6742 *input_line_pointer
= c
;
6743 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6744 ++input_line_pointer
;
6745 demand_empty_rest_of_line ();
6748 *input_line_pointer
= c
;
6750 if (mri_control_stack
== NULL
6751 || mri_control_stack
->type
!= mri_if
6752 || mri_control_stack
->else_seen
)
6754 as_bad (_("else without matching if"));
6755 ignore_rest_of_line ();
6759 mri_control_stack
->else_seen
= 1;
6761 buf
= (char *) xmalloc (20 + strlen (mri_control_stack
->bottom
));
6762 q
[0] = TOLOWER (qual
);
6764 sprintf (buf
, "bra%s %s", q
, mri_control_stack
->bottom
);
6768 colon (mri_control_stack
->next
);
6772 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6773 ++input_line_pointer
;
6776 demand_empty_rest_of_line ();
6779 /* Handle the MRI ENDI pseudo-op. */
6782 s_mri_endi (int ignore ATTRIBUTE_UNUSED
)
6784 if (mri_control_stack
== NULL
6785 || mri_control_stack
->type
!= mri_if
)
6787 as_bad (_("endi without matching if"));
6788 ignore_rest_of_line ();
6792 /* ignore_input will not return true for ENDI, so we don't need to
6793 worry about checking it again here. */
6795 if (! mri_control_stack
->else_seen
)
6796 colon (mri_control_stack
->next
);
6797 colon (mri_control_stack
->bottom
);
6803 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6804 ++input_line_pointer
;
6807 demand_empty_rest_of_line ();
6810 /* Handle the MRI BREAK pseudo-op. */
6813 s_mri_break (int extent
)
6815 struct mri_control_info
*n
;
6819 n
= mri_control_stack
;
6821 && n
->type
!= mri_for
6822 && n
->type
!= mri_repeat
6823 && n
->type
!= mri_while
)
6827 as_bad (_("break outside of structured loop"));
6828 ignore_rest_of_line ();
6832 buf
= (char *) xmalloc (20 + strlen (n
->bottom
));
6833 ex
[0] = TOLOWER (extent
);
6835 sprintf (buf
, "bra%s %s", ex
, n
->bottom
);
6841 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6842 ++input_line_pointer
;
6845 demand_empty_rest_of_line ();
6848 /* Handle the MRI NEXT pseudo-op. */
6851 s_mri_next (int extent
)
6853 struct mri_control_info
*n
;
6857 n
= mri_control_stack
;
6859 && n
->type
!= mri_for
6860 && n
->type
!= mri_repeat
6861 && n
->type
!= mri_while
)
6865 as_bad (_("next outside of structured loop"));
6866 ignore_rest_of_line ();
6870 buf
= (char *) xmalloc (20 + strlen (n
->next
));
6871 ex
[0] = TOLOWER (extent
);
6873 sprintf (buf
, "bra%s %s", ex
, n
->next
);
6879 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6880 ++input_line_pointer
;
6883 demand_empty_rest_of_line ();
6886 /* Handle the MRI FOR pseudo-op. */
6889 s_mri_for (int qual
)
6891 const char *varstart
, *varstop
;
6892 const char *initstart
, *initstop
;
6893 const char *endstart
, *endstop
;
6894 const char *bystart
, *bystop
;
6898 struct mri_control_info
*n
;
6904 FOR.q var = init { TO | DOWNTO } end [ BY by ] DO.e
6908 varstart
= input_line_pointer
;
6910 /* Look for the '='. */
6911 while (! is_end_of_line
[(unsigned char) *input_line_pointer
]
6912 && *input_line_pointer
!= '=')
6913 ++input_line_pointer
;
6914 if (*input_line_pointer
!= '=')
6916 as_bad (_("missing ="));
6917 ignore_rest_of_line ();
6921 varstop
= input_line_pointer
;
6922 if (varstop
> varstart
6923 && (varstop
[-1] == ' ' || varstop
[-1] == '\t'))
6926 ++input_line_pointer
;
6928 initstart
= input_line_pointer
;
6930 /* Look for TO or DOWNTO. */
6933 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6935 if (strncasecmp (input_line_pointer
, "TO", 2) == 0
6936 && ! is_part_of_name (input_line_pointer
[2]))
6938 initstop
= input_line_pointer
;
6939 input_line_pointer
+= 2;
6942 if (strncasecmp (input_line_pointer
, "DOWNTO", 6) == 0
6943 && ! is_part_of_name (input_line_pointer
[6]))
6945 initstop
= input_line_pointer
;
6947 input_line_pointer
+= 6;
6950 ++input_line_pointer
;
6952 if (initstop
== NULL
)
6954 as_bad (_("missing to or downto"));
6955 ignore_rest_of_line ();
6958 if (initstop
> initstart
6959 && (initstop
[-1] == ' ' || initstop
[-1] == '\t'))
6963 endstart
= input_line_pointer
;
6965 /* Look for BY or DO. */
6968 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6970 if (strncasecmp (input_line_pointer
, "BY", 2) == 0
6971 && ! is_part_of_name (input_line_pointer
[2]))
6973 endstop
= input_line_pointer
;
6975 input_line_pointer
+= 2;
6978 if (strncasecmp (input_line_pointer
, "DO", 2) == 0
6979 && (input_line_pointer
[2] == '.'
6980 || ! is_part_of_name (input_line_pointer
[2])))
6982 endstop
= input_line_pointer
;
6983 input_line_pointer
+= 2;
6986 ++input_line_pointer
;
6988 if (endstop
== NULL
)
6990 as_bad (_("missing do"));
6991 ignore_rest_of_line ();
6994 if (endstop
> endstart
6995 && (endstop
[-1] == ' ' || endstop
[-1] == '\t'))
7001 bystop
= bystart
+ 2;
7006 bystart
= input_line_pointer
;
7010 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
7012 if (strncasecmp (input_line_pointer
, "DO", 2) == 0
7013 && (input_line_pointer
[2] == '.'
7014 || ! is_part_of_name (input_line_pointer
[2])))
7016 bystop
= input_line_pointer
;
7017 input_line_pointer
+= 2;
7020 ++input_line_pointer
;
7024 as_bad (_("missing do"));
7025 ignore_rest_of_line ();
7028 if (bystop
> bystart
7029 && (bystop
[-1] == ' ' || bystop
[-1] == '\t'))
7033 if (*input_line_pointer
!= '.')
7037 extent
= input_line_pointer
[1];
7038 input_line_pointer
+= 2;
7041 /* We have fully parsed the FOR operands. Now build the loop. */
7042 n
= push_mri_control (mri_for
);
7044 buf
= (char *) xmalloc (50 + (input_line_pointer
- varstart
));
7046 /* Move init,var. */
7053 *s
++ = TOLOWER (qual
);
7055 memcpy (s
, initstart
, initstop
- initstart
);
7056 s
+= initstop
- initstart
;
7058 memcpy (s
, varstart
, varstop
- varstart
);
7059 s
+= varstop
- varstart
;
7071 *s
++ = TOLOWER (qual
);
7073 memcpy (s
, endstart
, endstop
- endstart
);
7074 s
+= endstop
- endstart
;
7076 memcpy (s
, varstart
, varstop
- varstart
);
7077 s
+= varstop
- varstart
;
7082 ex
[0] = TOLOWER (extent
);
7085 sprintf (buf
, "blt%s %s", ex
, n
->bottom
);
7087 sprintf (buf
, "bgt%s %s", ex
, n
->bottom
);
7090 /* Put together the add or sub instruction used by ENDF. */
7098 *s
++ = TOLOWER (qual
);
7100 memcpy (s
, bystart
, bystop
- bystart
);
7101 s
+= bystop
- bystart
;
7103 memcpy (s
, varstart
, varstop
- varstart
);
7104 s
+= varstop
- varstart
;
7110 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
7111 ++input_line_pointer
;
7114 demand_empty_rest_of_line ();
7117 /* Handle the MRI ENDF pseudo-op. */
7120 s_mri_endf (int ignore ATTRIBUTE_UNUSED
)
7122 if (mri_control_stack
== NULL
7123 || mri_control_stack
->type
!= mri_for
)
7125 as_bad (_("endf without for"));
7126 ignore_rest_of_line ();
7130 colon (mri_control_stack
->next
);
7132 mri_assemble (mri_control_stack
->incr
);
7134 sprintf (mri_control_stack
->incr
, "bra %s", mri_control_stack
->top
);
7135 mri_assemble (mri_control_stack
->incr
);
7137 free (mri_control_stack
->incr
);
7139 colon (mri_control_stack
->bottom
);
7145 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
7146 ++input_line_pointer
;
7149 demand_empty_rest_of_line ();
7152 /* Handle the MRI REPEAT pseudo-op. */
7155 s_mri_repeat (int ignore ATTRIBUTE_UNUSED
)
7157 struct mri_control_info
*n
;
7159 n
= push_mri_control (mri_repeat
);
7163 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
7164 ++input_line_pointer
;
7166 demand_empty_rest_of_line ();
7169 /* Handle the MRI UNTIL pseudo-op. */
7172 s_mri_until (int qual
)
7176 if (mri_control_stack
== NULL
7177 || mri_control_stack
->type
!= mri_repeat
)
7179 as_bad (_("until without repeat"));
7180 ignore_rest_of_line ();
7184 colon (mri_control_stack
->next
);
7186 for (s
= input_line_pointer
; ! is_end_of_line
[(unsigned char) *s
]; s
++)
7189 parse_mri_control_expression (s
, qual
, (const char *) NULL
,
7190 mri_control_stack
->top
, '\0');
7192 colon (mri_control_stack
->bottom
);
7194 input_line_pointer
= s
;
7200 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
7201 ++input_line_pointer
;
7204 demand_empty_rest_of_line ();
7207 /* Handle the MRI WHILE pseudo-op. */
7210 s_mri_while (int qual
)
7214 struct mri_control_info
*n
;
7216 s
= input_line_pointer
;
7217 /* We only accept '*' as introduction of comments if preceded by white space
7218 or at first column of a line (I think this can't actually happen here?)
7219 This is important when assembling:
7220 while d0 <ne> 12(a0,d0*2) do
7221 while d0 <ne> #CONST*20 do. */
7222 while (! (is_end_of_line
[(unsigned char) *s
]
7225 && (s
== input_line_pointer
7227 || *(s
-1) == '\t'))))
7230 while (*s
== ' ' || *s
== '\t')
7232 if (s
- input_line_pointer
> 1
7235 if (s
- input_line_pointer
< 2
7236 || strncasecmp (s
- 1, "DO", 2) != 0)
7238 as_bad (_("missing do"));
7239 ignore_rest_of_line ();
7243 n
= push_mri_control (mri_while
);
7247 parse_mri_control_expression (s
- 1, qual
, (const char *) NULL
, n
->bottom
,
7248 s
[1] == '.' ? s
[2] : '\0');
7250 input_line_pointer
= s
+ 1;
7251 if (*input_line_pointer
== '.')
7252 input_line_pointer
+= 2;
7256 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
7257 ++input_line_pointer
;
7260 demand_empty_rest_of_line ();
7263 /* Handle the MRI ENDW pseudo-op. */
7266 s_mri_endw (int ignore ATTRIBUTE_UNUSED
)
7270 if (mri_control_stack
== NULL
7271 || mri_control_stack
->type
!= mri_while
)
7273 as_bad (_("endw without while"));
7274 ignore_rest_of_line ();
7278 buf
= (char *) xmalloc (20 + strlen (mri_control_stack
->next
));
7279 sprintf (buf
, "bra %s", mri_control_stack
->next
);
7283 colon (mri_control_stack
->bottom
);
7289 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
7290 ++input_line_pointer
;
7293 demand_empty_rest_of_line ();
7296 /* Parse a .cpu directive. */
7299 s_m68k_cpu (int ignored ATTRIBUTE_UNUSED
)
7306 as_bad (_("already assembled instructions"));
7307 ignore_rest_of_line ();
7311 name
= input_line_pointer
;
7312 while (*input_line_pointer
&& !ISSPACE(*input_line_pointer
))
7313 input_line_pointer
++;
7314 saved_char
= *input_line_pointer
;
7315 *input_line_pointer
= 0;
7317 m68k_set_cpu (name
, 1, 0);
7319 *input_line_pointer
= saved_char
;
7320 demand_empty_rest_of_line ();
7324 /* Parse a .arch directive. */
7327 s_m68k_arch (int ignored ATTRIBUTE_UNUSED
)
7334 as_bad (_("already assembled instructions"));
7335 ignore_rest_of_line ();
7339 name
= input_line_pointer
;
7340 while (*input_line_pointer
&& *input_line_pointer
!= ','
7341 && !ISSPACE (*input_line_pointer
))
7342 input_line_pointer
++;
7343 saved_char
= *input_line_pointer
;
7344 *input_line_pointer
= 0;
7346 if (m68k_set_arch (name
, 1, 0))
7348 /* Scan extensions. */
7351 *input_line_pointer
++ = saved_char
;
7352 if (!*input_line_pointer
|| ISSPACE (*input_line_pointer
))
7354 name
= input_line_pointer
;
7355 while (*input_line_pointer
&& *input_line_pointer
!= ','
7356 && !ISSPACE (*input_line_pointer
))
7357 input_line_pointer
++;
7358 saved_char
= *input_line_pointer
;
7359 *input_line_pointer
= 0;
7361 while (m68k_set_extension (name
, 1, 0));
7364 *input_line_pointer
= saved_char
;
7365 demand_empty_rest_of_line ();
7369 /* Lookup a cpu name in TABLE and return the slot found. Return NULL
7370 if none is found, the caller is responsible for emitting an error
7371 message. If ALLOW_M is non-zero, we allow an initial 'm' on the
7372 cpu name, if it begins with a '6' (possibly skipping an intervening
7373 'c'. We also allow a 'c' in the same place. if NEGATED is
7374 non-zero, we accept a leading 'no-' and *NEGATED is set to true, if
7375 the option is indeed negated. */
7377 static const struct m68k_cpu
*
7378 m68k_lookup_cpu (const char *arg
, const struct m68k_cpu
*table
,
7379 int allow_m
, int *negated
)
7381 /* allow negated value? */
7386 if (arg
[0] == 'n' && arg
[1] == 'o' && arg
[2] == '-')
7393 /* Remove 'm' or 'mc' prefix from 68k variants. */
7400 else if (arg
[1] == 'c' && arg
[2] == '6')
7404 else if (arg
[0] == 'c' && arg
[1] == '6')
7407 for (; table
->name
; table
++)
7408 if (!strcmp (arg
, table
->name
))
7410 if (table
->alias
< -1 || table
->alias
> 1)
7411 as_bad (_("`%s' is deprecated, use `%s'"),
7412 table
->name
, table
[table
->alias
< 0 ? 1 : -1].name
);
7418 /* Set the cpu, issuing errors if it is unrecognized. */
7421 m68k_set_cpu (char const *name
, int allow_m
, int silent
)
7423 const struct m68k_cpu
*cpu
;
7425 cpu
= m68k_lookup_cpu (name
, m68k_cpus
, allow_m
, NULL
);
7430 as_bad (_("cpu `%s' unrecognized"), name
);
7437 /* Set the architecture, issuing errors if it is unrecognized. */
7440 m68k_set_arch (char const *name
, int allow_m
, int silent
)
7442 const struct m68k_cpu
*arch
;
7444 arch
= m68k_lookup_cpu (name
, m68k_archs
, allow_m
, NULL
);
7449 as_bad (_("architecture `%s' unrecognized"), name
);
7452 selected_arch
= arch
;
7456 /* Set the architecture extension, issuing errors if it is
7457 unrecognized, or invalid */
7460 m68k_set_extension (char const *name
, int allow_m
, int silent
)
7463 const struct m68k_cpu
*ext
;
7465 ext
= m68k_lookup_cpu (name
, m68k_extensions
, allow_m
, &negated
);
7470 as_bad (_("extension `%s' unrecognized"), name
);
7475 not_current_architecture
|= (ext
->control_regs
7476 ? *(unsigned *)ext
->control_regs
: ext
->arch
);
7478 current_architecture
|= ext
->arch
;
7483 Invocation line includes a switch not recognized by the base assembler.
7487 const char *md_shortopts
= "lSA:m:kQ:V";
7489 const char *md_shortopts
= "lSA:m:k";
7492 struct option md_longopts
[] = {
7493 #define OPTION_PIC (OPTION_MD_BASE)
7494 {"pic", no_argument
, NULL
, OPTION_PIC
},
7495 #define OPTION_REGISTER_PREFIX_OPTIONAL (OPTION_MD_BASE + 1)
7496 {"register-prefix-optional", no_argument
, NULL
,
7497 OPTION_REGISTER_PREFIX_OPTIONAL
},
7498 #define OPTION_BITWISE_OR (OPTION_MD_BASE + 2)
7499 {"bitwise-or", no_argument
, NULL
, OPTION_BITWISE_OR
},
7500 #define OPTION_BASE_SIZE_DEFAULT_16 (OPTION_MD_BASE + 3)
7501 {"base-size-default-16", no_argument
, NULL
, OPTION_BASE_SIZE_DEFAULT_16
},
7502 #define OPTION_BASE_SIZE_DEFAULT_32 (OPTION_MD_BASE + 4)
7503 {"base-size-default-32", no_argument
, NULL
, OPTION_BASE_SIZE_DEFAULT_32
},
7504 #define OPTION_DISP_SIZE_DEFAULT_16 (OPTION_MD_BASE + 5)
7505 {"disp-size-default-16", no_argument
, NULL
, OPTION_DISP_SIZE_DEFAULT_16
},
7506 #define OPTION_DISP_SIZE_DEFAULT_32 (OPTION_MD_BASE + 6)
7507 {"disp-size-default-32", no_argument
, NULL
, OPTION_DISP_SIZE_DEFAULT_32
},
7508 #define OPTION_PCREL (OPTION_MD_BASE + 7)
7509 {"pcrel", no_argument
, NULL
, OPTION_PCREL
},
7510 {NULL
, no_argument
, NULL
, 0}
7512 size_t md_longopts_size
= sizeof (md_longopts
);
7515 md_parse_option (int c
, char *arg
)
7519 case 'l': /* -l means keep external to 2 bit offset
7520 rather than 16 bit one. */
7521 flag_short_refs
= 1;
7524 case 'S': /* -S means that jbsr's always turn into
7526 flag_long_jumps
= 1;
7529 case OPTION_PCREL
: /* --pcrel means never turn PC-relative
7530 branches into absolute jumps. */
7531 flag_keep_pcrel
= 1;
7537 break; /* -pic, Position Independent Code. */
7539 case OPTION_REGISTER_PREFIX_OPTIONAL
:
7540 flag_reg_prefix_optional
= 1;
7541 reg_prefix_optional_seen
= 1;
7544 /* -V: SVR4 argument to print version ID. */
7546 print_version_id ();
7549 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
7550 should be emitted or not. FIXME: Not implemented. */
7554 case OPTION_BITWISE_OR
:
7559 n
= (char *) xmalloc (strlen (m68k_comment_chars
) + 1);
7561 for (s
= m68k_comment_chars
; *s
!= '\0'; s
++)
7565 m68k_comment_chars
= n
;
7569 case OPTION_BASE_SIZE_DEFAULT_16
:
7570 m68k_index_width_default
= SIZE_WORD
;
7573 case OPTION_BASE_SIZE_DEFAULT_32
:
7574 m68k_index_width_default
= SIZE_LONG
;
7577 case OPTION_DISP_SIZE_DEFAULT_16
:
7579 m68k_rel32_from_cmdline
= 1;
7582 case OPTION_DISP_SIZE_DEFAULT_32
:
7584 m68k_rel32_from_cmdline
= 1;
7589 as_tsktsk (_ ("option `-A%s' is deprecated: use `-%s'",
7592 /* Intentional fall-through. */
7594 if (!strncmp (arg
, "arch=", 5))
7595 m68k_set_arch (arg
+ 5, 1, 0);
7596 else if (!strncmp (arg
, "cpu=", 4))
7597 m68k_set_cpu (arg
+ 4, 1, 0);
7598 else if (m68k_set_extension (arg
, 0, 1))
7600 else if (m68k_set_arch (arg
, 0, 1))
7602 else if (m68k_set_cpu (arg
, 0, 1))
7615 /* Setup tables from the selected arch and/or cpu */
7618 m68k_init_arch (void)
7620 if (not_current_architecture
& current_architecture
)
7622 as_bad (_("architecture features both enabled and disabled"));
7623 not_current_architecture
&= ~current_architecture
;
7627 current_architecture
|= selected_arch
->arch
;
7628 control_regs
= selected_arch
->control_regs
;
7631 current_architecture
|= selected_cpu
->arch
;
7633 current_architecture
&= ~not_current_architecture
;
7635 if ((current_architecture
& (cfloat
| m68881
)) == (cfloat
| m68881
))
7637 /* Determine which float is really meant. */
7638 if (current_architecture
& (m68k_mask
& ~m68881
))
7639 current_architecture
^= cfloat
;
7641 current_architecture
^= m68881
;
7646 control_regs
= selected_cpu
->control_regs
;
7647 if (current_architecture
& ~selected_cpu
->arch
)
7649 as_bad (_("selected processor does not have all features of selected architecture"));
7650 current_architecture
7651 = selected_cpu
->arch
& ~not_current_architecture
;
7655 if ((current_architecture
& m68k_mask
)
7656 && (current_architecture
& ~m68k_mask
))
7658 as_bad (_ ("m68k and cf features both selected"));
7659 if (current_architecture
& m68k_mask
)
7660 current_architecture
&= m68k_mask
;
7662 current_architecture
&= ~m68k_mask
;
7665 /* Permit m68881 specification with all cpus; those that can't work
7666 with a coprocessor could be doing emulation. */
7667 if (current_architecture
& m68851
)
7669 if (current_architecture
& m68040
)
7670 as_warn (_("68040 and 68851 specified; mmu instructions may assemble incorrectly"));
7672 /* What other incompatibilities could we check for? */
7674 if (cpu_of_arch (current_architecture
) < m68020
7675 || arch_coldfire_p (current_architecture
))
7676 md_relax_table
[TAB (PCINDEX
, BYTE
)].rlx_more
= 0;
7682 md_show_usage (FILE *stream
)
7684 const char *default_cpu
= TARGET_CPU
;
7686 unsigned int default_arch
;
7688 /* Get the canonical name for the default target CPU. */
7689 if (*default_cpu
== 'm')
7691 for (i
= 0; m68k_cpus
[i
].name
; i
++)
7693 if (strcasecmp (default_cpu
, m68k_cpus
[i
].name
) == 0)
7695 default_arch
= m68k_cpus
[i
].arch
;
7696 while (m68k_cpus
[i
].alias
> 0)
7698 while (m68k_cpus
[i
].alias
< 0)
7700 default_cpu
= m68k_cpus
[i
].name
;
7704 fprintf (stream
, _("\
7705 -march=<arch> set architecture\n\
7706 -mcpu=<cpu> set cpu [default %s]\n\
7708 for (i
= 0; m68k_extensions
[i
].name
; i
++)
7709 fprintf (stream
, _("\
7710 -m[no-]%-16s enable/disable%s architecture extension\n\
7711 "), m68k_extensions
[i
].name
,
7712 m68k_extensions
[i
].alias
> 0 ? " ColdFire"
7713 : m68k_extensions
[i
].alias
< 0 ? " m68k" : "");
7715 fprintf (stream
, _("\
7716 -l use 1 word for refs to undefined symbols [default 2]\n\
7717 -pic, -k generate position independent code\n\
7718 -S turn jbsr into jsr\n\
7719 --pcrel never turn PC-relative branches into absolute jumps\n\
7720 --register-prefix-optional\n\
7721 recognize register names without prefix character\n\
7722 --bitwise-or do not treat `|' as a comment character\n\
7723 --base-size-default-16 base reg without size is 16 bits\n\
7724 --base-size-default-32 base reg without size is 32 bits (default)\n\
7725 --disp-size-default-16 displacement with unknown size is 16 bits\n\
7726 --disp-size-default-32 displacement with unknown size is 32 bits (default)\n\
7729 fprintf (stream
, _("Architecture variants are: "));
7730 for (i
= 0; m68k_archs
[i
].name
; i
++)
7733 fprintf (stream
, " | ");
7734 fprintf (stream
, "%s", m68k_archs
[i
].name
);
7736 fprintf (stream
, "\n");
7738 fprintf (stream
, _("Processor variants are: "));
7739 for (i
= 0; m68k_cpus
[i
].name
; i
++)
7742 fprintf (stream
, " | ");
7743 fprintf (stream
, "%s", m68k_cpus
[i
].name
);
7745 fprintf (stream
, _("\n"));
7750 /* TEST2: Test md_assemble() */
7751 /* Warning, this routine probably doesn't work anymore. */
7755 struct m68k_it the_ins
;
7763 if (!gets (buf
) || !*buf
)
7765 if (buf
[0] == '|' || buf
[1] == '.')
7767 for (cp
= buf
; *cp
; cp
++)
7772 memset (&the_ins
, '\0', sizeof (the_ins
));
7773 m68k_ip (&the_ins
, buf
);
7776 printf (_("Error %s in %s\n"), the_ins
.error
, buf
);
7780 printf (_("Opcode(%d.%s): "), the_ins
.numo
, the_ins
.args
);
7781 for (n
= 0; n
< the_ins
.numo
; n
++)
7782 printf (" 0x%x", the_ins
.opcode
[n
] & 0xffff);
7784 print_the_insn (&the_ins
.opcode
[0], stdout
);
7785 (void) putchar ('\n');
7787 for (n
= 0; n
< strlen (the_ins
.args
) / 2; n
++)
7789 if (the_ins
.operands
[n
].error
)
7791 printf ("op%d Error %s in %s\n", n
, the_ins
.operands
[n
].error
, buf
);
7794 printf ("mode %d, reg %d, ", the_ins
.operands
[n
].mode
,
7795 the_ins
.operands
[n
].reg
);
7796 if (the_ins
.operands
[n
].b_const
)
7797 printf ("Constant: '%.*s', ",
7798 1 + the_ins
.operands
[n
].e_const
- the_ins
.operands
[n
].b_const
,
7799 the_ins
.operands
[n
].b_const
);
7800 printf ("ireg %d, isiz %d, imul %d, ", the_ins
.operands
[n
].ireg
,
7801 the_ins
.operands
[n
].isiz
, the_ins
.operands
[n
].imul
);
7802 if (the_ins
.operands
[n
].b_iadd
)
7803 printf ("Iadd: '%.*s',",
7804 1 + the_ins
.operands
[n
].e_iadd
- the_ins
.operands
[n
].b_iadd
,
7805 the_ins
.operands
[n
].b_iadd
);
7814 is_label (char *str
)
7818 while (*str
&& *str
!= ' ')
7820 if (str
[-1] == ':' || str
[1] == '=')
7827 /* Possible states for relaxation:
7829 0 0 branch offset byte (bra, etc)
7833 1 0 indexed offsets byte a0@(32,d4:w:1) etc
7837 2 0 two-offset index word-word a0@(32,d4)@(45) etc
7844 /* We have no need to default values of symbols. */
7847 md_undefined_symbol (char *name ATTRIBUTE_UNUSED
)
7852 /* Round up a section size to the appropriate boundary. */
7854 md_section_align (segT segment ATTRIBUTE_UNUSED
, valueT size
)
7857 /* For a.out, force the section size to be aligned. If we don't do
7858 this, BFD will align it for us, but it will not write out the
7859 final bytes of the section. This may be a bug in BFD, but it is
7860 easier to fix it here since that is how the other a.out targets
7864 align
= bfd_get_section_alignment (stdoutput
, segment
);
7865 size
= ((size
+ (1 << align
) - 1) & ((valueT
) -1 << align
));
7871 /* Exactly what point is a PC-relative offset relative TO?
7872 On the 68k, it is relative to the address of the first extension
7873 word. The difference between the addresses of the offset and the
7874 first extension word is stored in fx_pcrel_adjust. */
7876 md_pcrel_from (fixS
*fixP
)
7880 /* Because fx_pcrel_adjust is a char, and may be unsigned, we explicitly
7881 sign extend the value here. */
7882 adjust
= ((fixP
->fx_pcrel_adjust
& 0xff) ^ 0x80) - 0x80;
7885 return fixP
->fx_where
+ fixP
->fx_frag
->fr_address
- adjust
;
7890 m68k_elf_final_processing (void)
7894 if (arch_coldfire_fpu (current_architecture
))
7895 flags
|= EF_M68K_CFV4E
;
7896 /* Set file-specific flags if this is a cpu32 processor. */
7897 if (cpu_of_arch (current_architecture
) & cpu32
)
7898 flags
|= EF_M68K_CPU32
;
7899 else if (cpu_of_arch (current_architecture
) & fido_a
)
7900 flags
|= EF_M68K_FIDO
;
7901 else if ((cpu_of_arch (current_architecture
) & m68000up
)
7902 && !(cpu_of_arch (current_architecture
) & m68020up
))
7903 flags
|= EF_M68K_M68000
;
7905 if (current_architecture
& mcfisa_a
)
7907 static const unsigned isa_features
[][2] =
7909 {EF_M68K_CF_ISA_A_NODIV
,mcfisa_a
},
7910 {EF_M68K_CF_ISA_A
, mcfisa_a
|mcfhwdiv
},
7911 {EF_M68K_CF_ISA_A_PLUS
, mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfusp
},
7912 {EF_M68K_CF_ISA_B_NOUSP
,mcfisa_a
|mcfisa_b
|mcfhwdiv
},
7913 {EF_M68K_CF_ISA_B
, mcfisa_a
|mcfisa_b
|mcfhwdiv
|mcfusp
},
7914 {EF_M68K_CF_ISA_C
, mcfisa_a
|mcfisa_c
|mcfhwdiv
|mcfusp
},
7915 {EF_M68K_CF_ISA_C_NODIV
,mcfisa_a
|mcfisa_c
|mcfusp
},
7918 static const unsigned mac_features
[][2] =
7920 {EF_M68K_CF_MAC
, mcfmac
},
7921 {EF_M68K_CF_EMAC
, mcfemac
},
7927 pattern
= (current_architecture
7928 & (mcfisa_a
|mcfisa_aa
|mcfisa_b
|mcfisa_c
|mcfhwdiv
|mcfusp
));
7929 for (ix
= 0; isa_features
[ix
][1]; ix
++)
7931 if (pattern
== isa_features
[ix
][1])
7933 flags
|= isa_features
[ix
][0];
7937 if (!isa_features
[ix
][1])
7940 as_warn (_("Not a defined coldfire architecture"));
7944 if (current_architecture
& cfloat
)
7945 flags
|= EF_M68K_CF_FLOAT
| EF_M68K_CFV4E
;
7947 pattern
= current_architecture
& (mcfmac
|mcfemac
);
7950 for (ix
= 0; mac_features
[ix
][1]; ix
++)
7952 if (pattern
== mac_features
[ix
][1])
7954 flags
|= mac_features
[ix
][0];
7958 if (!mac_features
[ix
][1])
7963 elf_elfheader (stdoutput
)->e_flags
|= flags
;
7966 /* Parse @TLSLDO and return the desired relocation. */
7967 static bfd_reloc_code_real_type
7968 m68k_elf_suffix (char **str_p
, expressionS
*exp_p
)
7977 return BFD_RELOC_UNUSED
;
7979 for (ch
= *str
, str2
= ident
;
7980 (str2
< ident
+ sizeof (ident
) - 1
7981 && (ISALNUM (ch
) || ch
== '@'));
7990 if (strncmp (ident
, "TLSLDO", 6) == 0
7993 /* Now check for identifier@suffix+constant. */
7994 if (*str
== '-' || *str
== '+')
7996 char *orig_line
= input_line_pointer
;
7997 expressionS new_exp
;
7999 input_line_pointer
= str
;
8000 expression (&new_exp
);
8001 if (new_exp
.X_op
== O_constant
)
8003 exp_p
->X_add_number
+= new_exp
.X_add_number
;
8004 str
= input_line_pointer
;
8007 if (&input_line_pointer
!= str_p
)
8008 input_line_pointer
= orig_line
;
8012 return BFD_RELOC_68K_TLS_LDO32
;
8015 return BFD_RELOC_UNUSED
;
8018 /* Handles .long <tls_symbol>+0x8000 debug info.
8019 Clobbers input_line_pointer, checks end-of-line.
8020 Adapted from tc-ppc.c:ppc_elf_cons. */
8022 m68k_elf_cons (int nbytes
/* 4=.long */)
8024 if (is_it_end_of_statement ())
8026 demand_empty_rest_of_line ();
8033 bfd_reloc_code_real_type reloc
;
8036 if (exp
.X_op
== O_symbol
8037 && *input_line_pointer
== '@'
8038 && (reloc
= m68k_elf_suffix (&input_line_pointer
,
8039 &exp
)) != BFD_RELOC_UNUSED
)
8041 reloc_howto_type
*reloc_howto
;
8044 reloc_howto
= bfd_reloc_type_lookup (stdoutput
, reloc
);
8045 size
= bfd_get_reloc_size (reloc_howto
);
8049 as_bad (_("%s relocations do not fit in %d bytes\n"),
8050 reloc_howto
->name
, nbytes
);
8057 p
= frag_more (nbytes
);
8059 if (target_big_endian
)
8060 offset
= nbytes
- size
;
8061 fix_new_exp (frag_now
, p
- frag_now
->fr_literal
+ offset
, size
,
8066 emit_expr (&exp
, (unsigned int) nbytes
);
8068 while (*input_line_pointer
++ == ',');
8070 /* Put terminator back into stream. */
8071 input_line_pointer
--;
8072 demand_empty_rest_of_line ();
8077 tc_m68k_regname_to_dw2regnum (char *regname
)
8079 unsigned int regnum
;
8080 static const char *const regnames
[] =
8082 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
8083 "a0", "a1", "a2", "a3", "a4", "a5", "a6", "sp",
8084 "fp0", "fp1", "fp2", "fp3", "fp4", "fp5", "fp6", "fp7",
8088 for (regnum
= 0; regnum
< ARRAY_SIZE (regnames
); regnum
++)
8089 if (strcmp (regname
, regnames
[regnum
]) == 0)
8096 tc_m68k_frame_initial_instructions (void)
8098 static int sp_regno
= -1;
8101 sp_regno
= tc_m68k_regname_to_dw2regnum ("sp");
8103 cfi_add_CFA_def_cfa (sp_regno
, -DWARF2_CIE_DATA_ALIGNMENT
);
8104 cfi_add_CFA_offset (DWARF2_DEFAULT_RETURN_COLUMN
, DWARF2_CIE_DATA_ALIGNMENT
);