* elfcpp.h (NT_VERSION, NT_ARCH): Define as enum constants.
[binutils.git] / gas / config / tc-m68k.c
blob9d422c7d8ff841461bbbde7348652709c114a9d4
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)
10 any later version.
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
20 02110-1301, USA. */
22 #include "as.h"
23 #include "safe-ctype.h"
24 #include "obstack.h"
25 #include "subsegs.h"
26 #include "dwarf2dbg.h"
27 #include "dw2gencfi.h"
29 #include "opcode/m68k.h"
30 #include "m68k-parse.h"
32 #if defined (OBJ_ELF)
33 #include "elf/m68k.h"
34 #endif
36 #ifdef M68KCOFF
37 #include "obj-coff.h"
38 #endif
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 = "|#";
46 #else
47 const char *m68k_comment_chars = "|";
48 #endif
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. */
77 int flag_want_pic;
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;
85 #else
86 int flag_reg_prefix_optional;
87 #endif
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
105 be 32 bits. */
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
112 displacement. */
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
117 label. */
118 struct label_line
120 struct label_line *next;
121 symbolS *label;
122 char *file;
123 unsigned int line;
124 int text;
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.
139 See flames below. */
140 static struct obstack robyn;
142 struct m68k_incant
144 const char *m_operands;
145 unsigned long m_opcode;
146 short m_opnum;
147 short m_codenum;
148 int m_arch;
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[] = {
157 SFC, DFC, USP, VBR,
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 mcf51qe_ctrl[] = {
180 VBR,
183 static const enum m68k_register mcf5206_ctrl[] = {
184 CACR, ACR0, ACR1, VBR, RAMBAR0, RAMBAR_ALT, MBAR,
187 static const enum m68k_register mcf5208_ctrl[] = {
188 CACR, ACR0, ACR1, VBR, RAMBAR, RAMBAR1,
191 static const enum m68k_register mcf5210a_ctrl[] = {
192 VBR, CACR, ACR0, ACR1, ROMBAR, RAMBAR, RAMBAR1, MBAR,
195 static const enum m68k_register mcf5213_ctrl[] = {
196 VBR, RAMBAR, RAMBAR1, FLASHBAR,
199 static const enum m68k_register mcf5216_ctrl[] = {
200 VBR, CACR, ACR0, ACR1, FLASHBAR, RAMBAR, RAMBAR1,
203 static const enum m68k_register mcf52223_ctrl[] = {
204 VBR, CACR, ACR0, ACR1, FLASHBAR, RAMBAR, RAMBAR1,
207 static const enum m68k_register mcf52235_ctrl[] = {
208 VBR, CACR, ACR0, ACR1, FLASHBAR, RAMBAR, RAMBAR1,
211 static const enum m68k_register mcf5225_ctrl[] = {
212 VBR, CACR, ACR0, ACR1, FLASHBAR, RAMBAR, MBAR, RAMBAR1,
215 static const enum m68k_register mcf5235_ctrl[] = {
216 VBR, CACR, ACR0, ACR1, RAMBAR, RAMBAR1,
219 static const enum m68k_register mcf5249_ctrl[] = {
220 VBR, CACR, ACR0, ACR1, RAMBAR0, RAMBAR1, RAMBAR, MBAR, MBAR2,
223 static const enum m68k_register mcf5250_ctrl[] = {
224 VBR,
227 static const enum m68k_register mcf5253_ctrl[] = {
228 VBR, CACR, ACR0, ACR1, RAMBAR0, RAMBAR1, RAMBAR, MBAR, MBAR2,
231 static const enum m68k_register mcf5271_ctrl[] = {
232 VBR, CACR, ACR0, ACR1, RAMBAR, RAMBAR1,
235 static const enum m68k_register mcf5272_ctrl[] = {
236 VBR, CACR, ACR0, ACR1, ROMBAR, RAMBAR_ALT, RAMBAR0, MBAR,
239 static const enum m68k_register mcf5275_ctrl[] = {
240 VBR, CACR, ACR0, ACR1, RAMBAR, RAMBAR1,
243 static const enum m68k_register mcf5282_ctrl[] = {
244 VBR, CACR, ACR0, ACR1, FLASHBAR, RAMBAR, RAMBAR1,
247 static const enum m68k_register mcf5307_ctrl[] = {
248 CACR, ACR0, ACR1, VBR, RAMBAR0, RAMBAR_ALT, MBAR,
251 static const enum m68k_register mcf5329_ctrl[] = {
252 VBR, CACR, ACR0, ACR1, RAMBAR, RAMBAR1,
255 static const enum m68k_register mcf5373_ctrl[] = {
256 VBR, CACR, ACR0, ACR1, RAMBAR, RAMBAR1,
259 static const enum m68k_register mcfv4e_ctrl[] = {
260 CACR, ASID, ACR0, ACR1, ACR2, ACR3, MMUBAR,
261 VBR, PC, ROMBAR0, ROMBAR1, RAMBAR0, RAMBAR1,
262 MBAR, SECMBAR,
263 MPCR /* Multiprocessor Control register */,
264 EDRAMBAR /* Embedded DRAM Base Address Register */,
265 /* Permutation control registers. */
266 PCR1U0, PCR1L0, PCR1U1, PCR1L1, PCR2U0, PCR2L0, PCR2U1, PCR2L1,
267 PCR3U0, PCR3L0, PCR3U1, PCR3L1,
268 /* Legacy names */
269 TC /* ASID */, BUSCR /* MMUBAR */,
270 ITT0 /* ACR0 */, ITT1 /* ACR1 */, DTT0 /* ACR2 */, DTT1 /* ACR3 */,
271 MBAR1 /* MBAR */, MBAR2 /* SECMBAR */, MBAR0 /* SECMBAR */,
272 ROMBAR /* ROMBAR0 */, RAMBAR /* RAMBAR1 */,
275 static const enum m68k_register mcf5407_ctrl[] = {
276 CACR, ASID, ACR0, ACR1, ACR2, ACR3,
277 VBR, PC, RAMBAR0, RAMBAR1, MBAR,
278 /* Legacy names */
279 TC /* ASID */,
280 ITT0 /* ACR0 */, ITT1 /* ACR1 */, DTT0 /* ACR2 */, DTT1 /* ACR3 */,
281 MBAR1 /* MBAR */, RAMBAR /* RAMBAR1 */,
284 static const enum m68k_register mcf54455_ctrl[] = {
285 CACR, ASID, ACR0, ACR1, ACR2, ACR3, MMUBAR,
286 VBR, PC, RAMBAR1, MBAR,
287 /* Legacy names */
288 TC /* ASID */, BUSCR /* MMUBAR */,
289 ITT0 /* ACR0 */, ITT1 /* ACR1 */, DTT0 /* ACR2 */, DTT1 /* ACR3 */,
290 MBAR1 /* MBAR */, RAMBAR /* RAMBAR1 */,
293 static const enum m68k_register mcf5475_ctrl[] = {
294 CACR, ASID, ACR0, ACR1, ACR2, ACR3, MMUBAR,
295 VBR, PC, RAMBAR0, RAMBAR1, MBAR,
296 /* Legacy names */
297 TC /* ASID */, BUSCR /* MMUBAR */,
298 ITT0 /* ACR0 */, ITT1 /* ACR1 */, DTT0 /* ACR2 */, DTT1 /* ACR3 */,
299 MBAR1 /* MBAR */, RAMBAR /* RAMBAR1 */,
302 static const enum m68k_register mcf5485_ctrl[] = {
303 CACR, ASID, ACR0, ACR1, ACR2, ACR3, MMUBAR,
304 VBR, PC, RAMBAR0, RAMBAR1, MBAR,
305 /* Legacy names */
306 TC /* ASID */, BUSCR /* MMUBAR */,
307 ITT0 /* ACR0 */, ITT1 /* ACR1 */, DTT0 /* ACR2 */, DTT1 /* ACR3 */,
308 MBAR1 /* MBAR */, RAMBAR /* RAMBAR1 */,
311 static const enum m68k_register fido_ctrl[] = {
312 SFC, DFC, USP, VBR, CAC, MBO,
315 #define cpu32_ctrl m68010_ctrl
317 static const enum m68k_register *control_regs;
319 /* Internal form of a 68020 instruction. */
320 struct m68k_it
322 const char *error;
323 const char *args; /* List of opcode info. */
324 int numargs;
326 int numo; /* Number of shorts in opcode. */
327 short opcode[11];
329 struct m68k_op operands[6];
331 int nexp; /* Number of exprs in use. */
332 struct m68k_exp exprs[4];
334 int nfrag; /* Number of frags we have to produce. */
335 struct
337 int fragoff; /* Where in the current opcode the frag ends. */
338 symbolS *fadd;
339 offsetT foff;
340 int fragty;
342 fragb[4];
344 int nrel; /* Num of reloc strucs in use. */
345 struct
347 int n;
348 expressionS exp;
349 char wid;
350 char pcrel;
351 /* In a pc relative address the difference between the address
352 of the offset and the address that the offset is relative
353 to. This depends on the addressing mode. Basically this
354 is the value to put in the offset field to address the
355 first byte of the offset, without regarding the special
356 significance of some values (in the branch instruction, for
357 example). */
358 int pcrel_fix;
359 #ifdef OBJ_ELF
360 /* Whether this expression needs special pic relocation, and if
361 so, which. */
362 enum pic_relocation pic_reloc;
363 #endif
365 reloc[5]; /* Five is enough??? */
368 #define cpu_of_arch(x) ((x) & (m68000up | mcfisa_a | fido_a))
369 #define float_of_arch(x) ((x) & mfloat)
370 #define mmu_of_arch(x) ((x) & mmmu)
371 #define arch_coldfire_p(x) ((x) & mcfisa_a)
372 #define arch_coldfire_fpu(x) ((x) & cfloat)
374 /* Macros for determining if cpu supports a specific addressing mode. */
375 #define HAVE_LONG_DISP(x) \
376 ((x) & (m68020|m68030|m68040|m68060|cpu32|fido_a|mcfisa_b|mcfisa_c))
377 #define HAVE_LONG_CALL(x) \
378 ((x) & (m68020|m68030|m68040|m68060|cpu32|fido_a|mcfisa_b|mcfisa_c))
379 #define HAVE_LONG_COND(x) \
380 ((x) & (m68020|m68030|m68040|m68060|cpu32|fido_a|mcfisa_b|mcfisa_c))
381 #define HAVE_LONG_BRANCH(x) \
382 ((x) & (m68020|m68030|m68040|m68060|cpu32|fido_a|mcfisa_b))
383 #define LONG_BRANCH_VIA_COND(x) (HAVE_LONG_COND(x) && !HAVE_LONG_BRANCH(x))
385 static struct m68k_it the_ins; /* The instruction being assembled. */
387 #define op(ex) ((ex)->exp.X_op)
388 #define adds(ex) ((ex)->exp.X_add_symbol)
389 #define subs(ex) ((ex)->exp.X_op_symbol)
390 #define offs(ex) ((ex)->exp.X_add_number)
392 /* Macros for adding things to the m68k_it struct. */
393 #define addword(w) (the_ins.opcode[the_ins.numo++] = (w))
395 /* Like addword, but goes BEFORE general operands. */
397 static void
398 insop (int w, const struct m68k_incant *opcode)
400 int z;
401 for (z = the_ins.numo; z > opcode->m_codenum; --z)
402 the_ins.opcode[z] = the_ins.opcode[z - 1];
403 for (z = 0; z < the_ins.nrel; z++)
404 the_ins.reloc[z].n += 2;
405 for (z = 0; z < the_ins.nfrag; z++)
406 the_ins.fragb[z].fragoff++;
407 the_ins.opcode[opcode->m_codenum] = w;
408 the_ins.numo++;
411 /* The numo+1 kludge is so we can hit the low order byte of the prev word.
412 Blecch. */
413 static void
414 add_fix (int width, struct m68k_exp *exp, int pc_rel, int pc_fix)
416 the_ins.reloc[the_ins.nrel].n = (width == 'B' || width == '3'
417 ? the_ins.numo * 2 - 1
418 : (width == 'b'
419 ? the_ins.numo * 2 + 1
420 : the_ins.numo * 2));
421 the_ins.reloc[the_ins.nrel].exp = exp->exp;
422 the_ins.reloc[the_ins.nrel].wid = width;
423 the_ins.reloc[the_ins.nrel].pcrel_fix = pc_fix;
424 #ifdef OBJ_ELF
425 the_ins.reloc[the_ins.nrel].pic_reloc = exp->pic_reloc;
426 #endif
427 the_ins.reloc[the_ins.nrel++].pcrel = pc_rel;
430 /* Cause an extra frag to be generated here, inserting up to 10 bytes
431 (that value is chosen in the frag_var call in md_assemble). TYPE
432 is the subtype of the frag to be generated; its primary type is
433 rs_machine_dependent.
435 The TYPE parameter is also used by md_convert_frag_1 and
436 md_estimate_size_before_relax. The appropriate type of fixup will
437 be emitted by md_convert_frag_1.
439 ADD becomes the FR_SYMBOL field of the frag, and OFF the FR_OFFSET. */
440 static void
441 add_frag (symbolS *add, offsetT off, int type)
443 the_ins.fragb[the_ins.nfrag].fragoff = the_ins.numo;
444 the_ins.fragb[the_ins.nfrag].fadd = add;
445 the_ins.fragb[the_ins.nfrag].foff = off;
446 the_ins.fragb[the_ins.nfrag++].fragty = type;
449 #define isvar(ex) \
450 (op (ex) != O_constant && op (ex) != O_big)
452 static char *crack_operand (char *str, struct m68k_op *opP);
453 static int get_num (struct m68k_exp *exp, int ok);
454 static int reverse_16_bits (int in);
455 static int reverse_8_bits (int in);
456 static void install_gen_operand (int mode, int val);
457 static void install_operand (int mode, int val);
458 static void s_bss (int);
459 static void s_data1 (int);
460 static void s_data2 (int);
461 static void s_even (int);
462 static void s_proc (int);
463 static void s_chip (int);
464 static void s_fopt (int);
465 static void s_opt (int);
466 static void s_reg (int);
467 static void s_restore (int);
468 static void s_save (int);
469 static void s_mri_if (int);
470 static void s_mri_else (int);
471 static void s_mri_endi (int);
472 static void s_mri_break (int);
473 static void s_mri_next (int);
474 static void s_mri_for (int);
475 static void s_mri_endf (int);
476 static void s_mri_repeat (int);
477 static void s_mri_until (int);
478 static void s_mri_while (int);
479 static void s_mri_endw (int);
480 static void s_m68k_cpu (int);
481 static void s_m68k_arch (int);
483 struct m68k_cpu
485 unsigned long arch; /* Architecture features. */
486 const enum m68k_register *control_regs; /* Control regs on chip */
487 const char *name; /* Name */
488 int alias; /* Alias for a cannonical name. If 1, then
489 succeeds canonical name, if -1 then
490 succeeds canonical name, if <-1 ||>1 this is a
491 deprecated name, and the next/previous name
492 should be used. */
495 /* We hold flags for features explicitly enabled and explicitly
496 disabled. */
497 static int current_architecture;
498 static int not_current_architecture;
499 static const struct m68k_cpu *selected_arch;
500 static const struct m68k_cpu *selected_cpu;
501 static int initialized;
503 /* Architecture models. */
504 static const struct m68k_cpu m68k_archs[] =
506 {m68000, m68000_ctrl, "68000", 0},
507 {m68010, m68010_ctrl, "68010", 0},
508 {m68020|m68881|m68851, m68020_ctrl, "68020", 0},
509 {m68030|m68881|m68851, m68020_ctrl, "68030", 0},
510 {m68040, m68040_ctrl, "68040", 0},
511 {m68060, m68060_ctrl, "68060", 0},
512 {cpu32|m68881, cpu32_ctrl, "cpu32", 0},
513 {fido_a, fido_ctrl, "fidoa", 0},
514 {mcfisa_a|mcfhwdiv, NULL, "isaa", 0},
515 {mcfisa_a|mcfhwdiv|mcfisa_aa|mcfusp, NULL, "isaaplus", 0},
516 {mcfisa_a|mcfhwdiv|mcfisa_b|mcfusp, NULL, "isab", 0},
517 {mcfisa_a|mcfhwdiv|mcfisa_c|mcfusp, NULL, "isac", 0},
518 {mcfisa_a|mcfhwdiv|mcfisa_b|mcfmac|mcfusp, mcf_ctrl, "cfv4", 0},
519 {mcfisa_a|mcfhwdiv|mcfisa_b|mcfemac|mcfusp|cfloat, mcfv4e_ctrl, "cfv4e", 0},
520 {0,0,NULL, 0}
523 /* Architecture extensions, here 'alias' -1 for m68k, +1 for cf and 0
524 for either. */
525 static const struct m68k_cpu m68k_extensions[] =
527 {m68851, NULL, "68851", -1},
528 {m68881, NULL, "68881", -1},
529 {m68881, NULL, "68882", -1},
531 {cfloat|m68881, NULL, "float", 0},
533 {mcfhwdiv, NULL, "div", 1},
534 {mcfusp, NULL, "usp", 1},
535 {mcfmac, NULL, "mac", 1},
536 {mcfemac, NULL, "emac", 1},
538 {0,NULL,NULL, 0}
541 /* Processor list */
542 static const struct m68k_cpu m68k_cpus[] =
544 {m68000, m68000_ctrl, "68000", 0},
545 {m68000, m68000_ctrl, "68ec000", 1},
546 {m68000, m68000_ctrl, "68hc000", 1},
547 {m68000, m68000_ctrl, "68hc001", 1},
548 {m68000, m68000_ctrl, "68008", 1},
549 {m68000, m68000_ctrl, "68302", 1},
550 {m68000, m68000_ctrl, "68306", 1},
551 {m68000, m68000_ctrl, "68307", 1},
552 {m68000, m68000_ctrl, "68322", 1},
553 {m68000, m68000_ctrl, "68356", 1},
554 {m68010, m68010_ctrl, "68010", 0},
555 {m68020|m68881|m68851, m68020_ctrl, "68020", 0},
556 {m68020|m68881|m68851, m68020_ctrl, "68k", 1},
557 {m68020|m68881|m68851, m68020_ctrl, "68ec020", 1},
558 {m68030|m68881|m68851, m68020_ctrl, "68030", 0},
559 {m68030|m68881|m68851, m68020_ctrl, "68ec030", 1},
560 {m68040, m68040_ctrl, "68040", 0},
561 {m68040, m68040_ctrl, "68ec040", 1},
562 {m68060, m68060_ctrl, "68060", 0},
563 {m68060, m68060_ctrl, "68ec060", 1},
565 {cpu32|m68881, cpu32_ctrl, "cpu32", 0},
566 {cpu32|m68881, cpu32_ctrl, "68330", 1},
567 {cpu32|m68881, cpu32_ctrl, "68331", 1},
568 {cpu32|m68881, cpu32_ctrl, "68332", 1},
569 {cpu32|m68881, cpu32_ctrl, "68333", 1},
570 {cpu32|m68881, cpu32_ctrl, "68334", 1},
571 {cpu32|m68881, cpu32_ctrl, "68336", 1},
572 {cpu32|m68881, cpu32_ctrl, "68340", 1},
573 {cpu32|m68881, cpu32_ctrl, "68341", 1},
574 {cpu32|m68881, cpu32_ctrl, "68349", 1},
575 {cpu32|m68881, cpu32_ctrl, "68360", 1},
577 {mcfisa_a|mcfisa_c|mcfusp, mcf51qe_ctrl, "51qe", 0},
579 {mcfisa_a, mcf_ctrl, "5200", 0},
580 {mcfisa_a, mcf_ctrl, "5202", 1},
581 {mcfisa_a, mcf_ctrl, "5204", 1},
582 {mcfisa_a, mcf5206_ctrl, "5206", 1},
584 {mcfisa_a|mcfhwdiv|mcfmac, mcf5206_ctrl, "5206e", 0},
586 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5208_ctrl, "5207", -1},
587 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5208_ctrl, "5208", 0},
589 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf5210a_ctrl, "5210a", 0},
590 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf5210a_ctrl, "5211a", 1},
592 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf5213_ctrl, "5211", -1},
593 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf5213_ctrl, "5212", -1},
594 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf5213_ctrl, "5213", 0},
596 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5216_ctrl, "5214", -1},
597 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5216_ctrl, "5216", 0},
598 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5216_ctrl, "521x", 2},
600 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf52223_ctrl, "52221", -1},
601 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf52223_ctrl, "52223", 0},
603 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf52235_ctrl, "52230", -1},
604 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf52235_ctrl, "52233", -1},
605 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf52235_ctrl, "52234", -1},
606 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf52235_ctrl, "52235", 0},
608 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf5225_ctrl, "5224", -1},
609 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf5225_ctrl, "5225", 0},
611 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5235_ctrl, "5232", -1},
612 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5235_ctrl, "5233", -1},
613 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5235_ctrl, "5234", -1},
614 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5235_ctrl, "5235", -1},
615 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5235_ctrl, "523x", 0},
617 {mcfisa_a|mcfhwdiv|mcfemac, mcf5249_ctrl, "5249", 0},
618 {mcfisa_a|mcfhwdiv|mcfemac, mcf5250_ctrl, "5250", 0},
619 {mcfisa_a|mcfhwdiv|mcfemac, mcf5253_ctrl, "5253", 0},
621 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5271_ctrl, "5270", -1},
622 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5271_ctrl, "5271", 0},
624 {mcfisa_a|mcfhwdiv|mcfmac, mcf5272_ctrl, "5272", 0},
626 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5275_ctrl, "5274", -1},
627 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5275_ctrl, "5275", 0},
629 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5282_ctrl, "5280", -1},
630 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5282_ctrl, "5281", -1},
631 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5282_ctrl, "5282", -1},
632 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5282_ctrl, "528x", 0},
634 {mcfisa_a|mcfhwdiv|mcfmac, mcf5307_ctrl, "5307", 0},
636 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5329_ctrl, "5327", -1},
637 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5329_ctrl, "5328", -1},
638 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5329_ctrl, "5329", -1},
639 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5329_ctrl, "532x", 0},
641 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5373_ctrl, "5372", -1},
642 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5373_ctrl, "5373", -1},
643 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5373_ctrl, "537x", 0},
645 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfmac, mcf5407_ctrl, "5407",0},
647 {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp, mcf54455_ctrl, "54450", -1},
648 {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp, mcf54455_ctrl, "54451", -1},
649 {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp, mcf54455_ctrl, "54452", -1},
650 {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp, mcf54455_ctrl, "54453", -1},
651 {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp, mcf54455_ctrl, "54454", -1},
652 {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp, mcf54455_ctrl, "54455", 0},
654 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "5470", -1},
655 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "5471", -1},
656 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "5472", -1},
657 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "5473", -1},
658 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "5474", -1},
659 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "5475", -1},
660 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "547x", 0},
662 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "5480", -1},
663 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "5481", -1},
664 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "5482", -1},
665 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "5483", -1},
666 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "5484", -1},
667 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "5485", -1},
668 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "548x", 0},
670 {fido_a, fido_ctrl, "fidoa", 0},
671 {fido_a, fido_ctrl, "fido", 1},
673 {0,NULL,NULL, 0}
676 static const struct m68k_cpu *m68k_lookup_cpu
677 (const char *, const struct m68k_cpu *, int, int *);
678 static int m68k_set_arch (const char *, int, int);
679 static int m68k_set_cpu (const char *, int, int);
680 static int m68k_set_extension (const char *, int, int);
681 static void m68k_init_arch (void);
683 /* This is the assembler relaxation table for m68k. m68k is a rich CISC
684 architecture and we have a lot of relaxation modes. */
686 /* Macros used in the relaxation code. */
687 #define TAB(x,y) (((x) << 2) + (y))
688 #define TABTYPE(x) ((x) >> 2)
690 /* Relaxation states. */
691 #define BYTE 0
692 #define SHORT 1
693 #define LONG 2
694 #define SZ_UNDEF 3
696 /* Here are all the relaxation modes we support. First we can relax ordinary
697 branches. On 68020 and higher and on CPU32 all branch instructions take
698 three forms, so on these CPUs all branches always remain as such. When we
699 have to expand to the LONG form on a 68000, though, we substitute an
700 absolute jump instead. This is a direct replacement for unconditional
701 branches and a branch over a jump for conditional branches. However, if the
702 user requires PIC and disables this with --pcrel, we can only relax between
703 BYTE and SHORT forms, punting if that isn't enough. This gives us four
704 different relaxation modes for branches: */
706 #define BRANCHBWL 0 /* Branch byte, word, or long. */
707 #define BRABSJUNC 1 /* Absolute jump for LONG, unconditional. */
708 #define BRABSJCOND 2 /* Absolute jump for LONG, conditional. */
709 #define BRANCHBW 3 /* Branch byte or word. */
711 /* We also relax coprocessor branches and DBcc's. All CPUs that support
712 coprocessor branches support them in word and long forms, so we have only
713 one relaxation mode for them. DBcc's are word only on all CPUs. We can
714 relax them to the LONG form with a branch-around sequence. This sequence
715 can use a long branch (if available) or an absolute jump (if acceptable).
716 This gives us two relaxation modes. If long branches are not available and
717 absolute jumps are not acceptable, we don't relax DBcc's. */
719 #define FBRANCH 4 /* Coprocessor branch. */
720 #define DBCCLBR 5 /* DBcc relaxable with a long branch. */
721 #define DBCCABSJ 6 /* DBcc relaxable with an absolute jump. */
723 /* That's all for instruction relaxation. However, we also relax PC-relative
724 operands. Specifically, we have three operand relaxation modes. On the
725 68000 PC-relative operands can only be 16-bit, but on 68020 and higher and
726 on CPU32 they may be 16-bit or 32-bit. For the latter we relax between the
727 two. Also PC+displacement+index operands in their simple form (with a non-
728 suppressed index without memory indirection) are supported on all CPUs, but
729 on the 68000 the displacement can be 8-bit only, whereas on 68020 and higher
730 and on CPU32 we relax it to SHORT and LONG forms as well using the extended
731 form of the PC+displacement+index operand. Finally, some absolute operands
732 can be relaxed down to 16-bit PC-relative. */
734 #define PCREL1632 7 /* 16-bit or 32-bit PC-relative. */
735 #define PCINDEX 8 /* PC + displacement + index. */
736 #define ABSTOPCREL 9 /* Absolute relax down to 16-bit PC-relative. */
738 /* This relaxation is required for branches where there is no long
739 branch and we are in pcrel mode. We generate a bne/beq pair. */
740 #define BRANCHBWPL 10 /* Branch byte, word or pair of longs
743 /* Note that calls to frag_var need to specify the maximum expansion
744 needed; this is currently 12 bytes for bne/beq pair. */
745 #define FRAG_VAR_SIZE 12
747 /* The fields are:
748 How far Forward this mode will reach:
749 How far Backward this mode will reach:
750 How many bytes this mode will add to the size of the frag
751 Which mode to go to if the offset won't fit in this one
753 Please check tc-m68k.h:md_prepare_relax_scan if changing this table. */
754 relax_typeS md_relax_table[] =
756 { 127, -128, 0, TAB (BRANCHBWL, SHORT) },
757 { 32767, -32768, 2, TAB (BRANCHBWL, LONG) },
758 { 0, 0, 4, 0 },
759 { 1, 1, 0, 0 },
761 { 127, -128, 0, TAB (BRABSJUNC, SHORT) },
762 { 32767, -32768, 2, TAB (BRABSJUNC, LONG) },
763 { 0, 0, 4, 0 },
764 { 1, 1, 0, 0 },
766 { 127, -128, 0, TAB (BRABSJCOND, SHORT) },
767 { 32767, -32768, 2, TAB (BRABSJCOND, LONG) },
768 { 0, 0, 6, 0 },
769 { 1, 1, 0, 0 },
771 { 127, -128, 0, TAB (BRANCHBW, SHORT) },
772 { 0, 0, 2, 0 },
773 { 1, 1, 0, 0 },
774 { 1, 1, 0, 0 },
776 { 1, 1, 0, 0 }, /* FBRANCH doesn't come BYTE. */
777 { 32767, -32768, 2, TAB (FBRANCH, LONG) },
778 { 0, 0, 4, 0 },
779 { 1, 1, 0, 0 },
781 { 1, 1, 0, 0 }, /* DBCC doesn't come BYTE. */
782 { 32767, -32768, 2, TAB (DBCCLBR, LONG) },
783 { 0, 0, 10, 0 },
784 { 1, 1, 0, 0 },
786 { 1, 1, 0, 0 }, /* DBCC doesn't come BYTE. */
787 { 32767, -32768, 2, TAB (DBCCABSJ, LONG) },
788 { 0, 0, 10, 0 },
789 { 1, 1, 0, 0 },
791 { 1, 1, 0, 0 }, /* PCREL1632 doesn't come BYTE. */
792 { 32767, -32768, 2, TAB (PCREL1632, LONG) },
793 { 0, 0, 6, 0 },
794 { 1, 1, 0, 0 },
796 { 125, -130, 0, TAB (PCINDEX, SHORT) },
797 { 32765, -32770, 2, TAB (PCINDEX, LONG) },
798 { 0, 0, 4, 0 },
799 { 1, 1, 0, 0 },
801 { 1, 1, 0, 0 }, /* ABSTOPCREL doesn't come BYTE. */
802 { 32767, -32768, 2, TAB (ABSTOPCREL, LONG) },
803 { 0, 0, 4, 0 },
804 { 1, 1, 0, 0 },
806 { 127, -128, 0, TAB (BRANCHBWPL, SHORT) },
807 { 32767, -32768, 2, TAB (BRANCHBWPL, LONG) },
808 { 0, 0, 10, 0 },
809 { 1, 1, 0, 0 },
812 /* These are the machine dependent pseudo-ops. These are included so
813 the assembler can work on the output from the SUN C compiler, which
814 generates these. */
816 /* This table describes all the machine specific pseudo-ops the assembler
817 has to support. The fields are:
818 pseudo-op name without dot
819 function to call to execute this pseudo-op
820 Integer arg to pass to the function. */
821 const pseudo_typeS md_pseudo_table[] =
823 {"data1", s_data1, 0},
824 {"data2", s_data2, 0},
825 {"bss", s_bss, 0},
826 {"even", s_even, 0},
827 {"skip", s_space, 0},
828 {"proc", s_proc, 0},
829 #if defined (TE_SUN3) || defined (OBJ_ELF)
830 {"align", s_align_bytes, 0},
831 #endif
832 #ifdef OBJ_ELF
833 {"swbeg", s_ignore, 0},
834 #endif
835 {"extend", float_cons, 'x'},
836 {"ldouble", float_cons, 'x'},
838 {"arch", s_m68k_arch, 0},
839 {"cpu", s_m68k_cpu, 0},
841 /* The following pseudo-ops are supported for MRI compatibility. */
842 {"chip", s_chip, 0},
843 {"comline", s_space, 1},
844 {"fopt", s_fopt, 0},
845 {"mask2", s_ignore, 0},
846 {"opt", s_opt, 0},
847 {"reg", s_reg, 0},
848 {"restore", s_restore, 0},
849 {"save", s_save, 0},
851 {"if", s_mri_if, 0},
852 {"if.b", s_mri_if, 'b'},
853 {"if.w", s_mri_if, 'w'},
854 {"if.l", s_mri_if, 'l'},
855 {"else", s_mri_else, 0},
856 {"else.s", s_mri_else, 's'},
857 {"else.l", s_mri_else, 'l'},
858 {"endi", s_mri_endi, 0},
859 {"break", s_mri_break, 0},
860 {"break.s", s_mri_break, 's'},
861 {"break.l", s_mri_break, 'l'},
862 {"next", s_mri_next, 0},
863 {"next.s", s_mri_next, 's'},
864 {"next.l", s_mri_next, 'l'},
865 {"for", s_mri_for, 0},
866 {"for.b", s_mri_for, 'b'},
867 {"for.w", s_mri_for, 'w'},
868 {"for.l", s_mri_for, 'l'},
869 {"endf", s_mri_endf, 0},
870 {"repeat", s_mri_repeat, 0},
871 {"until", s_mri_until, 0},
872 {"until.b", s_mri_until, 'b'},
873 {"until.w", s_mri_until, 'w'},
874 {"until.l", s_mri_until, 'l'},
875 {"while", s_mri_while, 0},
876 {"while.b", s_mri_while, 'b'},
877 {"while.w", s_mri_while, 'w'},
878 {"while.l", s_mri_while, 'l'},
879 {"endw", s_mri_endw, 0},
881 {0, 0, 0}
884 /* The mote pseudo ops are put into the opcode table, since they
885 don't start with a . they look like opcodes to gas. */
887 const pseudo_typeS mote_pseudo_table[] =
890 {"dcl", cons, 4},
891 {"dc", cons, 2},
892 {"dcw", cons, 2},
893 {"dcb", cons, 1},
895 {"dsl", s_space, 4},
896 {"ds", s_space, 2},
897 {"dsw", s_space, 2},
898 {"dsb", s_space, 1},
900 {"xdef", s_globl, 0},
901 #ifdef OBJ_ELF
902 {"align", s_align_bytes, 0},
903 #else
904 {"align", s_align_ptwo, 0},
905 #endif
906 #ifdef M68KCOFF
907 {"sect", obj_coff_section, 0},
908 {"section", obj_coff_section, 0},
909 #endif
910 {0, 0, 0}
913 /* Truncate and sign-extend at 32 bits, so that building on a 64-bit host
914 gives identical results to a 32-bit host. */
915 #define TRUNC(X) ((valueT) (X) & 0xffffffff)
916 #define SEXT(X) ((TRUNC (X) ^ 0x80000000) - 0x80000000)
918 #define issbyte(x) ((valueT) SEXT (x) + 0x80 < 0x100)
919 #define isubyte(x) ((valueT) TRUNC (x) < 0x100)
920 #define issword(x) ((valueT) SEXT (x) + 0x8000 < 0x10000)
921 #define isuword(x) ((valueT) TRUNC (x) < 0x10000)
923 #define isbyte(x) ((valueT) SEXT (x) + 0xff < 0x1ff)
924 #define isword(x) ((valueT) SEXT (x) + 0xffff < 0x1ffff)
925 #define islong(x) (1)
927 static char notend_table[256];
928 static char alt_notend_table[256];
929 #define notend(s) \
930 (! (notend_table[(unsigned char) *s] \
931 || (*s == ':' \
932 && alt_notend_table[(unsigned char) s[1]])))
934 #ifdef OBJ_ELF
936 /* Return zero if the reference to SYMBOL from within the same segment may
937 be relaxed. */
939 /* On an ELF system, we can't relax an externally visible symbol,
940 because it may be overridden by a shared library. However, if
941 TARGET_OS is "elf", then we presume that we are assembling for an
942 embedded system, in which case we don't have to worry about shared
943 libraries, and we can relax any external sym. */
945 #define relaxable_symbol(symbol) \
946 (!((S_IS_EXTERNAL (symbol) && EXTERN_FORCE_RELOC) \
947 || S_IS_WEAK (symbol)))
949 /* Compute the relocation code for a fixup of SIZE bytes, using pc
950 relative relocation if PCREL is non-zero. PIC says whether a special
951 pic relocation was requested. */
953 static bfd_reloc_code_real_type
954 get_reloc_code (int size, int pcrel, enum pic_relocation pic)
956 switch (pic)
958 case pic_got_pcrel:
959 switch (size)
961 case 1:
962 return BFD_RELOC_8_GOT_PCREL;
963 case 2:
964 return BFD_RELOC_16_GOT_PCREL;
965 case 4:
966 return BFD_RELOC_32_GOT_PCREL;
968 break;
970 case pic_got_off:
971 switch (size)
973 case 1:
974 return BFD_RELOC_8_GOTOFF;
975 case 2:
976 return BFD_RELOC_16_GOTOFF;
977 case 4:
978 return BFD_RELOC_32_GOTOFF;
980 break;
982 case pic_plt_pcrel:
983 switch (size)
985 case 1:
986 return BFD_RELOC_8_PLT_PCREL;
987 case 2:
988 return BFD_RELOC_16_PLT_PCREL;
989 case 4:
990 return BFD_RELOC_32_PLT_PCREL;
992 break;
994 case pic_plt_off:
995 switch (size)
997 case 1:
998 return BFD_RELOC_8_PLTOFF;
999 case 2:
1000 return BFD_RELOC_16_PLTOFF;
1001 case 4:
1002 return BFD_RELOC_32_PLTOFF;
1004 break;
1006 case pic_none:
1007 if (pcrel)
1009 switch (size)
1011 case 1:
1012 return BFD_RELOC_8_PCREL;
1013 case 2:
1014 return BFD_RELOC_16_PCREL;
1015 case 4:
1016 return BFD_RELOC_32_PCREL;
1019 else
1021 switch (size)
1023 case 1:
1024 return BFD_RELOC_8;
1025 case 2:
1026 return BFD_RELOC_16;
1027 case 4:
1028 return BFD_RELOC_32;
1033 if (pcrel)
1035 if (pic == pic_none)
1036 as_bad (_("Can not do %d byte pc-relative relocation"), size);
1037 else
1038 as_bad (_("Can not do %d byte pc-relative pic relocation"), size);
1040 else
1042 if (pic == pic_none)
1043 as_bad (_("Can not do %d byte relocation"), size);
1044 else
1045 as_bad (_("Can not do %d byte pic relocation"), size);
1048 return BFD_RELOC_NONE;
1051 /* Here we decide which fixups can be adjusted to make them relative
1052 to the beginning of the section instead of the symbol. Basically
1053 we need to make sure that the dynamic relocations are done
1054 correctly, so in some cases we force the original symbol to be
1055 used. */
1057 tc_m68k_fix_adjustable (fixS *fixP)
1059 /* Adjust_reloc_syms doesn't know about the GOT. */
1060 switch (fixP->fx_r_type)
1062 case BFD_RELOC_8_GOT_PCREL:
1063 case BFD_RELOC_16_GOT_PCREL:
1064 case BFD_RELOC_32_GOT_PCREL:
1065 case BFD_RELOC_8_GOTOFF:
1066 case BFD_RELOC_16_GOTOFF:
1067 case BFD_RELOC_32_GOTOFF:
1068 case BFD_RELOC_8_PLT_PCREL:
1069 case BFD_RELOC_16_PLT_PCREL:
1070 case BFD_RELOC_32_PLT_PCREL:
1071 case BFD_RELOC_8_PLTOFF:
1072 case BFD_RELOC_16_PLTOFF:
1073 case BFD_RELOC_32_PLTOFF:
1074 return 0;
1076 case BFD_RELOC_VTABLE_INHERIT:
1077 case BFD_RELOC_VTABLE_ENTRY:
1078 return 0;
1080 default:
1081 return 1;
1085 #else /* !OBJ_ELF */
1087 #define get_reloc_code(SIZE,PCREL,OTHER) NO_RELOC
1089 /* PR gas/3041 Weak symbols are not relaxable
1090 because they must be treated as extern. */
1091 #define relaxable_symbol(symbol) (!(S_IS_WEAK (symbol)))
1093 #endif /* OBJ_ELF */
1095 arelent *
1096 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
1098 arelent *reloc;
1099 bfd_reloc_code_real_type code;
1101 /* If the tcbit is set, then this was a fixup of a negative value
1102 that was never resolved. We do not have a reloc to handle this,
1103 so just return. We assume that other code will have detected this
1104 situation and produced a helpful error message, so we just tell the
1105 user that the reloc cannot be produced. */
1106 if (fixp->fx_tcbit)
1108 if (fixp->fx_addsy)
1109 as_bad_where (fixp->fx_file, fixp->fx_line,
1110 _("Unable to produce reloc against symbol '%s'"),
1111 S_GET_NAME (fixp->fx_addsy));
1112 return NULL;
1115 if (fixp->fx_r_type != BFD_RELOC_NONE)
1117 code = fixp->fx_r_type;
1119 /* Since DIFF_EXPR_OK is defined in tc-m68k.h, it is possible
1120 that fixup_segment converted a non-PC relative reloc into a
1121 PC relative reloc. In such a case, we need to convert the
1122 reloc code. */
1123 if (fixp->fx_pcrel)
1125 switch (code)
1127 case BFD_RELOC_8:
1128 code = BFD_RELOC_8_PCREL;
1129 break;
1130 case BFD_RELOC_16:
1131 code = BFD_RELOC_16_PCREL;
1132 break;
1133 case BFD_RELOC_32:
1134 code = BFD_RELOC_32_PCREL;
1135 break;
1136 case BFD_RELOC_8_PCREL:
1137 case BFD_RELOC_16_PCREL:
1138 case BFD_RELOC_32_PCREL:
1139 case BFD_RELOC_8_GOT_PCREL:
1140 case BFD_RELOC_16_GOT_PCREL:
1141 case BFD_RELOC_32_GOT_PCREL:
1142 case BFD_RELOC_8_GOTOFF:
1143 case BFD_RELOC_16_GOTOFF:
1144 case BFD_RELOC_32_GOTOFF:
1145 case BFD_RELOC_8_PLT_PCREL:
1146 case BFD_RELOC_16_PLT_PCREL:
1147 case BFD_RELOC_32_PLT_PCREL:
1148 case BFD_RELOC_8_PLTOFF:
1149 case BFD_RELOC_16_PLTOFF:
1150 case BFD_RELOC_32_PLTOFF:
1151 break;
1152 default:
1153 as_bad_where (fixp->fx_file, fixp->fx_line,
1154 _("Cannot make %s relocation PC relative"),
1155 bfd_get_reloc_code_name (code));
1159 else
1161 #define F(SZ,PCREL) (((SZ) << 1) + (PCREL))
1162 switch (F (fixp->fx_size, fixp->fx_pcrel))
1164 #define MAP(SZ,PCREL,TYPE) case F(SZ,PCREL): code = (TYPE); break
1165 MAP (1, 0, BFD_RELOC_8);
1166 MAP (2, 0, BFD_RELOC_16);
1167 MAP (4, 0, BFD_RELOC_32);
1168 MAP (1, 1, BFD_RELOC_8_PCREL);
1169 MAP (2, 1, BFD_RELOC_16_PCREL);
1170 MAP (4, 1, BFD_RELOC_32_PCREL);
1171 default:
1172 abort ();
1175 #undef F
1176 #undef MAP
1178 reloc = (arelent *) xmalloc (sizeof (arelent));
1179 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
1180 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1181 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
1182 #ifndef OBJ_ELF
1183 if (fixp->fx_pcrel)
1184 reloc->addend = fixp->fx_addnumber;
1185 else if (OUTPUT_FLAVOR == bfd_target_aout_flavour
1186 && fixp->fx_addsy
1187 && S_IS_WEAK (fixp->fx_addsy)
1188 && ! bfd_is_und_section (S_GET_SEGMENT (fixp->fx_addsy)))
1189 /* PR gas/3041 Adjust addend in order to force bfd_install_relocation()
1190 to put the symbol offset into frags referencing a weak symbol. */
1191 reloc->addend = fixp->fx_addnumber
1192 - (S_GET_VALUE (fixp->fx_addsy) * 2);
1193 else
1194 reloc->addend = 0;
1195 #else
1196 if (!fixp->fx_pcrel)
1197 reloc->addend = fixp->fx_addnumber;
1198 else
1199 reloc->addend = (section->vma
1200 /* Explicit sign extension in case char is
1201 unsigned. */
1202 + ((fixp->fx_pcrel_adjust & 0xff) ^ 0x80) - 0x80
1203 + fixp->fx_addnumber
1204 + md_pcrel_from (fixp));
1205 #endif
1207 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
1208 assert (reloc->howto != 0);
1210 return reloc;
1213 /* Handle of the OPCODE hash table. NULL means any use before
1214 m68k_ip_begin() will crash. */
1215 static struct hash_control *op_hash;
1217 /* Assemble an m68k instruction. */
1219 static void
1220 m68k_ip (char *instring)
1222 register char *p;
1223 register struct m68k_op *opP;
1224 register const struct m68k_incant *opcode;
1225 register const char *s;
1226 register int tmpreg = 0, baseo = 0, outro = 0, nextword;
1227 char *pdot, *pdotmove;
1228 enum m68k_size siz1, siz2;
1229 char c;
1230 int losing;
1231 int opsfound;
1232 struct m68k_op operands_backup[6];
1233 LITTLENUM_TYPE words[6];
1234 LITTLENUM_TYPE *wordp;
1235 unsigned long ok_arch = 0;
1237 if (*instring == ' ')
1238 instring++; /* Skip leading whitespace. */
1240 /* Scan up to end of operation-code, which MUST end in end-of-string
1241 or exactly 1 space. */
1242 pdot = 0;
1243 for (p = instring; *p != '\0'; p++)
1245 if (*p == ' ')
1246 break;
1247 if (*p == '.')
1248 pdot = p;
1251 if (p == instring)
1253 the_ins.error = _("No operator");
1254 return;
1257 /* p now points to the end of the opcode name, probably whitespace.
1258 Make sure the name is null terminated by clobbering the
1259 whitespace, look it up in the hash table, then fix it back.
1260 Remove a dot, first, since the opcode tables have none. */
1261 if (pdot != NULL)
1263 for (pdotmove = pdot; pdotmove < p; pdotmove++)
1264 *pdotmove = pdotmove[1];
1265 p--;
1268 c = *p;
1269 *p = '\0';
1270 opcode = (const struct m68k_incant *) hash_find (op_hash, instring);
1271 *p = c;
1273 if (pdot != NULL)
1275 for (pdotmove = p; pdotmove > pdot; pdotmove--)
1276 *pdotmove = pdotmove[-1];
1277 *pdot = '.';
1278 ++p;
1281 if (opcode == NULL)
1283 the_ins.error = _("Unknown operator");
1284 return;
1287 /* Found a legitimate opcode, start matching operands. */
1288 while (*p == ' ')
1289 ++p;
1291 if (opcode->m_operands == 0)
1293 char *old = input_line_pointer;
1294 *old = '\n';
1295 input_line_pointer = p;
1296 /* Ahh - it's a motorola style psuedo op. */
1297 mote_pseudo_table[opcode->m_opnum].poc_handler
1298 (mote_pseudo_table[opcode->m_opnum].poc_val);
1299 input_line_pointer = old;
1300 *old = 0;
1302 return;
1305 if (flag_mri && opcode->m_opnum == 0)
1307 /* In MRI mode, random garbage is allowed after an instruction
1308 which accepts no operands. */
1309 the_ins.args = opcode->m_operands;
1310 the_ins.numargs = opcode->m_opnum;
1311 the_ins.numo = opcode->m_codenum;
1312 the_ins.opcode[0] = getone (opcode);
1313 the_ins.opcode[1] = gettwo (opcode);
1314 return;
1317 for (opP = &the_ins.operands[0]; *p; opP++)
1319 p = crack_operand (p, opP);
1321 if (opP->error)
1323 the_ins.error = opP->error;
1324 return;
1328 opsfound = opP - &the_ins.operands[0];
1330 /* This ugly hack is to support the floating pt opcodes in their
1331 standard form. Essentially, we fake a first enty of type COP#1 */
1332 if (opcode->m_operands[0] == 'I')
1334 int n;
1336 for (n = opsfound; n > 0; --n)
1337 the_ins.operands[n] = the_ins.operands[n - 1];
1339 memset (&the_ins.operands[0], '\0', sizeof (the_ins.operands[0]));
1340 the_ins.operands[0].mode = CONTROL;
1341 the_ins.operands[0].reg = m68k_float_copnum;
1342 opsfound++;
1345 /* We've got the operands. Find an opcode that'll accept them. */
1346 for (losing = 0;;)
1348 /* If we didn't get the right number of ops, or we have no
1349 common model with this pattern then reject this pattern. */
1351 ok_arch |= opcode->m_arch;
1352 if (opsfound != opcode->m_opnum
1353 || ((opcode->m_arch & current_architecture) == 0))
1354 ++losing;
1355 else
1357 int i;
1359 /* Make a copy of the operands of this insn so that
1360 we can modify them safely, should we want to. */
1361 assert (opsfound <= (int) ARRAY_SIZE (operands_backup));
1362 for (i = 0; i < opsfound; i++)
1363 operands_backup[i] = the_ins.operands[i];
1365 for (s = opcode->m_operands, opP = &operands_backup[0];
1366 *s && !losing;
1367 s += 2, opP++)
1369 /* Warning: this switch is huge! */
1370 /* I've tried to organize the cases into this order:
1371 non-alpha first, then alpha by letter. Lower-case
1372 goes directly before uppercase counterpart. */
1373 /* Code with multiple case ...: gets sorted by the lowest
1374 case ... it belongs to. I hope this makes sense. */
1375 switch (*s)
1377 case '!':
1378 switch (opP->mode)
1380 case IMMED:
1381 case DREG:
1382 case AREG:
1383 case FPREG:
1384 case CONTROL:
1385 case AINC:
1386 case ADEC:
1387 case REGLST:
1388 losing++;
1389 break;
1390 default:
1391 break;
1393 break;
1395 case '<':
1396 switch (opP->mode)
1398 case DREG:
1399 case AREG:
1400 case FPREG:
1401 case CONTROL:
1402 case IMMED:
1403 case ADEC:
1404 case REGLST:
1405 losing++;
1406 break;
1407 default:
1408 break;
1410 break;
1412 case '>':
1413 switch (opP->mode)
1415 case DREG:
1416 case AREG:
1417 case FPREG:
1418 case CONTROL:
1419 case IMMED:
1420 case AINC:
1421 case REGLST:
1422 losing++;
1423 break;
1424 case ABSL:
1425 break;
1426 default:
1427 if (opP->reg == PC
1428 || opP->reg == ZPC)
1429 losing++;
1430 break;
1432 break;
1434 case 'm':
1435 switch (opP->mode)
1437 case DREG:
1438 case AREG:
1439 case AINDR:
1440 case AINC:
1441 case ADEC:
1442 break;
1443 default:
1444 losing++;
1446 break;
1448 case 'n':
1449 switch (opP->mode)
1451 case DISP:
1452 break;
1453 default:
1454 losing++;
1456 break;
1458 case 'o':
1459 switch (opP->mode)
1461 case BASE:
1462 case ABSL:
1463 case IMMED:
1464 break;
1465 default:
1466 losing++;
1468 break;
1470 case 'p':
1471 switch (opP->mode)
1473 case DREG:
1474 case AREG:
1475 case AINDR:
1476 case AINC:
1477 case ADEC:
1478 break;
1479 case DISP:
1480 if (opP->reg == PC || opP->reg == ZPC)
1481 losing++;
1482 break;
1483 default:
1484 losing++;
1486 break;
1488 case 'q':
1489 switch (opP->mode)
1491 case DREG:
1492 case AINDR:
1493 case AINC:
1494 case ADEC:
1495 break;
1496 case DISP:
1497 if (opP->reg == PC || opP->reg == ZPC)
1498 losing++;
1499 break;
1500 default:
1501 losing++;
1502 break;
1504 break;
1506 case 'v':
1507 switch (opP->mode)
1509 case DREG:
1510 case AINDR:
1511 case AINC:
1512 case ADEC:
1513 case ABSL:
1514 break;
1515 case DISP:
1516 if (opP->reg == PC || opP->reg == ZPC)
1517 losing++;
1518 break;
1519 default:
1520 losing++;
1521 break;
1523 break;
1525 case '#':
1526 if (opP->mode != IMMED)
1527 losing++;
1528 else if (s[1] == 'b'
1529 && ! isvar (&opP->disp)
1530 && (opP->disp.exp.X_op != O_constant
1531 || ! isbyte (opP->disp.exp.X_add_number)))
1532 losing++;
1533 else if (s[1] == 'B'
1534 && ! isvar (&opP->disp)
1535 && (opP->disp.exp.X_op != O_constant
1536 || ! issbyte (opP->disp.exp.X_add_number)))
1537 losing++;
1538 else if (s[1] == 'w'
1539 && ! isvar (&opP->disp)
1540 && (opP->disp.exp.X_op != O_constant
1541 || ! isword (opP->disp.exp.X_add_number)))
1542 losing++;
1543 else if (s[1] == 'W'
1544 && ! isvar (&opP->disp)
1545 && (opP->disp.exp.X_op != O_constant
1546 || ! issword (opP->disp.exp.X_add_number)))
1547 losing++;
1548 break;
1550 case '^':
1551 case 'T':
1552 if (opP->mode != IMMED)
1553 losing++;
1554 break;
1556 case '$':
1557 if (opP->mode == AREG
1558 || opP->mode == CONTROL
1559 || opP->mode == FPREG
1560 || opP->mode == IMMED
1561 || opP->mode == REGLST
1562 || (opP->mode != ABSL
1563 && (opP->reg == PC
1564 || opP->reg == ZPC)))
1565 losing++;
1566 break;
1568 case '%':
1569 if (opP->mode == CONTROL
1570 || opP->mode == FPREG
1571 || opP->mode == REGLST
1572 || opP->mode == IMMED
1573 || (opP->mode != ABSL
1574 && (opP->reg == PC
1575 || opP->reg == ZPC)))
1576 losing++;
1577 break;
1579 case '&':
1580 switch (opP->mode)
1582 case DREG:
1583 case AREG:
1584 case FPREG:
1585 case CONTROL:
1586 case IMMED:
1587 case AINC:
1588 case ADEC:
1589 case REGLST:
1590 losing++;
1591 break;
1592 case ABSL:
1593 break;
1594 default:
1595 if (opP->reg == PC
1596 || opP->reg == ZPC)
1597 losing++;
1598 break;
1600 break;
1602 case '*':
1603 if (opP->mode == CONTROL
1604 || opP->mode == FPREG
1605 || opP->mode == REGLST)
1606 losing++;
1607 break;
1609 case '+':
1610 if (opP->mode != AINC)
1611 losing++;
1612 break;
1614 case '-':
1615 if (opP->mode != ADEC)
1616 losing++;
1617 break;
1619 case '/':
1620 switch (opP->mode)
1622 case AREG:
1623 case CONTROL:
1624 case FPREG:
1625 case AINC:
1626 case ADEC:
1627 case IMMED:
1628 case REGLST:
1629 losing++;
1630 break;
1631 default:
1632 break;
1634 break;
1636 case ';':
1637 switch (opP->mode)
1639 case AREG:
1640 case CONTROL:
1641 case FPREG:
1642 case REGLST:
1643 losing++;
1644 break;
1645 default:
1646 break;
1648 break;
1650 case '?':
1651 switch (opP->mode)
1653 case AREG:
1654 case CONTROL:
1655 case FPREG:
1656 case AINC:
1657 case ADEC:
1658 case IMMED:
1659 case REGLST:
1660 losing++;
1661 break;
1662 case ABSL:
1663 break;
1664 default:
1665 if (opP->reg == PC || opP->reg == ZPC)
1666 losing++;
1667 break;
1669 break;
1671 case '@':
1672 switch (opP->mode)
1674 case AREG:
1675 case CONTROL:
1676 case FPREG:
1677 case IMMED:
1678 case REGLST:
1679 losing++;
1680 break;
1681 default:
1682 break;
1684 break;
1686 case '~': /* For now! (JF FOO is this right?) */
1687 switch (opP->mode)
1689 case DREG:
1690 case AREG:
1691 case CONTROL:
1692 case FPREG:
1693 case IMMED:
1694 case REGLST:
1695 losing++;
1696 break;
1697 case ABSL:
1698 break;
1699 default:
1700 if (opP->reg == PC
1701 || opP->reg == ZPC)
1702 losing++;
1703 break;
1705 break;
1707 case '3':
1708 if (opP->mode != CONTROL
1709 || (opP->reg != TT0 && opP->reg != TT1))
1710 losing++;
1711 break;
1713 case 'A':
1714 if (opP->mode != AREG)
1715 losing++;
1716 break;
1718 case 'a':
1719 if (opP->mode != AINDR)
1720 ++losing;
1721 break;
1723 case '4':
1724 if (opP->mode != AINDR && opP->mode != AINC && opP->mode != ADEC
1725 && (opP->mode != DISP
1726 || opP->reg < ADDR0
1727 || opP->reg > ADDR7))
1728 ++losing;
1729 break;
1731 case 'B': /* FOO */
1732 if (opP->mode != ABSL
1733 || (flag_long_jumps
1734 && strncmp (instring, "jbsr", 4) == 0))
1735 losing++;
1736 break;
1738 case 'b':
1739 switch (opP->mode)
1741 case IMMED:
1742 case ABSL:
1743 case AREG:
1744 case FPREG:
1745 case CONTROL:
1746 case POST:
1747 case PRE:
1748 case REGLST:
1749 losing++;
1750 break;
1751 default:
1752 break;
1754 break;
1756 case 'C':
1757 if (opP->mode != CONTROL || opP->reg != CCR)
1758 losing++;
1759 break;
1761 case 'd':
1762 if (opP->mode != DISP
1763 || opP->reg < ADDR0
1764 || opP->reg > ADDR7)
1765 losing++;
1766 break;
1768 case 'D':
1769 if (opP->mode != DREG)
1770 losing++;
1771 break;
1773 case 'E':
1774 if (opP->reg != ACC)
1775 losing++;
1776 break;
1778 case 'e':
1779 if (opP->reg != ACC && opP->reg != ACC1
1780 && opP->reg != ACC2 && opP->reg != ACC3)
1781 losing++;
1782 break;
1784 case 'F':
1785 if (opP->mode != FPREG)
1786 losing++;
1787 break;
1789 case 'G':
1790 if (opP->reg != MACSR)
1791 losing++;
1792 break;
1794 case 'g':
1795 if (opP->reg != ACCEXT01 && opP->reg != ACCEXT23)
1796 losing++;
1797 break;
1799 case 'H':
1800 if (opP->reg != MASK)
1801 losing++;
1802 break;
1804 case 'I':
1805 if (opP->mode != CONTROL
1806 || opP->reg < COP0
1807 || opP->reg > COP7)
1808 losing++;
1809 break;
1811 case 'i':
1812 if (opP->mode != LSH && opP->mode != RSH)
1813 losing++;
1814 break;
1816 case 'J':
1817 if (opP->mode != CONTROL
1818 || opP->reg < USP
1819 || opP->reg > last_movec_reg
1820 || !control_regs)
1821 losing++;
1822 else
1824 const enum m68k_register *rp;
1826 for (rp = control_regs; *rp; rp++)
1828 if (*rp == opP->reg)
1829 break;
1830 /* In most CPUs RAMBAR refers to control reg
1831 c05 (RAMBAR1), but a few CPUs have it
1832 refer to c04 (RAMBAR0). */
1833 else if (*rp == RAMBAR_ALT && opP->reg == RAMBAR)
1835 opP->reg = RAMBAR_ALT;
1836 break;
1839 if (*rp == 0)
1840 losing++;
1842 break;
1844 case 'k':
1845 if (opP->mode != IMMED)
1846 losing++;
1847 break;
1849 case 'l':
1850 case 'L':
1851 if (opP->mode == DREG
1852 || opP->mode == AREG
1853 || opP->mode == FPREG)
1855 if (s[1] == '8')
1856 losing++;
1857 else
1859 switch (opP->mode)
1861 case DREG:
1862 opP->mask = 1 << (opP->reg - DATA0);
1863 break;
1864 case AREG:
1865 opP->mask = 1 << (opP->reg - ADDR0 + 8);
1866 break;
1867 case FPREG:
1868 opP->mask = 1 << (opP->reg - FP0 + 16);
1869 break;
1870 default:
1871 abort ();
1873 opP->mode = REGLST;
1876 else if (opP->mode == CONTROL)
1878 if (s[1] != '8')
1879 losing++;
1880 else
1882 switch (opP->reg)
1884 case FPI:
1885 opP->mask = 1 << 24;
1886 break;
1887 case FPS:
1888 opP->mask = 1 << 25;
1889 break;
1890 case FPC:
1891 opP->mask = 1 << 26;
1892 break;
1893 default:
1894 losing++;
1895 break;
1897 opP->mode = REGLST;
1900 else if (opP->mode != REGLST)
1901 losing++;
1902 else if (s[1] == '8' && (opP->mask & 0x0ffffff) != 0)
1903 losing++;
1904 else if (s[1] == '3' && (opP->mask & 0x7000000) != 0)
1905 losing++;
1906 break;
1908 case 'M':
1909 if (opP->mode != IMMED)
1910 losing++;
1911 else if (opP->disp.exp.X_op != O_constant
1912 || ! issbyte (opP->disp.exp.X_add_number))
1913 losing++;
1914 else if (! m68k_quick
1915 && instring[3] != 'q'
1916 && instring[4] != 'q')
1917 losing++;
1918 break;
1920 case 'O':
1921 if (opP->mode != DREG
1922 && opP->mode != IMMED
1923 && opP->mode != ABSL)
1924 losing++;
1925 break;
1927 case 'Q':
1928 if (opP->mode != IMMED)
1929 losing++;
1930 else if (opP->disp.exp.X_op != O_constant
1931 || TRUNC (opP->disp.exp.X_add_number) - 1 > 7)
1932 losing++;
1933 else if (! m68k_quick
1934 && (strncmp (instring, "add", 3) == 0
1935 || strncmp (instring, "sub", 3) == 0)
1936 && instring[3] != 'q')
1937 losing++;
1938 break;
1940 case 'R':
1941 if (opP->mode != DREG && opP->mode != AREG)
1942 losing++;
1943 break;
1945 case 'r':
1946 if (opP->mode != AINDR
1947 && (opP->mode != BASE
1948 || (opP->reg != 0
1949 && opP->reg != ZADDR0)
1950 || opP->disp.exp.X_op != O_absent
1951 || ((opP->index.reg < DATA0
1952 || opP->index.reg > DATA7)
1953 && (opP->index.reg < ADDR0
1954 || opP->index.reg > ADDR7))
1955 || opP->index.size != SIZE_UNSPEC
1956 || opP->index.scale != 1))
1957 losing++;
1958 break;
1960 case 's':
1961 if (opP->mode != CONTROL
1962 || ! (opP->reg == FPI
1963 || opP->reg == FPS
1964 || opP->reg == FPC))
1965 losing++;
1966 break;
1968 case 'S':
1969 if (opP->mode != CONTROL || opP->reg != SR)
1970 losing++;
1971 break;
1973 case 't':
1974 if (opP->mode != IMMED)
1975 losing++;
1976 else if (opP->disp.exp.X_op != O_constant
1977 || TRUNC (opP->disp.exp.X_add_number) > 7)
1978 losing++;
1979 break;
1981 case 'U':
1982 if (opP->mode != CONTROL || opP->reg != USP)
1983 losing++;
1984 break;
1986 case 'x':
1987 if (opP->mode != IMMED)
1988 losing++;
1989 else if (opP->disp.exp.X_op != O_constant
1990 || (TRUNC (opP->disp.exp.X_add_number) != 0xffffffff
1991 && TRUNC (opP->disp.exp.X_add_number) - 1 > 6))
1992 losing++;
1993 break;
1995 case 'j':
1996 if (opP->mode != IMMED)
1997 losing++;
1998 else if (opP->disp.exp.X_op != O_constant
1999 || TRUNC (opP->disp.exp.X_add_number) - 1 > 7)
2000 losing++;
2001 break;
2003 case 'K':
2004 if (opP->mode != IMMED)
2005 losing++;
2006 else if (opP->disp.exp.X_op != O_constant
2007 || TRUNC (opP->disp.exp.X_add_number) > 511)
2008 losing++;
2009 break;
2011 /* JF these are out of order. We could put them
2012 in order if we were willing to put up with
2013 bunches of #ifdef m68851s in the code.
2015 Don't forget that you need these operands
2016 to use 68030 MMU instructions. */
2017 #ifndef NO_68851
2018 /* Memory addressing mode used by pflushr. */
2019 case '|':
2020 if (opP->mode == CONTROL
2021 || opP->mode == FPREG
2022 || opP->mode == DREG
2023 || opP->mode == AREG
2024 || opP->mode == REGLST)
2025 losing++;
2026 /* We should accept immediate operands, but they
2027 supposedly have to be quad word, and we don't
2028 handle that. I would like to see what a Motorola
2029 assembler does before doing something here. */
2030 if (opP->mode == IMMED)
2031 losing++;
2032 break;
2034 case 'f':
2035 if (opP->mode != CONTROL
2036 || (opP->reg != SFC && opP->reg != DFC))
2037 losing++;
2038 break;
2040 case '0':
2041 if (opP->mode != CONTROL || opP->reg != TC)
2042 losing++;
2043 break;
2045 case '1':
2046 if (opP->mode != CONTROL || opP->reg != AC)
2047 losing++;
2048 break;
2050 case '2':
2051 if (opP->mode != CONTROL
2052 || (opP->reg != CAL
2053 && opP->reg != VAL
2054 && opP->reg != SCC))
2055 losing++;
2056 break;
2058 case 'V':
2059 if (opP->mode != CONTROL
2060 || opP->reg != VAL)
2061 losing++;
2062 break;
2064 case 'W':
2065 if (opP->mode != CONTROL
2066 || (opP->reg != DRP
2067 && opP->reg != SRP
2068 && opP->reg != CRP))
2069 losing++;
2070 break;
2072 case 'w':
2073 switch (opP->mode)
2075 case IMMED:
2076 case ABSL:
2077 case AREG:
2078 case DREG:
2079 case FPREG:
2080 case CONTROL:
2081 case POST:
2082 case PRE:
2083 case REGLST:
2084 losing++;
2085 break;
2086 default:
2087 break;
2089 break;
2091 case 'X':
2092 if (opP->mode != CONTROL
2093 || (!(opP->reg >= BAD && opP->reg <= BAD + 7)
2094 && !(opP->reg >= BAC && opP->reg <= BAC + 7)))
2095 losing++;
2096 break;
2098 case 'Y':
2099 if (opP->mode != CONTROL || opP->reg != PSR)
2100 losing++;
2101 break;
2103 case 'Z':
2104 if (opP->mode != CONTROL || opP->reg != PCSR)
2105 losing++;
2106 break;
2107 #endif
2108 case 'c':
2109 if (opP->mode != CONTROL
2110 || (opP->reg != NC
2111 && opP->reg != IC
2112 && opP->reg != DC
2113 && opP->reg != BC))
2114 losing++;
2115 break;
2117 case '_':
2118 if (opP->mode != ABSL)
2119 ++losing;
2120 break;
2122 case 'u':
2123 if (opP->reg < DATA0L || opP->reg > ADDR7U)
2124 losing++;
2125 /* FIXME: kludge instead of fixing parser:
2126 upper/lower registers are *not* CONTROL
2127 registers, but ordinary ones. */
2128 if ((opP->reg >= DATA0L && opP->reg <= DATA7L)
2129 || (opP->reg >= DATA0U && opP->reg <= DATA7U))
2130 opP->mode = DREG;
2131 else
2132 opP->mode = AREG;
2133 break;
2135 case 'y':
2136 if (!(opP->mode == AINDR
2137 || (opP->mode == DISP
2138 && !(opP->reg == PC || opP->reg == ZPC))))
2139 losing++;
2140 break;
2142 case 'z':
2143 if (!(opP->mode == AINDR || opP->mode == DISP))
2144 losing++;
2145 break;
2147 default:
2148 abort ();
2151 if (losing)
2152 break;
2155 /* Since we have found the correct instruction, copy
2156 in the modifications that we may have made. */
2157 if (!losing)
2158 for (i = 0; i < opsfound; i++)
2159 the_ins.operands[i] = operands_backup[i];
2162 if (!losing)
2163 break;
2165 opcode = opcode->m_next;
2167 if (!opcode)
2169 if (ok_arch
2170 && !(ok_arch & current_architecture))
2172 const struct m68k_cpu *cpu;
2173 int any = 0;
2174 size_t space = 400;
2175 char *buf = xmalloc (space + 1);
2176 size_t len;
2177 int paren = 1;
2179 the_ins.error = buf;
2180 /* Make sure there's a NUL at the end of the buffer -- strncpy
2181 won't write one when it runs out of buffer. */
2182 buf[space] = 0;
2183 #define APPEND(STRING) \
2184 (strncpy (buf, STRING, space), len = strlen (buf), buf += len, space -= len)
2186 APPEND (_("invalid instruction for this architecture; needs "));
2187 switch (ok_arch)
2189 case mcfisa_a:
2190 APPEND ("ColdFire ISA_A");
2191 break;
2192 case mcfhwdiv:
2193 APPEND ("ColdFire ");
2194 APPEND (_("hardware divide"));
2195 break;
2196 case mcfisa_aa:
2197 APPEND ("ColdFire ISA_A+");
2198 break;
2199 case mcfisa_b:
2200 APPEND ("ColdFire ISA_B");
2201 break;
2202 case mcfisa_c:
2203 APPEND ("ColdFire ISA_C");
2204 break;
2205 case cfloat:
2206 APPEND ("ColdFire fpu");
2207 break;
2208 case mfloat:
2209 APPEND ("M68K fpu");
2210 break;
2211 case mmmu:
2212 APPEND ("M68K mmu");
2213 break;
2214 case m68020up:
2215 APPEND ("68020 ");
2216 APPEND (_("or higher"));
2217 break;
2218 case m68000up:
2219 APPEND ("68000 ");
2220 APPEND (_("or higher"));
2221 break;
2222 case m68010up:
2223 APPEND ("68010 ");
2224 APPEND (_("or higher"));
2225 break;
2226 default:
2227 paren = 0;
2229 if (paren)
2230 APPEND (" (");
2232 for (cpu = m68k_cpus; cpu->name; cpu++)
2233 if (!cpu->alias && (cpu->arch & ok_arch))
2235 const struct m68k_cpu *alias;
2236 int seen_master = 0;
2238 if (any)
2239 APPEND (", ");
2240 any = 0;
2241 APPEND (cpu->name);
2242 for (alias = cpu; alias != m68k_cpus; alias--)
2243 if (alias[-1].alias >= 0)
2244 break;
2245 for (; !seen_master || alias->alias > 0; alias++)
2247 if (!alias->alias)
2248 seen_master = 1;
2249 else
2251 if (any)
2252 APPEND (", ");
2253 else
2254 APPEND (" [");
2255 APPEND (alias->name);
2256 any = 1;
2259 if (any)
2260 APPEND ("]");
2261 any = 1;
2263 if (paren)
2264 APPEND (")");
2265 #undef APPEND
2266 if (!space)
2268 /* We ran out of space, so replace the end of the list
2269 with ellipsis. */
2270 buf -= 4;
2271 while (*buf != ' ')
2272 buf--;
2273 strcpy (buf, " ...");
2276 else
2277 the_ins.error = _("operands mismatch");
2278 return;
2281 losing = 0;
2284 /* Now assemble it. */
2285 the_ins.args = opcode->m_operands;
2286 the_ins.numargs = opcode->m_opnum;
2287 the_ins.numo = opcode->m_codenum;
2288 the_ins.opcode[0] = getone (opcode);
2289 the_ins.opcode[1] = gettwo (opcode);
2291 for (s = the_ins.args, opP = &the_ins.operands[0]; *s; s += 2, opP++)
2293 int have_disp = 0;
2294 int use_pl = 0;
2296 /* This switch is a doozy.
2297 Watch the first step; its a big one! */
2298 switch (s[0])
2301 case '*':
2302 case '~':
2303 case '%':
2304 case ';':
2305 case '@':
2306 case '!':
2307 case '&':
2308 case '$':
2309 case '?':
2310 case '/':
2311 case '<':
2312 case '>':
2313 case 'b':
2314 case 'm':
2315 case 'n':
2316 case 'o':
2317 case 'p':
2318 case 'q':
2319 case 'v':
2320 case 'w':
2321 case 'y':
2322 case 'z':
2323 case '4':
2324 #ifndef NO_68851
2325 case '|':
2326 #endif
2327 switch (opP->mode)
2329 case IMMED:
2330 tmpreg = 0x3c; /* 7.4 */
2331 if (strchr ("bwl", s[1]))
2332 nextword = get_num (&opP->disp, 90);
2333 else
2334 nextword = get_num (&opP->disp, 0);
2335 if (isvar (&opP->disp))
2336 add_fix (s[1], &opP->disp, 0, 0);
2337 switch (s[1])
2339 case 'b':
2340 if (!isbyte (nextword))
2341 opP->error = _("operand out of range");
2342 addword (nextword);
2343 baseo = 0;
2344 break;
2345 case 'w':
2346 if (!isword (nextword))
2347 opP->error = _("operand out of range");
2348 addword (nextword);
2349 baseo = 0;
2350 break;
2351 case 'W':
2352 if (!issword (nextword))
2353 opP->error = _("operand out of range");
2354 addword (nextword);
2355 baseo = 0;
2356 break;
2357 case 'l':
2358 addword (nextword >> 16);
2359 addword (nextword);
2360 baseo = 0;
2361 break;
2363 case 'f':
2364 baseo = 2;
2365 outro = 8;
2366 break;
2367 case 'F':
2368 baseo = 4;
2369 outro = 11;
2370 break;
2371 case 'x':
2372 baseo = 6;
2373 outro = 15;
2374 break;
2375 case 'p':
2376 baseo = 6;
2377 outro = -1;
2378 break;
2379 default:
2380 abort ();
2382 if (!baseo)
2383 break;
2385 /* We gotta put out some float. */
2386 if (op (&opP->disp) != O_big)
2388 valueT val;
2389 int gencnt;
2391 /* Can other cases happen here? */
2392 if (op (&opP->disp) != O_constant)
2393 abort ();
2395 val = (valueT) offs (&opP->disp);
2396 gencnt = 0;
2399 generic_bignum[gencnt] = (LITTLENUM_TYPE) val;
2400 val >>= LITTLENUM_NUMBER_OF_BITS;
2401 ++gencnt;
2403 while (val != 0);
2404 offs (&opP->disp) = gencnt;
2406 if (offs (&opP->disp) > 0)
2408 if (offs (&opP->disp) > baseo)
2410 as_warn (_("Bignum too big for %c format; truncated"),
2411 s[1]);
2412 offs (&opP->disp) = baseo;
2414 baseo -= offs (&opP->disp);
2415 while (baseo--)
2416 addword (0);
2417 for (wordp = generic_bignum + offs (&opP->disp) - 1;
2418 offs (&opP->disp)--;
2419 --wordp)
2420 addword (*wordp);
2421 break;
2423 gen_to_words (words, baseo, (long) outro);
2424 for (wordp = words; baseo--; wordp++)
2425 addword (*wordp);
2426 break;
2427 case DREG:
2428 tmpreg = opP->reg - DATA; /* 0.dreg */
2429 break;
2430 case AREG:
2431 tmpreg = 0x08 + opP->reg - ADDR; /* 1.areg */
2432 break;
2433 case AINDR:
2434 tmpreg = 0x10 + opP->reg - ADDR; /* 2.areg */
2435 break;
2436 case ADEC:
2437 tmpreg = 0x20 + opP->reg - ADDR; /* 4.areg */
2438 break;
2439 case AINC:
2440 tmpreg = 0x18 + opP->reg - ADDR; /* 3.areg */
2441 break;
2442 case DISP:
2444 nextword = get_num (&opP->disp, 90);
2446 /* Convert mode 5 addressing with a zero offset into
2447 mode 2 addressing to reduce the instruction size by a
2448 word. */
2449 if (! isvar (&opP->disp)
2450 && (nextword == 0)
2451 && (opP->disp.size == SIZE_UNSPEC)
2452 && (opP->reg >= ADDR0)
2453 && (opP->reg <= ADDR7))
2455 tmpreg = 0x10 + opP->reg - ADDR; /* 2.areg */
2456 break;
2459 if (opP->reg == PC
2460 && ! isvar (&opP->disp)
2461 && m68k_abspcadd)
2463 opP->disp.exp.X_op = O_symbol;
2464 opP->disp.exp.X_add_symbol =
2465 section_symbol (absolute_section);
2468 /* Force into index mode. Hope this works. */
2470 /* We do the first bit for 32-bit displacements, and the
2471 second bit for 16 bit ones. It is possible that we
2472 should make the default be WORD instead of LONG, but
2473 I think that'd break GCC, so we put up with a little
2474 inefficiency for the sake of working output. */
2476 if (!issword (nextword)
2477 || (isvar (&opP->disp)
2478 && ((opP->disp.size == SIZE_UNSPEC
2479 && flag_short_refs == 0
2480 && cpu_of_arch (current_architecture) >= m68020
2481 && ! arch_coldfire_p (current_architecture))
2482 || opP->disp.size == SIZE_LONG)))
2484 if (cpu_of_arch (current_architecture) < m68020
2485 || arch_coldfire_p (current_architecture))
2486 opP->error =
2487 _("displacement too large for this architecture; needs 68020 or higher");
2488 if (opP->reg == PC)
2489 tmpreg = 0x3B; /* 7.3 */
2490 else
2491 tmpreg = 0x30 + opP->reg - ADDR; /* 6.areg */
2492 if (isvar (&opP->disp))
2494 if (opP->reg == PC)
2496 if (opP->disp.size == SIZE_LONG
2497 #ifdef OBJ_ELF
2498 /* If the displacement needs pic
2499 relocation it cannot be relaxed. */
2500 || opP->disp.pic_reloc != pic_none
2501 #endif
2504 addword (0x0170);
2505 add_fix ('l', &opP->disp, 1, 2);
2507 else
2509 add_frag (adds (&opP->disp),
2510 SEXT (offs (&opP->disp)),
2511 TAB (PCREL1632, SZ_UNDEF));
2512 break;
2515 else
2517 addword (0x0170);
2518 add_fix ('l', &opP->disp, 0, 0);
2521 else
2522 addword (0x0170);
2523 addword (nextword >> 16);
2525 else
2527 if (opP->reg == PC)
2528 tmpreg = 0x3A; /* 7.2 */
2529 else
2530 tmpreg = 0x28 + opP->reg - ADDR; /* 5.areg */
2532 if (isvar (&opP->disp))
2534 if (opP->reg == PC)
2536 add_fix ('w', &opP->disp, 1, 0);
2538 else
2539 add_fix ('w', &opP->disp, 0, 0);
2542 addword (nextword);
2543 break;
2545 case POST:
2546 case PRE:
2547 case BASE:
2548 nextword = 0;
2549 baseo = get_num (&opP->disp, 90);
2550 if (opP->mode == POST || opP->mode == PRE)
2551 outro = get_num (&opP->odisp, 90);
2552 /* Figure out the `addressing mode'.
2553 Also turn on the BASE_DISABLE bit, if needed. */
2554 if (opP->reg == PC || opP->reg == ZPC)
2556 tmpreg = 0x3b; /* 7.3 */
2557 if (opP->reg == ZPC)
2558 nextword |= 0x80;
2560 else if (opP->reg == 0)
2562 nextword |= 0x80;
2563 tmpreg = 0x30; /* 6.garbage */
2565 else if (opP->reg >= ZADDR0 && opP->reg <= ZADDR7)
2567 nextword |= 0x80;
2568 tmpreg = 0x30 + opP->reg - ZADDR0;
2570 else
2571 tmpreg = 0x30 + opP->reg - ADDR; /* 6.areg */
2573 siz1 = opP->disp.size;
2574 if (opP->mode == POST || opP->mode == PRE)
2575 siz2 = opP->odisp.size;
2576 else
2577 siz2 = SIZE_UNSPEC;
2579 /* Index register stuff. */
2580 if (opP->index.reg != 0
2581 && opP->index.reg >= DATA
2582 && opP->index.reg <= ADDR7)
2584 nextword |= (opP->index.reg - DATA) << 12;
2586 if (opP->index.size == SIZE_LONG
2587 || (opP->index.size == SIZE_UNSPEC
2588 && m68k_index_width_default == SIZE_LONG))
2589 nextword |= 0x800;
2591 if ((opP->index.scale != 1
2592 && cpu_of_arch (current_architecture) < m68020)
2593 || (opP->index.scale == 8
2594 && (arch_coldfire_p (current_architecture)
2595 && !arch_coldfire_fpu (current_architecture))))
2597 opP->error =
2598 _("scale factor invalid on this architecture; needs cpu32 or 68020 or higher");
2601 if (arch_coldfire_p (current_architecture)
2602 && opP->index.size == SIZE_WORD)
2603 opP->error = _("invalid index size for coldfire");
2605 switch (opP->index.scale)
2607 case 1:
2608 break;
2609 case 2:
2610 nextword |= 0x200;
2611 break;
2612 case 4:
2613 nextword |= 0x400;
2614 break;
2615 case 8:
2616 nextword |= 0x600;
2617 break;
2618 default:
2619 abort ();
2621 /* IF its simple,
2622 GET US OUT OF HERE! */
2624 /* Must be INDEX, with an index register. Address
2625 register cannot be ZERO-PC, and either :b was
2626 forced, or we know it will fit. For a 68000 or
2627 68010, force this mode anyways, because the
2628 larger modes aren't supported. */
2629 if (opP->mode == BASE
2630 && ((opP->reg >= ADDR0
2631 && opP->reg <= ADDR7)
2632 || opP->reg == PC))
2634 if (siz1 == SIZE_BYTE
2635 || cpu_of_arch (current_architecture) < m68020
2636 || arch_coldfire_p (current_architecture)
2637 || (siz1 == SIZE_UNSPEC
2638 && ! isvar (&opP->disp)
2639 && issbyte (baseo)))
2641 nextword += baseo & 0xff;
2642 addword (nextword);
2643 if (isvar (&opP->disp))
2645 /* Do a byte relocation. If it doesn't
2646 fit (possible on m68000) let the
2647 fixup processing complain later. */
2648 if (opP->reg == PC)
2649 add_fix ('B', &opP->disp, 1, 1);
2650 else
2651 add_fix ('B', &opP->disp, 0, 0);
2653 else if (siz1 != SIZE_BYTE)
2655 if (siz1 != SIZE_UNSPEC)
2656 as_warn (_("Forcing byte displacement"));
2657 if (! issbyte (baseo))
2658 opP->error = _("byte displacement out of range");
2661 break;
2663 else if (siz1 == SIZE_UNSPEC
2664 && opP->reg == PC
2665 && isvar (&opP->disp)
2666 && subs (&opP->disp) == NULL
2667 #ifdef OBJ_ELF
2668 /* If the displacement needs pic
2669 relocation it cannot be relaxed. */
2670 && opP->disp.pic_reloc == pic_none
2671 #endif
2674 /* The code in md_convert_frag_1 needs to be
2675 able to adjust nextword. Call frag_grow
2676 to ensure that we have enough space in
2677 the frag obstack to make all the bytes
2678 contiguous. */
2679 frag_grow (14);
2680 nextword += baseo & 0xff;
2681 addword (nextword);
2682 add_frag (adds (&opP->disp),
2683 SEXT (offs (&opP->disp)),
2684 TAB (PCINDEX, SZ_UNDEF));
2686 break;
2690 else
2692 nextword |= 0x40; /* No index reg. */
2693 if (opP->index.reg >= ZDATA0
2694 && opP->index.reg <= ZDATA7)
2695 nextword |= (opP->index.reg - ZDATA0) << 12;
2696 else if (opP->index.reg >= ZADDR0
2697 || opP->index.reg <= ZADDR7)
2698 nextword |= (opP->index.reg - ZADDR0 + 8) << 12;
2701 /* It isn't simple. */
2703 if (cpu_of_arch (current_architecture) < m68020
2704 || arch_coldfire_p (current_architecture))
2705 opP->error =
2706 _("invalid operand mode for this architecture; needs 68020 or higher");
2708 nextword |= 0x100;
2709 /* If the guy specified a width, we assume that it is
2710 wide enough. Maybe it isn't. If so, we lose. */
2711 switch (siz1)
2713 case SIZE_UNSPEC:
2714 if (isvar (&opP->disp)
2715 ? m68k_rel32
2716 : ! issword (baseo))
2718 siz1 = SIZE_LONG;
2719 nextword |= 0x30;
2721 else if (! isvar (&opP->disp) && baseo == 0)
2722 nextword |= 0x10;
2723 else
2725 nextword |= 0x20;
2726 siz1 = SIZE_WORD;
2728 break;
2729 case SIZE_BYTE:
2730 as_warn (_(":b not permitted; defaulting to :w"));
2731 /* Fall through. */
2732 case SIZE_WORD:
2733 nextword |= 0x20;
2734 break;
2735 case SIZE_LONG:
2736 nextword |= 0x30;
2737 break;
2740 /* Figure out inner displacement stuff. */
2741 if (opP->mode == POST || opP->mode == PRE)
2743 if (cpu_of_arch (current_architecture) & cpu32)
2744 opP->error = _("invalid operand mode for this architecture; needs 68020 or higher");
2745 switch (siz2)
2747 case SIZE_UNSPEC:
2748 if (isvar (&opP->odisp)
2749 ? m68k_rel32
2750 : ! issword (outro))
2752 siz2 = SIZE_LONG;
2753 nextword |= 0x3;
2755 else if (! isvar (&opP->odisp) && outro == 0)
2756 nextword |= 0x1;
2757 else
2759 nextword |= 0x2;
2760 siz2 = SIZE_WORD;
2762 break;
2763 case 1:
2764 as_warn (_(":b not permitted; defaulting to :w"));
2765 /* Fall through. */
2766 case 2:
2767 nextword |= 0x2;
2768 break;
2769 case 3:
2770 nextword |= 0x3;
2771 break;
2773 if (opP->mode == POST
2774 && (nextword & 0x40) == 0)
2775 nextword |= 0x04;
2777 addword (nextword);
2779 if (siz1 != SIZE_UNSPEC && isvar (&opP->disp))
2781 if (opP->reg == PC || opP->reg == ZPC)
2782 add_fix (siz1 == SIZE_LONG ? 'l' : 'w', &opP->disp, 1, 2);
2783 else
2784 add_fix (siz1 == SIZE_LONG ? 'l' : 'w', &opP->disp, 0, 0);
2786 if (siz1 == SIZE_LONG)
2787 addword (baseo >> 16);
2788 if (siz1 != SIZE_UNSPEC)
2789 addword (baseo);
2791 if (siz2 != SIZE_UNSPEC && isvar (&opP->odisp))
2792 add_fix (siz2 == SIZE_LONG ? 'l' : 'w', &opP->odisp, 0, 0);
2793 if (siz2 == SIZE_LONG)
2794 addword (outro >> 16);
2795 if (siz2 != SIZE_UNSPEC)
2796 addword (outro);
2798 break;
2800 case ABSL:
2801 nextword = get_num (&opP->disp, 90);
2802 switch (opP->disp.size)
2804 default:
2805 abort ();
2806 case SIZE_UNSPEC:
2807 if (!isvar (&opP->disp) && issword (offs (&opP->disp)))
2809 tmpreg = 0x38; /* 7.0 */
2810 addword (nextword);
2811 break;
2813 if (isvar (&opP->disp)
2814 && !subs (&opP->disp)
2815 && adds (&opP->disp)
2816 #ifdef OBJ_ELF
2817 /* If the displacement needs pic relocation it
2818 cannot be relaxed. */
2819 && opP->disp.pic_reloc == pic_none
2820 #endif
2821 && !flag_long_jumps
2822 && !strchr ("~%&$?", s[0]))
2824 tmpreg = 0x3A; /* 7.2 */
2825 add_frag (adds (&opP->disp),
2826 SEXT (offs (&opP->disp)),
2827 TAB (ABSTOPCREL, SZ_UNDEF));
2828 break;
2830 /* Fall through into long. */
2831 case SIZE_LONG:
2832 if (isvar (&opP->disp))
2833 add_fix ('l', &opP->disp, 0, 0);
2835 tmpreg = 0x39;/* 7.1 mode */
2836 addword (nextword >> 16);
2837 addword (nextword);
2838 break;
2840 case SIZE_BYTE:
2841 as_bad (_("unsupported byte value; use a different suffix"));
2842 /* Fall through. */
2844 case SIZE_WORD:
2845 if (isvar (&opP->disp))
2846 add_fix ('w', &opP->disp, 0, 0);
2848 tmpreg = 0x38;/* 7.0 mode */
2849 addword (nextword);
2850 break;
2852 break;
2853 case CONTROL:
2854 case FPREG:
2855 default:
2856 as_bad (_("unknown/incorrect operand"));
2857 /* abort (); */
2860 /* If s[0] is '4', then this is for the mac instructions
2861 that can have a trailing_ampersand set. If so, set 0x100
2862 bit on tmpreg so install_gen_operand can check for it and
2863 set the appropriate bit (word2, bit 5). */
2864 if (s[0] == '4')
2866 if (opP->trailing_ampersand)
2867 tmpreg |= 0x100;
2869 install_gen_operand (s[1], tmpreg);
2870 break;
2872 case '#':
2873 case '^':
2874 switch (s[1])
2875 { /* JF: I hate floating point! */
2876 case 'j':
2877 tmpreg = 70;
2878 break;
2879 case '8':
2880 tmpreg = 20;
2881 break;
2882 case 'C':
2883 tmpreg = 50;
2884 break;
2885 case '3':
2886 default:
2887 tmpreg = 90;
2888 break;
2890 tmpreg = get_num (&opP->disp, tmpreg);
2891 if (isvar (&opP->disp))
2892 add_fix (s[1], &opP->disp, 0, 0);
2893 switch (s[1])
2895 case 'b': /* Danger: These do no check for
2896 certain types of overflow.
2897 user beware! */
2898 if (!isbyte (tmpreg))
2899 opP->error = _("out of range");
2900 insop (tmpreg, opcode);
2901 if (isvar (&opP->disp))
2902 the_ins.reloc[the_ins.nrel - 1].n =
2903 (opcode->m_codenum) * 2 + 1;
2904 break;
2905 case 'B':
2906 if (!issbyte (tmpreg))
2907 opP->error = _("out of range");
2908 the_ins.opcode[the_ins.numo - 1] |= tmpreg & 0xff;
2909 if (isvar (&opP->disp))
2910 the_ins.reloc[the_ins.nrel - 1].n = opcode->m_codenum * 2 - 1;
2911 break;
2912 case 'w':
2913 if (!isword (tmpreg))
2914 opP->error = _("out of range");
2915 insop (tmpreg, opcode);
2916 if (isvar (&opP->disp))
2917 the_ins.reloc[the_ins.nrel - 1].n = (opcode->m_codenum) * 2;
2918 break;
2919 case 'W':
2920 if (!issword (tmpreg))
2921 opP->error = _("out of range");
2922 insop (tmpreg, opcode);
2923 if (isvar (&opP->disp))
2924 the_ins.reloc[the_ins.nrel - 1].n = (opcode->m_codenum) * 2;
2925 break;
2926 case 'l':
2927 /* Because of the way insop works, we put these two out
2928 backwards. */
2929 insop (tmpreg, opcode);
2930 insop (tmpreg >> 16, opcode);
2931 if (isvar (&opP->disp))
2932 the_ins.reloc[the_ins.nrel - 1].n = (opcode->m_codenum) * 2;
2933 break;
2934 case '3':
2935 tmpreg &= 0xFF;
2936 case '8':
2937 case 'C':
2938 case 'j':
2939 install_operand (s[1], tmpreg);
2940 break;
2941 default:
2942 abort ();
2944 break;
2946 case '+':
2947 case '-':
2948 case 'A':
2949 case 'a':
2950 install_operand (s[1], opP->reg - ADDR);
2951 break;
2953 case 'B':
2954 tmpreg = get_num (&opP->disp, 90);
2956 switch (s[1])
2958 case 'B':
2959 add_fix ('B', &opP->disp, 1, -1);
2960 break;
2961 case 'W':
2962 add_fix ('w', &opP->disp, 1, 0);
2963 addword (0);
2964 break;
2965 case 'L':
2966 long_branch:
2967 the_ins.opcode[0] |= 0xff;
2968 add_fix ('l', &opP->disp, 1, 0);
2969 addword (0);
2970 addword (0);
2971 break;
2972 case 'g': /* Conditional branch */
2973 have_disp = HAVE_LONG_CALL (current_architecture);
2974 goto var_branch;
2976 case 'b': /* Unconditional branch */
2977 have_disp = HAVE_LONG_BRANCH (current_architecture);
2978 use_pl = LONG_BRANCH_VIA_COND (current_architecture);
2979 goto var_branch;
2981 case 's': /* Unconditional subroutine */
2982 have_disp = HAVE_LONG_CALL (current_architecture);
2984 var_branch:
2985 if (subs (&opP->disp) /* We can't relax it. */
2986 #ifdef OBJ_ELF
2987 /* If the displacement needs pic relocation it cannot be
2988 relaxed. */
2989 || opP->disp.pic_reloc != pic_none
2990 #endif
2991 || 0)
2993 if (!have_disp)
2994 as_warn (_("Can't use long branches on this architecture"));
2995 goto long_branch;
2998 /* This could either be a symbol, or an absolute
2999 address. If it's an absolute address, turn it into
3000 an absolute jump right here and keep it out of the
3001 relaxer. */
3002 if (adds (&opP->disp) == 0)
3004 if (the_ins.opcode[0] == 0x6000) /* jbra */
3005 the_ins.opcode[0] = 0x4EF9;
3006 else if (the_ins.opcode[0] == 0x6100) /* jbsr */
3007 the_ins.opcode[0] = 0x4EB9;
3008 else /* jCC */
3010 the_ins.opcode[0] ^= 0x0100;
3011 the_ins.opcode[0] |= 0x0006;
3012 addword (0x4EF9);
3014 add_fix ('l', &opP->disp, 0, 0);
3015 addword (0);
3016 addword (0);
3017 break;
3020 /* Now we know it's going into the relaxer. Now figure
3021 out which mode. We try in this order of preference:
3022 long branch, absolute jump, byte/word branches only. */
3023 if (have_disp)
3024 add_frag (adds (&opP->disp),
3025 SEXT (offs (&opP->disp)),
3026 TAB (BRANCHBWL, SZ_UNDEF));
3027 else if (! flag_keep_pcrel)
3029 if ((the_ins.opcode[0] == 0x6000)
3030 || (the_ins.opcode[0] == 0x6100))
3031 add_frag (adds (&opP->disp),
3032 SEXT (offs (&opP->disp)),
3033 TAB (BRABSJUNC, SZ_UNDEF));
3034 else
3035 add_frag (adds (&opP->disp),
3036 SEXT (offs (&opP->disp)),
3037 TAB (BRABSJCOND, SZ_UNDEF));
3039 else
3040 add_frag (adds (&opP->disp),
3041 SEXT (offs (&opP->disp)),
3042 (use_pl ? TAB (BRANCHBWPL, SZ_UNDEF)
3043 : TAB (BRANCHBW, SZ_UNDEF)));
3044 break;
3045 case 'w':
3046 if (isvar (&opP->disp))
3048 /* Check for DBcc instructions. We can relax them,
3049 but only if we have long branches and/or absolute
3050 jumps. */
3051 if (((the_ins.opcode[0] & 0xf0f8) == 0x50c8)
3052 && (HAVE_LONG_BRANCH (current_architecture)
3053 || ! flag_keep_pcrel))
3055 if (HAVE_LONG_BRANCH (current_architecture))
3056 add_frag (adds (&opP->disp),
3057 SEXT (offs (&opP->disp)),
3058 TAB (DBCCLBR, SZ_UNDEF));
3059 else
3060 add_frag (adds (&opP->disp),
3061 SEXT (offs (&opP->disp)),
3062 TAB (DBCCABSJ, SZ_UNDEF));
3063 break;
3065 add_fix ('w', &opP->disp, 1, 0);
3067 addword (0);
3068 break;
3069 case 'C': /* Fixed size LONG coproc branches. */
3070 add_fix ('l', &opP->disp, 1, 0);
3071 addword (0);
3072 addword (0);
3073 break;
3074 case 'c': /* Var size Coprocesssor branches. */
3075 if (subs (&opP->disp) || (adds (&opP->disp) == 0))
3077 the_ins.opcode[the_ins.numo - 1] |= 0x40;
3078 add_fix ('l', &opP->disp, 1, 0);
3079 addword (0);
3080 addword (0);
3082 else
3083 add_frag (adds (&opP->disp),
3084 SEXT (offs (&opP->disp)),
3085 TAB (FBRANCH, SZ_UNDEF));
3086 break;
3087 default:
3088 abort ();
3090 break;
3092 case 'C': /* Ignore it. */
3093 break;
3095 case 'd': /* JF this is a kludge. */
3096 install_operand ('s', opP->reg - ADDR);
3097 tmpreg = get_num (&opP->disp, 90);
3098 if (!issword (tmpreg))
3100 as_warn (_("Expression out of range, using 0"));
3101 tmpreg = 0;
3103 addword (tmpreg);
3104 break;
3106 case 'D':
3107 install_operand (s[1], opP->reg - DATA);
3108 break;
3110 case 'e': /* EMAC ACCx, reg/reg. */
3111 install_operand (s[1], opP->reg - ACC);
3112 break;
3114 case 'E': /* Ignore it. */
3115 break;
3117 case 'F':
3118 install_operand (s[1], opP->reg - FP0);
3119 break;
3121 case 'g': /* EMAC ACCEXTx. */
3122 install_operand (s[1], opP->reg - ACCEXT01);
3123 break;
3125 case 'G': /* Ignore it. */
3126 case 'H':
3127 break;
3129 case 'I':
3130 tmpreg = opP->reg - COP0;
3131 install_operand (s[1], tmpreg);
3132 break;
3134 case 'i': /* MAC/EMAC scale factor. */
3135 install_operand (s[1], opP->mode == LSH ? 0x1 : 0x3);
3136 break;
3138 case 'J': /* JF foo. */
3139 switch (opP->reg)
3141 case SFC:
3142 tmpreg = 0x000;
3143 break;
3144 case DFC:
3145 tmpreg = 0x001;
3146 break;
3147 case CACR:
3148 tmpreg = 0x002;
3149 break;
3150 case TC:
3151 case ASID:
3152 tmpreg = 0x003;
3153 break;
3154 case ACR0:
3155 case ITT0:
3156 tmpreg = 0x004;
3157 break;
3158 case ACR1:
3159 case ITT1:
3160 tmpreg = 0x005;
3161 break;
3162 case ACR2:
3163 case DTT0:
3164 tmpreg = 0x006;
3165 break;
3166 case ACR3:
3167 case DTT1:
3168 tmpreg = 0x007;
3169 break;
3170 case BUSCR:
3171 case MMUBAR:
3172 tmpreg = 0x008;
3173 break;
3175 case USP:
3176 tmpreg = 0x800;
3177 break;
3178 case VBR:
3179 tmpreg = 0x801;
3180 break;
3181 case CAAR:
3182 tmpreg = 0x802;
3183 break;
3184 case MSP:
3185 tmpreg = 0x803;
3186 break;
3187 case ISP:
3188 tmpreg = 0x804;
3189 break;
3190 case MMUSR:
3191 tmpreg = 0x805;
3192 break;
3193 case URP:
3194 tmpreg = 0x806;
3195 break;
3196 case SRP:
3197 tmpreg = 0x807;
3198 break;
3199 case PCR:
3200 tmpreg = 0x808;
3201 break;
3202 case ROMBAR:
3203 case ROMBAR0:
3204 tmpreg = 0xC00;
3205 break;
3206 case ROMBAR1:
3207 tmpreg = 0xC01;
3208 break;
3209 case FLASHBAR:
3210 case RAMBAR0:
3211 case RAMBAR_ALT:
3212 tmpreg = 0xC04;
3213 break;
3214 case RAMBAR:
3215 case RAMBAR1:
3216 tmpreg = 0xC05;
3217 break;
3218 case MPCR:
3219 tmpreg = 0xC0C;
3220 break;
3221 case EDRAMBAR:
3222 tmpreg = 0xC0D;
3223 break;
3224 case MBAR0:
3225 case MBAR2:
3226 case SECMBAR:
3227 tmpreg = 0xC0E;
3228 break;
3229 case MBAR1:
3230 case MBAR:
3231 tmpreg = 0xC0F;
3232 break;
3233 case PCR1U0:
3234 tmpreg = 0xD02;
3235 break;
3236 case PCR1L0:
3237 tmpreg = 0xD03;
3238 break;
3239 case PCR2U0:
3240 tmpreg = 0xD04;
3241 break;
3242 case PCR2L0:
3243 tmpreg = 0xD05;
3244 break;
3245 case PCR3U0:
3246 tmpreg = 0xD06;
3247 break;
3248 case PCR3L0:
3249 tmpreg = 0xD07;
3250 break;
3251 case PCR1L1:
3252 tmpreg = 0xD0A;
3253 break;
3254 case PCR1U1:
3255 tmpreg = 0xD0B;
3256 break;
3257 case PCR2L1:
3258 tmpreg = 0xD0C;
3259 break;
3260 case PCR2U1:
3261 tmpreg = 0xD0D;
3262 break;
3263 case PCR3L1:
3264 tmpreg = 0xD0E;
3265 break;
3266 case PCR3U1:
3267 tmpreg = 0xD0F;
3268 break;
3269 case CAC:
3270 tmpreg = 0xFFE;
3271 break;
3272 case MBO:
3273 tmpreg = 0xFFF;
3274 break;
3275 default:
3276 abort ();
3278 install_operand (s[1], tmpreg);
3279 break;
3281 case 'k':
3282 tmpreg = get_num (&opP->disp, 55);
3283 install_operand (s[1], tmpreg & 0x7f);
3284 break;
3286 case 'l':
3287 tmpreg = opP->mask;
3288 if (s[1] == 'w')
3290 if (tmpreg & 0x7FF0000)
3291 as_bad (_("Floating point register in register list"));
3292 insop (reverse_16_bits (tmpreg), opcode);
3294 else
3296 if (tmpreg & 0x700FFFF)
3297 as_bad (_("Wrong register in floating-point reglist"));
3298 install_operand (s[1], reverse_8_bits (tmpreg >> 16));
3300 break;
3302 case 'L':
3303 tmpreg = opP->mask;
3304 if (s[1] == 'w')
3306 if (tmpreg & 0x7FF0000)
3307 as_bad (_("Floating point register in register list"));
3308 insop (tmpreg, opcode);
3310 else if (s[1] == '8')
3312 if (tmpreg & 0x0FFFFFF)
3313 as_bad (_("incorrect register in reglist"));
3314 install_operand (s[1], tmpreg >> 24);
3316 else
3318 if (tmpreg & 0x700FFFF)
3319 as_bad (_("wrong register in floating-point reglist"));
3320 else
3321 install_operand (s[1], tmpreg >> 16);
3323 break;
3325 case 'M':
3326 install_operand (s[1], get_num (&opP->disp, 60));
3327 break;
3329 case 'O':
3330 tmpreg = ((opP->mode == DREG)
3331 ? 0x20 + (int) (opP->reg - DATA)
3332 : (get_num (&opP->disp, 40) & 0x1F));
3333 install_operand (s[1], tmpreg);
3334 break;
3336 case 'Q':
3337 tmpreg = get_num (&opP->disp, 10);
3338 if (tmpreg == 8)
3339 tmpreg = 0;
3340 install_operand (s[1], tmpreg);
3341 break;
3343 case 'R':
3344 /* This depends on the fact that ADDR registers are eight
3345 more than their corresponding DATA regs, so the result
3346 will have the ADDR_REG bit set. */
3347 install_operand (s[1], opP->reg - DATA);
3348 break;
3350 case 'r':
3351 if (opP->mode == AINDR)
3352 install_operand (s[1], opP->reg - DATA);
3353 else
3354 install_operand (s[1], opP->index.reg - DATA);
3355 break;
3357 case 's':
3358 if (opP->reg == FPI)
3359 tmpreg = 0x1;
3360 else if (opP->reg == FPS)
3361 tmpreg = 0x2;
3362 else if (opP->reg == FPC)
3363 tmpreg = 0x4;
3364 else
3365 abort ();
3366 install_operand (s[1], tmpreg);
3367 break;
3369 case 'S': /* Ignore it. */
3370 break;
3372 case 'T':
3373 install_operand (s[1], get_num (&opP->disp, 30));
3374 break;
3376 case 'U': /* Ignore it. */
3377 break;
3379 case 'c':
3380 switch (opP->reg)
3382 case NC:
3383 tmpreg = 0;
3384 break;
3385 case DC:
3386 tmpreg = 1;
3387 break;
3388 case IC:
3389 tmpreg = 2;
3390 break;
3391 case BC:
3392 tmpreg = 3;
3393 break;
3394 default:
3395 as_fatal (_("failed sanity check"));
3396 } /* switch on cache token. */
3397 install_operand (s[1], tmpreg);
3398 break;
3399 #ifndef NO_68851
3400 /* JF: These are out of order, I fear. */
3401 case 'f':
3402 switch (opP->reg)
3404 case SFC:
3405 tmpreg = 0;
3406 break;
3407 case DFC:
3408 tmpreg = 1;
3409 break;
3410 default:
3411 abort ();
3413 install_operand (s[1], tmpreg);
3414 break;
3416 case '0':
3417 case '1':
3418 case '2':
3419 switch (opP->reg)
3421 case TC:
3422 tmpreg = 0;
3423 break;
3424 case CAL:
3425 tmpreg = 4;
3426 break;
3427 case VAL:
3428 tmpreg = 5;
3429 break;
3430 case SCC:
3431 tmpreg = 6;
3432 break;
3433 case AC:
3434 tmpreg = 7;
3435 break;
3436 default:
3437 abort ();
3439 install_operand (s[1], tmpreg);
3440 break;
3442 case 'V':
3443 if (opP->reg == VAL)
3444 break;
3445 abort ();
3447 case 'W':
3448 switch (opP->reg)
3450 case DRP:
3451 tmpreg = 1;
3452 break;
3453 case SRP:
3454 tmpreg = 2;
3455 break;
3456 case CRP:
3457 tmpreg = 3;
3458 break;
3459 default:
3460 abort ();
3462 install_operand (s[1], tmpreg);
3463 break;
3465 case 'X':
3466 switch (opP->reg)
3468 case BAD:
3469 case BAD + 1:
3470 case BAD + 2:
3471 case BAD + 3:
3472 case BAD + 4:
3473 case BAD + 5:
3474 case BAD + 6:
3475 case BAD + 7:
3476 tmpreg = (4 << 10) | ((opP->reg - BAD) << 2);
3477 break;
3479 case BAC:
3480 case BAC + 1:
3481 case BAC + 2:
3482 case BAC + 3:
3483 case BAC + 4:
3484 case BAC + 5:
3485 case BAC + 6:
3486 case BAC + 7:
3487 tmpreg = (5 << 10) | ((opP->reg - BAC) << 2);
3488 break;
3490 default:
3491 abort ();
3493 install_operand (s[1], tmpreg);
3494 break;
3495 case 'Y':
3496 know (opP->reg == PSR);
3497 break;
3498 case 'Z':
3499 know (opP->reg == PCSR);
3500 break;
3501 #endif /* m68851 */
3502 case '3':
3503 switch (opP->reg)
3505 case TT0:
3506 tmpreg = 2;
3507 break;
3508 case TT1:
3509 tmpreg = 3;
3510 break;
3511 default:
3512 abort ();
3514 install_operand (s[1], tmpreg);
3515 break;
3516 case 't':
3517 tmpreg = get_num (&opP->disp, 20);
3518 install_operand (s[1], tmpreg);
3519 break;
3520 case '_': /* used only for move16 absolute 32-bit address. */
3521 if (isvar (&opP->disp))
3522 add_fix ('l', &opP->disp, 0, 0);
3523 tmpreg = get_num (&opP->disp, 90);
3524 addword (tmpreg >> 16);
3525 addword (tmpreg & 0xFFFF);
3526 break;
3527 case 'u':
3528 install_operand (s[1], opP->reg - DATA0L);
3529 opP->reg -= (DATA0L);
3530 opP->reg &= 0x0F; /* remove upper/lower bit. */
3531 break;
3532 case 'x':
3533 tmpreg = get_num (&opP->disp, 80);
3534 if (tmpreg == -1)
3535 tmpreg = 0;
3536 install_operand (s[1], tmpreg);
3537 break;
3538 case 'j':
3539 tmpreg = get_num (&opP->disp, 10);
3540 install_operand (s[1], tmpreg - 1);
3541 break;
3542 case 'K':
3543 tmpreg = get_num (&opP->disp, 65);
3544 install_operand (s[1], tmpreg);
3545 break;
3546 default:
3547 abort ();
3551 /* By the time whe get here (FINALLY) the_ins contains the complete
3552 instruction, ready to be emitted. . . */
3555 static int
3556 reverse_16_bits (int in)
3558 int out = 0;
3559 int n;
3561 static int mask[16] =
3563 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
3564 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000
3566 for (n = 0; n < 16; n++)
3568 if (in & mask[n])
3569 out |= mask[15 - n];
3571 return out;
3572 } /* reverse_16_bits() */
3574 static int
3575 reverse_8_bits (int in)
3577 int out = 0;
3578 int n;
3580 static int mask[8] =
3582 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
3585 for (n = 0; n < 8; n++)
3587 if (in & mask[n])
3588 out |= mask[7 - n];
3590 return out;
3591 } /* reverse_8_bits() */
3593 /* Cause an extra frag to be generated here, inserting up to
3594 FRAG_VAR_SIZE bytes. TYPE is the subtype of the frag to be
3595 generated; its primary type is rs_machine_dependent.
3597 The TYPE parameter is also used by md_convert_frag_1 and
3598 md_estimate_size_before_relax. The appropriate type of fixup will
3599 be emitted by md_convert_frag_1.
3601 ADD becomes the FR_SYMBOL field of the frag, and OFF the FR_OFFSET. */
3602 static void
3603 install_operand (int mode, int val)
3605 switch (mode)
3607 case 's':
3608 the_ins.opcode[0] |= val & 0xFF; /* JF FF is for M kludge. */
3609 break;
3610 case 'd':
3611 the_ins.opcode[0] |= val << 9;
3612 break;
3613 case 'E':
3614 the_ins.opcode[1] |= val << 9;
3615 break;
3616 case '1':
3617 the_ins.opcode[1] |= val << 12;
3618 break;
3619 case '2':
3620 the_ins.opcode[1] |= val << 6;
3621 break;
3622 case '3':
3623 the_ins.opcode[1] |= val;
3624 break;
3625 case '4':
3626 the_ins.opcode[2] |= val << 12;
3627 break;
3628 case '5':
3629 the_ins.opcode[2] |= val << 6;
3630 break;
3631 case '6':
3632 /* DANGER! This is a hack to force cas2l and cas2w cmds to be
3633 three words long! */
3634 the_ins.numo++;
3635 the_ins.opcode[2] |= val;
3636 break;
3637 case '7':
3638 the_ins.opcode[1] |= val << 7;
3639 break;
3640 case '8':
3641 the_ins.opcode[1] |= val << 10;
3642 break;
3643 #ifndef NO_68851
3644 case '9':
3645 the_ins.opcode[1] |= val << 5;
3646 break;
3647 #endif
3649 case 't':
3650 the_ins.opcode[1] |= (val << 10) | (val << 7);
3651 break;
3652 case 'D':
3653 the_ins.opcode[1] |= (val << 12) | val;
3654 break;
3655 case 'g':
3656 the_ins.opcode[0] |= val = 0xff;
3657 break;
3658 case 'i':
3659 the_ins.opcode[0] |= val << 9;
3660 break;
3661 case 'C':
3662 the_ins.opcode[1] |= val;
3663 break;
3664 case 'j':
3665 the_ins.opcode[1] |= val;
3666 the_ins.numo++; /* What a hack. */
3667 break;
3668 case 'k':
3669 the_ins.opcode[1] |= val << 4;
3670 break;
3671 case 'b':
3672 case 'w':
3673 case 'W':
3674 case 'l':
3675 break;
3676 case 'e':
3677 the_ins.opcode[0] |= (val << 6);
3678 break;
3679 case 'L':
3680 the_ins.opcode[1] = (val >> 16);
3681 the_ins.opcode[2] = val & 0xffff;
3682 break;
3683 case 'm':
3684 the_ins.opcode[0] |= ((val & 0x8) << (6 - 3));
3685 the_ins.opcode[0] |= ((val & 0x7) << 9);
3686 the_ins.opcode[1] |= ((val & 0x10) << (7 - 4));
3687 break;
3688 case 'n': /* MAC/EMAC Rx on !load. */
3689 the_ins.opcode[0] |= ((val & 0x8) << (6 - 3));
3690 the_ins.opcode[0] |= ((val & 0x7) << 9);
3691 the_ins.opcode[1] |= ((val & 0x10) << (7 - 4));
3692 break;
3693 case 'o': /* MAC/EMAC Rx on load. */
3694 the_ins.opcode[1] |= val << 12;
3695 the_ins.opcode[1] |= ((val & 0x10) << (7 - 4));
3696 break;
3697 case 'M': /* MAC/EMAC Ry on !load. */
3698 the_ins.opcode[0] |= (val & 0xF);
3699 the_ins.opcode[1] |= ((val & 0x10) << (6 - 4));
3700 break;
3701 case 'N': /* MAC/EMAC Ry on load. */
3702 the_ins.opcode[1] |= (val & 0xF);
3703 the_ins.opcode[1] |= ((val & 0x10) << (6 - 4));
3704 break;
3705 case 'h':
3706 the_ins.opcode[1] |= ((val != 1) << 10);
3707 break;
3708 case 'F':
3709 the_ins.opcode[0] |= ((val & 0x3) << 9);
3710 break;
3711 case 'f':
3712 the_ins.opcode[0] |= ((val & 0x3) << 0);
3713 break;
3714 case 'G': /* EMAC accumulator in a EMAC load instruction. */
3715 the_ins.opcode[0] |= ((~val & 0x1) << 7);
3716 the_ins.opcode[1] |= ((val & 0x2) << (4 - 1));
3717 break;
3718 case 'H': /* EMAC accumulator in a EMAC non-load instruction. */
3719 the_ins.opcode[0] |= ((val & 0x1) << 7);
3720 the_ins.opcode[1] |= ((val & 0x2) << (4 - 1));
3721 break;
3722 case 'I':
3723 the_ins.opcode[1] |= ((val & 0x3) << 9);
3724 break;
3725 case ']':
3726 the_ins.opcode[0] |= (val & 0x1) <<10;
3727 break;
3728 case 'c':
3729 default:
3730 as_fatal (_("failed sanity check."));
3734 static void
3735 install_gen_operand (int mode, int val)
3737 switch (mode)
3739 case '/': /* Special for mask loads for mac/msac insns with
3740 possible mask; trailing_ampersend set in bit 8. */
3741 the_ins.opcode[0] |= (val & 0x3f);
3742 the_ins.opcode[1] |= (((val & 0x100) >> 8) << 5);
3743 break;
3744 case 's':
3745 the_ins.opcode[0] |= val;
3746 break;
3747 case 'd':
3748 /* This is a kludge!!! */
3749 the_ins.opcode[0] |= (val & 0x07) << 9 | (val & 0x38) << 3;
3750 break;
3751 case 'b':
3752 case 'w':
3753 case 'l':
3754 case 'f':
3755 case 'F':
3756 case 'x':
3757 case 'p':
3758 the_ins.opcode[0] |= val;
3759 break;
3760 /* more stuff goes here. */
3761 default:
3762 as_fatal (_("failed sanity check."));
3766 /* Verify that we have some number of paren pairs, do m68k_ip_op(), and
3767 then deal with the bitfield hack. */
3769 static char *
3770 crack_operand (char *str, struct m68k_op *opP)
3772 register int parens;
3773 register int c;
3774 register char *beg_str;
3775 int inquote = 0;
3777 if (!str)
3779 return str;
3781 beg_str = str;
3782 for (parens = 0; *str && (parens > 0 || inquote || notend (str)); str++)
3784 if (! inquote)
3786 if (*str == '(')
3787 parens++;
3788 else if (*str == ')')
3790 if (!parens)
3791 { /* ERROR. */
3792 opP->error = _("Extra )");
3793 return str;
3795 --parens;
3798 if (flag_mri && *str == '\'')
3799 inquote = ! inquote;
3801 if (!*str && parens)
3802 { /* ERROR. */
3803 opP->error = _("Missing )");
3804 return str;
3806 c = *str;
3807 *str = '\0';
3808 if (m68k_ip_op (beg_str, opP) != 0)
3810 *str = c;
3811 return str;
3813 *str = c;
3814 if (c == '}')
3815 c = *++str; /* JF bitfield hack. */
3816 if (c)
3818 c = *++str;
3819 if (!c)
3820 as_bad (_("Missing operand"));
3823 /* Detect MRI REG symbols and convert them to REGLSTs. */
3824 if (opP->mode == CONTROL && (int)opP->reg < 0)
3826 opP->mode = REGLST;
3827 opP->mask = ~(int)opP->reg;
3828 opP->reg = 0;
3831 return str;
3834 /* This is the guts of the machine-dependent assembler. STR points to a
3835 machine dependent instruction. This function is supposed to emit
3836 the frags/bytes it assembles to.
3839 static void
3840 insert_reg (const char *regname, int regnum)
3842 char buf[100];
3843 int i;
3845 #ifdef REGISTER_PREFIX
3846 if (!flag_reg_prefix_optional)
3848 buf[0] = REGISTER_PREFIX;
3849 strcpy (buf + 1, regname);
3850 regname = buf;
3852 #endif
3854 symbol_table_insert (symbol_new (regname, reg_section, regnum,
3855 &zero_address_frag));
3857 for (i = 0; regname[i]; i++)
3858 buf[i] = TOUPPER (regname[i]);
3859 buf[i] = '\0';
3861 symbol_table_insert (symbol_new (buf, reg_section, regnum,
3862 &zero_address_frag));
3865 struct init_entry
3867 const char *name;
3868 int number;
3871 static const struct init_entry init_table[] =
3873 { "d0", DATA0 },
3874 { "d1", DATA1 },
3875 { "d2", DATA2 },
3876 { "d3", DATA3 },
3877 { "d4", DATA4 },
3878 { "d5", DATA5 },
3879 { "d6", DATA6 },
3880 { "d7", DATA7 },
3881 { "a0", ADDR0 },
3882 { "a1", ADDR1 },
3883 { "a2", ADDR2 },
3884 { "a3", ADDR3 },
3885 { "a4", ADDR4 },
3886 { "a5", ADDR5 },
3887 { "a6", ADDR6 },
3888 { "fp", ADDR6 },
3889 { "a7", ADDR7 },
3890 { "sp", ADDR7 },
3891 { "ssp", ADDR7 },
3892 { "fp0", FP0 },
3893 { "fp1", FP1 },
3894 { "fp2", FP2 },
3895 { "fp3", FP3 },
3896 { "fp4", FP4 },
3897 { "fp5", FP5 },
3898 { "fp6", FP6 },
3899 { "fp7", FP7 },
3900 { "fpi", FPI },
3901 { "fpiar", FPI },
3902 { "fpc", FPI },
3903 { "fps", FPS },
3904 { "fpsr", FPS },
3905 { "fpc", FPC },
3906 { "fpcr", FPC },
3907 { "control", FPC },
3908 { "status", FPS },
3909 { "iaddr", FPI },
3911 { "cop0", COP0 },
3912 { "cop1", COP1 },
3913 { "cop2", COP2 },
3914 { "cop3", COP3 },
3915 { "cop4", COP4 },
3916 { "cop5", COP5 },
3917 { "cop6", COP6 },
3918 { "cop7", COP7 },
3919 { "pc", PC },
3920 { "zpc", ZPC },
3921 { "sr", SR },
3923 { "ccr", CCR },
3924 { "cc", CCR },
3926 { "acc", ACC },
3927 { "acc0", ACC },
3928 { "acc1", ACC1 },
3929 { "acc2", ACC2 },
3930 { "acc3", ACC3 },
3931 { "accext01", ACCEXT01 },
3932 { "accext23", ACCEXT23 },
3933 { "macsr", MACSR },
3934 { "mask", MASK },
3936 /* Control registers. */
3937 { "sfc", SFC }, /* Source Function Code. */
3938 { "sfcr", SFC },
3939 { "dfc", DFC }, /* Destination Function Code. */
3940 { "dfcr", DFC },
3941 { "cacr", CACR }, /* Cache Control Register. */
3942 { "caar", CAAR }, /* Cache Address Register. */
3944 { "usp", USP }, /* User Stack Pointer. */
3945 { "vbr", VBR }, /* Vector Base Register. */
3946 { "msp", MSP }, /* Master Stack Pointer. */
3947 { "isp", ISP }, /* Interrupt Stack Pointer. */
3949 { "itt0", ITT0 }, /* Instruction Transparent Translation Reg 0. */
3950 { "itt1", ITT1 }, /* Instruction Transparent Translation Reg 1. */
3951 { "dtt0", DTT0 }, /* Data Transparent Translation Register 0. */
3952 { "dtt1", DTT1 }, /* Data Transparent Translation Register 1. */
3954 /* 68ec040 versions of same */
3955 { "iacr0", ITT0 }, /* Instruction Access Control Register 0. */
3956 { "iacr1", ITT1 }, /* Instruction Access Control Register 0. */
3957 { "dacr0", DTT0 }, /* Data Access Control Register 0. */
3958 { "dacr1", DTT1 }, /* Data Access Control Register 0. */
3960 /* Coldfire versions of same. The ColdFire programmer's reference
3961 manual indicated that the order is 2,3,0,1, but Ken Rose
3962 <rose@netcom.com> says that 0,1,2,3 is the correct order. */
3963 { "acr0", ACR0 }, /* Access Control Unit 0. */
3964 { "acr1", ACR1 }, /* Access Control Unit 1. */
3965 { "acr2", ACR2 }, /* Access Control Unit 2. */
3966 { "acr3", ACR3 }, /* Access Control Unit 3. */
3968 { "tc", TC }, /* MMU Translation Control Register. */
3969 { "tcr", TC },
3970 { "asid", ASID },
3972 { "mmusr", MMUSR }, /* MMU Status Register. */
3973 { "srp", SRP }, /* User Root Pointer. */
3974 { "urp", URP }, /* Supervisor Root Pointer. */
3976 { "buscr", BUSCR },
3977 { "mmubar", MMUBAR },
3978 { "pcr", PCR },
3980 { "rombar", ROMBAR }, /* ROM Base Address Register. */
3981 { "rambar0", RAMBAR0 }, /* ROM Base Address Register. */
3982 { "rambar1", RAMBAR1 }, /* ROM Base Address Register. */
3983 { "mbar", MBAR }, /* Module Base Address Register. */
3985 { "mbar0", MBAR0 }, /* mcfv4e registers. */
3986 { "mbar1", MBAR1 }, /* mcfv4e registers. */
3987 { "rombar0", ROMBAR0 }, /* mcfv4e registers. */
3988 { "rombar1", ROMBAR1 }, /* mcfv4e registers. */
3989 { "mpcr", MPCR }, /* mcfv4e registers. */
3990 { "edrambar", EDRAMBAR }, /* mcfv4e registers. */
3991 { "secmbar", SECMBAR }, /* mcfv4e registers. */
3992 { "asid", TC }, /* mcfv4e registers. */
3993 { "mmubar", BUSCR }, /* mcfv4e registers. */
3994 { "pcr1u0", PCR1U0 }, /* mcfv4e registers. */
3995 { "pcr1l0", PCR1L0 }, /* mcfv4e registers. */
3996 { "pcr2u0", PCR2U0 }, /* mcfv4e registers. */
3997 { "pcr2l0", PCR2L0 }, /* mcfv4e registers. */
3998 { "pcr3u0", PCR3U0 }, /* mcfv4e registers. */
3999 { "pcr3l0", PCR3L0 }, /* mcfv4e registers. */
4000 { "pcr1u1", PCR1U1 }, /* mcfv4e registers. */
4001 { "pcr1l1", PCR1L1 }, /* mcfv4e registers. */
4002 { "pcr2u1", PCR2U1 }, /* mcfv4e registers. */
4003 { "pcr2l1", PCR2L1 }, /* mcfv4e registers. */
4004 { "pcr3u1", PCR3U1 }, /* mcfv4e registers. */
4005 { "pcr3l1", PCR3L1 }, /* mcfv4e registers. */
4007 { "flashbar", FLASHBAR }, /* mcf528x registers. */
4008 { "rambar", RAMBAR }, /* mcf528x registers. */
4010 { "mbar2", MBAR2 }, /* mcf5249 registers. */
4012 { "cac", CAC }, /* fido registers. */
4013 { "mbb", MBO }, /* fido registers (obsolete). */
4014 { "mbo", MBO }, /* fido registers. */
4015 /* End of control registers. */
4017 { "ac", AC },
4018 { "bc", BC },
4019 { "cal", CAL },
4020 { "crp", CRP },
4021 { "drp", DRP },
4022 { "pcsr", PCSR },
4023 { "psr", PSR },
4024 { "scc", SCC },
4025 { "val", VAL },
4026 { "bad0", BAD0 },
4027 { "bad1", BAD1 },
4028 { "bad2", BAD2 },
4029 { "bad3", BAD3 },
4030 { "bad4", BAD4 },
4031 { "bad5", BAD5 },
4032 { "bad6", BAD6 },
4033 { "bad7", BAD7 },
4034 { "bac0", BAC0 },
4035 { "bac1", BAC1 },
4036 { "bac2", BAC2 },
4037 { "bac3", BAC3 },
4038 { "bac4", BAC4 },
4039 { "bac5", BAC5 },
4040 { "bac6", BAC6 },
4041 { "bac7", BAC7 },
4043 { "ic", IC },
4044 { "dc", DC },
4045 { "nc", NC },
4047 { "tt0", TT0 },
4048 { "tt1", TT1 },
4049 /* 68ec030 versions of same. */
4050 { "ac0", TT0 },
4051 { "ac1", TT1 },
4052 /* 68ec030 access control unit, identical to 030 MMU status reg. */
4053 { "acusr", PSR },
4055 /* Suppressed data and address registers. */
4056 { "zd0", ZDATA0 },
4057 { "zd1", ZDATA1 },
4058 { "zd2", ZDATA2 },
4059 { "zd3", ZDATA3 },
4060 { "zd4", ZDATA4 },
4061 { "zd5", ZDATA5 },
4062 { "zd6", ZDATA6 },
4063 { "zd7", ZDATA7 },
4064 { "za0", ZADDR0 },
4065 { "za1", ZADDR1 },
4066 { "za2", ZADDR2 },
4067 { "za3", ZADDR3 },
4068 { "za4", ZADDR4 },
4069 { "za5", ZADDR5 },
4070 { "za6", ZADDR6 },
4071 { "za7", ZADDR7 },
4073 /* Upper and lower data and address registers, used by macw and msacw. */
4074 { "d0l", DATA0L },
4075 { "d1l", DATA1L },
4076 { "d2l", DATA2L },
4077 { "d3l", DATA3L },
4078 { "d4l", DATA4L },
4079 { "d5l", DATA5L },
4080 { "d6l", DATA6L },
4081 { "d7l", DATA7L },
4083 { "a0l", ADDR0L },
4084 { "a1l", ADDR1L },
4085 { "a2l", ADDR2L },
4086 { "a3l", ADDR3L },
4087 { "a4l", ADDR4L },
4088 { "a5l", ADDR5L },
4089 { "a6l", ADDR6L },
4090 { "a7l", ADDR7L },
4092 { "d0u", DATA0U },
4093 { "d1u", DATA1U },
4094 { "d2u", DATA2U },
4095 { "d3u", DATA3U },
4096 { "d4u", DATA4U },
4097 { "d5u", DATA5U },
4098 { "d6u", DATA6U },
4099 { "d7u", DATA7U },
4101 { "a0u", ADDR0U },
4102 { "a1u", ADDR1U },
4103 { "a2u", ADDR2U },
4104 { "a3u", ADDR3U },
4105 { "a4u", ADDR4U },
4106 { "a5u", ADDR5U },
4107 { "a6u", ADDR6U },
4108 { "a7u", ADDR7U },
4110 { 0, 0 }
4113 static void
4114 init_regtable (void)
4116 int i;
4117 for (i = 0; init_table[i].name; i++)
4118 insert_reg (init_table[i].name, init_table[i].number);
4121 void
4122 md_assemble (char *str)
4124 const char *er;
4125 short *fromP;
4126 char *toP = NULL;
4127 int m, n = 0;
4128 char *to_beg_P;
4129 int shorts_this_frag;
4130 fixS *fixP;
4132 if (!selected_cpu && !selected_arch)
4134 /* We've not selected an architecture yet. Set the default
4135 now. We do this lazily so that an initial .cpu or .arch directive
4136 can specify. */
4137 if (!m68k_set_cpu (TARGET_CPU, 1, 1))
4138 as_bad (_("unrecognized default cpu `%s'"), TARGET_CPU);
4140 if (!initialized)
4141 m68k_init_arch ();
4143 /* In MRI mode, the instruction and operands are separated by a
4144 space. Anything following the operands is a comment. The label
4145 has already been removed. */
4146 if (flag_mri)
4148 char *s;
4149 int fields = 0;
4150 int infield = 0;
4151 int inquote = 0;
4153 for (s = str; *s != '\0'; s++)
4155 if ((*s == ' ' || *s == '\t') && ! inquote)
4157 if (infield)
4159 ++fields;
4160 if (fields >= 2)
4162 *s = '\0';
4163 break;
4165 infield = 0;
4168 else
4170 if (! infield)
4171 infield = 1;
4172 if (*s == '\'')
4173 inquote = ! inquote;
4178 memset (&the_ins, '\0', sizeof (the_ins));
4179 m68k_ip (str);
4180 er = the_ins.error;
4181 if (!er)
4183 for (n = 0; n < the_ins.numargs; n++)
4184 if (the_ins.operands[n].error)
4186 er = the_ins.operands[n].error;
4187 break;
4190 if (er)
4192 as_bad (_("%s -- statement `%s' ignored"), er, str);
4193 return;
4196 /* If there is a current label, record that it marks an instruction. */
4197 if (current_label != NULL)
4199 current_label->text = 1;
4200 current_label = NULL;
4203 #ifdef OBJ_ELF
4204 /* Tie dwarf2 debug info to the address at the start of the insn. */
4205 dwarf2_emit_insn (0);
4206 #endif
4208 if (the_ins.nfrag == 0)
4210 /* No frag hacking involved; just put it out. */
4211 toP = frag_more (2 * the_ins.numo);
4212 fromP = &the_ins.opcode[0];
4213 for (m = the_ins.numo; m; --m)
4215 md_number_to_chars (toP, (long) (*fromP), 2);
4216 toP += 2;
4217 fromP++;
4219 /* Put out symbol-dependent info. */
4220 for (m = 0; m < the_ins.nrel; m++)
4222 switch (the_ins.reloc[m].wid)
4224 case 'B':
4225 n = 1;
4226 break;
4227 case 'b':
4228 n = 1;
4229 break;
4230 case '3':
4231 n = 1;
4232 break;
4233 case 'w':
4234 case 'W':
4235 n = 2;
4236 break;
4237 case 'l':
4238 n = 4;
4239 break;
4240 default:
4241 as_fatal (_("Don't know how to figure width of %c in md_assemble()"),
4242 the_ins.reloc[m].wid);
4245 fixP = fix_new_exp (frag_now,
4246 ((toP - frag_now->fr_literal)
4247 - the_ins.numo * 2 + the_ins.reloc[m].n),
4249 &the_ins.reloc[m].exp,
4250 the_ins.reloc[m].pcrel,
4251 get_reloc_code (n, the_ins.reloc[m].pcrel,
4252 the_ins.reloc[m].pic_reloc));
4253 fixP->fx_pcrel_adjust = the_ins.reloc[m].pcrel_fix;
4254 if (the_ins.reloc[m].wid == 'B')
4255 fixP->fx_signed = 1;
4257 return;
4260 /* There's some frag hacking. */
4262 /* Calculate the max frag size. */
4263 int wid;
4265 wid = 2 * the_ins.fragb[0].fragoff;
4266 for (n = 1; n < the_ins.nfrag; n++)
4267 wid += 2 * (the_ins.numo - the_ins.fragb[n - 1].fragoff);
4268 /* frag_var part. */
4269 wid += FRAG_VAR_SIZE;
4270 /* Make sure the whole insn fits in one chunk, in particular that
4271 the var part is attached, as we access one byte before the
4272 variable frag for byte branches. */
4273 frag_grow (wid);
4276 for (n = 0, fromP = &the_ins.opcode[0]; n < the_ins.nfrag; n++)
4278 int wid;
4280 if (n == 0)
4281 wid = 2 * the_ins.fragb[n].fragoff;
4282 else
4283 wid = 2 * (the_ins.numo - the_ins.fragb[n - 1].fragoff);
4284 toP = frag_more (wid);
4285 to_beg_P = toP;
4286 shorts_this_frag = 0;
4287 for (m = wid / 2; m; --m)
4289 md_number_to_chars (toP, (long) (*fromP), 2);
4290 toP += 2;
4291 fromP++;
4292 shorts_this_frag++;
4294 for (m = 0; m < the_ins.nrel; m++)
4296 if ((the_ins.reloc[m].n) >= 2 * shorts_this_frag)
4298 the_ins.reloc[m].n -= 2 * shorts_this_frag;
4299 break;
4301 wid = the_ins.reloc[m].wid;
4302 if (wid == 0)
4303 continue;
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 ((toP - frag_now->fr_literal)
4309 - the_ins.numo * 2 + the_ins.reloc[m].n),
4310 wid,
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;
4317 (void) frag_var (rs_machine_dependent, FRAG_VAR_SIZE, 0,
4318 (relax_substateT) (the_ins.fragb[n].fragty),
4319 the_ins.fragb[n].fadd, the_ins.fragb[n].foff, to_beg_P);
4321 n = (the_ins.numo - the_ins.fragb[n - 1].fragoff);
4322 shorts_this_frag = 0;
4323 if (n)
4325 toP = frag_more (n * 2);
4326 while (n--)
4328 md_number_to_chars (toP, (long) (*fromP), 2);
4329 toP += 2;
4330 fromP++;
4331 shorts_this_frag++;
4334 for (m = 0; m < the_ins.nrel; m++)
4336 int wid;
4338 wid = the_ins.reloc[m].wid;
4339 if (wid == 0)
4340 continue;
4341 the_ins.reloc[m].wid = 0;
4342 wid = (wid == 'b') ? 1 : (wid == 'w') ? 2 : (wid == 'l') ? 4 : 4000;
4344 fixP = fix_new_exp (frag_now,
4345 ((the_ins.reloc[m].n + toP - frag_now->fr_literal)
4346 - shorts_this_frag * 2),
4347 wid,
4348 &the_ins.reloc[m].exp,
4349 the_ins.reloc[m].pcrel,
4350 get_reloc_code (wid, the_ins.reloc[m].pcrel,
4351 the_ins.reloc[m].pic_reloc));
4352 fixP->fx_pcrel_adjust = the_ins.reloc[m].pcrel_fix;
4356 /* Comparison function used by qsort to rank the opcode entries by name. */
4358 static int
4359 m68k_compare_opcode (const void * v1, const void * v2)
4361 struct m68k_opcode * op1, * op2;
4362 int ret;
4364 if (v1 == v2)
4365 return 0;
4367 op1 = *(struct m68k_opcode **) v1;
4368 op2 = *(struct m68k_opcode **) v2;
4370 /* Compare the two names. If different, return the comparison.
4371 If the same, return the order they are in the opcode table. */
4372 ret = strcmp (op1->name, op2->name);
4373 if (ret)
4374 return ret;
4375 if (op1 < op2)
4376 return -1;
4377 return 1;
4380 void
4381 md_begin (void)
4383 const struct m68k_opcode *ins;
4384 struct m68k_incant *hack, *slak;
4385 const char *retval = 0; /* Empty string, or error msg text. */
4386 int i;
4388 /* Set up hash tables with 68000 instructions.
4389 similar to what the vax assembler does. */
4390 /* RMS claims the thing to do is take the m68k-opcode.h table, and make
4391 a copy of it at runtime, adding in the information we want but isn't
4392 there. I think it'd be better to have an awk script hack the table
4393 at compile time. Or even just xstr the table and use it as-is. But
4394 my lord ghod hath spoken, so we do it this way. Excuse the ugly var
4395 names. */
4397 if (flag_mri)
4399 flag_reg_prefix_optional = 1;
4400 m68k_abspcadd = 1;
4401 if (! m68k_rel32_from_cmdline)
4402 m68k_rel32 = 0;
4405 /* First sort the opcode table into alphabetical order to seperate
4406 the order that the assembler wants to see the opcodes from the
4407 order that the disassembler wants to see them. */
4408 m68k_sorted_opcodes = xmalloc (m68k_numopcodes * sizeof (* m68k_sorted_opcodes));
4409 if (!m68k_sorted_opcodes)
4410 as_fatal (_("Internal Error: Can't allocate m68k_sorted_opcodes of size %d"),
4411 m68k_numopcodes * ((int) sizeof (* m68k_sorted_opcodes)));
4413 for (i = m68k_numopcodes; i--;)
4414 m68k_sorted_opcodes[i] = m68k_opcodes + i;
4416 qsort (m68k_sorted_opcodes, m68k_numopcodes,
4417 sizeof (m68k_sorted_opcodes[0]), m68k_compare_opcode);
4419 op_hash = hash_new ();
4421 obstack_begin (&robyn, 4000);
4422 for (i = 0; i < m68k_numopcodes; i++)
4424 hack = slak = (struct m68k_incant *) obstack_alloc (&robyn, sizeof (struct m68k_incant));
4427 ins = m68k_sorted_opcodes[i];
4429 /* We must enter all insns into the table, because .arch and
4430 .cpu directives can change things. */
4431 slak->m_operands = ins->args;
4432 slak->m_arch = ins->arch;
4433 slak->m_opcode = ins->opcode;
4435 /* In most cases we can determine the number of opcode words
4436 by checking the second word of the mask. Unfortunately
4437 some instructions have 2 opcode words, but no fixed bits
4438 in the second word. A leading dot in the operands
4439 string also indicates 2 opcodes. */
4440 if (*slak->m_operands == '.')
4442 slak->m_operands++;
4443 slak->m_codenum = 2;
4445 else if (ins->match & 0xffffL)
4446 slak->m_codenum = 2;
4447 else
4448 slak->m_codenum = 1;
4449 slak->m_opnum = strlen (slak->m_operands) / 2;
4451 if (i + 1 != m68k_numopcodes
4452 && !strcmp (ins->name, m68k_sorted_opcodes[i + 1]->name))
4454 slak->m_next = obstack_alloc (&robyn, sizeof (struct m68k_incant));
4455 i++;
4457 else
4458 slak->m_next = 0;
4459 slak = slak->m_next;
4461 while (slak);
4463 retval = hash_insert (op_hash, ins->name, (char *) hack);
4464 if (retval)
4465 as_fatal (_("Internal Error: Can't hash %s: %s"), ins->name, retval);
4468 for (i = 0; i < m68k_numaliases; i++)
4470 const char *name = m68k_opcode_aliases[i].primary;
4471 const char *alias = m68k_opcode_aliases[i].alias;
4472 PTR val = hash_find (op_hash, name);
4474 if (!val)
4475 as_fatal (_("Internal Error: Can't find %s in hash table"), name);
4476 retval = hash_insert (op_hash, alias, val);
4477 if (retval)
4478 as_fatal (_("Internal Error: Can't hash %s: %s"), alias, retval);
4481 /* In MRI mode, all unsized branches are variable sized. Normally,
4482 they are word sized. */
4483 if (flag_mri)
4485 static struct m68k_opcode_alias mri_aliases[] =
4487 { "bhi", "jhi", },
4488 { "bls", "jls", },
4489 { "bcc", "jcc", },
4490 { "bcs", "jcs", },
4491 { "bne", "jne", },
4492 { "beq", "jeq", },
4493 { "bvc", "jvc", },
4494 { "bvs", "jvs", },
4495 { "bpl", "jpl", },
4496 { "bmi", "jmi", },
4497 { "bge", "jge", },
4498 { "blt", "jlt", },
4499 { "bgt", "jgt", },
4500 { "ble", "jle", },
4501 { "bra", "jra", },
4502 { "bsr", "jbsr", },
4505 for (i = 0;
4506 i < (int) (sizeof mri_aliases / sizeof mri_aliases[0]);
4507 i++)
4509 const char *name = mri_aliases[i].primary;
4510 const char *alias = mri_aliases[i].alias;
4511 PTR val = hash_find (op_hash, name);
4513 if (!val)
4514 as_fatal (_("Internal Error: Can't find %s in hash table"), name);
4515 retval = hash_jam (op_hash, alias, val);
4516 if (retval)
4517 as_fatal (_("Internal Error: Can't hash %s: %s"), alias, retval);
4521 for (i = 0; i < (int) sizeof (notend_table); i++)
4523 notend_table[i] = 0;
4524 alt_notend_table[i] = 0;
4527 notend_table[','] = 1;
4528 notend_table['{'] = 1;
4529 notend_table['}'] = 1;
4530 alt_notend_table['a'] = 1;
4531 alt_notend_table['A'] = 1;
4532 alt_notend_table['d'] = 1;
4533 alt_notend_table['D'] = 1;
4534 alt_notend_table['#'] = 1;
4535 alt_notend_table['&'] = 1;
4536 alt_notend_table['f'] = 1;
4537 alt_notend_table['F'] = 1;
4538 #ifdef REGISTER_PREFIX
4539 alt_notend_table[REGISTER_PREFIX] = 1;
4540 #endif
4542 /* We need to put '(' in alt_notend_table to handle
4543 cas2 %d0:%d2,%d3:%d4,(%a0):(%a1) */
4544 alt_notend_table['('] = 1;
4546 /* We need to put '@' in alt_notend_table to handle
4547 cas2 %d0:%d2,%d3:%d4,@(%d0):@(%d1) */
4548 alt_notend_table['@'] = 1;
4550 /* We need to put digits in alt_notend_table to handle
4551 bfextu %d0{24:1},%d0 */
4552 alt_notend_table['0'] = 1;
4553 alt_notend_table['1'] = 1;
4554 alt_notend_table['2'] = 1;
4555 alt_notend_table['3'] = 1;
4556 alt_notend_table['4'] = 1;
4557 alt_notend_table['5'] = 1;
4558 alt_notend_table['6'] = 1;
4559 alt_notend_table['7'] = 1;
4560 alt_notend_table['8'] = 1;
4561 alt_notend_table['9'] = 1;
4563 #ifndef MIT_SYNTAX_ONLY
4564 /* Insert pseudo ops, these have to go into the opcode table since
4565 gas expects pseudo ops to start with a dot. */
4567 int n = 0;
4569 while (mote_pseudo_table[n].poc_name)
4571 hack = obstack_alloc (&robyn, sizeof (struct m68k_incant));
4572 hash_insert (op_hash,
4573 mote_pseudo_table[n].poc_name, (char *) hack);
4574 hack->m_operands = 0;
4575 hack->m_opnum = n;
4576 n++;
4579 #endif
4581 init_regtable ();
4583 #ifdef OBJ_ELF
4584 record_alignment (text_section, 2);
4585 record_alignment (data_section, 2);
4586 record_alignment (bss_section, 2);
4587 #endif
4591 /* This is called when a label is defined. */
4593 void
4594 m68k_frob_label (symbolS *sym)
4596 struct label_line *n;
4598 n = (struct label_line *) xmalloc (sizeof *n);
4599 n->next = labels;
4600 n->label = sym;
4601 as_where (&n->file, &n->line);
4602 n->text = 0;
4603 labels = n;
4604 current_label = n;
4606 #ifdef OBJ_ELF
4607 dwarf2_emit_label (sym);
4608 #endif
4611 /* This is called when a value that is not an instruction is emitted. */
4613 void
4614 m68k_flush_pending_output (void)
4616 current_label = NULL;
4619 /* This is called at the end of the assembly, when the final value of
4620 the label is known. We warn if this is a text symbol aligned at an
4621 odd location. */
4623 void
4624 m68k_frob_symbol (symbolS *sym)
4626 if (S_GET_SEGMENT (sym) == reg_section
4627 && (int) S_GET_VALUE (sym) < 0)
4629 S_SET_SEGMENT (sym, absolute_section);
4630 S_SET_VALUE (sym, ~(int)S_GET_VALUE (sym));
4632 else if ((S_GET_VALUE (sym) & 1) != 0)
4634 struct label_line *l;
4636 for (l = labels; l != NULL; l = l->next)
4638 if (l->label == sym)
4640 if (l->text)
4641 as_warn_where (l->file, l->line,
4642 _("text label `%s' aligned to odd boundary"),
4643 S_GET_NAME (sym));
4644 break;
4650 /* This is called if we go in or out of MRI mode because of the .mri
4651 pseudo-op. */
4653 void
4654 m68k_mri_mode_change (int on)
4656 if (on)
4658 if (! flag_reg_prefix_optional)
4660 flag_reg_prefix_optional = 1;
4661 #ifdef REGISTER_PREFIX
4662 init_regtable ();
4663 #endif
4665 m68k_abspcadd = 1;
4666 if (! m68k_rel32_from_cmdline)
4667 m68k_rel32 = 0;
4669 else
4671 if (! reg_prefix_optional_seen)
4673 #ifdef REGISTER_PREFIX_OPTIONAL
4674 flag_reg_prefix_optional = REGISTER_PREFIX_OPTIONAL;
4675 #else
4676 flag_reg_prefix_optional = 0;
4677 #endif
4678 #ifdef REGISTER_PREFIX
4679 init_regtable ();
4680 #endif
4682 m68k_abspcadd = 0;
4683 if (! m68k_rel32_from_cmdline)
4684 m68k_rel32 = 1;
4688 char *
4689 md_atof (int type, char *litP, int *sizeP)
4691 return ieee_md_atof (type, litP, sizeP, TRUE);
4694 void
4695 md_number_to_chars (char *buf, valueT val, int n)
4697 number_to_chars_bigendian (buf, val, n);
4700 void
4701 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
4703 offsetT val = *valP;
4704 addressT upper_limit;
4705 offsetT lower_limit;
4707 /* This is unnecessary but it convinces the native rs6000 compiler
4708 to generate the code we want. */
4709 char *buf = fixP->fx_frag->fr_literal;
4710 buf += fixP->fx_where;
4711 /* End ibm compiler workaround. */
4713 val = SEXT (val);
4715 if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
4716 fixP->fx_done = 1;
4718 #ifdef OBJ_ELF
4719 if (fixP->fx_addsy)
4721 memset (buf, 0, fixP->fx_size);
4722 fixP->fx_addnumber = val; /* Remember value for emit_reloc. */
4724 if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
4725 && !S_IS_DEFINED (fixP->fx_addsy)
4726 && !S_IS_WEAK (fixP->fx_addsy))
4727 S_SET_WEAK (fixP->fx_addsy);
4728 return;
4730 #elif defined(OBJ_AOUT)
4731 /* PR gas/3041 Do not fix frags referencing a weak symbol. */
4732 if (fixP->fx_addsy && S_IS_WEAK (fixP->fx_addsy))
4734 memset (buf, 0, fixP->fx_size);
4735 fixP->fx_addnumber = val; /* Remember value for emit_reloc. */
4736 return;
4738 #endif
4740 if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
4741 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
4742 return;
4744 switch (fixP->fx_size)
4746 /* The cast to offsetT below are necessary to make code
4747 correct for machines where ints are smaller than offsetT. */
4748 case 1:
4749 *buf++ = val;
4750 upper_limit = 0x7f;
4751 lower_limit = - (offsetT) 0x80;
4752 break;
4753 case 2:
4754 *buf++ = (val >> 8);
4755 *buf++ = val;
4756 upper_limit = 0x7fff;
4757 lower_limit = - (offsetT) 0x8000;
4758 break;
4759 case 4:
4760 *buf++ = (val >> 24);
4761 *buf++ = (val >> 16);
4762 *buf++ = (val >> 8);
4763 *buf++ = val;
4764 upper_limit = 0x7fffffff;
4765 lower_limit = - (offsetT) 0x7fffffff - 1; /* Avoid constant overflow. */
4766 break;
4767 default:
4768 BAD_CASE (fixP->fx_size);
4771 /* Fix up a negative reloc. */
4772 if (fixP->fx_addsy == NULL && fixP->fx_subsy != NULL)
4774 fixP->fx_addsy = fixP->fx_subsy;
4775 fixP->fx_subsy = NULL;
4776 fixP->fx_tcbit = 1;
4779 /* For non-pc-relative values, it's conceivable we might get something
4780 like "0xff" for a byte field. So extend the upper part of the range
4781 to accept such numbers. We arbitrarily disallow "-0xff" or "0xff+0xff",
4782 so that we can do any range checking at all. */
4783 if (! fixP->fx_pcrel && ! fixP->fx_signed)
4784 upper_limit = upper_limit * 2 + 1;
4786 if ((addressT) val > upper_limit
4787 && (val > 0 || val < lower_limit))
4788 as_bad_where (fixP->fx_file, fixP->fx_line,
4789 _("value %ld out of range"), (long)val);
4791 /* A one byte PC-relative reloc means a short branch. We can't use
4792 a short branch with a value of 0 or -1, because those indicate
4793 different opcodes (branches with longer offsets). fixup_segment
4794 in write.c may have clobbered fx_pcrel, so we need to examine the
4795 reloc type. */
4796 if ((fixP->fx_pcrel
4797 || fixP->fx_r_type == BFD_RELOC_8_PCREL)
4798 && fixP->fx_size == 1
4799 && (fixP->fx_addsy == NULL
4800 || S_IS_DEFINED (fixP->fx_addsy))
4801 && (val == 0 || val == -1))
4802 as_bad_where (fixP->fx_file, fixP->fx_line,
4803 _("invalid byte branch offset"));
4806 /* *fragP has been relaxed to its final size, and now needs to have
4807 the bytes inside it modified to conform to the new size There is UGLY
4808 MAGIC here. ..
4810 static void
4811 md_convert_frag_1 (fragS *fragP)
4813 long disp;
4814 fixS *fixP = NULL;
4816 /* Address in object code of the displacement. */
4817 register int object_address = fragP->fr_fix + fragP->fr_address;
4819 /* Address in gas core of the place to store the displacement. */
4820 /* This convinces the native rs6000 compiler to generate the code we
4821 want. */
4822 register char *buffer_address = fragP->fr_literal;
4823 buffer_address += fragP->fr_fix;
4824 /* End ibm compiler workaround. */
4826 /* The displacement of the address, from current location. */
4827 disp = fragP->fr_symbol ? S_GET_VALUE (fragP->fr_symbol) : 0;
4828 disp = (disp + fragP->fr_offset) - object_address;
4830 switch (fragP->fr_subtype)
4832 case TAB (BRANCHBWL, BYTE):
4833 case TAB (BRABSJUNC, BYTE):
4834 case TAB (BRABSJCOND, BYTE):
4835 case TAB (BRANCHBW, BYTE):
4836 case TAB (BRANCHBWPL, BYTE):
4837 know (issbyte (disp));
4838 if (disp == 0)
4839 as_bad_where (fragP->fr_file, fragP->fr_line,
4840 _("short branch with zero offset: use :w"));
4841 fixP = fix_new (fragP, fragP->fr_fix - 1, 1, fragP->fr_symbol,
4842 fragP->fr_offset, 1, RELAX_RELOC_PC8);
4843 fixP->fx_pcrel_adjust = -1;
4844 break;
4845 case TAB (BRANCHBWL, SHORT):
4846 case TAB (BRABSJUNC, SHORT):
4847 case TAB (BRABSJCOND, SHORT):
4848 case TAB (BRANCHBW, SHORT):
4849 case TAB (BRANCHBWPL, SHORT):
4850 fragP->fr_opcode[1] = 0x00;
4851 fixP = fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
4852 fragP->fr_offset, 1, RELAX_RELOC_PC16);
4853 fragP->fr_fix += 2;
4854 break;
4855 case TAB (BRANCHBWL, LONG):
4856 fragP->fr_opcode[1] = (char) 0xFF;
4857 fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
4858 fragP->fr_offset, 1, RELAX_RELOC_PC32);
4859 fragP->fr_fix += 4;
4860 break;
4861 case TAB (BRANCHBWPL, LONG):
4862 /* Here we are converting an unconditional branch into a pair of
4863 conditional branches, in order to get the range. */
4864 fragP->fr_opcode[0] = 0x66; /* bne */
4865 fragP->fr_opcode[1] = 0xFF;
4866 fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
4867 fragP->fr_offset, 1, RELAX_RELOC_PC32);
4868 fixP->fx_file = fragP->fr_file;
4869 fixP->fx_line = fragP->fr_line;
4870 fragP->fr_fix += 4; /* Skip first offset */
4871 buffer_address += 4;
4872 *buffer_address++ = 0x67; /* beq */
4873 *buffer_address++ = 0xff;
4874 fragP->fr_fix += 2; /* Skip second branch opcode */
4875 fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
4876 fragP->fr_offset, 1, RELAX_RELOC_PC32);
4877 fragP->fr_fix += 4;
4878 break;
4879 case TAB (BRABSJUNC, LONG):
4880 if (fragP->fr_opcode[0] == 0x61) /* jbsr */
4882 if (flag_keep_pcrel)
4883 as_bad_where (fragP->fr_file, fragP->fr_line,
4884 _("Conversion of PC relative BSR to absolute JSR"));
4885 fragP->fr_opcode[0] = 0x4E;
4886 fragP->fr_opcode[1] = (char) 0xB9; /* JSR with ABSL LONG operand. */
4887 fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
4888 fragP->fr_offset, 0, RELAX_RELOC_ABS32);
4889 fragP->fr_fix += 4;
4891 else if (fragP->fr_opcode[0] == 0x60) /* jbra */
4893 if (flag_keep_pcrel)
4894 as_bad_where (fragP->fr_file, fragP->fr_line,
4895 _("Conversion of PC relative branch to absolute jump"));
4896 fragP->fr_opcode[0] = 0x4E;
4897 fragP->fr_opcode[1] = (char) 0xF9; /* JMP with ABSL LONG operand. */
4898 fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
4899 fragP->fr_offset, 0, RELAX_RELOC_ABS32);
4900 fragP->fr_fix += 4;
4902 else
4904 /* This cannot happen, because jbsr and jbra are the only two
4905 unconditional branches. */
4906 abort ();
4908 break;
4909 case TAB (BRABSJCOND, LONG):
4910 if (flag_keep_pcrel)
4911 as_bad_where (fragP->fr_file, fragP->fr_line,
4912 _("Conversion of PC relative conditional branch to absolute jump"));
4914 /* Only Bcc 68000 instructions can come here
4915 Change bcc into b!cc/jmp absl long. */
4916 fragP->fr_opcode[0] ^= 0x01; /* Invert bcc. */
4917 fragP->fr_opcode[1] = 0x06; /* Branch offset = 6. */
4919 /* JF: these used to be fr_opcode[2,3], but they may be in a
4920 different frag, in which case referring to them is a no-no.
4921 Only fr_opcode[0,1] are guaranteed to work. */
4922 *buffer_address++ = 0x4e; /* put in jmp long (0x4ef9) */
4923 *buffer_address++ = (char) 0xf9;
4924 fragP->fr_fix += 2; /* Account for jmp instruction. */
4925 fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
4926 fragP->fr_offset, 0, RELAX_RELOC_ABS32);
4927 fragP->fr_fix += 4;
4928 break;
4929 case TAB (FBRANCH, SHORT):
4930 know ((fragP->fr_opcode[1] & 0x40) == 0);
4931 fixP = fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
4932 fragP->fr_offset, 1, RELAX_RELOC_PC16);
4933 fragP->fr_fix += 2;
4934 break;
4935 case TAB (FBRANCH, LONG):
4936 fragP->fr_opcode[1] |= 0x40; /* Turn on LONG bit. */
4937 fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
4938 fragP->fr_offset, 1, RELAX_RELOC_PC32);
4939 fragP->fr_fix += 4;
4940 break;
4941 case TAB (DBCCLBR, SHORT):
4942 case TAB (DBCCABSJ, SHORT):
4943 fixP = fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
4944 fragP->fr_offset, 1, RELAX_RELOC_PC16);
4945 fragP->fr_fix += 2;
4946 break;
4947 case TAB (DBCCLBR, LONG):
4948 /* Only DBcc instructions can come here.
4949 Change dbcc into dbcc/bral.
4950 JF: these used to be fr_opcode[2-7], but that's wrong. */
4951 if (flag_keep_pcrel)
4952 as_bad_where (fragP->fr_file, fragP->fr_line,
4953 _("Conversion of DBcc to absolute jump"));
4955 *buffer_address++ = 0x00; /* Branch offset = 4. */
4956 *buffer_address++ = 0x04;
4957 *buffer_address++ = 0x60; /* Put in bra pc+6. */
4958 *buffer_address++ = 0x06;
4959 *buffer_address++ = 0x60; /* Put in bral (0x60ff). */
4960 *buffer_address++ = (char) 0xff;
4962 fragP->fr_fix += 6; /* Account for bra/jmp instructions. */
4963 fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
4964 fragP->fr_offset, 1, RELAX_RELOC_PC32);
4965 fragP->fr_fix += 4;
4966 break;
4967 case TAB (DBCCABSJ, LONG):
4968 /* Only DBcc instructions can come here.
4969 Change dbcc into dbcc/jmp.
4970 JF: these used to be fr_opcode[2-7], but that's wrong. */
4971 if (flag_keep_pcrel)
4972 as_bad_where (fragP->fr_file, fragP->fr_line,
4973 _("Conversion of PC relative conditional branch to absolute jump"));
4975 *buffer_address++ = 0x00; /* Branch offset = 4. */
4976 *buffer_address++ = 0x04;
4977 *buffer_address++ = 0x60; /* Put in bra pc + 6. */
4978 *buffer_address++ = 0x06;
4979 *buffer_address++ = 0x4e; /* Put in jmp long (0x4ef9). */
4980 *buffer_address++ = (char) 0xf9;
4982 fragP->fr_fix += 6; /* Account for bra/jmp instructions. */
4983 fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
4984 fragP->fr_offset, 0, RELAX_RELOC_ABS32);
4985 fragP->fr_fix += 4;
4986 break;
4987 case TAB (PCREL1632, SHORT):
4988 fragP->fr_opcode[1] &= ~0x3F;
4989 fragP->fr_opcode[1] |= 0x3A; /* 072 - mode 7.2 */
4990 fixP = fix_new (fragP, (int) (fragP->fr_fix), 2, fragP->fr_symbol,
4991 fragP->fr_offset, 1, RELAX_RELOC_PC16);
4992 fragP->fr_fix += 2;
4993 break;
4994 case TAB (PCREL1632, LONG):
4995 /* Already set to mode 7.3; this indicates: PC indirect with
4996 suppressed index, 32-bit displacement. */
4997 *buffer_address++ = 0x01;
4998 *buffer_address++ = 0x70;
4999 fragP->fr_fix += 2;
5000 fixP = fix_new (fragP, (int) (fragP->fr_fix), 4, fragP->fr_symbol,
5001 fragP->fr_offset, 1, RELAX_RELOC_PC32);
5002 fixP->fx_pcrel_adjust = 2;
5003 fragP->fr_fix += 4;
5004 break;
5005 case TAB (PCINDEX, BYTE):
5006 assert (fragP->fr_fix >= 2);
5007 buffer_address[-2] &= ~1;
5008 fixP = fix_new (fragP, fragP->fr_fix - 1, 1, fragP->fr_symbol,
5009 fragP->fr_offset, 1, RELAX_RELOC_PC8);
5010 fixP->fx_pcrel_adjust = 1;
5011 break;
5012 case TAB (PCINDEX, SHORT):
5013 assert (fragP->fr_fix >= 2);
5014 buffer_address[-2] |= 0x1;
5015 buffer_address[-1] = 0x20;
5016 fixP = fix_new (fragP, (int) (fragP->fr_fix), 2, fragP->fr_symbol,
5017 fragP->fr_offset, 1, RELAX_RELOC_PC16);
5018 fixP->fx_pcrel_adjust = 2;
5019 fragP->fr_fix += 2;
5020 break;
5021 case TAB (PCINDEX, LONG):
5022 assert (fragP->fr_fix >= 2);
5023 buffer_address[-2] |= 0x1;
5024 buffer_address[-1] = 0x30;
5025 fixP = fix_new (fragP, (int) (fragP->fr_fix), 4, fragP->fr_symbol,
5026 fragP->fr_offset, 1, RELAX_RELOC_PC32);
5027 fixP->fx_pcrel_adjust = 2;
5028 fragP->fr_fix += 4;
5029 break;
5030 case TAB (ABSTOPCREL, SHORT):
5031 fixP = fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
5032 fragP->fr_offset, 1, RELAX_RELOC_PC16);
5033 fragP->fr_fix += 2;
5034 break;
5035 case TAB (ABSTOPCREL, LONG):
5036 if (flag_keep_pcrel)
5037 as_fatal (_("Conversion of PC relative displacement to absolute"));
5038 /* The thing to do here is force it to ABSOLUTE LONG, since
5039 ABSTOPCREL is really trying to shorten an ABSOLUTE address anyway. */
5040 if ((fragP->fr_opcode[1] & 0x3F) != 0x3A)
5041 abort ();
5042 fragP->fr_opcode[1] &= ~0x3F;
5043 fragP->fr_opcode[1] |= 0x39; /* Mode 7.1 */
5044 fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
5045 fragP->fr_offset, 0, RELAX_RELOC_ABS32);
5046 fragP->fr_fix += 4;
5047 break;
5049 if (fixP)
5051 fixP->fx_file = fragP->fr_file;
5052 fixP->fx_line = fragP->fr_line;
5056 void
5057 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
5058 segT sec ATTRIBUTE_UNUSED,
5059 fragS *fragP)
5061 md_convert_frag_1 (fragP);
5064 /* Force truly undefined symbols to their maximum size, and generally set up
5065 the frag list to be relaxed
5068 md_estimate_size_before_relax (fragS *fragP, segT segment)
5070 /* Handle SZ_UNDEF first, it can be changed to BYTE or SHORT. */
5071 switch (fragP->fr_subtype)
5073 case TAB (BRANCHBWL, SZ_UNDEF):
5074 case TAB (BRANCHBWPL, SZ_UNDEF):
5075 case TAB (BRABSJUNC, SZ_UNDEF):
5076 case TAB (BRABSJCOND, SZ_UNDEF):
5078 if (S_GET_SEGMENT (fragP->fr_symbol) == segment
5079 && relaxable_symbol (fragP->fr_symbol))
5081 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), BYTE);
5083 else if (flag_short_refs)
5085 /* Symbol is undefined and we want short ref. */
5086 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT);
5088 else
5090 /* Symbol is still undefined. Make it LONG. */
5091 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), LONG);
5093 break;
5096 case TAB (BRANCHBW, SZ_UNDEF):
5098 if (S_GET_SEGMENT (fragP->fr_symbol) == segment
5099 && relaxable_symbol (fragP->fr_symbol))
5101 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), BYTE);
5103 else
5105 /* Symbol is undefined and we don't have long branches. */
5106 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT);
5108 break;
5111 case TAB (FBRANCH, SZ_UNDEF):
5112 case TAB (DBCCLBR, SZ_UNDEF):
5113 case TAB (DBCCABSJ, SZ_UNDEF):
5114 case TAB (PCREL1632, SZ_UNDEF):
5116 if ((S_GET_SEGMENT (fragP->fr_symbol) == segment
5117 && relaxable_symbol (fragP->fr_symbol))
5118 || flag_short_refs)
5120 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT);
5122 else
5124 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), LONG);
5126 break;
5129 case TAB (PCINDEX, SZ_UNDEF):
5130 if ((S_GET_SEGMENT (fragP->fr_symbol) == segment
5131 && relaxable_symbol (fragP->fr_symbol)))
5133 fragP->fr_subtype = TAB (PCINDEX, BYTE);
5135 else
5137 fragP->fr_subtype = TAB (PCINDEX, LONG);
5139 break;
5141 case TAB (ABSTOPCREL, SZ_UNDEF):
5143 if ((S_GET_SEGMENT (fragP->fr_symbol) == segment
5144 && relaxable_symbol (fragP->fr_symbol)))
5146 fragP->fr_subtype = TAB (ABSTOPCREL, SHORT);
5148 else
5150 fragP->fr_subtype = TAB (ABSTOPCREL, LONG);
5152 break;
5155 default:
5156 break;
5159 /* Now that SZ_UNDEF are taken care of, check others. */
5160 switch (fragP->fr_subtype)
5162 case TAB (BRANCHBWL, BYTE):
5163 case TAB (BRABSJUNC, BYTE):
5164 case TAB (BRABSJCOND, BYTE):
5165 case TAB (BRANCHBW, BYTE):
5166 /* We can't do a short jump to the next instruction, so in that
5167 case we force word mode. If the symbol is at the start of a
5168 frag, and it is the next frag with any data in it (usually
5169 this is just the next frag, but assembler listings may
5170 introduce empty frags), we must use word mode. */
5171 if (fragP->fr_symbol)
5173 fragS *sym_frag;
5175 sym_frag = symbol_get_frag (fragP->fr_symbol);
5176 if (S_GET_VALUE (fragP->fr_symbol) == sym_frag->fr_address)
5178 fragS *l;
5180 for (l = fragP->fr_next; l && l != sym_frag; l = l->fr_next)
5181 if (l->fr_fix != 0)
5182 break;
5183 if (l == sym_frag)
5184 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT);
5187 break;
5188 default:
5189 break;
5191 return md_relax_table[fragP->fr_subtype].rlx_length;
5194 #if defined(OBJ_AOUT) | defined(OBJ_BOUT)
5195 /* the bit-field entries in the relocation_info struct plays hell
5196 with the byte-order problems of cross-assembly. So as a hack,
5197 I added this mach. dependent ri twiddler. Ugly, but it gets
5198 you there. -KWK */
5199 /* on m68k: first 4 bytes are normal unsigned long, next three bytes
5200 are symbolnum, most sig. byte first. Last byte is broken up with
5201 bit 7 as pcrel, bits 6 & 5 as length, bit 4 as pcrel, and the lower
5202 nibble as nuthin. (on Sun 3 at least) */
5203 /* Translate the internal relocation information into target-specific
5204 format. */
5205 #ifdef comment
5206 void
5207 md_ri_to_chars (char *the_bytes, struct reloc_info_generic *ri)
5209 /* This is easy. */
5210 md_number_to_chars (the_bytes, ri->r_address, 4);
5211 /* Now the fun stuff. */
5212 the_bytes[4] = (ri->r_symbolnum >> 16) & 0x0ff;
5213 the_bytes[5] = (ri->r_symbolnum >> 8) & 0x0ff;
5214 the_bytes[6] = ri->r_symbolnum & 0x0ff;
5215 the_bytes[7] = (((ri->r_pcrel << 7) & 0x80)
5216 | ((ri->r_length << 5) & 0x60)
5217 | ((ri->r_extern << 4) & 0x10));
5220 #endif
5222 #endif /* OBJ_AOUT or OBJ_BOUT */
5224 #ifndef WORKING_DOT_WORD
5225 int md_short_jump_size = 4;
5226 int md_long_jump_size = 6;
5228 void
5229 md_create_short_jump (char *ptr, addressT from_addr, addressT to_addr,
5230 fragS *frag ATTRIBUTE_UNUSED,
5231 symbolS *to_symbol ATTRIBUTE_UNUSED)
5233 valueT offset;
5235 offset = to_addr - (from_addr + 2);
5237 md_number_to_chars (ptr, (valueT) 0x6000, 2);
5238 md_number_to_chars (ptr + 2, (valueT) offset, 2);
5241 void
5242 md_create_long_jump (char *ptr, addressT from_addr, addressT to_addr,
5243 fragS *frag, symbolS *to_symbol)
5245 valueT offset;
5247 if (!HAVE_LONG_BRANCH (current_architecture))
5249 if (flag_keep_pcrel)
5250 as_fatal (_("Tried to convert PC relative branch to absolute jump"));
5251 offset = to_addr - S_GET_VALUE (to_symbol);
5252 md_number_to_chars (ptr, (valueT) 0x4EF9, 2);
5253 md_number_to_chars (ptr + 2, (valueT) offset, 4);
5254 fix_new (frag, (ptr + 2) - frag->fr_literal, 4, to_symbol, (offsetT) 0,
5255 0, NO_RELOC);
5257 else
5259 offset = to_addr - (from_addr + 2);
5260 md_number_to_chars (ptr, (valueT) 0x60ff, 2);
5261 md_number_to_chars (ptr + 2, (valueT) offset, 4);
5265 #endif
5267 /* Different values of OK tell what its OK to return. Things that
5268 aren't OK are an error (what a shock, no?)
5270 0: Everything is OK
5271 10: Absolute 1:8 only
5272 20: Absolute 0:7 only
5273 30: absolute 0:15 only
5274 40: Absolute 0:31 only
5275 50: absolute 0:127 only
5276 55: absolute -64:63 only
5277 60: absolute -128:127 only
5278 65: absolute 0:511 only
5279 70: absolute 0:4095 only
5280 80: absolute -1, 1:7 only
5281 90: No bignums. */
5283 static int
5284 get_num (struct m68k_exp *exp, int ok)
5286 if (exp->exp.X_op == O_absent)
5288 /* Do the same thing the VAX asm does. */
5289 op (exp) = O_constant;
5290 adds (exp) = 0;
5291 subs (exp) = 0;
5292 offs (exp) = 0;
5293 if (ok == 10)
5295 as_warn (_("expression out of range: defaulting to 1"));
5296 offs (exp) = 1;
5299 else if (exp->exp.X_op == O_constant)
5301 switch (ok)
5303 case 10:
5304 if ((valueT) TRUNC (offs (exp)) - 1 > 7)
5306 as_warn (_("expression out of range: defaulting to 1"));
5307 offs (exp) = 1;
5309 break;
5310 case 20:
5311 if ((valueT) TRUNC (offs (exp)) > 7)
5312 goto outrange;
5313 break;
5314 case 30:
5315 if ((valueT) TRUNC (offs (exp)) > 15)
5316 goto outrange;
5317 break;
5318 case 40:
5319 if ((valueT) TRUNC (offs (exp)) > 32)
5320 goto outrange;
5321 break;
5322 case 50:
5323 if ((valueT) TRUNC (offs (exp)) > 127)
5324 goto outrange;
5325 break;
5326 case 55:
5327 if ((valueT) SEXT (offs (exp)) + 64 > 127)
5328 goto outrange;
5329 break;
5330 case 60:
5331 if ((valueT) SEXT (offs (exp)) + 128 > 255)
5332 goto outrange;
5333 break;
5334 case 65:
5335 if ((valueT) TRUNC (offs (exp)) > 511)
5336 goto outrange;
5337 break;
5338 case 70:
5339 if ((valueT) TRUNC (offs (exp)) > 4095)
5341 outrange:
5342 as_warn (_("expression out of range: defaulting to 0"));
5343 offs (exp) = 0;
5345 break;
5346 case 80:
5347 if ((valueT) TRUNC (offs (exp)) != 0xffffffff
5348 && (valueT) TRUNC (offs (exp)) - 1 > 6)
5350 as_warn (_("expression out of range: defaulting to 1"));
5351 offs (exp) = 1;
5353 break;
5354 default:
5355 break;
5358 else if (exp->exp.X_op == O_big)
5360 if (offs (exp) <= 0 /* flonum. */
5361 && (ok == 90 /* no bignums */
5362 || (ok > 10 /* Small-int ranges including 0 ok. */
5363 /* If we have a flonum zero, a zero integer should
5364 do as well (e.g., in moveq). */
5365 && generic_floating_point_number.exponent == 0
5366 && generic_floating_point_number.low[0] == 0)))
5368 /* HACK! Turn it into a long. */
5369 LITTLENUM_TYPE words[6];
5371 gen_to_words (words, 2, 8L); /* These numbers are magic! */
5372 op (exp) = O_constant;
5373 adds (exp) = 0;
5374 subs (exp) = 0;
5375 offs (exp) = words[1] | (words[0] << 16);
5377 else if (ok != 0)
5379 op (exp) = O_constant;
5380 adds (exp) = 0;
5381 subs (exp) = 0;
5382 offs (exp) = (ok == 10) ? 1 : 0;
5383 as_warn (_("Can't deal with expression; defaulting to %ld"),
5384 (long) offs (exp));
5387 else
5389 if (ok >= 10 && ok <= 80)
5391 op (exp) = O_constant;
5392 adds (exp) = 0;
5393 subs (exp) = 0;
5394 offs (exp) = (ok == 10) ? 1 : 0;
5395 as_warn (_("Can't deal with expression; defaulting to %ld"),
5396 (long) offs (exp));
5400 if (exp->size != SIZE_UNSPEC)
5402 switch (exp->size)
5404 case SIZE_UNSPEC:
5405 case SIZE_LONG:
5406 break;
5407 case SIZE_BYTE:
5408 if (!isbyte (offs (exp)))
5409 as_warn (_("expression doesn't fit in BYTE"));
5410 break;
5411 case SIZE_WORD:
5412 if (!isword (offs (exp)))
5413 as_warn (_("expression doesn't fit in WORD"));
5414 break;
5418 return offs (exp);
5421 /* These are the back-ends for the various machine dependent pseudo-ops. */
5423 static void
5424 s_data1 (int ignore ATTRIBUTE_UNUSED)
5426 subseg_set (data_section, 1);
5427 demand_empty_rest_of_line ();
5430 static void
5431 s_data2 (int ignore ATTRIBUTE_UNUSED)
5433 subseg_set (data_section, 2);
5434 demand_empty_rest_of_line ();
5437 static void
5438 s_bss (int ignore ATTRIBUTE_UNUSED)
5440 /* We don't support putting frags in the BSS segment, we fake it
5441 by marking in_bss, then looking at s_skip for clues. */
5443 subseg_set (bss_section, 0);
5444 demand_empty_rest_of_line ();
5447 static void
5448 s_even (int ignore ATTRIBUTE_UNUSED)
5450 register int temp;
5451 register long temp_fill;
5453 temp = 1; /* JF should be 2? */
5454 temp_fill = get_absolute_expression ();
5455 if (!need_pass_2) /* Never make frag if expect extra pass. */
5456 frag_align (temp, (int) temp_fill, 0);
5457 demand_empty_rest_of_line ();
5458 record_alignment (now_seg, temp);
5461 static void
5462 s_proc (int ignore ATTRIBUTE_UNUSED)
5464 demand_empty_rest_of_line ();
5467 /* Pseudo-ops handled for MRI compatibility. */
5469 /* This function returns non-zero if the argument is a conditional
5470 pseudo-op. This is called when checking whether a pending
5471 alignment is needed. */
5474 m68k_conditional_pseudoop (pseudo_typeS *pop)
5476 return (pop->poc_handler == s_mri_if
5477 || pop->poc_handler == s_mri_else);
5480 /* Handle an MRI style chip specification. */
5482 static void
5483 mri_chip (void)
5485 char *s;
5486 char c;
5487 int i;
5489 s = input_line_pointer;
5490 /* We can't use get_symbol_end since the processor names are not proper
5491 symbols. */
5492 while (is_part_of_name (c = *input_line_pointer++))
5494 *--input_line_pointer = 0;
5495 for (i = 0; m68k_cpus[i].name; i++)
5496 if (strcasecmp (s, m68k_cpus[i].name) == 0)
5497 break;
5498 if (!m68k_cpus[i].name)
5500 as_bad (_("%s: unrecognized processor name"), s);
5501 *input_line_pointer = c;
5502 ignore_rest_of_line ();
5503 return;
5505 *input_line_pointer = c;
5507 if (*input_line_pointer == '/')
5508 current_architecture = 0;
5509 else
5510 current_architecture &= m68881 | m68851;
5511 current_architecture |= m68k_cpus[i].arch & ~(m68881 | m68851);
5512 control_regs = m68k_cpus[i].control_regs;
5514 while (*input_line_pointer == '/')
5516 ++input_line_pointer;
5517 s = input_line_pointer;
5518 /* We can't use get_symbol_end since the processor names are not
5519 proper symbols. */
5520 while (is_part_of_name (c = *input_line_pointer++))
5522 *--input_line_pointer = 0;
5523 if (strcmp (s, "68881") == 0)
5524 current_architecture |= m68881;
5525 else if (strcmp (s, "68851") == 0)
5526 current_architecture |= m68851;
5527 *input_line_pointer = c;
5531 /* The MRI CHIP pseudo-op. */
5533 static void
5534 s_chip (int ignore ATTRIBUTE_UNUSED)
5536 char *stop = NULL;
5537 char stopc;
5539 if (flag_mri)
5540 stop = mri_comment_field (&stopc);
5541 mri_chip ();
5542 if (flag_mri)
5543 mri_comment_end (stop, stopc);
5544 demand_empty_rest_of_line ();
5547 /* The MRI FOPT pseudo-op. */
5549 static void
5550 s_fopt (int ignore ATTRIBUTE_UNUSED)
5552 SKIP_WHITESPACE ();
5554 if (strncasecmp (input_line_pointer, "ID=", 3) == 0)
5556 int temp;
5558 input_line_pointer += 3;
5559 temp = get_absolute_expression ();
5560 if (temp < 0 || temp > 7)
5561 as_bad (_("bad coprocessor id"));
5562 else
5563 m68k_float_copnum = COP0 + temp;
5565 else
5567 as_bad (_("unrecognized fopt option"));
5568 ignore_rest_of_line ();
5569 return;
5572 demand_empty_rest_of_line ();
5575 /* The structure used to handle the MRI OPT pseudo-op. */
5577 struct opt_action
5579 /* The name of the option. */
5580 const char *name;
5582 /* If this is not NULL, just call this function. The first argument
5583 is the ARG field of this structure, the second argument is
5584 whether the option was negated. */
5585 void (*pfn) (int arg, int on);
5587 /* If this is not NULL, and the PFN field is NULL, set the variable
5588 this points to. Set it to the ARG field if the option was not
5589 negated, and the NOTARG field otherwise. */
5590 int *pvar;
5592 /* The value to pass to PFN or to assign to *PVAR. */
5593 int arg;
5595 /* The value to assign to *PVAR if the option is negated. If PFN is
5596 NULL, and PVAR is not NULL, and ARG and NOTARG are the same, then
5597 the option may not be negated. */
5598 int notarg;
5601 /* The table used to handle the MRI OPT pseudo-op. */
5603 static void skip_to_comma (int, int);
5604 static void opt_nest (int, int);
5605 static void opt_chip (int, int);
5606 static void opt_list (int, int);
5607 static void opt_list_symbols (int, int);
5609 static const struct opt_action opt_table[] =
5611 { "abspcadd", 0, &m68k_abspcadd, 1, 0 },
5613 /* We do relaxing, so there is little use for these options. */
5614 { "b", 0, 0, 0, 0 },
5615 { "brs", 0, 0, 0, 0 },
5616 { "brb", 0, 0, 0, 0 },
5617 { "brl", 0, 0, 0, 0 },
5618 { "brw", 0, 0, 0, 0 },
5620 { "c", 0, 0, 0, 0 },
5621 { "cex", 0, 0, 0, 0 },
5622 { "case", 0, &symbols_case_sensitive, 1, 0 },
5623 { "cl", 0, 0, 0, 0 },
5624 { "cre", 0, 0, 0, 0 },
5625 { "d", 0, &flag_keep_locals, 1, 0 },
5626 { "e", 0, 0, 0, 0 },
5627 { "f", 0, &flag_short_refs, 1, 0 },
5628 { "frs", 0, &flag_short_refs, 1, 0 },
5629 { "frl", 0, &flag_short_refs, 0, 1 },
5630 { "g", 0, 0, 0, 0 },
5631 { "i", 0, 0, 0, 0 },
5632 { "m", 0, 0, 0, 0 },
5633 { "mex", 0, 0, 0, 0 },
5634 { "mc", 0, 0, 0, 0 },
5635 { "md", 0, 0, 0, 0 },
5636 { "nest", opt_nest, 0, 0, 0 },
5637 { "next", skip_to_comma, 0, 0, 0 },
5638 { "o", 0, 0, 0, 0 },
5639 { "old", 0, 0, 0, 0 },
5640 { "op", skip_to_comma, 0, 0, 0 },
5641 { "pco", 0, 0, 0, 0 },
5642 { "p", opt_chip, 0, 0, 0 },
5643 { "pcr", 0, 0, 0, 0 },
5644 { "pcs", 0, 0, 0, 0 },
5645 { "r", 0, 0, 0, 0 },
5646 { "quick", 0, &m68k_quick, 1, 0 },
5647 { "rel32", 0, &m68k_rel32, 1, 0 },
5648 { "s", opt_list, 0, 0, 0 },
5649 { "t", opt_list_symbols, 0, 0, 0 },
5650 { "w", 0, &flag_no_warnings, 0, 1 },
5651 { "x", 0, 0, 0, 0 }
5654 #define OPTCOUNT ((int) (sizeof opt_table / sizeof opt_table[0]))
5656 /* The MRI OPT pseudo-op. */
5658 static void
5659 s_opt (int ignore ATTRIBUTE_UNUSED)
5663 int t;
5664 char *s;
5665 char c;
5666 int i;
5667 const struct opt_action *o;
5669 SKIP_WHITESPACE ();
5671 t = 1;
5672 if (*input_line_pointer == '-')
5674 ++input_line_pointer;
5675 t = 0;
5677 else if (strncasecmp (input_line_pointer, "NO", 2) == 0)
5679 input_line_pointer += 2;
5680 t = 0;
5683 s = input_line_pointer;
5684 c = get_symbol_end ();
5686 for (i = 0, o = opt_table; i < OPTCOUNT; i++, o++)
5688 if (strcasecmp (s, o->name) == 0)
5690 if (o->pfn)
5692 /* Restore input_line_pointer now in case the option
5693 takes arguments. */
5694 *input_line_pointer = c;
5695 (*o->pfn) (o->arg, t);
5697 else if (o->pvar != NULL)
5699 if (! t && o->arg == o->notarg)
5700 as_bad (_("option `%s' may not be negated"), s);
5701 *input_line_pointer = c;
5702 *o->pvar = t ? o->arg : o->notarg;
5704 else
5705 *input_line_pointer = c;
5706 break;
5709 if (i >= OPTCOUNT)
5711 as_bad (_("option `%s' not recognized"), s);
5712 *input_line_pointer = c;
5715 while (*input_line_pointer++ == ',');
5717 /* Move back to terminating character. */
5718 --input_line_pointer;
5719 demand_empty_rest_of_line ();
5722 /* Skip ahead to a comma. This is used for OPT options which we do
5723 not support and which take arguments. */
5725 static void
5726 skip_to_comma (int arg ATTRIBUTE_UNUSED, int on ATTRIBUTE_UNUSED)
5728 while (*input_line_pointer != ','
5729 && ! is_end_of_line[(unsigned char) *input_line_pointer])
5730 ++input_line_pointer;
5733 /* Handle the OPT NEST=depth option. */
5735 static void
5736 opt_nest (int arg ATTRIBUTE_UNUSED, int on ATTRIBUTE_UNUSED)
5738 if (*input_line_pointer != '=')
5740 as_bad (_("bad format of OPT NEST=depth"));
5741 return;
5744 ++input_line_pointer;
5745 max_macro_nest = get_absolute_expression ();
5748 /* Handle the OPT P=chip option. */
5750 static void
5751 opt_chip (int arg ATTRIBUTE_UNUSED, int on ATTRIBUTE_UNUSED)
5753 if (*input_line_pointer != '=')
5755 /* This is just OPT P, which we do not support. */
5756 return;
5759 ++input_line_pointer;
5760 mri_chip ();
5763 /* Handle the OPT S option. */
5765 static void
5766 opt_list (int arg ATTRIBUTE_UNUSED, int on)
5768 listing_list (on);
5771 /* Handle the OPT T option. */
5773 static void
5774 opt_list_symbols (int arg ATTRIBUTE_UNUSED, int on)
5776 if (on)
5777 listing |= LISTING_SYMBOLS;
5778 else
5779 listing &= ~LISTING_SYMBOLS;
5782 /* Handle the MRI REG pseudo-op. */
5784 static void
5785 s_reg (int ignore ATTRIBUTE_UNUSED)
5787 char *s;
5788 int c;
5789 struct m68k_op rop;
5790 int mask;
5791 char *stop = NULL;
5792 char stopc;
5794 if (line_label == NULL)
5796 as_bad (_("missing label"));
5797 ignore_rest_of_line ();
5798 return;
5801 if (flag_mri)
5802 stop = mri_comment_field (&stopc);
5804 SKIP_WHITESPACE ();
5806 s = input_line_pointer;
5807 while (ISALNUM (*input_line_pointer)
5808 #ifdef REGISTER_PREFIX
5809 || *input_line_pointer == REGISTER_PREFIX
5810 #endif
5811 || *input_line_pointer == '/'
5812 || *input_line_pointer == '-')
5813 ++input_line_pointer;
5814 c = *input_line_pointer;
5815 *input_line_pointer = '\0';
5817 if (m68k_ip_op (s, &rop) != 0)
5819 if (rop.error == NULL)
5820 as_bad (_("bad register list"));
5821 else
5822 as_bad (_("bad register list: %s"), rop.error);
5823 *input_line_pointer = c;
5824 ignore_rest_of_line ();
5825 return;
5828 *input_line_pointer = c;
5830 if (rop.mode == REGLST)
5831 mask = rop.mask;
5832 else if (rop.mode == DREG)
5833 mask = 1 << (rop.reg - DATA0);
5834 else if (rop.mode == AREG)
5835 mask = 1 << (rop.reg - ADDR0 + 8);
5836 else if (rop.mode == FPREG)
5837 mask = 1 << (rop.reg - FP0 + 16);
5838 else if (rop.mode == CONTROL
5839 && rop.reg == FPI)
5840 mask = 1 << 24;
5841 else if (rop.mode == CONTROL
5842 && rop.reg == FPS)
5843 mask = 1 << 25;
5844 else if (rop.mode == CONTROL
5845 && rop.reg == FPC)
5846 mask = 1 << 26;
5847 else
5849 as_bad (_("bad register list"));
5850 ignore_rest_of_line ();
5851 return;
5854 S_SET_SEGMENT (line_label, reg_section);
5855 S_SET_VALUE (line_label, ~mask);
5856 symbol_set_frag (line_label, &zero_address_frag);
5858 if (flag_mri)
5859 mri_comment_end (stop, stopc);
5861 demand_empty_rest_of_line ();
5864 /* This structure is used for the MRI SAVE and RESTORE pseudo-ops. */
5866 struct save_opts
5868 struct save_opts *next;
5869 int abspcadd;
5870 int symbols_case_sensitive;
5871 int keep_locals;
5872 int short_refs;
5873 int architecture;
5874 const enum m68k_register *control_regs;
5875 int quick;
5876 int rel32;
5877 int listing;
5878 int no_warnings;
5879 /* FIXME: We don't save OPT S. */
5882 /* This variable holds the stack of saved options. */
5884 static struct save_opts *save_stack;
5886 /* The MRI SAVE pseudo-op. */
5888 static void
5889 s_save (int ignore ATTRIBUTE_UNUSED)
5891 struct save_opts *s;
5893 s = (struct save_opts *) xmalloc (sizeof (struct save_opts));
5894 s->abspcadd = m68k_abspcadd;
5895 s->symbols_case_sensitive = symbols_case_sensitive;
5896 s->keep_locals = flag_keep_locals;
5897 s->short_refs = flag_short_refs;
5898 s->architecture = current_architecture;
5899 s->control_regs = control_regs;
5900 s->quick = m68k_quick;
5901 s->rel32 = m68k_rel32;
5902 s->listing = listing;
5903 s->no_warnings = flag_no_warnings;
5905 s->next = save_stack;
5906 save_stack = s;
5908 demand_empty_rest_of_line ();
5911 /* The MRI RESTORE pseudo-op. */
5913 static void
5914 s_restore (int ignore ATTRIBUTE_UNUSED)
5916 struct save_opts *s;
5918 if (save_stack == NULL)
5920 as_bad (_("restore without save"));
5921 ignore_rest_of_line ();
5922 return;
5925 s = save_stack;
5926 save_stack = s->next;
5928 m68k_abspcadd = s->abspcadd;
5929 symbols_case_sensitive = s->symbols_case_sensitive;
5930 flag_keep_locals = s->keep_locals;
5931 flag_short_refs = s->short_refs;
5932 current_architecture = s->architecture;
5933 control_regs = s->control_regs;
5934 m68k_quick = s->quick;
5935 m68k_rel32 = s->rel32;
5936 listing = s->listing;
5937 flag_no_warnings = s->no_warnings;
5939 free (s);
5941 demand_empty_rest_of_line ();
5944 /* Types of MRI structured control directives. */
5946 enum mri_control_type
5948 mri_for,
5949 mri_if,
5950 mri_repeat,
5951 mri_while
5954 /* This structure is used to stack the MRI structured control
5955 directives. */
5957 struct mri_control_info
5959 /* The directive within which this one is enclosed. */
5960 struct mri_control_info *outer;
5962 /* The type of directive. */
5963 enum mri_control_type type;
5965 /* Whether an ELSE has been in an IF. */
5966 int else_seen;
5968 /* The add or sub statement at the end of a FOR. */
5969 char *incr;
5971 /* The label of the top of a FOR or REPEAT loop. */
5972 char *top;
5974 /* The label to jump to for the next iteration, or the else
5975 expression of a conditional. */
5976 char *next;
5978 /* The label to jump to to break out of the loop, or the label past
5979 the end of a conditional. */
5980 char *bottom;
5983 /* The stack of MRI structured control directives. */
5985 static struct mri_control_info *mri_control_stack;
5987 /* The current MRI structured control directive index number, used to
5988 generate label names. */
5990 static int mri_control_index;
5992 /* Assemble an instruction for an MRI structured control directive. */
5994 static void
5995 mri_assemble (char *str)
5997 char *s;
5999 /* md_assemble expects the opcode to be in lower case. */
6000 for (s = str; *s != ' ' && *s != '\0'; s++)
6001 *s = TOLOWER (*s);
6003 md_assemble (str);
6006 /* Generate a new MRI label structured control directive label name. */
6008 static char *
6009 mri_control_label (void)
6011 char *n;
6013 n = (char *) xmalloc (20);
6014 sprintf (n, "%smc%d", FAKE_LABEL_NAME, mri_control_index);
6015 ++mri_control_index;
6016 return n;
6019 /* Create a new MRI structured control directive. */
6021 static struct mri_control_info *
6022 push_mri_control (enum mri_control_type type)
6024 struct mri_control_info *n;
6026 n = (struct mri_control_info *) xmalloc (sizeof (struct mri_control_info));
6028 n->type = type;
6029 n->else_seen = 0;
6030 if (type == mri_if || type == mri_while)
6031 n->top = NULL;
6032 else
6033 n->top = mri_control_label ();
6034 n->next = mri_control_label ();
6035 n->bottom = mri_control_label ();
6037 n->outer = mri_control_stack;
6038 mri_control_stack = n;
6040 return n;
6043 /* Pop off the stack of MRI structured control directives. */
6045 static void
6046 pop_mri_control (void)
6048 struct mri_control_info *n;
6050 n = mri_control_stack;
6051 mri_control_stack = n->outer;
6052 if (n->top != NULL)
6053 free (n->top);
6054 free (n->next);
6055 free (n->bottom);
6056 free (n);
6059 /* Recognize a condition code in an MRI structured control expression. */
6061 static int
6062 parse_mri_condition (int *pcc)
6064 char c1, c2;
6066 know (*input_line_pointer == '<');
6068 ++input_line_pointer;
6069 c1 = *input_line_pointer++;
6070 c2 = *input_line_pointer++;
6072 if (*input_line_pointer != '>')
6074 as_bad (_("syntax error in structured control directive"));
6075 return 0;
6078 ++input_line_pointer;
6079 SKIP_WHITESPACE ();
6081 c1 = TOLOWER (c1);
6082 c2 = TOLOWER (c2);
6084 *pcc = (c1 << 8) | c2;
6086 return 1;
6089 /* Parse a single operand in an MRI structured control expression. */
6091 static int
6092 parse_mri_control_operand (int *pcc, char **leftstart, char **leftstop,
6093 char **rightstart, char **rightstop)
6095 char *s;
6097 SKIP_WHITESPACE ();
6099 *pcc = -1;
6100 *leftstart = NULL;
6101 *leftstop = NULL;
6102 *rightstart = NULL;
6103 *rightstop = NULL;
6105 if (*input_line_pointer == '<')
6107 /* It's just a condition code. */
6108 return parse_mri_condition (pcc);
6111 /* Look ahead for the condition code. */
6112 for (s = input_line_pointer; *s != '\0'; ++s)
6114 if (*s == '<' && s[1] != '\0' && s[2] != '\0' && s[3] == '>')
6115 break;
6117 if (*s == '\0')
6119 as_bad (_("missing condition code in structured control directive"));
6120 return 0;
6123 *leftstart = input_line_pointer;
6124 *leftstop = s;
6125 if (*leftstop > *leftstart
6126 && ((*leftstop)[-1] == ' ' || (*leftstop)[-1] == '\t'))
6127 --*leftstop;
6129 input_line_pointer = s;
6130 if (! parse_mri_condition (pcc))
6131 return 0;
6133 /* Look ahead for AND or OR or end of line. */
6134 for (s = input_line_pointer; *s != '\0'; ++s)
6136 /* We must make sure we don't misinterpret AND/OR at the end of labels!
6137 if d0 <eq> #FOOAND and d1 <ne> #BAROR then
6138 ^^^ ^^ */
6139 if ((s == input_line_pointer
6140 || *(s-1) == ' '
6141 || *(s-1) == '\t')
6142 && ((strncasecmp (s, "AND", 3) == 0
6143 && (s[3] == '.' || ! is_part_of_name (s[3])))
6144 || (strncasecmp (s, "OR", 2) == 0
6145 && (s[2] == '.' || ! is_part_of_name (s[2])))))
6146 break;
6149 *rightstart = input_line_pointer;
6150 *rightstop = s;
6151 if (*rightstop > *rightstart
6152 && ((*rightstop)[-1] == ' ' || (*rightstop)[-1] == '\t'))
6153 --*rightstop;
6155 input_line_pointer = s;
6157 return 1;
6160 #define MCC(b1, b2) (((b1) << 8) | (b2))
6162 /* Swap the sense of a condition. This changes the condition so that
6163 it generates the same result when the operands are swapped. */
6165 static int
6166 swap_mri_condition (int cc)
6168 switch (cc)
6170 case MCC ('h', 'i'): return MCC ('c', 's');
6171 case MCC ('l', 's'): return MCC ('c', 'c');
6172 /* <HS> is an alias for <CC>. */
6173 case MCC ('h', 's'):
6174 case MCC ('c', 'c'): return MCC ('l', 's');
6175 /* <LO> is an alias for <CS>. */
6176 case MCC ('l', 'o'):
6177 case MCC ('c', 's'): return MCC ('h', 'i');
6178 case MCC ('p', 'l'): return MCC ('m', 'i');
6179 case MCC ('m', 'i'): return MCC ('p', 'l');
6180 case MCC ('g', 'e'): return MCC ('l', 'e');
6181 case MCC ('l', 't'): return MCC ('g', 't');
6182 case MCC ('g', 't'): return MCC ('l', 't');
6183 case MCC ('l', 'e'): return MCC ('g', 'e');
6184 /* Issue a warning for conditions we can not swap. */
6185 case MCC ('n', 'e'): return MCC ('n', 'e'); // no problem here
6186 case MCC ('e', 'q'): return MCC ('e', 'q'); // also no problem
6187 case MCC ('v', 'c'):
6188 case MCC ('v', 's'):
6189 default :
6190 as_warn (_("Condition <%c%c> in structured control directive can not be encoded correctly"),
6191 (char) (cc >> 8), (char) (cc));
6192 break;
6194 return cc;
6197 /* Reverse the sense of a condition. */
6199 static int
6200 reverse_mri_condition (int cc)
6202 switch (cc)
6204 case MCC ('h', 'i'): return MCC ('l', 's');
6205 case MCC ('l', 's'): return MCC ('h', 'i');
6206 /* <HS> is an alias for <CC> */
6207 case MCC ('h', 's'): return MCC ('l', 'o');
6208 case MCC ('c', 'c'): return MCC ('c', 's');
6209 /* <LO> is an alias for <CS> */
6210 case MCC ('l', 'o'): return MCC ('h', 's');
6211 case MCC ('c', 's'): return MCC ('c', 'c');
6212 case MCC ('n', 'e'): return MCC ('e', 'q');
6213 case MCC ('e', 'q'): return MCC ('n', 'e');
6214 case MCC ('v', 'c'): return MCC ('v', 's');
6215 case MCC ('v', 's'): return MCC ('v', 'c');
6216 case MCC ('p', 'l'): return MCC ('m', 'i');
6217 case MCC ('m', 'i'): return MCC ('p', 'l');
6218 case MCC ('g', 'e'): return MCC ('l', 't');
6219 case MCC ('l', 't'): return MCC ('g', 'e');
6220 case MCC ('g', 't'): return MCC ('l', 'e');
6221 case MCC ('l', 'e'): return MCC ('g', 't');
6223 return cc;
6226 /* Build an MRI structured control expression. This generates test
6227 and branch instructions. It goes to TRUELAB if the condition is
6228 true, and to FALSELAB if the condition is false. Exactly one of
6229 TRUELAB and FALSELAB will be NULL, meaning to fall through. QUAL
6230 is the size qualifier for the expression. EXTENT is the size to
6231 use for the branch. */
6233 static void
6234 build_mri_control_operand (int qual, int cc, char *leftstart, char *leftstop,
6235 char *rightstart, char *rightstop,
6236 const char *truelab, const char *falselab,
6237 int extent)
6239 char *buf;
6240 char *s;
6242 if (leftstart != NULL)
6244 struct m68k_op leftop, rightop;
6245 char c;
6247 /* Swap the compare operands, if necessary, to produce a legal
6248 m68k compare instruction. Comparing a register operand with
6249 a non-register operand requires the register to be on the
6250 right (cmp, cmpa). Comparing an immediate value with
6251 anything requires the immediate value to be on the left
6252 (cmpi). */
6254 c = *leftstop;
6255 *leftstop = '\0';
6256 (void) m68k_ip_op (leftstart, &leftop);
6257 *leftstop = c;
6259 c = *rightstop;
6260 *rightstop = '\0';
6261 (void) m68k_ip_op (rightstart, &rightop);
6262 *rightstop = c;
6264 if (rightop.mode == IMMED
6265 || ((leftop.mode == DREG || leftop.mode == AREG)
6266 && (rightop.mode != DREG && rightop.mode != AREG)))
6268 char *temp;
6270 /* Correct conditional handling:
6271 if #1 <lt> d0 then ;means if (1 < d0)
6273 endi
6275 should assemble to:
6277 cmp #1,d0 if we do *not* swap the operands
6278 bgt true we need the swapped condition!
6279 ble false
6280 true:
6282 false:
6284 temp = leftstart;
6285 leftstart = rightstart;
6286 rightstart = temp;
6287 temp = leftstop;
6288 leftstop = rightstop;
6289 rightstop = temp;
6291 else
6293 cc = swap_mri_condition (cc);
6297 if (truelab == NULL)
6299 cc = reverse_mri_condition (cc);
6300 truelab = falselab;
6303 if (leftstart != NULL)
6305 buf = (char *) xmalloc (20
6306 + (leftstop - leftstart)
6307 + (rightstop - rightstart));
6308 s = buf;
6309 *s++ = 'c';
6310 *s++ = 'm';
6311 *s++ = 'p';
6312 if (qual != '\0')
6313 *s++ = TOLOWER (qual);
6314 *s++ = ' ';
6315 memcpy (s, leftstart, leftstop - leftstart);
6316 s += leftstop - leftstart;
6317 *s++ = ',';
6318 memcpy (s, rightstart, rightstop - rightstart);
6319 s += rightstop - rightstart;
6320 *s = '\0';
6321 mri_assemble (buf);
6322 free (buf);
6325 buf = (char *) xmalloc (20 + strlen (truelab));
6326 s = buf;
6327 *s++ = 'b';
6328 *s++ = cc >> 8;
6329 *s++ = cc & 0xff;
6330 if (extent != '\0')
6331 *s++ = TOLOWER (extent);
6332 *s++ = ' ';
6333 strcpy (s, truelab);
6334 mri_assemble (buf);
6335 free (buf);
6338 /* Parse an MRI structured control expression. This generates test
6339 and branch instructions. STOP is where the expression ends. It
6340 goes to TRUELAB if the condition is true, and to FALSELAB if the
6341 condition is false. Exactly one of TRUELAB and FALSELAB will be
6342 NULL, meaning to fall through. QUAL is the size qualifier for the
6343 expression. EXTENT is the size to use for the branch. */
6345 static void
6346 parse_mri_control_expression (char *stop, int qual, const char *truelab,
6347 const char *falselab, int extent)
6349 int c;
6350 int cc;
6351 char *leftstart;
6352 char *leftstop;
6353 char *rightstart;
6354 char *rightstop;
6356 c = *stop;
6357 *stop = '\0';
6359 if (! parse_mri_control_operand (&cc, &leftstart, &leftstop,
6360 &rightstart, &rightstop))
6362 *stop = c;
6363 return;
6366 if (strncasecmp (input_line_pointer, "AND", 3) == 0)
6368 const char *flab;
6370 if (falselab != NULL)
6371 flab = falselab;
6372 else
6373 flab = mri_control_label ();
6375 build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart,
6376 rightstop, (const char *) NULL, flab, extent);
6378 input_line_pointer += 3;
6379 if (*input_line_pointer != '.'
6380 || input_line_pointer[1] == '\0')
6381 qual = '\0';
6382 else
6384 qual = input_line_pointer[1];
6385 input_line_pointer += 2;
6388 if (! parse_mri_control_operand (&cc, &leftstart, &leftstop,
6389 &rightstart, &rightstop))
6391 *stop = c;
6392 return;
6395 build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart,
6396 rightstop, truelab, falselab, extent);
6398 if (falselab == NULL)
6399 colon (flab);
6401 else if (strncasecmp (input_line_pointer, "OR", 2) == 0)
6403 const char *tlab;
6405 if (truelab != NULL)
6406 tlab = truelab;
6407 else
6408 tlab = mri_control_label ();
6410 build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart,
6411 rightstop, tlab, (const char *) NULL, extent);
6413 input_line_pointer += 2;
6414 if (*input_line_pointer != '.'
6415 || input_line_pointer[1] == '\0')
6416 qual = '\0';
6417 else
6419 qual = input_line_pointer[1];
6420 input_line_pointer += 2;
6423 if (! parse_mri_control_operand (&cc, &leftstart, &leftstop,
6424 &rightstart, &rightstop))
6426 *stop = c;
6427 return;
6430 build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart,
6431 rightstop, truelab, falselab, extent);
6433 if (truelab == NULL)
6434 colon (tlab);
6436 else
6438 build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart,
6439 rightstop, truelab, falselab, extent);
6442 *stop = c;
6443 if (input_line_pointer != stop)
6444 as_bad (_("syntax error in structured control directive"));
6447 /* Handle the MRI IF pseudo-op. This may be a structured control
6448 directive, or it may be a regular assembler conditional, depending
6449 on its operands. */
6451 static void
6452 s_mri_if (int qual)
6454 char *s;
6455 int c;
6456 struct mri_control_info *n;
6458 /* A structured control directive must end with THEN with an
6459 optional qualifier. */
6460 s = input_line_pointer;
6461 /* We only accept '*' as introduction of comments if preceded by white space
6462 or at first column of a line (I think this can't actually happen here?)
6463 This is important when assembling:
6464 if d0 <ne> 12(a0,d0*2) then
6465 if d0 <ne> #CONST*20 then. */
6466 while (! (is_end_of_line[(unsigned char) *s]
6467 || (flag_mri
6468 && *s == '*'
6469 && (s == input_line_pointer
6470 || *(s-1) == ' '
6471 || *(s-1) == '\t'))))
6472 ++s;
6473 --s;
6474 while (s > input_line_pointer && (*s == ' ' || *s == '\t'))
6475 --s;
6477 if (s - input_line_pointer > 1
6478 && s[-1] == '.')
6479 s -= 2;
6481 if (s - input_line_pointer < 3
6482 || strncasecmp (s - 3, "THEN", 4) != 0)
6484 if (qual != '\0')
6486 as_bad (_("missing then"));
6487 ignore_rest_of_line ();
6488 return;
6491 /* It's a conditional. */
6492 s_if (O_ne);
6493 return;
6496 /* Since this might be a conditional if, this pseudo-op will be
6497 called even if we are supported to be ignoring input. Double
6498 check now. Clobber *input_line_pointer so that ignore_input
6499 thinks that this is not a special pseudo-op. */
6500 c = *input_line_pointer;
6501 *input_line_pointer = 0;
6502 if (ignore_input ())
6504 *input_line_pointer = c;
6505 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6506 ++input_line_pointer;
6507 demand_empty_rest_of_line ();
6508 return;
6510 *input_line_pointer = c;
6512 n = push_mri_control (mri_if);
6514 parse_mri_control_expression (s - 3, qual, (const char *) NULL,
6515 n->next, s[1] == '.' ? s[2] : '\0');
6517 if (s[1] == '.')
6518 input_line_pointer = s + 3;
6519 else
6520 input_line_pointer = s + 1;
6522 if (flag_mri)
6524 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6525 ++input_line_pointer;
6528 demand_empty_rest_of_line ();
6531 /* Handle the MRI else pseudo-op. If we are currently doing an MRI
6532 structured IF, associate the ELSE with the IF. Otherwise, assume
6533 it is a conditional else. */
6535 static void
6536 s_mri_else (int qual)
6538 int c;
6539 char *buf;
6540 char q[2];
6542 if (qual == '\0'
6543 && (mri_control_stack == NULL
6544 || mri_control_stack->type != mri_if
6545 || mri_control_stack->else_seen))
6547 s_else (0);
6548 return;
6551 c = *input_line_pointer;
6552 *input_line_pointer = 0;
6553 if (ignore_input ())
6555 *input_line_pointer = c;
6556 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6557 ++input_line_pointer;
6558 demand_empty_rest_of_line ();
6559 return;
6561 *input_line_pointer = c;
6563 if (mri_control_stack == NULL
6564 || mri_control_stack->type != mri_if
6565 || mri_control_stack->else_seen)
6567 as_bad (_("else without matching if"));
6568 ignore_rest_of_line ();
6569 return;
6572 mri_control_stack->else_seen = 1;
6574 buf = (char *) xmalloc (20 + strlen (mri_control_stack->bottom));
6575 q[0] = TOLOWER (qual);
6576 q[1] = '\0';
6577 sprintf (buf, "bra%s %s", q, mri_control_stack->bottom);
6578 mri_assemble (buf);
6579 free (buf);
6581 colon (mri_control_stack->next);
6583 if (flag_mri)
6585 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6586 ++input_line_pointer;
6589 demand_empty_rest_of_line ();
6592 /* Handle the MRI ENDI pseudo-op. */
6594 static void
6595 s_mri_endi (int ignore ATTRIBUTE_UNUSED)
6597 if (mri_control_stack == NULL
6598 || mri_control_stack->type != mri_if)
6600 as_bad (_("endi without matching if"));
6601 ignore_rest_of_line ();
6602 return;
6605 /* ignore_input will not return true for ENDI, so we don't need to
6606 worry about checking it again here. */
6608 if (! mri_control_stack->else_seen)
6609 colon (mri_control_stack->next);
6610 colon (mri_control_stack->bottom);
6612 pop_mri_control ();
6614 if (flag_mri)
6616 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6617 ++input_line_pointer;
6620 demand_empty_rest_of_line ();
6623 /* Handle the MRI BREAK pseudo-op. */
6625 static void
6626 s_mri_break (int extent)
6628 struct mri_control_info *n;
6629 char *buf;
6630 char ex[2];
6632 n = mri_control_stack;
6633 while (n != NULL
6634 && n->type != mri_for
6635 && n->type != mri_repeat
6636 && n->type != mri_while)
6637 n = n->outer;
6638 if (n == NULL)
6640 as_bad (_("break outside of structured loop"));
6641 ignore_rest_of_line ();
6642 return;
6645 buf = (char *) xmalloc (20 + strlen (n->bottom));
6646 ex[0] = TOLOWER (extent);
6647 ex[1] = '\0';
6648 sprintf (buf, "bra%s %s", ex, n->bottom);
6649 mri_assemble (buf);
6650 free (buf);
6652 if (flag_mri)
6654 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6655 ++input_line_pointer;
6658 demand_empty_rest_of_line ();
6661 /* Handle the MRI NEXT pseudo-op. */
6663 static void
6664 s_mri_next (int extent)
6666 struct mri_control_info *n;
6667 char *buf;
6668 char ex[2];
6670 n = mri_control_stack;
6671 while (n != NULL
6672 && n->type != mri_for
6673 && n->type != mri_repeat
6674 && n->type != mri_while)
6675 n = n->outer;
6676 if (n == NULL)
6678 as_bad (_("next outside of structured loop"));
6679 ignore_rest_of_line ();
6680 return;
6683 buf = (char *) xmalloc (20 + strlen (n->next));
6684 ex[0] = TOLOWER (extent);
6685 ex[1] = '\0';
6686 sprintf (buf, "bra%s %s", ex, n->next);
6687 mri_assemble (buf);
6688 free (buf);
6690 if (flag_mri)
6692 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6693 ++input_line_pointer;
6696 demand_empty_rest_of_line ();
6699 /* Handle the MRI FOR pseudo-op. */
6701 static void
6702 s_mri_for (int qual)
6704 const char *varstart, *varstop;
6705 const char *initstart, *initstop;
6706 const char *endstart, *endstop;
6707 const char *bystart, *bystop;
6708 int up;
6709 int by;
6710 int extent;
6711 struct mri_control_info *n;
6712 char *buf;
6713 char *s;
6714 char ex[2];
6716 /* The syntax is
6717 FOR.q var = init { TO | DOWNTO } end [ BY by ] DO.e
6720 SKIP_WHITESPACE ();
6721 varstart = input_line_pointer;
6723 /* Look for the '='. */
6724 while (! is_end_of_line[(unsigned char) *input_line_pointer]
6725 && *input_line_pointer != '=')
6726 ++input_line_pointer;
6727 if (*input_line_pointer != '=')
6729 as_bad (_("missing ="));
6730 ignore_rest_of_line ();
6731 return;
6734 varstop = input_line_pointer;
6735 if (varstop > varstart
6736 && (varstop[-1] == ' ' || varstop[-1] == '\t'))
6737 --varstop;
6739 ++input_line_pointer;
6741 initstart = input_line_pointer;
6743 /* Look for TO or DOWNTO. */
6744 up = 1;
6745 initstop = NULL;
6746 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6748 if (strncasecmp (input_line_pointer, "TO", 2) == 0
6749 && ! is_part_of_name (input_line_pointer[2]))
6751 initstop = input_line_pointer;
6752 input_line_pointer += 2;
6753 break;
6755 if (strncasecmp (input_line_pointer, "DOWNTO", 6) == 0
6756 && ! is_part_of_name (input_line_pointer[6]))
6758 initstop = input_line_pointer;
6759 up = 0;
6760 input_line_pointer += 6;
6761 break;
6763 ++input_line_pointer;
6765 if (initstop == NULL)
6767 as_bad (_("missing to or downto"));
6768 ignore_rest_of_line ();
6769 return;
6771 if (initstop > initstart
6772 && (initstop[-1] == ' ' || initstop[-1] == '\t'))
6773 --initstop;
6775 SKIP_WHITESPACE ();
6776 endstart = input_line_pointer;
6778 /* Look for BY or DO. */
6779 by = 0;
6780 endstop = NULL;
6781 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6783 if (strncasecmp (input_line_pointer, "BY", 2) == 0
6784 && ! is_part_of_name (input_line_pointer[2]))
6786 endstop = input_line_pointer;
6787 by = 1;
6788 input_line_pointer += 2;
6789 break;
6791 if (strncasecmp (input_line_pointer, "DO", 2) == 0
6792 && (input_line_pointer[2] == '.'
6793 || ! is_part_of_name (input_line_pointer[2])))
6795 endstop = input_line_pointer;
6796 input_line_pointer += 2;
6797 break;
6799 ++input_line_pointer;
6801 if (endstop == NULL)
6803 as_bad (_("missing do"));
6804 ignore_rest_of_line ();
6805 return;
6807 if (endstop > endstart
6808 && (endstop[-1] == ' ' || endstop[-1] == '\t'))
6809 --endstop;
6811 if (! by)
6813 bystart = "#1";
6814 bystop = bystart + 2;
6816 else
6818 SKIP_WHITESPACE ();
6819 bystart = input_line_pointer;
6821 /* Look for DO. */
6822 bystop = NULL;
6823 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6825 if (strncasecmp (input_line_pointer, "DO", 2) == 0
6826 && (input_line_pointer[2] == '.'
6827 || ! is_part_of_name (input_line_pointer[2])))
6829 bystop = input_line_pointer;
6830 input_line_pointer += 2;
6831 break;
6833 ++input_line_pointer;
6835 if (bystop == NULL)
6837 as_bad (_("missing do"));
6838 ignore_rest_of_line ();
6839 return;
6841 if (bystop > bystart
6842 && (bystop[-1] == ' ' || bystop[-1] == '\t'))
6843 --bystop;
6846 if (*input_line_pointer != '.')
6847 extent = '\0';
6848 else
6850 extent = input_line_pointer[1];
6851 input_line_pointer += 2;
6854 /* We have fully parsed the FOR operands. Now build the loop. */
6855 n = push_mri_control (mri_for);
6857 buf = (char *) xmalloc (50 + (input_line_pointer - varstart));
6859 /* Move init,var. */
6860 s = buf;
6861 *s++ = 'm';
6862 *s++ = 'o';
6863 *s++ = 'v';
6864 *s++ = 'e';
6865 if (qual != '\0')
6866 *s++ = TOLOWER (qual);
6867 *s++ = ' ';
6868 memcpy (s, initstart, initstop - initstart);
6869 s += initstop - initstart;
6870 *s++ = ',';
6871 memcpy (s, varstart, varstop - varstart);
6872 s += varstop - varstart;
6873 *s = '\0';
6874 mri_assemble (buf);
6876 colon (n->top);
6878 /* cmp end,var. */
6879 s = buf;
6880 *s++ = 'c';
6881 *s++ = 'm';
6882 *s++ = 'p';
6883 if (qual != '\0')
6884 *s++ = TOLOWER (qual);
6885 *s++ = ' ';
6886 memcpy (s, endstart, endstop - endstart);
6887 s += endstop - endstart;
6888 *s++ = ',';
6889 memcpy (s, varstart, varstop - varstart);
6890 s += varstop - varstart;
6891 *s = '\0';
6892 mri_assemble (buf);
6894 /* bcc bottom. */
6895 ex[0] = TOLOWER (extent);
6896 ex[1] = '\0';
6897 if (up)
6898 sprintf (buf, "blt%s %s", ex, n->bottom);
6899 else
6900 sprintf (buf, "bgt%s %s", ex, n->bottom);
6901 mri_assemble (buf);
6903 /* Put together the add or sub instruction used by ENDF. */
6904 s = buf;
6905 if (up)
6906 strcpy (s, "add");
6907 else
6908 strcpy (s, "sub");
6909 s += 3;
6910 if (qual != '\0')
6911 *s++ = TOLOWER (qual);
6912 *s++ = ' ';
6913 memcpy (s, bystart, bystop - bystart);
6914 s += bystop - bystart;
6915 *s++ = ',';
6916 memcpy (s, varstart, varstop - varstart);
6917 s += varstop - varstart;
6918 *s = '\0';
6919 n->incr = buf;
6921 if (flag_mri)
6923 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6924 ++input_line_pointer;
6927 demand_empty_rest_of_line ();
6930 /* Handle the MRI ENDF pseudo-op. */
6932 static void
6933 s_mri_endf (int ignore ATTRIBUTE_UNUSED)
6935 if (mri_control_stack == NULL
6936 || mri_control_stack->type != mri_for)
6938 as_bad (_("endf without for"));
6939 ignore_rest_of_line ();
6940 return;
6943 colon (mri_control_stack->next);
6945 mri_assemble (mri_control_stack->incr);
6947 sprintf (mri_control_stack->incr, "bra %s", mri_control_stack->top);
6948 mri_assemble (mri_control_stack->incr);
6950 free (mri_control_stack->incr);
6952 colon (mri_control_stack->bottom);
6954 pop_mri_control ();
6956 if (flag_mri)
6958 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6959 ++input_line_pointer;
6962 demand_empty_rest_of_line ();
6965 /* Handle the MRI REPEAT pseudo-op. */
6967 static void
6968 s_mri_repeat (int ignore ATTRIBUTE_UNUSED)
6970 struct mri_control_info *n;
6972 n = push_mri_control (mri_repeat);
6973 colon (n->top);
6974 if (flag_mri)
6976 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6977 ++input_line_pointer;
6979 demand_empty_rest_of_line ();
6982 /* Handle the MRI UNTIL pseudo-op. */
6984 static void
6985 s_mri_until (int qual)
6987 char *s;
6989 if (mri_control_stack == NULL
6990 || mri_control_stack->type != mri_repeat)
6992 as_bad (_("until without repeat"));
6993 ignore_rest_of_line ();
6994 return;
6997 colon (mri_control_stack->next);
6999 for (s = input_line_pointer; ! is_end_of_line[(unsigned char) *s]; s++)
7002 parse_mri_control_expression (s, qual, (const char *) NULL,
7003 mri_control_stack->top, '\0');
7005 colon (mri_control_stack->bottom);
7007 input_line_pointer = s;
7009 pop_mri_control ();
7011 if (flag_mri)
7013 while (! is_end_of_line[(unsigned char) *input_line_pointer])
7014 ++input_line_pointer;
7017 demand_empty_rest_of_line ();
7020 /* Handle the MRI WHILE pseudo-op. */
7022 static void
7023 s_mri_while (int qual)
7025 char *s;
7027 struct mri_control_info *n;
7029 s = input_line_pointer;
7030 /* We only accept '*' as introduction of comments if preceded by white space
7031 or at first column of a line (I think this can't actually happen here?)
7032 This is important when assembling:
7033 while d0 <ne> 12(a0,d0*2) do
7034 while d0 <ne> #CONST*20 do. */
7035 while (! (is_end_of_line[(unsigned char) *s]
7036 || (flag_mri
7037 && *s == '*'
7038 && (s == input_line_pointer
7039 || *(s-1) == ' '
7040 || *(s-1) == '\t'))))
7041 s++;
7042 --s;
7043 while (*s == ' ' || *s == '\t')
7044 --s;
7045 if (s - input_line_pointer > 1
7046 && s[-1] == '.')
7047 s -= 2;
7048 if (s - input_line_pointer < 2
7049 || strncasecmp (s - 1, "DO", 2) != 0)
7051 as_bad (_("missing do"));
7052 ignore_rest_of_line ();
7053 return;
7056 n = push_mri_control (mri_while);
7058 colon (n->next);
7060 parse_mri_control_expression (s - 1, qual, (const char *) NULL, n->bottom,
7061 s[1] == '.' ? s[2] : '\0');
7063 input_line_pointer = s + 1;
7064 if (*input_line_pointer == '.')
7065 input_line_pointer += 2;
7067 if (flag_mri)
7069 while (! is_end_of_line[(unsigned char) *input_line_pointer])
7070 ++input_line_pointer;
7073 demand_empty_rest_of_line ();
7076 /* Handle the MRI ENDW pseudo-op. */
7078 static void
7079 s_mri_endw (int ignore ATTRIBUTE_UNUSED)
7081 char *buf;
7083 if (mri_control_stack == NULL
7084 || mri_control_stack->type != mri_while)
7086 as_bad (_("endw without while"));
7087 ignore_rest_of_line ();
7088 return;
7091 buf = (char *) xmalloc (20 + strlen (mri_control_stack->next));
7092 sprintf (buf, "bra %s", mri_control_stack->next);
7093 mri_assemble (buf);
7094 free (buf);
7096 colon (mri_control_stack->bottom);
7098 pop_mri_control ();
7100 if (flag_mri)
7102 while (! is_end_of_line[(unsigned char) *input_line_pointer])
7103 ++input_line_pointer;
7106 demand_empty_rest_of_line ();
7109 /* Parse a .cpu directive. */
7111 static void
7112 s_m68k_cpu (int ignored ATTRIBUTE_UNUSED)
7114 char saved_char;
7115 char *name;
7117 if (initialized)
7119 as_bad (_("already assembled instructions"));
7120 ignore_rest_of_line ();
7121 return;
7124 name = input_line_pointer;
7125 while (*input_line_pointer && !ISSPACE(*input_line_pointer))
7126 input_line_pointer++;
7127 saved_char = *input_line_pointer;
7128 *input_line_pointer = 0;
7130 m68k_set_cpu (name, 1, 0);
7132 *input_line_pointer = saved_char;
7133 demand_empty_rest_of_line ();
7134 return;
7137 /* Parse a .arch directive. */
7139 static void
7140 s_m68k_arch (int ignored ATTRIBUTE_UNUSED)
7142 char saved_char;
7143 char *name;
7145 if (initialized)
7147 as_bad (_("already assembled instructions"));
7148 ignore_rest_of_line ();
7149 return;
7152 name = input_line_pointer;
7153 while (*input_line_pointer && *input_line_pointer != ','
7154 && !ISSPACE (*input_line_pointer))
7155 input_line_pointer++;
7156 saved_char = *input_line_pointer;
7157 *input_line_pointer = 0;
7159 if (m68k_set_arch (name, 1, 0))
7161 /* Scan extensions. */
7164 *input_line_pointer++ = saved_char;
7165 if (!*input_line_pointer || ISSPACE (*input_line_pointer))
7166 break;
7167 name = input_line_pointer;
7168 while (*input_line_pointer && *input_line_pointer != ','
7169 && !ISSPACE (*input_line_pointer))
7170 input_line_pointer++;
7171 saved_char = *input_line_pointer;
7172 *input_line_pointer = 0;
7174 while (m68k_set_extension (name, 1, 0));
7177 *input_line_pointer = saved_char;
7178 demand_empty_rest_of_line ();
7179 return;
7182 /* Lookup a cpu name in TABLE and return the slot found. Return NULL
7183 if none is found, the caller is responsible for emitting an error
7184 message. If ALLOW_M is non-zero, we allow an initial 'm' on the
7185 cpu name, if it begins with a '6' (possibly skipping an intervening
7186 'c'. We also allow a 'c' in the same place. if NEGATED is
7187 non-zero, we accept a leading 'no-' and *NEGATED is set to true, if
7188 the option is indeed negated. */
7190 static const struct m68k_cpu *
7191 m68k_lookup_cpu (const char *arg, const struct m68k_cpu *table,
7192 int allow_m, int *negated)
7194 /* allow negated value? */
7195 if (negated)
7197 *negated = 0;
7199 if (arg[0] == 'n' && arg[1] == 'o' && arg[2] == '-')
7201 arg += 3;
7202 *negated = 1;
7206 /* Remove 'm' or 'mc' prefix from 68k variants. */
7207 if (allow_m)
7209 if (arg[0] == 'm')
7211 if (arg[1] == '6')
7212 arg += 1;
7213 else if (arg[1] == 'c' && arg[2] == '6')
7214 arg += 2;
7217 else if (arg[0] == 'c' && arg[1] == '6')
7218 arg += 1;
7220 for (; table->name; table++)
7221 if (!strcmp (arg, table->name))
7223 if (table->alias < -1 || table->alias > 1)
7224 as_bad (_("`%s' is deprecated, use `%s'"),
7225 table->name, table[table->alias < 0 ? 1 : -1].name);
7226 return table;
7228 return 0;
7231 /* Set the cpu, issuing errors if it is unrecognized, or invalid */
7233 static int
7234 m68k_set_cpu (char const *name, int allow_m, int silent)
7236 const struct m68k_cpu *cpu;
7238 cpu = m68k_lookup_cpu (name, m68k_cpus, allow_m, NULL);
7240 if (!cpu)
7242 if (!silent)
7243 as_bad (_("cpu `%s' unrecognized"), name);
7244 return 0;
7247 if (selected_cpu && selected_cpu != cpu)
7249 as_bad (_("already selected `%s' processor"),
7250 selected_cpu->name);
7251 return 0;
7253 selected_cpu = cpu;
7254 return 1;
7257 /* Set the architecture, issuing errors if it is unrecognized, or invalid */
7259 static int
7260 m68k_set_arch (char const *name, int allow_m, int silent)
7262 const struct m68k_cpu *arch;
7264 arch = m68k_lookup_cpu (name, m68k_archs, allow_m, NULL);
7266 if (!arch)
7268 if (!silent)
7269 as_bad (_("architecture `%s' unrecognized"), name);
7270 return 0;
7273 if (selected_arch && selected_arch != arch)
7275 as_bad (_("already selected `%s' architecture"),
7276 selected_arch->name);
7277 return 0;
7280 selected_arch = arch;
7281 return 1;
7284 /* Set the architecture extension, issuing errors if it is
7285 unrecognized, or invalid */
7287 static int
7288 m68k_set_extension (char const *name, int allow_m, int silent)
7290 int negated;
7291 const struct m68k_cpu *ext;
7293 ext = m68k_lookup_cpu (name, m68k_extensions, allow_m, &negated);
7295 if (!ext)
7297 if (!silent)
7298 as_bad (_("extension `%s' unrecognized"), name);
7299 return 0;
7302 if (negated)
7303 not_current_architecture |= ext->arch;
7304 else
7305 current_architecture |= ext->arch;
7306 return 1;
7309 /* md_parse_option
7310 Invocation line includes a switch not recognized by the base assembler.
7313 #ifdef OBJ_ELF
7314 const char *md_shortopts = "lSA:m:kQ:V";
7315 #else
7316 const char *md_shortopts = "lSA:m:k";
7317 #endif
7319 struct option md_longopts[] = {
7320 #define OPTION_PIC (OPTION_MD_BASE)
7321 {"pic", no_argument, NULL, OPTION_PIC},
7322 #define OPTION_REGISTER_PREFIX_OPTIONAL (OPTION_MD_BASE + 1)
7323 {"register-prefix-optional", no_argument, NULL,
7324 OPTION_REGISTER_PREFIX_OPTIONAL},
7325 #define OPTION_BITWISE_OR (OPTION_MD_BASE + 2)
7326 {"bitwise-or", no_argument, NULL, OPTION_BITWISE_OR},
7327 #define OPTION_BASE_SIZE_DEFAULT_16 (OPTION_MD_BASE + 3)
7328 {"base-size-default-16", no_argument, NULL, OPTION_BASE_SIZE_DEFAULT_16},
7329 #define OPTION_BASE_SIZE_DEFAULT_32 (OPTION_MD_BASE + 4)
7330 {"base-size-default-32", no_argument, NULL, OPTION_BASE_SIZE_DEFAULT_32},
7331 #define OPTION_DISP_SIZE_DEFAULT_16 (OPTION_MD_BASE + 5)
7332 {"disp-size-default-16", no_argument, NULL, OPTION_DISP_SIZE_DEFAULT_16},
7333 #define OPTION_DISP_SIZE_DEFAULT_32 (OPTION_MD_BASE + 6)
7334 {"disp-size-default-32", no_argument, NULL, OPTION_DISP_SIZE_DEFAULT_32},
7335 #define OPTION_PCREL (OPTION_MD_BASE + 7)
7336 {"pcrel", no_argument, NULL, OPTION_PCREL},
7337 {NULL, no_argument, NULL, 0}
7339 size_t md_longopts_size = sizeof (md_longopts);
7342 md_parse_option (int c, char *arg)
7344 switch (c)
7346 case 'l': /* -l means keep external to 2 bit offset
7347 rather than 16 bit one. */
7348 flag_short_refs = 1;
7349 break;
7351 case 'S': /* -S means that jbsr's always turn into
7352 jsr's. */
7353 flag_long_jumps = 1;
7354 break;
7356 case OPTION_PCREL: /* --pcrel means never turn PC-relative
7357 branches into absolute jumps. */
7358 flag_keep_pcrel = 1;
7359 break;
7361 case OPTION_PIC:
7362 case 'k':
7363 flag_want_pic = 1;
7364 break; /* -pic, Position Independent Code. */
7366 case OPTION_REGISTER_PREFIX_OPTIONAL:
7367 flag_reg_prefix_optional = 1;
7368 reg_prefix_optional_seen = 1;
7369 break;
7371 /* -V: SVR4 argument to print version ID. */
7372 case 'V':
7373 print_version_id ();
7374 break;
7376 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
7377 should be emitted or not. FIXME: Not implemented. */
7378 case 'Q':
7379 break;
7381 case OPTION_BITWISE_OR:
7383 char *n, *t;
7384 const char *s;
7386 n = (char *) xmalloc (strlen (m68k_comment_chars) + 1);
7387 t = n;
7388 for (s = m68k_comment_chars; *s != '\0'; s++)
7389 if (*s != '|')
7390 *t++ = *s;
7391 *t = '\0';
7392 m68k_comment_chars = n;
7394 break;
7396 case OPTION_BASE_SIZE_DEFAULT_16:
7397 m68k_index_width_default = SIZE_WORD;
7398 break;
7400 case OPTION_BASE_SIZE_DEFAULT_32:
7401 m68k_index_width_default = SIZE_LONG;
7402 break;
7404 case OPTION_DISP_SIZE_DEFAULT_16:
7405 m68k_rel32 = 0;
7406 m68k_rel32_from_cmdline = 1;
7407 break;
7409 case OPTION_DISP_SIZE_DEFAULT_32:
7410 m68k_rel32 = 1;
7411 m68k_rel32_from_cmdline = 1;
7412 break;
7414 case 'A':
7415 #if WARN_DEPRECATED
7416 as_tsktsk (_ ("option `-A%s' is deprecated: use `-%s'",
7417 arg, arg));
7418 #endif
7419 /* Intentional fall-through. */
7420 case 'm':
7421 if (!strncmp (arg, "arch=", 5))
7422 m68k_set_arch (arg + 5, 1, 0);
7423 else if (!strncmp (arg, "cpu=", 4))
7424 m68k_set_cpu (arg + 4, 1, 0);
7425 else if (m68k_set_extension (arg, 0, 1))
7427 else if (m68k_set_arch (arg, 0, 1))
7429 else if (m68k_set_cpu (arg, 0, 1))
7431 else
7432 return 0;
7433 break;
7435 default:
7436 return 0;
7439 return 1;
7442 /* Setup tables from the selected arch and/or cpu */
7444 static void
7445 m68k_init_arch (void)
7447 if (not_current_architecture & current_architecture)
7449 as_bad (_("architecture features both enabled and disabled"));
7450 not_current_architecture &= ~current_architecture;
7452 if (selected_arch)
7454 current_architecture |= selected_arch->arch;
7455 control_regs = selected_arch->control_regs;
7457 else
7458 current_architecture |= selected_cpu->arch;
7460 current_architecture &= ~not_current_architecture;
7462 if ((current_architecture & (cfloat | m68881)) == (cfloat | m68881))
7464 /* Determine which float is really meant. */
7465 if (current_architecture & (m68k_mask & ~m68881))
7466 current_architecture ^= cfloat;
7467 else
7468 current_architecture ^= m68881;
7471 if (selected_cpu)
7473 control_regs = selected_cpu->control_regs;
7474 if (current_architecture & ~selected_cpu->arch)
7476 as_bad (_("selected processor does not have all features of selected architecture"));
7477 current_architecture
7478 = selected_cpu->arch & ~not_current_architecture;
7482 if ((current_architecture & m68k_mask)
7483 && (current_architecture & ~m68k_mask))
7485 as_bad (_ ("m68k and cf features both selected"));
7486 if (current_architecture & m68k_mask)
7487 current_architecture &= m68k_mask;
7488 else
7489 current_architecture &= ~m68k_mask;
7492 /* Permit m68881 specification with all cpus; those that can't work
7493 with a coprocessor could be doing emulation. */
7494 if (current_architecture & m68851)
7496 if (current_architecture & m68040)
7497 as_warn (_("68040 and 68851 specified; mmu instructions may assemble incorrectly"));
7499 /* What other incompatibilities could we check for? */
7501 if (cpu_of_arch (current_architecture) < m68020
7502 || arch_coldfire_p (current_architecture))
7503 md_relax_table[TAB (PCINDEX, BYTE)].rlx_more = 0;
7505 initialized = 1;
7508 void
7509 md_show_usage (FILE *stream)
7511 const char *default_cpu = TARGET_CPU;
7512 int i;
7513 unsigned int default_arch;
7515 /* Get the canonical name for the default target CPU. */
7516 if (*default_cpu == 'm')
7517 default_cpu++;
7518 for (i = 0; m68k_cpus[i].name; i++)
7520 if (strcasecmp (default_cpu, m68k_cpus[i].name) == 0)
7522 default_arch = m68k_cpus[i].arch;
7523 while (m68k_cpus[i].alias > 0)
7524 i--;
7525 while (m68k_cpus[i].alias < 0)
7526 i++;
7527 default_cpu = m68k_cpus[i].name;
7531 fprintf (stream, _("\
7532 -march=<arch> set architecture\n\
7533 -mcpu=<cpu> set cpu [default %s]\n\
7534 "), default_cpu);
7535 for (i = 0; m68k_extensions[i].name; i++)
7536 fprintf (stream, _("\
7537 -m[no-]%-16s enable/disable%s architecture extension\n\
7538 "), m68k_extensions[i].name,
7539 m68k_extensions[i].alias > 0 ? " ColdFire"
7540 : m68k_extensions[i].alias < 0 ? " m68k" : "");
7542 fprintf (stream, _("\
7543 -l use 1 word for refs to undefined symbols [default 2]\n\
7544 -pic, -k generate position independent code\n\
7545 -S turn jbsr into jsr\n\
7546 --pcrel never turn PC-relative branches into absolute jumps\n\
7547 --register-prefix-optional\n\
7548 recognize register names without prefix character\n\
7549 --bitwise-or do not treat `|' as a comment character\n\
7550 --base-size-default-16 base reg without size is 16 bits\n\
7551 --base-size-default-32 base reg without size is 32 bits (default)\n\
7552 --disp-size-default-16 displacement with unknown size is 16 bits\n\
7553 --disp-size-default-32 displacement with unknown size is 32 bits (default)\n\
7554 "));
7556 fprintf (stream, _("Architecture variants are: "));
7557 for (i = 0; m68k_archs[i].name; i++)
7559 if (i)
7560 fprintf (stream, " | ");
7561 fprintf (stream, m68k_archs[i].name);
7563 fprintf (stream, "\n");
7565 fprintf (stream, _("Processor variants are: "));
7566 for (i = 0; m68k_cpus[i].name; i++)
7568 if (i)
7569 fprintf (stream, " | ");
7570 fprintf (stream, m68k_cpus[i].name);
7572 fprintf (stream, _("\n"));
7575 #ifdef TEST2
7577 /* TEST2: Test md_assemble() */
7578 /* Warning, this routine probably doesn't work anymore. */
7580 main (void)
7582 struct m68k_it the_ins;
7583 char buf[120];
7584 char *cp;
7585 int n;
7587 m68k_ip_begin ();
7588 for (;;)
7590 if (!gets (buf) || !*buf)
7591 break;
7592 if (buf[0] == '|' || buf[1] == '.')
7593 continue;
7594 for (cp = buf; *cp; cp++)
7595 if (*cp == '\t')
7596 *cp = ' ';
7597 if (is_label (buf))
7598 continue;
7599 memset (&the_ins, '\0', sizeof (the_ins));
7600 m68k_ip (&the_ins, buf);
7601 if (the_ins.error)
7603 printf (_("Error %s in %s\n"), the_ins.error, buf);
7605 else
7607 printf (_("Opcode(%d.%s): "), the_ins.numo, the_ins.args);
7608 for (n = 0; n < the_ins.numo; n++)
7609 printf (" 0x%x", the_ins.opcode[n] & 0xffff);
7610 printf (" ");
7611 print_the_insn (&the_ins.opcode[0], stdout);
7612 (void) putchar ('\n');
7614 for (n = 0; n < strlen (the_ins.args) / 2; n++)
7616 if (the_ins.operands[n].error)
7618 printf ("op%d Error %s in %s\n", n, the_ins.operands[n].error, buf);
7619 continue;
7621 printf ("mode %d, reg %d, ", the_ins.operands[n].mode,
7622 the_ins.operands[n].reg);
7623 if (the_ins.operands[n].b_const)
7624 printf ("Constant: '%.*s', ",
7625 1 + the_ins.operands[n].e_const - the_ins.operands[n].b_const,
7626 the_ins.operands[n].b_const);
7627 printf ("ireg %d, isiz %d, imul %d, ", the_ins.operands[n].ireg,
7628 the_ins.operands[n].isiz, the_ins.operands[n].imul);
7629 if (the_ins.operands[n].b_iadd)
7630 printf ("Iadd: '%.*s',",
7631 1 + the_ins.operands[n].e_iadd - the_ins.operands[n].b_iadd,
7632 the_ins.operands[n].b_iadd);
7633 putchar ('\n');
7636 m68k_ip_end ();
7637 return 0;
7641 is_label (char *str)
7643 while (*str == ' ')
7644 str++;
7645 while (*str && *str != ' ')
7646 str++;
7647 if (str[-1] == ':' || str[1] == '=')
7648 return 1;
7649 return 0;
7652 #endif
7654 /* Possible states for relaxation:
7656 0 0 branch offset byte (bra, etc)
7657 0 1 word
7658 0 2 long
7660 1 0 indexed offsets byte a0@(32,d4:w:1) etc
7661 1 1 word
7662 1 2 long
7664 2 0 two-offset index word-word a0@(32,d4)@(45) etc
7665 2 1 word-long
7666 2 2 long-word
7667 2 3 long-long
7671 /* We have no need to default values of symbols. */
7673 symbolS *
7674 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
7676 return 0;
7679 /* Round up a section size to the appropriate boundary. */
7680 valueT
7681 md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
7683 #ifdef OBJ_AOUT
7684 /* For a.out, force the section size to be aligned. If we don't do
7685 this, BFD will align it for us, but it will not write out the
7686 final bytes of the section. This may be a bug in BFD, but it is
7687 easier to fix it here since that is how the other a.out targets
7688 work. */
7689 int align;
7691 align = bfd_get_section_alignment (stdoutput, segment);
7692 size = ((size + (1 << align) - 1) & ((valueT) -1 << align));
7693 #endif
7695 return size;
7698 /* Exactly what point is a PC-relative offset relative TO?
7699 On the 68k, it is relative to the address of the first extension
7700 word. The difference between the addresses of the offset and the
7701 first extension word is stored in fx_pcrel_adjust. */
7702 long
7703 md_pcrel_from (fixS *fixP)
7705 int adjust;
7707 /* Because fx_pcrel_adjust is a char, and may be unsigned, we explicitly
7708 sign extend the value here. */
7709 adjust = ((fixP->fx_pcrel_adjust & 0xff) ^ 0x80) - 0x80;
7710 if (adjust == 64)
7711 adjust = -1;
7712 return fixP->fx_where + fixP->fx_frag->fr_address - adjust;
7715 #ifdef OBJ_ELF
7716 void
7717 m68k_elf_final_processing (void)
7719 unsigned flags = 0;
7721 if (arch_coldfire_fpu (current_architecture))
7722 flags |= EF_M68K_CFV4E;
7723 /* Set file-specific flags if this is a cpu32 processor. */
7724 if (cpu_of_arch (current_architecture) & cpu32)
7725 flags |= EF_M68K_CPU32;
7726 else if (cpu_of_arch (current_architecture) & fido_a)
7727 flags |= EF_M68K_FIDO;
7728 else if ((cpu_of_arch (current_architecture) & m68000up)
7729 && !(cpu_of_arch (current_architecture) & m68020up))
7730 flags |= EF_M68K_M68000;
7732 if (current_architecture & mcfisa_a)
7734 static const unsigned isa_features[][2] =
7736 {EF_M68K_CF_ISA_A_NODIV,mcfisa_a},
7737 {EF_M68K_CF_ISA_A, mcfisa_a|mcfhwdiv},
7738 {EF_M68K_CF_ISA_A_PLUS, mcfisa_a|mcfisa_aa|mcfhwdiv|mcfusp},
7739 {EF_M68K_CF_ISA_B_NOUSP,mcfisa_a|mcfisa_b|mcfhwdiv},
7740 {EF_M68K_CF_ISA_B, mcfisa_a|mcfisa_b|mcfhwdiv|mcfusp},
7741 {EF_M68K_CF_ISA_C, mcfisa_a|mcfisa_c|mcfhwdiv|mcfusp},
7742 {EF_M68K_CF_ISA_C_NODIV,mcfisa_a|mcfisa_c|mcfusp},
7743 {0,0},
7745 static const unsigned mac_features[][2] =
7747 {EF_M68K_CF_MAC, mcfmac},
7748 {EF_M68K_CF_EMAC, mcfemac},
7749 {0,0},
7751 unsigned ix;
7752 unsigned pattern;
7754 pattern = (current_architecture
7755 & (mcfisa_a|mcfisa_aa|mcfisa_b|mcfisa_c|mcfhwdiv|mcfusp));
7756 for (ix = 0; isa_features[ix][1]; ix++)
7758 if (pattern == isa_features[ix][1])
7760 flags |= isa_features[ix][0];
7761 break;
7764 if (!isa_features[ix][1])
7766 cf_bad:
7767 as_warn (_("Not a defined coldfire architecture"));
7769 else
7771 if (current_architecture & cfloat)
7772 flags |= EF_M68K_CF_FLOAT | EF_M68K_CFV4E;
7774 pattern = current_architecture & (mcfmac|mcfemac);
7775 if (pattern)
7777 for (ix = 0; mac_features[ix][1]; ix++)
7779 if (pattern == mac_features[ix][1])
7781 flags |= mac_features[ix][0];
7782 break;
7785 if (!mac_features[ix][1])
7786 goto cf_bad;
7790 elf_elfheader (stdoutput)->e_flags |= flags;
7792 #endif
7795 tc_m68k_regname_to_dw2regnum (char *regname)
7797 unsigned int regnum;
7798 static const char *const regnames[] =
7800 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
7801 "a0", "a1", "a2", "a3", "a4", "a5", "a6", "sp",
7802 "fp0", "fp1", "fp2", "fp3", "fp4", "fp5", "fp6", "fp7",
7803 "pc"
7806 for (regnum = 0; regnum < ARRAY_SIZE (regnames); regnum++)
7807 if (strcmp (regname, regnames[regnum]) == 0)
7808 return regnum;
7810 return -1;
7813 void
7814 tc_m68k_frame_initial_instructions (void)
7816 static int sp_regno = -1;
7818 if (sp_regno < 0)
7819 sp_regno = tc_m68k_regname_to_dw2regnum ("sp");
7821 cfi_add_CFA_def_cfa (sp_regno, -DWARF2_CIE_DATA_ALIGNMENT);
7822 cfi_add_CFA_offset (DWARF2_DEFAULT_RETURN_COLUMN, DWARF2_CIE_DATA_ALIGNMENT);