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 Free Software Foundation, Inc.
5 This file is part of GAS, the GNU Assembler.
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
12 GAS is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to the Free
19 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
23 #include "safe-ctype.h"
26 #include "dwarf2dbg.h"
27 #include "dw2gencfi.h"
29 #include "opcode/m68k.h"
30 #include "m68k-parse.h"
40 /* This string holds the chars that always start a comment. If the
41 pre-processor is disabled, these aren't very useful. The macro
42 tc_comment_chars points to this. We use this, rather than the
43 usual comment_chars, so that the --bitwise-or option will work. */
44 #if defined (TE_SVR4) || defined (TE_DELTA)
45 const char *m68k_comment_chars
= "|#";
47 const char *m68k_comment_chars
= "|";
50 /* This array holds the chars that only start a comment at the beginning of
51 a line. If the line seems to have the form '# 123 filename'
52 .line and .file directives will appear in the pre-processed output */
53 /* Note that input_file.c hand checks for '#' at the beginning of the
54 first line of the input file. This is because the compiler outputs
55 #NO_APP at the beginning of its output. */
56 /* Also note that comments like this one will always work. */
57 const char line_comment_chars
[] = "#*";
59 const char line_separator_chars
[] = ";";
61 /* Chars that can be used to separate mant from exp in floating point nums. */
62 const char EXP_CHARS
[] = "eE";
64 /* Chars that mean this number is a floating point constant, as
65 in "0f12.456" or "0d1.2345e12". */
67 const char FLT_CHARS
[] = "rRsSfFdDxXeEpP";
69 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
70 changed in read.c . Ideally it shouldn't have to know about it at all,
71 but nothing is ideal around here. */
73 /* Are we trying to generate PIC code? If so, absolute references
74 ought to be made into linkage table references or pc-relative
75 references. Not implemented. For ELF there are other means
76 to denote pic relocations. */
79 static int flag_short_refs
; /* -l option. */
80 static int flag_long_jumps
; /* -S option. */
81 static int flag_keep_pcrel
; /* --pcrel option. */
83 #ifdef REGISTER_PREFIX_OPTIONAL
84 int flag_reg_prefix_optional
= REGISTER_PREFIX_OPTIONAL
;
86 int flag_reg_prefix_optional
;
89 /* Whether --register-prefix-optional was used on the command line. */
90 static int reg_prefix_optional_seen
;
92 /* The floating point coprocessor to use by default. */
93 static enum m68k_register m68k_float_copnum
= COP1
;
95 /* If this is non-zero, then references to number(%pc) will be taken
96 to refer to number, rather than to %pc + number. */
97 static int m68k_abspcadd
;
99 /* If this is non-zero, then the quick forms of the move, add, and sub
100 instructions are used when possible. */
101 static int m68k_quick
= 1;
103 /* If this is non-zero, then if the size is not specified for a base
104 or outer displacement, the assembler assumes that the size should
106 static int m68k_rel32
= 1;
108 /* This is non-zero if m68k_rel32 was set from the command line. */
109 static int m68k_rel32_from_cmdline
;
111 /* The default width to use for an index register when using a base
113 static enum m68k_size m68k_index_width_default
= SIZE_LONG
;
115 /* We want to warn if any text labels are misaligned. In order to get
116 the right line number, we need to record the line number for each
120 struct label_line
*next
;
127 /* The list of labels. */
129 static struct label_line
*labels
;
131 /* The current label. */
133 static struct label_line
*current_label
;
135 /* Pointer to list holding the opcodes sorted by name. */
136 static struct m68k_opcode
const ** m68k_sorted_opcodes
;
138 /* Its an arbitrary name: This means I don't approve of it.
140 static struct obstack robyn
;
144 const char *m_operands
;
145 unsigned long m_opcode
;
149 struct m68k_incant
*m_next
;
152 #define getone(x) ((((x)->m_opcode)>>16)&0xffff)
153 #define gettwo(x) (((x)->m_opcode)&0xffff)
155 static const enum m68k_register m68000_ctrl
[] = { 0 };
156 static const enum m68k_register m68010_ctrl
[] = {
160 static const enum m68k_register m68020_ctrl
[] = {
161 SFC
, DFC
, USP
, VBR
, CACR
, CAAR
, MSP
, ISP
,
164 static const enum m68k_register m68040_ctrl
[] = {
165 SFC
, DFC
, CACR
, TC
, ITT0
, ITT1
, DTT0
, DTT1
,
166 USP
, VBR
, MSP
, ISP
, MMUSR
, URP
, SRP
,
169 static const enum m68k_register m68060_ctrl
[] = {
170 SFC
, DFC
, CACR
, TC
, ITT0
, ITT1
, DTT0
, DTT1
, BUSCR
,
171 USP
, VBR
, URP
, SRP
, PCR
,
174 static const enum m68k_register mcf_ctrl
[] = {
175 CACR
, TC
, ACR0
, ACR1
, ACR2
, ACR3
, VBR
, ROMBAR
,
176 RAMBAR0
, RAMBAR1
, RAMBAR
, MBAR
,
179 static const enum m68k_register mcf5206_ctrl
[] = {
180 CACR
, ACR0
, ACR1
, VBR
, RAMBAR0
, RAMBAR_ALT
, MBAR
,
183 static const enum m68k_register mcf5208_ctrl
[] = {
184 CACR
, ACR0
, ACR1
, VBR
, RAMBAR
, RAMBAR1
,
187 static const enum m68k_register mcf5210a_ctrl
[] = {
188 VBR
, CACR
, ACR0
, ACR1
, ROMBAR
, RAMBAR
, RAMBAR1
, MBAR
,
191 static const enum m68k_register mcf5213_ctrl
[] = {
192 VBR
, RAMBAR
, RAMBAR1
, FLASHBAR
,
195 static const enum m68k_register mcf5216_ctrl
[] = {
196 VBR
, CACR
, ACR0
, ACR1
, FLASHBAR
, RAMBAR
, RAMBAR1
,
199 static const enum m68k_register mcf52223_ctrl
[] = {
200 VBR
, CACR
, ACR0
, ACR1
, FLASHBAR
, RAMBAR
, RAMBAR1
,
203 static const enum m68k_register mcf52235_ctrl
[] = {
204 VBR
, FLASHBAR
, RAMBAR
, RAMBAR1
,
207 static const enum m68k_register mcf5225_ctrl
[] = {
208 VBR
, CACR
, ACR0
, ACR1
, FLASHBAR
, RAMBAR
, MBAR
, RAMBAR1
,
211 static const enum m68k_register mcf5235_ctrl
[] = {
212 VBR
, CACR
, ACR0
, ACR1
, RAMBAR
, RAMBAR1
,
215 static const enum m68k_register mcf5249_ctrl
[] = {
216 VBR
, CACR
, ACR0
, ACR1
, RAMBAR0
, RAMBAR1
, RAMBAR
, MBAR
, MBAR2
,
219 static const enum m68k_register mcf5250_ctrl
[] = {
223 static const enum m68k_register mcf5253_ctrl
[] = {
224 VBR
, CACR
, ACR0
, ACR1
, RAMBAR0
, RAMBAR1
, MBAR
,
227 static const enum m68k_register mcf5271_ctrl
[] = {
228 VBR
, CACR
, ACR0
, ACR1
, RAMBAR
, RAMBAR1
,
231 static const enum m68k_register mcf5272_ctrl
[] = {
232 VBR
, CACR
, ACR0
, ACR1
, ROMBAR
, RAMBAR_ALT
, RAMBAR0
, MBAR
,
235 static const enum m68k_register mcf5275_ctrl
[] = {
236 VBR
, CACR
, ACR0
, ACR1
, RAMBAR
, RAMBAR1
,
239 static const enum m68k_register mcf5282_ctrl
[] = {
240 VBR
, CACR
, ACR0
, ACR1
, FLASHBAR
, RAMBAR
, RAMBAR1
,
243 static const enum m68k_register mcf5307_ctrl
[] = {
244 CACR
, ACR0
, ACR1
, VBR
, RAMBAR0
, RAMBAR_ALT
, MBAR
,
247 static const enum m68k_register mcf5329_ctrl
[] = {
248 VBR
, CACR
, ACR0
, ACR1
, RAMBAR
, RAMBAR1
,
251 static const enum m68k_register mcf5373_ctrl
[] = {
252 VBR
, CACR
, ACR0
, ACR1
, RAMBAR
, RAMBAR1
,
255 static const enum m68k_register mcfv4e_ctrl
[] = {
256 CACR
, ASID
, ACR0
, ACR1
, ACR2
, ACR3
, MMUBAR
,
257 VBR
, PC
, ROMBAR0
, ROMBAR1
, RAMBAR0
, RAMBAR1
,
259 MPCR
/* Multiprocessor Control register */,
260 EDRAMBAR
/* Embedded DRAM Base Address Register */,
261 /* Permutation control registers. */
262 PCR1U0
, PCR1L0
, PCR1U1
, PCR1L1
, PCR2U0
, PCR2L0
, PCR2U1
, PCR2L1
,
263 PCR3U0
, PCR3L0
, PCR3U1
, PCR3L1
,
265 TC
/* ASID */, BUSCR
/* MMUBAR */,
266 ITT0
/* ACR0 */, ITT1
/* ACR1 */, DTT0
/* ACR2 */, DTT1
/* ACR3 */,
267 MBAR1
/* MBAR */, MBAR2
/* SECMBAR */, MBAR0
/* SECMBAR */,
268 ROMBAR
/* ROMBAR0 */, RAMBAR
/* RAMBAR1 */,
271 static const enum m68k_register mcf54455_ctrl
[] = {
272 CACR
, ASID
, ACR0
, ACR1
, ACR2
, ACR3
, MMUBAR
,
273 VBR
, PC
, RAMBAR1
, MBAR
,
275 TC
/* ASID */, BUSCR
/* MMUBAR */,
276 ITT0
/* ACR0 */, ITT1
/* ACR1 */, DTT0
/* ACR2 */, DTT1
/* ACR3 */,
277 MBAR1
/* MBAR */, RAMBAR
/* RAMBAR1 */,
280 static const enum m68k_register mcf5475_ctrl
[] = {
281 CACR
, ASID
, ACR0
, ACR1
, ACR2
, ACR3
, MMUBAR
,
282 VBR
, PC
, RAMBAR0
, RAMBAR1
, MBAR
,
284 TC
/* ASID */, BUSCR
/* MMUBAR */,
285 ITT0
/* ACR0 */, ITT1
/* ACR1 */, DTT0
/* ACR2 */, DTT1
/* ACR3 */,
286 MBAR1
/* MBAR */, RAMBAR
/* RAMBAR1 */,
289 static const enum m68k_register mcf5485_ctrl
[] = {
290 CACR
, ASID
, ACR0
, ACR1
, ACR2
, ACR3
, MMUBAR
,
291 VBR
, PC
, RAMBAR0
, RAMBAR1
, MBAR
,
293 TC
/* ASID */, BUSCR
/* MMUBAR */,
294 ITT0
/* ACR0 */, ITT1
/* ACR1 */, DTT0
/* ACR2 */, DTT1
/* ACR3 */,
295 MBAR1
/* MBAR */, RAMBAR
/* RAMBAR1 */,
298 static const enum m68k_register fido_ctrl
[] = {
299 SFC
, DFC
, USP
, VBR
, CAC
, MBB
,
302 #define cpu32_ctrl m68010_ctrl
304 static const enum m68k_register
*control_regs
;
306 /* Internal form of a 68020 instruction. */
310 const char *args
; /* List of opcode info. */
313 int numo
; /* Number of shorts in opcode. */
316 struct m68k_op operands
[6];
318 int nexp
; /* Number of exprs in use. */
319 struct m68k_exp exprs
[4];
321 int nfrag
; /* Number of frags we have to produce. */
324 int fragoff
; /* Where in the current opcode the frag ends. */
331 int nrel
; /* Num of reloc strucs in use. */
338 /* In a pc relative address the difference between the address
339 of the offset and the address that the offset is relative
340 to. This depends on the addressing mode. Basically this
341 is the value to put in the offset field to address the
342 first byte of the offset, without regarding the special
343 significance of some values (in the branch instruction, for
347 /* Whether this expression needs special pic relocation, and if
349 enum pic_relocation pic_reloc
;
352 reloc
[5]; /* Five is enough??? */
355 #define cpu_of_arch(x) ((x) & (m68000up | mcfisa_a | fido_a))
356 #define float_of_arch(x) ((x) & mfloat)
357 #define mmu_of_arch(x) ((x) & mmmu)
358 #define arch_coldfire_p(x) ((x) & mcfisa_a)
359 #define arch_coldfire_fpu(x) ((x) & cfloat)
361 /* Macros for determining if cpu supports a specific addressing mode. */
362 #define HAVE_LONG_DISP(x) \
363 ((x) & (m68020|m68030|m68040|m68060|cpu32|fido_a|mcfisa_b|mcfisa_c))
364 #define HAVE_LONG_CALL(x) \
365 ((x) & (m68020|m68030|m68040|m68060|cpu32|fido_a|mcfisa_b|mcfisa_c))
366 #define HAVE_LONG_COND(x) \
367 ((x) & (m68020|m68030|m68040|m68060|cpu32|fido_a|mcfisa_b|mcfisa_c))
368 #define HAVE_LONG_BRANCH(x) \
369 ((x) & (m68020|m68030|m68040|m68060|cpu32|fido_a|mcfisa_b))
371 static struct m68k_it the_ins
; /* The instruction being assembled. */
373 #define op(ex) ((ex)->exp.X_op)
374 #define adds(ex) ((ex)->exp.X_add_symbol)
375 #define subs(ex) ((ex)->exp.X_op_symbol)
376 #define offs(ex) ((ex)->exp.X_add_number)
378 /* Macros for adding things to the m68k_it struct. */
379 #define addword(w) (the_ins.opcode[the_ins.numo++] = (w))
381 /* Like addword, but goes BEFORE general operands. */
384 insop (int w
, const struct m68k_incant
*opcode
)
387 for (z
= the_ins
.numo
; z
> opcode
->m_codenum
; --z
)
388 the_ins
.opcode
[z
] = the_ins
.opcode
[z
- 1];
389 for (z
= 0; z
< the_ins
.nrel
; z
++)
390 the_ins
.reloc
[z
].n
+= 2;
391 for (z
= 0; z
< the_ins
.nfrag
; z
++)
392 the_ins
.fragb
[z
].fragoff
++;
393 the_ins
.opcode
[opcode
->m_codenum
] = w
;
397 /* The numo+1 kludge is so we can hit the low order byte of the prev word.
400 add_fix (int width
, struct m68k_exp
*exp
, int pc_rel
, int pc_fix
)
402 the_ins
.reloc
[the_ins
.nrel
].n
= (width
== 'B' || width
== '3'
403 ? the_ins
.numo
* 2 - 1
405 ? the_ins
.numo
* 2 + 1
406 : the_ins
.numo
* 2));
407 the_ins
.reloc
[the_ins
.nrel
].exp
= exp
->exp
;
408 the_ins
.reloc
[the_ins
.nrel
].wid
= width
;
409 the_ins
.reloc
[the_ins
.nrel
].pcrel_fix
= pc_fix
;
411 the_ins
.reloc
[the_ins
.nrel
].pic_reloc
= exp
->pic_reloc
;
413 the_ins
.reloc
[the_ins
.nrel
++].pcrel
= pc_rel
;
416 /* Cause an extra frag to be generated here, inserting up to 10 bytes
417 (that value is chosen in the frag_var call in md_assemble). TYPE
418 is the subtype of the frag to be generated; its primary type is
419 rs_machine_dependent.
421 The TYPE parameter is also used by md_convert_frag_1 and
422 md_estimate_size_before_relax. The appropriate type of fixup will
423 be emitted by md_convert_frag_1.
425 ADD becomes the FR_SYMBOL field of the frag, and OFF the FR_OFFSET. */
427 add_frag (symbolS
*add
, offsetT off
, int type
)
429 the_ins
.fragb
[the_ins
.nfrag
].fragoff
= the_ins
.numo
;
430 the_ins
.fragb
[the_ins
.nfrag
].fadd
= add
;
431 the_ins
.fragb
[the_ins
.nfrag
].foff
= off
;
432 the_ins
.fragb
[the_ins
.nfrag
++].fragty
= type
;
436 (op (ex) != O_constant && op (ex) != O_big)
438 static char *crack_operand (char *str
, struct m68k_op
*opP
);
439 static int get_num (struct m68k_exp
*exp
, int ok
);
440 static int reverse_16_bits (int in
);
441 static int reverse_8_bits (int in
);
442 static void install_gen_operand (int mode
, int val
);
443 static void install_operand (int mode
, int val
);
444 static void s_bss (int);
445 static void s_data1 (int);
446 static void s_data2 (int);
447 static void s_even (int);
448 static void s_proc (int);
449 static void s_chip (int);
450 static void s_fopt (int);
451 static void s_opt (int);
452 static void s_reg (int);
453 static void s_restore (int);
454 static void s_save (int);
455 static void s_mri_if (int);
456 static void s_mri_else (int);
457 static void s_mri_endi (int);
458 static void s_mri_break (int);
459 static void s_mri_next (int);
460 static void s_mri_for (int);
461 static void s_mri_endf (int);
462 static void s_mri_repeat (int);
463 static void s_mri_until (int);
464 static void s_mri_while (int);
465 static void s_mri_endw (int);
466 static void s_m68k_cpu (int);
467 static void s_m68k_arch (int);
471 unsigned long arch
; /* Architecture features. */
472 const enum m68k_register
*control_regs
; /* Control regs on chip */
473 const char *name
; /* Name */
474 int alias
; /* Alias for a cannonical name. If 1, then
475 succeeds canonical name, if -1 then
476 succeeds canonical name, if <-1 ||>1 this is a
477 deprecated name, and the next/previous name
481 /* We hold flags for features explicitly enabled and explicitly
483 static int current_architecture
;
484 static int not_current_architecture
;
485 static const struct m68k_cpu
*selected_arch
;
486 static const struct m68k_cpu
*selected_cpu
;
487 static int initialized
;
489 /* Architecture models. */
490 static const struct m68k_cpu m68k_archs
[] =
492 {m68000
, m68000_ctrl
, "68000", 0},
493 {m68010
, m68010_ctrl
, "68010", 0},
494 {m68020
|m68881
|m68851
, m68020_ctrl
, "68020", 0},
495 {m68030
|m68881
|m68851
, m68020_ctrl
, "68030", 0},
496 {m68040
, m68040_ctrl
, "68040", 0},
497 {m68060
, m68060_ctrl
, "68060", 0},
498 {cpu32
|m68881
, cpu32_ctrl
, "cpu32", 0},
499 {fido_a
, fido_ctrl
, "fidoa", 0},
500 {mcfisa_a
|mcfhwdiv
, NULL
, "isaa", 0},
501 {mcfisa_a
|mcfhwdiv
|mcfisa_aa
|mcfusp
, NULL
, "isaaplus", 0},
502 {mcfisa_a
|mcfhwdiv
|mcfisa_b
|mcfusp
, NULL
, "isab", 0},
503 {mcfisa_a
|mcfhwdiv
|mcfisa_c
|mcfusp
, NULL
, "isac", 0},
504 {mcfisa_a
|mcfhwdiv
|mcfisa_b
|mcfmac
|mcfusp
, mcf_ctrl
, "cfv4", 0},
505 {mcfisa_a
|mcfhwdiv
|mcfisa_b
|mcfemac
|mcfusp
|cfloat
, mcfv4e_ctrl
, "cfv4e", 0},
509 /* Architecture extensions, here 'alias' -1 for m68k, +1 for cf and 0
511 static const struct m68k_cpu m68k_extensions
[] =
513 {m68851
, NULL
, "68851", -1},
514 {m68881
, NULL
, "68881", -1},
515 {m68881
, NULL
, "68882", -1},
517 {cfloat
|m68881
, NULL
, "float", 0},
519 {mcfhwdiv
, NULL
, "div", 1},
520 {mcfusp
, NULL
, "usp", 1},
521 {mcfmac
, NULL
, "mac", 1},
522 {mcfemac
, NULL
, "emac", 1},
528 static const struct m68k_cpu m68k_cpus
[] =
530 {m68000
, m68000_ctrl
, "68000", 0},
531 {m68000
, m68000_ctrl
, "68ec000", 1},
532 {m68000
, m68000_ctrl
, "68hc000", 1},
533 {m68000
, m68000_ctrl
, "68hc001", 1},
534 {m68000
, m68000_ctrl
, "68008", 1},
535 {m68000
, m68000_ctrl
, "68302", 1},
536 {m68000
, m68000_ctrl
, "68306", 1},
537 {m68000
, m68000_ctrl
, "68307", 1},
538 {m68000
, m68000_ctrl
, "68322", 1},
539 {m68000
, m68000_ctrl
, "68356", 1},
540 {m68010
, m68010_ctrl
, "68010", 0},
541 {m68020
|m68881
|m68851
, m68020_ctrl
, "68020", 0},
542 {m68020
|m68881
|m68851
, m68020_ctrl
, "68k", 1},
543 {m68020
|m68881
|m68851
, m68020_ctrl
, "68ec020", 1},
544 {m68030
|m68881
|m68851
, m68020_ctrl
, "68030", 0},
545 {m68030
|m68881
|m68851
, m68020_ctrl
, "68ec030", 1},
546 {m68040
, m68040_ctrl
, "68040", 0},
547 {m68040
, m68040_ctrl
, "68ec040", 1},
548 {m68060
, m68060_ctrl
, "68060", 0},
549 {m68060
, m68060_ctrl
, "68ec060", 1},
551 {cpu32
|m68881
, cpu32_ctrl
, "cpu32", 0},
552 {cpu32
|m68881
, cpu32_ctrl
, "68330", 1},
553 {cpu32
|m68881
, cpu32_ctrl
, "68331", 1},
554 {cpu32
|m68881
, cpu32_ctrl
, "68332", 1},
555 {cpu32
|m68881
, cpu32_ctrl
, "68333", 1},
556 {cpu32
|m68881
, cpu32_ctrl
, "68334", 1},
557 {cpu32
|m68881
, cpu32_ctrl
, "68336", 1},
558 {cpu32
|m68881
, cpu32_ctrl
, "68340", 1},
559 {cpu32
|m68881
, cpu32_ctrl
, "68341", 1},
560 {cpu32
|m68881
, cpu32_ctrl
, "68349", 1},
561 {cpu32
|m68881
, cpu32_ctrl
, "68360", 1},
563 {mcfisa_a
, mcf_ctrl
, "5200", 0},
564 {mcfisa_a
, mcf_ctrl
, "5202", 1},
565 {mcfisa_a
, mcf_ctrl
, "5204", 1},
566 {mcfisa_a
, mcf5206_ctrl
, "5206", 1},
568 {mcfisa_a
|mcfhwdiv
|mcfmac
, mcf5206_ctrl
, "5206e", 0},
570 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5208_ctrl
, "5207", -1},
571 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5208_ctrl
, "5208", 0},
573 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfmac
|mcfusp
, mcf5210a_ctrl
, "5210a", 0},
574 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfmac
|mcfusp
, mcf5210a_ctrl
, "5211a", 1},
576 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfmac
|mcfusp
, mcf5213_ctrl
, "5211", -1},
577 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfmac
|mcfusp
, mcf5213_ctrl
, "5212", -1},
578 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfmac
|mcfusp
, mcf5213_ctrl
, "5213", 0},
580 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5216_ctrl
, "5214", -1},
581 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5216_ctrl
, "5216", 0},
582 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5216_ctrl
, "521x", 2},
584 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfmac
|mcfusp
, mcf52223_ctrl
, "52221", -1},
585 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfmac
|mcfusp
, mcf52223_ctrl
, "52223", 0},
587 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf52235_ctrl
, "52230", -1},
588 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf52235_ctrl
, "52233", -1},
589 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf52235_ctrl
, "52234", -1},
590 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf52235_ctrl
, "52235", 0},
592 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfmac
|mcfusp
, mcf5225_ctrl
, "5224", -1},
593 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfmac
|mcfusp
, mcf5225_ctrl
, "5225", 0},
595 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5235_ctrl
, "5232", -1},
596 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5235_ctrl
, "5233", -1},
597 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5235_ctrl
, "5234", -1},
598 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5235_ctrl
, "5235", -1},
599 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5235_ctrl
, "523x", 0},
601 {mcfisa_a
|mcfhwdiv
|mcfemac
, mcf5249_ctrl
, "5249", 0},
602 {mcfisa_a
|mcfhwdiv
|mcfemac
, mcf5250_ctrl
, "5250", 0},
603 {mcfisa_a
|mcfhwdiv
|mcfemac
, mcf5253_ctrl
, "5253", 0},
605 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5271_ctrl
, "5270", -1},
606 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5271_ctrl
, "5271", 0},
608 {mcfisa_a
|mcfhwdiv
|mcfmac
, mcf5272_ctrl
, "5272", 0},
610 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5275_ctrl
, "5274", -1},
611 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5275_ctrl
, "5275", 0},
613 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5282_ctrl
, "5280", -1},
614 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5282_ctrl
, "5281", -1},
615 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5282_ctrl
, "5282", -1},
616 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5282_ctrl
, "528x", 0},
618 {mcfisa_a
|mcfhwdiv
|mcfmac
, mcf5307_ctrl
, "5307", 0},
620 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5329_ctrl
, "5327", -1},
621 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5329_ctrl
, "5328", -1},
622 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5329_ctrl
, "5329", -1},
623 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5329_ctrl
, "532x", 0},
625 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5373_ctrl
, "5372", -1},
626 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5373_ctrl
, "5373", -1},
627 {mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfemac
|mcfusp
, mcf5373_ctrl
, "537x", 0},
629 {mcfisa_a
|mcfisa_b
|mcfhwdiv
|mcfmac
, mcf_ctrl
, "5407",0},
631 {mcfisa_a
|mcfisa_c
|mcfhwdiv
|mcfemac
|mcfusp
, mcf54455_ctrl
, "54450", -1},
632 {mcfisa_a
|mcfisa_c
|mcfhwdiv
|mcfemac
|mcfusp
, mcf54455_ctrl
, "54451", -1},
633 {mcfisa_a
|mcfisa_c
|mcfhwdiv
|mcfemac
|mcfusp
, mcf54455_ctrl
, "54452", -1},
634 {mcfisa_a
|mcfisa_c
|mcfhwdiv
|mcfemac
|mcfusp
, mcf54455_ctrl
, "54453", -1},
635 {mcfisa_a
|mcfisa_c
|mcfhwdiv
|mcfemac
|mcfusp
, mcf54455_ctrl
, "54454", -1},
636 {mcfisa_a
|mcfisa_c
|mcfhwdiv
|mcfemac
|mcfusp
, mcf54455_ctrl
, "54455", 0},
638 {mcfisa_a
|mcfisa_b
|mcfhwdiv
|mcfemac
|mcfusp
|cfloat
, mcf5475_ctrl
, "5470", -1},
639 {mcfisa_a
|mcfisa_b
|mcfhwdiv
|mcfemac
|mcfusp
|cfloat
, mcf5475_ctrl
, "5471", -1},
640 {mcfisa_a
|mcfisa_b
|mcfhwdiv
|mcfemac
|mcfusp
|cfloat
, mcf5475_ctrl
, "5472", -1},
641 {mcfisa_a
|mcfisa_b
|mcfhwdiv
|mcfemac
|mcfusp
|cfloat
, mcf5475_ctrl
, "5473", -1},
642 {mcfisa_a
|mcfisa_b
|mcfhwdiv
|mcfemac
|mcfusp
|cfloat
, mcf5475_ctrl
, "5474", -1},
643 {mcfisa_a
|mcfisa_b
|mcfhwdiv
|mcfemac
|mcfusp
|cfloat
, mcf5475_ctrl
, "5475", -1},
644 {mcfisa_a
|mcfisa_b
|mcfhwdiv
|mcfemac
|mcfusp
|cfloat
, mcf5475_ctrl
, "547x", 0},
646 {mcfisa_a
|mcfisa_b
|mcfhwdiv
|mcfemac
|mcfusp
|cfloat
, mcf5485_ctrl
, "5480", -1},
647 {mcfisa_a
|mcfisa_b
|mcfhwdiv
|mcfemac
|mcfusp
|cfloat
, mcf5485_ctrl
, "5481", -1},
648 {mcfisa_a
|mcfisa_b
|mcfhwdiv
|mcfemac
|mcfusp
|cfloat
, mcf5485_ctrl
, "5482", -1},
649 {mcfisa_a
|mcfisa_b
|mcfhwdiv
|mcfemac
|mcfusp
|cfloat
, mcf5485_ctrl
, "5483", -1},
650 {mcfisa_a
|mcfisa_b
|mcfhwdiv
|mcfemac
|mcfusp
|cfloat
, mcf5485_ctrl
, "5484", -1},
651 {mcfisa_a
|mcfisa_b
|mcfhwdiv
|mcfemac
|mcfusp
|cfloat
, mcf5485_ctrl
, "5485", -1},
652 {mcfisa_a
|mcfisa_b
|mcfhwdiv
|mcfemac
|mcfusp
|cfloat
, mcf5485_ctrl
, "548x", 0},
654 {fido_a
, fido_ctrl
, "fidoa", 0},
655 {fido_a
, fido_ctrl
, "fido", 1},
660 static const struct m68k_cpu
*m68k_lookup_cpu
661 (const char *, const struct m68k_cpu
*, int, int *);
662 static int m68k_set_arch (const char *, int, int);
663 static int m68k_set_cpu (const char *, int, int);
664 static int m68k_set_extension (const char *, int, int);
665 static void m68k_init_arch (void);
667 /* This is the assembler relaxation table for m68k. m68k is a rich CISC
668 architecture and we have a lot of relaxation modes. */
670 /* Macros used in the relaxation code. */
671 #define TAB(x,y) (((x) << 2) + (y))
672 #define TABTYPE(x) ((x) >> 2)
674 /* Relaxation states. */
680 /* Here are all the relaxation modes we support. First we can relax ordinary
681 branches. On 68020 and higher and on CPU32 all branch instructions take
682 three forms, so on these CPUs all branches always remain as such. When we
683 have to expand to the LONG form on a 68000, though, we substitute an
684 absolute jump instead. This is a direct replacement for unconditional
685 branches and a branch over a jump for conditional branches. However, if the
686 user requires PIC and disables this with --pcrel, we can only relax between
687 BYTE and SHORT forms, punting if that isn't enough. This gives us four
688 different relaxation modes for branches: */
690 #define BRANCHBWL 0 /* Branch byte, word, or long. */
691 #define BRABSJUNC 1 /* Absolute jump for LONG, unconditional. */
692 #define BRABSJCOND 2 /* Absolute jump for LONG, conditional. */
693 #define BRANCHBW 3 /* Branch byte or word. */
695 /* We also relax coprocessor branches and DBcc's. All CPUs that support
696 coprocessor branches support them in word and long forms, so we have only
697 one relaxation mode for them. DBcc's are word only on all CPUs. We can
698 relax them to the LONG form with a branch-around sequence. This sequence
699 can use a long branch (if available) or an absolute jump (if acceptable).
700 This gives us two relaxation modes. If long branches are not available and
701 absolute jumps are not acceptable, we don't relax DBcc's. */
703 #define FBRANCH 4 /* Coprocessor branch. */
704 #define DBCCLBR 5 /* DBcc relaxable with a long branch. */
705 #define DBCCABSJ 6 /* DBcc relaxable with an absolute jump. */
707 /* That's all for instruction relaxation. However, we also relax PC-relative
708 operands. Specifically, we have three operand relaxation modes. On the
709 68000 PC-relative operands can only be 16-bit, but on 68020 and higher and
710 on CPU32 they may be 16-bit or 32-bit. For the latter we relax between the
711 two. Also PC+displacement+index operands in their simple form (with a non-
712 suppressed index without memory indirection) are supported on all CPUs, but
713 on the 68000 the displacement can be 8-bit only, whereas on 68020 and higher
714 and on CPU32 we relax it to SHORT and LONG forms as well using the extended
715 form of the PC+displacement+index operand. Finally, some absolute operands
716 can be relaxed down to 16-bit PC-relative. */
718 #define PCREL1632 7 /* 16-bit or 32-bit PC-relative. */
719 #define PCINDEX 8 /* PC + displacement + index. */
720 #define ABSTOPCREL 9 /* Absolute relax down to 16-bit PC-relative. */
722 /* Note that calls to frag_var need to specify the maximum expansion
723 needed; this is currently 10 bytes for DBCC. */
726 How far Forward this mode will reach:
727 How far Backward this mode will reach:
728 How many bytes this mode will add to the size of the frag
729 Which mode to go to if the offset won't fit in this one
731 Please check tc-m68k.h:md_prepare_relax_scan if changing this table. */
732 relax_typeS md_relax_table
[] =
734 { 127, -128, 0, TAB (BRANCHBWL
, SHORT
) },
735 { 32767, -32768, 2, TAB (BRANCHBWL
, LONG
) },
739 { 127, -128, 0, TAB (BRABSJUNC
, SHORT
) },
740 { 32767, -32768, 2, TAB (BRABSJUNC
, LONG
) },
744 { 127, -128, 0, TAB (BRABSJCOND
, SHORT
) },
745 { 32767, -32768, 2, TAB (BRABSJCOND
, LONG
) },
749 { 127, -128, 0, TAB (BRANCHBW
, SHORT
) },
754 { 1, 1, 0, 0 }, /* FBRANCH doesn't come BYTE. */
755 { 32767, -32768, 2, TAB (FBRANCH
, LONG
) },
759 { 1, 1, 0, 0 }, /* DBCC doesn't come BYTE. */
760 { 32767, -32768, 2, TAB (DBCCLBR
, LONG
) },
764 { 1, 1, 0, 0 }, /* DBCC doesn't come BYTE. */
765 { 32767, -32768, 2, TAB (DBCCABSJ
, LONG
) },
769 { 1, 1, 0, 0 }, /* PCREL1632 doesn't come BYTE. */
770 { 32767, -32768, 2, TAB (PCREL1632
, LONG
) },
774 { 125, -130, 0, TAB (PCINDEX
, SHORT
) },
775 { 32765, -32770, 2, TAB (PCINDEX
, LONG
) },
779 { 1, 1, 0, 0 }, /* ABSTOPCREL doesn't come BYTE. */
780 { 32767, -32768, 2, TAB (ABSTOPCREL
, LONG
) },
785 /* These are the machine dependent pseudo-ops. These are included so
786 the assembler can work on the output from the SUN C compiler, which
789 /* This table describes all the machine specific pseudo-ops the assembler
790 has to support. The fields are:
791 pseudo-op name without dot
792 function to call to execute this pseudo-op
793 Integer arg to pass to the function. */
794 const pseudo_typeS md_pseudo_table
[] =
796 {"data1", s_data1
, 0},
797 {"data2", s_data2
, 0},
800 {"skip", s_space
, 0},
802 #if defined (TE_SUN3) || defined (OBJ_ELF)
803 {"align", s_align_bytes
, 0},
806 {"swbeg", s_ignore
, 0},
808 {"extend", float_cons
, 'x'},
809 {"ldouble", float_cons
, 'x'},
811 {"arch", s_m68k_arch
, 0},
812 {"cpu", s_m68k_cpu
, 0},
814 /* The following pseudo-ops are supported for MRI compatibility. */
816 {"comline", s_space
, 1},
818 {"mask2", s_ignore
, 0},
821 {"restore", s_restore
, 0},
825 {"if.b", s_mri_if
, 'b'},
826 {"if.w", s_mri_if
, 'w'},
827 {"if.l", s_mri_if
, 'l'},
828 {"else", s_mri_else
, 0},
829 {"else.s", s_mri_else
, 's'},
830 {"else.l", s_mri_else
, 'l'},
831 {"endi", s_mri_endi
, 0},
832 {"break", s_mri_break
, 0},
833 {"break.s", s_mri_break
, 's'},
834 {"break.l", s_mri_break
, 'l'},
835 {"next", s_mri_next
, 0},
836 {"next.s", s_mri_next
, 's'},
837 {"next.l", s_mri_next
, 'l'},
838 {"for", s_mri_for
, 0},
839 {"for.b", s_mri_for
, 'b'},
840 {"for.w", s_mri_for
, 'w'},
841 {"for.l", s_mri_for
, 'l'},
842 {"endf", s_mri_endf
, 0},
843 {"repeat", s_mri_repeat
, 0},
844 {"until", s_mri_until
, 0},
845 {"until.b", s_mri_until
, 'b'},
846 {"until.w", s_mri_until
, 'w'},
847 {"until.l", s_mri_until
, 'l'},
848 {"while", s_mri_while
, 0},
849 {"while.b", s_mri_while
, 'b'},
850 {"while.w", s_mri_while
, 'w'},
851 {"while.l", s_mri_while
, 'l'},
852 {"endw", s_mri_endw
, 0},
857 /* The mote pseudo ops are put into the opcode table, since they
858 don't start with a . they look like opcodes to gas. */
860 const pseudo_typeS mote_pseudo_table
[] =
873 {"xdef", s_globl
, 0},
875 {"align", s_align_bytes
, 0},
877 {"align", s_align_ptwo
, 0},
880 {"sect", obj_coff_section
, 0},
881 {"section", obj_coff_section
, 0},
886 /* Truncate and sign-extend at 32 bits, so that building on a 64-bit host
887 gives identical results to a 32-bit host. */
888 #define TRUNC(X) ((valueT) (X) & 0xffffffff)
889 #define SEXT(X) ((TRUNC (X) ^ 0x80000000) - 0x80000000)
891 #define issbyte(x) ((valueT) SEXT (x) + 0x80 < 0x100)
892 #define isubyte(x) ((valueT) TRUNC (x) < 0x100)
893 #define issword(x) ((valueT) SEXT (x) + 0x8000 < 0x10000)
894 #define isuword(x) ((valueT) TRUNC (x) < 0x10000)
896 #define isbyte(x) ((valueT) SEXT (x) + 0xff < 0x1ff)
897 #define isword(x) ((valueT) SEXT (x) + 0xffff < 0x1ffff)
898 #define islong(x) (1)
900 static char notend_table
[256];
901 static char alt_notend_table
[256];
903 (! (notend_table[(unsigned char) *s] \
905 && alt_notend_table[(unsigned char) s[1]])))
909 /* Return zero if the reference to SYMBOL from within the same segment may
912 /* On an ELF system, we can't relax an externally visible symbol,
913 because it may be overridden by a shared library. However, if
914 TARGET_OS is "elf", then we presume that we are assembling for an
915 embedded system, in which case we don't have to worry about shared
916 libraries, and we can relax any external sym. */
918 #define relaxable_symbol(symbol) \
919 (!((S_IS_EXTERNAL (symbol) && EXTERN_FORCE_RELOC) \
920 || S_IS_WEAK (symbol)))
922 /* Compute the relocation code for a fixup of SIZE bytes, using pc
923 relative relocation if PCREL is non-zero. PIC says whether a special
924 pic relocation was requested. */
926 static bfd_reloc_code_real_type
927 get_reloc_code (int size
, int pcrel
, enum pic_relocation pic
)
935 return BFD_RELOC_8_GOT_PCREL
;
937 return BFD_RELOC_16_GOT_PCREL
;
939 return BFD_RELOC_32_GOT_PCREL
;
947 return BFD_RELOC_8_GOTOFF
;
949 return BFD_RELOC_16_GOTOFF
;
951 return BFD_RELOC_32_GOTOFF
;
959 return BFD_RELOC_8_PLT_PCREL
;
961 return BFD_RELOC_16_PLT_PCREL
;
963 return BFD_RELOC_32_PLT_PCREL
;
971 return BFD_RELOC_8_PLTOFF
;
973 return BFD_RELOC_16_PLTOFF
;
975 return BFD_RELOC_32_PLTOFF
;
985 return BFD_RELOC_8_PCREL
;
987 return BFD_RELOC_16_PCREL
;
989 return BFD_RELOC_32_PCREL
;
1001 return BFD_RELOC_32
;
1008 if (pic
== pic_none
)
1009 as_bad (_("Can not do %d byte pc-relative relocation"), size
);
1011 as_bad (_("Can not do %d byte pc-relative pic relocation"), size
);
1015 if (pic
== pic_none
)
1016 as_bad (_("Can not do %d byte relocation"), size
);
1018 as_bad (_("Can not do %d byte pic relocation"), size
);
1021 return BFD_RELOC_NONE
;
1024 /* Here we decide which fixups can be adjusted to make them relative
1025 to the beginning of the section instead of the symbol. Basically
1026 we need to make sure that the dynamic relocations are done
1027 correctly, so in some cases we force the original symbol to be
1030 tc_m68k_fix_adjustable (fixS
*fixP
)
1032 /* Adjust_reloc_syms doesn't know about the GOT. */
1033 switch (fixP
->fx_r_type
)
1035 case BFD_RELOC_8_GOT_PCREL
:
1036 case BFD_RELOC_16_GOT_PCREL
:
1037 case BFD_RELOC_32_GOT_PCREL
:
1038 case BFD_RELOC_8_GOTOFF
:
1039 case BFD_RELOC_16_GOTOFF
:
1040 case BFD_RELOC_32_GOTOFF
:
1041 case BFD_RELOC_8_PLT_PCREL
:
1042 case BFD_RELOC_16_PLT_PCREL
:
1043 case BFD_RELOC_32_PLT_PCREL
:
1044 case BFD_RELOC_8_PLTOFF
:
1045 case BFD_RELOC_16_PLTOFF
:
1046 case BFD_RELOC_32_PLTOFF
:
1049 case BFD_RELOC_VTABLE_INHERIT
:
1050 case BFD_RELOC_VTABLE_ENTRY
:
1058 #else /* !OBJ_ELF */
1060 #define get_reloc_code(SIZE,PCREL,OTHER) NO_RELOC
1062 /* PR gas/3041 Weak symbols are not relaxable
1063 because they must be treated as extern. */
1064 #define relaxable_symbol(symbol) (!(S_IS_WEAK (symbol)))
1066 #endif /* OBJ_ELF */
1069 tc_gen_reloc (asection
*section ATTRIBUTE_UNUSED
, fixS
*fixp
)
1072 bfd_reloc_code_real_type code
;
1074 /* If the tcbit is set, then this was a fixup of a negative value
1075 that was never resolved. We do not have a reloc to handle this,
1076 so just return. We assume that other code will have detected this
1077 situation and produced a helpful error message, so we just tell the
1078 user that the reloc cannot be produced. */
1082 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
1083 _("Unable to produce reloc against symbol '%s'"),
1084 S_GET_NAME (fixp
->fx_addsy
));
1088 if (fixp
->fx_r_type
!= BFD_RELOC_NONE
)
1090 code
= fixp
->fx_r_type
;
1092 /* Since DIFF_EXPR_OK is defined in tc-m68k.h, it is possible
1093 that fixup_segment converted a non-PC relative reloc into a
1094 PC relative reloc. In such a case, we need to convert the
1101 code
= BFD_RELOC_8_PCREL
;
1104 code
= BFD_RELOC_16_PCREL
;
1107 code
= BFD_RELOC_32_PCREL
;
1109 case BFD_RELOC_8_PCREL
:
1110 case BFD_RELOC_16_PCREL
:
1111 case BFD_RELOC_32_PCREL
:
1112 case BFD_RELOC_8_GOT_PCREL
:
1113 case BFD_RELOC_16_GOT_PCREL
:
1114 case BFD_RELOC_32_GOT_PCREL
:
1115 case BFD_RELOC_8_GOTOFF
:
1116 case BFD_RELOC_16_GOTOFF
:
1117 case BFD_RELOC_32_GOTOFF
:
1118 case BFD_RELOC_8_PLT_PCREL
:
1119 case BFD_RELOC_16_PLT_PCREL
:
1120 case BFD_RELOC_32_PLT_PCREL
:
1121 case BFD_RELOC_8_PLTOFF
:
1122 case BFD_RELOC_16_PLTOFF
:
1123 case BFD_RELOC_32_PLTOFF
:
1126 as_bad_where (fixp
->fx_file
, fixp
->fx_line
,
1127 _("Cannot make %s relocation PC relative"),
1128 bfd_get_reloc_code_name (code
));
1134 #define F(SZ,PCREL) (((SZ) << 1) + (PCREL))
1135 switch (F (fixp
->fx_size
, fixp
->fx_pcrel
))
1137 #define MAP(SZ,PCREL,TYPE) case F(SZ,PCREL): code = (TYPE); break
1138 MAP (1, 0, BFD_RELOC_8
);
1139 MAP (2, 0, BFD_RELOC_16
);
1140 MAP (4, 0, BFD_RELOC_32
);
1141 MAP (1, 1, BFD_RELOC_8_PCREL
);
1142 MAP (2, 1, BFD_RELOC_16_PCREL
);
1143 MAP (4, 1, BFD_RELOC_32_PCREL
);
1151 reloc
= (arelent
*) xmalloc (sizeof (arelent
));
1152 reloc
->sym_ptr_ptr
= (asymbol
**) xmalloc (sizeof (asymbol
*));
1153 *reloc
->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
1154 reloc
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
1157 reloc
->addend
= fixp
->fx_addnumber
;
1158 else if (OUTPUT_FLAVOR
== bfd_target_aout_flavour
1160 && S_IS_WEAK (fixp
->fx_addsy
)
1161 && ! bfd_is_und_section (S_GET_SEGMENT (fixp
->fx_addsy
)))
1162 /* PR gas/3041 Adjust addend in order to force bfd_install_relocation()
1163 to put the symbol offset into frags referencing a weak symbol. */
1164 reloc
->addend
= fixp
->fx_addnumber
1165 - (S_GET_VALUE (fixp
->fx_addsy
) * 2);
1169 if (!fixp
->fx_pcrel
)
1170 reloc
->addend
= fixp
->fx_addnumber
;
1172 reloc
->addend
= (section
->vma
1173 /* Explicit sign extension in case char is
1175 + ((fixp
->fx_pcrel_adjust
& 0xff) ^ 0x80) - 0x80
1176 + fixp
->fx_addnumber
1177 + md_pcrel_from (fixp
));
1180 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, code
);
1181 assert (reloc
->howto
!= 0);
1186 /* Handle of the OPCODE hash table. NULL means any use before
1187 m68k_ip_begin() will crash. */
1188 static struct hash_control
*op_hash
;
1190 /* Assemble an m68k instruction. */
1193 m68k_ip (char *instring
)
1196 register struct m68k_op
*opP
;
1197 register const struct m68k_incant
*opcode
;
1198 register const char *s
;
1199 register int tmpreg
= 0, baseo
= 0, outro
= 0, nextword
;
1200 char *pdot
, *pdotmove
;
1201 enum m68k_size siz1
, siz2
;
1205 struct m68k_op operands_backup
[6];
1206 LITTLENUM_TYPE words
[6];
1207 LITTLENUM_TYPE
*wordp
;
1208 unsigned long ok_arch
= 0;
1210 if (*instring
== ' ')
1211 instring
++; /* Skip leading whitespace. */
1213 /* Scan up to end of operation-code, which MUST end in end-of-string
1214 or exactly 1 space. */
1216 for (p
= instring
; *p
!= '\0'; p
++)
1226 the_ins
.error
= _("No operator");
1230 /* p now points to the end of the opcode name, probably whitespace.
1231 Make sure the name is null terminated by clobbering the
1232 whitespace, look it up in the hash table, then fix it back.
1233 Remove a dot, first, since the opcode tables have none. */
1236 for (pdotmove
= pdot
; pdotmove
< p
; pdotmove
++)
1237 *pdotmove
= pdotmove
[1];
1243 opcode
= (const struct m68k_incant
*) hash_find (op_hash
, instring
);
1248 for (pdotmove
= p
; pdotmove
> pdot
; pdotmove
--)
1249 *pdotmove
= pdotmove
[-1];
1256 the_ins
.error
= _("Unknown operator");
1260 /* Found a legitimate opcode, start matching operands. */
1264 if (opcode
->m_operands
== 0)
1266 char *old
= input_line_pointer
;
1268 input_line_pointer
= p
;
1269 /* Ahh - it's a motorola style psuedo op. */
1270 mote_pseudo_table
[opcode
->m_opnum
].poc_handler
1271 (mote_pseudo_table
[opcode
->m_opnum
].poc_val
);
1272 input_line_pointer
= old
;
1278 if (flag_mri
&& opcode
->m_opnum
== 0)
1280 /* In MRI mode, random garbage is allowed after an instruction
1281 which accepts no operands. */
1282 the_ins
.args
= opcode
->m_operands
;
1283 the_ins
.numargs
= opcode
->m_opnum
;
1284 the_ins
.numo
= opcode
->m_codenum
;
1285 the_ins
.opcode
[0] = getone (opcode
);
1286 the_ins
.opcode
[1] = gettwo (opcode
);
1290 for (opP
= &the_ins
.operands
[0]; *p
; opP
++)
1292 p
= crack_operand (p
, opP
);
1296 the_ins
.error
= opP
->error
;
1301 opsfound
= opP
- &the_ins
.operands
[0];
1303 /* This ugly hack is to support the floating pt opcodes in their
1304 standard form. Essentially, we fake a first enty of type COP#1 */
1305 if (opcode
->m_operands
[0] == 'I')
1309 for (n
= opsfound
; n
> 0; --n
)
1310 the_ins
.operands
[n
] = the_ins
.operands
[n
- 1];
1312 memset (&the_ins
.operands
[0], '\0', sizeof (the_ins
.operands
[0]));
1313 the_ins
.operands
[0].mode
= CONTROL
;
1314 the_ins
.operands
[0].reg
= m68k_float_copnum
;
1318 /* We've got the operands. Find an opcode that'll accept them. */
1321 /* If we didn't get the right number of ops, or we have no
1322 common model with this pattern then reject this pattern. */
1324 ok_arch
|= opcode
->m_arch
;
1325 if (opsfound
!= opcode
->m_opnum
1326 || ((opcode
->m_arch
& current_architecture
) == 0))
1332 /* Make a copy of the operands of this insn so that
1333 we can modify them safely, should we want to. */
1334 assert (opsfound
<= (int) ARRAY_SIZE (operands_backup
));
1335 for (i
= 0; i
< opsfound
; i
++)
1336 operands_backup
[i
] = the_ins
.operands
[i
];
1338 for (s
= opcode
->m_operands
, opP
= &operands_backup
[0];
1342 /* Warning: this switch is huge! */
1343 /* I've tried to organize the cases into this order:
1344 non-alpha first, then alpha by letter. Lower-case
1345 goes directly before uppercase counterpart. */
1346 /* Code with multiple case ...: gets sorted by the lowest
1347 case ... it belongs to. I hope this makes sense. */
1453 if (opP
->reg
== PC
|| opP
->reg
== ZPC
)
1470 if (opP
->reg
== PC
|| opP
->reg
== ZPC
)
1489 if (opP
->reg
== PC
|| opP
->reg
== ZPC
)
1499 if (opP
->mode
!= IMMED
)
1501 else if (s
[1] == 'b'
1502 && ! isvar (&opP
->disp
)
1503 && (opP
->disp
.exp
.X_op
!= O_constant
1504 || ! isbyte (opP
->disp
.exp
.X_add_number
)))
1506 else if (s
[1] == 'B'
1507 && ! isvar (&opP
->disp
)
1508 && (opP
->disp
.exp
.X_op
!= O_constant
1509 || ! issbyte (opP
->disp
.exp
.X_add_number
)))
1511 else if (s
[1] == 'w'
1512 && ! isvar (&opP
->disp
)
1513 && (opP
->disp
.exp
.X_op
!= O_constant
1514 || ! isword (opP
->disp
.exp
.X_add_number
)))
1516 else if (s
[1] == 'W'
1517 && ! isvar (&opP
->disp
)
1518 && (opP
->disp
.exp
.X_op
!= O_constant
1519 || ! issword (opP
->disp
.exp
.X_add_number
)))
1525 if (opP
->mode
!= IMMED
)
1530 if (opP
->mode
== AREG
1531 || opP
->mode
== CONTROL
1532 || opP
->mode
== FPREG
1533 || opP
->mode
== IMMED
1534 || opP
->mode
== REGLST
1535 || (opP
->mode
!= ABSL
1537 || opP
->reg
== ZPC
)))
1542 if (opP
->mode
== CONTROL
1543 || opP
->mode
== FPREG
1544 || opP
->mode
== REGLST
1545 || opP
->mode
== IMMED
1546 || (opP
->mode
!= ABSL
1548 || opP
->reg
== ZPC
)))
1576 if (opP
->mode
== CONTROL
1577 || opP
->mode
== FPREG
1578 || opP
->mode
== REGLST
)
1583 if (opP
->mode
!= AINC
)
1588 if (opP
->mode
!= ADEC
)
1638 if (opP
->reg
== PC
|| opP
->reg
== ZPC
)
1659 case '~': /* For now! (JF FOO is this right?) */
1681 if (opP
->mode
!= CONTROL
1682 || (opP
->reg
!= TT0
&& opP
->reg
!= TT1
))
1687 if (opP
->mode
!= AREG
)
1692 if (opP
->mode
!= AINDR
)
1697 if (opP
->mode
!= AINDR
&& opP
->mode
!= AINC
&& opP
->mode
!= ADEC
1698 && (opP
->mode
!= DISP
1700 || opP
->reg
> ADDR7
))
1705 if (opP
->mode
!= ABSL
1707 && strncmp (instring
, "jbsr", 4) == 0))
1730 if (opP
->mode
!= CONTROL
|| opP
->reg
!= CCR
)
1735 if (opP
->mode
!= DISP
1737 || opP
->reg
> ADDR7
)
1742 if (opP
->mode
!= DREG
)
1747 if (opP
->reg
!= ACC
)
1752 if (opP
->reg
!= ACC
&& opP
->reg
!= ACC1
1753 && opP
->reg
!= ACC2
&& opP
->reg
!= ACC3
)
1758 if (opP
->mode
!= FPREG
)
1763 if (opP
->reg
!= MACSR
)
1768 if (opP
->reg
!= ACCEXT01
&& opP
->reg
!= ACCEXT23
)
1773 if (opP
->reg
!= MASK
)
1778 if (opP
->mode
!= CONTROL
1785 if (opP
->mode
!= LSH
&& opP
->mode
!= RSH
)
1790 if (opP
->mode
!= CONTROL
1792 || opP
->reg
> last_movec_reg
1797 const enum m68k_register
*rp
;
1799 for (rp
= control_regs
; *rp
; rp
++)
1801 if (*rp
== opP
->reg
)
1803 /* In most CPUs RAMBAR refers to control reg
1804 c05 (RAMBAR1), but a few CPUs have it
1805 refer to c04 (RAMBAR0). */
1806 else if (*rp
== RAMBAR_ALT
&& opP
->reg
== RAMBAR
)
1808 opP
->reg
= RAMBAR_ALT
;
1818 if (opP
->mode
!= IMMED
)
1824 if (opP
->mode
== DREG
1825 || opP
->mode
== AREG
1826 || opP
->mode
== FPREG
)
1835 opP
->mask
= 1 << (opP
->reg
- DATA0
);
1838 opP
->mask
= 1 << (opP
->reg
- ADDR0
+ 8);
1841 opP
->mask
= 1 << (opP
->reg
- FP0
+ 16);
1849 else if (opP
->mode
== CONTROL
)
1858 opP
->mask
= 1 << 24;
1861 opP
->mask
= 1 << 25;
1864 opP
->mask
= 1 << 26;
1873 else if (opP
->mode
!= REGLST
)
1875 else if (s
[1] == '8' && (opP
->mask
& 0x0ffffff) != 0)
1877 else if (s
[1] == '3' && (opP
->mask
& 0x7000000) != 0)
1882 if (opP
->mode
!= IMMED
)
1884 else if (opP
->disp
.exp
.X_op
!= O_constant
1885 || ! issbyte (opP
->disp
.exp
.X_add_number
))
1887 else if (! m68k_quick
1888 && instring
[3] != 'q'
1889 && instring
[4] != 'q')
1894 if (opP
->mode
!= DREG
1895 && opP
->mode
!= IMMED
1896 && opP
->mode
!= ABSL
)
1901 if (opP
->mode
!= IMMED
)
1903 else if (opP
->disp
.exp
.X_op
!= O_constant
1904 || TRUNC (opP
->disp
.exp
.X_add_number
) - 1 > 7)
1906 else if (! m68k_quick
1907 && (strncmp (instring
, "add", 3) == 0
1908 || strncmp (instring
, "sub", 3) == 0)
1909 && instring
[3] != 'q')
1914 if (opP
->mode
!= DREG
&& opP
->mode
!= AREG
)
1919 if (opP
->mode
!= AINDR
1920 && (opP
->mode
!= BASE
1922 && opP
->reg
!= ZADDR0
)
1923 || opP
->disp
.exp
.X_op
!= O_absent
1924 || ((opP
->index
.reg
< DATA0
1925 || opP
->index
.reg
> DATA7
)
1926 && (opP
->index
.reg
< ADDR0
1927 || opP
->index
.reg
> ADDR7
))
1928 || opP
->index
.size
!= SIZE_UNSPEC
1929 || opP
->index
.scale
!= 1))
1934 if (opP
->mode
!= CONTROL
1935 || ! (opP
->reg
== FPI
1937 || opP
->reg
== FPC
))
1942 if (opP
->mode
!= CONTROL
|| opP
->reg
!= SR
)
1947 if (opP
->mode
!= IMMED
)
1949 else if (opP
->disp
.exp
.X_op
!= O_constant
1950 || TRUNC (opP
->disp
.exp
.X_add_number
) > 7)
1955 if (opP
->mode
!= CONTROL
|| opP
->reg
!= USP
)
1960 if (opP
->mode
!= IMMED
)
1962 else if (opP
->disp
.exp
.X_op
!= O_constant
1963 || (TRUNC (opP
->disp
.exp
.X_add_number
) != 0xffffffff
1964 && TRUNC (opP
->disp
.exp
.X_add_number
) - 1 > 6))
1969 if (opP
->mode
!= IMMED
)
1971 else if (opP
->disp
.exp
.X_op
!= O_constant
1972 || TRUNC (opP
->disp
.exp
.X_add_number
) - 1 > 7)
1977 if (opP
->mode
!= IMMED
)
1979 else if (opP
->disp
.exp
.X_op
!= O_constant
1980 || TRUNC (opP
->disp
.exp
.X_add_number
) > 511)
1984 /* JF these are out of order. We could put them
1985 in order if we were willing to put up with
1986 bunches of #ifdef m68851s in the code.
1988 Don't forget that you need these operands
1989 to use 68030 MMU instructions. */
1991 /* Memory addressing mode used by pflushr. */
1993 if (opP
->mode
== CONTROL
1994 || opP
->mode
== FPREG
1995 || opP
->mode
== DREG
1996 || opP
->mode
== AREG
1997 || opP
->mode
== REGLST
)
1999 /* We should accept immediate operands, but they
2000 supposedly have to be quad word, and we don't
2001 handle that. I would like to see what a Motorola
2002 assembler does before doing something here. */
2003 if (opP
->mode
== IMMED
)
2008 if (opP
->mode
!= CONTROL
2009 || (opP
->reg
!= SFC
&& opP
->reg
!= DFC
))
2014 if (opP
->mode
!= CONTROL
|| opP
->reg
!= TC
)
2019 if (opP
->mode
!= CONTROL
|| opP
->reg
!= AC
)
2024 if (opP
->mode
!= CONTROL
2027 && opP
->reg
!= SCC
))
2032 if (opP
->mode
!= CONTROL
2038 if (opP
->mode
!= CONTROL
2041 && opP
->reg
!= CRP
))
2065 if (opP
->mode
!= CONTROL
2066 || (!(opP
->reg
>= BAD
&& opP
->reg
<= BAD
+ 7)
2067 && !(opP
->reg
>= BAC
&& opP
->reg
<= BAC
+ 7)))
2072 if (opP
->mode
!= CONTROL
|| opP
->reg
!= PSR
)
2077 if (opP
->mode
!= CONTROL
|| opP
->reg
!= PCSR
)
2082 if (opP
->mode
!= CONTROL
2091 if (opP
->mode
!= ABSL
)
2096 if (opP
->reg
< DATA0L
|| opP
->reg
> ADDR7U
)
2098 /* FIXME: kludge instead of fixing parser:
2099 upper/lower registers are *not* CONTROL
2100 registers, but ordinary ones. */
2101 if ((opP
->reg
>= DATA0L
&& opP
->reg
<= DATA7L
)
2102 || (opP
->reg
>= DATA0U
&& opP
->reg
<= DATA7U
))
2109 if (!(opP
->mode
== AINDR
2110 || (opP
->mode
== DISP
2111 && !(opP
->reg
== PC
|| opP
->reg
== ZPC
))))
2116 if (!(opP
->mode
== AINDR
|| opP
->mode
== DISP
))
2128 /* Since we have found the correct instruction, copy
2129 in the modifications that we may have made. */
2131 for (i
= 0; i
< opsfound
; i
++)
2132 the_ins
.operands
[i
] = operands_backup
[i
];
2138 opcode
= opcode
->m_next
;
2143 && !(ok_arch
& current_architecture
))
2145 const struct m68k_cpu
*cpu
;
2148 char *buf
= xmalloc (space
+ 1);
2152 the_ins
.error
= buf
;
2153 /* Make sure there's a NUL at the end of the buffer -- strncpy
2154 won't write one when it runs out of buffer */
2156 #define APPEND(STRING) \
2157 (strncpy (buf, STRING, space), len = strlen (buf), buf += len, space -= len)
2159 APPEND (_("invalid instruction for this architecture; needs "));
2163 APPEND (_("ColdFire ISA_A"));
2166 APPEND (_("ColdFire hardware divide"));
2169 APPEND (_("ColdFire ISA_A+"));
2172 APPEND (_("ColdFire ISA_B"));
2175 APPEND (_("ColdFire fpu"));
2178 APPEND (_("M68K fpu"));
2181 APPEND (_("M68K mmu"));
2184 APPEND (_("68020 or higher"));
2187 APPEND (_("68000 or higher"));
2190 APPEND (_("68010 or higher"));
2198 for (cpu
= m68k_cpus
; cpu
->name
; cpu
++)
2199 if (!cpu
->alias
&& (cpu
->arch
& ok_arch
))
2201 const struct m68k_cpu
*alias
;
2202 int seen_master
= 0;
2208 for (alias
= cpu
; alias
!= m68k_cpus
; alias
--)
2209 if (alias
[-1].alias
>= 0)
2211 for (; !seen_master
|| alias
->alias
> 0; alias
++)
2221 APPEND (alias
->name
);
2234 /* we ran out of space, so replace the end of the list
2239 strcpy (buf
, " ...");
2243 the_ins
.error
= _("operands mismatch");
2250 /* Now assemble it. */
2251 the_ins
.args
= opcode
->m_operands
;
2252 the_ins
.numargs
= opcode
->m_opnum
;
2253 the_ins
.numo
= opcode
->m_codenum
;
2254 the_ins
.opcode
[0] = getone (opcode
);
2255 the_ins
.opcode
[1] = gettwo (opcode
);
2257 for (s
= the_ins
.args
, opP
= &the_ins
.operands
[0]; *s
; s
+= 2, opP
++)
2261 /* This switch is a doozy.
2262 Watch the first step; its a big one! */
2295 tmpreg
= 0x3c; /* 7.4 */
2296 if (strchr ("bwl", s
[1]))
2297 nextword
= get_num (&opP
->disp
, 90);
2299 nextword
= get_num (&opP
->disp
, 0);
2300 if (isvar (&opP
->disp
))
2301 add_fix (s
[1], &opP
->disp
, 0, 0);
2305 if (!isbyte (nextword
))
2306 opP
->error
= _("operand out of range");
2311 if (!isword (nextword
))
2312 opP
->error
= _("operand out of range");
2317 if (!issword (nextword
))
2318 opP
->error
= _("operand out of range");
2323 addword (nextword
>> 16);
2350 /* We gotta put out some float. */
2351 if (op (&opP
->disp
) != O_big
)
2356 /* Can other cases happen here? */
2357 if (op (&opP
->disp
) != O_constant
)
2360 val
= (valueT
) offs (&opP
->disp
);
2364 generic_bignum
[gencnt
] = (LITTLENUM_TYPE
) val
;
2365 val
>>= LITTLENUM_NUMBER_OF_BITS
;
2369 offs (&opP
->disp
) = gencnt
;
2371 if (offs (&opP
->disp
) > 0)
2373 if (offs (&opP
->disp
) > baseo
)
2375 as_warn (_("Bignum too big for %c format; truncated"),
2377 offs (&opP
->disp
) = baseo
;
2379 baseo
-= offs (&opP
->disp
);
2382 for (wordp
= generic_bignum
+ offs (&opP
->disp
) - 1;
2383 offs (&opP
->disp
)--;
2388 gen_to_words (words
, baseo
, (long) outro
);
2389 for (wordp
= words
; baseo
--; wordp
++)
2393 tmpreg
= opP
->reg
- DATA
; /* 0.dreg */
2396 tmpreg
= 0x08 + opP
->reg
- ADDR
; /* 1.areg */
2399 tmpreg
= 0x10 + opP
->reg
- ADDR
; /* 2.areg */
2402 tmpreg
= 0x20 + opP
->reg
- ADDR
; /* 4.areg */
2405 tmpreg
= 0x18 + opP
->reg
- ADDR
; /* 3.areg */
2409 nextword
= get_num (&opP
->disp
, 90);
2411 /* Convert mode 5 addressing with a zero offset into
2412 mode 2 addressing to reduce the instruction size by a
2414 if (! isvar (&opP
->disp
)
2416 && (opP
->disp
.size
== SIZE_UNSPEC
)
2417 && (opP
->reg
>= ADDR0
)
2418 && (opP
->reg
<= ADDR7
))
2420 tmpreg
= 0x10 + opP
->reg
- ADDR
; /* 2.areg */
2425 && ! isvar (&opP
->disp
)
2428 opP
->disp
.exp
.X_op
= O_symbol
;
2429 opP
->disp
.exp
.X_add_symbol
=
2430 section_symbol (absolute_section
);
2433 /* Force into index mode. Hope this works. */
2435 /* We do the first bit for 32-bit displacements, and the
2436 second bit for 16 bit ones. It is possible that we
2437 should make the default be WORD instead of LONG, but
2438 I think that'd break GCC, so we put up with a little
2439 inefficiency for the sake of working output. */
2441 if (!issword (nextword
)
2442 || (isvar (&opP
->disp
)
2443 && ((opP
->disp
.size
== SIZE_UNSPEC
2444 && flag_short_refs
== 0
2445 && cpu_of_arch (current_architecture
) >= m68020
2446 && ! arch_coldfire_p (current_architecture
))
2447 || opP
->disp
.size
== SIZE_LONG
)))
2449 if (cpu_of_arch (current_architecture
) < m68020
2450 || arch_coldfire_p (current_architecture
))
2452 _("displacement too large for this architecture; needs 68020 or higher");
2454 tmpreg
= 0x3B; /* 7.3 */
2456 tmpreg
= 0x30 + opP
->reg
- ADDR
; /* 6.areg */
2457 if (isvar (&opP
->disp
))
2461 if (opP
->disp
.size
== SIZE_LONG
2463 /* If the displacement needs pic
2464 relocation it cannot be relaxed. */
2465 || opP
->disp
.pic_reloc
!= pic_none
2470 add_fix ('l', &opP
->disp
, 1, 2);
2474 add_frag (adds (&opP
->disp
),
2475 SEXT (offs (&opP
->disp
)),
2476 TAB (PCREL1632
, SZ_UNDEF
));
2483 add_fix ('l', &opP
->disp
, 0, 0);
2488 addword (nextword
>> 16);
2493 tmpreg
= 0x3A; /* 7.2 */
2495 tmpreg
= 0x28 + opP
->reg
- ADDR
; /* 5.areg */
2497 if (isvar (&opP
->disp
))
2501 add_fix ('w', &opP
->disp
, 1, 0);
2504 add_fix ('w', &opP
->disp
, 0, 0);
2514 baseo
= get_num (&opP
->disp
, 90);
2515 if (opP
->mode
== POST
|| opP
->mode
== PRE
)
2516 outro
= get_num (&opP
->odisp
, 90);
2517 /* Figure out the `addressing mode'.
2518 Also turn on the BASE_DISABLE bit, if needed. */
2519 if (opP
->reg
== PC
|| opP
->reg
== ZPC
)
2521 tmpreg
= 0x3b; /* 7.3 */
2522 if (opP
->reg
== ZPC
)
2525 else if (opP
->reg
== 0)
2528 tmpreg
= 0x30; /* 6.garbage */
2530 else if (opP
->reg
>= ZADDR0
&& opP
->reg
<= ZADDR7
)
2533 tmpreg
= 0x30 + opP
->reg
- ZADDR0
;
2536 tmpreg
= 0x30 + opP
->reg
- ADDR
; /* 6.areg */
2538 siz1
= opP
->disp
.size
;
2539 if (opP
->mode
== POST
|| opP
->mode
== PRE
)
2540 siz2
= opP
->odisp
.size
;
2544 /* Index register stuff. */
2545 if (opP
->index
.reg
!= 0
2546 && opP
->index
.reg
>= DATA
2547 && opP
->index
.reg
<= ADDR7
)
2549 nextword
|= (opP
->index
.reg
- DATA
) << 12;
2551 if (opP
->index
.size
== SIZE_LONG
2552 || (opP
->index
.size
== SIZE_UNSPEC
2553 && m68k_index_width_default
== SIZE_LONG
))
2556 if ((opP
->index
.scale
!= 1
2557 && cpu_of_arch (current_architecture
) < m68020
)
2558 || (opP
->index
.scale
== 8
2559 && (arch_coldfire_p (current_architecture
)
2560 && !arch_coldfire_fpu (current_architecture
))))
2563 _("scale factor invalid on this architecture; needs cpu32 or 68020 or higher");
2566 if (arch_coldfire_p (current_architecture
)
2567 && opP
->index
.size
== SIZE_WORD
)
2568 opP
->error
= _("invalid index size for coldfire");
2570 switch (opP
->index
.scale
)
2587 GET US OUT OF HERE! */
2589 /* Must be INDEX, with an index register. Address
2590 register cannot be ZERO-PC, and either :b was
2591 forced, or we know it will fit. For a 68000 or
2592 68010, force this mode anyways, because the
2593 larger modes aren't supported. */
2594 if (opP
->mode
== BASE
2595 && ((opP
->reg
>= ADDR0
2596 && opP
->reg
<= ADDR7
)
2599 if (siz1
== SIZE_BYTE
2600 || cpu_of_arch (current_architecture
) < m68020
2601 || arch_coldfire_p (current_architecture
)
2602 || (siz1
== SIZE_UNSPEC
2603 && ! isvar (&opP
->disp
)
2604 && issbyte (baseo
)))
2606 nextword
+= baseo
& 0xff;
2608 if (isvar (&opP
->disp
))
2610 /* Do a byte relocation. If it doesn't
2611 fit (possible on m68000) let the
2612 fixup processing complain later. */
2614 add_fix ('B', &opP
->disp
, 1, 1);
2616 add_fix ('B', &opP
->disp
, 0, 0);
2618 else if (siz1
!= SIZE_BYTE
)
2620 if (siz1
!= SIZE_UNSPEC
)
2621 as_warn (_("Forcing byte displacement"));
2622 if (! issbyte (baseo
))
2623 opP
->error
= _("byte displacement out of range");
2628 else if (siz1
== SIZE_UNSPEC
2630 && isvar (&opP
->disp
)
2631 && subs (&opP
->disp
) == NULL
2633 /* If the displacement needs pic
2634 relocation it cannot be relaxed. */
2635 && opP
->disp
.pic_reloc
== pic_none
2639 /* The code in md_convert_frag_1 needs to be
2640 able to adjust nextword. Call frag_grow
2641 to ensure that we have enough space in
2642 the frag obstack to make all the bytes
2645 nextword
+= baseo
& 0xff;
2647 add_frag (adds (&opP
->disp
),
2648 SEXT (offs (&opP
->disp
)),
2649 TAB (PCINDEX
, SZ_UNDEF
));
2657 nextword
|= 0x40; /* No index reg. */
2658 if (opP
->index
.reg
>= ZDATA0
2659 && opP
->index
.reg
<= ZDATA7
)
2660 nextword
|= (opP
->index
.reg
- ZDATA0
) << 12;
2661 else if (opP
->index
.reg
>= ZADDR0
2662 || opP
->index
.reg
<= ZADDR7
)
2663 nextword
|= (opP
->index
.reg
- ZADDR0
+ 8) << 12;
2666 /* It isn't simple. */
2668 if (cpu_of_arch (current_architecture
) < m68020
2669 || arch_coldfire_p (current_architecture
))
2671 _("invalid operand mode for this architecture; needs 68020 or higher");
2674 /* If the guy specified a width, we assume that it is
2675 wide enough. Maybe it isn't. If so, we lose. */
2679 if (isvar (&opP
->disp
)
2681 : ! issword (baseo
))
2686 else if (! isvar (&opP
->disp
) && baseo
== 0)
2695 as_warn (_(":b not permitted; defaulting to :w"));
2705 /* Figure out inner displacement stuff. */
2706 if (opP
->mode
== POST
|| opP
->mode
== PRE
)
2708 if (cpu_of_arch (current_architecture
) & cpu32
)
2709 opP
->error
= _("invalid operand mode for this architecture; needs 68020 or higher");
2713 if (isvar (&opP
->odisp
)
2715 : ! issword (outro
))
2720 else if (! isvar (&opP
->odisp
) && outro
== 0)
2729 as_warn (_(":b not permitted; defaulting to :w"));
2738 if (opP
->mode
== POST
2739 && (nextword
& 0x40) == 0)
2744 if (siz1
!= SIZE_UNSPEC
&& isvar (&opP
->disp
))
2746 if (opP
->reg
== PC
|| opP
->reg
== ZPC
)
2747 add_fix (siz1
== SIZE_LONG
? 'l' : 'w', &opP
->disp
, 1, 2);
2749 add_fix (siz1
== SIZE_LONG
? 'l' : 'w', &opP
->disp
, 0, 0);
2751 if (siz1
== SIZE_LONG
)
2752 addword (baseo
>> 16);
2753 if (siz1
!= SIZE_UNSPEC
)
2756 if (siz2
!= SIZE_UNSPEC
&& isvar (&opP
->odisp
))
2757 add_fix (siz2
== SIZE_LONG
? 'l' : 'w', &opP
->odisp
, 0, 0);
2758 if (siz2
== SIZE_LONG
)
2759 addword (outro
>> 16);
2760 if (siz2
!= SIZE_UNSPEC
)
2766 nextword
= get_num (&opP
->disp
, 90);
2767 switch (opP
->disp
.size
)
2772 if (!isvar (&opP
->disp
) && issword (offs (&opP
->disp
)))
2774 tmpreg
= 0x38; /* 7.0 */
2778 if (isvar (&opP
->disp
)
2779 && !subs (&opP
->disp
)
2780 && adds (&opP
->disp
)
2782 /* If the displacement needs pic relocation it
2783 cannot be relaxed. */
2784 && opP
->disp
.pic_reloc
== pic_none
2787 && !strchr ("~%&$?", s
[0]))
2789 tmpreg
= 0x3A; /* 7.2 */
2790 add_frag (adds (&opP
->disp
),
2791 SEXT (offs (&opP
->disp
)),
2792 TAB (ABSTOPCREL
, SZ_UNDEF
));
2795 /* Fall through into long. */
2797 if (isvar (&opP
->disp
))
2798 add_fix ('l', &opP
->disp
, 0, 0);
2800 tmpreg
= 0x39;/* 7.1 mode */
2801 addword (nextword
>> 16);
2806 as_bad (_("unsupported byte value; use a different suffix"));
2810 if (isvar (&opP
->disp
))
2811 add_fix ('w', &opP
->disp
, 0, 0);
2813 tmpreg
= 0x38;/* 7.0 mode */
2821 as_bad (_("unknown/incorrect operand"));
2825 /* If s[0] is '4', then this is for the mac instructions
2826 that can have a trailing_ampersand set. If so, set 0x100
2827 bit on tmpreg so install_gen_operand can check for it and
2828 set the appropriate bit (word2, bit 5). */
2831 if (opP
->trailing_ampersand
)
2834 install_gen_operand (s
[1], tmpreg
);
2840 { /* JF: I hate floating point! */
2855 tmpreg
= get_num (&opP
->disp
, tmpreg
);
2856 if (isvar (&opP
->disp
))
2857 add_fix (s
[1], &opP
->disp
, 0, 0);
2860 case 'b': /* Danger: These do no check for
2861 certain types of overflow.
2863 if (!isbyte (tmpreg
))
2864 opP
->error
= _("out of range");
2865 insop (tmpreg
, opcode
);
2866 if (isvar (&opP
->disp
))
2867 the_ins
.reloc
[the_ins
.nrel
- 1].n
=
2868 (opcode
->m_codenum
) * 2 + 1;
2871 if (!issbyte (tmpreg
))
2872 opP
->error
= _("out of range");
2873 the_ins
.opcode
[the_ins
.numo
- 1] |= tmpreg
& 0xff;
2874 if (isvar (&opP
->disp
))
2875 the_ins
.reloc
[the_ins
.nrel
- 1].n
= opcode
->m_codenum
* 2 - 1;
2878 if (!isword (tmpreg
))
2879 opP
->error
= _("out of range");
2880 insop (tmpreg
, opcode
);
2881 if (isvar (&opP
->disp
))
2882 the_ins
.reloc
[the_ins
.nrel
- 1].n
= (opcode
->m_codenum
) * 2;
2885 if (!issword (tmpreg
))
2886 opP
->error
= _("out of range");
2887 insop (tmpreg
, opcode
);
2888 if (isvar (&opP
->disp
))
2889 the_ins
.reloc
[the_ins
.nrel
- 1].n
= (opcode
->m_codenum
) * 2;
2892 /* Because of the way insop works, we put these two out
2894 insop (tmpreg
, opcode
);
2895 insop (tmpreg
>> 16, opcode
);
2896 if (isvar (&opP
->disp
))
2897 the_ins
.reloc
[the_ins
.nrel
- 1].n
= (opcode
->m_codenum
) * 2;
2904 install_operand (s
[1], tmpreg
);
2915 install_operand (s
[1], opP
->reg
- ADDR
);
2919 tmpreg
= get_num (&opP
->disp
, 90);
2924 add_fix ('B', &opP
->disp
, 1, -1);
2927 add_fix ('w', &opP
->disp
, 1, 0);
2932 the_ins
.opcode
[0] |= 0xff;
2933 add_fix ('l', &opP
->disp
, 1, 0);
2937 case 'g': /* Conditional branch */
2938 have_disp
= HAVE_LONG_CALL (current_architecture
);
2941 case 'b': /* Unconditional branch */
2942 have_disp
= HAVE_LONG_BRANCH (current_architecture
);
2945 case 's': /* Unconditional subroutine */
2946 have_disp
= HAVE_LONG_CALL (current_architecture
);
2949 if (subs (&opP
->disp
) /* We can't relax it. */
2951 /* If the displacement needs pic relocation it cannot be
2953 || opP
->disp
.pic_reloc
!= pic_none
2958 as_warn (_("Can't use long branches on this architecture"));
2962 /* This could either be a symbol, or an absolute
2963 address. If it's an absolute address, turn it into
2964 an absolute jump right here and keep it out of the
2966 if (adds (&opP
->disp
) == 0)
2968 if (the_ins
.opcode
[0] == 0x6000) /* jbra */
2969 the_ins
.opcode
[0] = 0x4EF9;
2970 else if (the_ins
.opcode
[0] == 0x6100) /* jbsr */
2971 the_ins
.opcode
[0] = 0x4EB9;
2974 the_ins
.opcode
[0] ^= 0x0100;
2975 the_ins
.opcode
[0] |= 0x0006;
2978 add_fix ('l', &opP
->disp
, 0, 0);
2984 /* Now we know it's going into the relaxer. Now figure
2985 out which mode. We try in this order of preference:
2986 long branch, absolute jump, byte/word branches only. */
2988 add_frag (adds (&opP
->disp
),
2989 SEXT (offs (&opP
->disp
)),
2990 TAB (BRANCHBWL
, SZ_UNDEF
));
2991 else if (! flag_keep_pcrel
)
2993 if ((the_ins
.opcode
[0] == 0x6000)
2994 || (the_ins
.opcode
[0] == 0x6100))
2995 add_frag (adds (&opP
->disp
),
2996 SEXT (offs (&opP
->disp
)),
2997 TAB (BRABSJUNC
, SZ_UNDEF
));
2999 add_frag (adds (&opP
->disp
),
3000 SEXT (offs (&opP
->disp
)),
3001 TAB (BRABSJCOND
, SZ_UNDEF
));
3004 add_frag (adds (&opP
->disp
),
3005 SEXT (offs (&opP
->disp
)),
3006 TAB (BRANCHBW
, SZ_UNDEF
));
3009 if (isvar (&opP
->disp
))
3011 /* Check for DBcc instructions. We can relax them,
3012 but only if we have long branches and/or absolute
3014 if (((the_ins
.opcode
[0] & 0xf0f8) == 0x50c8)
3015 && (HAVE_LONG_BRANCH (current_architecture
)
3016 || ! flag_keep_pcrel
))
3018 if (HAVE_LONG_BRANCH (current_architecture
))
3019 add_frag (adds (&opP
->disp
),
3020 SEXT (offs (&opP
->disp
)),
3021 TAB (DBCCLBR
, SZ_UNDEF
));
3023 add_frag (adds (&opP
->disp
),
3024 SEXT (offs (&opP
->disp
)),
3025 TAB (DBCCABSJ
, SZ_UNDEF
));
3028 add_fix ('w', &opP
->disp
, 1, 0);
3032 case 'C': /* Fixed size LONG coproc branches. */
3033 add_fix ('l', &opP
->disp
, 1, 0);
3037 case 'c': /* Var size Coprocesssor branches. */
3038 if (subs (&opP
->disp
) || (adds (&opP
->disp
) == 0))
3040 the_ins
.opcode
[the_ins
.numo
- 1] |= 0x40;
3041 add_fix ('l', &opP
->disp
, 1, 0);
3046 add_frag (adds (&opP
->disp
),
3047 SEXT (offs (&opP
->disp
)),
3048 TAB (FBRANCH
, SZ_UNDEF
));
3055 case 'C': /* Ignore it. */
3058 case 'd': /* JF this is a kludge. */
3059 install_operand ('s', opP
->reg
- ADDR
);
3060 tmpreg
= get_num (&opP
->disp
, 90);
3061 if (!issword (tmpreg
))
3063 as_warn (_("Expression out of range, using 0"));
3070 install_operand (s
[1], opP
->reg
- DATA
);
3073 case 'e': /* EMAC ACCx, reg/reg. */
3074 install_operand (s
[1], opP
->reg
- ACC
);
3077 case 'E': /* Ignore it. */
3081 install_operand (s
[1], opP
->reg
- FP0
);
3084 case 'g': /* EMAC ACCEXTx. */
3085 install_operand (s
[1], opP
->reg
- ACCEXT01
);
3088 case 'G': /* Ignore it. */
3093 tmpreg
= opP
->reg
- COP0
;
3094 install_operand (s
[1], tmpreg
);
3097 case 'i': /* MAC/EMAC scale factor. */
3098 install_operand (s
[1], opP
->mode
== LSH
? 0x1 : 0x3);
3101 case 'J': /* JF foo. */
3241 install_operand (s
[1], tmpreg
);
3245 tmpreg
= get_num (&opP
->disp
, 55);
3246 install_operand (s
[1], tmpreg
& 0x7f);
3253 if (tmpreg
& 0x7FF0000)
3254 as_bad (_("Floating point register in register list"));
3255 insop (reverse_16_bits (tmpreg
), opcode
);
3259 if (tmpreg
& 0x700FFFF)
3260 as_bad (_("Wrong register in floating-point reglist"));
3261 install_operand (s
[1], reverse_8_bits (tmpreg
>> 16));
3269 if (tmpreg
& 0x7FF0000)
3270 as_bad (_("Floating point register in register list"));
3271 insop (tmpreg
, opcode
);
3273 else if (s
[1] == '8')
3275 if (tmpreg
& 0x0FFFFFF)
3276 as_bad (_("incorrect register in reglist"));
3277 install_operand (s
[1], tmpreg
>> 24);
3281 if (tmpreg
& 0x700FFFF)
3282 as_bad (_("wrong register in floating-point reglist"));
3284 install_operand (s
[1], tmpreg
>> 16);
3289 install_operand (s
[1], get_num (&opP
->disp
, 60));
3293 tmpreg
= ((opP
->mode
== DREG
)
3294 ? 0x20 + (int) (opP
->reg
- DATA
)
3295 : (get_num (&opP
->disp
, 40) & 0x1F));
3296 install_operand (s
[1], tmpreg
);
3300 tmpreg
= get_num (&opP
->disp
, 10);
3303 install_operand (s
[1], tmpreg
);
3307 /* This depends on the fact that ADDR registers are eight
3308 more than their corresponding DATA regs, so the result
3309 will have the ADDR_REG bit set. */
3310 install_operand (s
[1], opP
->reg
- DATA
);
3314 if (opP
->mode
== AINDR
)
3315 install_operand (s
[1], opP
->reg
- DATA
);
3317 install_operand (s
[1], opP
->index
.reg
- DATA
);
3321 if (opP
->reg
== FPI
)
3323 else if (opP
->reg
== FPS
)
3325 else if (opP
->reg
== FPC
)
3329 install_operand (s
[1], tmpreg
);
3332 case 'S': /* Ignore it. */
3336 install_operand (s
[1], get_num (&opP
->disp
, 30));
3339 case 'U': /* Ignore it. */
3358 as_fatal (_("failed sanity check"));
3359 } /* switch on cache token. */
3360 install_operand (s
[1], tmpreg
);
3363 /* JF: These are out of order, I fear. */
3376 install_operand (s
[1], tmpreg
);
3402 install_operand (s
[1], tmpreg
);
3406 if (opP
->reg
== VAL
)
3425 install_operand (s
[1], tmpreg
);
3439 tmpreg
= (4 << 10) | ((opP
->reg
- BAD
) << 2);
3450 tmpreg
= (5 << 10) | ((opP
->reg
- BAC
) << 2);
3456 install_operand (s
[1], tmpreg
);
3459 know (opP
->reg
== PSR
);
3462 know (opP
->reg
== PCSR
);
3477 install_operand (s
[1], tmpreg
);
3480 tmpreg
= get_num (&opP
->disp
, 20);
3481 install_operand (s
[1], tmpreg
);
3483 case '_': /* used only for move16 absolute 32-bit address. */
3484 if (isvar (&opP
->disp
))
3485 add_fix ('l', &opP
->disp
, 0, 0);
3486 tmpreg
= get_num (&opP
->disp
, 90);
3487 addword (tmpreg
>> 16);
3488 addword (tmpreg
& 0xFFFF);
3491 install_operand (s
[1], opP
->reg
- DATA0L
);
3492 opP
->reg
-= (DATA0L
);
3493 opP
->reg
&= 0x0F; /* remove upper/lower bit. */
3496 tmpreg
= get_num (&opP
->disp
, 80);
3499 install_operand (s
[1], tmpreg
);
3502 tmpreg
= get_num (&opP
->disp
, 10);
3503 install_operand (s
[1], tmpreg
- 1);
3506 tmpreg
= get_num (&opP
->disp
, 65);
3507 install_operand (s
[1], tmpreg
);
3514 /* By the time whe get here (FINALLY) the_ins contains the complete
3515 instruction, ready to be emitted. . . */
3519 reverse_16_bits (int in
)
3524 static int mask
[16] =
3526 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
3527 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000
3529 for (n
= 0; n
< 16; n
++)
3532 out
|= mask
[15 - n
];
3535 } /* reverse_16_bits() */
3538 reverse_8_bits (int in
)
3543 static int mask
[8] =
3545 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
3548 for (n
= 0; n
< 8; n
++)
3554 } /* reverse_8_bits() */
3556 /* Cause an extra frag to be generated here, inserting up to 10 bytes
3557 (that value is chosen in the frag_var call in md_assemble). TYPE
3558 is the subtype of the frag to be generated; its primary type is
3559 rs_machine_dependent.
3561 The TYPE parameter is also used by md_convert_frag_1 and
3562 md_estimate_size_before_relax. The appropriate type of fixup will
3563 be emitted by md_convert_frag_1.
3565 ADD becomes the FR_SYMBOL field of the frag, and OFF the FR_OFFSET. */
3567 install_operand (int mode
, int val
)
3572 the_ins
.opcode
[0] |= val
& 0xFF; /* JF FF is for M kludge. */
3575 the_ins
.opcode
[0] |= val
<< 9;
3578 the_ins
.opcode
[1] |= val
<< 9;
3581 the_ins
.opcode
[1] |= val
<< 12;
3584 the_ins
.opcode
[1] |= val
<< 6;
3587 the_ins
.opcode
[1] |= val
;
3590 the_ins
.opcode
[2] |= val
<< 12;
3593 the_ins
.opcode
[2] |= val
<< 6;
3596 /* DANGER! This is a hack to force cas2l and cas2w cmds to be
3597 three words long! */
3599 the_ins
.opcode
[2] |= val
;
3602 the_ins
.opcode
[1] |= val
<< 7;
3605 the_ins
.opcode
[1] |= val
<< 10;
3609 the_ins
.opcode
[1] |= val
<< 5;
3614 the_ins
.opcode
[1] |= (val
<< 10) | (val
<< 7);
3617 the_ins
.opcode
[1] |= (val
<< 12) | val
;
3620 the_ins
.opcode
[0] |= val
= 0xff;
3623 the_ins
.opcode
[0] |= val
<< 9;
3626 the_ins
.opcode
[1] |= val
;
3629 the_ins
.opcode
[1] |= val
;
3630 the_ins
.numo
++; /* What a hack. */
3633 the_ins
.opcode
[1] |= val
<< 4;
3641 the_ins
.opcode
[0] |= (val
<< 6);
3644 the_ins
.opcode
[1] = (val
>> 16);
3645 the_ins
.opcode
[2] = val
& 0xffff;
3648 the_ins
.opcode
[0] |= ((val
& 0x8) << (6 - 3));
3649 the_ins
.opcode
[0] |= ((val
& 0x7) << 9);
3650 the_ins
.opcode
[1] |= ((val
& 0x10) << (7 - 4));
3652 case 'n': /* MAC/EMAC Rx on !load. */
3653 the_ins
.opcode
[0] |= ((val
& 0x8) << (6 - 3));
3654 the_ins
.opcode
[0] |= ((val
& 0x7) << 9);
3655 the_ins
.opcode
[1] |= ((val
& 0x10) << (7 - 4));
3657 case 'o': /* MAC/EMAC Rx on load. */
3658 the_ins
.opcode
[1] |= val
<< 12;
3659 the_ins
.opcode
[1] |= ((val
& 0x10) << (7 - 4));
3661 case 'M': /* MAC/EMAC Ry on !load. */
3662 the_ins
.opcode
[0] |= (val
& 0xF);
3663 the_ins
.opcode
[1] |= ((val
& 0x10) << (6 - 4));
3665 case 'N': /* MAC/EMAC Ry on load. */
3666 the_ins
.opcode
[1] |= (val
& 0xF);
3667 the_ins
.opcode
[1] |= ((val
& 0x10) << (6 - 4));
3670 the_ins
.opcode
[1] |= ((val
!= 1) << 10);
3673 the_ins
.opcode
[0] |= ((val
& 0x3) << 9);
3676 the_ins
.opcode
[0] |= ((val
& 0x3) << 0);
3678 case 'G': /* EMAC accumulator in a EMAC load instruction. */
3679 the_ins
.opcode
[0] |= ((~val
& 0x1) << 7);
3680 the_ins
.opcode
[1] |= ((val
& 0x2) << (4 - 1));
3682 case 'H': /* EMAC accumulator in a EMAC non-load instruction. */
3683 the_ins
.opcode
[0] |= ((val
& 0x1) << 7);
3684 the_ins
.opcode
[1] |= ((val
& 0x2) << (4 - 1));
3687 the_ins
.opcode
[1] |= ((val
& 0x3) << 9);
3690 the_ins
.opcode
[0] |= (val
& 0x1) <<10;
3694 as_fatal (_("failed sanity check."));
3699 install_gen_operand (int mode
, int val
)
3703 case '/': /* Special for mask loads for mac/msac insns with
3704 possible mask; trailing_ampersend set in bit 8. */
3705 the_ins
.opcode
[0] |= (val
& 0x3f);
3706 the_ins
.opcode
[1] |= (((val
& 0x100) >> 8) << 5);
3709 the_ins
.opcode
[0] |= val
;
3712 /* This is a kludge!!! */
3713 the_ins
.opcode
[0] |= (val
& 0x07) << 9 | (val
& 0x38) << 3;
3722 the_ins
.opcode
[0] |= val
;
3724 /* more stuff goes here. */
3726 as_fatal (_("failed sanity check."));
3730 /* Verify that we have some number of paren pairs, do m68k_ip_op(), and
3731 then deal with the bitfield hack. */
3734 crack_operand (char *str
, struct m68k_op
*opP
)
3736 register int parens
;
3738 register char *beg_str
;
3746 for (parens
= 0; *str
&& (parens
> 0 || inquote
|| notend (str
)); str
++)
3752 else if (*str
== ')')
3756 opP
->error
= _("Extra )");
3762 if (flag_mri
&& *str
== '\'')
3763 inquote
= ! inquote
;
3765 if (!*str
&& parens
)
3767 opP
->error
= _("Missing )");
3772 if (m68k_ip_op (beg_str
, opP
) != 0)
3779 c
= *++str
; /* JF bitfield hack. */
3784 as_bad (_("Missing operand"));
3787 /* Detect MRI REG symbols and convert them to REGLSTs. */
3788 if (opP
->mode
== CONTROL
&& (int)opP
->reg
< 0)
3791 opP
->mask
= ~(int)opP
->reg
;
3798 /* This is the guts of the machine-dependent assembler. STR points to a
3799 machine dependent instruction. This function is supposed to emit
3800 the frags/bytes it assembles to.
3804 insert_reg (const char *regname
, int regnum
)
3809 #ifdef REGISTER_PREFIX
3810 if (!flag_reg_prefix_optional
)
3812 buf
[0] = REGISTER_PREFIX
;
3813 strcpy (buf
+ 1, regname
);
3818 symbol_table_insert (symbol_new (regname
, reg_section
, regnum
,
3819 &zero_address_frag
));
3821 for (i
= 0; regname
[i
]; i
++)
3822 buf
[i
] = TOUPPER (regname
[i
]);
3825 symbol_table_insert (symbol_new (buf
, reg_section
, regnum
,
3826 &zero_address_frag
));
3835 static const struct init_entry init_table
[] =
3895 { "accext01", ACCEXT01
},
3896 { "accext23", ACCEXT23
},
3900 /* Control registers. */
3901 { "sfc", SFC
}, /* Source Function Code. */
3903 { "dfc", DFC
}, /* Destination Function Code. */
3905 { "cacr", CACR
}, /* Cache Control Register. */
3906 { "caar", CAAR
}, /* Cache Address Register. */
3908 { "usp", USP
}, /* User Stack Pointer. */
3909 { "vbr", VBR
}, /* Vector Base Register. */
3910 { "msp", MSP
}, /* Master Stack Pointer. */
3911 { "isp", ISP
}, /* Interrupt Stack Pointer. */
3913 { "itt0", ITT0
}, /* Instruction Transparent Translation Reg 0. */
3914 { "itt1", ITT1
}, /* Instruction Transparent Translation Reg 1. */
3915 { "dtt0", DTT0
}, /* Data Transparent Translation Register 0. */
3916 { "dtt1", DTT1
}, /* Data Transparent Translation Register 1. */
3918 /* 68ec040 versions of same */
3919 { "iacr0", ITT0
}, /* Instruction Access Control Register 0. */
3920 { "iacr1", ITT1
}, /* Instruction Access Control Register 0. */
3921 { "dacr0", DTT0
}, /* Data Access Control Register 0. */
3922 { "dacr1", DTT1
}, /* Data Access Control Register 0. */
3924 /* Coldfire versions of same. The ColdFire programmer's reference
3925 manual indicated that the order is 2,3,0,1, but Ken Rose
3926 <rose@netcom.com> says that 0,1,2,3 is the correct order. */
3927 { "acr0", ACR0
}, /* Access Control Unit 0. */
3928 { "acr1", ACR1
}, /* Access Control Unit 1. */
3929 { "acr2", ACR2
}, /* Access Control Unit 2. */
3930 { "acr3", ACR3
}, /* Access Control Unit 3. */
3932 { "tc", TC
}, /* MMU Translation Control Register. */
3936 { "mmusr", MMUSR
}, /* MMU Status Register. */
3937 { "srp", SRP
}, /* User Root Pointer. */
3938 { "urp", URP
}, /* Supervisor Root Pointer. */
3941 { "mmubar", MMUBAR
},
3944 { "rombar", ROMBAR
}, /* ROM Base Address Register. */
3945 { "rambar0", RAMBAR0
}, /* ROM Base Address Register. */
3946 { "rambar1", RAMBAR1
}, /* ROM Base Address Register. */
3947 { "mbar", MBAR
}, /* Module Base Address Register. */
3949 { "mbar0", MBAR0
}, /* mcfv4e registers. */
3950 { "mbar1", MBAR1
}, /* mcfv4e registers. */
3951 { "rombar0", ROMBAR0
}, /* mcfv4e registers. */
3952 { "rombar1", ROMBAR1
}, /* mcfv4e registers. */
3953 { "mpcr", MPCR
}, /* mcfv4e registers. */
3954 { "edrambar", EDRAMBAR
}, /* mcfv4e registers. */
3955 { "secmbar", SECMBAR
}, /* mcfv4e registers. */
3956 { "asid", TC
}, /* mcfv4e registers. */
3957 { "mmubar", BUSCR
}, /* mcfv4e registers. */
3958 { "pcr1u0", PCR1U0
}, /* mcfv4e registers. */
3959 { "pcr1l0", PCR1L0
}, /* mcfv4e registers. */
3960 { "pcr2u0", PCR2U0
}, /* mcfv4e registers. */
3961 { "pcr2l0", PCR2L0
}, /* mcfv4e registers. */
3962 { "pcr3u0", PCR3U0
}, /* mcfv4e registers. */
3963 { "pcr3l0", PCR3L0
}, /* mcfv4e registers. */
3964 { "pcr1u1", PCR1U1
}, /* mcfv4e registers. */
3965 { "pcr1l1", PCR1L1
}, /* mcfv4e registers. */
3966 { "pcr2u1", PCR2U1
}, /* mcfv4e registers. */
3967 { "pcr2l1", PCR2L1
}, /* mcfv4e registers. */
3968 { "pcr3u1", PCR3U1
}, /* mcfv4e registers. */
3969 { "pcr3l1", PCR3L1
}, /* mcfv4e registers. */
3971 { "flashbar", FLASHBAR
}, /* mcf528x registers. */
3972 { "rambar", RAMBAR
}, /* mcf528x registers. */
3974 { "mbar2", MBAR2
}, /* mcf5249 registers. */
3976 { "cac", CAC
}, /* fido registers. */
3977 { "mbb", MBB
}, /* fido registers. */
3978 /* End of control registers. */
4012 /* 68ec030 versions of same. */
4015 /* 68ec030 access control unit, identical to 030 MMU status reg. */
4018 /* Suppressed data and address registers. */
4036 /* Upper and lower data and address registers, used by macw and msacw. */
4077 init_regtable (void)
4080 for (i
= 0; init_table
[i
].name
; i
++)
4081 insert_reg (init_table
[i
].name
, init_table
[i
].number
);
4085 md_assemble (char *str
)
4092 int shorts_this_frag
;
4095 if (!selected_cpu
&& !selected_arch
)
4097 /* We've not selected an architecture yet. Set the default
4098 now. We do this lazily so that an initial .cpu or .arch directive
4100 if (!m68k_set_cpu (TARGET_CPU
, 1, 1))
4101 as_bad (_("unrecognized default cpu `%s'"), TARGET_CPU
);
4106 /* In MRI mode, the instruction and operands are separated by a
4107 space. Anything following the operands is a comment. The label
4108 has already been removed. */
4116 for (s
= str
; *s
!= '\0'; s
++)
4118 if ((*s
== ' ' || *s
== '\t') && ! inquote
)
4136 inquote
= ! inquote
;
4141 memset (&the_ins
, '\0', sizeof (the_ins
));
4146 for (n
= 0; n
< the_ins
.numargs
; n
++)
4147 if (the_ins
.operands
[n
].error
)
4149 er
= the_ins
.operands
[n
].error
;
4155 as_bad (_("%s -- statement `%s' ignored"), er
, str
);
4159 /* If there is a current label, record that it marks an instruction. */
4160 if (current_label
!= NULL
)
4162 current_label
->text
= 1;
4163 current_label
= NULL
;
4167 /* Tie dwarf2 debug info to the address at the start of the insn. */
4168 dwarf2_emit_insn (0);
4171 if (the_ins
.nfrag
== 0)
4173 /* No frag hacking involved; just put it out. */
4174 toP
= frag_more (2 * the_ins
.numo
);
4175 fromP
= &the_ins
.opcode
[0];
4176 for (m
= the_ins
.numo
; m
; --m
)
4178 md_number_to_chars (toP
, (long) (*fromP
), 2);
4182 /* Put out symbol-dependent info. */
4183 for (m
= 0; m
< the_ins
.nrel
; m
++)
4185 switch (the_ins
.reloc
[m
].wid
)
4204 as_fatal (_("Don't know how to figure width of %c in md_assemble()"),
4205 the_ins
.reloc
[m
].wid
);
4208 fixP
= fix_new_exp (frag_now
,
4209 ((toP
- frag_now
->fr_literal
)
4210 - the_ins
.numo
* 2 + the_ins
.reloc
[m
].n
),
4212 &the_ins
.reloc
[m
].exp
,
4213 the_ins
.reloc
[m
].pcrel
,
4214 get_reloc_code (n
, the_ins
.reloc
[m
].pcrel
,
4215 the_ins
.reloc
[m
].pic_reloc
));
4216 fixP
->fx_pcrel_adjust
= the_ins
.reloc
[m
].pcrel_fix
;
4217 if (the_ins
.reloc
[m
].wid
== 'B')
4218 fixP
->fx_signed
= 1;
4223 /* There's some frag hacking. */
4225 /* Calculate the max frag size. */
4228 wid
= 2 * the_ins
.fragb
[0].fragoff
;
4229 for (n
= 1; n
< the_ins
.nfrag
; n
++)
4230 wid
+= 2 * (the_ins
.numo
- the_ins
.fragb
[n
- 1].fragoff
);
4231 /* frag_var part. */
4233 /* Make sure the whole insn fits in one chunk, in particular that
4234 the var part is attached, as we access one byte before the
4235 variable frag for byte branches. */
4239 for (n
= 0, fromP
= &the_ins
.opcode
[0]; n
< the_ins
.nfrag
; n
++)
4244 wid
= 2 * the_ins
.fragb
[n
].fragoff
;
4246 wid
= 2 * (the_ins
.numo
- the_ins
.fragb
[n
- 1].fragoff
);
4247 toP
= frag_more (wid
);
4249 shorts_this_frag
= 0;
4250 for (m
= wid
/ 2; m
; --m
)
4252 md_number_to_chars (toP
, (long) (*fromP
), 2);
4257 for (m
= 0; m
< the_ins
.nrel
; m
++)
4259 if ((the_ins
.reloc
[m
].n
) >= 2 * shorts_this_frag
)
4261 the_ins
.reloc
[m
].n
-= 2 * shorts_this_frag
;
4264 wid
= the_ins
.reloc
[m
].wid
;
4267 the_ins
.reloc
[m
].wid
= 0;
4268 wid
= (wid
== 'b') ? 1 : (wid
== 'w') ? 2 : (wid
== 'l') ? 4 : 4000;
4270 fixP
= fix_new_exp (frag_now
,
4271 ((toP
- frag_now
->fr_literal
)
4272 - the_ins
.numo
* 2 + the_ins
.reloc
[m
].n
),
4274 &the_ins
.reloc
[m
].exp
,
4275 the_ins
.reloc
[m
].pcrel
,
4276 get_reloc_code (wid
, the_ins
.reloc
[m
].pcrel
,
4277 the_ins
.reloc
[m
].pic_reloc
));
4278 fixP
->fx_pcrel_adjust
= the_ins
.reloc
[m
].pcrel_fix
;
4280 (void) frag_var (rs_machine_dependent
, 10, 0,
4281 (relax_substateT
) (the_ins
.fragb
[n
].fragty
),
4282 the_ins
.fragb
[n
].fadd
, the_ins
.fragb
[n
].foff
, to_beg_P
);
4284 n
= (the_ins
.numo
- the_ins
.fragb
[n
- 1].fragoff
);
4285 shorts_this_frag
= 0;
4288 toP
= frag_more (n
* 2);
4291 md_number_to_chars (toP
, (long) (*fromP
), 2);
4297 for (m
= 0; m
< the_ins
.nrel
; m
++)
4301 wid
= the_ins
.reloc
[m
].wid
;
4304 the_ins
.reloc
[m
].wid
= 0;
4305 wid
= (wid
== 'b') ? 1 : (wid
== 'w') ? 2 : (wid
== 'l') ? 4 : 4000;
4307 fixP
= fix_new_exp (frag_now
,
4308 ((the_ins
.reloc
[m
].n
+ toP
- frag_now
->fr_literal
)
4309 - shorts_this_frag
* 2),
4311 &the_ins
.reloc
[m
].exp
,
4312 the_ins
.reloc
[m
].pcrel
,
4313 get_reloc_code (wid
, the_ins
.reloc
[m
].pcrel
,
4314 the_ins
.reloc
[m
].pic_reloc
));
4315 fixP
->fx_pcrel_adjust
= the_ins
.reloc
[m
].pcrel_fix
;
4319 /* Comparison function used by qsort to rank the opcode entries by name. */
4322 m68k_compare_opcode (const void * v1
, const void * v2
)
4324 struct m68k_opcode
* op1
, * op2
;
4330 op1
= *(struct m68k_opcode
**) v1
;
4331 op2
= *(struct m68k_opcode
**) v2
;
4333 /* Compare the two names. If different, return the comparison.
4334 If the same, return the order they are in the opcode table. */
4335 ret
= strcmp (op1
->name
, op2
->name
);
4346 const struct m68k_opcode
*ins
;
4347 struct m68k_incant
*hack
, *slak
;
4348 const char *retval
= 0; /* Empty string, or error msg text. */
4351 /* Set up hash tables with 68000 instructions.
4352 similar to what the vax assembler does. */
4353 /* RMS claims the thing to do is take the m68k-opcode.h table, and make
4354 a copy of it at runtime, adding in the information we want but isn't
4355 there. I think it'd be better to have an awk script hack the table
4356 at compile time. Or even just xstr the table and use it as-is. But
4357 my lord ghod hath spoken, so we do it this way. Excuse the ugly var
4362 flag_reg_prefix_optional
= 1;
4364 if (! m68k_rel32_from_cmdline
)
4368 /* First sort the opcode table into alphabetical order to seperate
4369 the order that the assembler wants to see the opcodes from the
4370 order that the disassembler wants to see them. */
4371 m68k_sorted_opcodes
= xmalloc (m68k_numopcodes
* sizeof (* m68k_sorted_opcodes
));
4372 if (!m68k_sorted_opcodes
)
4373 as_fatal (_("Internal Error: Can't allocate m68k_sorted_opcodes of size %d"),
4374 m68k_numopcodes
* ((int) sizeof (* m68k_sorted_opcodes
)));
4376 for (i
= m68k_numopcodes
; i
--;)
4377 m68k_sorted_opcodes
[i
] = m68k_opcodes
+ i
;
4379 qsort (m68k_sorted_opcodes
, m68k_numopcodes
,
4380 sizeof (m68k_sorted_opcodes
[0]), m68k_compare_opcode
);
4382 op_hash
= hash_new ();
4384 obstack_begin (&robyn
, 4000);
4385 for (i
= 0; i
< m68k_numopcodes
; i
++)
4387 hack
= slak
= (struct m68k_incant
*) obstack_alloc (&robyn
, sizeof (struct m68k_incant
));
4390 ins
= m68k_sorted_opcodes
[i
];
4392 /* We must enter all insns into the table, because .arch and
4393 .cpu directives can change things. */
4394 slak
->m_operands
= ins
->args
;
4395 slak
->m_arch
= ins
->arch
;
4396 slak
->m_opcode
= ins
->opcode
;
4398 /* In most cases we can determine the number of opcode words
4399 by checking the second word of the mask. Unfortunately
4400 some instructions have 2 opcode words, but no fixed bits
4401 in the second word. A leading dot in the operands
4402 string also indicates 2 opcodes. */
4403 if (*slak
->m_operands
== '.')
4406 slak
->m_codenum
= 2;
4408 else if (ins
->match
& 0xffffL
)
4409 slak
->m_codenum
= 2;
4411 slak
->m_codenum
= 1;
4412 slak
->m_opnum
= strlen (slak
->m_operands
) / 2;
4414 if (i
+ 1 != m68k_numopcodes
4415 && !strcmp (ins
->name
, m68k_sorted_opcodes
[i
+ 1]->name
))
4417 slak
->m_next
= obstack_alloc (&robyn
, sizeof (struct m68k_incant
));
4422 slak
= slak
->m_next
;
4426 retval
= hash_insert (op_hash
, ins
->name
, (char *) hack
);
4428 as_fatal (_("Internal Error: Can't hash %s: %s"), ins
->name
, retval
);
4431 for (i
= 0; i
< m68k_numaliases
; i
++)
4433 const char *name
= m68k_opcode_aliases
[i
].primary
;
4434 const char *alias
= m68k_opcode_aliases
[i
].alias
;
4435 PTR val
= hash_find (op_hash
, name
);
4438 as_fatal (_("Internal Error: Can't find %s in hash table"), name
);
4439 retval
= hash_insert (op_hash
, alias
, val
);
4441 as_fatal (_("Internal Error: Can't hash %s: %s"), alias
, retval
);
4444 /* In MRI mode, all unsized branches are variable sized. Normally,
4445 they are word sized. */
4448 static struct m68k_opcode_alias mri_aliases
[] =
4469 i
< (int) (sizeof mri_aliases
/ sizeof mri_aliases
[0]);
4472 const char *name
= mri_aliases
[i
].primary
;
4473 const char *alias
= mri_aliases
[i
].alias
;
4474 PTR val
= hash_find (op_hash
, name
);
4477 as_fatal (_("Internal Error: Can't find %s in hash table"), name
);
4478 retval
= hash_jam (op_hash
, alias
, val
);
4480 as_fatal (_("Internal Error: Can't hash %s: %s"), alias
, retval
);
4484 for (i
= 0; i
< (int) sizeof (notend_table
); i
++)
4486 notend_table
[i
] = 0;
4487 alt_notend_table
[i
] = 0;
4490 notend_table
[','] = 1;
4491 notend_table
['{'] = 1;
4492 notend_table
['}'] = 1;
4493 alt_notend_table
['a'] = 1;
4494 alt_notend_table
['A'] = 1;
4495 alt_notend_table
['d'] = 1;
4496 alt_notend_table
['D'] = 1;
4497 alt_notend_table
['#'] = 1;
4498 alt_notend_table
['&'] = 1;
4499 alt_notend_table
['f'] = 1;
4500 alt_notend_table
['F'] = 1;
4501 #ifdef REGISTER_PREFIX
4502 alt_notend_table
[REGISTER_PREFIX
] = 1;
4505 /* We need to put '(' in alt_notend_table to handle
4506 cas2 %d0:%d2,%d3:%d4,(%a0):(%a1) */
4507 alt_notend_table
['('] = 1;
4509 /* We need to put '@' in alt_notend_table to handle
4510 cas2 %d0:%d2,%d3:%d4,@(%d0):@(%d1) */
4511 alt_notend_table
['@'] = 1;
4513 /* We need to put digits in alt_notend_table to handle
4514 bfextu %d0{24:1},%d0 */
4515 alt_notend_table
['0'] = 1;
4516 alt_notend_table
['1'] = 1;
4517 alt_notend_table
['2'] = 1;
4518 alt_notend_table
['3'] = 1;
4519 alt_notend_table
['4'] = 1;
4520 alt_notend_table
['5'] = 1;
4521 alt_notend_table
['6'] = 1;
4522 alt_notend_table
['7'] = 1;
4523 alt_notend_table
['8'] = 1;
4524 alt_notend_table
['9'] = 1;
4526 #ifndef MIT_SYNTAX_ONLY
4527 /* Insert pseudo ops, these have to go into the opcode table since
4528 gas expects pseudo ops to start with a dot. */
4532 while (mote_pseudo_table
[n
].poc_name
)
4534 hack
= obstack_alloc (&robyn
, sizeof (struct m68k_incant
));
4535 hash_insert (op_hash
,
4536 mote_pseudo_table
[n
].poc_name
, (char *) hack
);
4537 hack
->m_operands
= 0;
4547 record_alignment (text_section
, 2);
4548 record_alignment (data_section
, 2);
4549 record_alignment (bss_section
, 2);
4554 /* This is called when a label is defined. */
4557 m68k_frob_label (symbolS
*sym
)
4559 struct label_line
*n
;
4561 n
= (struct label_line
*) xmalloc (sizeof *n
);
4564 as_where (&n
->file
, &n
->line
);
4570 dwarf2_emit_label (sym
);
4574 /* This is called when a value that is not an instruction is emitted. */
4577 m68k_flush_pending_output (void)
4579 current_label
= NULL
;
4582 /* This is called at the end of the assembly, when the final value of
4583 the label is known. We warn if this is a text symbol aligned at an
4587 m68k_frob_symbol (symbolS
*sym
)
4589 if (S_GET_SEGMENT (sym
) == reg_section
4590 && (int) S_GET_VALUE (sym
) < 0)
4592 S_SET_SEGMENT (sym
, absolute_section
);
4593 S_SET_VALUE (sym
, ~(int)S_GET_VALUE (sym
));
4595 else if ((S_GET_VALUE (sym
) & 1) != 0)
4597 struct label_line
*l
;
4599 for (l
= labels
; l
!= NULL
; l
= l
->next
)
4601 if (l
->label
== sym
)
4604 as_warn_where (l
->file
, l
->line
,
4605 _("text label `%s' aligned to odd boundary"),
4613 /* This is called if we go in or out of MRI mode because of the .mri
4617 m68k_mri_mode_change (int on
)
4621 if (! flag_reg_prefix_optional
)
4623 flag_reg_prefix_optional
= 1;
4624 #ifdef REGISTER_PREFIX
4629 if (! m68k_rel32_from_cmdline
)
4634 if (! reg_prefix_optional_seen
)
4636 #ifdef REGISTER_PREFIX_OPTIONAL
4637 flag_reg_prefix_optional
= REGISTER_PREFIX_OPTIONAL
;
4639 flag_reg_prefix_optional
= 0;
4641 #ifdef REGISTER_PREFIX
4646 if (! m68k_rel32_from_cmdline
)
4651 /* Equal to MAX_PRECISION in atof-ieee.c. */
4652 #define MAX_LITTLENUMS 6
4654 /* Turn a string in input_line_pointer into a floating point constant
4655 of type TYPE, and store the appropriate bytes in *LITP. The number
4656 of LITTLENUMS emitted is stored in *SIZEP. An error message is
4657 returned, or NULL on OK. */
4660 md_atof (int type
, char *litP
, int *sizeP
)
4663 LITTLENUM_TYPE words
[MAX_LITTLENUMS
];
4664 LITTLENUM_TYPE
*wordP
;
4695 return _("Bad call to MD_ATOF()");
4697 t
= atof_ieee (input_line_pointer
, type
, words
);
4699 input_line_pointer
= t
;
4701 *sizeP
= prec
* sizeof (LITTLENUM_TYPE
);
4702 for (wordP
= words
; prec
--;)
4704 md_number_to_chars (litP
, (long) (*wordP
++), sizeof (LITTLENUM_TYPE
));
4705 litP
+= sizeof (LITTLENUM_TYPE
);
4711 md_number_to_chars (char *buf
, valueT val
, int n
)
4713 number_to_chars_bigendian (buf
, val
, n
);
4717 md_apply_fix (fixS
*fixP
, valueT
*valP
, segT seg ATTRIBUTE_UNUSED
)
4719 offsetT val
= *valP
;
4720 addressT upper_limit
;
4721 offsetT lower_limit
;
4723 /* This is unnecessary but it convinces the native rs6000 compiler
4724 to generate the code we want. */
4725 char *buf
= fixP
->fx_frag
->fr_literal
;
4726 buf
+= fixP
->fx_where
;
4727 /* End ibm compiler workaround. */
4731 if (fixP
->fx_addsy
== NULL
&& fixP
->fx_pcrel
== 0)
4737 memset (buf
, 0, fixP
->fx_size
);
4738 fixP
->fx_addnumber
= val
; /* Remember value for emit_reloc. */
4740 if (fixP
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
4741 && !S_IS_DEFINED (fixP
->fx_addsy
)
4742 && !S_IS_WEAK (fixP
->fx_addsy
))
4743 S_SET_WEAK (fixP
->fx_addsy
);
4746 #elif defined(OBJ_AOUT)
4747 /* PR gas/3041 Do not fix frags referencing a weak symbol. */
4748 if (fixP
->fx_addsy
&& S_IS_WEAK (fixP
->fx_addsy
))
4750 memset (buf
, 0, fixP
->fx_size
);
4751 fixP
->fx_addnumber
= val
; /* Remember value for emit_reloc. */
4756 if (fixP
->fx_r_type
== BFD_RELOC_VTABLE_INHERIT
4757 || fixP
->fx_r_type
== BFD_RELOC_VTABLE_ENTRY
)
4760 switch (fixP
->fx_size
)
4762 /* The cast to offsetT below are necessary to make code
4763 correct for machines where ints are smaller than offsetT. */
4767 lower_limit
= - (offsetT
) 0x80;
4770 *buf
++ = (val
>> 8);
4772 upper_limit
= 0x7fff;
4773 lower_limit
= - (offsetT
) 0x8000;
4776 *buf
++ = (val
>> 24);
4777 *buf
++ = (val
>> 16);
4778 *buf
++ = (val
>> 8);
4780 upper_limit
= 0x7fffffff;
4781 lower_limit
= - (offsetT
) 0x7fffffff - 1; /* Avoid constant overflow. */
4784 BAD_CASE (fixP
->fx_size
);
4787 /* Fix up a negative reloc. */
4788 if (fixP
->fx_addsy
== NULL
&& fixP
->fx_subsy
!= NULL
)
4790 fixP
->fx_addsy
= fixP
->fx_subsy
;
4791 fixP
->fx_subsy
= NULL
;
4795 /* For non-pc-relative values, it's conceivable we might get something
4796 like "0xff" for a byte field. So extend the upper part of the range
4797 to accept such numbers. We arbitrarily disallow "-0xff" or "0xff+0xff",
4798 so that we can do any range checking at all. */
4799 if (! fixP
->fx_pcrel
&& ! fixP
->fx_signed
)
4800 upper_limit
= upper_limit
* 2 + 1;
4802 if ((addressT
) val
> upper_limit
4803 && (val
> 0 || val
< lower_limit
))
4804 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
4805 _("value %ld out of range"), (long)val
);
4807 /* A one byte PC-relative reloc means a short branch. We can't use
4808 a short branch with a value of 0 or -1, because those indicate
4809 different opcodes (branches with longer offsets). fixup_segment
4810 in write.c may have clobbered fx_pcrel, so we need to examine the
4813 || fixP
->fx_r_type
== BFD_RELOC_8_PCREL
)
4814 && fixP
->fx_size
== 1
4815 && (fixP
->fx_addsy
== NULL
4816 || S_IS_DEFINED (fixP
->fx_addsy
))
4817 && (val
== 0 || val
== -1))
4818 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
4819 _("invalid byte branch offset"));
4822 /* *fragP has been relaxed to its final size, and now needs to have
4823 the bytes inside it modified to conform to the new size There is UGLY
4827 md_convert_frag_1 (fragS
*fragP
)
4832 /* Address in object code of the displacement. */
4833 register int object_address
= fragP
->fr_fix
+ fragP
->fr_address
;
4835 /* Address in gas core of the place to store the displacement. */
4836 /* This convinces the native rs6000 compiler to generate the code we
4838 register char *buffer_address
= fragP
->fr_literal
;
4839 buffer_address
+= fragP
->fr_fix
;
4840 /* End ibm compiler workaround. */
4842 /* The displacement of the address, from current location. */
4843 disp
= fragP
->fr_symbol
? S_GET_VALUE (fragP
->fr_symbol
) : 0;
4844 disp
= (disp
+ fragP
->fr_offset
) - object_address
;
4846 switch (fragP
->fr_subtype
)
4848 case TAB (BRANCHBWL
, BYTE
):
4849 case TAB (BRABSJUNC
, BYTE
):
4850 case TAB (BRABSJCOND
, BYTE
):
4851 case TAB (BRANCHBW
, BYTE
):
4852 know (issbyte (disp
));
4854 as_bad_where (fragP
->fr_file
, fragP
->fr_line
,
4855 _("short branch with zero offset: use :w"));
4856 fixP
= fix_new (fragP
, fragP
->fr_fix
- 1, 1, fragP
->fr_symbol
,
4857 fragP
->fr_offset
, 1, RELAX_RELOC_PC8
);
4858 fixP
->fx_pcrel_adjust
= -1;
4860 case TAB (BRANCHBWL
, SHORT
):
4861 case TAB (BRABSJUNC
, SHORT
):
4862 case TAB (BRABSJCOND
, SHORT
):
4863 case TAB (BRANCHBW
, SHORT
):
4864 fragP
->fr_opcode
[1] = 0x00;
4865 fixP
= fix_new (fragP
, fragP
->fr_fix
, 2, fragP
->fr_symbol
,
4866 fragP
->fr_offset
, 1, RELAX_RELOC_PC16
);
4869 case TAB (BRANCHBWL
, LONG
):
4870 fragP
->fr_opcode
[1] = (char) 0xFF;
4871 fixP
= fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
4872 fragP
->fr_offset
, 1, RELAX_RELOC_PC32
);
4875 case TAB (BRABSJUNC
, LONG
):
4876 if (fragP
->fr_opcode
[0] == 0x61) /* jbsr */
4878 if (flag_keep_pcrel
)
4879 as_bad_where (fragP
->fr_file
, fragP
->fr_line
,
4880 _("Conversion of PC relative BSR to absolute JSR"));
4881 fragP
->fr_opcode
[0] = 0x4E;
4882 fragP
->fr_opcode
[1] = (char) 0xB9; /* JSR with ABSL LONG operand. */
4883 fixP
= fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
4884 fragP
->fr_offset
, 0, RELAX_RELOC_ABS32
);
4887 else if (fragP
->fr_opcode
[0] == 0x60) /* jbra */
4889 if (flag_keep_pcrel
)
4890 as_bad_where (fragP
->fr_file
, fragP
->fr_line
,
4891 _("Conversion of PC relative branch to absolute jump"));
4892 fragP
->fr_opcode
[0] = 0x4E;
4893 fragP
->fr_opcode
[1] = (char) 0xF9; /* JMP with ABSL LONG operand. */
4894 fixP
= fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
4895 fragP
->fr_offset
, 0, RELAX_RELOC_ABS32
);
4900 /* This cannot happen, because jbsr and jbra are the only two
4901 unconditional branches. */
4905 case TAB (BRABSJCOND
, LONG
):
4906 if (flag_keep_pcrel
)
4907 as_bad_where (fragP
->fr_file
, fragP
->fr_line
,
4908 _("Conversion of PC relative conditional branch to absolute jump"));
4910 /* Only Bcc 68000 instructions can come here
4911 Change bcc into b!cc/jmp absl long. */
4912 fragP
->fr_opcode
[0] ^= 0x01; /* Invert bcc. */
4913 fragP
->fr_opcode
[1] = 0x06; /* Branch offset = 6. */
4915 /* JF: these used to be fr_opcode[2,3], but they may be in a
4916 different frag, in which case referring to them is a no-no.
4917 Only fr_opcode[0,1] are guaranteed to work. */
4918 *buffer_address
++ = 0x4e; /* put in jmp long (0x4ef9) */
4919 *buffer_address
++ = (char) 0xf9;
4920 fragP
->fr_fix
+= 2; /* Account for jmp instruction. */
4921 fixP
= fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
4922 fragP
->fr_offset
, 0, RELAX_RELOC_ABS32
);
4925 case TAB (FBRANCH
, SHORT
):
4926 know ((fragP
->fr_opcode
[1] & 0x40) == 0);
4927 fixP
= fix_new (fragP
, fragP
->fr_fix
, 2, fragP
->fr_symbol
,
4928 fragP
->fr_offset
, 1, RELAX_RELOC_PC16
);
4931 case TAB (FBRANCH
, LONG
):
4932 fragP
->fr_opcode
[1] |= 0x40; /* Turn on LONG bit. */
4933 fixP
= fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
4934 fragP
->fr_offset
, 1, RELAX_RELOC_PC32
);
4937 case TAB (DBCCLBR
, SHORT
):
4938 case TAB (DBCCABSJ
, SHORT
):
4939 fixP
= fix_new (fragP
, fragP
->fr_fix
, 2, fragP
->fr_symbol
,
4940 fragP
->fr_offset
, 1, RELAX_RELOC_PC16
);
4943 case TAB (DBCCLBR
, LONG
):
4944 /* Only DBcc instructions can come here.
4945 Change dbcc into dbcc/bral.
4946 JF: these used to be fr_opcode[2-7], but that's wrong. */
4947 if (flag_keep_pcrel
)
4948 as_bad_where (fragP
->fr_file
, fragP
->fr_line
,
4949 _("Conversion of DBcc to absolute jump"));
4951 *buffer_address
++ = 0x00; /* Branch offset = 4. */
4952 *buffer_address
++ = 0x04;
4953 *buffer_address
++ = 0x60; /* Put in bra pc+6. */
4954 *buffer_address
++ = 0x06;
4955 *buffer_address
++ = 0x60; /* Put in bral (0x60ff). */
4956 *buffer_address
++ = (char) 0xff;
4958 fragP
->fr_fix
+= 6; /* Account for bra/jmp instructions. */
4959 fixP
= fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
4960 fragP
->fr_offset
, 1, RELAX_RELOC_PC32
);
4963 case TAB (DBCCABSJ
, LONG
):
4964 /* Only DBcc instructions can come here.
4965 Change dbcc into dbcc/jmp.
4966 JF: these used to be fr_opcode[2-7], but that's wrong. */
4967 if (flag_keep_pcrel
)
4968 as_bad_where (fragP
->fr_file
, fragP
->fr_line
,
4969 _("Conversion of PC relative conditional branch to absolute jump"));
4971 *buffer_address
++ = 0x00; /* Branch offset = 4. */
4972 *buffer_address
++ = 0x04;
4973 *buffer_address
++ = 0x60; /* Put in bra pc + 6. */
4974 *buffer_address
++ = 0x06;
4975 *buffer_address
++ = 0x4e; /* Put in jmp long (0x4ef9). */
4976 *buffer_address
++ = (char) 0xf9;
4978 fragP
->fr_fix
+= 6; /* Account for bra/jmp instructions. */
4979 fixP
= fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
4980 fragP
->fr_offset
, 0, RELAX_RELOC_ABS32
);
4983 case TAB (PCREL1632
, SHORT
):
4984 fragP
->fr_opcode
[1] &= ~0x3F;
4985 fragP
->fr_opcode
[1] |= 0x3A; /* 072 - mode 7.2 */
4986 fixP
= fix_new (fragP
, (int) (fragP
->fr_fix
), 2, fragP
->fr_symbol
,
4987 fragP
->fr_offset
, 1, RELAX_RELOC_PC16
);
4990 case TAB (PCREL1632
, LONG
):
4991 /* Already set to mode 7.3; this indicates: PC indirect with
4992 suppressed index, 32-bit displacement. */
4993 *buffer_address
++ = 0x01;
4994 *buffer_address
++ = 0x70;
4996 fixP
= fix_new (fragP
, (int) (fragP
->fr_fix
), 4, fragP
->fr_symbol
,
4997 fragP
->fr_offset
, 1, RELAX_RELOC_PC32
);
4998 fixP
->fx_pcrel_adjust
= 2;
5001 case TAB (PCINDEX
, BYTE
):
5002 assert (fragP
->fr_fix
>= 2);
5003 buffer_address
[-2] &= ~1;
5004 fixP
= fix_new (fragP
, fragP
->fr_fix
- 1, 1, fragP
->fr_symbol
,
5005 fragP
->fr_offset
, 1, RELAX_RELOC_PC8
);
5006 fixP
->fx_pcrel_adjust
= 1;
5008 case TAB (PCINDEX
, SHORT
):
5009 assert (fragP
->fr_fix
>= 2);
5010 buffer_address
[-2] |= 0x1;
5011 buffer_address
[-1] = 0x20;
5012 fixP
= fix_new (fragP
, (int) (fragP
->fr_fix
), 2, fragP
->fr_symbol
,
5013 fragP
->fr_offset
, 1, RELAX_RELOC_PC16
);
5014 fixP
->fx_pcrel_adjust
= 2;
5017 case TAB (PCINDEX
, LONG
):
5018 assert (fragP
->fr_fix
>= 2);
5019 buffer_address
[-2] |= 0x1;
5020 buffer_address
[-1] = 0x30;
5021 fixP
= fix_new (fragP
, (int) (fragP
->fr_fix
), 4, fragP
->fr_symbol
,
5022 fragP
->fr_offset
, 1, RELAX_RELOC_PC32
);
5023 fixP
->fx_pcrel_adjust
= 2;
5026 case TAB (ABSTOPCREL
, SHORT
):
5027 fixP
= fix_new (fragP
, fragP
->fr_fix
, 2, fragP
->fr_symbol
,
5028 fragP
->fr_offset
, 1, RELAX_RELOC_PC16
);
5031 case TAB (ABSTOPCREL
, LONG
):
5032 if (flag_keep_pcrel
)
5033 as_fatal (_("Conversion of PC relative displacement to absolute"));
5034 /* The thing to do here is force it to ABSOLUTE LONG, since
5035 ABSTOPCREL is really trying to shorten an ABSOLUTE address anyway. */
5036 if ((fragP
->fr_opcode
[1] & 0x3F) != 0x3A)
5038 fragP
->fr_opcode
[1] &= ~0x3F;
5039 fragP
->fr_opcode
[1] |= 0x39; /* Mode 7.1 */
5040 fixP
= fix_new (fragP
, fragP
->fr_fix
, 4, fragP
->fr_symbol
,
5041 fragP
->fr_offset
, 0, RELAX_RELOC_ABS32
);
5047 fixP
->fx_file
= fragP
->fr_file
;
5048 fixP
->fx_line
= fragP
->fr_line
;
5053 md_convert_frag (bfd
*abfd ATTRIBUTE_UNUSED
,
5054 segT sec ATTRIBUTE_UNUSED
,
5057 md_convert_frag_1 (fragP
);
5060 /* Force truly undefined symbols to their maximum size, and generally set up
5061 the frag list to be relaxed
5064 md_estimate_size_before_relax (fragS
*fragP
, segT segment
)
5066 /* Handle SZ_UNDEF first, it can be changed to BYTE or SHORT. */
5067 switch (fragP
->fr_subtype
)
5069 case TAB (BRANCHBWL
, SZ_UNDEF
):
5070 case TAB (BRABSJUNC
, SZ_UNDEF
):
5071 case TAB (BRABSJCOND
, SZ_UNDEF
):
5073 if (S_GET_SEGMENT (fragP
->fr_symbol
) == segment
5074 && relaxable_symbol (fragP
->fr_symbol
))
5076 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), BYTE
);
5078 else if (flag_short_refs
)
5080 /* Symbol is undefined and we want short ref. */
5081 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), SHORT
);
5085 /* Symbol is still undefined. Make it LONG. */
5086 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), LONG
);
5091 case TAB (BRANCHBW
, SZ_UNDEF
):
5093 if (S_GET_SEGMENT (fragP
->fr_symbol
) == segment
5094 && relaxable_symbol (fragP
->fr_symbol
))
5096 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), BYTE
);
5100 /* Symbol is undefined and we don't have long branches. */
5101 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), SHORT
);
5106 case TAB (FBRANCH
, SZ_UNDEF
):
5107 case TAB (DBCCLBR
, SZ_UNDEF
):
5108 case TAB (DBCCABSJ
, SZ_UNDEF
):
5109 case TAB (PCREL1632
, SZ_UNDEF
):
5111 if ((S_GET_SEGMENT (fragP
->fr_symbol
) == segment
5112 && relaxable_symbol (fragP
->fr_symbol
))
5115 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), SHORT
);
5119 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), LONG
);
5124 case TAB (PCINDEX
, SZ_UNDEF
):
5125 if ((S_GET_SEGMENT (fragP
->fr_symbol
) == segment
5126 && relaxable_symbol (fragP
->fr_symbol
)))
5128 fragP
->fr_subtype
= TAB (PCINDEX
, BYTE
);
5132 fragP
->fr_subtype
= TAB (PCINDEX
, LONG
);
5136 case TAB (ABSTOPCREL
, SZ_UNDEF
):
5138 if ((S_GET_SEGMENT (fragP
->fr_symbol
) == segment
5139 && relaxable_symbol (fragP
->fr_symbol
)))
5141 fragP
->fr_subtype
= TAB (ABSTOPCREL
, SHORT
);
5145 fragP
->fr_subtype
= TAB (ABSTOPCREL
, LONG
);
5154 /* Now that SZ_UNDEF are taken care of, check others. */
5155 switch (fragP
->fr_subtype
)
5157 case TAB (BRANCHBWL
, BYTE
):
5158 case TAB (BRABSJUNC
, BYTE
):
5159 case TAB (BRABSJCOND
, BYTE
):
5160 case TAB (BRANCHBW
, BYTE
):
5161 /* We can't do a short jump to the next instruction, so in that
5162 case we force word mode. If the symbol is at the start of a
5163 frag, and it is the next frag with any data in it (usually
5164 this is just the next frag, but assembler listings may
5165 introduce empty frags), we must use word mode. */
5166 if (fragP
->fr_symbol
)
5170 sym_frag
= symbol_get_frag (fragP
->fr_symbol
);
5171 if (S_GET_VALUE (fragP
->fr_symbol
) == sym_frag
->fr_address
)
5175 for (l
= fragP
->fr_next
; l
&& l
!= sym_frag
; l
= l
->fr_next
)
5179 fragP
->fr_subtype
= TAB (TABTYPE (fragP
->fr_subtype
), SHORT
);
5186 return md_relax_table
[fragP
->fr_subtype
].rlx_length
;
5189 #if defined(OBJ_AOUT) | defined(OBJ_BOUT)
5190 /* the bit-field entries in the relocation_info struct plays hell
5191 with the byte-order problems of cross-assembly. So as a hack,
5192 I added this mach. dependent ri twiddler. Ugly, but it gets
5194 /* on m68k: first 4 bytes are normal unsigned long, next three bytes
5195 are symbolnum, most sig. byte first. Last byte is broken up with
5196 bit 7 as pcrel, bits 6 & 5 as length, bit 4 as pcrel, and the lower
5197 nibble as nuthin. (on Sun 3 at least) */
5198 /* Translate the internal relocation information into target-specific
5202 md_ri_to_chars (char *the_bytes
, struct reloc_info_generic
*ri
)
5205 md_number_to_chars (the_bytes
, ri
->r_address
, 4);
5206 /* Now the fun stuff. */
5207 the_bytes
[4] = (ri
->r_symbolnum
>> 16) & 0x0ff;
5208 the_bytes
[5] = (ri
->r_symbolnum
>> 8) & 0x0ff;
5209 the_bytes
[6] = ri
->r_symbolnum
& 0x0ff;
5210 the_bytes
[7] = (((ri
->r_pcrel
<< 7) & 0x80)
5211 | ((ri
->r_length
<< 5) & 0x60)
5212 | ((ri
->r_extern
<< 4) & 0x10));
5217 #endif /* OBJ_AOUT or OBJ_BOUT */
5219 #ifndef WORKING_DOT_WORD
5220 int md_short_jump_size
= 4;
5221 int md_long_jump_size
= 6;
5224 md_create_short_jump (char *ptr
, addressT from_addr
, addressT to_addr
,
5225 fragS
*frag ATTRIBUTE_UNUSED
,
5226 symbolS
*to_symbol ATTRIBUTE_UNUSED
)
5230 offset
= to_addr
- (from_addr
+ 2);
5232 md_number_to_chars (ptr
, (valueT
) 0x6000, 2);
5233 md_number_to_chars (ptr
+ 2, (valueT
) offset
, 2);
5237 md_create_long_jump (char *ptr
, addressT from_addr
, addressT to_addr
,
5238 fragS
*frag
, symbolS
*to_symbol
)
5242 if (!HAVE_LONG_BRANCH (current_architecture
))
5244 if (flag_keep_pcrel
)
5245 as_fatal (_("Tried to convert PC relative branch to absolute jump"));
5246 offset
= to_addr
- S_GET_VALUE (to_symbol
);
5247 md_number_to_chars (ptr
, (valueT
) 0x4EF9, 2);
5248 md_number_to_chars (ptr
+ 2, (valueT
) offset
, 4);
5249 fix_new (frag
, (ptr
+ 2) - frag
->fr_literal
, 4, to_symbol
, (offsetT
) 0,
5254 offset
= to_addr
- (from_addr
+ 2);
5255 md_number_to_chars (ptr
, (valueT
) 0x60ff, 2);
5256 md_number_to_chars (ptr
+ 2, (valueT
) offset
, 4);
5262 /* Different values of OK tell what its OK to return. Things that
5263 aren't OK are an error (what a shock, no?)
5266 10: Absolute 1:8 only
5267 20: Absolute 0:7 only
5268 30: absolute 0:15 only
5269 40: Absolute 0:31 only
5270 50: absolute 0:127 only
5271 55: absolute -64:63 only
5272 60: absolute -128:127 only
5273 65: absolute 0:511 only
5274 70: absolute 0:4095 only
5275 80: absolute -1, 1:7 only
5279 get_num (struct m68k_exp
*exp
, int ok
)
5281 if (exp
->exp
.X_op
== O_absent
)
5283 /* Do the same thing the VAX asm does. */
5284 op (exp
) = O_constant
;
5290 as_warn (_("expression out of range: defaulting to 1"));
5294 else if (exp
->exp
.X_op
== O_constant
)
5299 if ((valueT
) TRUNC (offs (exp
)) - 1 > 7)
5301 as_warn (_("expression out of range: defaulting to 1"));
5306 if ((valueT
) TRUNC (offs (exp
)) > 7)
5310 if ((valueT
) TRUNC (offs (exp
)) > 15)
5314 if ((valueT
) TRUNC (offs (exp
)) > 32)
5318 if ((valueT
) TRUNC (offs (exp
)) > 127)
5322 if ((valueT
) SEXT (offs (exp
)) + 64 > 127)
5326 if ((valueT
) SEXT (offs (exp
)) + 128 > 255)
5330 if ((valueT
) TRUNC (offs (exp
)) > 511)
5334 if ((valueT
) TRUNC (offs (exp
)) > 4095)
5337 as_warn (_("expression out of range: defaulting to 0"));
5342 if ((valueT
) TRUNC (offs (exp
)) != 0xffffffff
5343 && (valueT
) TRUNC (offs (exp
)) - 1 > 6)
5345 as_warn (_("expression out of range: defaulting to 1"));
5353 else if (exp
->exp
.X_op
== O_big
)
5355 if (offs (exp
) <= 0 /* flonum. */
5356 && (ok
== 90 /* no bignums */
5357 || (ok
> 10 /* Small-int ranges including 0 ok. */
5358 /* If we have a flonum zero, a zero integer should
5359 do as well (e.g., in moveq). */
5360 && generic_floating_point_number
.exponent
== 0
5361 && generic_floating_point_number
.low
[0] == 0)))
5363 /* HACK! Turn it into a long. */
5364 LITTLENUM_TYPE words
[6];
5366 gen_to_words (words
, 2, 8L); /* These numbers are magic! */
5367 op (exp
) = O_constant
;
5370 offs (exp
) = words
[1] | (words
[0] << 16);
5374 op (exp
) = O_constant
;
5377 offs (exp
) = (ok
== 10) ? 1 : 0;
5378 as_warn (_("Can't deal with expression; defaulting to %ld"),
5384 if (ok
>= 10 && ok
<= 80)
5386 op (exp
) = O_constant
;
5389 offs (exp
) = (ok
== 10) ? 1 : 0;
5390 as_warn (_("Can't deal with expression; defaulting to %ld"),
5395 if (exp
->size
!= SIZE_UNSPEC
)
5403 if (!isbyte (offs (exp
)))
5404 as_warn (_("expression doesn't fit in BYTE"));
5407 if (!isword (offs (exp
)))
5408 as_warn (_("expression doesn't fit in WORD"));
5416 /* These are the back-ends for the various machine dependent pseudo-ops. */
5419 s_data1 (int ignore ATTRIBUTE_UNUSED
)
5421 subseg_set (data_section
, 1);
5422 demand_empty_rest_of_line ();
5426 s_data2 (int ignore ATTRIBUTE_UNUSED
)
5428 subseg_set (data_section
, 2);
5429 demand_empty_rest_of_line ();
5433 s_bss (int ignore ATTRIBUTE_UNUSED
)
5435 /* We don't support putting frags in the BSS segment, we fake it
5436 by marking in_bss, then looking at s_skip for clues. */
5438 subseg_set (bss_section
, 0);
5439 demand_empty_rest_of_line ();
5443 s_even (int ignore ATTRIBUTE_UNUSED
)
5446 register long temp_fill
;
5448 temp
= 1; /* JF should be 2? */
5449 temp_fill
= get_absolute_expression ();
5450 if (!need_pass_2
) /* Never make frag if expect extra pass. */
5451 frag_align (temp
, (int) temp_fill
, 0);
5452 demand_empty_rest_of_line ();
5453 record_alignment (now_seg
, temp
);
5457 s_proc (int ignore ATTRIBUTE_UNUSED
)
5459 demand_empty_rest_of_line ();
5462 /* Pseudo-ops handled for MRI compatibility. */
5464 /* This function returns non-zero if the argument is a conditional
5465 pseudo-op. This is called when checking whether a pending
5466 alignment is needed. */
5469 m68k_conditional_pseudoop (pseudo_typeS
*pop
)
5471 return (pop
->poc_handler
== s_mri_if
5472 || pop
->poc_handler
== s_mri_else
);
5475 /* Handle an MRI style chip specification. */
5484 s
= input_line_pointer
;
5485 /* We can't use get_symbol_end since the processor names are not proper
5487 while (is_part_of_name (c
= *input_line_pointer
++))
5489 *--input_line_pointer
= 0;
5490 for (i
= 0; m68k_cpus
[i
].name
; i
++)
5491 if (strcasecmp (s
, m68k_cpus
[i
].name
) == 0)
5493 if (!m68k_cpus
[i
].name
)
5495 as_bad (_("%s: unrecognized processor name"), s
);
5496 *input_line_pointer
= c
;
5497 ignore_rest_of_line ();
5500 *input_line_pointer
= c
;
5502 if (*input_line_pointer
== '/')
5503 current_architecture
= 0;
5505 current_architecture
&= m68881
| m68851
;
5506 current_architecture
|= m68k_cpus
[i
].arch
& ~(m68881
| m68851
);
5507 control_regs
= m68k_cpus
[i
].control_regs
;
5509 while (*input_line_pointer
== '/')
5511 ++input_line_pointer
;
5512 s
= input_line_pointer
;
5513 /* We can't use get_symbol_end since the processor names are not
5515 while (is_part_of_name (c
= *input_line_pointer
++))
5517 *--input_line_pointer
= 0;
5518 if (strcmp (s
, "68881") == 0)
5519 current_architecture
|= m68881
;
5520 else if (strcmp (s
, "68851") == 0)
5521 current_architecture
|= m68851
;
5522 *input_line_pointer
= c
;
5526 /* The MRI CHIP pseudo-op. */
5529 s_chip (int ignore ATTRIBUTE_UNUSED
)
5535 stop
= mri_comment_field (&stopc
);
5538 mri_comment_end (stop
, stopc
);
5539 demand_empty_rest_of_line ();
5542 /* The MRI FOPT pseudo-op. */
5545 s_fopt (int ignore ATTRIBUTE_UNUSED
)
5549 if (strncasecmp (input_line_pointer
, "ID=", 3) == 0)
5553 input_line_pointer
+= 3;
5554 temp
= get_absolute_expression ();
5555 if (temp
< 0 || temp
> 7)
5556 as_bad (_("bad coprocessor id"));
5558 m68k_float_copnum
= COP0
+ temp
;
5562 as_bad (_("unrecognized fopt option"));
5563 ignore_rest_of_line ();
5567 demand_empty_rest_of_line ();
5570 /* The structure used to handle the MRI OPT pseudo-op. */
5574 /* The name of the option. */
5577 /* If this is not NULL, just call this function. The first argument
5578 is the ARG field of this structure, the second argument is
5579 whether the option was negated. */
5580 void (*pfn
) (int arg
, int on
);
5582 /* If this is not NULL, and the PFN field is NULL, set the variable
5583 this points to. Set it to the ARG field if the option was not
5584 negated, and the NOTARG field otherwise. */
5587 /* The value to pass to PFN or to assign to *PVAR. */
5590 /* The value to assign to *PVAR if the option is negated. If PFN is
5591 NULL, and PVAR is not NULL, and ARG and NOTARG are the same, then
5592 the option may not be negated. */
5596 /* The table used to handle the MRI OPT pseudo-op. */
5598 static void skip_to_comma (int, int);
5599 static void opt_nest (int, int);
5600 static void opt_chip (int, int);
5601 static void opt_list (int, int);
5602 static void opt_list_symbols (int, int);
5604 static const struct opt_action opt_table
[] =
5606 { "abspcadd", 0, &m68k_abspcadd
, 1, 0 },
5608 /* We do relaxing, so there is little use for these options. */
5609 { "b", 0, 0, 0, 0 },
5610 { "brs", 0, 0, 0, 0 },
5611 { "brb", 0, 0, 0, 0 },
5612 { "brl", 0, 0, 0, 0 },
5613 { "brw", 0, 0, 0, 0 },
5615 { "c", 0, 0, 0, 0 },
5616 { "cex", 0, 0, 0, 0 },
5617 { "case", 0, &symbols_case_sensitive
, 1, 0 },
5618 { "cl", 0, 0, 0, 0 },
5619 { "cre", 0, 0, 0, 0 },
5620 { "d", 0, &flag_keep_locals
, 1, 0 },
5621 { "e", 0, 0, 0, 0 },
5622 { "f", 0, &flag_short_refs
, 1, 0 },
5623 { "frs", 0, &flag_short_refs
, 1, 0 },
5624 { "frl", 0, &flag_short_refs
, 0, 1 },
5625 { "g", 0, 0, 0, 0 },
5626 { "i", 0, 0, 0, 0 },
5627 { "m", 0, 0, 0, 0 },
5628 { "mex", 0, 0, 0, 0 },
5629 { "mc", 0, 0, 0, 0 },
5630 { "md", 0, 0, 0, 0 },
5631 { "nest", opt_nest
, 0, 0, 0 },
5632 { "next", skip_to_comma
, 0, 0, 0 },
5633 { "o", 0, 0, 0, 0 },
5634 { "old", 0, 0, 0, 0 },
5635 { "op", skip_to_comma
, 0, 0, 0 },
5636 { "pco", 0, 0, 0, 0 },
5637 { "p", opt_chip
, 0, 0, 0 },
5638 { "pcr", 0, 0, 0, 0 },
5639 { "pcs", 0, 0, 0, 0 },
5640 { "r", 0, 0, 0, 0 },
5641 { "quick", 0, &m68k_quick
, 1, 0 },
5642 { "rel32", 0, &m68k_rel32
, 1, 0 },
5643 { "s", opt_list
, 0, 0, 0 },
5644 { "t", opt_list_symbols
, 0, 0, 0 },
5645 { "w", 0, &flag_no_warnings
, 0, 1 },
5649 #define OPTCOUNT ((int) (sizeof opt_table / sizeof opt_table[0]))
5651 /* The MRI OPT pseudo-op. */
5654 s_opt (int ignore ATTRIBUTE_UNUSED
)
5662 const struct opt_action
*o
;
5667 if (*input_line_pointer
== '-')
5669 ++input_line_pointer
;
5672 else if (strncasecmp (input_line_pointer
, "NO", 2) == 0)
5674 input_line_pointer
+= 2;
5678 s
= input_line_pointer
;
5679 c
= get_symbol_end ();
5681 for (i
= 0, o
= opt_table
; i
< OPTCOUNT
; i
++, o
++)
5683 if (strcasecmp (s
, o
->name
) == 0)
5687 /* Restore input_line_pointer now in case the option
5689 *input_line_pointer
= c
;
5690 (*o
->pfn
) (o
->arg
, t
);
5692 else if (o
->pvar
!= NULL
)
5694 if (! t
&& o
->arg
== o
->notarg
)
5695 as_bad (_("option `%s' may not be negated"), s
);
5696 *input_line_pointer
= c
;
5697 *o
->pvar
= t
? o
->arg
: o
->notarg
;
5700 *input_line_pointer
= c
;
5706 as_bad (_("option `%s' not recognized"), s
);
5707 *input_line_pointer
= c
;
5710 while (*input_line_pointer
++ == ',');
5712 /* Move back to terminating character. */
5713 --input_line_pointer
;
5714 demand_empty_rest_of_line ();
5717 /* Skip ahead to a comma. This is used for OPT options which we do
5718 not support and which take arguments. */
5721 skip_to_comma (int arg ATTRIBUTE_UNUSED
, int on ATTRIBUTE_UNUSED
)
5723 while (*input_line_pointer
!= ','
5724 && ! is_end_of_line
[(unsigned char) *input_line_pointer
])
5725 ++input_line_pointer
;
5728 /* Handle the OPT NEST=depth option. */
5731 opt_nest (int arg ATTRIBUTE_UNUSED
, int on ATTRIBUTE_UNUSED
)
5733 if (*input_line_pointer
!= '=')
5735 as_bad (_("bad format of OPT NEST=depth"));
5739 ++input_line_pointer
;
5740 max_macro_nest
= get_absolute_expression ();
5743 /* Handle the OPT P=chip option. */
5746 opt_chip (int arg ATTRIBUTE_UNUSED
, int on ATTRIBUTE_UNUSED
)
5748 if (*input_line_pointer
!= '=')
5750 /* This is just OPT P, which we do not support. */
5754 ++input_line_pointer
;
5758 /* Handle the OPT S option. */
5761 opt_list (int arg ATTRIBUTE_UNUSED
, int on
)
5766 /* Handle the OPT T option. */
5769 opt_list_symbols (int arg ATTRIBUTE_UNUSED
, int on
)
5772 listing
|= LISTING_SYMBOLS
;
5774 listing
&= ~LISTING_SYMBOLS
;
5777 /* Handle the MRI REG pseudo-op. */
5780 s_reg (int ignore ATTRIBUTE_UNUSED
)
5789 if (line_label
== NULL
)
5791 as_bad (_("missing label"));
5792 ignore_rest_of_line ();
5797 stop
= mri_comment_field (&stopc
);
5801 s
= input_line_pointer
;
5802 while (ISALNUM (*input_line_pointer
)
5803 #ifdef REGISTER_PREFIX
5804 || *input_line_pointer
== REGISTER_PREFIX
5806 || *input_line_pointer
== '/'
5807 || *input_line_pointer
== '-')
5808 ++input_line_pointer
;
5809 c
= *input_line_pointer
;
5810 *input_line_pointer
= '\0';
5812 if (m68k_ip_op (s
, &rop
) != 0)
5814 if (rop
.error
== NULL
)
5815 as_bad (_("bad register list"));
5817 as_bad (_("bad register list: %s"), rop
.error
);
5818 *input_line_pointer
= c
;
5819 ignore_rest_of_line ();
5823 *input_line_pointer
= c
;
5825 if (rop
.mode
== REGLST
)
5827 else if (rop
.mode
== DREG
)
5828 mask
= 1 << (rop
.reg
- DATA0
);
5829 else if (rop
.mode
== AREG
)
5830 mask
= 1 << (rop
.reg
- ADDR0
+ 8);
5831 else if (rop
.mode
== FPREG
)
5832 mask
= 1 << (rop
.reg
- FP0
+ 16);
5833 else if (rop
.mode
== CONTROL
5836 else if (rop
.mode
== CONTROL
5839 else if (rop
.mode
== CONTROL
5844 as_bad (_("bad register list"));
5845 ignore_rest_of_line ();
5849 S_SET_SEGMENT (line_label
, reg_section
);
5850 S_SET_VALUE (line_label
, ~mask
);
5851 symbol_set_frag (line_label
, &zero_address_frag
);
5854 mri_comment_end (stop
, stopc
);
5856 demand_empty_rest_of_line ();
5859 /* This structure is used for the MRI SAVE and RESTORE pseudo-ops. */
5863 struct save_opts
*next
;
5865 int symbols_case_sensitive
;
5869 const enum m68k_register
*control_regs
;
5874 /* FIXME: We don't save OPT S. */
5877 /* This variable holds the stack of saved options. */
5879 static struct save_opts
*save_stack
;
5881 /* The MRI SAVE pseudo-op. */
5884 s_save (int ignore ATTRIBUTE_UNUSED
)
5886 struct save_opts
*s
;
5888 s
= (struct save_opts
*) xmalloc (sizeof (struct save_opts
));
5889 s
->abspcadd
= m68k_abspcadd
;
5890 s
->symbols_case_sensitive
= symbols_case_sensitive
;
5891 s
->keep_locals
= flag_keep_locals
;
5892 s
->short_refs
= flag_short_refs
;
5893 s
->architecture
= current_architecture
;
5894 s
->control_regs
= control_regs
;
5895 s
->quick
= m68k_quick
;
5896 s
->rel32
= m68k_rel32
;
5897 s
->listing
= listing
;
5898 s
->no_warnings
= flag_no_warnings
;
5900 s
->next
= save_stack
;
5903 demand_empty_rest_of_line ();
5906 /* The MRI RESTORE pseudo-op. */
5909 s_restore (int ignore ATTRIBUTE_UNUSED
)
5911 struct save_opts
*s
;
5913 if (save_stack
== NULL
)
5915 as_bad (_("restore without save"));
5916 ignore_rest_of_line ();
5921 save_stack
= s
->next
;
5923 m68k_abspcadd
= s
->abspcadd
;
5924 symbols_case_sensitive
= s
->symbols_case_sensitive
;
5925 flag_keep_locals
= s
->keep_locals
;
5926 flag_short_refs
= s
->short_refs
;
5927 current_architecture
= s
->architecture
;
5928 control_regs
= s
->control_regs
;
5929 m68k_quick
= s
->quick
;
5930 m68k_rel32
= s
->rel32
;
5931 listing
= s
->listing
;
5932 flag_no_warnings
= s
->no_warnings
;
5936 demand_empty_rest_of_line ();
5939 /* Types of MRI structured control directives. */
5941 enum mri_control_type
5949 /* This structure is used to stack the MRI structured control
5952 struct mri_control_info
5954 /* The directive within which this one is enclosed. */
5955 struct mri_control_info
*outer
;
5957 /* The type of directive. */
5958 enum mri_control_type type
;
5960 /* Whether an ELSE has been in an IF. */
5963 /* The add or sub statement at the end of a FOR. */
5966 /* The label of the top of a FOR or REPEAT loop. */
5969 /* The label to jump to for the next iteration, or the else
5970 expression of a conditional. */
5973 /* The label to jump to to break out of the loop, or the label past
5974 the end of a conditional. */
5978 /* The stack of MRI structured control directives. */
5980 static struct mri_control_info
*mri_control_stack
;
5982 /* The current MRI structured control directive index number, used to
5983 generate label names. */
5985 static int mri_control_index
;
5987 /* Assemble an instruction for an MRI structured control directive. */
5990 mri_assemble (char *str
)
5994 /* md_assemble expects the opcode to be in lower case. */
5995 for (s
= str
; *s
!= ' ' && *s
!= '\0'; s
++)
6001 /* Generate a new MRI label structured control directive label name. */
6004 mri_control_label (void)
6008 n
= (char *) xmalloc (20);
6009 sprintf (n
, "%smc%d", FAKE_LABEL_NAME
, mri_control_index
);
6010 ++mri_control_index
;
6014 /* Create a new MRI structured control directive. */
6016 static struct mri_control_info
*
6017 push_mri_control (enum mri_control_type type
)
6019 struct mri_control_info
*n
;
6021 n
= (struct mri_control_info
*) xmalloc (sizeof (struct mri_control_info
));
6025 if (type
== mri_if
|| type
== mri_while
)
6028 n
->top
= mri_control_label ();
6029 n
->next
= mri_control_label ();
6030 n
->bottom
= mri_control_label ();
6032 n
->outer
= mri_control_stack
;
6033 mri_control_stack
= n
;
6038 /* Pop off the stack of MRI structured control directives. */
6041 pop_mri_control (void)
6043 struct mri_control_info
*n
;
6045 n
= mri_control_stack
;
6046 mri_control_stack
= n
->outer
;
6054 /* Recognize a condition code in an MRI structured control expression. */
6057 parse_mri_condition (int *pcc
)
6061 know (*input_line_pointer
== '<');
6063 ++input_line_pointer
;
6064 c1
= *input_line_pointer
++;
6065 c2
= *input_line_pointer
++;
6067 if (*input_line_pointer
!= '>')
6069 as_bad (_("syntax error in structured control directive"));
6073 ++input_line_pointer
;
6079 *pcc
= (c1
<< 8) | c2
;
6084 /* Parse a single operand in an MRI structured control expression. */
6087 parse_mri_control_operand (int *pcc
, char **leftstart
, char **leftstop
,
6088 char **rightstart
, char **rightstop
)
6100 if (*input_line_pointer
== '<')
6102 /* It's just a condition code. */
6103 return parse_mri_condition (pcc
);
6106 /* Look ahead for the condition code. */
6107 for (s
= input_line_pointer
; *s
!= '\0'; ++s
)
6109 if (*s
== '<' && s
[1] != '\0' && s
[2] != '\0' && s
[3] == '>')
6114 as_bad (_("missing condition code in structured control directive"));
6118 *leftstart
= input_line_pointer
;
6120 if (*leftstop
> *leftstart
6121 && ((*leftstop
)[-1] == ' ' || (*leftstop
)[-1] == '\t'))
6124 input_line_pointer
= s
;
6125 if (! parse_mri_condition (pcc
))
6128 /* Look ahead for AND or OR or end of line. */
6129 for (s
= input_line_pointer
; *s
!= '\0'; ++s
)
6131 /* We must make sure we don't misinterpret AND/OR at the end of labels!
6132 if d0 <eq> #FOOAND and d1 <ne> #BAROR then
6134 if ((s
== input_line_pointer
6137 && ((strncasecmp (s
, "AND", 3) == 0
6138 && (s
[3] == '.' || ! is_part_of_name (s
[3])))
6139 || (strncasecmp (s
, "OR", 2) == 0
6140 && (s
[2] == '.' || ! is_part_of_name (s
[2])))))
6144 *rightstart
= input_line_pointer
;
6146 if (*rightstop
> *rightstart
6147 && ((*rightstop
)[-1] == ' ' || (*rightstop
)[-1] == '\t'))
6150 input_line_pointer
= s
;
6155 #define MCC(b1, b2) (((b1) << 8) | (b2))
6157 /* Swap the sense of a condition. This changes the condition so that
6158 it generates the same result when the operands are swapped. */
6161 swap_mri_condition (int cc
)
6165 case MCC ('h', 'i'): return MCC ('c', 's');
6166 case MCC ('l', 's'): return MCC ('c', 'c');
6167 /* <HS> is an alias for <CC>. */
6168 case MCC ('h', 's'):
6169 case MCC ('c', 'c'): return MCC ('l', 's');
6170 /* <LO> is an alias for <CS>. */
6171 case MCC ('l', 'o'):
6172 case MCC ('c', 's'): return MCC ('h', 'i');
6173 case MCC ('p', 'l'): return MCC ('m', 'i');
6174 case MCC ('m', 'i'): return MCC ('p', 'l');
6175 case MCC ('g', 'e'): return MCC ('l', 'e');
6176 case MCC ('l', 't'): return MCC ('g', 't');
6177 case MCC ('g', 't'): return MCC ('l', 't');
6178 case MCC ('l', 'e'): return MCC ('g', 'e');
6179 /* Issue a warning for conditions we can not swap. */
6180 case MCC ('n', 'e'): return MCC ('n', 'e'); // no problem here
6181 case MCC ('e', 'q'): return MCC ('e', 'q'); // also no problem
6182 case MCC ('v', 'c'):
6183 case MCC ('v', 's'):
6185 as_warn (_("Condition <%c%c> in structured control directive can not be encoded correctly"),
6186 (char) (cc
>> 8), (char) (cc
));
6192 /* Reverse the sense of a condition. */
6195 reverse_mri_condition (int cc
)
6199 case MCC ('h', 'i'): return MCC ('l', 's');
6200 case MCC ('l', 's'): return MCC ('h', 'i');
6201 /* <HS> is an alias for <CC> */
6202 case MCC ('h', 's'): return MCC ('l', 'o');
6203 case MCC ('c', 'c'): return MCC ('c', 's');
6204 /* <LO> is an alias for <CS> */
6205 case MCC ('l', 'o'): return MCC ('h', 's');
6206 case MCC ('c', 's'): return MCC ('c', 'c');
6207 case MCC ('n', 'e'): return MCC ('e', 'q');
6208 case MCC ('e', 'q'): return MCC ('n', 'e');
6209 case MCC ('v', 'c'): return MCC ('v', 's');
6210 case MCC ('v', 's'): return MCC ('v', 'c');
6211 case MCC ('p', 'l'): return MCC ('m', 'i');
6212 case MCC ('m', 'i'): return MCC ('p', 'l');
6213 case MCC ('g', 'e'): return MCC ('l', 't');
6214 case MCC ('l', 't'): return MCC ('g', 'e');
6215 case MCC ('g', 't'): return MCC ('l', 'e');
6216 case MCC ('l', 'e'): return MCC ('g', 't');
6221 /* Build an MRI structured control expression. This generates test
6222 and branch instructions. It goes to TRUELAB if the condition is
6223 true, and to FALSELAB if the condition is false. Exactly one of
6224 TRUELAB and FALSELAB will be NULL, meaning to fall through. QUAL
6225 is the size qualifier for the expression. EXTENT is the size to
6226 use for the branch. */
6229 build_mri_control_operand (int qual
, int cc
, char *leftstart
, char *leftstop
,
6230 char *rightstart
, char *rightstop
,
6231 const char *truelab
, const char *falselab
,
6237 if (leftstart
!= NULL
)
6239 struct m68k_op leftop
, rightop
;
6242 /* Swap the compare operands, if necessary, to produce a legal
6243 m68k compare instruction. Comparing a register operand with
6244 a non-register operand requires the register to be on the
6245 right (cmp, cmpa). Comparing an immediate value with
6246 anything requires the immediate value to be on the left
6251 (void) m68k_ip_op (leftstart
, &leftop
);
6256 (void) m68k_ip_op (rightstart
, &rightop
);
6259 if (rightop
.mode
== IMMED
6260 || ((leftop
.mode
== DREG
|| leftop
.mode
== AREG
)
6261 && (rightop
.mode
!= DREG
&& rightop
.mode
!= AREG
)))
6265 /* Correct conditional handling:
6266 if #1 <lt> d0 then ;means if (1 < d0)
6272 cmp #1,d0 if we do *not* swap the operands
6273 bgt true we need the swapped condition!
6280 leftstart
= rightstart
;
6283 leftstop
= rightstop
;
6288 cc
= swap_mri_condition (cc
);
6292 if (truelab
== NULL
)
6294 cc
= reverse_mri_condition (cc
);
6298 if (leftstart
!= NULL
)
6300 buf
= (char *) xmalloc (20
6301 + (leftstop
- leftstart
)
6302 + (rightstop
- rightstart
));
6308 *s
++ = TOLOWER (qual
);
6310 memcpy (s
, leftstart
, leftstop
- leftstart
);
6311 s
+= leftstop
- leftstart
;
6313 memcpy (s
, rightstart
, rightstop
- rightstart
);
6314 s
+= rightstop
- rightstart
;
6320 buf
= (char *) xmalloc (20 + strlen (truelab
));
6326 *s
++ = TOLOWER (extent
);
6328 strcpy (s
, truelab
);
6333 /* Parse an MRI structured control expression. This generates test
6334 and branch instructions. STOP is where the expression ends. It
6335 goes to TRUELAB if the condition is true, and to FALSELAB if the
6336 condition is false. Exactly one of TRUELAB and FALSELAB will be
6337 NULL, meaning to fall through. QUAL is the size qualifier for the
6338 expression. EXTENT is the size to use for the branch. */
6341 parse_mri_control_expression (char *stop
, int qual
, const char *truelab
,
6342 const char *falselab
, int extent
)
6354 if (! parse_mri_control_operand (&cc
, &leftstart
, &leftstop
,
6355 &rightstart
, &rightstop
))
6361 if (strncasecmp (input_line_pointer
, "AND", 3) == 0)
6365 if (falselab
!= NULL
)
6368 flab
= mri_control_label ();
6370 build_mri_control_operand (qual
, cc
, leftstart
, leftstop
, rightstart
,
6371 rightstop
, (const char *) NULL
, flab
, extent
);
6373 input_line_pointer
+= 3;
6374 if (*input_line_pointer
!= '.'
6375 || input_line_pointer
[1] == '\0')
6379 qual
= input_line_pointer
[1];
6380 input_line_pointer
+= 2;
6383 if (! parse_mri_control_operand (&cc
, &leftstart
, &leftstop
,
6384 &rightstart
, &rightstop
))
6390 build_mri_control_operand (qual
, cc
, leftstart
, leftstop
, rightstart
,
6391 rightstop
, truelab
, falselab
, extent
);
6393 if (falselab
== NULL
)
6396 else if (strncasecmp (input_line_pointer
, "OR", 2) == 0)
6400 if (truelab
!= NULL
)
6403 tlab
= mri_control_label ();
6405 build_mri_control_operand (qual
, cc
, leftstart
, leftstop
, rightstart
,
6406 rightstop
, tlab
, (const char *) NULL
, extent
);
6408 input_line_pointer
+= 2;
6409 if (*input_line_pointer
!= '.'
6410 || input_line_pointer
[1] == '\0')
6414 qual
= input_line_pointer
[1];
6415 input_line_pointer
+= 2;
6418 if (! parse_mri_control_operand (&cc
, &leftstart
, &leftstop
,
6419 &rightstart
, &rightstop
))
6425 build_mri_control_operand (qual
, cc
, leftstart
, leftstop
, rightstart
,
6426 rightstop
, truelab
, falselab
, extent
);
6428 if (truelab
== NULL
)
6433 build_mri_control_operand (qual
, cc
, leftstart
, leftstop
, rightstart
,
6434 rightstop
, truelab
, falselab
, extent
);
6438 if (input_line_pointer
!= stop
)
6439 as_bad (_("syntax error in structured control directive"));
6442 /* Handle the MRI IF pseudo-op. This may be a structured control
6443 directive, or it may be a regular assembler conditional, depending
6451 struct mri_control_info
*n
;
6453 /* A structured control directive must end with THEN with an
6454 optional qualifier. */
6455 s
= input_line_pointer
;
6456 /* We only accept '*' as introduction of comments if preceded by white space
6457 or at first column of a line (I think this can't actually happen here?)
6458 This is important when assembling:
6459 if d0 <ne> 12(a0,d0*2) then
6460 if d0 <ne> #CONST*20 then. */
6461 while (! (is_end_of_line
[(unsigned char) *s
]
6464 && (s
== input_line_pointer
6466 || *(s
-1) == '\t'))))
6469 while (s
> input_line_pointer
&& (*s
== ' ' || *s
== '\t'))
6472 if (s
- input_line_pointer
> 1
6476 if (s
- input_line_pointer
< 3
6477 || strncasecmp (s
- 3, "THEN", 4) != 0)
6481 as_bad (_("missing then"));
6482 ignore_rest_of_line ();
6486 /* It's a conditional. */
6491 /* Since this might be a conditional if, this pseudo-op will be
6492 called even if we are supported to be ignoring input. Double
6493 check now. Clobber *input_line_pointer so that ignore_input
6494 thinks that this is not a special pseudo-op. */
6495 c
= *input_line_pointer
;
6496 *input_line_pointer
= 0;
6497 if (ignore_input ())
6499 *input_line_pointer
= c
;
6500 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6501 ++input_line_pointer
;
6502 demand_empty_rest_of_line ();
6505 *input_line_pointer
= c
;
6507 n
= push_mri_control (mri_if
);
6509 parse_mri_control_expression (s
- 3, qual
, (const char *) NULL
,
6510 n
->next
, s
[1] == '.' ? s
[2] : '\0');
6513 input_line_pointer
= s
+ 3;
6515 input_line_pointer
= s
+ 1;
6519 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6520 ++input_line_pointer
;
6523 demand_empty_rest_of_line ();
6526 /* Handle the MRI else pseudo-op. If we are currently doing an MRI
6527 structured IF, associate the ELSE with the IF. Otherwise, assume
6528 it is a conditional else. */
6531 s_mri_else (int qual
)
6538 && (mri_control_stack
== NULL
6539 || mri_control_stack
->type
!= mri_if
6540 || mri_control_stack
->else_seen
))
6546 c
= *input_line_pointer
;
6547 *input_line_pointer
= 0;
6548 if (ignore_input ())
6550 *input_line_pointer
= c
;
6551 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6552 ++input_line_pointer
;
6553 demand_empty_rest_of_line ();
6556 *input_line_pointer
= c
;
6558 if (mri_control_stack
== NULL
6559 || mri_control_stack
->type
!= mri_if
6560 || mri_control_stack
->else_seen
)
6562 as_bad (_("else without matching if"));
6563 ignore_rest_of_line ();
6567 mri_control_stack
->else_seen
= 1;
6569 buf
= (char *) xmalloc (20 + strlen (mri_control_stack
->bottom
));
6570 q
[0] = TOLOWER (qual
);
6572 sprintf (buf
, "bra%s %s", q
, mri_control_stack
->bottom
);
6576 colon (mri_control_stack
->next
);
6580 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6581 ++input_line_pointer
;
6584 demand_empty_rest_of_line ();
6587 /* Handle the MRI ENDI pseudo-op. */
6590 s_mri_endi (int ignore ATTRIBUTE_UNUSED
)
6592 if (mri_control_stack
== NULL
6593 || mri_control_stack
->type
!= mri_if
)
6595 as_bad (_("endi without matching if"));
6596 ignore_rest_of_line ();
6600 /* ignore_input will not return true for ENDI, so we don't need to
6601 worry about checking it again here. */
6603 if (! mri_control_stack
->else_seen
)
6604 colon (mri_control_stack
->next
);
6605 colon (mri_control_stack
->bottom
);
6611 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6612 ++input_line_pointer
;
6615 demand_empty_rest_of_line ();
6618 /* Handle the MRI BREAK pseudo-op. */
6621 s_mri_break (int extent
)
6623 struct mri_control_info
*n
;
6627 n
= mri_control_stack
;
6629 && n
->type
!= mri_for
6630 && n
->type
!= mri_repeat
6631 && n
->type
!= mri_while
)
6635 as_bad (_("break outside of structured loop"));
6636 ignore_rest_of_line ();
6640 buf
= (char *) xmalloc (20 + strlen (n
->bottom
));
6641 ex
[0] = TOLOWER (extent
);
6643 sprintf (buf
, "bra%s %s", ex
, n
->bottom
);
6649 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6650 ++input_line_pointer
;
6653 demand_empty_rest_of_line ();
6656 /* Handle the MRI NEXT pseudo-op. */
6659 s_mri_next (int extent
)
6661 struct mri_control_info
*n
;
6665 n
= mri_control_stack
;
6667 && n
->type
!= mri_for
6668 && n
->type
!= mri_repeat
6669 && n
->type
!= mri_while
)
6673 as_bad (_("next outside of structured loop"));
6674 ignore_rest_of_line ();
6678 buf
= (char *) xmalloc (20 + strlen (n
->next
));
6679 ex
[0] = TOLOWER (extent
);
6681 sprintf (buf
, "bra%s %s", ex
, n
->next
);
6687 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6688 ++input_line_pointer
;
6691 demand_empty_rest_of_line ();
6694 /* Handle the MRI FOR pseudo-op. */
6697 s_mri_for (int qual
)
6699 const char *varstart
, *varstop
;
6700 const char *initstart
, *initstop
;
6701 const char *endstart
, *endstop
;
6702 const char *bystart
, *bystop
;
6706 struct mri_control_info
*n
;
6712 FOR.q var = init { TO | DOWNTO } end [ BY by ] DO.e
6716 varstart
= input_line_pointer
;
6718 /* Look for the '='. */
6719 while (! is_end_of_line
[(unsigned char) *input_line_pointer
]
6720 && *input_line_pointer
!= '=')
6721 ++input_line_pointer
;
6722 if (*input_line_pointer
!= '=')
6724 as_bad (_("missing ="));
6725 ignore_rest_of_line ();
6729 varstop
= input_line_pointer
;
6730 if (varstop
> varstart
6731 && (varstop
[-1] == ' ' || varstop
[-1] == '\t'))
6734 ++input_line_pointer
;
6736 initstart
= input_line_pointer
;
6738 /* Look for TO or DOWNTO. */
6741 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6743 if (strncasecmp (input_line_pointer
, "TO", 2) == 0
6744 && ! is_part_of_name (input_line_pointer
[2]))
6746 initstop
= input_line_pointer
;
6747 input_line_pointer
+= 2;
6750 if (strncasecmp (input_line_pointer
, "DOWNTO", 6) == 0
6751 && ! is_part_of_name (input_line_pointer
[6]))
6753 initstop
= input_line_pointer
;
6755 input_line_pointer
+= 6;
6758 ++input_line_pointer
;
6760 if (initstop
== NULL
)
6762 as_bad (_("missing to or downto"));
6763 ignore_rest_of_line ();
6766 if (initstop
> initstart
6767 && (initstop
[-1] == ' ' || initstop
[-1] == '\t'))
6771 endstart
= input_line_pointer
;
6773 /* Look for BY or DO. */
6776 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6778 if (strncasecmp (input_line_pointer
, "BY", 2) == 0
6779 && ! is_part_of_name (input_line_pointer
[2]))
6781 endstop
= input_line_pointer
;
6783 input_line_pointer
+= 2;
6786 if (strncasecmp (input_line_pointer
, "DO", 2) == 0
6787 && (input_line_pointer
[2] == '.'
6788 || ! is_part_of_name (input_line_pointer
[2])))
6790 endstop
= input_line_pointer
;
6791 input_line_pointer
+= 2;
6794 ++input_line_pointer
;
6796 if (endstop
== NULL
)
6798 as_bad (_("missing do"));
6799 ignore_rest_of_line ();
6802 if (endstop
> endstart
6803 && (endstop
[-1] == ' ' || endstop
[-1] == '\t'))
6809 bystop
= bystart
+ 2;
6814 bystart
= input_line_pointer
;
6818 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6820 if (strncasecmp (input_line_pointer
, "DO", 2) == 0
6821 && (input_line_pointer
[2] == '.'
6822 || ! is_part_of_name (input_line_pointer
[2])))
6824 bystop
= input_line_pointer
;
6825 input_line_pointer
+= 2;
6828 ++input_line_pointer
;
6832 as_bad (_("missing do"));
6833 ignore_rest_of_line ();
6836 if (bystop
> bystart
6837 && (bystop
[-1] == ' ' || bystop
[-1] == '\t'))
6841 if (*input_line_pointer
!= '.')
6845 extent
= input_line_pointer
[1];
6846 input_line_pointer
+= 2;
6849 /* We have fully parsed the FOR operands. Now build the loop. */
6850 n
= push_mri_control (mri_for
);
6852 buf
= (char *) xmalloc (50 + (input_line_pointer
- varstart
));
6854 /* Move init,var. */
6861 *s
++ = TOLOWER (qual
);
6863 memcpy (s
, initstart
, initstop
- initstart
);
6864 s
+= initstop
- initstart
;
6866 memcpy (s
, varstart
, varstop
- varstart
);
6867 s
+= varstop
- varstart
;
6879 *s
++ = TOLOWER (qual
);
6881 memcpy (s
, endstart
, endstop
- endstart
);
6882 s
+= endstop
- endstart
;
6884 memcpy (s
, varstart
, varstop
- varstart
);
6885 s
+= varstop
- varstart
;
6890 ex
[0] = TOLOWER (extent
);
6893 sprintf (buf
, "blt%s %s", ex
, n
->bottom
);
6895 sprintf (buf
, "bgt%s %s", ex
, n
->bottom
);
6898 /* Put together the add or sub instruction used by ENDF. */
6906 *s
++ = TOLOWER (qual
);
6908 memcpy (s
, bystart
, bystop
- bystart
);
6909 s
+= bystop
- bystart
;
6911 memcpy (s
, varstart
, varstop
- varstart
);
6912 s
+= varstop
- varstart
;
6918 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6919 ++input_line_pointer
;
6922 demand_empty_rest_of_line ();
6925 /* Handle the MRI ENDF pseudo-op. */
6928 s_mri_endf (int ignore ATTRIBUTE_UNUSED
)
6930 if (mri_control_stack
== NULL
6931 || mri_control_stack
->type
!= mri_for
)
6933 as_bad (_("endf without for"));
6934 ignore_rest_of_line ();
6938 colon (mri_control_stack
->next
);
6940 mri_assemble (mri_control_stack
->incr
);
6942 sprintf (mri_control_stack
->incr
, "bra %s", mri_control_stack
->top
);
6943 mri_assemble (mri_control_stack
->incr
);
6945 free (mri_control_stack
->incr
);
6947 colon (mri_control_stack
->bottom
);
6953 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6954 ++input_line_pointer
;
6957 demand_empty_rest_of_line ();
6960 /* Handle the MRI REPEAT pseudo-op. */
6963 s_mri_repeat (int ignore ATTRIBUTE_UNUSED
)
6965 struct mri_control_info
*n
;
6967 n
= push_mri_control (mri_repeat
);
6971 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
6972 ++input_line_pointer
;
6974 demand_empty_rest_of_line ();
6977 /* Handle the MRI UNTIL pseudo-op. */
6980 s_mri_until (int qual
)
6984 if (mri_control_stack
== NULL
6985 || mri_control_stack
->type
!= mri_repeat
)
6987 as_bad (_("until without repeat"));
6988 ignore_rest_of_line ();
6992 colon (mri_control_stack
->next
);
6994 for (s
= input_line_pointer
; ! is_end_of_line
[(unsigned char) *s
]; s
++)
6997 parse_mri_control_expression (s
, qual
, (const char *) NULL
,
6998 mri_control_stack
->top
, '\0');
7000 colon (mri_control_stack
->bottom
);
7002 input_line_pointer
= s
;
7008 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
7009 ++input_line_pointer
;
7012 demand_empty_rest_of_line ();
7015 /* Handle the MRI WHILE pseudo-op. */
7018 s_mri_while (int qual
)
7022 struct mri_control_info
*n
;
7024 s
= input_line_pointer
;
7025 /* We only accept '*' as introduction of comments if preceded by white space
7026 or at first column of a line (I think this can't actually happen here?)
7027 This is important when assembling:
7028 while d0 <ne> 12(a0,d0*2) do
7029 while d0 <ne> #CONST*20 do. */
7030 while (! (is_end_of_line
[(unsigned char) *s
]
7033 && (s
== input_line_pointer
7035 || *(s
-1) == '\t'))))
7038 while (*s
== ' ' || *s
== '\t')
7040 if (s
- input_line_pointer
> 1
7043 if (s
- input_line_pointer
< 2
7044 || strncasecmp (s
- 1, "DO", 2) != 0)
7046 as_bad (_("missing do"));
7047 ignore_rest_of_line ();
7051 n
= push_mri_control (mri_while
);
7055 parse_mri_control_expression (s
- 1, qual
, (const char *) NULL
, n
->bottom
,
7056 s
[1] == '.' ? s
[2] : '\0');
7058 input_line_pointer
= s
+ 1;
7059 if (*input_line_pointer
== '.')
7060 input_line_pointer
+= 2;
7064 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
7065 ++input_line_pointer
;
7068 demand_empty_rest_of_line ();
7071 /* Handle the MRI ENDW pseudo-op. */
7074 s_mri_endw (int ignore ATTRIBUTE_UNUSED
)
7078 if (mri_control_stack
== NULL
7079 || mri_control_stack
->type
!= mri_while
)
7081 as_bad (_("endw without while"));
7082 ignore_rest_of_line ();
7086 buf
= (char *) xmalloc (20 + strlen (mri_control_stack
->next
));
7087 sprintf (buf
, "bra %s", mri_control_stack
->next
);
7091 colon (mri_control_stack
->bottom
);
7097 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
7098 ++input_line_pointer
;
7101 demand_empty_rest_of_line ();
7104 /* Parse a .cpu directive. */
7107 s_m68k_cpu (int ignored ATTRIBUTE_UNUSED
)
7114 as_bad (_("already assembled instructions"));
7115 ignore_rest_of_line ();
7119 name
= input_line_pointer
;
7120 while (*input_line_pointer
&& !ISSPACE(*input_line_pointer
))
7121 input_line_pointer
++;
7122 saved_char
= *input_line_pointer
;
7123 *input_line_pointer
= 0;
7125 m68k_set_cpu (name
, 1, 0);
7127 *input_line_pointer
= saved_char
;
7128 demand_empty_rest_of_line ();
7132 /* Parse a .arch directive. */
7135 s_m68k_arch (int ignored ATTRIBUTE_UNUSED
)
7142 as_bad (_("already assembled instructions"));
7143 ignore_rest_of_line ();
7147 name
= input_line_pointer
;
7148 while (*input_line_pointer
&& *input_line_pointer
!= ','
7149 && !ISSPACE (*input_line_pointer
))
7150 input_line_pointer
++;
7151 saved_char
= *input_line_pointer
;
7152 *input_line_pointer
= 0;
7154 if (m68k_set_arch (name
, 1, 0))
7156 /* Scan extensions. */
7159 *input_line_pointer
++ = saved_char
;
7160 if (!*input_line_pointer
|| ISSPACE (*input_line_pointer
))
7162 name
= input_line_pointer
;
7163 while (*input_line_pointer
&& *input_line_pointer
!= ','
7164 && !ISSPACE (*input_line_pointer
))
7165 input_line_pointer
++;
7166 saved_char
= *input_line_pointer
;
7167 *input_line_pointer
= 0;
7169 while (m68k_set_extension (name
, 1, 0));
7172 *input_line_pointer
= saved_char
;
7173 demand_empty_rest_of_line ();
7177 /* Lookup a cpu name in TABLE and return the slot found. Return NULL
7178 if none is found, the caller is responsible for emitting an error
7179 message. If ALLOW_M is non-zero, we allow an initial 'm' on the
7180 cpu name, if it begins with a '6' (possibly skipping an intervening
7181 'c'. We also allow a 'c' in the same place. if NEGATED is
7182 non-zero, we accept a leading 'no-' and *NEGATED is set to true, if
7183 the option is indeed negated. */
7185 static const struct m68k_cpu
*
7186 m68k_lookup_cpu (const char *arg
, const struct m68k_cpu
*table
,
7187 int allow_m
, int *negated
)
7189 /* allow negated value? */
7194 if (arg
[0] == 'n' && arg
[1] == 'o' && arg
[2] == '-')
7201 /* Remove 'm' or 'mc' prefix from 68k variants. */
7208 else if (arg
[1] == 'c' && arg
[2] == '6')
7212 else if (arg
[0] == 'c' && arg
[1] == '6')
7215 for (; table
->name
; table
++)
7216 if (!strcmp (arg
, table
->name
))
7218 if (table
->alias
< -1 || table
->alias
> 1)
7219 as_bad (_("`%s' is deprecated, use `%s'"),
7220 table
->name
, table
[table
->alias
< 0 ? 1 : -1].name
);
7226 /* Set the cpu, issuing errors if it is unrecognized, or invalid */
7229 m68k_set_cpu (char const *name
, int allow_m
, int silent
)
7231 const struct m68k_cpu
*cpu
;
7233 cpu
= m68k_lookup_cpu (name
, m68k_cpus
, allow_m
, NULL
);
7238 as_bad (_("cpu `%s' unrecognized"), name
);
7242 if (selected_cpu
&& selected_cpu
!= cpu
)
7244 as_bad (_("already selected `%s' processor"),
7245 selected_cpu
->name
);
7252 /* Set the architecture, issuing errors if it is unrecognized, or invalid */
7255 m68k_set_arch (char const *name
, int allow_m
, int silent
)
7257 const struct m68k_cpu
*arch
;
7259 arch
= m68k_lookup_cpu (name
, m68k_archs
, allow_m
, NULL
);
7264 as_bad (_("architecture `%s' unrecognized"), name
);
7268 if (selected_arch
&& selected_arch
!= arch
)
7270 as_bad (_("already selected `%s' architecture"),
7271 selected_arch
->name
);
7275 selected_arch
= arch
;
7279 /* Set the architecture extension, issuing errors if it is
7280 unrecognized, or invalid */
7283 m68k_set_extension (char const *name
, int allow_m
, int silent
)
7286 const struct m68k_cpu
*ext
;
7288 ext
= m68k_lookup_cpu (name
, m68k_extensions
, allow_m
, &negated
);
7293 as_bad (_("extension `%s' unrecognized"), name
);
7298 not_current_architecture
|= ext
->arch
;
7300 current_architecture
|= ext
->arch
;
7305 Invocation line includes a switch not recognized by the base assembler.
7309 const char *md_shortopts
= "lSA:m:kQ:V";
7311 const char *md_shortopts
= "lSA:m:k";
7314 struct option md_longopts
[] = {
7315 #define OPTION_PIC (OPTION_MD_BASE)
7316 {"pic", no_argument
, NULL
, OPTION_PIC
},
7317 #define OPTION_REGISTER_PREFIX_OPTIONAL (OPTION_MD_BASE + 1)
7318 {"register-prefix-optional", no_argument
, NULL
,
7319 OPTION_REGISTER_PREFIX_OPTIONAL
},
7320 #define OPTION_BITWISE_OR (OPTION_MD_BASE + 2)
7321 {"bitwise-or", no_argument
, NULL
, OPTION_BITWISE_OR
},
7322 #define OPTION_BASE_SIZE_DEFAULT_16 (OPTION_MD_BASE + 3)
7323 {"base-size-default-16", no_argument
, NULL
, OPTION_BASE_SIZE_DEFAULT_16
},
7324 #define OPTION_BASE_SIZE_DEFAULT_32 (OPTION_MD_BASE + 4)
7325 {"base-size-default-32", no_argument
, NULL
, OPTION_BASE_SIZE_DEFAULT_32
},
7326 #define OPTION_DISP_SIZE_DEFAULT_16 (OPTION_MD_BASE + 5)
7327 {"disp-size-default-16", no_argument
, NULL
, OPTION_DISP_SIZE_DEFAULT_16
},
7328 #define OPTION_DISP_SIZE_DEFAULT_32 (OPTION_MD_BASE + 6)
7329 {"disp-size-default-32", no_argument
, NULL
, OPTION_DISP_SIZE_DEFAULT_32
},
7330 #define OPTION_PCREL (OPTION_MD_BASE + 7)
7331 {"pcrel", no_argument
, NULL
, OPTION_PCREL
},
7332 {NULL
, no_argument
, NULL
, 0}
7334 size_t md_longopts_size
= sizeof (md_longopts
);
7337 md_parse_option (int c
, char *arg
)
7341 case 'l': /* -l means keep external to 2 bit offset
7342 rather than 16 bit one. */
7343 flag_short_refs
= 1;
7346 case 'S': /* -S means that jbsr's always turn into
7348 flag_long_jumps
= 1;
7351 case OPTION_PCREL
: /* --pcrel means never turn PC-relative
7352 branches into absolute jumps. */
7353 flag_keep_pcrel
= 1;
7359 break; /* -pic, Position Independent Code. */
7361 case OPTION_REGISTER_PREFIX_OPTIONAL
:
7362 flag_reg_prefix_optional
= 1;
7363 reg_prefix_optional_seen
= 1;
7366 /* -V: SVR4 argument to print version ID. */
7368 print_version_id ();
7371 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
7372 should be emitted or not. FIXME: Not implemented. */
7376 case OPTION_BITWISE_OR
:
7381 n
= (char *) xmalloc (strlen (m68k_comment_chars
) + 1);
7383 for (s
= m68k_comment_chars
; *s
!= '\0'; s
++)
7387 m68k_comment_chars
= n
;
7391 case OPTION_BASE_SIZE_DEFAULT_16
:
7392 m68k_index_width_default
= SIZE_WORD
;
7395 case OPTION_BASE_SIZE_DEFAULT_32
:
7396 m68k_index_width_default
= SIZE_LONG
;
7399 case OPTION_DISP_SIZE_DEFAULT_16
:
7401 m68k_rel32_from_cmdline
= 1;
7404 case OPTION_DISP_SIZE_DEFAULT_32
:
7406 m68k_rel32_from_cmdline
= 1;
7411 as_tsktsk (_ ("option `-A%s' is deprecated: use `-%s'",
7414 /* Intentional fall-through. */
7416 if (!strncmp (arg
, "arch=", 5))
7417 m68k_set_arch (arg
+ 5, 1, 0);
7418 else if (!strncmp (arg
, "cpu=", 4))
7419 m68k_set_cpu (arg
+ 4, 1, 0);
7420 else if (m68k_set_extension (arg
, 0, 1))
7422 else if (m68k_set_arch (arg
, 0, 1))
7424 else if (m68k_set_cpu (arg
, 0, 1))
7437 /* Setup tables from the selected arch and/or cpu */
7440 m68k_init_arch (void)
7442 if (not_current_architecture
& current_architecture
)
7444 as_bad (_("architecture features both enabled and disabled"));
7445 not_current_architecture
&= ~current_architecture
;
7449 current_architecture
|= selected_arch
->arch
;
7450 control_regs
= selected_arch
->control_regs
;
7453 current_architecture
|= selected_cpu
->arch
;
7455 current_architecture
&= ~not_current_architecture
;
7457 if ((current_architecture
& (cfloat
| m68881
)) == (cfloat
| m68881
))
7459 /* Determine which float is really meant. */
7460 if (current_architecture
& (m68k_mask
& ~m68881
))
7461 current_architecture
^= cfloat
;
7463 current_architecture
^= m68881
;
7468 control_regs
= selected_cpu
->control_regs
;
7469 if (current_architecture
& ~selected_cpu
->arch
)
7471 as_bad (_("selected processor does not have all features of selected architecture"));
7472 current_architecture
7473 = selected_cpu
->arch
& ~not_current_architecture
;
7477 if ((current_architecture
& m68k_mask
)
7478 && (current_architecture
& ~m68k_mask
))
7480 as_bad (_ ("m68k and cf features both selected"));
7481 if (current_architecture
& m68k_mask
)
7482 current_architecture
&= m68k_mask
;
7484 current_architecture
&= ~m68k_mask
;
7487 /* Permit m68881 specification with all cpus; those that can't work
7488 with a coprocessor could be doing emulation. */
7489 if (current_architecture
& m68851
)
7491 if (current_architecture
& m68040
)
7492 as_warn (_("68040 and 68851 specified; mmu instructions may assemble incorrectly"));
7494 /* What other incompatibilities could we check for? */
7496 if (cpu_of_arch (current_architecture
) < m68020
7497 || arch_coldfire_p (current_architecture
))
7498 md_relax_table
[TAB (PCINDEX
, BYTE
)].rlx_more
= 0;
7504 md_show_usage (FILE *stream
)
7506 const char *default_cpu
= TARGET_CPU
;
7508 unsigned int default_arch
;
7510 /* Get the canonical name for the default target CPU. */
7511 if (*default_cpu
== 'm')
7513 for (i
= 0; m68k_cpus
[i
].name
; i
++)
7515 if (strcasecmp (default_cpu
, m68k_cpus
[i
].name
) == 0)
7517 default_arch
= m68k_cpus
[i
].arch
;
7518 while (m68k_cpus
[i
].alias
> 0)
7520 while (m68k_cpus
[i
].alias
< 0)
7522 default_cpu
= m68k_cpus
[i
].name
;
7526 fprintf (stream
, _("\
7527 -march=<arch> set architecture\n\
7528 -mcpu=<cpu> set cpu [default %s]\n\
7530 for (i
= 0; m68k_extensions
[i
].name
; i
++)
7531 fprintf (stream
, _("\
7532 -m[no-]%-16s enable/disable%s architecture extension\n\
7533 "), m68k_extensions
[i
].name
,
7534 m68k_extensions
[i
].alias
> 0 ? " ColdFire"
7535 : m68k_extensions
[i
].alias
< 0 ? " m68k" : "");
7537 fprintf (stream
, _("\
7538 -l use 1 word for refs to undefined symbols [default 2]\n\
7539 -pic, -k generate position independent code\n\
7540 -S turn jbsr into jsr\n\
7541 --pcrel never turn PC-relative branches into absolute jumps\n\
7542 --register-prefix-optional\n\
7543 recognize register names without prefix character\n\
7544 --bitwise-or do not treat `|' as a comment character\n\
7545 --base-size-default-16 base reg without size is 16 bits\n\
7546 --base-size-default-32 base reg without size is 32 bits (default)\n\
7547 --disp-size-default-16 displacement with unknown size is 16 bits\n\
7548 --disp-size-default-32 displacement with unknown size is 32 bits (default)\n\
7551 fprintf (stream
, _("Architecture variants are: "));
7552 for (i
= 0; m68k_archs
[i
].name
; i
++)
7555 fprintf (stream
, " | ");
7556 fprintf (stream
, m68k_archs
[i
].name
);
7558 fprintf (stream
, "\n");
7560 fprintf (stream
, _("Processor variants are: "));
7561 for (i
= 0; m68k_cpus
[i
].name
; i
++)
7564 fprintf (stream
, " | ");
7565 fprintf (stream
, m68k_cpus
[i
].name
);
7567 fprintf (stream
, _("\n"));
7572 /* TEST2: Test md_assemble() */
7573 /* Warning, this routine probably doesn't work anymore. */
7577 struct m68k_it the_ins
;
7585 if (!gets (buf
) || !*buf
)
7587 if (buf
[0] == '|' || buf
[1] == '.')
7589 for (cp
= buf
; *cp
; cp
++)
7594 memset (&the_ins
, '\0', sizeof (the_ins
));
7595 m68k_ip (&the_ins
, buf
);
7598 printf (_("Error %s in %s\n"), the_ins
.error
, buf
);
7602 printf (_("Opcode(%d.%s): "), the_ins
.numo
, the_ins
.args
);
7603 for (n
= 0; n
< the_ins
.numo
; n
++)
7604 printf (" 0x%x", the_ins
.opcode
[n
] & 0xffff);
7606 print_the_insn (&the_ins
.opcode
[0], stdout
);
7607 (void) putchar ('\n');
7609 for (n
= 0; n
< strlen (the_ins
.args
) / 2; n
++)
7611 if (the_ins
.operands
[n
].error
)
7613 printf ("op%d Error %s in %s\n", n
, the_ins
.operands
[n
].error
, buf
);
7616 printf ("mode %d, reg %d, ", the_ins
.operands
[n
].mode
,
7617 the_ins
.operands
[n
].reg
);
7618 if (the_ins
.operands
[n
].b_const
)
7619 printf ("Constant: '%.*s', ",
7620 1 + the_ins
.operands
[n
].e_const
- the_ins
.operands
[n
].b_const
,
7621 the_ins
.operands
[n
].b_const
);
7622 printf ("ireg %d, isiz %d, imul %d, ", the_ins
.operands
[n
].ireg
,
7623 the_ins
.operands
[n
].isiz
, the_ins
.operands
[n
].imul
);
7624 if (the_ins
.operands
[n
].b_iadd
)
7625 printf ("Iadd: '%.*s',",
7626 1 + the_ins
.operands
[n
].e_iadd
- the_ins
.operands
[n
].b_iadd
,
7627 the_ins
.operands
[n
].b_iadd
);
7636 is_label (char *str
)
7640 while (*str
&& *str
!= ' ')
7642 if (str
[-1] == ':' || str
[1] == '=')
7649 /* Possible states for relaxation:
7651 0 0 branch offset byte (bra, etc)
7655 1 0 indexed offsets byte a0@(32,d4:w:1) etc
7659 2 0 two-offset index word-word a0@(32,d4)@(45) etc
7666 /* We have no need to default values of symbols. */
7669 md_undefined_symbol (char *name ATTRIBUTE_UNUSED
)
7674 /* Round up a section size to the appropriate boundary. */
7676 md_section_align (segT segment ATTRIBUTE_UNUSED
, valueT size
)
7679 /* For a.out, force the section size to be aligned. If we don't do
7680 this, BFD will align it for us, but it will not write out the
7681 final bytes of the section. This may be a bug in BFD, but it is
7682 easier to fix it here since that is how the other a.out targets
7686 align
= bfd_get_section_alignment (stdoutput
, segment
);
7687 size
= ((size
+ (1 << align
) - 1) & ((valueT
) -1 << align
));
7693 /* Exactly what point is a PC-relative offset relative TO?
7694 On the 68k, it is relative to the address of the first extension
7695 word. The difference between the addresses of the offset and the
7696 first extension word is stored in fx_pcrel_adjust. */
7698 md_pcrel_from (fixS
*fixP
)
7702 /* Because fx_pcrel_adjust is a char, and may be unsigned, we explicitly
7703 sign extend the value here. */
7704 adjust
= ((fixP
->fx_pcrel_adjust
& 0xff) ^ 0x80) - 0x80;
7707 return fixP
->fx_where
+ fixP
->fx_frag
->fr_address
- adjust
;
7712 m68k_elf_final_processing (void)
7716 if (arch_coldfire_fpu (current_architecture
))
7717 flags
|= EF_M68K_CFV4E
;
7718 /* Set file-specific flags if this is a cpu32 processor. */
7719 if (cpu_of_arch (current_architecture
) & cpu32
)
7720 flags
|= EF_M68K_CPU32
;
7721 else if (cpu_of_arch (current_architecture
) & fido_a
)
7722 flags
|= EF_M68K_FIDO
;
7723 else if ((cpu_of_arch (current_architecture
) & m68000up
)
7724 && !(cpu_of_arch (current_architecture
) & m68020up
))
7725 flags
|= EF_M68K_M68000
;
7727 if (current_architecture
& mcfisa_a
)
7729 static const unsigned isa_features
[][2] =
7731 {EF_M68K_CF_ISA_A_NODIV
,mcfisa_a
},
7732 {EF_M68K_CF_ISA_A
, mcfisa_a
|mcfhwdiv
},
7733 {EF_M68K_CF_ISA_A_PLUS
, mcfisa_a
|mcfisa_aa
|mcfhwdiv
|mcfusp
},
7734 {EF_M68K_CF_ISA_B_NOUSP
,mcfisa_a
|mcfisa_b
|mcfhwdiv
},
7735 {EF_M68K_CF_ISA_B
, mcfisa_a
|mcfisa_b
|mcfhwdiv
|mcfusp
},
7736 {EF_M68K_CF_ISA_C
, mcfisa_a
|mcfisa_c
|mcfhwdiv
|mcfusp
},
7739 static const unsigned mac_features
[][2] =
7741 {EF_M68K_CF_MAC
, mcfmac
},
7742 {EF_M68K_CF_EMAC
, mcfemac
},
7748 pattern
= (current_architecture
7749 & (mcfisa_a
|mcfisa_aa
|mcfisa_b
|mcfisa_c
|mcfhwdiv
|mcfusp
));
7750 for (ix
= 0; isa_features
[ix
][1]; ix
++)
7752 if (pattern
== isa_features
[ix
][1])
7754 flags
|= isa_features
[ix
][0];
7758 if (!isa_features
[ix
][1])
7761 as_warn (_("Not a defined coldfire architecture"));
7765 if (current_architecture
& cfloat
)
7766 flags
|= EF_M68K_CF_FLOAT
| EF_M68K_CFV4E
;
7768 pattern
= current_architecture
& (mcfmac
|mcfemac
);
7771 for (ix
= 0; mac_features
[ix
][1]; ix
++)
7773 if (pattern
== mac_features
[ix
][1])
7775 flags
|= mac_features
[ix
][0];
7779 if (!mac_features
[ix
][1])
7784 elf_elfheader (stdoutput
)->e_flags
|= flags
;
7789 tc_m68k_regname_to_dw2regnum (char *regname
)
7791 unsigned int regnum
;
7792 static const char *const regnames
[] =
7794 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
7795 "a0", "a1", "a2", "a3", "a4", "a5", "a6", "sp",
7796 "fp0", "fp1", "fp2", "fp3", "fp4", "fp5", "fp6", "fp7",
7800 for (regnum
= 0; regnum
< ARRAY_SIZE (regnames
); regnum
++)
7801 if (strcmp (regname
, regnames
[regnum
]) == 0)
7808 tc_m68k_frame_initial_instructions (void)
7810 static int sp_regno
= -1;
7813 sp_regno
= tc_m68k_regname_to_dw2regnum ("sp");
7815 cfi_add_CFA_def_cfa (sp_regno
, -DWARF2_CIE_DATA_ALIGNMENT
);
7816 cfi_add_CFA_offset (DWARF2_DEFAULT_RETURN_COLUMN
, DWARF2_CIE_DATA_ALIGNMENT
);