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
)))
1329 /* PR gas/3041 Adjust addend in order to force bfd_install_relocation()
1330 to put the symbol offset into frags referencing a weak symbol. */
1331 reloc
->addend
= fixp
->fx_addnumber
1332 - (S_GET_VALUE (fixp
->fx_addsy
) * 2);
1336 if (!fixp
->fx_pcrel
)
1337 reloc
->addend
= fixp
->fx_addnumber
;
1339 reloc
->addend
= (section
->vma
1340 /* Explicit sign extension in case char is
1342 + ((fixp
->fx_pcrel_adjust
& 0xff) ^ 0x80) - 0x80
1343 + fixp
->fx_addnumber
1344 + md_pcrel_from (fixp
));
1347 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, code
);
1348 gas_assert (reloc
->howto
!= 0);
1353 /* Handle of the OPCODE hash table. NULL means any use before
1354 m68k_ip_begin() will crash. */
1355 static struct hash_control
*op_hash
;
1357 /* Assemble an m68k instruction. */
1360 m68k_ip (char *instring
)
1363 register struct m68k_op
*opP
;
1364 register const struct m68k_incant
*opcode
;
1365 register const char *s
;
1366 register int tmpreg
= 0, baseo
= 0, outro
= 0, nextword
;
1367 char *pdot
, *pdotmove
;
1368 enum m68k_size siz1
, siz2
;
1372 struct m68k_op operands_backup
[6];
1373 LITTLENUM_TYPE words
[6];
1374 LITTLENUM_TYPE
*wordp
;
1375 unsigned long ok_arch
= 0;
1377 if (*instring
== ' ')
1378 instring
++; /* Skip leading whitespace. */
1380 /* Scan up to end of operation-code, which MUST end in end-of-string
1381 or exactly 1 space. */
1383 for (p
= instring
; *p
!= '\0'; p
++)
1393 the_ins
.error
= _("No operator");
1397 /* p now points to the end of the opcode name, probably whitespace.
1398 Make sure the name is null terminated by clobbering the
1399 whitespace, look it up in the hash table, then fix it back.
1400 Remove a dot, first, since the opcode tables have none. */
1403 for (pdotmove
= pdot
; pdotmove
< p
; pdotmove
++)
1404 *pdotmove
= pdotmove
[1];
1410 opcode
= (const struct m68k_incant
*) hash_find (op_hash
, instring
);
1415 for (pdotmove
= p
; pdotmove
> pdot
; pdotmove
--)
1416 *pdotmove
= pdotmove
[-1];
1423 the_ins
.error
= _("Unknown operator");
1427 /* Found a legitimate opcode, start matching operands. */
1431 if (opcode
->m_operands
== 0)
1433 char *old
= input_line_pointer
;
1435 input_line_pointer
= p
;
1436 /* Ahh - it's a motorola style psuedo op. */
1437 mote_pseudo_table
[opcode
->m_opnum
].poc_handler
1438 (mote_pseudo_table
[opcode
->m_opnum
].poc_val
);
1439 input_line_pointer
= old
;
1445 if (flag_mri
&& opcode
->m_opnum
== 0)
1447 /* In MRI mode, random garbage is allowed after an instruction
1448 which accepts no operands. */
1449 the_ins
.args
= opcode
->m_operands
;
1450 the_ins
.numargs
= opcode
->m_opnum
;
1451 the_ins
.numo
= opcode
->m_codenum
;
1452 the_ins
.opcode
[0] = getone (opcode
);
1453 the_ins
.opcode
[1] = gettwo (opcode
);
1457 for (opP
= &the_ins
.operands
[0]; *p
; opP
++)
1459 p
= crack_operand (p
, opP
);
1463 the_ins
.error
= opP
->error
;
1468 opsfound
= opP
- &the_ins
.operands
[0];
1470 /* This ugly hack is to support the floating pt opcodes in their
1471 standard form. Essentially, we fake a first enty of type COP#1 */
1472 if (opcode
->m_operands
[0] == 'I')
1476 for (n
= opsfound
; n
> 0; --n
)
1477 the_ins
.operands
[n
] = the_ins
.operands
[n
- 1];
1479 memset (&the_ins
.operands
[0], '\0', sizeof (the_ins
.operands
[0]));
1480 the_ins
.operands
[0].mode
= CONTROL
;
1481 the_ins
.operands
[0].reg
= m68k_float_copnum
;
1485 /* We've got the operands. Find an opcode that'll accept them. */
1488 /* If we didn't get the right number of ops, or we have no
1489 common model with this pattern then reject this pattern. */
1491 ok_arch
|= opcode
->m_arch
;
1492 if (opsfound
!= opcode
->m_opnum
1493 || ((opcode
->m_arch
& current_architecture
) == 0))
1499 /* Make a copy of the operands of this insn so that
1500 we can modify them safely, should we want to. */
1501 gas_assert (opsfound
<= (int) ARRAY_SIZE (operands_backup
));
1502 for (i
= 0; i
< opsfound
; i
++)
1503 operands_backup
[i
] = the_ins
.operands
[i
];
1505 for (s
= opcode
->m_operands
, opP
= &operands_backup
[0];
1509 /* Warning: this switch is huge! */
1510 /* I've tried to organize the cases into this order:
1511 non-alpha first, then alpha by letter. Lower-case
1512 goes directly before uppercase counterpart. */
1513 /* Code with multiple case ...: gets sorted by the lowest
1514 case ... it belongs to. I hope this makes sense. */
1620 if (opP
->reg
== PC
|| opP
->reg
== ZPC
)
1637 if (opP
->reg
== PC
|| opP
->reg
== ZPC
)
1656 if (opP
->reg
== PC
|| opP
->reg
== ZPC
)
1666 if (opP
->mode
!= IMMED
)
1668 else if (s
[1] == 'b'
1669 && ! isvar (&opP
->disp
)
1670 && (opP
->disp
.exp
.X_op
!= O_constant
1671 || ! isbyte (opP
->disp
.exp
.X_add_number
)))
1673 else if (s
[1] == 'B'
1674 && ! isvar (&opP
->disp
)
1675 && (opP
->disp
.exp
.X_op
!= O_constant
1676 || ! issbyte (opP
->disp
.exp
.X_add_number
)))
1678 else if (s
[1] == 'w'
1679 && ! isvar (&opP
->disp
)
1680 && (opP
->disp
.exp
.X_op
!= O_constant
1681 || ! isword (opP
->disp
.exp
.X_add_number
)))
1683 else if (s
[1] == 'W'
1684 && ! isvar (&opP
->disp
)
1685 && (opP
->disp
.exp
.X_op
!= O_constant
1686 || ! issword (opP
->disp
.exp
.X_add_number
)))
1692 if (opP
->mode
!= IMMED
)
1697 if (opP
->mode
== AREG
1698 || opP
->mode
== CONTROL
1699 || opP
->mode
== FPREG
1700 || opP
->mode
== IMMED
1701 || opP
->mode
== REGLST
1702 || (opP
->mode
!= ABSL
1704 || opP
->reg
== ZPC
)))
1709 if (opP
->mode
== CONTROL
1710 || opP
->mode
== FPREG
1711 || opP
->mode
== REGLST
1712 || opP
->mode
== IMMED
1713 || (opP
->mode
!= ABSL
1715 || opP
->reg
== ZPC
)))
1743 if (opP
->mode
== CONTROL
1744 || opP
->mode
== FPREG
1745 || opP
->mode
== REGLST
)
1750 if (opP
->mode
!= AINC
)
1755 if (opP
->mode
!= ADEC
)
1805 if (opP
->reg
== PC
|| opP
->reg
== ZPC
)
1826 case '~': /* For now! (JF FOO is this right?) */
1848 if (opP
->mode
!= CONTROL
1849 || (opP
->reg
!= TT0
&& opP
->reg
!= TT1
))
1854 if (opP
->mode
!= AREG
)
1859 if (opP
->mode
!= AINDR
)
1864 if (opP
->mode
!= AINDR
&& opP
->mode
!= AINC
&& opP
->mode
!= ADEC
1865 && (opP
->mode
!= DISP
1867 || opP
->reg
> ADDR7
))
1872 if (opP
->mode
!= ABSL
1874 && strncmp (instring
, "jbsr", 4) == 0))
1897 if (opP
->mode
!= CONTROL
|| opP
->reg
!= CCR
)
1902 if (opP
->mode
!= DISP
1904 || opP
->reg
> ADDR7
)
1909 if (opP
->mode
!= DREG
)
1914 if (opP
->reg
!= ACC
)
1919 if (opP
->reg
!= ACC
&& opP
->reg
!= ACC1
1920 && opP
->reg
!= ACC2
&& opP
->reg
!= ACC3
)
1925 if (opP
->mode
!= FPREG
)
1930 if (opP
->reg
!= MACSR
)
1935 if (opP
->reg
!= ACCEXT01
&& opP
->reg
!= ACCEXT23
)
1940 if (opP
->reg
!= MASK
)
1945 if (opP
->mode
!= CONTROL
1952 if (opP
->mode
!= LSH
&& opP
->mode
!= RSH
)
1957 if (opP
->mode
!= CONTROL
1959 || opP
->reg
> last_movec_reg
1964 const enum m68k_register
*rp
;
1966 for (rp
= control_regs
; *rp
; rp
++)
1968 if (*rp
== opP
->reg
)
1970 /* In most CPUs RAMBAR refers to control reg
1971 c05 (RAMBAR1), but a few CPUs have it
1972 refer to c04 (RAMBAR0). */
1973 else if (*rp
== RAMBAR_ALT
&& opP
->reg
== RAMBAR
)
1975 opP
->reg
= RAMBAR_ALT
;
1985 if (opP
->mode
!= IMMED
)
1991 if (opP
->mode
== DREG
1992 || opP
->mode
== AREG
1993 || opP
->mode
== FPREG
)
2002 opP
->mask
= 1 << (opP
->reg
- DATA0
);
2005 opP
->mask
= 1 << (opP
->reg
- ADDR0
+ 8);
2008 opP
->mask
= 1 << (opP
->reg
- FP0
+ 16);
2016 else if (opP
->mode
== CONTROL
)
2025 opP
->mask
= 1 << 24;
2028 opP
->mask
= 1 << 25;
2031 opP
->mask
= 1 << 26;
2040 else if (opP
->mode
!= REGLST
)
2042 else if (s
[1] == '8' && (opP
->mask
& 0x0ffffff) != 0)
2044 else if (s
[1] == '3' && (opP
->mask
& 0x7000000) != 0)
2049 if (opP
->mode
!= IMMED
)
2051 else if (opP
->disp
.exp
.X_op
!= O_constant
2052 || ! issbyte (opP
->disp
.exp
.X_add_number
))
2054 else if (! m68k_quick
2055 && instring
[3] != 'q'
2056 && instring
[4] != 'q')
2061 if (opP
->mode
!= DREG
2062 && opP
->mode
!= IMMED
2063 && opP
->mode
!= ABSL
)
2068 if (opP
->mode
!= IMMED
)
2070 else if (opP
->disp
.exp
.X_op
!= O_constant
2071 || TRUNC (opP
->disp
.exp
.X_add_number
) - 1 > 7)
2073 else if (! m68k_quick
2074 && (strncmp (instring
, "add", 3) == 0
2075 || strncmp (instring
, "sub", 3) == 0)
2076 && instring
[3] != 'q')
2081 if (opP
->mode
!= DREG
&& opP
->mode
!= AREG
)
2086 if (opP
->mode
!= AINDR
2087 && (opP
->mode
!= BASE
2089 && opP
->reg
!= ZADDR0
)
2090 || opP
->disp
.exp
.X_op
!= O_absent
2091 || ((opP
->index
.reg
< DATA0
2092 || opP
->index
.reg
> DATA7
)
2093 && (opP
->index
.reg
< ADDR0
2094 || opP
->index
.reg
> ADDR7
))
2095 || opP
->index
.size
!= SIZE_UNSPEC
2096 || opP
->index
.scale
!= 1))
2101 if (opP
->mode
!= CONTROL
2102 || ! (opP
->reg
== FPI
2104 || opP
->reg
== FPC
))
2109 if (opP
->mode
!= CONTROL
|| opP
->reg
!= SR
)
2114 if (opP
->mode
!= IMMED
)
2116 else if (opP
->disp
.exp
.X_op
!= O_constant
2117 || TRUNC (opP
->disp
.exp
.X_add_number
) > 7)
2122 if (opP
->mode
!= CONTROL
|| opP
->reg
!= USP
)
2127 if (opP
->mode
!= IMMED
)
2129 else if (opP
->disp
.exp
.X_op
!= O_constant
2130 || (TRUNC (opP
->disp
.exp
.X_add_number
) != 0xffffffff
2131 && TRUNC (opP
->disp
.exp
.X_add_number
) - 1 > 6))
2136 if (opP
->mode
!= IMMED
)
2138 else if (opP
->disp
.exp
.X_op
!= O_constant
2139 || TRUNC (opP
->disp
.exp
.X_add_number
) - 1 > 7)
2144 if (opP
->mode
!= IMMED
)
2146 else if (opP
->disp
.exp
.X_op
!= O_constant
2147 || TRUNC (opP
->disp
.exp
.X_add_number
) > 511)
2151 /* JF these are out of order. We could put them
2152 in order if we were willing to put up with
2153 bunches of #ifdef m68851s in the code.
2155 Don't forget that you need these operands
2156 to use 68030 MMU instructions. */
2158 /* Memory addressing mode used by pflushr. */
2160 if (opP
->mode
== CONTROL
2161 || opP
->mode
== FPREG
2162 || opP
->mode
== DREG
2163 || opP
->mode
== AREG
2164 || opP
->mode
== REGLST
)
2166 /* We should accept immediate operands, but they
2167 supposedly have to be quad word, and we don't
2168 handle that. I would like to see what a Motorola
2169 assembler does before doing something here. */
2170 if (opP
->mode
== IMMED
)
2175 if (opP
->mode
!= CONTROL
2176 || (opP
->reg
!= SFC
&& opP
->reg
!= DFC
))
2181 if (opP
->mode
!= CONTROL
|| opP
->reg
!= TC
)
2186 if (opP
->mode
!= CONTROL
|| opP
->reg
!= AC
)
2191 if (opP
->mode
!= CONTROL
2194 && opP
->reg
!= SCC
))
2199 if (opP
->mode
!= CONTROL
2205 if (opP
->mode
!= CONTROL
2208 && opP
->reg
!= CRP
))
2232 if (opP
->mode
!= CONTROL
2233 || (!(opP
->reg
>= BAD
&& opP
->reg
<= BAD
+ 7)
2234 && !(opP
->reg
>= BAC
&& opP
->reg
<= BAC
+ 7)))
2239 if (opP
->mode
!= CONTROL
|| opP
->reg
!= PSR
)
2244 if (opP
->mode
!= CONTROL
|| opP
->reg
!= PCSR
)
2249 if (opP
->mode
!= CONTROL
2258 if (opP
->mode
!= ABSL
)
2263 if (opP
->reg
< DATA0L
|| opP
->reg
> ADDR7U
)
2265 /* FIXME: kludge instead of fixing parser:
2266 upper/lower registers are *not* CONTROL
2267 registers, but ordinary ones. */
2268 if ((opP
->reg
>= DATA0L
&& opP
->reg
<= DATA7L
)
2269 || (opP
->reg
>= DATA0U
&& opP
->reg
<= DATA7U
))
2276 if (!(opP
->mode
== AINDR
2277 || (opP
->mode
== DISP
2278 && !(opP
->reg
== PC
|| opP
->reg
== ZPC
))))
2283 if (!(opP
->mode
== AINDR
|| opP
->mode
== DISP
))
2295 /* Since we have found the correct instruction, copy
2296 in the modifications that we may have made. */
2298 for (i
= 0; i
< opsfound
; i
++)
2299 the_ins
.operands
[i
] = operands_backup
[i
];
2305 opcode
= opcode
->m_next
;
2310 && !(ok_arch
& current_architecture
))
2312 const struct m68k_cpu
*cpu
;
2315 char *buf
= xmalloc (space
+ 1);
2319 the_ins
.error
= buf
;
2320 /* Make sure there's a NUL at the end of the buffer -- strncpy
2321 won't write one when it runs out of buffer. */
2323 #define APPEND(STRING) \
2324 (strncpy (buf, STRING, space), len = strlen (buf), buf += len, space -= len)
2326 APPEND (_("invalid instruction for this architecture; needs "));
2330 APPEND ("ColdFire ISA_A");
2333 APPEND ("ColdFire ");
2334 APPEND (_("hardware divide"));
2337 APPEND ("ColdFire ISA_A+");
2340 APPEND ("ColdFire ISA_B");
2343 APPEND ("ColdFire ISA_C");
2346 APPEND ("ColdFire fpu");
2349 APPEND ("M68K fpu");
2352 APPEND ("M68K mmu");
2356 APPEND (_("or higher"));
2360 APPEND (_("or higher"));
2364 APPEND (_("or higher"));
2372 for (cpu
= m68k_cpus
; cpu
->name
; cpu
++)
2373 if (!cpu
->alias
&& (cpu
->arch
& ok_arch
))
2375 const struct m68k_cpu
*alias
;
2376 int seen_master
= 0;
2382 for (alias
= cpu
; alias
!= m68k_cpus
; alias
--)
2383 if (alias
[-1].alias
>= 0)
2385 for (; !seen_master
|| alias
->alias
> 0; alias
++)
2395 APPEND (alias
->name
);
2408 /* We ran out of space, so replace the end of the list
2413 strcpy (buf
, " ...");
2417 the_ins
.error
= _("operands mismatch");
2424 /* Now assemble it. */
2425 the_ins
.args
= opcode
->m_operands
;
2426 the_ins
.numargs
= opcode
->m_opnum
;
2427 the_ins
.numo
= opcode
->m_codenum
;
2428 the_ins
.opcode
[0] = getone (opcode
);
2429 the_ins
.opcode
[1] = gettwo (opcode
);
2431 for (s
= the_ins
.args
, opP
= &the_ins
.operands
[0]; *s
; s
+= 2, opP
++)
2436 /* This switch is a doozy.
2437 Watch the first step; its a big one! */
2470 tmpreg
= 0x3c; /* 7.4 */
2471 if (strchr ("bwl", s
[1]))
2472 nextword
= get_num (&opP
->disp
, 90);
2474 nextword
= get_num (&opP
->disp
, 0);
2475 if (isvar (&opP
->disp
))
2476 add_fix (s
[1], &opP
->disp
, 0, 0);
2480 if (!isbyte (nextword
))
2481 opP
->error
= _("operand out of range");
2486 if (!isword (nextword
))
2487 opP
->error
= _("operand out of range");
2492 if (!issword (nextword
))
2493 opP
->error
= _("operand out of range");
2498 addword (nextword
>> 16);
2525 /* We gotta put out some float. */
2526 if (op (&opP
->disp
) != O_big
)
2531 /* Can other cases happen here? */
2532 if (op (&opP
->disp
) != O_constant
)
2535 val
= (valueT
) offs (&opP
->disp
);
2539 generic_bignum
[gencnt
] = (LITTLENUM_TYPE
) val
;
2540 val
>>= LITTLENUM_NUMBER_OF_BITS
;
2544 offs (&opP
->disp
) = gencnt
;
2546 if (offs (&opP
->disp
) > 0)
2548 if (offs (&opP
->disp
) > baseo
)
2550 as_warn (_("Bignum too big for %c format; truncated"),
2552 offs (&opP
->disp
) = baseo
;
2554 baseo
-= offs (&opP
->disp
);
2557 for (wordp
= generic_bignum
+ offs (&opP
->disp
) - 1;
2558 offs (&opP
->disp
)--;
2563 gen_to_words (words
, baseo
, (long) outro
);
2564 for (wordp
= words
; baseo
--; wordp
++)
2568 tmpreg
= opP
->reg
- DATA
; /* 0.dreg */
2571 tmpreg
= 0x08 + opP
->reg
- ADDR
; /* 1.areg */
2574 tmpreg
= 0x10 + opP
->reg
- ADDR
; /* 2.areg */
2577 tmpreg
= 0x20 + opP
->reg
- ADDR
; /* 4.areg */
2580 tmpreg
= 0x18 + opP
->reg
- ADDR
; /* 3.areg */
2584 nextword
= get_num (&opP
->disp
, 90);
2586 /* Convert mode 5 addressing with a zero offset into
2587 mode 2 addressing to reduce the instruction size by a
2589 if (! isvar (&opP
->disp
)
2591 && (opP
->disp
.size
== SIZE_UNSPEC
)
2592 && (opP
->reg
>= ADDR0
)
2593 && (opP
->reg
<= ADDR7
))
2595 tmpreg
= 0x10 + opP
->reg
- ADDR
; /* 2.areg */
2600 && ! isvar (&opP
->disp
)
2603 opP
->disp
.exp
.X_op
= O_symbol
;
2604 opP
->disp
.exp
.X_add_symbol
=
2605 section_symbol (absolute_section
);
2608 /* Force into index mode. Hope this works. */
2610 /* We do the first bit for 32-bit displacements, and the
2611 second bit for 16 bit ones. It is possible that we
2612 should make the default be WORD instead of LONG, but
2613 I think that'd break GCC, so we put up with a little
2614 inefficiency for the sake of working output. */
2616 if (!issword (nextword
)
2617 || (isvar (&opP
->disp
)
2618 && ((opP
->disp
.size
== SIZE_UNSPEC
2619 && flag_short_refs
== 0
2620 && cpu_of_arch (current_architecture
) >= m68020
2621 && ! arch_coldfire_p (current_architecture
))
2622 || opP
->disp
.size
== SIZE_LONG
)))
2624 if (cpu_of_arch (current_architecture
) < m68020
2625 || arch_coldfire_p (current_architecture
))
2627 _("displacement too large for this architecture; needs 68020 or higher");
2629 tmpreg
= 0x3B; /* 7.3 */
2631 tmpreg
= 0x30 + opP
->reg
- ADDR
; /* 6.areg */
2632 if (isvar (&opP
->disp
))
2636 if (opP
->disp
.size
== SIZE_LONG
2638 /* If the displacement needs pic
2639 relocation it cannot be relaxed. */
2640 || opP
->disp
.pic_reloc
!= pic_none
2645 add_fix ('l', &opP
->disp
, 1, 2);
2649 add_frag (adds (&opP
->disp
),
2650 SEXT (offs (&opP
->disp
)),
2651 TAB (PCREL1632
, SZ_UNDEF
));
2658 add_fix ('l', &opP
->disp
, 0, 0);
2663 addword (nextword
>> 16);
2668 tmpreg
= 0x3A; /* 7.2 */
2670 tmpreg
= 0x28 + opP
->reg
- ADDR
; /* 5.areg */
2672 if (isvar (&opP
->disp
))
2676 add_fix ('w', &opP
->disp
, 1, 0);
2679 add_fix ('w', &opP
->disp
, 0, 0);
2689 baseo
= get_num (&opP
->disp
, 90);
2690 if (opP
->mode
== POST
|| opP
->mode
== PRE
)
2691 outro
= get_num (&opP
->odisp
, 90);
2692 /* Figure out the `addressing mode'.
2693 Also turn on the BASE_DISABLE bit, if needed. */
2694 if (opP
->reg
== PC
|| opP
->reg
== ZPC
)
2696 tmpreg
= 0x3b; /* 7.3 */
2697 if (opP
->reg
== ZPC
)
2700 else if (opP
->reg
== 0)
2703 tmpreg
= 0x30; /* 6.garbage */
2705 else if (opP
->reg
>= ZADDR0
&& opP
->reg
<= ZADDR7
)
2708 tmpreg
= 0x30 + opP
->reg
- ZADDR0
;
2711 tmpreg
= 0x30 + opP
->reg
- ADDR
; /* 6.areg */
2713 siz1
= opP
->disp
.size
;
2714 if (opP
->mode
== POST
|| opP
->mode
== PRE
)
2715 siz2
= opP
->odisp
.size
;
2719 /* Index register stuff. */
2720 if (opP
->index
.reg
!= 0
2721 && opP
->index
.reg
>= DATA
2722 && opP
->index
.reg
<= ADDR7
)
2724 nextword
|= (opP
->index
.reg
- DATA
) << 12;
2726 if (opP
->index
.size
== SIZE_LONG
2727 || (opP
->index
.size
== SIZE_UNSPEC
2728 && m68k_index_width_default
== SIZE_LONG
))
2731 if ((opP
->index
.scale
!= 1
2732 && cpu_of_arch (current_architecture
) < m68020
)
2733 || (opP
->index
.scale
== 8
2734 && (arch_coldfire_p (current_architecture
)
2735 && !arch_coldfire_fpu (current_architecture
))))
2738 _("scale factor invalid on this architecture; needs cpu32 or 68020 or higher");
2741 if (arch_coldfire_p (current_architecture
)
2742 && opP
->index
.size
== SIZE_WORD
)
2743 opP
->error
= _("invalid index size for coldfire");
2745 switch (opP
->index
.scale
)
2762 GET US OUT OF HERE! */
2764 /* Must be INDEX, with an index register. Address
2765 register cannot be ZERO-PC, and either :b was
2766 forced, or we know it will fit. For a 68000 or
2767 68010, force this mode anyways, because the
2768 larger modes aren't supported. */
2769 if (opP
->mode
== BASE
2770 && ((opP
->reg
>= ADDR0
2771 && opP
->reg
<= ADDR7
)
2774 if (siz1
== SIZE_BYTE
2775 || cpu_of_arch (current_architecture
) < m68020
2776 || arch_coldfire_p (current_architecture
)
2777 || (siz1
== SIZE_UNSPEC
2778 && ! isvar (&opP
->disp
)
2779 && issbyte (baseo
)))
2781 nextword
+= baseo
& 0xff;
2783 if (isvar (&opP
->disp
))
2785 /* Do a byte relocation. If it doesn't
2786 fit (possible on m68000) let the
2787 fixup processing complain later. */
2789 add_fix ('B', &opP
->disp
, 1, 1);
2791 add_fix ('B', &opP
->disp
, 0, 0);
2793 else if (siz1
!= SIZE_BYTE
)
2795 if (siz1
!= SIZE_UNSPEC
)
2796 as_warn (_("Forcing byte displacement"));
2797 if (! issbyte (baseo
))
2798 opP
->error
= _("byte displacement out of range");
2803 else if (siz1
== SIZE_UNSPEC
2805 && isvar (&opP
->disp
)
2806 && subs (&opP
->disp
) == NULL
2808 /* If the displacement needs pic
2809 relocation it cannot be relaxed. */
2810 && opP
->disp
.pic_reloc
== pic_none
2814 /* The code in md_convert_frag_1 needs to be
2815 able to adjust nextword. Call frag_grow
2816 to ensure that we have enough space in
2817 the frag obstack to make all the bytes
2820 nextword
+= baseo
& 0xff;
2822 add_frag (adds (&opP
->disp
),
2823 SEXT (offs (&opP
->disp
)),
2824 TAB (PCINDEX
, SZ_UNDEF
));
2832 nextword
|= 0x40; /* No index reg. */
2833 if (opP
->index
.reg
>= ZDATA0
2834 && opP
->index
.reg
<= ZDATA7
)
2835 nextword
|= (opP
->index
.reg
- ZDATA0
) << 12;
2836 else if (opP
->index
.reg
>= ZADDR0
2837 || opP
->index
.reg
<= ZADDR7
)
2838 nextword
|= (opP
->index
.reg
- ZADDR0
+ 8) << 12;
2841 /* It isn't simple. */
2843 if (cpu_of_arch (current_architecture
) < m68020
2844 || arch_coldfire_p (current_architecture
))
2846 _("invalid operand mode for this architecture; needs 68020 or higher");
2849 /* If the guy specified a width, we assume that it is
2850 wide enough. Maybe it isn't. If so, we lose. */
2854 if (isvar (&opP
->disp
)
2856 : ! issword (baseo
))
2861 else if (! isvar (&opP
->disp
) && baseo
== 0)
2870 as_warn (_(":b not permitted; defaulting to :w"));
2880 /* Figure out inner displacement stuff. */
2881 if (opP
->mode
== POST
|| opP
->mode
== PRE
)
2883 if (cpu_of_arch (current_architecture
) & cpu32
)
2884 opP
->error
= _("invalid operand mode for this architecture; needs 68020 or higher");
2888 if (isvar (&opP
->odisp
)
2890 : ! issword (outro
))
2895 else if (! isvar (&opP
->odisp
) && outro
== 0)
2904 as_warn (_(":b not permitted; defaulting to :w"));
2913 if (opP
->mode
== POST
2914 && (nextword
& 0x40) == 0)
2919 if (siz1
!= SIZE_UNSPEC
&& isvar (&opP
->disp
))
2921 if (opP
->reg
== PC
|| opP
->reg
== ZPC
)
2922 add_fix (siz1
== SIZE_LONG
? 'l' : 'w', &opP
->disp
, 1, 2);
2924 add_fix (siz1
== SIZE_LONG
? 'l' : 'w', &opP
->disp
, 0, 0);
2926 if (siz1
== SIZE_LONG
)
2927 addword (baseo
>> 16);
2928 if (siz1
!= SIZE_UNSPEC
)
2931 if (siz2
!= SIZE_UNSPEC
&& isvar (&opP
->odisp
))
2932 add_fix (siz2
== SIZE_LONG
? 'l' : 'w', &opP
->odisp
, 0, 0);
2933 if (siz2
== SIZE_LONG
)
2934 addword (outro
>> 16);
2935 if (siz2
!= SIZE_UNSPEC
)
2941 nextword
= get_num (&opP
->disp
, 90);
2942 switch (opP
->disp
.size
)
2947 if (!isvar (&opP
->disp
) && issword (offs (&opP
->disp
)))
2949 tmpreg
= 0x38; /* 7.0 */
2953 if (isvar (&opP
->disp
)
2954 && !subs (&opP
->disp
)
2955 && adds (&opP
->disp
)
2957 /* If the displacement needs pic relocation it
2958 cannot be relaxed. */
2959 && opP
->disp
.pic_reloc
== pic_none
2962 && !strchr ("~%&$?", s
[0]))
2964 tmpreg
= 0x3A; /* 7.2 */
2965 add_frag (adds (&opP
->disp
),
2966 SEXT (offs (&opP
->disp
)),
2967 TAB (ABSTOPCREL
, SZ_UNDEF
));
2970 /* Fall through into long. */
2972 if (isvar (&opP
->disp
))
2973 add_fix ('l', &opP
->disp
, 0, 0);
2975 tmpreg
= 0x39;/* 7.1 mode */
2976 addword (nextword
>> 16);
2981 as_bad (_("unsupported byte value; use a different suffix"));
2985 if (isvar (&opP
->disp
))
2986 add_fix ('w', &opP
->disp
, 0, 0);
2988 tmpreg
= 0x38;/* 7.0 mode */
2996 as_bad (_("unknown/incorrect operand"));
3000 /* If s[0] is '4', then this is for the mac instructions
3001 that can have a trailing_ampersand set. If so, set 0x100
3002 bit on tmpreg so install_gen_operand can check for it and
3003 set the appropriate bit (word2, bit 5). */
3006 if (opP
->trailing_ampersand
)
3009 install_gen_operand (s
[1], tmpreg
);
3015 { /* JF: I hate floating point! */
3030 tmpreg
= get_num (&opP
->disp
, tmpreg
);
3031 if (isvar (&opP
->disp
))
3032 add_fix (s
[1], &opP
->disp
, 0, 0);
3035 case 'b': /* Danger: These do no check for
3036 certain types of overflow.
3038 if (!isbyte (tmpreg
))
3039 opP
->error
= _("out of range");
3040 insop (tmpreg
, opcode
);
3041 if (isvar (&opP
->disp
))
3042 the_ins
.reloc
[the_ins
.nrel
- 1].n
=
3043 (opcode
->m_codenum
) * 2 + 1;
3046 if (!issbyte (tmpreg
))
3047 opP
->error
= _("out of range");
3048 the_ins
.opcode
[the_ins
.numo
- 1] |= tmpreg
& 0xff;
3049 if (isvar (&opP
->disp
))
3050 the_ins
.reloc
[the_ins
.nrel
- 1].n
= opcode
->m_codenum
* 2 - 1;
3053 if (!isword (tmpreg
))
3054 opP
->error
= _("out of range");
3055 insop (tmpreg
, opcode
);
3056 if (isvar (&opP
->disp
))
3057 the_ins
.reloc
[the_ins
.nrel
- 1].n
= (opcode
->m_codenum
) * 2;
3060 if (!issword (tmpreg
))
3061 opP
->error
= _("out of range");
3062 insop (tmpreg
, opcode
);
3063 if (isvar (&opP
->disp
))
3064 the_ins
.reloc
[the_ins
.nrel
- 1].n
= (opcode
->m_codenum
) * 2;
3067 /* Because of the way insop works, we put these two out
3069 insop (tmpreg
, opcode
);
3070 insop (tmpreg
>> 16, opcode
);
3071 if (isvar (&opP
->disp
))
3072 the_ins
.reloc
[the_ins
.nrel
- 1].n
= (opcode
->m_codenum
) * 2;
3079 install_operand (s
[1], tmpreg
);
3090 install_operand (s
[1], opP
->reg
- ADDR
);
3094 tmpreg
= get_num (&opP
->disp
, 90);
3099 add_fix ('B', &opP
->disp
, 1, -1);
3102 add_fix ('w', &opP
->disp
, 1, 0);
3107 the_ins
.opcode
[0] |= 0xff;
3108 add_fix ('l', &opP
->disp
, 1, 0);
3112 case 'g': /* Conditional branch */
3113 have_disp
= HAVE_LONG_CALL (current_architecture
);
3116 case 'b': /* Unconditional branch */
3117 have_disp
= HAVE_LONG_BRANCH (current_architecture
);
3118 use_pl
= LONG_BRANCH_VIA_COND (current_architecture
);
3121 case 's': /* Unconditional subroutine */
3122 have_disp
= HAVE_LONG_CALL (current_architecture
);
3125 if (subs (&opP
->disp
) /* We can't relax it. */
3127 /* If the displacement needs pic relocation it cannot be
3129 || opP
->disp
.pic_reloc
!= pic_none
3134 as_warn (_("Can't use long branches on this architecture"));
3138 /* This could either be a symbol, or an absolute
3139 address. If it's an absolute address, turn it into
3140 an absolute jump right here and keep it out of the
3142 if (adds (&opP
->disp
) == 0)
3144 if (the_ins
.opcode
[0] == 0x6000) /* jbra */
3145 the_ins
.opcode
[0] = 0x4EF9;
3146 else if (the_ins
.opcode
[0] == 0x6100) /* jbsr */
3147 the_ins
.opcode
[0] = 0x4EB9;
3150 the_ins
.opcode
[0] ^= 0x0100;
3151 the_ins
.opcode
[0] |= 0x0006;
3154 add_fix ('l', &opP
->disp
, 0, 0);
3160 /* Now we know it's going into the relaxer. Now figure
3161 out which mode. We try in this order of preference:
3162 long branch, absolute jump, byte/word branches only. */
3164 add_frag (adds (&opP
->disp
),
3165 SEXT (offs (&opP
->disp
)),
3166 TAB (BRANCHBWL
, SZ_UNDEF
));
3167 else if (! flag_keep_pcrel
)
3169 if ((the_ins
.opcode
[0] == 0x6000)
3170 || (the_ins
.opcode
[0] == 0x6100))
3171 add_frag (adds (&opP
->disp
),
3172 SEXT (offs (&opP
->disp
)),
3173 TAB (BRABSJUNC
, SZ_UNDEF
));
3175 add_frag (adds (&opP
->disp
),
3176 SEXT (offs (&opP
->disp
)),
3177 TAB (BRABSJCOND
, SZ_UNDEF
));
3180 add_frag (adds (&opP
->disp
),
3181 SEXT (offs (&opP
->disp
)),
3182 (use_pl
? TAB (BRANCHBWPL
, SZ_UNDEF
)
3183 : TAB (BRANCHBW
, SZ_UNDEF
)));
3186 if (isvar (&opP
->disp
))
3188 /* Check for DBcc instructions. We can relax them,
3189 but only if we have long branches and/or absolute
3191 if (((the_ins
.opcode
[0] & 0xf0f8) == 0x50c8)
3192 && (HAVE_LONG_BRANCH (current_architecture
)
3193 || ! flag_keep_pcrel
))
3195 if (HAVE_LONG_BRANCH (current_architecture
))
3196 add_frag (adds (&opP
->disp
),
3197 SEXT (offs (&opP
->disp
)),
3198 TAB (DBCCLBR
, SZ_UNDEF
));
3200 add_frag (adds (&opP
->disp
),
3201 SEXT (offs (&opP
->disp
)),
3202 TAB (DBCCABSJ
, SZ_UNDEF
));
3205 add_fix ('w', &opP
->disp
, 1, 0);
3209 case 'C': /* Fixed size LONG coproc branches. */
3210 add_fix ('l', &opP
->disp
, 1, 0);
3214 case 'c': /* Var size Coprocesssor branches. */
3215 if (subs (&opP
->disp
) || (adds (&opP
->disp
) == 0))
3217 the_ins
.opcode
[the_ins
.numo
- 1] |= 0x40;
3218 add_fix ('l', &opP
->disp
, 1, 0);
3223 add_frag (adds (&opP
->disp
),
3224 SEXT (offs (&opP
->disp
)),
3225 TAB (FBRANCH
, SZ_UNDEF
));
3232 case 'C': /* Ignore it. */
3235 case 'd': /* JF this is a kludge. */
3236 install_operand ('s', opP
->reg
- ADDR
);
3237 tmpreg
= get_num (&opP
->disp
, 90);
3238 if (!issword (tmpreg
))
3240 as_warn (_("Expression out of range, using 0"));
3247 install_operand (s
[1], opP
->reg
- DATA
);
3250 case 'e': /* EMAC ACCx, reg/reg. */
3251 install_operand (s
[1], opP
->reg
- ACC
);
3254 case 'E': /* Ignore it. */
3258 install_operand (s
[1], opP
->reg
- FP0
);
3261 case 'g': /* EMAC ACCEXTx. */
3262 install_operand (s
[1], opP
->reg
- ACCEXT01
);
3265 case 'G': /* Ignore it. */
3270 tmpreg
= opP
->reg
- COP0
;
3271 install_operand (s
[1], tmpreg
);
3274 case 'i': /* MAC/EMAC scale factor. */
3275 install_operand (s
[1], opP
->mode
== LSH
? 0x1 : 0x3);
3278 case 'J': /* JF foo. */
3419 install_operand (s
[1], tmpreg
);
3423 tmpreg
= get_num (&opP
->disp
, 55);
3424 install_operand (s
[1], tmpreg
& 0x7f);
3431 if (tmpreg
& 0x7FF0000)
3432 as_bad (_("Floating point register in register list"));
3433 insop (reverse_16_bits (tmpreg
), opcode
);
3437 if (tmpreg
& 0x700FFFF)
3438 as_bad (_("Wrong register in floating-point reglist"));
3439 install_operand (s
[1], reverse_8_bits (tmpreg
>> 16));
3447 if (tmpreg
& 0x7FF0000)
3448 as_bad (_("Floating point register in register list"));
3449 insop (tmpreg
, opcode
);
3451 else if (s
[1] == '8')
3453 if (tmpreg
& 0x0FFFFFF)
3454 as_bad (_("incorrect register in reglist"));
3455 install_operand (s
[1], tmpreg
>> 24);
3459 if (tmpreg
& 0x700FFFF)
3460 as_bad (_("wrong register in floating-point reglist"));
3462 install_operand (s
[1], tmpreg
>> 16);
3467 install_operand (s
[1], get_num (&opP
->disp
, 60));
3471 tmpreg
= ((opP
->mode
== DREG
)
3472 ? 0x20 + (int) (opP
->reg
- DATA
)
3473 : (get_num (&opP
->disp
, 40) & 0x1F));
3474 install_operand (s
[1], tmpreg
);
3478 tmpreg
= get_num (&opP
->disp
, 10);
3481 install_operand (s
[1], tmpreg
);
3485 /* This depends on the fact that ADDR registers are eight
3486 more than their corresponding DATA regs, so the result
3487 will have the ADDR_REG bit set. */
3488 install_operand (s
[1], opP
->reg
- DATA
);
3492 if (opP
->mode
== AINDR
)
3493 install_operand (s
[1], opP
->reg
- DATA
);
3495 install_operand (s
[1], opP
->index
.reg
- DATA
);
3499 if (opP
->reg
== FPI
)
3501 else if (opP
->reg
== FPS
)
3503 else if (opP
->reg
== FPC
)
3507 install_operand (s
[1], tmpreg
);
3510 case 'S': /* Ignore it. */
3514 install_operand (s
[1], get_num (&opP
->disp
, 30));
3517 case 'U': /* Ignore it. */
3536 as_fatal (_("failed sanity check"));
3537 } /* switch on cache token. */
3538 install_operand (s
[1], tmpreg
);
3541 /* JF: These are out of order, I fear. */
3554 install_operand (s
[1], tmpreg
);
3580 install_operand (s
[1], tmpreg
);
3584 if (opP
->reg
== VAL
)
3603 install_operand (s
[1], tmpreg
);
3617 tmpreg
= (4 << 10) | ((opP
->reg
- BAD
) << 2);
3628 tmpreg
= (5 << 10) | ((opP
->reg
- BAC
) << 2);
3634 install_operand (s
[1], tmpreg
);
3637 know (opP
->reg
== PSR
);
3640 know (opP
->reg
== PCSR
);
3655 install_operand (s
[1], tmpreg
);
3658 tmpreg
= get_num (&opP
->disp
, 20);
3659 install_operand (s
[1], tmpreg
);
3661 case '_': /* used only for move16 absolute 32-bit address. */
3662 if (isvar (&opP
->disp
))
3663 add_fix ('l', &opP
->disp
, 0, 0);
3664 tmpreg
= get_num (&opP
->disp
, 90);
3665 addword (tmpreg
>> 16);
3666 addword (tmpreg
& 0xFFFF);
3669 install_operand (s
[1], opP
->reg
- DATA0L
);
3670 opP
->reg
-= (DATA0L
);
3671 opP
->reg
&= 0x0F; /* remove upper/lower bit. */
3674 tmpreg
= get_num (&opP
->disp
, 80);
3677 install_operand (s
[1], tmpreg
);
3680 tmpreg
= get_num (&opP
->disp
, 10);
3681 install_operand (s
[1], tmpreg
- 1);
3684 tmpreg
= get_num (&opP
->disp
, 65);
3685 install_operand (s
[1], tmpreg
);
3692 /* By the time whe get here (FINALLY) the_ins contains the complete
3693 instruction, ready to be emitted. . . */
3697 reverse_16_bits (int in
)
3702 static int mask
[16] =
3704 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
3705 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000
3707 for (n
= 0; n
< 16; n
++)
3710 out
|= mask
[15 - n
];
3713 } /* reverse_16_bits() */
3716 reverse_8_bits (int in
)
3721 static int mask
[8] =
3723 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
3726 for (n
= 0; n
< 8; n
++)
3732 } /* reverse_8_bits() */
3734 /* Cause an extra frag to be generated here, inserting up to
3735 FRAG_VAR_SIZE bytes. TYPE is the subtype of the frag to be
3736 generated; its primary type is rs_machine_dependent.
3738 The TYPE parameter is also used by md_convert_frag_1 and
3739 md_estimate_size_before_relax. The appropriate type of fixup will
3740 be emitted by md_convert_frag_1.
3742 ADD becomes the FR_SYMBOL field of the frag, and OFF the FR_OFFSET. */
3744 install_operand (int mode
, int val
)
3749 the_ins
.opcode
[0] |= val
& 0xFF; /* JF FF is for M kludge. */
3752 the_ins
.opcode
[0] |= val
<< 9;
3755 the_ins
.opcode
[1] |= val
<< 9;
3758 the_ins
.opcode
[1] |= val
<< 12;
3761 the_ins
.opcode
[1] |= val
<< 6;
3764 the_ins
.opcode
[1] |= val
;
3767 the_ins
.opcode
[2] |= val
<< 12;
3770 the_ins
.opcode
[2] |= val
<< 6;
3773 /* DANGER! This is a hack to force cas2l and cas2w cmds to be
3774 three words long! */
3776 the_ins
.opcode
[2] |= val
;
3779 the_ins
.opcode
[1] |= val
<< 7;
3782 the_ins
.opcode
[1] |= val
<< 10;
3786 the_ins
.opcode
[1] |= val
<< 5;
3791 the_ins
.opcode
[1] |= (val
<< 10) | (val
<< 7);
3794 the_ins
.opcode
[1] |= (val
<< 12) | val
;
3797 the_ins
.opcode
[0] |= val
= 0xff;
3800 the_ins
.opcode
[0] |= val
<< 9;
3803 the_ins
.opcode
[1] |= val
;
3806 the_ins
.opcode
[1] |= val
;
3807 the_ins
.numo
++; /* What a hack. */
3810 the_ins
.opcode
[1] |= val
<< 4;
3818 the_ins
.opcode
[0] |= (val
<< 6);
3821 the_ins
.opcode
[1] = (val
>> 16);
3822 the_ins
.opcode
[2] = val
& 0xffff;
3825 the_ins
.opcode
[0] |= ((val
& 0x8) << (6 - 3));
3826 the_ins
.opcode
[0] |= ((val
& 0x7) << 9);
3827 the_ins
.opcode
[1] |= ((val
& 0x10) << (7 - 4));
3829 case 'n': /* MAC/EMAC Rx on !load. */
3830 the_ins
.opcode
[0] |= ((val
& 0x8) << (6 - 3));
3831 the_ins
.opcode
[0] |= ((val
& 0x7) << 9);
3832 the_ins
.opcode
[1] |= ((val
& 0x10) << (7 - 4));
3834 case 'o': /* MAC/EMAC Rx on load. */
3835 the_ins
.opcode
[1] |= val
<< 12;
3836 the_ins
.opcode
[1] |= ((val
& 0x10) << (7 - 4));
3838 case 'M': /* MAC/EMAC Ry on !load. */
3839 the_ins
.opcode
[0] |= (val
& 0xF);
3840 the_ins
.opcode
[1] |= ((val
& 0x10) << (6 - 4));
3842 case 'N': /* MAC/EMAC Ry on load. */
3843 the_ins
.opcode
[1] |= (val
& 0xF);
3844 the_ins
.opcode
[1] |= ((val
& 0x10) << (6 - 4));
3847 the_ins
.opcode
[1] |= ((val
!= 1) << 10);
3850 the_ins
.opcode
[0] |= ((val
& 0x3) << 9);
3853 the_ins
.opcode
[0] |= ((val
& 0x3) << 0);
3855 case 'G': /* EMAC accumulator in a EMAC load instruction. */
3856 the_ins
.opcode
[0] |= ((~val
& 0x1) << 7);
3857 the_ins
.opcode
[1] |= ((val
& 0x2) << (4 - 1));
3859 case 'H': /* EMAC accumulator in a EMAC non-load instruction. */
3860 the_ins
.opcode
[0] |= ((val
& 0x1) << 7);
3861 the_ins
.opcode
[1] |= ((val
& 0x2) << (4 - 1));
3864 the_ins
.opcode
[1] |= ((val
& 0x3) << 9);
3867 the_ins
.opcode
[0] |= (val
& 0x1) <<10;
3871 as_fatal (_("failed sanity check."));
3876 install_gen_operand (int mode
, int val
)
3880 case '/': /* Special for mask loads for mac/msac insns with
3881 possible mask; trailing_ampersend set in bit 8. */
3882 the_ins
.opcode
[0] |= (val
& 0x3f);
3883 the_ins
.opcode
[1] |= (((val
& 0x100) >> 8) << 5);
3886 the_ins
.opcode
[0] |= val
;
3889 /* This is a kludge!!! */
3890 the_ins
.opcode
[0] |= (val
& 0x07) << 9 | (val
& 0x38) << 3;
3899 the_ins
.opcode
[0] |= val
;
3901 /* more stuff goes here. */
3903 as_fatal (_("failed sanity check."));
3907 /* Verify that we have some number of paren pairs, do m68k_ip_op(), and
3908 then deal with the bitfield hack. */
3911 crack_operand (char *str
, struct m68k_op
*opP
)
3913 register int parens
;
3915 register char *beg_str
;
3923 for (parens
= 0; *str
&& (parens
> 0 || inquote
|| notend (str
)); str
++)
3929 else if (*str
== ')')
3933 opP
->error
= _("Extra )");
3939 if (flag_mri
&& *str
== '\'')
3940 inquote
= ! inquote
;
3942 if (!*str
&& parens
)
3944 opP
->error
= _("Missing )");
3949 if (m68k_ip_op (beg_str
, opP
) != 0)
3956 c
= *++str
; /* JF bitfield hack. */
3961 as_bad (_("Missing operand"));
3964 /* Detect MRI REG symbols and convert them to REGLSTs. */
3965 if (opP
->mode
== CONTROL
&& (int)opP
->reg
< 0)
3968 opP
->mask
= ~(int)opP
->reg
;
3975 /* This is the guts of the machine-dependent assembler. STR points to a
3976 machine dependent instruction. This function is supposed to emit
3977 the frags/bytes it assembles to.
3981 insert_reg (const char *regname
, int regnum
)
3986 #ifdef REGISTER_PREFIX
3987 if (!flag_reg_prefix_optional
)
3989 buf
[0] = REGISTER_PREFIX
;
3990 strcpy (buf
+ 1, regname
);
3995 symbol_table_insert (symbol_new (regname
, reg_section
, regnum
,
3996 &zero_address_frag
));
3998 for (i
= 0; regname
[i
]; i
++)
3999 buf
[i
] = TOUPPER (regname
[i
]);
4002 symbol_table_insert (symbol_new (buf
, reg_section
, regnum
,
4003 &zero_address_frag
));
4012 static const struct init_entry init_table
[] =
4072 { "accext01", ACCEXT01
},
4073 { "accext23", ACCEXT23
},
4077 /* Control registers. */
4078 { "sfc", SFC
}, /* Source Function Code. */
4080 { "dfc", DFC
}, /* Destination Function Code. */
4082 { "cacr", CACR
}, /* Cache Control Register. */
4083 { "caar", CAAR
}, /* Cache Address Register. */
4084 { "cpucr", CPUCR
}, /* CPU Control Register. */
4086 { "usp", USP
}, /* User Stack Pointer. */
4087 { "vbr", VBR
}, /* Vector Base Register. */
4088 { "msp", MSP
}, /* Master Stack Pointer. */
4089 { "isp", ISP
}, /* Interrupt Stack Pointer. */
4091 { "itt0", ITT0
}, /* Instruction Transparent Translation Reg 0. */
4092 { "itt1", ITT1
}, /* Instruction Transparent Translation Reg 1. */
4093 { "dtt0", DTT0
}, /* Data Transparent Translation Register 0. */
4094 { "dtt1", DTT1
}, /* Data Transparent Translation Register 1. */
4096 /* 68ec040 versions of same */
4097 { "iacr0", ITT0
}, /* Instruction Access Control Register 0. */
4098 { "iacr1", ITT1
}, /* Instruction Access Control Register 0. */
4099 { "dacr0", DTT0
}, /* Data Access Control Register 0. */
4100 { "dacr1", DTT1
}, /* Data Access Control Register 0. */
4102 /* Coldfire versions of same. The ColdFire programmer's reference
4103 manual indicated that the order is 2,3,0,1, but Ken Rose
4104 <rose@netcom.com> says that 0,1,2,3 is the correct order. */
4105 { "acr0", ACR0
}, /* Access Control Unit 0. */
4106 { "acr1", ACR1
}, /* Access Control Unit 1. */
4107 { "acr2", ACR2
}, /* Access Control Unit 2. */
4108 { "acr3", ACR3
}, /* Access Control Unit 3. */
4110 { "tc", TC
}, /* MMU Translation Control Register. */
4114 { "mmusr", MMUSR
}, /* MMU Status Register. */
4115 { "srp", SRP
}, /* User Root Pointer. */
4116 { "urp", URP
}, /* Supervisor Root Pointer. */
4119 { "mmubar", MMUBAR
},
4122 { "rombar", ROMBAR
}, /* ROM Base Address Register. */
4123 { "rambar0", RAMBAR0
}, /* ROM Base Address Register. */
4124 { "rambar1", RAMBAR1
}, /* ROM Base Address Register. */
4125 { "mbar", MBAR
}, /* Module Base Address Register. */
4127 { "mbar0", MBAR0
}, /* mcfv4e registers. */
4128 { "mbar1", MBAR1
}, /* mcfv4e registers. */
4129 { "rombar0", ROMBAR0
}, /* mcfv4e registers. */
4130 { "rombar1", ROMBAR1
}, /* mcfv4e registers. */
4131 { "mpcr", MPCR
}, /* mcfv4e registers. */
4132 { "edrambar", EDRAMBAR
}, /* mcfv4e registers. */
4133 { "secmbar", SECMBAR
}, /* mcfv4e registers. */
4134 { "asid", TC
}, /* mcfv4e registers. */
4135 { "mmubar", BUSCR
}, /* mcfv4e registers. */
4136 { "pcr1u0", PCR1U0
}, /* mcfv4e registers. */
4137 { "pcr1l0", PCR1L0
}, /* mcfv4e registers. */
4138 { "pcr2u0", PCR2U0
}, /* mcfv4e registers. */
4139 { "pcr2l0", PCR2L0
}, /* mcfv4e registers. */
4140 { "pcr3u0", PCR3U0
}, /* mcfv4e registers. */
4141 { "pcr3l0", PCR3L0
}, /* mcfv4e registers. */
4142 { "pcr1u1", PCR1U1
}, /* mcfv4e registers. */
4143 { "pcr1l1", PCR1L1
}, /* mcfv4e registers. */
4144 { "pcr2u1", PCR2U1
}, /* mcfv4e registers. */
4145 { "pcr2l1", PCR2L1
}, /* mcfv4e registers. */
4146 { "pcr3u1", PCR3U1
}, /* mcfv4e registers. */
4147 { "pcr3l1", PCR3L1
}, /* mcfv4e registers. */
4149 { "flashbar", FLASHBAR
}, /* mcf528x registers. */
4150 { "rambar", RAMBAR
}, /* mcf528x registers. */
4152 { "mbar2", MBAR2
}, /* mcf5249 registers. */
4154 { "cac", CAC
}, /* fido registers. */
4155 { "mbb", MBO
}, /* fido registers (obsolete). */
4156 { "mbo", MBO
}, /* fido registers. */
4157 /* End of control registers. */
4191 /* 68ec030 versions of same. */
4194 /* 68ec030 access control unit, identical to 030 MMU status reg. */
4197 /* Suppressed data and address registers. */
4215 /* Upper and lower data and address registers, used by macw and msacw. */
4256 init_regtable (void)
4259 for (i
= 0; init_table
[i
].name
; i
++)
4260 insert_reg (init_table
[i
].name
, init_table
[i
].number
);
4264 md_assemble (char *str
)
4271 int shorts_this_frag
;
4274 if (!selected_cpu
&& !selected_arch
)
4276 /* We've not selected an architecture yet. Set the default
4277 now. We do this lazily so that an initial .cpu or .arch directive
4279 if (!m68k_set_cpu (TARGET_CPU
, 1, 1))
4280 as_bad (_("unrecognized default cpu `%s'"), TARGET_CPU
);
4285 /* In MRI mode, the instruction and operands are separated by a
4286 space. Anything following the operands is a comment. The label
4287 has already been removed. */
4295 for (s
= str
; *s
!= '\0'; s
++)
4297 if ((*s
== ' ' || *s
== '\t') && ! inquote
)
4315 inquote
= ! inquote
;
4320 memset (&the_ins
, '\0', sizeof (the_ins
));
4325 for (n
= 0; n
< the_ins
.numargs
; n
++)
4326 if (the_ins
.operands
[n
].error
)
4328 er
= the_ins
.operands
[n
].error
;
4334 as_bad (_("%s -- statement `%s' ignored"), er
, str
);
4338 /* If there is a current label, record that it marks an instruction. */
4339 if (current_label
!= NULL
)
4341 current_label
->text
= 1;
4342 current_label
= NULL
;
4346 /* Tie dwarf2 debug info to the address at the start of the insn. */
4347 dwarf2_emit_insn (0);
4350 if (the_ins
.nfrag
== 0)
4352 /* No frag hacking involved; just put it out. */
4353 toP
= frag_more (2 * the_ins
.numo
);
4354 fromP
= &the_ins
.opcode
[0];
4355 for (m
= the_ins
.numo
; m
; --m
)
4357 md_number_to_chars (toP
, (long) (*fromP
), 2);
4361 /* Put out symbol-dependent info. */
4362 for (m
= 0; m
< the_ins
.nrel
; m
++)
4364 switch (the_ins
.reloc
[m
].wid
)
4383 as_fatal (_("Don't know how to figure width of %c in md_assemble()"),
4384 the_ins
.reloc
[m
].wid
);
4387 fixP
= fix_new_exp (frag_now
,
4388 ((toP
- frag_now
->fr_literal
)
4389 - the_ins
.numo
* 2 + the_ins
.reloc
[m
].n
),
4391 &the_ins
.reloc
[m
].exp
,
4392 the_ins
.reloc
[m
].pcrel
,
4393 get_reloc_code (n
, the_ins
.reloc
[m
].pcrel
,
4394 the_ins
.reloc
[m
].pic_reloc
));
4395 fixP
->fx_pcrel_adjust
= the_ins
.reloc
[m
].pcrel_fix
;
4396 if (the_ins
.reloc
[m
].wid
== 'B')
4397 fixP
->fx_signed
= 1;
4402 /* There's some frag hacking. */
4404 /* Calculate the max frag size. */
4407 wid
= 2 * the_ins
.fragb
[0].fragoff
;
4408 for (n
= 1; n
< the_ins
.nfrag
; n
++)
4409 wid
+= 2 * (the_ins
.numo
- the_ins
.fragb
[n
- 1].fragoff
);
4410 /* frag_var part. */
4411 wid
+= FRAG_VAR_SIZE
;
4412 /* Make sure the whole insn fits in one chunk, in particular that
4413 the var part is attached, as we access one byte before the
4414 variable frag for byte branches. */
4418 for (n
= 0, fromP
= &the_ins
.opcode
[0]; n
< the_ins
.nfrag
; n
++)
4423 wid
= 2 * the_ins
.fragb
[n
].fragoff
;
4425 wid
= 2 * (the_ins
.numo
- the_ins
.fragb
[n
- 1].fragoff
);
4426 toP
= frag_more (wid
);
4428 shorts_this_frag
= 0;
4429 for (m
= wid
/ 2; m
; --m
)
4431 md_number_to_chars (toP
, (long) (*fromP
), 2);
4436 for (m
= 0; m
< the_ins
.nrel
; m
++)
4438 if ((the_ins
.reloc
[m
].n
) >= 2 * shorts_this_frag
)
4440 the_ins
.reloc
[m
].n
-= 2 * shorts_this_frag
;
4443 wid
= the_ins
.reloc
[m
].wid
;
4446 the_ins
.reloc
[m
].wid
= 0;
4447 wid
= (wid
== 'b') ? 1 : (wid
== 'w') ? 2 : (wid
== 'l') ? 4 : 4000;
4449 fixP
= fix_new_exp (frag_now
,
4450 ((toP
- frag_now
->fr_literal
)
4451 - the_ins
.numo
* 2 + the_ins
.reloc
[m
].n
),
4453 &the_ins
.reloc
[m
].exp
,
4454 the_ins
.reloc
[m
].pcrel
,
4455 get_reloc_code (wid
, the_ins
.reloc
[m
].pcrel
,
4456 the_ins
.reloc
[m
].pic_reloc
));
4457 fixP
->fx_pcrel_adjust
= the_ins
.reloc
[m
].pcrel_fix
;
4459 (void) frag_var (rs_machine_dependent
, FRAG_VAR_SIZE
, 0,
4460 (relax_substateT
) (the_ins
.fragb
[n
].fragty
),
4461 the_ins
.fragb
[n
].fadd
, the_ins
.fragb
[n
].foff
, to_beg_P
);
4463 n
= (the_ins
.numo
- the_ins
.fragb
[n
- 1].fragoff
);
4464 shorts_this_frag
= 0;
4467 toP
= frag_more (n
* 2);
4470 md_number_to_chars (toP
, (long) (*fromP
), 2);
4476 for (m
= 0; m
< the_ins
.nrel
; m
++)
4480 wid
= the_ins
.reloc
[m
].wid
;
4483 the_ins
.reloc
[m
].wid
= 0;
4484 wid
= (wid
== 'b') ? 1 : (wid
== 'w') ? 2 : (wid
== 'l') ? 4 : 4000;
4486 fixP
= fix_new_exp (frag_now
,
4487 ((the_ins
.reloc
[m
].n
+ toP
- frag_now
->fr_literal
)
4488 - shorts_this_frag
* 2),
4490 &the_ins
.reloc
[m
].exp
,
4491 the_ins
.reloc
[m
].pcrel
,
4492 get_reloc_code (wid
, the_ins
.reloc
[m
].pcrel
,
4493 the_ins
.reloc
[m
].pic_reloc
));
4494 fixP
->fx_pcrel_adjust
= the_ins
.reloc
[m
].pcrel_fix
;
4498 /* Comparison function used by qsort to rank the opcode entries by name. */
4501 m68k_compare_opcode (const void * v1
, const void * v2
)
4503 struct m68k_opcode
* op1
, * op2
;
4509 op1
= *(struct m68k_opcode
**) v1
;
4510 op2
= *(struct m68k_opcode
**) v2
;
4512 /* Compare the two names. If different, return the comparison.
4513 If the same, return the order they are in the opcode table. */
4514 ret
= strcmp (op1
->name
, op2
->name
);
4525 const struct m68k_opcode
*ins
;
4526 struct m68k_incant
*hack
, *slak
;
4527 const char *retval
= 0; /* Empty string, or error msg text. */
4530 /* Set up hash tables with 68000 instructions.
4531 similar to what the vax assembler does. */
4532 /* RMS claims the thing to do is take the m68k-opcode.h table, and make
4533 a copy of it at runtime, adding in the information we want but isn't
4534 there. I think it'd be better to have an awk script hack the table
4535 at compile time. Or even just xstr the table and use it as-is. But
4536 my lord ghod hath spoken, so we do it this way. Excuse the ugly var
4541 flag_reg_prefix_optional
= 1;
4543 if (! m68k_rel32_from_cmdline
)
4547 /* First sort the opcode table into alphabetical order to seperate
4548 the order that the assembler wants to see the opcodes from the
4549 order that the disassembler wants to see them. */
4550 m68k_sorted_opcodes
= xmalloc (m68k_numopcodes
* sizeof (* m68k_sorted_opcodes
));
4551 if (!m68k_sorted_opcodes
)
4552 as_fatal (_("Internal Error: Can't allocate m68k_sorted_opcodes of size %d"),
4553 m68k_numopcodes
* ((int) sizeof (* m68k_sorted_opcodes
)));
4555 for (i
= m68k_numopcodes
; i
--;)
4556 m68k_sorted_opcodes
[i
] = m68k_opcodes
+ i
;
4558 qsort (m68k_sorted_opcodes
, m68k_numopcodes
,
4559 sizeof (m68k_sorted_opcodes
[0]), m68k_compare_opcode
);
4561 op_hash
= hash_new ();
4563 obstack_begin (&robyn
, 4000);
4564 for (i
= 0; i
< m68k_numopcodes
; i
++)
4566 hack
= slak
= obstack_alloc (&robyn
, sizeof (struct m68k_incant
));
4569 ins
= m68k_sorted_opcodes
[i
];
4571 /* We must enter all insns into the table, because .arch and
4572 .cpu directives can change things. */
4573 slak
->m_operands
= ins
->args
;
4574 slak
->m_arch
= ins
->arch
;
4575 slak
->m_opcode
= ins
->opcode
;
4577 /* In most cases we can determine the number of opcode words
4578 by checking the second word of the mask. Unfortunately
4579 some instructions have 2 opcode words, but no fixed bits
4580 in the second word. A leading dot in the operands
4581 string also indicates 2 opcodes. */
4582 if (*slak
->m_operands
== '.')
4585 slak
->m_codenum
= 2;
4587 else if (ins
->match
& 0xffffL
)
4588 slak
->m_codenum
= 2;
4590 slak
->m_codenum
= 1;
4591 slak
->m_opnum
= strlen (slak
->m_operands
) / 2;
4593 if (i
+ 1 != m68k_numopcodes
4594 && !strcmp (ins
->name
, m68k_sorted_opcodes
[i
+ 1]->name
))
4596 slak
->m_next
= obstack_alloc (&robyn
, sizeof (struct m68k_incant
));
4601 slak
= slak
->m_next
;
4605 retval
= hash_insert (op_hash
, ins
->name
, (char *) hack
);
4607 as_fatal (_("Internal Error: Can't hash %s: %s"), ins
->name
, retval
);
4610 for (i
= 0; i
< m68k_numaliases
; i
++)
4612 const char *name
= m68k_opcode_aliases
[i
].primary
;
4613 const char *alias
= m68k_opcode_aliases
[i
].alias
;
4614 void *val
= hash_find (op_hash
, name
);
4617 as_fatal (_("Internal Error: Can't find %s in hash table"), name
);
4618 retval
= hash_insert (op_hash
, alias
, val
);
4620 as_fatal (_("Internal Error: Can't hash %s: %s"), alias
, retval
);
4623 /* In MRI mode, all unsized branches are variable sized. Normally,
4624 they are word sized. */
4627 static struct m68k_opcode_alias mri_aliases
[] =
4648 i
< (int) (sizeof mri_aliases
/ sizeof mri_aliases
[0]);
4651 const char *name
= mri_aliases
[i
].primary
;
4652 const char *alias
= mri_aliases
[i
].alias
;
4653 void *val
= hash_find (op_hash
, name
);
4656 as_fatal (_("Internal Error: Can't find %s in hash table"), name
);
4657 retval
= hash_jam (op_hash
, alias
, val
);
4659 as_fatal (_("Internal Error: Can't hash %s: %s"), alias
, retval
);
4663 for (i
= 0; i
< (int) sizeof (notend_table
); i
++)
4665 notend_table
[i
] = 0;
4666 alt_notend_table
[i
] = 0;
4669 notend_table
[','] = 1;
4670 notend_table
['{'] = 1;
4671 notend_table
['}'] = 1;
4672 alt_notend_table
['a'] = 1;
4673 alt_notend_table
['A'] = 1;
4674 alt_notend_table
['d'] = 1;
4675 alt_notend_table
['D'] = 1;
4676 alt_notend_table
['#'] = 1;
4677 alt_notend_table
['&'] = 1;
4678 alt_notend_table
['f'] = 1;
4679 alt_notend_table
['F'] = 1;
4680 #ifdef REGISTER_PREFIX
4681 alt_notend_table
[REGISTER_PREFIX
] = 1;
4684 /* We need to put '(' in alt_notend_table to handle
4685 cas2 %d0:%d2,%d3:%d4,(%a0):(%a1) */
4686 alt_notend_table
['('] = 1;
4688 /* We need to put '@' in alt_notend_table to handle
4689 cas2 %d0:%d2,%d3:%d4,@(%d0):@(%d1) */
4690 alt_notend_table
['@'] = 1;
4692 /* We need to put digits in alt_notend_table to handle
4693 bfextu %d0{24:1},%d0 */
4694 alt_notend_table
['0'] = 1;
4695 alt_notend_table
['1'] = 1;
4696 alt_notend_table
['2'] = 1;
4697 alt_notend_table
['3'] = 1;
4698 alt_notend_table
['4'] = 1;
4699 alt_notend_table
['5'] = 1;
4700 alt_notend_table
['6'] = 1;
4701 alt_notend_table
['7'] = 1;
4702 alt_notend_table
['8'] = 1;
4703 alt_notend_table
['9'] = 1;
4705 #ifndef MIT_SYNTAX_ONLY
4706 /* Insert pseudo ops, these have to go into the opcode table since
4707 gas expects pseudo ops to start with a dot. */
4711 while (mote_pseudo_table
[n
].poc_name
)
4713 hack
= obstack_alloc (&robyn
, sizeof (struct m68k_incant
));
4714 hash_insert (op_hash
,
4715 mote_pseudo_table
[n
].poc_name
, (char *) hack
);
4716 hack
->m_operands
= 0;
4726 record_alignment (text_section
, 2);
4727 record_alignment (data_section
, 2);
4728 record_alignment (bss_section
, 2);
4733 /* This is called when a label is defined. */
4736 m68k_frob_label (symbolS
*sym
)
4738 struct label_line
*n
;
4740 n
= (struct label_line
*) xmalloc (sizeof *n
);
4743 as_where (&n
->file
, &n
->line
);
4749 dwarf2_emit_label (sym
);
4753 /* This is called when a value that is not an instruction is emitted. */
4756 m68k_flush_pending_output (void)
4758 current_label
= NULL
;
4761 /* This is called at the end of the assembly, when the final value of
4762 the label is known. We warn if this is a text symbol aligned at an
4766 m68k_frob_symbol (symbolS
*sym
)
4768 if (S_GET_SEGMENT (sym
) == reg_section
4769 && (int) S_GET_VALUE (sym
) < 0)
4771 S_SET_SEGMENT (sym
, absolute_section
);
4772 S_SET_VALUE (sym
, ~(int)S_GET_VALUE (sym
));
4774 else if ((S_GET_VALUE (sym
) & 1) != 0)
4776 struct label_line
*l
;
4778 for (l
= labels
; l
!= NULL
; l
= l
->next
)
4780 if (l
->label
== sym
)
4783 as_warn_where (l
->file
, l
->line
,
4784 _("text label `%s' aligned to odd boundary"),
4792 /* This is called if we go in or out of MRI mode because of the .mri
4796 m68k_mri_mode_change (int on
)
4800 if (! flag_reg_prefix_optional
)
4802 flag_reg_prefix_optional
= 1;
4803 #ifdef REGISTER_PREFIX
4808 if (! m68k_rel32_from_cmdline
)
4813 if (! reg_prefix_optional_seen
)
4815 #ifdef REGISTER_PREFIX_OPTIONAL
4816 flag_reg_prefix_optional
= REGISTER_PREFIX_OPTIONAL
;
4818 flag_reg_prefix_optional
= 0;
4820 #ifdef REGISTER_PREFIX
4825 if (! m68k_rel32_from_cmdline
)
4831 md_atof (int type
, char *litP
, int *sizeP
)
4833 return ieee_md_atof (type
, litP
, sizeP
, TRUE
);
4837 md_number_to_chars (char *buf
, valueT val
, int n
)
4839 number_to_chars_bigendian (buf
, val
, n
);
4843 md_apply_fix (fixS
*fixP
, valueT
*valP
, segT seg ATTRIBUTE_UNUSED
)
4845 offsetT val
= *valP
;
4846 addressT upper_limit
;
4847 offsetT lower_limit
;
4849 /* This is unnecessary but it convinces the native rs6000 compiler
4850 to generate the code we want. */
4851 char *buf
= fixP
->fx_frag
->fr_literal
;
4852 buf
+= fixP
->fx_where
;
4853 /* End ibm compiler workaround. */
4857 if (fixP
->fx_addsy
== NULL
&& fixP
->fx_pcrel
== 0)
4863 memset (buf
, 0, fixP
->fx_size
);
4864 fixP
->fx_addnumber
= val
; /* Remember value for emit_reloc. */
4866 if (fixP
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
4867 && !S_IS_DEFINED (fixP
->fx_addsy
)
4868 && !S_IS_WEAK (fixP
->fx_addsy
))
4869 S_SET_WEAK (fixP
->fx_addsy
);
4871 switch (fixP
->fx_r_type
)
4873 case BFD_RELOC_68K_TLS_GD32
:
4874 case BFD_RELOC_68K_TLS_GD16
:
4875 case BFD_RELOC_68K_TLS_GD8
:
4876 case BFD_RELOC_68K_TLS_LDM32
:
4877 case BFD_RELOC_68K_TLS_LDM16
:
4878 case BFD_RELOC_68K_TLS_LDM8
:
4879 case BFD_RELOC_68K_TLS_LDO32
:
4880 case BFD_RELOC_68K_TLS_LDO16
:
4881 case BFD_RELOC_68K_TLS_LDO8
:
4882 case BFD_RELOC_68K_TLS_IE32
:
4883 case BFD_RELOC_68K_TLS_IE16
:
4884 case BFD_RELOC_68K_TLS_IE8
:
4885 case BFD_RELOC_68K_TLS_LE32
:
4886 case BFD_RELOC_68K_TLS_LE16
:
4887 case BFD_RELOC_68K_TLS_LE8
:
4888 S_SET_THREAD_LOCAL (fixP
->fx_addsy
);
4897 #elif defined(OBJ_AOUT)
4898 /* PR gas/3041 Do not fix frags referencing a weak symbol. */
4899 if (fixP
->fx_addsy
&& S_IS_WEAK (fixP
->fx_addsy
))
4901 memset (buf
, 0, fixP
->fx_size
);
4902 fixP
->fx_addnumber
= val
; /* Remember value for emit_reloc. */
4907 if (fixP
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
4908 || fixP
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
)
4911 switch (fixP
->fx_size
)
4913 /* The cast to offsetT below are necessary to make code
4914 correct for machines where ints are smaller than offsetT. */
4918 lower_limit
= - (offsetT
) 0x80;
4921 *buf
++ = (val
>> 8);
4923 upper_limit
= 0x7fff;
4924 lower_limit
= - (offsetT
) 0x8000;
4927 *buf
++ = (val
>> 24);
4928 *buf
++ = (val
>> 16);
4929 *buf
++ = (val
>> 8);
4931 upper_limit
= 0x7fffffff;
4932 lower_limit
= - (offsetT
) 0x7fffffff - 1; /* Avoid constant overflow. */
4935 BAD_CASE (fixP
->fx_size
);
4938 /* Fix up a negative reloc. */
4939 if (fixP
->fx_addsy
== NULL
&& fixP
->fx_subsy
!= NULL
)
4941 fixP
->fx_addsy
= fixP
->fx_subsy
;
4942 fixP
->fx_subsy
= NULL
;
4946 /* For non-pc-relative values, it's conceivable we might get something
4947 like "0xff" for a byte field. So extend the upper part of the range
4948 to accept such numbers. We arbitrarily disallow "-0xff" or "0xff+0xff",
4949 so that we can do any range checking at all. */
4950 if (! fixP
->fx_pcrel
&& ! fixP
->fx_signed
)
4951 upper_limit
= upper_limit
* 2 + 1;
4953 if ((addressT
) val
> upper_limit
4954 && (val
> 0 || val
< lower_limit
))
4955 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
4956 _("value %ld out of range"), (long)val
);
4958 /* A one byte PC-relative reloc means a short branch. We can't use
4959 a short branch with a value of 0 or -1, because those indicate
4960 different opcodes (branches with longer offsets). fixup_segment
4961 in write.c may have clobbered fx_pcrel, so we need to examine the
4964 || fixP
->fx_r_type
== BFD_RELOC_8_PCREL
)
4965 && fixP
->fx_size
== 1
4966 && (fixP
->fx_addsy
== NULL
4967 || S_IS_DEFINED (fixP
->fx_addsy
))
4968 && (val
== 0 || val
== -1))
4969 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
4970 _("invalid byte branch offset"));
4973 /* *fragP has been relaxed to its final size, and now needs to have
4974 the bytes inside it modified to conform to the new size There is UGLY
4978 md_convert_frag_1 (fragS
*fragP
)
4983 /* Address in object code of the displacement. */
4984 register int object_address
= fragP
->fr_fix
+ fragP
->fr_address
;
4986 /* Address in gas core of the place to store the displacement. */
4987 /* This convinces the native rs6000 compiler to generate the code we
4989 register char *buffer_address
= fragP
->fr_literal
;
4990 buffer_address
+= fragP
->fr_fix
;
4991 /* End ibm compiler workaround. */
4993 /* The displacement of the address, from current location. */
4994 disp
= fragP
->fr_symbol
? S_GET_VALUE (fragP
->fr_symbol
) : 0;
4995 disp
= (disp
+ fragP
->fr_offset
) - object_address
;
4997 switch (fragP
->fr_subtype
)
4999 case TAB (BRANCHBWL
, BYTE
):
5000 case TAB (BRABSJUNC
, BYTE
):
5001 case TAB (BRABSJCOND
, BYTE
):
5002 case TAB (BRANCHBW
, BYTE
):
5003 case TAB (BRANCHBWPL
, BYTE
):
5004 know (issbyte (disp
));
5006 as_bad_where (fragP
->fr_file
, fragP
->fr_line
,
5007 _("short branch with zero offset: use :w"));
5008 fixP
= fix_new (fragP
, fragP
->fr_fix
- 1, 1, fragP
->fr_symbol
,
5009 fragP
->fr_offset
, 1, RELAX_RELOC_PC8
);
5010 fixP
->fx_pcrel_adjust
= -1;
5012 case TAB (BRANCHBWL
, SHORT
):
5013 case TAB (BRABSJUNC
, SHORT
):
5014 case TAB (BRABSJCOND
, SHORT
):
5015 case TAB (BRANCHBW
, SHORT
):
5016 case TAB (BRANCHBWPL
, SHORT
):
5017 fragP
->fr_opcode
[1] = 0x00;
5018 fixP
= fix_new (fragP
, fragP
->fr_fix
, 2, fragP
->fr_symbol
,
5019 fragP
->fr_offset
, 1, RELAX_RELOC_PC16
);
5022 case TAB (BRANCHBWL
, LONG
):
5023 fragP
->fr_opcode
[1] = (char) 0xFF;
5024 fixP
= fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
5025 fragP
->fr_offset
, 1, RELAX_RELOC_PC32
);
5028 case TAB (BRANCHBWPL
, LONG
):
5029 /* Here we are converting an unconditional branch into a pair of
5030 conditional branches, in order to get the range. */
5031 fragP
->fr_opcode
[0] = 0x66; /* bne */
5032 fragP
->fr_opcode
[1] = 0xFF;
5033 fixP
= fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
5034 fragP
->fr_offset
, 1, RELAX_RELOC_PC32
);
5035 fixP
->fx_file
= fragP
->fr_file
;
5036 fixP
->fx_line
= fragP
->fr_line
;
5037 fragP
->fr_fix
+= 4; /* Skip first offset */
5038 buffer_address
+= 4;
5039 *buffer_address
++ = 0x67; /* beq */
5040 *buffer_address
++ = 0xff;
5041 fragP
->fr_fix
+= 2; /* Skip second branch opcode */
5042 fixP
= fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
5043 fragP
->fr_offset
, 1, RELAX_RELOC_PC32
);
5046 case TAB (BRABSJUNC
, LONG
):
5047 if (fragP
->fr_opcode
[0] == 0x61) /* jbsr */
5049 if (flag_keep_pcrel
)
5050 as_bad_where (fragP
->fr_file
, fragP
->fr_line
,
5051 _("Conversion of PC relative BSR to absolute JSR"));
5052 fragP
->fr_opcode
[0] = 0x4E;
5053 fragP
->fr_opcode
[1] = (char) 0xB9; /* JSR with ABSL LONG operand. */
5054 fixP
= fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
5055 fragP
->fr_offset
, 0, RELAX_RELOC_ABS32
);
5058 else if (fragP
->fr_opcode
[0] == 0x60) /* jbra */
5060 if (flag_keep_pcrel
)
5061 as_bad_where (fragP
->fr_file
, fragP
->fr_line
,
5062 _("Conversion of PC relative branch to absolute jump"));
5063 fragP
->fr_opcode
[0] = 0x4E;
5064 fragP
->fr_opcode
[1] = (char) 0xF9; /* JMP with ABSL LONG operand. */
5065 fixP
= fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
5066 fragP
->fr_offset
, 0, RELAX_RELOC_ABS32
);
5071 /* This cannot happen, because jbsr and jbra are the only two
5072 unconditional branches. */
5076 case TAB (BRABSJCOND
, LONG
):
5077 if (flag_keep_pcrel
)
5078 as_bad_where (fragP
->fr_file
, fragP
->fr_line
,
5079 _("Conversion of PC relative conditional branch to absolute jump"));
5081 /* Only Bcc 68000 instructions can come here
5082 Change bcc into b!cc/jmp absl long. */
5083 fragP
->fr_opcode
[0] ^= 0x01; /* Invert bcc. */
5084 fragP
->fr_opcode
[1] = 0x06; /* Branch offset = 6. */
5086 /* JF: these used to be fr_opcode[2,3], but they may be in a
5087 different frag, in which case referring to them is a no-no.
5088 Only fr_opcode[0,1] are guaranteed to work. */
5089 *buffer_address
++ = 0x4e; /* put in jmp long (0x4ef9) */
5090 *buffer_address
++ = (char) 0xf9;
5091 fragP
->fr_fix
+= 2; /* Account for jmp instruction. */
5092 fixP
= fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
5093 fragP
->fr_offset
, 0, RELAX_RELOC_ABS32
);
5096 case TAB (FBRANCH
, SHORT
):
5097 know ((fragP
->fr_opcode
[1] & 0x40) == 0);
5098 fixP
= fix_new (fragP
, fragP
->fr_fix
, 2, fragP
->fr_symbol
,
5099 fragP
->fr_offset
, 1, RELAX_RELOC_PC16
);
5102 case TAB (FBRANCH
, LONG
):
5103 fragP
->fr_opcode
[1] |= 0x40; /* Turn on LONG bit. */
5104 fixP
= fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
5105 fragP
->fr_offset
, 1, RELAX_RELOC_PC32
);
5108 case TAB (DBCCLBR
, SHORT
):
5109 case TAB (DBCCABSJ
, SHORT
):
5110 fixP
= fix_new (fragP
, fragP
->fr_fix
, 2, fragP
->fr_symbol
,
5111 fragP
->fr_offset
, 1, RELAX_RELOC_PC16
);
5114 case TAB (DBCCLBR
, LONG
):
5115 /* Only DBcc instructions can come here.
5116 Change dbcc into dbcc/bral.
5117 JF: these used to be fr_opcode[2-7], but that's wrong. */
5118 if (flag_keep_pcrel
)
5119 as_bad_where (fragP
->fr_file
, fragP
->fr_line
,
5120 _("Conversion of DBcc to absolute jump"));
5122 *buffer_address
++ = 0x00; /* Branch offset = 4. */
5123 *buffer_address
++ = 0x04;
5124 *buffer_address
++ = 0x60; /* Put in bra pc+6. */
5125 *buffer_address
++ = 0x06;
5126 *buffer_address
++ = 0x60; /* Put in bral (0x60ff). */
5127 *buffer_address
++ = (char) 0xff;
5129 fragP
->fr_fix
+= 6; /* Account for bra/jmp instructions. */
5130 fixP
= fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
5131 fragP
->fr_offset
, 1, RELAX_RELOC_PC32
);
5134 case TAB (DBCCABSJ
, LONG
):
5135 /* Only DBcc instructions can come here.
5136 Change dbcc into dbcc/jmp.
5137 JF: these used to be fr_opcode[2-7], but that's wrong. */
5138 if (flag_keep_pcrel
)
5139 as_bad_where (fragP
->fr_file
, fragP
->fr_line
,
5140 _("Conversion of PC relative conditional branch to absolute jump"));
5142 *buffer_address
++ = 0x00; /* Branch offset = 4. */
5143 *buffer_address
++ = 0x04;
5144 *buffer_address
++ = 0x60; /* Put in bra pc + 6. */
5145 *buffer_address
++ = 0x06;
5146 *buffer_address
++ = 0x4e; /* Put in jmp long (0x4ef9). */
5147 *buffer_address
++ = (char) 0xf9;
5149 fragP
->fr_fix
+= 6; /* Account for bra/jmp instructions. */
5150 fixP
= fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
5151 fragP
->fr_offset
, 0, RELAX_RELOC_ABS32
);
5154 case TAB (PCREL1632
, SHORT
):
5155 fragP
->fr_opcode
[1] &= ~0x3F;
5156 fragP
->fr_opcode
[1] |= 0x3A; /* 072 - mode 7.2 */
5157 fixP
= fix_new (fragP
, (int) (fragP
->fr_fix
), 2, fragP
->fr_symbol
,
5158 fragP
->fr_offset
, 1, RELAX_RELOC_PC16
);
5161 case TAB (PCREL1632
, LONG
):
5162 /* Already set to mode 7.3; this indicates: PC indirect with
5163 suppressed index, 32-bit displacement. */
5164 *buffer_address
++ = 0x01;
5165 *buffer_address
++ = 0x70;
5167 fixP
= fix_new (fragP
, (int) (fragP
->fr_fix
), 4, fragP
->fr_symbol
,
5168 fragP
->fr_offset
, 1, RELAX_RELOC_PC32
);
5169 fixP
->fx_pcrel_adjust
= 2;
5172 case TAB (PCINDEX
, BYTE
):
5173 gas_assert (fragP
->fr_fix
>= 2);
5174 buffer_address
[-2] &= ~1;
5175 fixP
= fix_new (fragP
, fragP
->fr_fix
- 1, 1, fragP
->fr_symbol
,
5176 fragP
->fr_offset
, 1, RELAX_RELOC_PC8
);
5177 fixP
->fx_pcrel_adjust
= 1;
5179 case TAB (PCINDEX
, SHORT
):
5180 gas_assert (fragP
->fr_fix
>= 2);
5181 buffer_address
[-2] |= 0x1;
5182 buffer_address
[-1] = 0x20;
5183 fixP
= fix_new (fragP
, (int) (fragP
->fr_fix
), 2, fragP
->fr_symbol
,
5184 fragP
->fr_offset
, 1, RELAX_RELOC_PC16
);
5185 fixP
->fx_pcrel_adjust
= 2;
5188 case TAB (PCINDEX
, LONG
):
5189 gas_assert (fragP
->fr_fix
>= 2);
5190 buffer_address
[-2] |= 0x1;
5191 buffer_address
[-1] = 0x30;
5192 fixP
= fix_new (fragP
, (int) (fragP
->fr_fix
), 4, fragP
->fr_symbol
,
5193 fragP
->fr_offset
, 1, RELAX_RELOC_PC32
);
5194 fixP
->fx_pcrel_adjust
= 2;
5197 case TAB (ABSTOPCREL
, SHORT
):
5198 fixP
= fix_new (fragP
, fragP
->fr_fix
, 2, fragP
->fr_symbol
,
5199 fragP
->fr_offset
, 1, RELAX_RELOC_PC16
);
5202 case TAB (ABSTOPCREL
, LONG
):
5203 if (flag_keep_pcrel
)
5204 as_bad_where (fragP
->fr_file
, fragP
->fr_line
,
5205 _("Conversion of PC relative displacement to absolute"));
5206 /* The thing to do here is force it to ABSOLUTE LONG, since
5207 ABSTOPCREL is really trying to shorten an ABSOLUTE address anyway. */
5208 if ((fragP
->fr_opcode
[1] & 0x3F) != 0x3A)
5210 fragP
->fr_opcode
[1] &= ~0x3F;
5211 fragP
->fr_opcode
[1] |= 0x39; /* Mode 7.1 */
5212 fixP
= fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
5213 fragP
->fr_offset
, 0, RELAX_RELOC_ABS32
);
5219 fixP
->fx_file
= fragP
->fr_file
;
5220 fixP
->fx_line
= fragP
->fr_line
;
5225 md_convert_frag (bfd
*abfd ATTRIBUTE_UNUSED
,
5226 segT sec ATTRIBUTE_UNUSED
,
5229 md_convert_frag_1 (fragP
);
5232 /* Force truly undefined symbols to their maximum size, and generally set up
5233 the frag list to be relaxed
5236 md_estimate_size_before_relax (fragS
*fragP
, segT segment
)
5238 /* Handle SZ_UNDEF first, it can be changed to BYTE or SHORT. */
5239 switch (fragP
->fr_subtype
)
5241 case TAB (BRANCHBWL
, SZ_UNDEF
):
5242 case TAB (BRANCHBWPL
, SZ_UNDEF
):
5243 case TAB (BRABSJUNC
, SZ_UNDEF
):
5244 case TAB (BRABSJCOND
, SZ_UNDEF
):
5246 if (S_GET_SEGMENT (fragP
->fr_symbol
) == segment
5247 && relaxable_symbol (fragP
->fr_symbol
))
5249 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), BYTE
);
5251 else if (flag_short_refs
)
5253 /* Symbol is undefined and we want short ref. */
5254 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), SHORT
);
5258 /* Symbol is still undefined. Make it LONG. */
5259 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), LONG
);
5264 case TAB (BRANCHBW
, SZ_UNDEF
):
5266 if (S_GET_SEGMENT (fragP
->fr_symbol
) == segment
5267 && relaxable_symbol (fragP
->fr_symbol
))
5269 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), BYTE
);
5273 /* Symbol is undefined and we don't have long branches. */
5274 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), SHORT
);
5279 case TAB (FBRANCH
, SZ_UNDEF
):
5280 case TAB (DBCCLBR
, SZ_UNDEF
):
5281 case TAB (DBCCABSJ
, SZ_UNDEF
):
5282 case TAB (PCREL1632
, SZ_UNDEF
):
5284 if ((S_GET_SEGMENT (fragP
->fr_symbol
) == segment
5285 && relaxable_symbol (fragP
->fr_symbol
))
5288 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), SHORT
);
5292 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), LONG
);
5297 case TAB (PCINDEX
, SZ_UNDEF
):
5298 if ((S_GET_SEGMENT (fragP
->fr_symbol
) == segment
5299 && relaxable_symbol (fragP
->fr_symbol
)))
5301 fragP
->fr_subtype
= TAB (PCINDEX
, BYTE
);
5305 fragP
->fr_subtype
= TAB (PCINDEX
, LONG
);
5309 case TAB (ABSTOPCREL
, SZ_UNDEF
):
5311 if ((S_GET_SEGMENT (fragP
->fr_symbol
) == segment
5312 && relaxable_symbol (fragP
->fr_symbol
)))
5314 fragP
->fr_subtype
= TAB (ABSTOPCREL
, SHORT
);
5318 fragP
->fr_subtype
= TAB (ABSTOPCREL
, LONG
);
5327 /* Now that SZ_UNDEF are taken care of, check others. */
5328 switch (fragP
->fr_subtype
)
5330 case TAB (BRANCHBWL
, BYTE
):
5331 case TAB (BRABSJUNC
, BYTE
):
5332 case TAB (BRABSJCOND
, BYTE
):
5333 case TAB (BRANCHBW
, BYTE
):
5334 /* We can't do a short jump to the next instruction, so in that
5335 case we force word mode. If the symbol is at the start of a
5336 frag, and it is the next frag with any data in it (usually
5337 this is just the next frag, but assembler listings may
5338 introduce empty frags), we must use word mode. */
5339 if (fragP
->fr_symbol
)
5343 sym_frag
= symbol_get_frag (fragP
->fr_symbol
);
5344 if (S_GET_VALUE (fragP
->fr_symbol
) == sym_frag
->fr_address
)
5348 for (l
= fragP
->fr_next
; l
&& l
!= sym_frag
; l
= l
->fr_next
)
5352 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), SHORT
);
5359 return md_relax_table
[fragP
->fr_subtype
].rlx_length
;
5362 #if defined(OBJ_AOUT) | defined(OBJ_BOUT)
5363 /* the bit-field entries in the relocation_info struct plays hell
5364 with the byte-order problems of cross-assembly. So as a hack,
5365 I added this mach. dependent ri twiddler. Ugly, but it gets
5367 /* on m68k: first 4 bytes are normal unsigned long, next three bytes
5368 are symbolnum, most sig. byte first. Last byte is broken up with
5369 bit 7 as pcrel, bits 6 & 5 as length, bit 4 as pcrel, and the lower
5370 nibble as nuthin. (on Sun 3 at least) */
5371 /* Translate the internal relocation information into target-specific
5375 md_ri_to_chars (char *the_bytes
, struct reloc_info_generic
*ri
)
5378 md_number_to_chars (the_bytes
, ri
->r_address
, 4);
5379 /* Now the fun stuff. */
5380 the_bytes
[4] = (ri
->r_symbolnum
>> 16) & 0x0ff;
5381 the_bytes
[5] = (ri
->r_symbolnum
>> 8) & 0x0ff;
5382 the_bytes
[6] = ri
->r_symbolnum
& 0x0ff;
5383 the_bytes
[7] = (((ri
->r_pcrel
<< 7) & 0x80)
5384 | ((ri
->r_length
<< 5) & 0x60)
5385 | ((ri
->r_extern
<< 4) & 0x10));
5390 #endif /* OBJ_AOUT or OBJ_BOUT */
5392 #ifndef WORKING_DOT_WORD
5393 int md_short_jump_size
= 4;
5394 int md_long_jump_size
= 6;
5397 md_create_short_jump (char *ptr
, addressT from_addr
, addressT to_addr
,
5398 fragS
*frag ATTRIBUTE_UNUSED
,
5399 symbolS
*to_symbol ATTRIBUTE_UNUSED
)
5403 offset
= to_addr
- (from_addr
+ 2);
5405 md_number_to_chars (ptr
, (valueT
) 0x6000, 2);
5406 md_number_to_chars (ptr
+ 2, (valueT
) offset
, 2);
5410 md_create_long_jump (char *ptr
, addressT from_addr
, addressT to_addr
,
5411 fragS
*frag
, symbolS
*to_symbol
)
5415 if (!HAVE_LONG_BRANCH (current_architecture
))
5417 if (flag_keep_pcrel
)
5418 as_fatal (_("Tried to convert PC relative branch to absolute jump"));
5419 offset
= to_addr
- S_GET_VALUE (to_symbol
);
5420 md_number_to_chars (ptr
, (valueT
) 0x4EF9, 2);
5421 md_number_to_chars (ptr
+ 2, (valueT
) offset
, 4);
5422 fix_new (frag
, (ptr
+ 2) - frag
->fr_literal
, 4, to_symbol
, (offsetT
) 0,
5427 offset
= to_addr
- (from_addr
+ 2);
5428 md_number_to_chars (ptr
, (valueT
) 0x60ff, 2);
5429 md_number_to_chars (ptr
+ 2, (valueT
) offset
, 4);
5435 /* Different values of OK tell what its OK to return. Things that
5436 aren't OK are an error (what a shock, no?)
5439 10: Absolute 1:8 only
5440 20: Absolute 0:7 only
5441 30: absolute 0:15 only
5442 40: Absolute 0:31 only
5443 50: absolute 0:127 only
5444 55: absolute -64:63 only
5445 60: absolute -128:127 only
5446 65: absolute 0:511 only
5447 70: absolute 0:4095 only
5448 80: absolute -1, 1:7 only
5452 get_num (struct m68k_exp
*exp
, int ok
)
5454 if (exp
->exp
.X_op
== O_absent
)
5456 /* Do the same thing the VAX asm does. */
5457 op (exp
) = O_constant
;
5463 as_warn (_("expression out of range: defaulting to 1"));
5467 else if (exp
->exp
.X_op
== O_constant
)
5472 if ((valueT
) TRUNC (offs (exp
)) - 1 > 7)
5474 as_warn (_("expression out of range: defaulting to 1"));
5479 if ((valueT
) TRUNC (offs (exp
)) > 7)
5483 if ((valueT
) TRUNC (offs (exp
)) > 15)
5487 if ((valueT
) TRUNC (offs (exp
)) > 32)
5491 if ((valueT
) TRUNC (offs (exp
)) > 127)
5495 if ((valueT
) SEXT (offs (exp
)) + 64 > 127)
5499 if ((valueT
) SEXT (offs (exp
)) + 128 > 255)
5503 if ((valueT
) TRUNC (offs (exp
)) > 511)
5507 if ((valueT
) TRUNC (offs (exp
)) > 4095)
5510 as_warn (_("expression out of range: defaulting to 0"));
5515 if ((valueT
) TRUNC (offs (exp
)) != 0xffffffff
5516 && (valueT
) TRUNC (offs (exp
)) - 1 > 6)
5518 as_warn (_("expression out of range: defaulting to 1"));
5526 else if (exp
->exp
.X_op
== O_big
)
5528 if (offs (exp
) <= 0 /* flonum. */
5529 && (ok
== 90 /* no bignums */
5530 || (ok
> 10 /* Small-int ranges including 0 ok. */
5531 /* If we have a flonum zero, a zero integer should
5532 do as well (e.g., in moveq). */
5533 && generic_floating_point_number
.exponent
== 0
5534 && generic_floating_point_number
.low
[0] == 0)))
5536 /* HACK! Turn it into a long. */
5537 LITTLENUM_TYPE words
[6];
5539 gen_to_words (words
, 2, 8L); /* These numbers are magic! */
5540 op (exp
) = O_constant
;
5543 offs (exp
) = words
[1] | (words
[0] << 16);
5547 op (exp
) = O_constant
;
5550 offs (exp
) = (ok
== 10) ? 1 : 0;
5551 as_warn (_("Can't deal with expression; defaulting to %ld"),
5557 if (ok
>= 10 && ok
<= 80)
5559 op (exp
) = O_constant
;
5562 offs (exp
) = (ok
== 10) ? 1 : 0;
5563 as_warn (_("Can't deal with expression; defaulting to %ld"),
5568 if (exp
->size
!= SIZE_UNSPEC
)
5576 if (!isbyte (offs (exp
)))
5577 as_warn (_("expression doesn't fit in BYTE"));
5580 if (!isword (offs (exp
)))
5581 as_warn (_("expression doesn't fit in WORD"));
5589 /* These are the back-ends for the various machine dependent pseudo-ops. */
5592 s_data1 (int ignore ATTRIBUTE_UNUSED
)
5594 subseg_set (data_section
, 1);
5595 demand_empty_rest_of_line ();
5599 s_data2 (int ignore ATTRIBUTE_UNUSED
)
5601 subseg_set (data_section
, 2);
5602 demand_empty_rest_of_line ();
5606 s_bss (int ignore ATTRIBUTE_UNUSED
)
5608 /* We don't support putting frags in the BSS segment, we fake it
5609 by marking in_bss, then looking at s_skip for clues. */
5611 subseg_set (bss_section
, 0);
5612 demand_empty_rest_of_line ();
5616 s_even (int ignore ATTRIBUTE_UNUSED
)
5619 register long temp_fill
;
5621 temp
= 1; /* JF should be 2? */
5622 temp_fill
= get_absolute_expression ();
5623 if (!need_pass_2
) /* Never make frag if expect extra pass. */
5624 frag_align (temp
, (int) temp_fill
, 0);
5625 demand_empty_rest_of_line ();
5626 record_alignment (now_seg
, temp
);
5630 s_proc (int ignore ATTRIBUTE_UNUSED
)
5632 demand_empty_rest_of_line ();
5635 /* Pseudo-ops handled for MRI compatibility. */
5637 /* This function returns non-zero if the argument is a conditional
5638 pseudo-op. This is called when checking whether a pending
5639 alignment is needed. */
5642 m68k_conditional_pseudoop (pseudo_typeS
*pop
)
5644 return (pop
->poc_handler
== s_mri_if
5645 || pop
->poc_handler
== s_mri_else
);
5648 /* Handle an MRI style chip specification. */
5657 s
= input_line_pointer
;
5658 /* We can't use get_symbol_end since the processor names are not proper
5660 while (is_part_of_name (c
= *input_line_pointer
++))
5662 *--input_line_pointer
= 0;
5663 for (i
= 0; m68k_cpus
[i
].name
; i
++)
5664 if (strcasecmp (s
, m68k_cpus
[i
].name
) == 0)
5666 if (!m68k_cpus
[i
].name
)
5668 as_bad (_("%s: unrecognized processor name"), s
);
5669 *input_line_pointer
= c
;
5670 ignore_rest_of_line ();
5673 *input_line_pointer
= c
;
5675 if (*input_line_pointer
== '/')
5676 current_architecture
= 0;
5678 current_architecture
&= m68881
| m68851
;
5679 current_architecture
|= m68k_cpus
[i
].arch
& ~(m68881
| m68851
);
5680 control_regs
= m68k_cpus
[i
].control_regs
;
5682 while (*input_line_pointer
== '/')
5684 ++input_line_pointer
;
5685 s
= input_line_pointer
;
5686 /* We can't use get_symbol_end since the processor names are not
5688 while (is_part_of_name (c
= *input_line_pointer
++))
5690 *--input_line_pointer
= 0;
5691 if (strcmp (s
, "68881") == 0)
5692 current_architecture
|= m68881
;
5693 else if (strcmp (s
, "68851") == 0)
5694 current_architecture
|= m68851
;
5695 *input_line_pointer
= c
;
5699 /* The MRI CHIP pseudo-op. */
5702 s_chip (int ignore ATTRIBUTE_UNUSED
)
5708 stop
= mri_comment_field (&stopc
);
5711 mri_comment_end (stop
, stopc
);
5712 demand_empty_rest_of_line ();
5715 /* The MRI FOPT pseudo-op. */
5718 s_fopt (int ignore ATTRIBUTE_UNUSED
)
5722 if (strncasecmp (input_line_pointer
, "ID=", 3) == 0)
5726 input_line_pointer
+= 3;
5727 temp
= get_absolute_expression ();
5728 if (temp
< 0 || temp
> 7)
5729 as_bad (_("bad coprocessor id"));
5731 m68k_float_copnum
= COP0
+ temp
;
5735 as_bad (_("unrecognized fopt option"));
5736 ignore_rest_of_line ();
5740 demand_empty_rest_of_line ();
5743 /* The structure used to handle the MRI OPT pseudo-op. */
5747 /* The name of the option. */
5750 /* If this is not NULL, just call this function. The first argument
5751 is the ARG field of this structure, the second argument is
5752 whether the option was negated. */
5753 void (*pfn
) (int arg
, int on
);
5755 /* If this is not NULL, and the PFN field is NULL, set the variable
5756 this points to. Set it to the ARG field if the option was not
5757 negated, and the NOTARG field otherwise. */
5760 /* The value to pass to PFN or to assign to *PVAR. */
5763 /* The value to assign to *PVAR if the option is negated. If PFN is
5764 NULL, and PVAR is not NULL, and ARG and NOTARG are the same, then
5765 the option may not be negated. */
5769 /* The table used to handle the MRI OPT pseudo-op. */
5771 static void skip_to_comma (int, int);
5772 static void opt_nest (int, int);
5773 static void opt_chip (int, int);
5774 static void opt_list (int, int);
5775 static void opt_list_symbols (int, int);
5777 static const struct opt_action opt_table
[] =
5779 { "abspcadd", 0, &m68k_abspcadd
, 1, 0 },
5781 /* We do relaxing, so there is little use for these options. */
5782 { "b", 0, 0, 0, 0 },
5783 { "brs", 0, 0, 0, 0 },
5784 { "brb", 0, 0, 0, 0 },
5785 { "brl", 0, 0, 0, 0 },
5786 { "brw", 0, 0, 0, 0 },
5788 { "c", 0, 0, 0, 0 },
5789 { "cex", 0, 0, 0, 0 },
5790 { "case", 0, &symbols_case_sensitive
, 1, 0 },
5791 { "cl", 0, 0, 0, 0 },
5792 { "cre", 0, 0, 0, 0 },
5793 { "d", 0, &flag_keep_locals
, 1, 0 },
5794 { "e", 0, 0, 0, 0 },
5795 { "f", 0, &flag_short_refs
, 1, 0 },
5796 { "frs", 0, &flag_short_refs
, 1, 0 },
5797 { "frl", 0, &flag_short_refs
, 0, 1 },
5798 { "g", 0, 0, 0, 0 },
5799 { "i", 0, 0, 0, 0 },
5800 { "m", 0, 0, 0, 0 },
5801 { "mex", 0, 0, 0, 0 },
5802 { "mc", 0, 0, 0, 0 },
5803 { "md", 0, 0, 0, 0 },
5804 { "nest", opt_nest
, 0, 0, 0 },
5805 { "next", skip_to_comma
, 0, 0, 0 },
5806 { "o", 0, 0, 0, 0 },
5807 { "old", 0, 0, 0, 0 },
5808 { "op", skip_to_comma
, 0, 0, 0 },
5809 { "pco", 0, 0, 0, 0 },
5810 { "p", opt_chip
, 0, 0, 0 },
5811 { "pcr", 0, 0, 0, 0 },
5812 { "pcs", 0, 0, 0, 0 },
5813 { "r", 0, 0, 0, 0 },
5814 { "quick", 0, &m68k_quick
, 1, 0 },
5815 { "rel32", 0, &m68k_rel32
, 1, 0 },
5816 { "s", opt_list
, 0, 0, 0 },
5817 { "t", opt_list_symbols
, 0, 0, 0 },
5818 { "w", 0, &flag_no_warnings
, 0, 1 },
5822 #define OPTCOUNT ((int) (sizeof opt_table / sizeof opt_table[0]))
5824 /* The MRI OPT pseudo-op. */
5827 s_opt (int ignore ATTRIBUTE_UNUSED
)
5835 const struct opt_action
*o
;
5840 if (*input_line_pointer
== '-')
5842 ++input_line_pointer
;
5845 else if (strncasecmp (input_line_pointer
, "NO", 2) == 0)
5847 input_line_pointer
+= 2;
5851 s
= input_line_pointer
;
5852 c
= get_symbol_end ();
5854 for (i
= 0, o
= opt_table
; i
< OPTCOUNT
; i
++, o
++)
5856 if (strcasecmp (s
, o
->name
) == 0)
5860 /* Restore input_line_pointer now in case the option
5862 *input_line_pointer
= c
;
5863 (*o
->pfn
) (o
->arg
, t
);
5865 else if (o
->pvar
!= NULL
)
5867 if (! t
&& o
->arg
== o
->notarg
)
5868 as_bad (_("option `%s' may not be negated"), s
);
5869 *input_line_pointer
= c
;
5870 *o
->pvar
= t
? o
->arg
: o
->notarg
;
5873 *input_line_pointer
= c
;
5879 as_bad (_("option `%s' not recognized"), s
);
5880 *input_line_pointer
= c
;
5883 while (*input_line_pointer
++ == ',');
5885 /* Move back to terminating character. */
5886 --input_line_pointer
;
5887 demand_empty_rest_of_line ();
5890 /* Skip ahead to a comma. This is used for OPT options which we do
5891 not support and which take arguments. */
5894 skip_to_comma (int arg ATTRIBUTE_UNUSED
, int on ATTRIBUTE_UNUSED
)
5896 while (*input_line_pointer
!= ','
5897 && ! is_end_of_line
[(unsigned char) *input_line_pointer
])
5898 ++input_line_pointer
;
5901 /* Handle the OPT NEST=depth option. */
5904 opt_nest (int arg ATTRIBUTE_UNUSED
, int on ATTRIBUTE_UNUSED
)
5906 if (*input_line_pointer
!= '=')
5908 as_bad (_("bad format of OPT NEST=depth"));
5912 ++input_line_pointer
;
5913 max_macro_nest
= get_absolute_expression ();
5916 /* Handle the OPT P=chip option. */
5919 opt_chip (int arg ATTRIBUTE_UNUSED
, int on ATTRIBUTE_UNUSED
)
5921 if (*input_line_pointer
!= '=')
5923 /* This is just OPT P, which we do not support. */
5927 ++input_line_pointer
;
5931 /* Handle the OPT S option. */
5934 opt_list (int arg ATTRIBUTE_UNUSED
, int on
)
5939 /* Handle the OPT T option. */
5942 opt_list_symbols (int arg ATTRIBUTE_UNUSED
, int on
)
5945 listing
|= LISTING_SYMBOLS
;
5947 listing
&= ~LISTING_SYMBOLS
;
5950 /* Handle the MRI REG pseudo-op. */
5953 s_reg (int ignore ATTRIBUTE_UNUSED
)
5962 if (line_label
== NULL
)
5964 as_bad (_("missing label"));
5965 ignore_rest_of_line ();
5970 stop
= mri_comment_field (&stopc
);
5974 s
= input_line_pointer
;
5975 while (ISALNUM (*input_line_pointer
)
5976 #ifdef REGISTER_PREFIX
5977 || *input_line_pointer
== REGISTER_PREFIX
5979 || *input_line_pointer
== '/'
5980 || *input_line_pointer
== '-')
5981 ++input_line_pointer
;
5982 c
= *input_line_pointer
;
5983 *input_line_pointer
= '\0';
5985 if (m68k_ip_op (s
, &rop
) != 0)
5987 if (rop
.error
== NULL
)
5988 as_bad (_("bad register list"));
5990 as_bad (_("bad register list: %s"), rop
.error
);
5991 *input_line_pointer
= c
;
5992 ignore_rest_of_line ();
5996 *input_line_pointer
= c
;
5998 if (rop
.mode
== REGLST
)
6000 else if (rop
.mode
== DREG
)
6001 mask
= 1 << (rop
.reg
- DATA0
);
6002 else if (rop
.mode
== AREG
)
6003 mask
= 1 << (rop
.reg
- ADDR0
+ 8);
6004 else if (rop
.mode
== FPREG
)
6005 mask
= 1 << (rop
.reg
- FP0
+ 16);
6006 else if (rop
.mode
== CONTROL
6009 else if (rop
.mode
== CONTROL
6012 else if (rop
.mode
== CONTROL
6017 as_bad (_("bad register list"));
6018 ignore_rest_of_line ();
6022 S_SET_SEGMENT (line_label
, reg_section
);
6023 S_SET_VALUE (line_label
, ~mask
);
6024 symbol_set_frag (line_label
, &zero_address_frag
);
6027 mri_comment_end (stop
, stopc
);
6029 demand_empty_rest_of_line ();
6032 /* This structure is used for the MRI SAVE and RESTORE pseudo-ops. */
6036 struct save_opts
*next
;
6038 int symbols_case_sensitive
;
6042 const enum m68k_register
*control_regs
;
6047 /* FIXME: We don't save OPT S. */
6050 /* This variable holds the stack of saved options. */
6052 static struct save_opts
*save_stack
;
6054 /* The MRI SAVE pseudo-op. */
6057 s_save (int ignore ATTRIBUTE_UNUSED
)
6059 struct save_opts
*s
;
6061 s
= (struct save_opts
*) xmalloc (sizeof (struct save_opts
));
6062 s
->abspcadd
= m68k_abspcadd
;
6063 s
->symbols_case_sensitive
= symbols_case_sensitive
;
6064 s
->keep_locals
= flag_keep_locals
;
6065 s
->short_refs
= flag_short_refs
;
6066 s
->architecture
= current_architecture
;
6067 s
->control_regs
= control_regs
;
6068 s
->quick
= m68k_quick
;
6069 s
->rel32
= m68k_rel32
;
6070 s
->listing
= listing
;
6071 s
->no_warnings
= flag_no_warnings
;
6073 s
->next
= save_stack
;
6076 demand_empty_rest_of_line ();
6079 /* The MRI RESTORE pseudo-op. */
6082 s_restore (int ignore ATTRIBUTE_UNUSED
)
6084 struct save_opts
*s
;
6086 if (save_stack
== NULL
)
6088 as_bad (_("restore without save"));
6089 ignore_rest_of_line ();
6094 save_stack
= s
->next
;
6096 m68k_abspcadd
= s
->abspcadd
;
6097 symbols_case_sensitive
= s
->symbols_case_sensitive
;
6098 flag_keep_locals
= s
->keep_locals
;
6099 flag_short_refs
= s
->short_refs
;
6100 current_architecture
= s
->architecture
;
6101 control_regs
= s
->control_regs
;
6102 m68k_quick
= s
->quick
;
6103 m68k_rel32
= s
->rel32
;
6104 listing
= s
->listing
;
6105 flag_no_warnings
= s
->no_warnings
;
6109 demand_empty_rest_of_line ();
6112 /* Types of MRI structured control directives. */
6114 enum mri_control_type
6122 /* This structure is used to stack the MRI structured control
6125 struct mri_control_info
6127 /* The directive within which this one is enclosed. */
6128 struct mri_control_info
*outer
;
6130 /* The type of directive. */
6131 enum mri_control_type type
;
6133 /* Whether an ELSE has been in an IF. */
6136 /* The add or sub statement at the end of a FOR. */
6139 /* The label of the top of a FOR or REPEAT loop. */
6142 /* The label to jump to for the next iteration, or the else
6143 expression of a conditional. */
6146 /* The label to jump to to break out of the loop, or the label past
6147 the end of a conditional. */
6151 /* The stack of MRI structured control directives. */
6153 static struct mri_control_info
*mri_control_stack
;
6155 /* The current MRI structured control directive index number, used to
6156 generate label names. */
6158 static int mri_control_index
;
6160 /* Assemble an instruction for an MRI structured control directive. */
6163 mri_assemble (char *str
)
6167 /* md_assemble expects the opcode to be in lower case. */
6168 for (s
= str
; *s
!= ' ' && *s
!= '\0'; s
++)
6174 /* Generate a new MRI label structured control directive label name. */
6177 mri_control_label (void)
6181 n
= (char *) xmalloc (20);
6182 sprintf (n
, "%smc%d", FAKE_LABEL_NAME
, mri_control_index
);
6183 ++mri_control_index
;
6187 /* Create a new MRI structured control directive. */
6189 static struct mri_control_info
*
6190 push_mri_control (enum mri_control_type type
)
6192 struct mri_control_info
*n
;
6194 n
= (struct mri_control_info
*) xmalloc (sizeof (struct mri_control_info
));
6198 if (type
== mri_if
|| type
== mri_while
)
6201 n
->top
= mri_control_label ();
6202 n
->next
= mri_control_label ();
6203 n
->bottom
= mri_control_label ();
6205 n
->outer
= mri_control_stack
;
6206 mri_control_stack
= n
;
6211 /* Pop off the stack of MRI structured control directives. */
6214 pop_mri_control (void)
6216 struct mri_control_info
*n
;
6218 n
= mri_control_stack
;
6219 mri_control_stack
= n
->outer
;
6227 /* Recognize a condition code in an MRI structured control expression. */
6230 parse_mri_condition (int *pcc
)
6234 know (*input_line_pointer
== '<');
6236 ++input_line_pointer
;
6237 c1
= *input_line_pointer
++;
6238 c2
= *input_line_pointer
++;
6240 if (*input_line_pointer
!= '>')
6242 as_bad (_("syntax error in structured control directive"));
6246 ++input_line_pointer
;
6252 *pcc
= (c1
<< 8) | c2
;
6257 /* Parse a single operand in an MRI structured control expression. */
6260 parse_mri_control_operand (int *pcc
, char **leftstart
, char **leftstop
,
6261 char **rightstart
, char **rightstop
)
6273 if (*input_line_pointer
== '<')
6275 /* It's just a condition code. */
6276 return parse_mri_condition (pcc
);
6279 /* Look ahead for the condition code. */
6280 for (s
= input_line_pointer
; *s
!= '\0'; ++s
)
6282 if (*s
== '<' && s
[1] != '\0' && s
[2] != '\0' && s
[3] == '>')
6287 as_bad (_("missing condition code in structured control directive"));
6291 *leftstart
= input_line_pointer
;
6293 if (*leftstop
> *leftstart
6294 && ((*leftstop
)[-1] == ' ' || (*leftstop
)[-1] == '\t'))
6297 input_line_pointer
= s
;
6298 if (! parse_mri_condition (pcc
))
6301 /* Look ahead for AND or OR or end of line. */
6302 for (s
= input_line_pointer
; *s
!= '\0'; ++s
)
6304 /* We must make sure we don't misinterpret AND/OR at the end of labels!
6305 if d0 <eq> #FOOAND and d1 <ne> #BAROR then
6307 if ((s
== input_line_pointer
6310 && ((strncasecmp (s
, "AND", 3) == 0
6311 && (s
[3] == '.' || ! is_part_of_name (s
[3])))
6312 || (strncasecmp (s
, "OR", 2) == 0
6313 && (s
[2] == '.' || ! is_part_of_name (s
[2])))))
6317 *rightstart
= input_line_pointer
;
6319 if (*rightstop
> *rightstart
6320 && ((*rightstop
)[-1] == ' ' || (*rightstop
)[-1] == '\t'))
6323 input_line_pointer
= s
;
6328 #define MCC(b1, b2) (((b1) << 8) | (b2))
6330 /* Swap the sense of a condition. This changes the condition so that
6331 it generates the same result when the operands are swapped. */
6334 swap_mri_condition (int cc
)
6338 case MCC ('h', 'i'): return MCC ('c', 's');
6339 case MCC ('l', 's'): return MCC ('c', 'c');
6340 /* <HS> is an alias for <CC>. */
6341 case MCC ('h', 's'):
6342 case MCC ('c', 'c'): return MCC ('l', 's');
6343 /* <LO> is an alias for <CS>. */
6344 case MCC ('l', 'o'):
6345 case MCC ('c', 's'): return MCC ('h', 'i');
6346 case MCC ('p', 'l'): return MCC ('m', 'i');
6347 case MCC ('m', 'i'): return MCC ('p', 'l');
6348 case MCC ('g', 'e'): return MCC ('l', 'e');
6349 case MCC ('l', 't'): return MCC ('g', 't');
6350 case MCC ('g', 't'): return MCC ('l', 't');
6351 case MCC ('l', 'e'): return MCC ('g', 'e');
6352 /* Issue a warning for conditions we can not swap. */
6353 case MCC ('n', 'e'): return MCC ('n', 'e'); /* no problem here */
6354 case MCC ('e', 'q'): return MCC ('e', 'q'); /* also no problem */
6355 case MCC ('v', 'c'):
6356 case MCC ('v', 's'):
6358 as_warn (_("Condition <%c%c> in structured control directive can not be encoded correctly"),
6359 (char) (cc
>> 8), (char) (cc
));
6365 /* Reverse the sense of a condition. */
6368 reverse_mri_condition (int cc
)
6372 case MCC ('h', 'i'): return MCC ('l', 's');
6373 case MCC ('l', 's'): return MCC ('h', 'i');
6374 /* <HS> is an alias for <CC> */
6375 case MCC ('h', 's'): return MCC ('l', 'o');
6376 case MCC ('c', 'c'): return MCC ('c', 's');
6377 /* <LO> is an alias for <CS> */
6378 case MCC ('l', 'o'): return MCC ('h', 's');
6379 case MCC ('c', 's'): return MCC ('c', 'c');
6380 case MCC ('n', 'e'): return MCC ('e', 'q');
6381 case MCC ('e', 'q'): return MCC ('n', 'e');
6382 case MCC ('v', 'c'): return MCC ('v', 's');
6383 case MCC ('v', 's'): return MCC ('v', 'c');
6384 case MCC ('p', 'l'): return MCC ('m', 'i');
6385 case MCC ('m', 'i'): return MCC ('p', 'l');
6386 case MCC ('g', 'e'): return MCC ('l', 't');
6387 case MCC ('l', 't'): return MCC ('g', 'e');
6388 case MCC ('g', 't'): return MCC ('l', 'e');
6389 case MCC ('l', 'e'): return MCC ('g', 't');
6394 /* Build an MRI structured control expression. This generates test
6395 and branch instructions. It goes to TRUELAB if the condition is
6396 true, and to FALSELAB if the condition is false. Exactly one of
6397 TRUELAB and FALSELAB will be NULL, meaning to fall through. QUAL
6398 is the size qualifier for the expression. EXTENT is the size to
6399 use for the branch. */
6402 build_mri_control_operand (int qual
, int cc
, char *leftstart
, char *leftstop
,
6403 char *rightstart
, char *rightstop
,
6404 const char *truelab
, const char *falselab
,
6410 if (leftstart
!= NULL
)
6412 struct m68k_op leftop
, rightop
;
6415 /* Swap the compare operands, if necessary, to produce a legal
6416 m68k compare instruction. Comparing a register operand with
6417 a non-register operand requires the register to be on the
6418 right (cmp, cmpa). Comparing an immediate value with
6419 anything requires the immediate value to be on the left
6424 (void) m68k_ip_op (leftstart
, &leftop
);
6429 (void) m68k_ip_op (rightstart
, &rightop
);
6432 if (rightop
.mode
== IMMED
6433 || ((leftop
.mode
== DREG
|| leftop
.mode
== AREG
)
6434 && (rightop
.mode
!= DREG
&& rightop
.mode
!= AREG
)))
6438 /* Correct conditional handling:
6439 if #1 <lt> d0 then ;means if (1 < d0)
6445 cmp #1,d0 if we do *not* swap the operands
6446 bgt true we need the swapped condition!
6453 leftstart
= rightstart
;
6456 leftstop
= rightstop
;
6461 cc
= swap_mri_condition (cc
);
6465 if (truelab
== NULL
)
6467 cc
= reverse_mri_condition (cc
);
6471 if (leftstart
!= NULL
)
6473 buf
= (char *) xmalloc (20
6474 + (leftstop
- leftstart
)
6475 + (rightstop
- rightstart
));
6481 *s
++ = TOLOWER (qual
);
6483 memcpy (s
, leftstart
, leftstop
- leftstart
);
6484 s
+= leftstop
- leftstart
;
6486 memcpy (s
, rightstart
, rightstop
- rightstart
);
6487 s
+= rightstop
- rightstart
;
6493 buf
= (char *) xmalloc (20 + strlen (truelab
));
6499 *s
++ = TOLOWER (extent
);
6501 strcpy (s
, truelab
);
6506 /* Parse an MRI structured control expression. This generates test
6507 and branch instructions. STOP is where the expression ends. It
6508 goes to TRUELAB if the condition is true, and to FALSELAB if the
6509 condition is false. Exactly one of TRUELAB and FALSELAB will be
6510 NULL, meaning to fall through. QUAL is the size qualifier for the
6511 expression. EXTENT is the size to use for the branch. */
6514 parse_mri_control_expression (char *stop
, int qual
, const char *truelab
,
6515 const char *falselab
, int extent
)
6527 if (! parse_mri_control_operand (&cc
, &leftstart
, &leftstop
,
6528 &rightstart
, &rightstop
))
6534 if (strncasecmp (input_line_pointer
, "AND", 3) == 0)
6538 if (falselab
!= NULL
)
6541 flab
= mri_control_label ();
6543 build_mri_control_operand (qual
, cc
, leftstart
, leftstop
, rightstart
,
6544 rightstop
, (const char *) NULL
, flab
, extent
);
6546 input_line_pointer
+= 3;
6547 if (*input_line_pointer
!= '.'
6548 || input_line_pointer
[1] == '\0')
6552 qual
= input_line_pointer
[1];
6553 input_line_pointer
+= 2;
6556 if (! parse_mri_control_operand (&cc
, &leftstart
, &leftstop
,
6557 &rightstart
, &rightstop
))
6563 build_mri_control_operand (qual
, cc
, leftstart
, leftstop
, rightstart
,
6564 rightstop
, truelab
, falselab
, extent
);
6566 if (falselab
== NULL
)
6569 else if (strncasecmp (input_line_pointer
, "OR", 2) == 0)
6573 if (truelab
!= NULL
)
6576 tlab
= mri_control_label ();
6578 build_mri_control_operand (qual
, cc
, leftstart
, leftstop
, rightstart
,
6579 rightstop
, tlab
, (const char *) NULL
, extent
);
6581 input_line_pointer
+= 2;
6582 if (*input_line_pointer
!= '.'
6583 || input_line_pointer
[1] == '\0')
6587 qual
= input_line_pointer
[1];
6588 input_line_pointer
+= 2;
6591 if (! parse_mri_control_operand (&cc
, &leftstart
, &leftstop
,
6592 &rightstart
, &rightstop
))
6598 build_mri_control_operand (qual
, cc
, leftstart
, leftstop
, rightstart
,
6599 rightstop
, truelab
, falselab
, extent
);
6601 if (truelab
== NULL
)
6606 build_mri_control_operand (qual
, cc
, leftstart
, leftstop
, rightstart
,
6607 rightstop
, truelab
, falselab
, extent
);
6611 if (input_line_pointer
!= stop
)
6612 as_bad (_("syntax error in structured control directive"));
6615 /* Handle the MRI IF pseudo-op. This may be a structured control
6616 directive, or it may be a regular assembler conditional, depending
6624 struct mri_control_info
*n
;
6626 /* A structured control directive must end with THEN with an
6627 optional qualifier. */
6628 s
= input_line_pointer
;
6629 /* We only accept '*' as introduction of comments if preceded by white space
6630 or at first column of a line (I think this can't actually happen here?)
6631 This is important when assembling:
6632 if d0 <ne> 12(a0,d0*2) then
6633 if d0 <ne> #CONST*20 then. */
6634 while (! (is_end_of_line
[(unsigned char) *s
]
6637 && (s
== input_line_pointer
6639 || *(s
-1) == '\t'))))
6642 while (s
> input_line_pointer
&& (*s
== ' ' || *s
== '\t'))
6645 if (s
- input_line_pointer
> 1
6649 if (s
- input_line_pointer
< 3
6650 || strncasecmp (s
- 3, "THEN", 4) != 0)
6654 as_bad (_("missing then"));
6655 ignore_rest_of_line ();
6659 /* It's a conditional. */
6664 /* Since this might be a conditional if, this pseudo-op will be
6665 called even if we are supported to be ignoring input. Double
6666 check now. Clobber *input_line_pointer so that ignore_input
6667 thinks that this is not a special pseudo-op. */
6668 c
= *input_line_pointer
;
6669 *input_line_pointer
= 0;
6670 if (ignore_input ())
6672 *input_line_pointer
= c
;
6673 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6674 ++input_line_pointer
;
6675 demand_empty_rest_of_line ();
6678 *input_line_pointer
= c
;
6680 n
= push_mri_control (mri_if
);
6682 parse_mri_control_expression (s
- 3, qual
, (const char *) NULL
,
6683 n
->next
, s
[1] == '.' ? s
[2] : '\0');
6686 input_line_pointer
= s
+ 3;
6688 input_line_pointer
= s
+ 1;
6692 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6693 ++input_line_pointer
;
6696 demand_empty_rest_of_line ();
6699 /* Handle the MRI else pseudo-op. If we are currently doing an MRI
6700 structured IF, associate the ELSE with the IF. Otherwise, assume
6701 it is a conditional else. */
6704 s_mri_else (int qual
)
6711 && (mri_control_stack
== NULL
6712 || mri_control_stack
->type
!= mri_if
6713 || mri_control_stack
->else_seen
))
6719 c
= *input_line_pointer
;
6720 *input_line_pointer
= 0;
6721 if (ignore_input ())
6723 *input_line_pointer
= c
;
6724 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6725 ++input_line_pointer
;
6726 demand_empty_rest_of_line ();
6729 *input_line_pointer
= c
;
6731 if (mri_control_stack
== NULL
6732 || mri_control_stack
->type
!= mri_if
6733 || mri_control_stack
->else_seen
)
6735 as_bad (_("else without matching if"));
6736 ignore_rest_of_line ();
6740 mri_control_stack
->else_seen
= 1;
6742 buf
= (char *) xmalloc (20 + strlen (mri_control_stack
->bottom
));
6743 q
[0] = TOLOWER (qual
);
6745 sprintf (buf
, "bra%s %s", q
, mri_control_stack
->bottom
);
6749 colon (mri_control_stack
->next
);
6753 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6754 ++input_line_pointer
;
6757 demand_empty_rest_of_line ();
6760 /* Handle the MRI ENDI pseudo-op. */
6763 s_mri_endi (int ignore ATTRIBUTE_UNUSED
)
6765 if (mri_control_stack
== NULL
6766 || mri_control_stack
->type
!= mri_if
)
6768 as_bad (_("endi without matching if"));
6769 ignore_rest_of_line ();
6773 /* ignore_input will not return true for ENDI, so we don't need to
6774 worry about checking it again here. */
6776 if (! mri_control_stack
->else_seen
)
6777 colon (mri_control_stack
->next
);
6778 colon (mri_control_stack
->bottom
);
6784 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6785 ++input_line_pointer
;
6788 demand_empty_rest_of_line ();
6791 /* Handle the MRI BREAK pseudo-op. */
6794 s_mri_break (int extent
)
6796 struct mri_control_info
*n
;
6800 n
= mri_control_stack
;
6802 && n
->type
!= mri_for
6803 && n
->type
!= mri_repeat
6804 && n
->type
!= mri_while
)
6808 as_bad (_("break outside of structured loop"));
6809 ignore_rest_of_line ();
6813 buf
= (char *) xmalloc (20 + strlen (n
->bottom
));
6814 ex
[0] = TOLOWER (extent
);
6816 sprintf (buf
, "bra%s %s", ex
, n
->bottom
);
6822 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6823 ++input_line_pointer
;
6826 demand_empty_rest_of_line ();
6829 /* Handle the MRI NEXT pseudo-op. */
6832 s_mri_next (int extent
)
6834 struct mri_control_info
*n
;
6838 n
= mri_control_stack
;
6840 && n
->type
!= mri_for
6841 && n
->type
!= mri_repeat
6842 && n
->type
!= mri_while
)
6846 as_bad (_("next outside of structured loop"));
6847 ignore_rest_of_line ();
6851 buf
= (char *) xmalloc (20 + strlen (n
->next
));
6852 ex
[0] = TOLOWER (extent
);
6854 sprintf (buf
, "bra%s %s", ex
, n
->next
);
6860 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6861 ++input_line_pointer
;
6864 demand_empty_rest_of_line ();
6867 /* Handle the MRI FOR pseudo-op. */
6870 s_mri_for (int qual
)
6872 const char *varstart
, *varstop
;
6873 const char *initstart
, *initstop
;
6874 const char *endstart
, *endstop
;
6875 const char *bystart
, *bystop
;
6879 struct mri_control_info
*n
;
6885 FOR.q var = init { TO | DOWNTO } end [ BY by ] DO.e
6889 varstart
= input_line_pointer
;
6891 /* Look for the '='. */
6892 while (! is_end_of_line
[(unsigned char) *input_line_pointer
]
6893 && *input_line_pointer
!= '=')
6894 ++input_line_pointer
;
6895 if (*input_line_pointer
!= '=')
6897 as_bad (_("missing ="));
6898 ignore_rest_of_line ();
6902 varstop
= input_line_pointer
;
6903 if (varstop
> varstart
6904 && (varstop
[-1] == ' ' || varstop
[-1] == '\t'))
6907 ++input_line_pointer
;
6909 initstart
= input_line_pointer
;
6911 /* Look for TO or DOWNTO. */
6914 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6916 if (strncasecmp (input_line_pointer
, "TO", 2) == 0
6917 && ! is_part_of_name (input_line_pointer
[2]))
6919 initstop
= input_line_pointer
;
6920 input_line_pointer
+= 2;
6923 if (strncasecmp (input_line_pointer
, "DOWNTO", 6) == 0
6924 && ! is_part_of_name (input_line_pointer
[6]))
6926 initstop
= input_line_pointer
;
6928 input_line_pointer
+= 6;
6931 ++input_line_pointer
;
6933 if (initstop
== NULL
)
6935 as_bad (_("missing to or downto"));
6936 ignore_rest_of_line ();
6939 if (initstop
> initstart
6940 && (initstop
[-1] == ' ' || initstop
[-1] == '\t'))
6944 endstart
= input_line_pointer
;
6946 /* Look for BY or DO. */
6949 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6951 if (strncasecmp (input_line_pointer
, "BY", 2) == 0
6952 && ! is_part_of_name (input_line_pointer
[2]))
6954 endstop
= input_line_pointer
;
6956 input_line_pointer
+= 2;
6959 if (strncasecmp (input_line_pointer
, "DO", 2) == 0
6960 && (input_line_pointer
[2] == '.'
6961 || ! is_part_of_name (input_line_pointer
[2])))
6963 endstop
= input_line_pointer
;
6964 input_line_pointer
+= 2;
6967 ++input_line_pointer
;
6969 if (endstop
== NULL
)
6971 as_bad (_("missing do"));
6972 ignore_rest_of_line ();
6975 if (endstop
> endstart
6976 && (endstop
[-1] == ' ' || endstop
[-1] == '\t'))
6982 bystop
= bystart
+ 2;
6987 bystart
= input_line_pointer
;
6991 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6993 if (strncasecmp (input_line_pointer
, "DO", 2) == 0
6994 && (input_line_pointer
[2] == '.'
6995 || ! is_part_of_name (input_line_pointer
[2])))
6997 bystop
= input_line_pointer
;
6998 input_line_pointer
+= 2;
7001 ++input_line_pointer
;
7005 as_bad (_("missing do"));
7006 ignore_rest_of_line ();
7009 if (bystop
> bystart
7010 && (bystop
[-1] == ' ' || bystop
[-1] == '\t'))
7014 if (*input_line_pointer
!= '.')
7018 extent
= input_line_pointer
[1];
7019 input_line_pointer
+= 2;
7022 /* We have fully parsed the FOR operands. Now build the loop. */
7023 n
= push_mri_control (mri_for
);
7025 buf
= (char *) xmalloc (50 + (input_line_pointer
- varstart
));
7027 /* Move init,var. */
7034 *s
++ = TOLOWER (qual
);
7036 memcpy (s
, initstart
, initstop
- initstart
);
7037 s
+= initstop
- initstart
;
7039 memcpy (s
, varstart
, varstop
- varstart
);
7040 s
+= varstop
- varstart
;
7052 *s
++ = TOLOWER (qual
);
7054 memcpy (s
, endstart
, endstop
- endstart
);
7055 s
+= endstop
- endstart
;
7057 memcpy (s
, varstart
, varstop
- varstart
);
7058 s
+= varstop
- varstart
;
7063 ex
[0] = TOLOWER (extent
);
7066 sprintf (buf
, "blt%s %s", ex
, n
->bottom
);
7068 sprintf (buf
, "bgt%s %s", ex
, n
->bottom
);
7071 /* Put together the add or sub instruction used by ENDF. */
7079 *s
++ = TOLOWER (qual
);
7081 memcpy (s
, bystart
, bystop
- bystart
);
7082 s
+= bystop
- bystart
;
7084 memcpy (s
, varstart
, varstop
- varstart
);
7085 s
+= varstop
- varstart
;
7091 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
7092 ++input_line_pointer
;
7095 demand_empty_rest_of_line ();
7098 /* Handle the MRI ENDF pseudo-op. */
7101 s_mri_endf (int ignore ATTRIBUTE_UNUSED
)
7103 if (mri_control_stack
== NULL
7104 || mri_control_stack
->type
!= mri_for
)
7106 as_bad (_("endf without for"));
7107 ignore_rest_of_line ();
7111 colon (mri_control_stack
->next
);
7113 mri_assemble (mri_control_stack
->incr
);
7115 sprintf (mri_control_stack
->incr
, "bra %s", mri_control_stack
->top
);
7116 mri_assemble (mri_control_stack
->incr
);
7118 free (mri_control_stack
->incr
);
7120 colon (mri_control_stack
->bottom
);
7126 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
7127 ++input_line_pointer
;
7130 demand_empty_rest_of_line ();
7133 /* Handle the MRI REPEAT pseudo-op. */
7136 s_mri_repeat (int ignore ATTRIBUTE_UNUSED
)
7138 struct mri_control_info
*n
;
7140 n
= push_mri_control (mri_repeat
);
7144 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
7145 ++input_line_pointer
;
7147 demand_empty_rest_of_line ();
7150 /* Handle the MRI UNTIL pseudo-op. */
7153 s_mri_until (int qual
)
7157 if (mri_control_stack
== NULL
7158 || mri_control_stack
->type
!= mri_repeat
)
7160 as_bad (_("until without repeat"));
7161 ignore_rest_of_line ();
7165 colon (mri_control_stack
->next
);
7167 for (s
= input_line_pointer
; ! is_end_of_line
[(unsigned char) *s
]; s
++)
7170 parse_mri_control_expression (s
, qual
, (const char *) NULL
,
7171 mri_control_stack
->top
, '\0');
7173 colon (mri_control_stack
->bottom
);
7175 input_line_pointer
= s
;
7181 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
7182 ++input_line_pointer
;
7185 demand_empty_rest_of_line ();
7188 /* Handle the MRI WHILE pseudo-op. */
7191 s_mri_while (int qual
)
7195 struct mri_control_info
*n
;
7197 s
= input_line_pointer
;
7198 /* We only accept '*' as introduction of comments if preceded by white space
7199 or at first column of a line (I think this can't actually happen here?)
7200 This is important when assembling:
7201 while d0 <ne> 12(a0,d0*2) do
7202 while d0 <ne> #CONST*20 do. */
7203 while (! (is_end_of_line
[(unsigned char) *s
]
7206 && (s
== input_line_pointer
7208 || *(s
-1) == '\t'))))
7211 while (*s
== ' ' || *s
== '\t')
7213 if (s
- input_line_pointer
> 1
7216 if (s
- input_line_pointer
< 2
7217 || strncasecmp (s
- 1, "DO", 2) != 0)
7219 as_bad (_("missing do"));
7220 ignore_rest_of_line ();
7224 n
= push_mri_control (mri_while
);
7228 parse_mri_control_expression (s
- 1, qual
, (const char *) NULL
, n
->bottom
,
7229 s
[1] == '.' ? s
[2] : '\0');
7231 input_line_pointer
= s
+ 1;
7232 if (*input_line_pointer
== '.')
7233 input_line_pointer
+= 2;
7237 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
7238 ++input_line_pointer
;
7241 demand_empty_rest_of_line ();
7244 /* Handle the MRI ENDW pseudo-op. */
7247 s_mri_endw (int ignore ATTRIBUTE_UNUSED
)
7251 if (mri_control_stack
== NULL
7252 || mri_control_stack
->type
!= mri_while
)
7254 as_bad (_("endw without while"));
7255 ignore_rest_of_line ();
7259 buf
= (char *) xmalloc (20 + strlen (mri_control_stack
->next
));
7260 sprintf (buf
, "bra %s", mri_control_stack
->next
);
7264 colon (mri_control_stack
->bottom
);
7270 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
7271 ++input_line_pointer
;
7274 demand_empty_rest_of_line ();
7277 /* Parse a .cpu directive. */
7280 s_m68k_cpu (int ignored ATTRIBUTE_UNUSED
)
7287 as_bad (_("already assembled instructions"));
7288 ignore_rest_of_line ();
7292 name
= input_line_pointer
;
7293 while (*input_line_pointer
&& !ISSPACE(*input_line_pointer
))
7294 input_line_pointer
++;
7295 saved_char
= *input_line_pointer
;
7296 *input_line_pointer
= 0;
7298 m68k_set_cpu (name
, 1, 0);
7300 *input_line_pointer
= saved_char
;
7301 demand_empty_rest_of_line ();
7305 /* Parse a .arch directive. */
7308 s_m68k_arch (int ignored ATTRIBUTE_UNUSED
)
7315 as_bad (_("already assembled instructions"));
7316 ignore_rest_of_line ();
7320 name
= input_line_pointer
;
7321 while (*input_line_pointer
&& *input_line_pointer
!= ','
7322 && !ISSPACE (*input_line_pointer
))
7323 input_line_pointer
++;
7324 saved_char
= *input_line_pointer
;
7325 *input_line_pointer
= 0;
7327 if (m68k_set_arch (name
, 1, 0))
7329 /* Scan extensions. */
7332 *input_line_pointer
++ = saved_char
;
7333 if (!*input_line_pointer
|| ISSPACE (*input_line_pointer
))
7335 name
= input_line_pointer
;
7336 while (*input_line_pointer
&& *input_line_pointer
!= ','
7337 && !ISSPACE (*input_line_pointer
))
7338 input_line_pointer
++;
7339 saved_char
= *input_line_pointer
;
7340 *input_line_pointer
= 0;
7342 while (m68k_set_extension (name
, 1, 0));
7345 *input_line_pointer
= saved_char
;
7346 demand_empty_rest_of_line ();
7350 /* Lookup a cpu name in TABLE and return the slot found. Return NULL
7351 if none is found, the caller is responsible for emitting an error
7352 message. If ALLOW_M is non-zero, we allow an initial 'm' on the
7353 cpu name, if it begins with a '6' (possibly skipping an intervening
7354 'c'. We also allow a 'c' in the same place. if NEGATED is
7355 non-zero, we accept a leading 'no-' and *NEGATED is set to true, if
7356 the option is indeed negated. */
7358 static const struct m68k_cpu
*
7359 m68k_lookup_cpu (const char *arg
, const struct m68k_cpu
*table
,
7360 int allow_m
, int *negated
)
7362 /* allow negated value? */
7367 if (arg
[0] == 'n' && arg
[1] == 'o' && arg
[2] == '-')
7374 /* Remove 'm' or 'mc' prefix from 68k variants. */
7381 else if (arg
[1] == 'c' && arg
[2] == '6')
7385 else if (arg
[0] == 'c' && arg
[1] == '6')
7388 for (; table
->name
; table
++)
7389 if (!strcmp (arg
, table
->name
))
7391 if (table
->alias
< -1 || table
->alias
> 1)
7392 as_bad (_("`%s' is deprecated, use `%s'"),
7393 table
->name
, table
[table
->alias
< 0 ? 1 : -1].name
);
7399 /* Set the cpu, issuing errors if it is unrecognized. */
7402 m68k_set_cpu (char const *name
, int allow_m
, int silent
)
7404 const struct m68k_cpu
*cpu
;
7406 cpu
= m68k_lookup_cpu (name
, m68k_cpus
, allow_m
, NULL
);
7411 as_bad (_("cpu `%s' unrecognized"), name
);
7418 /* Set the architecture, issuing errors if it is unrecognized. */
7421 m68k_set_arch (char const *name
, int allow_m
, int silent
)
7423 const struct m68k_cpu
*arch
;
7425 arch
= m68k_lookup_cpu (name
, m68k_archs
, allow_m
, NULL
);
7430 as_bad (_("architecture `%s' unrecognized"), name
);
7433 selected_arch
= arch
;
7437 /* Set the architecture extension, issuing errors if it is
7438 unrecognized, or invalid */
7441 m68k_set_extension (char const *name
, int allow_m
, int silent
)
7444 const struct m68k_cpu
*ext
;
7446 ext
= m68k_lookup_cpu (name
, m68k_extensions
, allow_m
, &negated
);
7451 as_bad (_("extension `%s' unrecognized"), name
);
7456 not_current_architecture
|= (ext
->control_regs
7457 ? *(unsigned *)ext
->control_regs
: ext
->arch
);
7459 current_architecture
|= ext
->arch
;
7464 Invocation line includes a switch not recognized by the base assembler.
7468 const char *md_shortopts
= "lSA:m:kQ:V";
7470 const char *md_shortopts
= "lSA:m:k";
7473 struct option md_longopts
[] = {
7474 #define OPTION_PIC (OPTION_MD_BASE)
7475 {"pic", no_argument
, NULL
, OPTION_PIC
},
7476 #define OPTION_REGISTER_PREFIX_OPTIONAL (OPTION_MD_BASE + 1)
7477 {"register-prefix-optional", no_argument
, NULL
,
7478 OPTION_REGISTER_PREFIX_OPTIONAL
},
7479 #define OPTION_BITWISE_OR (OPTION_MD_BASE + 2)
7480 {"bitwise-or", no_argument
, NULL
, OPTION_BITWISE_OR
},
7481 #define OPTION_BASE_SIZE_DEFAULT_16 (OPTION_MD_BASE + 3)
7482 {"base-size-default-16", no_argument
, NULL
, OPTION_BASE_SIZE_DEFAULT_16
},
7483 #define OPTION_BASE_SIZE_DEFAULT_32 (OPTION_MD_BASE + 4)
7484 {"base-size-default-32", no_argument
, NULL
, OPTION_BASE_SIZE_DEFAULT_32
},
7485 #define OPTION_DISP_SIZE_DEFAULT_16 (OPTION_MD_BASE + 5)
7486 {"disp-size-default-16", no_argument
, NULL
, OPTION_DISP_SIZE_DEFAULT_16
},
7487 #define OPTION_DISP_SIZE_DEFAULT_32 (OPTION_MD_BASE + 6)
7488 {"disp-size-default-32", no_argument
, NULL
, OPTION_DISP_SIZE_DEFAULT_32
},
7489 #define OPTION_PCREL (OPTION_MD_BASE + 7)
7490 {"pcrel", no_argument
, NULL
, OPTION_PCREL
},
7491 {NULL
, no_argument
, NULL
, 0}
7493 size_t md_longopts_size
= sizeof (md_longopts
);
7496 md_parse_option (int c
, char *arg
)
7500 case 'l': /* -l means keep external to 2 bit offset
7501 rather than 16 bit one. */
7502 flag_short_refs
= 1;
7505 case 'S': /* -S means that jbsr's always turn into
7507 flag_long_jumps
= 1;
7510 case OPTION_PCREL
: /* --pcrel means never turn PC-relative
7511 branches into absolute jumps. */
7512 flag_keep_pcrel
= 1;
7518 break; /* -pic, Position Independent Code. */
7520 case OPTION_REGISTER_PREFIX_OPTIONAL
:
7521 flag_reg_prefix_optional
= 1;
7522 reg_prefix_optional_seen
= 1;
7525 /* -V: SVR4 argument to print version ID. */
7527 print_version_id ();
7530 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
7531 should be emitted or not. FIXME: Not implemented. */
7535 case OPTION_BITWISE_OR
:
7540 n
= (char *) xmalloc (strlen (m68k_comment_chars
) + 1);
7542 for (s
= m68k_comment_chars
; *s
!= '\0'; s
++)
7546 m68k_comment_chars
= n
;
7550 case OPTION_BASE_SIZE_DEFAULT_16
:
7551 m68k_index_width_default
= SIZE_WORD
;
7554 case OPTION_BASE_SIZE_DEFAULT_32
:
7555 m68k_index_width_default
= SIZE_LONG
;
7558 case OPTION_DISP_SIZE_DEFAULT_16
:
7560 m68k_rel32_from_cmdline
= 1;
7563 case OPTION_DISP_SIZE_DEFAULT_32
:
7565 m68k_rel32_from_cmdline
= 1;
7570 as_tsktsk (_ ("option `-A%s' is deprecated: use `-%s'",
7573 /* Intentional fall-through. */
7575 if (!strncmp (arg
, "arch=", 5))
7576 m68k_set_arch (arg
+ 5, 1, 0);
7577 else if (!strncmp (arg
, "cpu=", 4))
7578 m68k_set_cpu (arg
+ 4, 1, 0);
7579 else if (m68k_set_extension (arg
, 0, 1))
7581 else if (m68k_set_arch (arg
, 0, 1))
7583 else if (m68k_set_cpu (arg
, 0, 1))
7596 /* Setup tables from the selected arch and/or cpu */
7599 m68k_init_arch (void)
7601 if (not_current_architecture
& current_architecture
)
7603 as_bad (_("architecture features both enabled and disabled"));
7604 not_current_architecture
&= ~current_architecture
;
7608 current_architecture
|= selected_arch
->arch
;
7609 control_regs
= selected_arch
->control_regs
;
7612 current_architecture
|= selected_cpu
->arch
;
7614 current_architecture
&= ~not_current_architecture
;
7616 if ((current_architecture
& (cfloat
| m68881
)) == (cfloat
| m68881
))
7618 /* Determine which float is really meant. */
7619 if (current_architecture
& (m68k_mask
& ~m68881
))
7620 current_architecture
^= cfloat
;
7622 current_architecture
^= m68881
;
7627 control_regs
= selected_cpu
->control_regs
;
7628 if (current_architecture
& ~selected_cpu
->arch
)
7630 as_bad (_("selected processor does not have all features of selected architecture"));
7631 current_architecture
7632 = selected_cpu
->arch
& ~not_current_architecture
;
7636 if ((current_architecture
& m68k_mask
)
7637 && (current_architecture
& ~m68k_mask
))
7639 as_bad (_ ("m68k and cf features both selected"));
7640 if (current_architecture
& m68k_mask
)
7641 current_architecture
&= m68k_mask
;
7643 current_architecture
&= ~m68k_mask
;
7646 /* Permit m68881 specification with all cpus; those that can't work
7647 with a coprocessor could be doing emulation. */
7648 if (current_architecture
& m68851
)
7650 if (current_architecture
& m68040
)
7651 as_warn (_("68040 and 68851 specified; mmu instructions may assemble incorrectly"));
7653 /* What other incompatibilities could we check for? */
7655 if (cpu_of_arch (current_architecture
) < m68020
7656 || arch_coldfire_p (current_architecture
))
7657 md_relax_table
[TAB (PCINDEX
, BYTE
)].rlx_more
= 0;
7663 md_show_usage (FILE *stream
)
7665 const char *default_cpu
= TARGET_CPU
;
7667 unsigned int default_arch
;
7669 /* Get the canonical name for the default target CPU. */
7670 if (*default_cpu
== 'm')
7672 for (i
= 0; m68k_cpus
[i
].name
; i
++)
7674 if (strcasecmp (default_cpu
, m68k_cpus
[i
].name
) == 0)
7676 default_arch
= m68k_cpus
[i
].arch
;
7677 while (m68k_cpus
[i
].alias
> 0)
7679 while (m68k_cpus
[i
].alias
< 0)
7681 default_cpu
= m68k_cpus
[i
].name
;
7685 fprintf (stream
, _("\
7686 -march=<arch> set architecture\n\
7687 -mcpu=<cpu> set cpu [default %s]\n\
7689 for (i
= 0; m68k_extensions
[i
].name
; i
++)
7690 fprintf (stream
, _("\
7691 -m[no-]%-16s enable/disable%s architecture extension\n\
7692 "), m68k_extensions
[i
].name
,
7693 m68k_extensions
[i
].alias
> 0 ? " ColdFire"
7694 : m68k_extensions
[i
].alias
< 0 ? " m68k" : "");
7696 fprintf (stream
, _("\
7697 -l use 1 word for refs to undefined symbols [default 2]\n\
7698 -pic, -k generate position independent code\n\
7699 -S turn jbsr into jsr\n\
7700 --pcrel never turn PC-relative branches into absolute jumps\n\
7701 --register-prefix-optional\n\
7702 recognize register names without prefix character\n\
7703 --bitwise-or do not treat `|' as a comment character\n\
7704 --base-size-default-16 base reg without size is 16 bits\n\
7705 --base-size-default-32 base reg without size is 32 bits (default)\n\
7706 --disp-size-default-16 displacement with unknown size is 16 bits\n\
7707 --disp-size-default-32 displacement with unknown size is 32 bits (default)\n\
7710 fprintf (stream
, _("Architecture variants are: "));
7711 for (i
= 0; m68k_archs
[i
].name
; i
++)
7714 fprintf (stream
, " | ");
7715 fprintf (stream
, "%s", m68k_archs
[i
].name
);
7717 fprintf (stream
, "\n");
7719 fprintf (stream
, _("Processor variants are: "));
7720 for (i
= 0; m68k_cpus
[i
].name
; i
++)
7723 fprintf (stream
, " | ");
7724 fprintf (stream
, "%s", m68k_cpus
[i
].name
);
7726 fprintf (stream
, _("\n"));
7731 /* TEST2: Test md_assemble() */
7732 /* Warning, this routine probably doesn't work anymore. */
7736 struct m68k_it the_ins
;
7744 if (!gets (buf
) || !*buf
)
7746 if (buf
[0] == '|' || buf
[1] == '.')
7748 for (cp
= buf
; *cp
; cp
++)
7753 memset (&the_ins
, '\0', sizeof (the_ins
));
7754 m68k_ip (&the_ins
, buf
);
7757 printf (_("Error %s in %s\n"), the_ins
.error
, buf
);
7761 printf (_("Opcode(%d.%s): "), the_ins
.numo
, the_ins
.args
);
7762 for (n
= 0; n
< the_ins
.numo
; n
++)
7763 printf (" 0x%x", the_ins
.opcode
[n
] & 0xffff);
7765 print_the_insn (&the_ins
.opcode
[0], stdout
);
7766 (void) putchar ('\n');
7768 for (n
= 0; n
< strlen (the_ins
.args
) / 2; n
++)
7770 if (the_ins
.operands
[n
].error
)
7772 printf ("op%d Error %s in %s\n", n
, the_ins
.operands
[n
].error
, buf
);
7775 printf ("mode %d, reg %d, ", the_ins
.operands
[n
].mode
,
7776 the_ins
.operands
[n
].reg
);
7777 if (the_ins
.operands
[n
].b_const
)
7778 printf ("Constant: '%.*s', ",
7779 1 + the_ins
.operands
[n
].e_const
- the_ins
.operands
[n
].b_const
,
7780 the_ins
.operands
[n
].b_const
);
7781 printf ("ireg %d, isiz %d, imul %d, ", the_ins
.operands
[n
].ireg
,
7782 the_ins
.operands
[n
].isiz
, the_ins
.operands
[n
].imul
);
7783 if (the_ins
.operands
[n
].b_iadd
)
7784 printf ("Iadd: '%.*s',",
7785 1 + the_ins
.operands
[n
].e_iadd
- the_ins
.operands
[n
].b_iadd
,
7786 the_ins
.operands
[n
].b_iadd
);
7795 is_label (char *str
)
7799 while (*str
&& *str
!= ' ')
7801 if (str
[-1] == ':' || str
[1] == '=')
7808 /* Possible states for relaxation:
7810 0 0 branch offset byte (bra, etc)
7814 1 0 indexed offsets byte a0@(32,d4:w:1) etc
7818 2 0 two-offset index word-word a0@(32,d4)@(45) etc
7825 /* We have no need to default values of symbols. */
7828 md_undefined_symbol (char *name ATTRIBUTE_UNUSED
)
7833 /* Round up a section size to the appropriate boundary. */
7835 md_section_align (segT segment ATTRIBUTE_UNUSED
, valueT size
)
7838 /* For a.out, force the section size to be aligned. If we don't do
7839 this, BFD will align it for us, but it will not write out the
7840 final bytes of the section. This may be a bug in BFD, but it is
7841 easier to fix it here since that is how the other a.out targets
7845 align
= bfd_get_section_alignment (stdoutput
, segment
);
7846 size
= ((size
+ (1 << align
) - 1) & ((valueT
) -1 << align
));
7852 /* Exactly what point is a PC-relative offset relative TO?
7853 On the 68k, it is relative to the address of the first extension
7854 word. The difference between the addresses of the offset and the
7855 first extension word is stored in fx_pcrel_adjust. */
7857 md_pcrel_from (fixS
*fixP
)
7861 /* Because fx_pcrel_adjust is a char, and may be unsigned, we explicitly
7862 sign extend the value here. */
7863 adjust
= ((fixP
->fx_pcrel_adjust
& 0xff) ^ 0x80) - 0x80;
7866 return fixP
->fx_where
+ fixP
->fx_frag
->fr_address
- adjust
;
7871 m68k_elf_final_processing (void)
7875 if (arch_coldfire_fpu (current_architecture
))
7876 flags
|= EF_M68K_CFV4E
;
7877 /* Set file-specific flags if this is a cpu32 processor. */
7878 if (cpu_of_arch (current_architecture
) & cpu32
)
7879 flags
|= EF_M68K_CPU32
;
7880 else if (cpu_of_arch (current_architecture
) & fido_a
)
7881 flags
|= EF_M68K_FIDO
;
7882 else if ((cpu_of_arch (current_architecture
) & m68000up
)
7883 && !(cpu_of_arch (current_architecture
) & m68020up
))
7884 flags
|= EF_M68K_M68000
;
7886 if (current_architecture
& mcfisa_a
)
7888 static const unsigned isa_features
[][2] =
7890 {EF_M68K_CF_ISA_A_NODIV
,mcfisa_a
},
7891 {EF_M68K_CF_ISA_A
, mcfisa_a
|mcfhwdiv
},
7892 {EF_M68K_CF_ISA_A_PLUS
, mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfusp
},
7893 {EF_M68K_CF_ISA_B_NOUSP
,mcfisa_a
|mcfisa_b
|mcfhwdiv
},
7894 {EF_M68K_CF_ISA_B
, mcfisa_a
|mcfisa_b
|mcfhwdiv
|mcfusp
},
7895 {EF_M68K_CF_ISA_C
, mcfisa_a
|mcfisa_c
|mcfhwdiv
|mcfusp
},
7896 {EF_M68K_CF_ISA_C_NODIV
,mcfisa_a
|mcfisa_c
|mcfusp
},
7899 static const unsigned mac_features
[][2] =
7901 {EF_M68K_CF_MAC
, mcfmac
},
7902 {EF_M68K_CF_EMAC
, mcfemac
},
7908 pattern
= (current_architecture
7909 & (mcfisa_a
|mcfisa_aa
|mcfisa_b
|mcfisa_c
|mcfhwdiv
|mcfusp
));
7910 for (ix
= 0; isa_features
[ix
][1]; ix
++)
7912 if (pattern
== isa_features
[ix
][1])
7914 flags
|= isa_features
[ix
][0];
7918 if (!isa_features
[ix
][1])
7921 as_warn (_("Not a defined coldfire architecture"));
7925 if (current_architecture
& cfloat
)
7926 flags
|= EF_M68K_CF_FLOAT
| EF_M68K_CFV4E
;
7928 pattern
= current_architecture
& (mcfmac
|mcfemac
);
7931 for (ix
= 0; mac_features
[ix
][1]; ix
++)
7933 if (pattern
== mac_features
[ix
][1])
7935 flags
|= mac_features
[ix
][0];
7939 if (!mac_features
[ix
][1])
7944 elf_elfheader (stdoutput
)->e_flags
|= flags
;
7947 /* Parse @TLSLDO and return the desired relocation. */
7948 static bfd_reloc_code_real_type
7949 m68k_elf_suffix (char **str_p
, expressionS
*exp_p
)
7958 return BFD_RELOC_UNUSED
;
7960 for (ch
= *str
, str2
= ident
;
7961 (str2
< ident
+ sizeof (ident
) - 1
7962 && (ISALNUM (ch
) || ch
== '@'));
7971 if (strncmp (ident
, "TLSLDO", 6) == 0
7974 /* Now check for identifier@suffix+constant. */
7975 if (*str
== '-' || *str
== '+')
7977 char *orig_line
= input_line_pointer
;
7978 expressionS new_exp
;
7980 input_line_pointer
= str
;
7981 expression (&new_exp
);
7982 if (new_exp
.X_op
== O_constant
)
7984 exp_p
->X_add_number
+= new_exp
.X_add_number
;
7985 str
= input_line_pointer
;
7988 if (&input_line_pointer
!= str_p
)
7989 input_line_pointer
= orig_line
;
7993 return BFD_RELOC_68K_TLS_LDO32
;
7996 return BFD_RELOC_UNUSED
;
7999 /* Handles .long <tls_symbol>+0x8000 debug info.
8000 Clobbers input_line_pointer, checks end-of-line.
8001 Adapted from tc-ppc.c:ppc_elf_cons. */
8003 m68k_elf_cons (int nbytes
/* 4=.long */)
8005 if (is_it_end_of_statement ())
8007 demand_empty_rest_of_line ();
8014 bfd_reloc_code_real_type reloc
;
8017 if (exp
.X_op
== O_symbol
8018 && *input_line_pointer
== '@'
8019 && (reloc
= m68k_elf_suffix (&input_line_pointer
,
8020 &exp
)) != BFD_RELOC_UNUSED
)
8022 reloc_howto_type
*reloc_howto
;
8025 reloc_howto
= bfd_reloc_type_lookup (stdoutput
, reloc
);
8026 size
= bfd_get_reloc_size (reloc_howto
);
8030 as_bad (_("%s relocations do not fit in %d bytes\n"),
8031 reloc_howto
->name
, nbytes
);
8038 p
= frag_more (nbytes
);
8040 if (target_big_endian
)
8041 offset
= nbytes
- size
;
8042 fix_new_exp (frag_now
, p
- frag_now
->fr_literal
+ offset
, size
,
8047 emit_expr (&exp
, (unsigned int) nbytes
);
8049 while (*input_line_pointer
++ == ',');
8051 /* Put terminator back into stream. */
8052 input_line_pointer
--;
8053 demand_empty_rest_of_line ();
8058 tc_m68k_regname_to_dw2regnum (char *regname
)
8060 unsigned int regnum
;
8061 static const char *const regnames
[] =
8063 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
8064 "a0", "a1", "a2", "a3", "a4", "a5", "a6", "sp",
8065 "fp0", "fp1", "fp2", "fp3", "fp4", "fp5", "fp6", "fp7",
8069 for (regnum
= 0; regnum
< ARRAY_SIZE (regnames
); regnum
++)
8070 if (strcmp (regname
, regnames
[regnum
]) == 0)
8077 tc_m68k_frame_initial_instructions (void)
8079 static int sp_regno
= -1;
8082 sp_regno
= tc_m68k_regname_to_dw2regnum ("sp");
8084 cfi_add_CFA_def_cfa (sp_regno
, -DWARF2_CIE_DATA_ALIGNMENT
);
8085 cfi_add_CFA_offset (DWARF2_DEFAULT_RETURN_COLUMN
, DWARF2_CIE_DATA_ALIGNMENT
);