daily update
[binutils.git] / gas / config / tc-m68k.c
blob4e23ced782506f4a4f55c615b5a4774f9d1cbfcf
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
4 Free Software Foundation, Inc.
6 This file is part of GAS, the GNU Assembler.
8 GAS is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
13 GAS is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GAS; see the file COPYING. If not, write to the Free
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
21 02111-1307, USA. */
23 #include "as.h"
24 #include "safe-ctype.h"
25 #include "obstack.h"
26 #include "subsegs.h"
27 #include "dwarf2dbg.h"
29 #include "opcode/m68k.h"
30 #include "m68k-parse.h"
32 #if defined (OBJ_ELF)
33 #include "elf/m68k.h"
34 #endif
36 /* This string holds the chars that always start a comment. If the
37 pre-processor is disabled, these aren't very useful. The macro
38 tc_comment_chars points to this. We use this, rather than the
39 usual comment_chars, so that the --bitwise-or option will work. */
40 #if defined (TE_SVR4) || defined (TE_DELTA)
41 const char *m68k_comment_chars = "|#";
42 #else
43 const char *m68k_comment_chars = "|";
44 #endif
46 /* This array holds the chars that only start a comment at the beginning of
47 a line. If the line seems to have the form '# 123 filename'
48 .line and .file directives will appear in the pre-processed output */
49 /* Note that input_file.c hand checks for '#' at the beginning of the
50 first line of the input file. This is because the compiler outputs
51 #NO_APP at the beginning of its output. */
52 /* Also note that comments like this one will always work. */
53 const char line_comment_chars[] = "#*";
55 const char line_separator_chars[] = ";";
57 /* Chars that can be used to separate mant from exp in floating point nums */
58 const char EXP_CHARS[] = "eE";
60 /* Chars that mean this number is a floating point constant, as
61 in "0f12.456" or "0d1.2345e12". */
63 const char FLT_CHARS[] = "rRsSfFdDxXeEpP";
65 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
66 changed in read.c . Ideally it shouldn't have to know about it at all,
67 but nothing is ideal around here. */
69 const int md_reloc_size = 8; /* Size of relocation record */
71 /* Are we trying to generate PIC code? If so, absolute references
72 ought to be made into linkage table references or pc-relative
73 references. Not implemented. For ELF there are other means
74 to denote pic relocations. */
75 int flag_want_pic;
77 static int flag_short_refs; /* -l option */
78 static int flag_long_jumps; /* -S option */
79 static int flag_keep_pcrel; /* --pcrel option. */
81 #ifdef REGISTER_PREFIX_OPTIONAL
82 int flag_reg_prefix_optional = REGISTER_PREFIX_OPTIONAL;
83 #else
84 int flag_reg_prefix_optional;
85 #endif
87 /* Whether --register-prefix-optional was used on the command line. */
88 static int reg_prefix_optional_seen;
90 /* The floating point coprocessor to use by default. */
91 static enum m68k_register m68k_float_copnum = COP1;
93 /* If this is non-zero, then references to number(%pc) will be taken
94 to refer to number, rather than to %pc + number. */
95 static int m68k_abspcadd;
97 /* If this is non-zero, then the quick forms of the move, add, and sub
98 instructions are used when possible. */
99 static int m68k_quick = 1;
101 /* If this is non-zero, then if the size is not specified for a base
102 or outer displacement, the assembler assumes that the size should
103 be 32 bits. */
104 static int m68k_rel32 = 1;
106 /* This is non-zero if m68k_rel32 was set from the command line. */
107 static int m68k_rel32_from_cmdline;
109 /* The default width to use for an index register when using a base
110 displacement. */
111 static enum m68k_size m68k_index_width_default = SIZE_LONG;
113 /* We want to warn if any text labels are misaligned. In order to get
114 the right line number, we need to record the line number for each
115 label. */
117 struct label_line
119 struct label_line *next;
120 symbolS *label;
121 char *file;
122 unsigned int line;
123 int text;
126 /* The list of labels. */
128 static struct label_line *labels;
130 /* The current label. */
132 static struct label_line *current_label;
134 /* Its an arbitrary name: This means I don't approve of it */
135 /* See flames below */
136 static struct obstack robyn;
138 struct m68k_incant
140 const char *m_operands;
141 unsigned long m_opcode;
142 short m_opnum;
143 short m_codenum;
144 int m_arch;
145 struct m68k_incant *m_next;
148 #define getone(x) ((((x)->m_opcode)>>16)&0xffff)
149 #define gettwo(x) (((x)->m_opcode)&0xffff)
151 static const enum m68k_register m68000_control_regs[] = { 0 };
152 static const enum m68k_register m68010_control_regs[] = {
153 SFC, DFC, USP, VBR,
156 static const enum m68k_register m68020_control_regs[] = {
157 SFC, DFC, USP, VBR, CACR, CAAR, MSP, ISP,
160 static const enum m68k_register m68040_control_regs[] = {
161 SFC, DFC, CACR, TC, ITT0, ITT1, DTT0, DTT1,
162 USP, VBR, MSP, ISP, MMUSR, URP, SRP,
165 static const enum m68k_register m68060_control_regs[] = {
166 SFC, DFC, CACR, TC, ITT0, ITT1, DTT0, DTT1, BUSCR,
167 USP, VBR, URP, SRP, PCR,
170 static const enum m68k_register mcf_control_regs[] = {
171 CACR, TC, ITT0, ITT1, DTT0, DTT1, VBR, ROMBAR,
172 RAMBAR0, RAMBAR1, MBAR,
175 #define cpu32_control_regs m68010_control_regs
177 static const enum m68k_register *control_regs;
179 /* internal form of a 68020 instruction */
180 struct m68k_it
182 const char *error;
183 const char *args; /* list of opcode info */
184 int numargs;
186 int numo; /* Number of shorts in opcode */
187 short opcode[11];
189 struct m68k_op operands[6];
191 int nexp; /* number of exprs in use */
192 struct m68k_exp exprs[4];
194 int nfrag; /* Number of frags we have to produce */
195 struct
197 int fragoff; /* Where in the current opcode the frag ends */
198 symbolS *fadd;
199 offsetT foff;
200 int fragty;
202 fragb[4];
204 int nrel; /* Num of reloc strucs in use */
205 struct
207 int n;
208 expressionS exp;
209 char wid;
210 char pcrel;
211 /* In a pc relative address the difference between the address
212 of the offset and the address that the offset is relative
213 to. This depends on the addressing mode. Basically this
214 is the value to put in the offset field to address the
215 first byte of the offset, without regarding the special
216 significance of some values (in the branch instruction, for
217 example). */
218 int pcrel_fix;
219 #ifdef OBJ_ELF
220 /* Whether this expression needs special pic relocation, and if
221 so, which. */
222 enum pic_relocation pic_reloc;
223 #endif
225 reloc[5]; /* Five is enough??? */
228 #define cpu_of_arch(x) ((x) & (m68000up|mcf))
229 #define float_of_arch(x) ((x) & mfloat)
230 #define mmu_of_arch(x) ((x) & mmmu)
231 #define arch_coldfire_p(x) (((x) & mcf) != 0)
233 /* Macros for determining if cpu supports a specific addressing mode */
234 #define HAVE_LONG_BRANCH(x) ((x) & (m68020|m68030|m68040|m68060|cpu32|mcf5407))
236 static struct m68k_it the_ins; /* the instruction being assembled */
238 #define op(ex) ((ex)->exp.X_op)
239 #define adds(ex) ((ex)->exp.X_add_symbol)
240 #define subs(ex) ((ex)->exp.X_op_symbol)
241 #define offs(ex) ((ex)->exp.X_add_number)
243 /* Macros for adding things to the m68k_it struct */
245 #define addword(w) the_ins.opcode[the_ins.numo++]=(w)
247 /* Static functions. */
249 static void insop PARAMS ((int, const struct m68k_incant *));
250 static void add_fix PARAMS ((int, struct m68k_exp *, int, int));
251 static void add_frag PARAMS ((symbolS *, offsetT, int));
253 /* Like addword, but goes BEFORE general operands */
254 static void
255 insop (w, opcode)
256 int w;
257 const struct m68k_incant *opcode;
259 int z;
260 for (z = the_ins.numo; z > opcode->m_codenum; --z)
261 the_ins.opcode[z] = the_ins.opcode[z - 1];
262 for (z = 0; z < the_ins.nrel; z++)
263 the_ins.reloc[z].n += 2;
264 for (z = 0; z < the_ins.nfrag; z++)
265 the_ins.fragb[z].fragoff++;
266 the_ins.opcode[opcode->m_codenum] = w;
267 the_ins.numo++;
270 /* The numo+1 kludge is so we can hit the low order byte of the prev word.
271 Blecch. */
272 static void
273 add_fix (width, exp, pc_rel, pc_fix)
274 int width;
275 struct m68k_exp *exp;
276 int pc_rel;
277 int pc_fix;
279 the_ins.reloc[the_ins.nrel].n = ((width == 'B' || width == '3')
280 ? (the_ins.numo*2-1)
281 : (((width)=='b')
282 ? (the_ins.numo*2+1)
283 : (the_ins.numo*2)));
284 the_ins.reloc[the_ins.nrel].exp = exp->exp;
285 the_ins.reloc[the_ins.nrel].wid = width;
286 the_ins.reloc[the_ins.nrel].pcrel_fix = pc_fix;
287 #ifdef OBJ_ELF
288 the_ins.reloc[the_ins.nrel].pic_reloc = exp->pic_reloc;
289 #endif
290 the_ins.reloc[the_ins.nrel++].pcrel = pc_rel;
293 /* Cause an extra frag to be generated here, inserting up to 10 bytes
294 (that value is chosen in the frag_var call in md_assemble). TYPE
295 is the subtype of the frag to be generated; its primary type is
296 rs_machine_dependent.
298 The TYPE parameter is also used by md_convert_frag_1 and
299 md_estimate_size_before_relax. The appropriate type of fixup will
300 be emitted by md_convert_frag_1.
302 ADD becomes the FR_SYMBOL field of the frag, and OFF the FR_OFFSET. */
303 static void
304 add_frag (add, off, type)
305 symbolS *add;
306 offsetT off;
307 int type;
309 the_ins.fragb[the_ins.nfrag].fragoff = the_ins.numo;
310 the_ins.fragb[the_ins.nfrag].fadd = add;
311 the_ins.fragb[the_ins.nfrag].foff = off;
312 the_ins.fragb[the_ins.nfrag++].fragty = type;
315 #define isvar(ex) \
316 (op (ex) != O_constant && op (ex) != O_big)
318 static char *crack_operand PARAMS ((char *str, struct m68k_op *opP));
319 static int get_num PARAMS ((struct m68k_exp *exp, int ok));
320 static void m68k_ip PARAMS ((char *));
321 static void insert_reg PARAMS ((const char *, int));
322 static void select_control_regs PARAMS ((void));
323 static void init_regtable PARAMS ((void));
324 static int reverse_16_bits PARAMS ((int in));
325 static int reverse_8_bits PARAMS ((int in));
326 static void install_gen_operand PARAMS ((int mode, int val));
327 static void install_operand PARAMS ((int mode, int val));
328 static void s_bss PARAMS ((int));
329 static void s_data1 PARAMS ((int));
330 static void s_data2 PARAMS ((int));
331 static void s_even PARAMS ((int));
332 static void s_proc PARAMS ((int));
333 static void mri_chip PARAMS ((void));
334 static void s_chip PARAMS ((int));
335 static void s_fopt PARAMS ((int));
336 static void s_opt PARAMS ((int));
337 static void s_reg PARAMS ((int));
338 static void s_restore PARAMS ((int));
339 static void s_save PARAMS ((int));
340 static void s_mri_if PARAMS ((int));
341 static void s_mri_else PARAMS ((int));
342 static void s_mri_endi PARAMS ((int));
343 static void s_mri_break PARAMS ((int));
344 static void s_mri_next PARAMS ((int));
345 static void s_mri_for PARAMS ((int));
346 static void s_mri_endf PARAMS ((int));
347 static void s_mri_repeat PARAMS ((int));
348 static void s_mri_until PARAMS ((int));
349 static void s_mri_while PARAMS ((int));
350 static void s_mri_endw PARAMS ((int));
351 static void md_convert_frag_1 PARAMS ((fragS *));
353 static int current_architecture;
355 struct m68k_cpu
357 unsigned long arch;
358 const char *name;
359 int alias;
362 static const struct m68k_cpu archs[] =
364 { m68000, "68000", 0 },
365 { m68010, "68010", 0 },
366 { m68020, "68020", 0 },
367 { m68030, "68030", 0 },
368 { m68040, "68040", 0 },
369 { m68060, "68060", 0 },
370 { cpu32, "cpu32", 0 },
371 { m68881, "68881", 0 },
372 { m68851, "68851", 0 },
373 { mcf5200, "5200", 0 },
374 { mcf5206e, "5206e", 0 },
375 { mcf5307, "5307", 0},
376 { mcf5407, "5407", 0},
377 /* Aliases (effectively, so far as gas is concerned) for the above
378 cpus. */
379 { m68020, "68k", 1 },
380 { m68000, "68008", 1 },
381 { m68000, "68302", 1 },
382 { m68000, "68306", 1 },
383 { m68000, "68307", 1 },
384 { m68000, "68322", 1 },
385 { m68000, "68356", 1 },
386 { m68000, "68ec000", 1 },
387 { m68000, "68hc000", 1 },
388 { m68000, "68hc001", 1 },
389 { m68020, "68ec020", 1 },
390 { m68030, "68ec030", 1 },
391 { m68040, "68ec040", 1 },
392 { m68060, "68ec060", 1 },
393 { cpu32, "68330", 1 },
394 { cpu32, "68331", 1 },
395 { cpu32, "68332", 1 },
396 { cpu32, "68333", 1 },
397 { cpu32, "68334", 1 },
398 { cpu32, "68336", 1 },
399 { cpu32, "68340", 1 },
400 { cpu32, "68341", 1 },
401 { cpu32, "68349", 1 },
402 { cpu32, "68360", 1 },
403 { m68881, "68882", 1 },
404 { mcf5200, "5202", 1 },
405 { mcf5200, "5204", 1 },
406 { mcf5200, "5206", 1 },
409 static const int n_archs = sizeof (archs) / sizeof (archs[0]);
411 /* This is the assembler relaxation table for m68k. m68k is a rich CISC
412 architecture and we have a lot of relaxation modes. */
414 /* Macros used in the relaxation code. */
415 #define TAB(x,y) (((x) << 2) + (y))
416 #define TABTYPE(x) ((x) >> 2)
418 /* Relaxation states. */
419 #define BYTE 0
420 #define SHORT 1
421 #define LONG 2
422 #define SZ_UNDEF 3
424 /* Here are all the relaxation modes we support. First we can relax ordinary
425 branches. On 68020 and higher and on CPU32 all branch instructions take
426 three forms, so on these CPUs all branches always remain as such. When we
427 have to expand to the LONG form on a 68000, though, we substitute an
428 absolute jump instead. This is a direct replacement for unconditional
429 branches and a branch over a jump for conditional branches. However, if the
430 user requires PIC and disables this with --pcrel, we can only relax between
431 BYTE and SHORT forms, punting if that isn't enough. This gives us four
432 different relaxation modes for branches: */
434 #define BRANCHBWL 0 /* branch byte, word, or long */
435 #define BRABSJUNC 1 /* absolute jump for LONG, unconditional */
436 #define BRABSJCOND 2 /* absolute jump for LONG, conditional */
437 #define BRANCHBW 3 /* branch byte or word */
439 /* We also relax coprocessor branches and DBcc's. All CPUs that support
440 coprocessor branches support them in word and long forms, so we have only
441 one relaxation mode for them. DBcc's are word only on all CPUs. We can
442 relax them to the LONG form with a branch-around sequence. This sequence
443 can use a long branch (if available) or an absolute jump (if acceptable).
444 This gives us two relaxation modes. If long branches are not available and
445 absolute jumps are not acceptable, we don't relax DBcc's. */
447 #define FBRANCH 4 /* coprocessor branch */
448 #define DBCCLBR 5 /* DBcc relaxable with a long branch */
449 #define DBCCABSJ 6 /* DBcc relaxable with an absolute jump */
451 /* That's all for instruction relaxation. However, we also relax PC-relative
452 operands. Specifically, we have three operand relaxation modes. On the
453 68000 PC-relative operands can only be 16-bit, but on 68020 and higher and
454 on CPU32 they may be 16-bit or 32-bit. For the latter we relax between the
455 two. Also PC+displacement+index operands in their simple form (with a non-
456 suppressed index without memory indirection) are supported on all CPUs, but
457 on the 68000 the displacement can be 8-bit only, whereas on 68020 and higher
458 and on CPU32 we relax it to SHORT and LONG forms as well using the extended
459 form of the PC+displacement+index operand. Finally, some absolute operands
460 can be relaxed down to 16-bit PC-relative. */
462 #define PCREL1632 7 /* 16-bit or 32-bit PC-relative */
463 #define PCINDEX 8 /* PC+displacement+index */
464 #define ABSTOPCREL 9 /* absolute relax down to 16-bit PC-relative */
466 /* Note that calls to frag_var need to specify the maximum expansion
467 needed; this is currently 10 bytes for DBCC. */
469 /* The fields are:
470 How far Forward this mode will reach:
471 How far Backward this mode will reach:
472 How many bytes this mode will add to the size of the frag
473 Which mode to go to if the offset won't fit in this one
475 Please check tc-m68k.h:md_prepare_relax_scan if changing this table. */
476 relax_typeS md_relax_table[] =
478 { 127, -128, 0, TAB (BRANCHBWL, SHORT) },
479 { 32767, -32768, 2, TAB (BRANCHBWL, LONG) },
480 { 0, 0, 4, 0 },
481 { 1, 1, 0, 0 },
483 { 127, -128, 0, TAB (BRABSJUNC, SHORT) },
484 { 32767, -32768, 2, TAB (BRABSJUNC, LONG) },
485 { 0, 0, 4, 0 },
486 { 1, 1, 0, 0 },
488 { 127, -128, 0, TAB (BRABSJCOND, SHORT) },
489 { 32767, -32768, 2, TAB (BRABSJCOND, LONG) },
490 { 0, 0, 6, 0 },
491 { 1, 1, 0, 0 },
493 { 127, -128, 0, TAB (BRANCHBW, SHORT) },
494 { 0, 0, 2, 0 },
495 { 1, 1, 0, 0 },
496 { 1, 1, 0, 0 },
498 { 1, 1, 0, 0 }, /* FBRANCH doesn't come BYTE */
499 { 32767, -32768, 2, TAB (FBRANCH, LONG) },
500 { 0, 0, 4, 0 },
501 { 1, 1, 0, 0 },
503 { 1, 1, 0, 0 }, /* DBCC doesn't come BYTE */
504 { 32767, -32768, 2, TAB (DBCCLBR, LONG) },
505 { 0, 0, 10, 0 },
506 { 1, 1, 0, 0 },
508 { 1, 1, 0, 0 }, /* DBCC doesn't come BYTE */
509 { 32767, -32768, 2, TAB (DBCCABSJ, LONG) },
510 { 0, 0, 10, 0 },
511 { 1, 1, 0, 0 },
513 { 1, 1, 0, 0 }, /* PCREL1632 doesn't come BYTE */
514 { 32767, -32768, 2, TAB (PCREL1632, LONG) },
515 { 0, 0, 6, 0 },
516 { 1, 1, 0, 0 },
518 { 125, -130, 0, TAB (PCINDEX, SHORT) },
519 { 32765, -32770, 2, TAB (PCINDEX, LONG) },
520 { 0, 0, 4, 0 },
521 { 1, 1, 0, 0 },
523 { 1, 1, 0, 0 }, /* ABSTOPCREL doesn't come BYTE */
524 { 32767, -32768, 2, TAB (ABSTOPCREL, LONG) },
525 { 0, 0, 4, 0 },
526 { 1, 1, 0, 0 },
529 /* These are the machine dependent pseudo-ops. These are included so
530 the assembler can work on the output from the SUN C compiler, which
531 generates these.
534 /* This table describes all the machine specific pseudo-ops the assembler
535 has to support. The fields are:
536 pseudo-op name without dot
537 function to call to execute this pseudo-op
538 Integer arg to pass to the function
540 const pseudo_typeS md_pseudo_table[] =
542 {"data1", s_data1, 0},
543 {"data2", s_data2, 0},
544 {"bss", s_bss, 0},
545 {"even", s_even, 0},
546 {"skip", s_space, 0},
547 {"proc", s_proc, 0},
548 #if defined (TE_SUN3) || defined (OBJ_ELF)
549 {"align", s_align_bytes, 0},
550 #endif
551 #ifdef OBJ_ELF
552 {"swbeg", s_ignore, 0},
553 #endif
554 {"extend", float_cons, 'x'},
555 {"ldouble", float_cons, 'x'},
557 #ifdef OBJ_ELF
558 /* Dwarf2 support for Gcc. */
559 {"file", (void (*) PARAMS ((int))) dwarf2_directive_file, 0},
560 {"loc", dwarf2_directive_loc, 0},
561 #endif
563 /* The following pseudo-ops are supported for MRI compatibility. */
564 {"chip", s_chip, 0},
565 {"comline", s_space, 1},
566 {"fopt", s_fopt, 0},
567 {"mask2", s_ignore, 0},
568 {"opt", s_opt, 0},
569 {"reg", s_reg, 0},
570 {"restore", s_restore, 0},
571 {"save", s_save, 0},
573 {"if", s_mri_if, 0},
574 {"if.b", s_mri_if, 'b'},
575 {"if.w", s_mri_if, 'w'},
576 {"if.l", s_mri_if, 'l'},
577 {"else", s_mri_else, 0},
578 {"else.s", s_mri_else, 's'},
579 {"else.l", s_mri_else, 'l'},
580 {"endi", s_mri_endi, 0},
581 {"break", s_mri_break, 0},
582 {"break.s", s_mri_break, 's'},
583 {"break.l", s_mri_break, 'l'},
584 {"next", s_mri_next, 0},
585 {"next.s", s_mri_next, 's'},
586 {"next.l", s_mri_next, 'l'},
587 {"for", s_mri_for, 0},
588 {"for.b", s_mri_for, 'b'},
589 {"for.w", s_mri_for, 'w'},
590 {"for.l", s_mri_for, 'l'},
591 {"endf", s_mri_endf, 0},
592 {"repeat", s_mri_repeat, 0},
593 {"until", s_mri_until, 0},
594 {"until.b", s_mri_until, 'b'},
595 {"until.w", s_mri_until, 'w'},
596 {"until.l", s_mri_until, 'l'},
597 {"while", s_mri_while, 0},
598 {"while.b", s_mri_while, 'b'},
599 {"while.w", s_mri_while, 'w'},
600 {"while.l", s_mri_while, 'l'},
601 {"endw", s_mri_endw, 0},
603 {0, 0, 0}
606 /* The mote pseudo ops are put into the opcode table, since they
607 don't start with a . they look like opcodes to gas.
610 #ifdef M68KCOFF
611 extern void obj_coff_section PARAMS ((int));
612 #endif
614 const pseudo_typeS mote_pseudo_table[] =
617 {"dcl", cons, 4},
618 {"dc", cons, 2},
619 {"dcw", cons, 2},
620 {"dcb", cons, 1},
622 {"dsl", s_space, 4},
623 {"ds", s_space, 2},
624 {"dsw", s_space, 2},
625 {"dsb", s_space, 1},
627 {"xdef", s_globl, 0},
628 #ifdef OBJ_ELF
629 {"align", s_align_bytes, 0},
630 #else
631 {"align", s_align_ptwo, 0},
632 #endif
633 #ifdef M68KCOFF
634 {"sect", obj_coff_section, 0},
635 {"section", obj_coff_section, 0},
636 #endif
637 {0, 0, 0}
640 #define issbyte(x) ((x)>=-128 && (x)<=127)
641 #define isubyte(x) ((x)>=0 && (x)<=255)
642 #define issword(x) ((x)>=-32768 && (x)<=32767)
643 #define isuword(x) ((x)>=0 && (x)<=65535)
645 #define isbyte(x) ((x)>= -255 && (x)<=255)
646 #define isword(x) ((x)>=-65536 && (x)<=65535)
647 #define islong(x) (1)
649 extern char *input_line_pointer;
651 static char notend_table[256];
652 static char alt_notend_table[256];
653 #define notend(s) \
654 (! (notend_table[(unsigned char) *s] \
655 || (*s == ':' \
656 && alt_notend_table[(unsigned char) s[1]])))
658 #if defined (M68KCOFF) && !defined (BFD_ASSEMBLER)
660 #ifdef NO_PCREL_RELOCS
663 make_pcrel_absolute(fixP, add_number)
664 fixS *fixP;
665 long *add_number;
667 register unsigned char *opcode = fixP->fx_frag->fr_opcode;
669 /* rewrite the PC relative instructions to absolute address ones.
670 * these are rumoured to be faster, and the apollo linker refuses
671 * to deal with the PC relative relocations.
673 if (opcode[0] == 0x60 && opcode[1] == 0xff) /* BRA -> JMP */
675 opcode[0] = 0x4e;
676 opcode[1] = 0xf9;
678 else if (opcode[0] == 0x61 && opcode[1] == 0xff) /* BSR -> JSR */
680 opcode[0] = 0x4e;
681 opcode[1] = 0xb9;
683 else
684 as_fatal (_("Unknown PC relative instruction"));
685 *add_number -= 4;
686 return 0;
689 #endif /* NO_PCREL_RELOCS */
691 short
692 tc_coff_fix2rtype (fixP)
693 fixS *fixP;
695 if (fixP->fx_tcbit && fixP->fx_size == 4)
696 return R_RELLONG_NEG;
697 #ifdef NO_PCREL_RELOCS
698 know (fixP->fx_pcrel == 0);
699 return (fixP->fx_size == 1 ? R_RELBYTE
700 : fixP->fx_size == 2 ? R_DIR16
701 : R_DIR32);
702 #else
703 return (fixP->fx_pcrel ?
704 (fixP->fx_size == 1 ? R_PCRBYTE :
705 fixP->fx_size == 2 ? R_PCRWORD :
706 R_PCRLONG) :
707 (fixP->fx_size == 1 ? R_RELBYTE :
708 fixP->fx_size == 2 ? R_RELWORD :
709 R_RELLONG));
710 #endif
713 #endif
715 #ifdef OBJ_ELF
717 /* Return zero if the reference to SYMBOL from within the same segment may
718 be relaxed. */
720 /* On an ELF system, we can't relax an externally visible symbol,
721 because it may be overridden by a shared library. However, if
722 TARGET_OS is "elf", then we presume that we are assembling for an
723 embedded system, in which case we don't have to worry about shared
724 libraries, and we can relax any external sym. */
726 #define relaxable_symbol(symbol) \
727 (!((S_IS_EXTERNAL (symbol) && strcmp (TARGET_OS, "elf") != 0) \
728 || S_IS_WEAK (symbol)))
730 /* Compute the relocation code for a fixup of SIZE bytes, using pc
731 relative relocation if PCREL is non-zero. PIC says whether a special
732 pic relocation was requested. */
734 static bfd_reloc_code_real_type get_reloc_code
735 PARAMS ((int, int, enum pic_relocation));
737 static bfd_reloc_code_real_type
738 get_reloc_code (size, pcrel, pic)
739 int size;
740 int pcrel;
741 enum pic_relocation pic;
743 switch (pic)
745 case pic_got_pcrel:
746 switch (size)
748 case 1:
749 return BFD_RELOC_8_GOT_PCREL;
750 case 2:
751 return BFD_RELOC_16_GOT_PCREL;
752 case 4:
753 return BFD_RELOC_32_GOT_PCREL;
755 break;
757 case pic_got_off:
758 switch (size)
760 case 1:
761 return BFD_RELOC_8_GOTOFF;
762 case 2:
763 return BFD_RELOC_16_GOTOFF;
764 case 4:
765 return BFD_RELOC_32_GOTOFF;
767 break;
769 case pic_plt_pcrel:
770 switch (size)
772 case 1:
773 return BFD_RELOC_8_PLT_PCREL;
774 case 2:
775 return BFD_RELOC_16_PLT_PCREL;
776 case 4:
777 return BFD_RELOC_32_PLT_PCREL;
779 break;
781 case pic_plt_off:
782 switch (size)
784 case 1:
785 return BFD_RELOC_8_PLTOFF;
786 case 2:
787 return BFD_RELOC_16_PLTOFF;
788 case 4:
789 return BFD_RELOC_32_PLTOFF;
791 break;
793 case pic_none:
794 if (pcrel)
796 switch (size)
798 case 1:
799 return BFD_RELOC_8_PCREL;
800 case 2:
801 return BFD_RELOC_16_PCREL;
802 case 4:
803 return BFD_RELOC_32_PCREL;
806 else
808 switch (size)
810 case 1:
811 return BFD_RELOC_8;
812 case 2:
813 return BFD_RELOC_16;
814 case 4:
815 return BFD_RELOC_32;
820 if (pcrel)
822 if (pic == pic_none)
823 as_bad (_("Can not do %d byte pc-relative relocation"), size);
824 else
825 as_bad (_("Can not do %d byte pc-relative pic relocation"), size);
827 else
829 if (pic == pic_none)
830 as_bad (_("Can not do %d byte relocation"), size);
831 else
832 as_bad (_("Can not do %d byte pic relocation"), size);
835 return BFD_RELOC_NONE;
838 /* Here we decide which fixups can be adjusted to make them relative
839 to the beginning of the section instead of the symbol. Basically
840 we need to make sure that the dynamic relocations are done
841 correctly, so in some cases we force the original symbol to be
842 used. */
844 tc_m68k_fix_adjustable (fixP)
845 fixS *fixP;
847 /* adjust_reloc_syms doesn't know about the GOT */
848 switch (fixP->fx_r_type)
850 case BFD_RELOC_8_GOT_PCREL:
851 case BFD_RELOC_16_GOT_PCREL:
852 case BFD_RELOC_32_GOT_PCREL:
853 case BFD_RELOC_8_GOTOFF:
854 case BFD_RELOC_16_GOTOFF:
855 case BFD_RELOC_32_GOTOFF:
856 case BFD_RELOC_8_PLT_PCREL:
857 case BFD_RELOC_16_PLT_PCREL:
858 case BFD_RELOC_32_PLT_PCREL:
859 case BFD_RELOC_8_PLTOFF:
860 case BFD_RELOC_16_PLTOFF:
861 case BFD_RELOC_32_PLTOFF:
862 return 0;
864 case BFD_RELOC_VTABLE_INHERIT:
865 case BFD_RELOC_VTABLE_ENTRY:
866 return 0;
868 default:
869 return 1;
873 #else /* !OBJ_ELF */
875 #define get_reloc_code(SIZE,PCREL,OTHER) NO_RELOC
877 #define relaxable_symbol(symbol) 1
879 #endif /* OBJ_ELF */
881 #ifdef BFD_ASSEMBLER
883 arelent *
884 tc_gen_reloc (section, fixp)
885 asection *section;
886 fixS *fixp;
888 arelent *reloc;
889 bfd_reloc_code_real_type code;
891 /* If the tcbit is set, then this was a fixup of a negative value
892 that was never resolved. We do not have a reloc to handle this,
893 so just return. We assume that other code will have detected this
894 situation and produced a helpful error message, so we just tell the
895 user that the reloc cannot be produced. */
896 if (fixp->fx_tcbit)
898 if (fixp->fx_addsy)
899 as_bad_where (fixp->fx_file, fixp->fx_line,
900 _("Unable to produce reloc against symbol '%s'"),
901 S_GET_NAME (fixp->fx_addsy));
902 return NULL;
905 if (fixp->fx_r_type != BFD_RELOC_NONE)
907 code = fixp->fx_r_type;
909 /* Since DIFF_EXPR_OK is defined in tc-m68k.h, it is possible
910 that fixup_segment converted a non-PC relative reloc into a
911 PC relative reloc. In such a case, we need to convert the
912 reloc code. */
913 if (fixp->fx_pcrel)
915 switch (code)
917 case BFD_RELOC_8:
918 code = BFD_RELOC_8_PCREL;
919 break;
920 case BFD_RELOC_16:
921 code = BFD_RELOC_16_PCREL;
922 break;
923 case BFD_RELOC_32:
924 code = BFD_RELOC_32_PCREL;
925 break;
926 case BFD_RELOC_8_PCREL:
927 case BFD_RELOC_16_PCREL:
928 case BFD_RELOC_32_PCREL:
929 case BFD_RELOC_8_GOT_PCREL:
930 case BFD_RELOC_16_GOT_PCREL:
931 case BFD_RELOC_32_GOT_PCREL:
932 case BFD_RELOC_8_GOTOFF:
933 case BFD_RELOC_16_GOTOFF:
934 case BFD_RELOC_32_GOTOFF:
935 case BFD_RELOC_8_PLT_PCREL:
936 case BFD_RELOC_16_PLT_PCREL:
937 case BFD_RELOC_32_PLT_PCREL:
938 case BFD_RELOC_8_PLTOFF:
939 case BFD_RELOC_16_PLTOFF:
940 case BFD_RELOC_32_PLTOFF:
941 break;
942 default:
943 as_bad_where (fixp->fx_file, fixp->fx_line,
944 _("Cannot make %s relocation PC relative"),
945 bfd_get_reloc_code_name (code));
949 else
951 #define F(SZ,PCREL) (((SZ) << 1) + (PCREL))
952 switch (F (fixp->fx_size, fixp->fx_pcrel))
954 #define MAP(SZ,PCREL,TYPE) case F(SZ,PCREL): code = (TYPE); break
955 MAP (1, 0, BFD_RELOC_8);
956 MAP (2, 0, BFD_RELOC_16);
957 MAP (4, 0, BFD_RELOC_32);
958 MAP (1, 1, BFD_RELOC_8_PCREL);
959 MAP (2, 1, BFD_RELOC_16_PCREL);
960 MAP (4, 1, BFD_RELOC_32_PCREL);
961 default:
962 abort ();
965 #undef F
966 #undef MAP
968 reloc = (arelent *) xmalloc (sizeof (arelent));
969 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
970 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
971 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
972 #ifndef OBJ_ELF
973 if (fixp->fx_pcrel)
974 reloc->addend = fixp->fx_addnumber;
975 else
976 reloc->addend = 0;
977 #else
978 if (!fixp->fx_pcrel)
979 reloc->addend = fixp->fx_addnumber;
980 else
981 reloc->addend = (section->vma
982 /* Explicit sign extension in case char is
983 unsigned. */
984 + ((fixp->fx_pcrel_adjust & 0xff) ^ 0x80) - 0x80
985 + fixp->fx_addnumber
986 + md_pcrel_from (fixp));
987 #endif
989 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
990 assert (reloc->howto != 0);
992 return reloc;
995 #endif /* BFD_ASSEMBLER */
997 /* Handle of the OPCODE hash table. NULL means any use before
998 m68k_ip_begin() will crash. */
999 static struct hash_control *op_hash;
1001 /* Assemble an m68k instruction. */
1003 static void
1004 m68k_ip (instring)
1005 char *instring;
1007 register char *p;
1008 register struct m68k_op *opP;
1009 register const struct m68k_incant *opcode;
1010 register const char *s;
1011 register int tmpreg = 0, baseo = 0, outro = 0, nextword;
1012 char *pdot, *pdotmove;
1013 enum m68k_size siz1, siz2;
1014 char c;
1015 int losing;
1016 int opsfound;
1017 LITTLENUM_TYPE words[6];
1018 LITTLENUM_TYPE *wordp;
1019 unsigned long ok_arch = 0;
1021 if (*instring == ' ')
1022 instring++; /* skip leading whitespace */
1024 /* Scan up to end of operation-code, which MUST end in end-of-string
1025 or exactly 1 space. */
1026 pdot = 0;
1027 for (p = instring; *p != '\0'; p++)
1029 if (*p == ' ')
1030 break;
1031 if (*p == '.')
1032 pdot = p;
1035 if (p == instring)
1037 the_ins.error = _("No operator");
1038 return;
1041 /* p now points to the end of the opcode name, probably whitespace.
1042 Make sure the name is null terminated by clobbering the
1043 whitespace, look it up in the hash table, then fix it back.
1044 Remove a dot, first, since the opcode tables have none. */
1045 if (pdot != NULL)
1047 for (pdotmove = pdot; pdotmove < p; pdotmove++)
1048 *pdotmove = pdotmove[1];
1049 p--;
1052 c = *p;
1053 *p = '\0';
1054 opcode = (const struct m68k_incant *) hash_find (op_hash, instring);
1055 *p = c;
1057 if (pdot != NULL)
1059 for (pdotmove = p; pdotmove > pdot; pdotmove--)
1060 *pdotmove = pdotmove[-1];
1061 *pdot = '.';
1062 ++p;
1065 if (opcode == NULL)
1067 the_ins.error = _("Unknown operator");
1068 return;
1071 /* found a legitimate opcode, start matching operands */
1072 while (*p == ' ')
1073 ++p;
1075 if (opcode->m_operands == 0)
1077 char *old = input_line_pointer;
1078 *old = '\n';
1079 input_line_pointer = p;
1080 /* Ahh - it's a motorola style psuedo op */
1081 mote_pseudo_table[opcode->m_opnum].poc_handler
1082 (mote_pseudo_table[opcode->m_opnum].poc_val);
1083 input_line_pointer = old;
1084 *old = 0;
1086 return;
1089 if (flag_mri && opcode->m_opnum == 0)
1091 /* In MRI mode, random garbage is allowed after an instruction
1092 which accepts no operands. */
1093 the_ins.args = opcode->m_operands;
1094 the_ins.numargs = opcode->m_opnum;
1095 the_ins.numo = opcode->m_codenum;
1096 the_ins.opcode[0] = getone (opcode);
1097 the_ins.opcode[1] = gettwo (opcode);
1098 return;
1101 for (opP = &the_ins.operands[0]; *p; opP++)
1103 p = crack_operand (p, opP);
1105 if (opP->error)
1107 the_ins.error = opP->error;
1108 return;
1112 opsfound = opP - &the_ins.operands[0];
1114 /* This ugly hack is to support the floating pt opcodes in their
1115 standard form. Essentially, we fake a first enty of type COP#1 */
1116 if (opcode->m_operands[0] == 'I')
1118 int n;
1120 for (n = opsfound; n > 0; --n)
1121 the_ins.operands[n] = the_ins.operands[n - 1];
1123 memset ((char *) (&the_ins.operands[0]), '\0',
1124 sizeof (the_ins.operands[0]));
1125 the_ins.operands[0].mode = CONTROL;
1126 the_ins.operands[0].reg = m68k_float_copnum;
1127 opsfound++;
1130 /* We've got the operands. Find an opcode that'll accept them */
1131 for (losing = 0;;)
1133 /* If we didn't get the right number of ops, or we have no
1134 common model with this pattern then reject this pattern. */
1136 ok_arch |= opcode->m_arch;
1137 if (opsfound != opcode->m_opnum
1138 || ((opcode->m_arch & current_architecture) == 0))
1139 ++losing;
1140 else
1142 for (s = opcode->m_operands, opP = &the_ins.operands[0];
1143 *s && !losing;
1144 s += 2, opP++)
1146 /* Warning: this switch is huge! */
1147 /* I've tried to organize the cases into this order:
1148 non-alpha first, then alpha by letter. Lower-case
1149 goes directly before uppercase counterpart. */
1150 /* Code with multiple case ...: gets sorted by the lowest
1151 case ... it belongs to. I hope this makes sense. */
1152 switch (*s)
1154 case '!':
1155 switch (opP->mode)
1157 case IMMED:
1158 case DREG:
1159 case AREG:
1160 case FPREG:
1161 case CONTROL:
1162 case AINC:
1163 case ADEC:
1164 case REGLST:
1165 losing++;
1166 break;
1167 default:
1168 break;
1170 break;
1172 case '<':
1173 switch (opP->mode)
1175 case DREG:
1176 case AREG:
1177 case FPREG:
1178 case CONTROL:
1179 case IMMED:
1180 case ADEC:
1181 case REGLST:
1182 losing++;
1183 break;
1184 default:
1185 break;
1187 break;
1189 case '>':
1190 switch (opP->mode)
1192 case DREG:
1193 case AREG:
1194 case FPREG:
1195 case CONTROL:
1196 case IMMED:
1197 case AINC:
1198 case REGLST:
1199 losing++;
1200 break;
1201 case ABSL:
1202 break;
1203 default:
1204 if (opP->reg == PC
1205 || opP->reg == ZPC)
1206 losing++;
1207 break;
1209 break;
1211 case 'm':
1212 switch (opP->mode)
1214 case DREG:
1215 case AREG:
1216 case AINDR:
1217 case AINC:
1218 case ADEC:
1219 break;
1220 default:
1221 losing++;
1223 break;
1225 case 'n':
1226 switch (opP->mode)
1228 case DISP:
1229 break;
1230 default:
1231 losing++;
1233 break;
1235 case 'o':
1236 switch (opP->mode)
1238 case BASE:
1239 case ABSL:
1240 case IMMED:
1241 break;
1242 default:
1243 losing++;
1245 break;
1247 case 'p':
1248 switch (opP->mode)
1250 case DREG:
1251 case AREG:
1252 case AINDR:
1253 case AINC:
1254 case ADEC:
1255 break;
1256 case DISP:
1257 if (opP->reg == PC || opP->reg == ZPC)
1258 losing++;
1259 break;
1260 default:
1261 losing++;
1263 break;
1265 case 'q':
1266 switch (opP->mode)
1268 case DREG:
1269 case AINDR:
1270 case AINC:
1271 case ADEC:
1272 break;
1273 case DISP:
1274 if (opP->reg == PC || opP->reg == ZPC)
1275 losing++;
1276 break;
1277 default:
1278 losing++;
1279 break;
1281 break;
1283 case 'v':
1284 switch (opP->mode)
1286 case DREG:
1287 case AINDR:
1288 case AINC:
1289 case ADEC:
1290 case ABSL:
1291 break;
1292 case DISP:
1293 if (opP->reg == PC || opP->reg == ZPC)
1294 losing++;
1295 break;
1296 default:
1297 losing++;
1298 break;
1300 break;
1302 case '#':
1303 if (opP->mode != IMMED)
1304 losing++;
1305 else if (s[1] == 'b'
1306 && ! isvar (&opP->disp)
1307 && (opP->disp.exp.X_op != O_constant
1308 || ! isbyte (opP->disp.exp.X_add_number)))
1309 losing++;
1310 else if (s[1] == 'B'
1311 && ! isvar (&opP->disp)
1312 && (opP->disp.exp.X_op != O_constant
1313 || ! issbyte (opP->disp.exp.X_add_number)))
1314 losing++;
1315 else if (s[1] == 'w'
1316 && ! isvar (&opP->disp)
1317 && (opP->disp.exp.X_op != O_constant
1318 || ! isword (opP->disp.exp.X_add_number)))
1319 losing++;
1320 else if (s[1] == 'W'
1321 && ! isvar (&opP->disp)
1322 && (opP->disp.exp.X_op != O_constant
1323 || ! issword (opP->disp.exp.X_add_number)))
1324 losing++;
1325 break;
1327 case '^':
1328 case 'T':
1329 if (opP->mode != IMMED)
1330 losing++;
1331 break;
1333 case '$':
1334 if (opP->mode == AREG
1335 || opP->mode == CONTROL
1336 || opP->mode == FPREG
1337 || opP->mode == IMMED
1338 || opP->mode == REGLST
1339 || (opP->mode != ABSL
1340 && (opP->reg == PC
1341 || opP->reg == ZPC)))
1342 losing++;
1343 break;
1345 case '%':
1346 if (opP->mode == CONTROL
1347 || opP->mode == FPREG
1348 || opP->mode == REGLST
1349 || opP->mode == IMMED
1350 || (opP->mode != ABSL
1351 && (opP->reg == PC
1352 || opP->reg == ZPC)))
1353 losing++;
1354 break;
1356 case '&':
1357 switch (opP->mode)
1359 case DREG:
1360 case AREG:
1361 case FPREG:
1362 case CONTROL:
1363 case IMMED:
1364 case AINC:
1365 case ADEC:
1366 case REGLST:
1367 losing++;
1368 break;
1369 case ABSL:
1370 break;
1371 default:
1372 if (opP->reg == PC
1373 || opP->reg == ZPC)
1374 losing++;
1375 break;
1377 break;
1379 case '*':
1380 if (opP->mode == CONTROL
1381 || opP->mode == FPREG
1382 || opP->mode == REGLST)
1383 losing++;
1384 break;
1386 case '+':
1387 if (opP->mode != AINC)
1388 losing++;
1389 break;
1391 case '-':
1392 if (opP->mode != ADEC)
1393 losing++;
1394 break;
1396 case '/':
1397 switch (opP->mode)
1399 case AREG:
1400 case CONTROL:
1401 case FPREG:
1402 case AINC:
1403 case ADEC:
1404 case IMMED:
1405 case REGLST:
1406 losing++;
1407 break;
1408 default:
1409 break;
1411 break;
1413 case ';':
1414 switch (opP->mode)
1416 case AREG:
1417 case CONTROL:
1418 case FPREG:
1419 case REGLST:
1420 losing++;
1421 break;
1422 default:
1423 break;
1425 break;
1427 case '?':
1428 switch (opP->mode)
1430 case AREG:
1431 case CONTROL:
1432 case FPREG:
1433 case AINC:
1434 case ADEC:
1435 case IMMED:
1436 case REGLST:
1437 losing++;
1438 break;
1439 case ABSL:
1440 break;
1441 default:
1442 if (opP->reg == PC || opP->reg == ZPC)
1443 losing++;
1444 break;
1446 break;
1448 case '@':
1449 switch (opP->mode)
1451 case AREG:
1452 case CONTROL:
1453 case FPREG:
1454 case IMMED:
1455 case REGLST:
1456 losing++;
1457 break;
1458 default:
1459 break;
1461 break;
1463 case '~': /* For now! (JF FOO is this right?) */
1464 switch (opP->mode)
1466 case DREG:
1467 case AREG:
1468 case CONTROL:
1469 case FPREG:
1470 case IMMED:
1471 case REGLST:
1472 losing++;
1473 break;
1474 case ABSL:
1475 break;
1476 default:
1477 if (opP->reg == PC
1478 || opP->reg == ZPC)
1479 losing++;
1480 break;
1482 break;
1484 case '3':
1485 if (opP->mode != CONTROL
1486 || (opP->reg != TT0 && opP->reg != TT1))
1487 losing++;
1488 break;
1490 case 'A':
1491 if (opP->mode != AREG)
1492 losing++;
1493 break;
1495 case 'a':
1496 if (opP->mode != AINDR)
1497 ++losing;
1498 break;
1500 case 'B': /* FOO */
1501 if (opP->mode != ABSL
1502 || (flag_long_jumps
1503 && strncmp (instring, "jbsr", 4) == 0))
1504 losing++;
1505 break;
1507 case 'C':
1508 if (opP->mode != CONTROL || opP->reg != CCR)
1509 losing++;
1510 break;
1512 case 'd':
1513 if (opP->mode != DISP
1514 || opP->reg < ADDR0
1515 || opP->reg > ADDR7)
1516 losing++;
1517 break;
1519 case 'D':
1520 if (opP->mode != DREG)
1521 losing++;
1522 break;
1524 case 'E':
1525 if (opP->reg != ACC)
1526 losing++;
1527 break;
1529 case 'F':
1530 if (opP->mode != FPREG)
1531 losing++;
1532 break;
1534 case 'G':
1535 if (opP->reg != MACSR)
1536 losing++;
1537 break;
1539 case 'H':
1540 if (opP->reg != MASK)
1541 losing++;
1542 break;
1544 case 'I':
1545 if (opP->mode != CONTROL
1546 || opP->reg < COP0
1547 || opP->reg > COP7)
1548 losing++;
1549 break;
1551 case 'J':
1552 if (opP->mode != CONTROL
1553 || opP->reg < USP
1554 || opP->reg > last_movec_reg)
1555 losing++;
1556 else
1558 const enum m68k_register *rp;
1559 for (rp = control_regs; *rp; rp++)
1560 if (*rp == opP->reg)
1561 break;
1562 if (*rp == 0)
1563 losing++;
1565 break;
1567 case 'k':
1568 if (opP->mode != IMMED)
1569 losing++;
1570 break;
1572 case 'l':
1573 case 'L':
1574 if (opP->mode == DREG
1575 || opP->mode == AREG
1576 || opP->mode == FPREG)
1578 if (s[1] == '8')
1579 losing++;
1580 else
1582 switch (opP->mode)
1584 case DREG:
1585 opP->mask = 1 << (opP->reg - DATA0);
1586 break;
1587 case AREG:
1588 opP->mask = 1 << (opP->reg - ADDR0 + 8);
1589 break;
1590 case FPREG:
1591 opP->mask = 1 << (opP->reg - FP0 + 16);
1592 break;
1593 default:
1594 abort ();
1596 opP->mode = REGLST;
1599 else if (opP->mode == CONTROL)
1601 if (s[1] != '8')
1602 losing++;
1603 else
1605 switch (opP->reg)
1607 case FPI:
1608 opP->mask = 1 << 24;
1609 break;
1610 case FPS:
1611 opP->mask = 1 << 25;
1612 break;
1613 case FPC:
1614 opP->mask = 1 << 26;
1615 break;
1616 default:
1617 losing++;
1618 break;
1620 opP->mode = REGLST;
1623 else if (opP->mode != REGLST)
1624 losing++;
1625 else if (s[1] == '8' && (opP->mask & 0x0ffffff) != 0)
1626 losing++;
1627 else if (s[1] == '3' && (opP->mask & 0x7000000) != 0)
1628 losing++;
1629 break;
1631 case 'M':
1632 if (opP->mode != IMMED)
1633 losing++;
1634 else if (opP->disp.exp.X_op != O_constant
1635 || ! issbyte (opP->disp.exp.X_add_number))
1636 losing++;
1637 else if (! m68k_quick
1638 && instring[3] != 'q'
1639 && instring[4] != 'q')
1640 losing++;
1641 break;
1643 case 'O':
1644 if (opP->mode != DREG
1645 && opP->mode != IMMED
1646 && opP->mode != ABSL)
1647 losing++;
1648 break;
1650 case 'Q':
1651 if (opP->mode != IMMED)
1652 losing++;
1653 else if (opP->disp.exp.X_op != O_constant
1654 || opP->disp.exp.X_add_number < 1
1655 || opP->disp.exp.X_add_number > 8)
1656 losing++;
1657 else if (! m68k_quick
1658 && (strncmp (instring, "add", 3) == 0
1659 || strncmp (instring, "sub", 3) == 0)
1660 && instring[3] != 'q')
1661 losing++;
1662 break;
1664 case 'R':
1665 if (opP->mode != DREG && opP->mode != AREG)
1666 losing++;
1667 break;
1669 case 'r':
1670 if (opP->mode != AINDR
1671 && (opP->mode != BASE
1672 || (opP->reg != 0
1673 && opP->reg != ZADDR0)
1674 || opP->disp.exp.X_op != O_absent
1675 || ((opP->index.reg < DATA0
1676 || opP->index.reg > DATA7)
1677 && (opP->index.reg < ADDR0
1678 || opP->index.reg > ADDR7))
1679 || opP->index.size != SIZE_UNSPEC
1680 || opP->index.scale != 1))
1681 losing++;
1682 break;
1684 case 's':
1685 if (opP->mode != CONTROL
1686 || ! (opP->reg == FPI
1687 || opP->reg == FPS
1688 || opP->reg == FPC))
1689 losing++;
1690 break;
1692 case 'S':
1693 if (opP->mode != CONTROL || opP->reg != SR)
1694 losing++;
1695 break;
1697 case 't':
1698 if (opP->mode != IMMED)
1699 losing++;
1700 else if (opP->disp.exp.X_op != O_constant
1701 || opP->disp.exp.X_add_number < 0
1702 || opP->disp.exp.X_add_number > 7)
1703 losing++;
1704 break;
1706 case 'U':
1707 if (opP->mode != CONTROL || opP->reg != USP)
1708 losing++;
1709 break;
1711 /* JF these are out of order. We could put them
1712 in order if we were willing to put up with
1713 bunches of #ifdef m68851s in the code.
1715 Don't forget that you need these operands
1716 to use 68030 MMU instructions. */
1717 #ifndef NO_68851
1718 /* Memory addressing mode used by pflushr */
1719 case '|':
1720 if (opP->mode == CONTROL
1721 || opP->mode == FPREG
1722 || opP->mode == DREG
1723 || opP->mode == AREG
1724 || opP->mode == REGLST)
1725 losing++;
1726 /* We should accept immediate operands, but they
1727 supposedly have to be quad word, and we don't
1728 handle that. I would like to see what a Motorola
1729 assembler does before doing something here. */
1730 if (opP->mode == IMMED)
1731 losing++;
1732 break;
1734 case 'f':
1735 if (opP->mode != CONTROL
1736 || (opP->reg != SFC && opP->reg != DFC))
1737 losing++;
1738 break;
1740 case '0':
1741 if (opP->mode != CONTROL || opP->reg != TC)
1742 losing++;
1743 break;
1745 case '1':
1746 if (opP->mode != CONTROL || opP->reg != AC)
1747 losing++;
1748 break;
1750 case '2':
1751 if (opP->mode != CONTROL
1752 || (opP->reg != CAL
1753 && opP->reg != VAL
1754 && opP->reg != SCC))
1755 losing++;
1756 break;
1758 case 'V':
1759 if (opP->mode != CONTROL
1760 || opP->reg != VAL)
1761 losing++;
1762 break;
1764 case 'W':
1765 if (opP->mode != CONTROL
1766 || (opP->reg != DRP
1767 && opP->reg != SRP
1768 && opP->reg != CRP))
1769 losing++;
1770 break;
1772 case 'X':
1773 if (opP->mode != CONTROL
1774 || (!(opP->reg >= BAD && opP->reg <= BAD + 7)
1775 && !(opP->reg >= BAC && opP->reg <= BAC + 7)))
1776 losing++;
1777 break;
1779 case 'Y':
1780 if (opP->mode != CONTROL || opP->reg != PSR)
1781 losing++;
1782 break;
1784 case 'Z':
1785 if (opP->mode != CONTROL || opP->reg != PCSR)
1786 losing++;
1787 break;
1788 #endif
1789 case 'c':
1790 if (opP->mode != CONTROL
1791 || (opP->reg != NC
1792 && opP->reg != IC
1793 && opP->reg != DC
1794 && opP->reg != BC))
1796 losing++;
1797 } /* not a cache specifier. */
1798 break;
1800 case '_':
1801 if (opP->mode != ABSL)
1802 ++losing;
1803 break;
1805 case 'u':
1806 if (opP->reg < DATA0L || opP->reg > ADDR7U)
1807 losing++;
1808 /* FIXME: kludge instead of fixing parser:
1809 upper/lower registers are *not* CONTROL
1810 registers, but ordinary ones. */
1811 if ((opP->reg >= DATA0L && opP->reg <= DATA7L)
1812 || (opP->reg >= DATA0U && opP->reg <= DATA7U))
1813 opP->mode = DREG;
1814 else
1815 opP->mode = AREG;
1816 break;
1818 default:
1819 abort ();
1820 } /* switch on type of operand */
1822 if (losing)
1823 break;
1824 } /* for each operand */
1825 } /* if immediately wrong */
1827 if (!losing)
1829 break;
1830 } /* got it. */
1832 opcode = opcode->m_next;
1834 if (!opcode)
1836 if (ok_arch
1837 && !(ok_arch & current_architecture))
1839 char buf[200], *cp;
1841 strcpy (buf,
1842 _("invalid instruction for this architecture; needs "));
1843 cp = buf + strlen (buf);
1844 switch (ok_arch)
1846 case mfloat:
1847 strcpy (cp, _("fpu (68040, 68060 or 68881/68882)"));
1848 break;
1849 case mmmu:
1850 strcpy (cp, _("mmu (68030 or 68851)"));
1851 break;
1852 case m68020up:
1853 strcpy (cp, _("68020 or higher"));
1854 break;
1855 case m68000up:
1856 strcpy (cp, _("68000 or higher"));
1857 break;
1858 case m68010up:
1859 strcpy (cp, _("68010 or higher"));
1860 break;
1861 default:
1863 int got_one = 0, idx;
1864 for (idx = 0;
1865 idx < (int) (sizeof (archs) / sizeof (archs[0]));
1866 idx++)
1868 if ((archs[idx].arch & ok_arch)
1869 && ! archs[idx].alias)
1871 if (got_one)
1873 strcpy (cp, " or ");
1874 cp += strlen (cp);
1876 got_one = 1;
1877 strcpy (cp, archs[idx].name);
1878 cp += strlen (cp);
1883 cp = xmalloc (strlen (buf) + 1);
1884 strcpy (cp, buf);
1885 the_ins.error = cp;
1887 else
1888 the_ins.error = _("operands mismatch");
1889 return;
1890 } /* Fell off the end */
1892 losing = 0;
1895 /* now assemble it */
1897 the_ins.args = opcode->m_operands;
1898 the_ins.numargs = opcode->m_opnum;
1899 the_ins.numo = opcode->m_codenum;
1900 the_ins.opcode[0] = getone (opcode);
1901 the_ins.opcode[1] = gettwo (opcode);
1903 for (s = the_ins.args, opP = &the_ins.operands[0]; *s; s += 2, opP++)
1905 /* This switch is a doozy.
1906 Watch the first step; its a big one! */
1907 switch (s[0])
1910 case '*':
1911 case '~':
1912 case '%':
1913 case ';':
1914 case '@':
1915 case '!':
1916 case '&':
1917 case '$':
1918 case '?':
1919 case '/':
1920 case '<':
1921 case '>':
1922 case 'm':
1923 case 'n':
1924 case 'o':
1925 case 'p':
1926 case 'q':
1927 case 'v':
1928 #ifndef NO_68851
1929 case '|':
1930 #endif
1931 switch (opP->mode)
1933 case IMMED:
1934 tmpreg = 0x3c; /* 7.4 */
1935 if (strchr ("bwl", s[1]))
1936 nextword = get_num (&opP->disp, 80);
1937 else
1938 nextword = get_num (&opP->disp, 0);
1939 if (isvar (&opP->disp))
1940 add_fix (s[1], &opP->disp, 0, 0);
1941 switch (s[1])
1943 case 'b':
1944 if (!isbyte (nextword))
1945 opP->error = _("operand out of range");
1946 addword (nextword);
1947 baseo = 0;
1948 break;
1949 case 'w':
1950 if (!isword (nextword))
1951 opP->error = _("operand out of range");
1952 addword (nextword);
1953 baseo = 0;
1954 break;
1955 case 'W':
1956 if (!issword (nextword))
1957 opP->error = _("operand out of range");
1958 addword (nextword);
1959 baseo = 0;
1960 break;
1961 case 'l':
1962 addword (nextword >> 16);
1963 addword (nextword);
1964 baseo = 0;
1965 break;
1967 case 'f':
1968 baseo = 2;
1969 outro = 8;
1970 break;
1971 case 'F':
1972 baseo = 4;
1973 outro = 11;
1974 break;
1975 case 'x':
1976 baseo = 6;
1977 outro = 15;
1978 break;
1979 case 'p':
1980 baseo = 6;
1981 outro = -1;
1982 break;
1983 default:
1984 abort ();
1986 if (!baseo)
1987 break;
1989 /* We gotta put out some float */
1990 if (op (&opP->disp) != O_big)
1992 valueT val;
1993 int gencnt;
1995 /* Can other cases happen here? */
1996 if (op (&opP->disp) != O_constant)
1997 abort ();
1999 val = (valueT) offs (&opP->disp);
2000 gencnt = 0;
2003 generic_bignum[gencnt] = (LITTLENUM_TYPE) val;
2004 val >>= LITTLENUM_NUMBER_OF_BITS;
2005 ++gencnt;
2007 while (val != 0);
2008 offs (&opP->disp) = gencnt;
2010 if (offs (&opP->disp) > 0)
2012 if (offs (&opP->disp) > baseo)
2014 as_warn (_("Bignum too big for %c format; truncated"),
2015 s[1]);
2016 offs (&opP->disp) = baseo;
2018 baseo -= offs (&opP->disp);
2019 while (baseo--)
2020 addword (0);
2021 for (wordp = generic_bignum + offs (&opP->disp) - 1;
2022 offs (&opP->disp)--;
2023 --wordp)
2024 addword (*wordp);
2025 break;
2027 gen_to_words (words, baseo, (long) outro);
2028 for (wordp = words; baseo--; wordp++)
2029 addword (*wordp);
2030 break;
2031 case DREG:
2032 tmpreg = opP->reg - DATA; /* 0.dreg */
2033 break;
2034 case AREG:
2035 tmpreg = 0x08 + opP->reg - ADDR; /* 1.areg */
2036 break;
2037 case AINDR:
2038 tmpreg = 0x10 + opP->reg - ADDR; /* 2.areg */
2039 break;
2040 case ADEC:
2041 tmpreg = 0x20 + opP->reg - ADDR; /* 4.areg */
2042 break;
2043 case AINC:
2044 tmpreg = 0x18 + opP->reg - ADDR; /* 3.areg */
2045 break;
2046 case DISP:
2048 nextword = get_num (&opP->disp, 80);
2050 if (opP->reg == PC
2051 && ! isvar (&opP->disp)
2052 && m68k_abspcadd)
2054 opP->disp.exp.X_op = O_symbol;
2055 #ifndef BFD_ASSEMBLER
2056 opP->disp.exp.X_add_symbol = &abs_symbol;
2057 #else
2058 opP->disp.exp.X_add_symbol =
2059 section_symbol (absolute_section);
2060 #endif
2063 /* Force into index mode. Hope this works */
2065 /* We do the first bit for 32-bit displacements, and the
2066 second bit for 16 bit ones. It is possible that we
2067 should make the default be WORD instead of LONG, but
2068 I think that'd break GCC, so we put up with a little
2069 inefficiency for the sake of working output. */
2071 if (!issword (nextword)
2072 || (isvar (&opP->disp)
2073 && ((opP->disp.size == SIZE_UNSPEC
2074 && flag_short_refs == 0
2075 && cpu_of_arch (current_architecture) >= m68020
2076 && ! arch_coldfire_p (current_architecture))
2077 || opP->disp.size == SIZE_LONG)))
2079 if (cpu_of_arch (current_architecture) < m68020
2080 || arch_coldfire_p (current_architecture))
2081 opP->error =
2082 _("displacement too large for this architecture; needs 68020 or higher");
2083 if (opP->reg == PC)
2084 tmpreg = 0x3B; /* 7.3 */
2085 else
2086 tmpreg = 0x30 + opP->reg - ADDR; /* 6.areg */
2087 if (isvar (&opP->disp))
2089 if (opP->reg == PC)
2091 if (opP->disp.size == SIZE_LONG
2092 #ifdef OBJ_ELF
2093 /* If the displacement needs pic
2094 relocation it cannot be relaxed. */
2095 || opP->disp.pic_reloc != pic_none
2096 #endif
2099 addword (0x0170);
2100 add_fix ('l', &opP->disp, 1, 2);
2102 else
2104 add_frag (adds (&opP->disp),
2105 offs (&opP->disp),
2106 TAB (PCREL1632, SZ_UNDEF));
2107 break;
2110 else
2112 addword (0x0170);
2113 add_fix ('l', &opP->disp, 0, 0);
2116 else
2117 addword (0x0170);
2118 addword (nextword >> 16);
2120 else
2122 if (opP->reg == PC)
2123 tmpreg = 0x3A; /* 7.2 */
2124 else
2125 tmpreg = 0x28 + opP->reg - ADDR; /* 5.areg */
2127 if (isvar (&opP->disp))
2129 if (opP->reg == PC)
2131 add_fix ('w', &opP->disp, 1, 0);
2133 else
2134 add_fix ('w', &opP->disp, 0, 0);
2137 addword (nextword);
2138 break;
2140 case POST:
2141 case PRE:
2142 case BASE:
2143 nextword = 0;
2144 baseo = get_num (&opP->disp, 80);
2145 if (opP->mode == POST || opP->mode == PRE)
2146 outro = get_num (&opP->odisp, 80);
2147 /* Figure out the `addressing mode'.
2148 Also turn on the BASE_DISABLE bit, if needed. */
2149 if (opP->reg == PC || opP->reg == ZPC)
2151 tmpreg = 0x3b; /* 7.3 */
2152 if (opP->reg == ZPC)
2153 nextword |= 0x80;
2155 else if (opP->reg == 0)
2157 nextword |= 0x80;
2158 tmpreg = 0x30; /* 6.garbage */
2160 else if (opP->reg >= ZADDR0 && opP->reg <= ZADDR7)
2162 nextword |= 0x80;
2163 tmpreg = 0x30 + opP->reg - ZADDR0;
2165 else
2166 tmpreg = 0x30 + opP->reg - ADDR; /* 6.areg */
2168 siz1 = opP->disp.size;
2169 if (opP->mode == POST || opP->mode == PRE)
2170 siz2 = opP->odisp.size;
2171 else
2172 siz2 = SIZE_UNSPEC;
2174 /* Index register stuff */
2175 if (opP->index.reg != 0
2176 && opP->index.reg >= DATA
2177 && opP->index.reg <= ADDR7)
2179 nextword |= (opP->index.reg - DATA) << 12;
2181 if (opP->index.size == SIZE_LONG
2182 || (opP->index.size == SIZE_UNSPEC
2183 && m68k_index_width_default == SIZE_LONG))
2184 nextword |= 0x800;
2186 if ((opP->index.scale != 1
2187 && cpu_of_arch (current_architecture) < m68020)
2188 || (opP->index.scale == 8
2189 && arch_coldfire_p (current_architecture)))
2191 opP->error =
2192 _("scale factor invalid on this architecture; needs cpu32 or 68020 or higher");
2195 if (arch_coldfire_p (current_architecture)
2196 && opP->index.size == SIZE_WORD)
2197 opP->error = _("invalid index size for coldfire");
2199 switch (opP->index.scale)
2201 case 1:
2202 break;
2203 case 2:
2204 nextword |= 0x200;
2205 break;
2206 case 4:
2207 nextword |= 0x400;
2208 break;
2209 case 8:
2210 nextword |= 0x600;
2211 break;
2212 default:
2213 abort ();
2215 /* IF its simple,
2216 GET US OUT OF HERE! */
2218 /* Must be INDEX, with an index register. Address
2219 register cannot be ZERO-PC, and either :b was
2220 forced, or we know it will fit. For a 68000 or
2221 68010, force this mode anyways, because the
2222 larger modes aren't supported. */
2223 if (opP->mode == BASE
2224 && ((opP->reg >= ADDR0
2225 && opP->reg <= ADDR7)
2226 || opP->reg == PC))
2228 if (siz1 == SIZE_BYTE
2229 || cpu_of_arch (current_architecture) < m68020
2230 || arch_coldfire_p (current_architecture)
2231 || (siz1 == SIZE_UNSPEC
2232 && ! isvar (&opP->disp)
2233 && issbyte (baseo)))
2235 nextword += baseo & 0xff;
2236 addword (nextword);
2237 if (isvar (&opP->disp))
2239 /* Do a byte relocation. If it doesn't
2240 fit (possible on m68000) let the
2241 fixup processing complain later. */
2242 if (opP->reg == PC)
2243 add_fix ('B', &opP->disp, 1, 1);
2244 else
2245 add_fix ('B', &opP->disp, 0, 0);
2247 else if (siz1 != SIZE_BYTE)
2249 if (siz1 != SIZE_UNSPEC)
2250 as_warn (_("Forcing byte displacement"));
2251 if (! issbyte (baseo))
2252 opP->error = _("byte displacement out of range");
2255 break;
2257 else if (siz1 == SIZE_UNSPEC
2258 && opP->reg == PC
2259 && isvar (&opP->disp)
2260 && subs (&opP->disp) == NULL
2261 #ifdef OBJ_ELF
2262 /* If the displacement needs pic
2263 relocation it cannot be relaxed. */
2264 && opP->disp.pic_reloc == pic_none
2265 #endif
2268 /* The code in md_convert_frag_1 needs to be
2269 able to adjust nextword. Call frag_grow
2270 to ensure that we have enough space in
2271 the frag obstack to make all the bytes
2272 contiguous. */
2273 frag_grow (14);
2274 nextword += baseo & 0xff;
2275 addword (nextword);
2276 add_frag (adds (&opP->disp), offs (&opP->disp),
2277 TAB (PCINDEX, SZ_UNDEF));
2279 break;
2283 else
2285 nextword |= 0x40; /* No index reg */
2286 if (opP->index.reg >= ZDATA0
2287 && opP->index.reg <= ZDATA7)
2288 nextword |= (opP->index.reg - ZDATA0) << 12;
2289 else if (opP->index.reg >= ZADDR0
2290 || opP->index.reg <= ZADDR7)
2291 nextword |= (opP->index.reg - ZADDR0 + 8) << 12;
2294 /* It isn't simple. */
2296 if (cpu_of_arch (current_architecture) < m68020
2297 || arch_coldfire_p (current_architecture))
2298 opP->error =
2299 _("invalid operand mode for this architecture; needs 68020 or higher");
2301 nextword |= 0x100;
2302 /* If the guy specified a width, we assume that it is
2303 wide enough. Maybe it isn't. If so, we lose. */
2304 switch (siz1)
2306 case SIZE_UNSPEC:
2307 if (isvar (&opP->disp)
2308 ? m68k_rel32
2309 : ! issword (baseo))
2311 siz1 = SIZE_LONG;
2312 nextword |= 0x30;
2314 else if (! isvar (&opP->disp) && baseo == 0)
2315 nextword |= 0x10;
2316 else
2318 nextword |= 0x20;
2319 siz1 = SIZE_WORD;
2321 break;
2322 case SIZE_BYTE:
2323 as_warn (_(":b not permitted; defaulting to :w"));
2324 /* Fall through. */
2325 case SIZE_WORD:
2326 nextword |= 0x20;
2327 break;
2328 case SIZE_LONG:
2329 nextword |= 0x30;
2330 break;
2333 /* Figure out innner displacement stuff */
2334 if (opP->mode == POST || opP->mode == PRE)
2336 if (cpu_of_arch (current_architecture) & cpu32)
2337 opP->error = _("invalid operand mode for this architecture; needs 68020 or higher");
2338 switch (siz2)
2340 case SIZE_UNSPEC:
2341 if (isvar (&opP->odisp)
2342 ? m68k_rel32
2343 : ! issword (outro))
2345 siz2 = SIZE_LONG;
2346 nextword |= 0x3;
2348 else if (! isvar (&opP->odisp) && outro == 0)
2349 nextword |= 0x1;
2350 else
2352 nextword |= 0x2;
2353 siz2 = SIZE_WORD;
2355 break;
2356 case 1:
2357 as_warn (_(":b not permitted; defaulting to :w"));
2358 /* Fall through. */
2359 case 2:
2360 nextword |= 0x2;
2361 break;
2362 case 3:
2363 nextword |= 0x3;
2364 break;
2366 if (opP->mode == POST
2367 && (nextword & 0x40) == 0)
2368 nextword |= 0x04;
2370 addword (nextword);
2372 if (siz1 != SIZE_UNSPEC && isvar (&opP->disp))
2374 if (opP->reg == PC || opP->reg == ZPC)
2375 add_fix (siz1 == SIZE_LONG ? 'l' : 'w', &opP->disp, 1, 2);
2376 else
2377 add_fix (siz1 == SIZE_LONG ? 'l' : 'w', &opP->disp, 0, 0);
2379 if (siz1 == SIZE_LONG)
2380 addword (baseo >> 16);
2381 if (siz1 != SIZE_UNSPEC)
2382 addword (baseo);
2384 if (siz2 != SIZE_UNSPEC && isvar (&opP->odisp))
2385 add_fix (siz2 == SIZE_LONG ? 'l' : 'w', &opP->odisp, 0, 0);
2386 if (siz2 == SIZE_LONG)
2387 addword (outro >> 16);
2388 if (siz2 != SIZE_UNSPEC)
2389 addword (outro);
2391 break;
2393 case ABSL:
2394 nextword = get_num (&opP->disp, 80);
2395 switch (opP->disp.size)
2397 default:
2398 abort ();
2399 case SIZE_UNSPEC:
2400 if (!isvar (&opP->disp) && issword (offs (&opP->disp)))
2402 tmpreg = 0x38; /* 7.0 */
2403 addword (nextword);
2404 break;
2406 if (isvar (&opP->disp)
2407 && !subs (&opP->disp)
2408 && adds (&opP->disp)
2409 #ifdef OBJ_ELF
2410 /* If the displacement needs pic relocation it
2411 cannot be relaxed. */
2412 && opP->disp.pic_reloc == pic_none
2413 #endif
2414 && !flag_long_jumps
2415 && !strchr ("~%&$?", s[0]))
2417 tmpreg = 0x3A; /* 7.2 */
2418 add_frag (adds (&opP->disp),
2419 offs (&opP->disp),
2420 TAB (ABSTOPCREL, SZ_UNDEF));
2421 break;
2423 /* Fall through into long */
2424 case SIZE_LONG:
2425 if (isvar (&opP->disp))
2426 add_fix ('l', &opP->disp, 0, 0);
2428 tmpreg = 0x39;/* 7.1 mode */
2429 addword (nextword >> 16);
2430 addword (nextword);
2431 break;
2433 case SIZE_BYTE:
2434 as_bad (_("unsupported byte value; use a different suffix"));
2435 /* Fall through. */
2436 case SIZE_WORD: /* Word */
2437 if (isvar (&opP->disp))
2438 add_fix ('w', &opP->disp, 0, 0);
2440 tmpreg = 0x38;/* 7.0 mode */
2441 addword (nextword);
2442 break;
2444 break;
2445 case CONTROL:
2446 case FPREG:
2447 default:
2448 as_bad (_("unknown/incorrect operand"));
2449 /* abort (); */
2451 install_gen_operand (s[1], tmpreg);
2452 break;
2454 case '#':
2455 case '^':
2456 switch (s[1])
2457 { /* JF: I hate floating point! */
2458 case 'j':
2459 tmpreg = 70;
2460 break;
2461 case '8':
2462 tmpreg = 20;
2463 break;
2464 case 'C':
2465 tmpreg = 50;
2466 break;
2467 case '3':
2468 default:
2469 tmpreg = 80;
2470 break;
2472 tmpreg = get_num (&opP->disp, tmpreg);
2473 if (isvar (&opP->disp))
2474 add_fix (s[1], &opP->disp, 0, 0);
2475 switch (s[1])
2477 case 'b': /* Danger: These do no check for
2478 certain types of overflow.
2479 user beware! */
2480 if (!isbyte (tmpreg))
2481 opP->error = _("out of range");
2482 insop (tmpreg, opcode);
2483 if (isvar (&opP->disp))
2484 the_ins.reloc[the_ins.nrel - 1].n =
2485 (opcode->m_codenum) * 2 + 1;
2486 break;
2487 case 'B':
2488 if (!issbyte (tmpreg))
2489 opP->error = _("out of range");
2490 the_ins.opcode[the_ins.numo - 1] |= tmpreg & 0xff;
2491 if (isvar (&opP->disp))
2492 the_ins.reloc[the_ins.nrel - 1].n = opcode->m_codenum * 2 - 1;
2493 break;
2494 case 'w':
2495 if (!isword (tmpreg))
2496 opP->error = _("out of range");
2497 insop (tmpreg, opcode);
2498 if (isvar (&opP->disp))
2499 the_ins.reloc[the_ins.nrel - 1].n = (opcode->m_codenum) * 2;
2500 break;
2501 case 'W':
2502 if (!issword (tmpreg))
2503 opP->error = _("out of range");
2504 insop (tmpreg, opcode);
2505 if (isvar (&opP->disp))
2506 the_ins.reloc[the_ins.nrel - 1].n = (opcode->m_codenum) * 2;
2507 break;
2508 case 'l':
2509 /* Because of the way insop works, we put these two out
2510 backwards. */
2511 insop (tmpreg, opcode);
2512 insop (tmpreg >> 16, opcode);
2513 if (isvar (&opP->disp))
2514 the_ins.reloc[the_ins.nrel - 1].n = (opcode->m_codenum) * 2;
2515 break;
2516 case '3':
2517 tmpreg &= 0xFF;
2518 case '8':
2519 case 'C':
2520 case 'j':
2521 install_operand (s[1], tmpreg);
2522 break;
2523 default:
2524 abort ();
2526 break;
2528 case '+':
2529 case '-':
2530 case 'A':
2531 case 'a':
2532 install_operand (s[1], opP->reg - ADDR);
2533 break;
2535 case 'B':
2536 tmpreg = get_num (&opP->disp, 80);
2537 switch (s[1])
2539 case 'B':
2540 add_fix ('B', &opP->disp, 1, -1);
2541 break;
2542 case 'W':
2543 add_fix ('w', &opP->disp, 1, 0);
2544 addword (0);
2545 break;
2546 case 'L':
2547 long_branch:
2548 if (! HAVE_LONG_BRANCH (current_architecture))
2549 as_warn (_("Can't use long branches on 68000/68010/5200"));
2550 the_ins.opcode[0] |= 0xff;
2551 add_fix ('l', &opP->disp, 1, 0);
2552 addword (0);
2553 addword (0);
2554 break;
2555 case 'g':
2556 if (subs (&opP->disp)) /* We can't relax it */
2557 goto long_branch;
2559 #ifdef OBJ_ELF
2560 /* If the displacement needs pic relocation it cannot be
2561 relaxed. */
2562 if (opP->disp.pic_reloc != pic_none)
2563 goto long_branch;
2564 #endif
2565 /* This could either be a symbol, or an absolute
2566 address. If it's an absolute address, turn it into
2567 an absolute jump right here and keep it out of the
2568 relaxer. */
2569 if (adds (&opP->disp) == 0)
2571 if (the_ins.opcode[0] == 0x6000) /* jbra */
2572 the_ins.opcode[0] = 0x4EF9;
2573 else if (the_ins.opcode[0] == 0x6100) /* jbsr */
2574 the_ins.opcode[0] = 0x4EB9;
2575 else /* jCC */
2577 the_ins.opcode[0] ^= 0x0100;
2578 the_ins.opcode[0] |= 0x0006;
2579 addword (0x4EF9);
2581 add_fix ('l', &opP->disp, 0, 0);
2582 addword (0);
2583 addword (0);
2584 break;
2587 /* Now we know it's going into the relaxer. Now figure
2588 out which mode. We try in this order of preference:
2589 long branch, absolute jump, byte/word branches only. */
2590 if (HAVE_LONG_BRANCH (current_architecture))
2591 add_frag (adds (&opP->disp), offs (&opP->disp),
2592 TAB (BRANCHBWL, SZ_UNDEF));
2593 else if (! flag_keep_pcrel)
2595 if ((the_ins.opcode[0] == 0x6000)
2596 || (the_ins.opcode[0] == 0x6100))
2597 add_frag (adds (&opP->disp), offs (&opP->disp),
2598 TAB (BRABSJUNC, SZ_UNDEF));
2599 else
2600 add_frag (adds (&opP->disp), offs (&opP->disp),
2601 TAB (BRABSJCOND, SZ_UNDEF));
2603 else
2604 add_frag (adds (&opP->disp), offs (&opP->disp),
2605 TAB (BRANCHBW, SZ_UNDEF));
2606 break;
2607 case 'w':
2608 if (isvar (&opP->disp))
2610 /* Check for DBcc instructions. We can relax them,
2611 but only if we have long branches and/or absolute
2612 jumps. */
2613 if (((the_ins.opcode[0] & 0xf0f8) == 0x50c8)
2614 && (HAVE_LONG_BRANCH (current_architecture)
2615 || (! flag_keep_pcrel)))
2617 if (HAVE_LONG_BRANCH (current_architecture))
2618 add_frag (adds (&opP->disp), offs (&opP->disp),
2619 TAB (DBCCLBR, SZ_UNDEF));
2620 else
2621 add_frag (adds (&opP->disp), offs (&opP->disp),
2622 TAB (DBCCABSJ, SZ_UNDEF));
2623 break;
2625 add_fix ('w', &opP->disp, 1, 0);
2627 addword (0);
2628 break;
2629 case 'C': /* Fixed size LONG coproc branches */
2630 add_fix ('l', &opP->disp, 1, 0);
2631 addword (0);
2632 addword (0);
2633 break;
2634 case 'c': /* Var size Coprocesssor branches */
2635 if (subs (&opP->disp) || (adds (&opP->disp) == 0))
2637 the_ins.opcode[the_ins.numo - 1] |= 0x40;
2638 add_fix ('l', &opP->disp, 1, 0);
2639 addword (0);
2640 addword (0);
2642 else
2643 add_frag (adds (&opP->disp), offs (&opP->disp),
2644 TAB (FBRANCH, SZ_UNDEF));
2645 break;
2646 default:
2647 abort ();
2649 break;
2651 case 'C': /* Ignore it */
2652 break;
2654 case 'd': /* JF this is a kludge */
2655 install_operand ('s', opP->reg - ADDR);
2656 tmpreg = get_num (&opP->disp, 80);
2657 if (!issword (tmpreg))
2659 as_warn (_("Expression out of range, using 0"));
2660 tmpreg = 0;
2662 addword (tmpreg);
2663 break;
2665 case 'D':
2666 install_operand (s[1], opP->reg - DATA);
2667 break;
2669 case 'E': /* Ignore it */
2670 break;
2672 case 'F':
2673 install_operand (s[1], opP->reg - FP0);
2674 break;
2676 case 'G': /* Ignore it */
2677 case 'H':
2678 break;
2680 case 'I':
2681 tmpreg = opP->reg - COP0;
2682 install_operand (s[1], tmpreg);
2683 break;
2685 case 'J': /* JF foo */
2686 switch (opP->reg)
2688 case SFC:
2689 tmpreg = 0x000;
2690 break;
2691 case DFC:
2692 tmpreg = 0x001;
2693 break;
2694 case CACR:
2695 tmpreg = 0x002;
2696 break;
2697 case TC:
2698 tmpreg = 0x003;
2699 break;
2700 case ITT0:
2701 tmpreg = 0x004;
2702 break;
2703 case ITT1:
2704 tmpreg = 0x005;
2705 break;
2706 case DTT0:
2707 tmpreg = 0x006;
2708 break;
2709 case DTT1:
2710 tmpreg = 0x007;
2711 break;
2712 case BUSCR:
2713 tmpreg = 0x008;
2714 break;
2716 case USP:
2717 tmpreg = 0x800;
2718 break;
2719 case VBR:
2720 tmpreg = 0x801;
2721 break;
2722 case CAAR:
2723 tmpreg = 0x802;
2724 break;
2725 case MSP:
2726 tmpreg = 0x803;
2727 break;
2728 case ISP:
2729 tmpreg = 0x804;
2730 break;
2731 case MMUSR:
2732 tmpreg = 0x805;
2733 break;
2734 case URP:
2735 tmpreg = 0x806;
2736 break;
2737 case SRP:
2738 tmpreg = 0x807;
2739 break;
2740 case PCR:
2741 tmpreg = 0x808;
2742 break;
2743 case ROMBAR:
2744 tmpreg = 0xC00;
2745 break;
2746 case RAMBAR0:
2747 tmpreg = 0xC04;
2748 break;
2749 case RAMBAR1:
2750 tmpreg = 0xC05;
2751 break;
2752 case MBAR:
2753 tmpreg = 0xC0F;
2754 break;
2755 default:
2756 abort ();
2758 install_operand (s[1], tmpreg);
2759 break;
2761 case 'k':
2762 tmpreg = get_num (&opP->disp, 55);
2763 install_operand (s[1], tmpreg & 0x7f);
2764 break;
2766 case 'l':
2767 tmpreg = opP->mask;
2768 if (s[1] == 'w')
2770 if (tmpreg & 0x7FF0000)
2771 as_bad (_("Floating point register in register list"));
2772 insop (reverse_16_bits (tmpreg), opcode);
2774 else
2776 if (tmpreg & 0x700FFFF)
2777 as_bad (_("Wrong register in floating-point reglist"));
2778 install_operand (s[1], reverse_8_bits (tmpreg >> 16));
2780 break;
2782 case 'L':
2783 tmpreg = opP->mask;
2784 if (s[1] == 'w')
2786 if (tmpreg & 0x7FF0000)
2787 as_bad (_("Floating point register in register list"));
2788 insop (tmpreg, opcode);
2790 else if (s[1] == '8')
2792 if (tmpreg & 0x0FFFFFF)
2793 as_bad (_("incorrect register in reglist"));
2794 install_operand (s[1], tmpreg >> 24);
2796 else
2798 if (tmpreg & 0x700FFFF)
2799 as_bad (_("wrong register in floating-point reglist"));
2800 else
2801 install_operand (s[1], tmpreg >> 16);
2803 break;
2805 case 'M':
2806 install_operand (s[1], get_num (&opP->disp, 60));
2807 break;
2809 case 'O':
2810 tmpreg = ((opP->mode == DREG)
2811 ? 0x20 + (int) (opP->reg - DATA)
2812 : (get_num (&opP->disp, 40) & 0x1F));
2813 install_operand (s[1], tmpreg);
2814 break;
2816 case 'Q':
2817 tmpreg = get_num (&opP->disp, 10);
2818 if (tmpreg == 8)
2819 tmpreg = 0;
2820 install_operand (s[1], tmpreg);
2821 break;
2823 case 'R':
2824 /* This depends on the fact that ADDR registers are eight
2825 more than their corresponding DATA regs, so the result
2826 will have the ADDR_REG bit set */
2827 install_operand (s[1], opP->reg - DATA);
2828 break;
2830 case 'r':
2831 if (opP->mode == AINDR)
2832 install_operand (s[1], opP->reg - DATA);
2833 else
2834 install_operand (s[1], opP->index.reg - DATA);
2835 break;
2837 case 's':
2838 if (opP->reg == FPI)
2839 tmpreg = 0x1;
2840 else if (opP->reg == FPS)
2841 tmpreg = 0x2;
2842 else if (opP->reg == FPC)
2843 tmpreg = 0x4;
2844 else
2845 abort ();
2846 install_operand (s[1], tmpreg);
2847 break;
2849 case 'S': /* Ignore it */
2850 break;
2852 case 'T':
2853 install_operand (s[1], get_num (&opP->disp, 30));
2854 break;
2856 case 'U': /* Ignore it */
2857 break;
2859 case 'c':
2860 switch (opP->reg)
2862 case NC:
2863 tmpreg = 0;
2864 break;
2865 case DC:
2866 tmpreg = 1;
2867 break;
2868 case IC:
2869 tmpreg = 2;
2870 break;
2871 case BC:
2872 tmpreg = 3;
2873 break;
2874 default:
2875 as_fatal (_("failed sanity check"));
2876 } /* switch on cache token */
2877 install_operand (s[1], tmpreg);
2878 break;
2879 #ifndef NO_68851
2880 /* JF: These are out of order, I fear. */
2881 case 'f':
2882 switch (opP->reg)
2884 case SFC:
2885 tmpreg = 0;
2886 break;
2887 case DFC:
2888 tmpreg = 1;
2889 break;
2890 default:
2891 abort ();
2893 install_operand (s[1], tmpreg);
2894 break;
2896 case '0':
2897 case '1':
2898 case '2':
2899 switch (opP->reg)
2901 case TC:
2902 tmpreg = 0;
2903 break;
2904 case CAL:
2905 tmpreg = 4;
2906 break;
2907 case VAL:
2908 tmpreg = 5;
2909 break;
2910 case SCC:
2911 tmpreg = 6;
2912 break;
2913 case AC:
2914 tmpreg = 7;
2915 break;
2916 default:
2917 abort ();
2919 install_operand (s[1], tmpreg);
2920 break;
2922 case 'V':
2923 if (opP->reg == VAL)
2924 break;
2925 abort ();
2927 case 'W':
2928 switch (opP->reg)
2930 case DRP:
2931 tmpreg = 1;
2932 break;
2933 case SRP:
2934 tmpreg = 2;
2935 break;
2936 case CRP:
2937 tmpreg = 3;
2938 break;
2939 default:
2940 abort ();
2942 install_operand (s[1], tmpreg);
2943 break;
2945 case 'X':
2946 switch (opP->reg)
2948 case BAD:
2949 case BAD + 1:
2950 case BAD + 2:
2951 case BAD + 3:
2952 case BAD + 4:
2953 case BAD + 5:
2954 case BAD + 6:
2955 case BAD + 7:
2956 tmpreg = (4 << 10) | ((opP->reg - BAD) << 2);
2957 break;
2959 case BAC:
2960 case BAC + 1:
2961 case BAC + 2:
2962 case BAC + 3:
2963 case BAC + 4:
2964 case BAC + 5:
2965 case BAC + 6:
2966 case BAC + 7:
2967 tmpreg = (5 << 10) | ((opP->reg - BAC) << 2);
2968 break;
2970 default:
2971 abort ();
2973 install_operand (s[1], tmpreg);
2974 break;
2975 case 'Y':
2976 know (opP->reg == PSR);
2977 break;
2978 case 'Z':
2979 know (opP->reg == PCSR);
2980 break;
2981 #endif /* m68851 */
2982 case '3':
2983 switch (opP->reg)
2985 case TT0:
2986 tmpreg = 2;
2987 break;
2988 case TT1:
2989 tmpreg = 3;
2990 break;
2991 default:
2992 abort ();
2994 install_operand (s[1], tmpreg);
2995 break;
2996 case 't':
2997 tmpreg = get_num (&opP->disp, 20);
2998 install_operand (s[1], tmpreg);
2999 break;
3000 case '_': /* used only for move16 absolute 32-bit address */
3001 if (isvar (&opP->disp))
3002 add_fix ('l', &opP->disp, 0, 0);
3003 tmpreg = get_num (&opP->disp, 80);
3004 addword (tmpreg >> 16);
3005 addword (tmpreg & 0xFFFF);
3006 break;
3007 case 'u':
3008 install_operand (s[1], opP->reg - DATA0L);
3009 opP->reg -= (DATA0L);
3010 opP->reg &= 0x0F; /* remove upper/lower bit */
3011 break;
3012 default:
3013 abort ();
3017 /* By the time whe get here (FINALLY) the_ins contains the complete
3018 instruction, ready to be emitted. . . */
3021 static int
3022 reverse_16_bits (in)
3023 int in;
3025 int out = 0;
3026 int n;
3028 static int mask[16] =
3030 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
3031 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000
3033 for (n = 0; n < 16; n++)
3035 if (in & mask[n])
3036 out |= mask[15 - n];
3038 return out;
3039 } /* reverse_16_bits() */
3041 static int
3042 reverse_8_bits (in)
3043 int in;
3045 int out = 0;
3046 int n;
3048 static int mask[8] =
3050 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
3053 for (n = 0; n < 8; n++)
3055 if (in & mask[n])
3056 out |= mask[7 - n];
3058 return out;
3059 } /* reverse_8_bits() */
3061 /* Cause an extra frag to be generated here, inserting up to 10 bytes
3062 (that value is chosen in the frag_var call in md_assemble). TYPE
3063 is the subtype of the frag to be generated; its primary type is
3064 rs_machine_dependent.
3066 The TYPE parameter is also used by md_convert_frag_1 and
3067 md_estimate_size_before_relax. The appropriate type of fixup will
3068 be emitted by md_convert_frag_1.
3070 ADD becomes the FR_SYMBOL field of the frag, and OFF the FR_OFFSET. */
3071 static void
3072 install_operand (mode, val)
3073 int mode;
3074 int val;
3076 switch (mode)
3078 case 's':
3079 the_ins.opcode[0] |= val & 0xFF; /* JF FF is for M kludge */
3080 break;
3081 case 'd':
3082 the_ins.opcode[0] |= val << 9;
3083 break;
3084 case '1':
3085 the_ins.opcode[1] |= val << 12;
3086 break;
3087 case '2':
3088 the_ins.opcode[1] |= val << 6;
3089 break;
3090 case '3':
3091 the_ins.opcode[1] |= val;
3092 break;
3093 case '4':
3094 the_ins.opcode[2] |= val << 12;
3095 break;
3096 case '5':
3097 the_ins.opcode[2] |= val << 6;
3098 break;
3099 case '6':
3100 /* DANGER! This is a hack to force cas2l and cas2w cmds to be
3101 three words long! */
3102 the_ins.numo++;
3103 the_ins.opcode[2] |= val;
3104 break;
3105 case '7':
3106 the_ins.opcode[1] |= val << 7;
3107 break;
3108 case '8':
3109 the_ins.opcode[1] |= val << 10;
3110 break;
3111 #ifndef NO_68851
3112 case '9':
3113 the_ins.opcode[1] |= val << 5;
3114 break;
3115 #endif
3117 case 't':
3118 the_ins.opcode[1] |= (val << 10) | (val << 7);
3119 break;
3120 case 'D':
3121 the_ins.opcode[1] |= (val << 12) | val;
3122 break;
3123 case 'g':
3124 the_ins.opcode[0] |= val = 0xff;
3125 break;
3126 case 'i':
3127 the_ins.opcode[0] |= val << 9;
3128 break;
3129 case 'C':
3130 the_ins.opcode[1] |= val;
3131 break;
3132 case 'j':
3133 the_ins.opcode[1] |= val;
3134 the_ins.numo++; /* What a hack */
3135 break;
3136 case 'k':
3137 the_ins.opcode[1] |= val << 4;
3138 break;
3139 case 'b':
3140 case 'w':
3141 case 'W':
3142 case 'l':
3143 break;
3144 case 'e':
3145 the_ins.opcode[0] |= (val << 6);
3146 break;
3147 case 'L':
3148 the_ins.opcode[1] = (val >> 16);
3149 the_ins.opcode[2] = val & 0xffff;
3150 break;
3151 case 'm':
3152 the_ins.opcode[0] |= ((val & 0x8) << (6 - 3));
3153 the_ins.opcode[0] |= ((val & 0x7) << 9);
3154 the_ins.opcode[1] |= ((val & 0x10) << (7 - 4));
3155 break;
3156 case 'n':
3157 the_ins.opcode[0] |= ((val & 0x8) << (6 - 3));
3158 the_ins.opcode[0] |= ((val & 0x7) << 9);
3159 break;
3160 case 'o':
3161 the_ins.opcode[1] |= val << 12;
3162 the_ins.opcode[1] |= ((val & 0x10) << (7 - 4));
3163 break;
3164 case 'M':
3165 the_ins.opcode[0] |= (val & 0xF);
3166 the_ins.opcode[1] |= ((val & 0x10) << (6 - 4));
3167 break;
3168 case 'N':
3169 the_ins.opcode[1] |= (val & 0xF);
3170 the_ins.opcode[1] |= ((val & 0x10) << (6 - 4));
3171 break;
3172 case 'h':
3173 the_ins.opcode[1] |= ((val != 1) << 10);
3174 break;
3175 case 'c':
3176 default:
3177 as_fatal (_("failed sanity check."));
3179 } /* install_operand() */
3181 static void
3182 install_gen_operand (mode, val)
3183 int mode;
3184 int val;
3186 switch (mode)
3188 case 's':
3189 the_ins.opcode[0] |= val;
3190 break;
3191 case 'd':
3192 /* This is a kludge!!! */
3193 the_ins.opcode[0] |= (val & 0x07) << 9 | (val & 0x38) << 3;
3194 break;
3195 case 'b':
3196 case 'w':
3197 case 'l':
3198 case 'f':
3199 case 'F':
3200 case 'x':
3201 case 'p':
3202 the_ins.opcode[0] |= val;
3203 break;
3204 /* more stuff goes here */
3205 default:
3206 as_fatal (_("failed sanity check."));
3208 } /* install_gen_operand() */
3211 * verify that we have some number of paren pairs, do m68k_ip_op(), and
3212 * then deal with the bitfield hack.
3215 static char *
3216 crack_operand (str, opP)
3217 register char *str;
3218 register struct m68k_op *opP;
3220 register int parens;
3221 register int c;
3222 register char *beg_str;
3223 int inquote = 0;
3225 if (!str)
3227 return str;
3229 beg_str = str;
3230 for (parens = 0; *str && (parens > 0 || inquote || notend (str)); str++)
3232 if (! inquote)
3234 if (*str == '(')
3235 parens++;
3236 else if (*str == ')')
3238 if (!parens)
3239 { /* ERROR */
3240 opP->error = _("Extra )");
3241 return str;
3243 --parens;
3246 if (flag_mri && *str == '\'')
3247 inquote = ! inquote;
3249 if (!*str && parens)
3250 { /* ERROR */
3251 opP->error = _("Missing )");
3252 return str;
3254 c = *str;
3255 *str = '\0';
3256 if (m68k_ip_op (beg_str, opP) != 0)
3258 *str = c;
3259 return str;
3261 *str = c;
3262 if (c == '}')
3263 c = *++str; /* JF bitfield hack */
3264 if (c)
3266 c = *++str;
3267 if (!c)
3268 as_bad (_("Missing operand"));
3271 /* Detect MRI REG symbols and convert them to REGLSTs. */
3272 if (opP->mode == CONTROL && (int)opP->reg < 0)
3274 opP->mode = REGLST;
3275 opP->mask = ~(int)opP->reg;
3276 opP->reg = 0;
3279 return str;
3282 /* This is the guts of the machine-dependent assembler. STR points to a
3283 machine dependent instruction. This function is supposed to emit
3284 the frags/bytes it assembles to.
3287 static void
3288 insert_reg (regname, regnum)
3289 const char *regname;
3290 int regnum;
3292 char buf[100];
3293 int i;
3295 #ifdef REGISTER_PREFIX
3296 if (!flag_reg_prefix_optional)
3298 buf[0] = REGISTER_PREFIX;
3299 strcpy (buf + 1, regname);
3300 regname = buf;
3302 #endif
3304 symbol_table_insert (symbol_new (regname, reg_section, regnum,
3305 &zero_address_frag));
3307 for (i = 0; regname[i]; i++)
3308 buf[i] = TOUPPER (regname[i]);
3309 buf[i] = '\0';
3311 symbol_table_insert (symbol_new (buf, reg_section, regnum,
3312 &zero_address_frag));
3315 struct init_entry
3317 const char *name;
3318 int number;
3321 static const struct init_entry init_table[] =
3323 { "d0", DATA0 },
3324 { "d1", DATA1 },
3325 { "d2", DATA2 },
3326 { "d3", DATA3 },
3327 { "d4", DATA4 },
3328 { "d5", DATA5 },
3329 { "d6", DATA6 },
3330 { "d7", DATA7 },
3331 { "a0", ADDR0 },
3332 { "a1", ADDR1 },
3333 { "a2", ADDR2 },
3334 { "a3", ADDR3 },
3335 { "a4", ADDR4 },
3336 { "a5", ADDR5 },
3337 { "a6", ADDR6 },
3338 { "fp", ADDR6 },
3339 { "a7", ADDR7 },
3340 { "sp", ADDR7 },
3341 { "ssp", ADDR7 },
3342 { "fp0", FP0 },
3343 { "fp1", FP1 },
3344 { "fp2", FP2 },
3345 { "fp3", FP3 },
3346 { "fp4", FP4 },
3347 { "fp5", FP5 },
3348 { "fp6", FP6 },
3349 { "fp7", FP7 },
3350 { "fpi", FPI },
3351 { "fpiar", FPI },
3352 { "fpc", FPI },
3353 { "fps", FPS },
3354 { "fpsr", FPS },
3355 { "fpc", FPC },
3356 { "fpcr", FPC },
3357 { "control", FPC },
3358 { "status", FPS },
3359 { "iaddr", FPI },
3361 { "cop0", COP0 },
3362 { "cop1", COP1 },
3363 { "cop2", COP2 },
3364 { "cop3", COP3 },
3365 { "cop4", COP4 },
3366 { "cop5", COP5 },
3367 { "cop6", COP6 },
3368 { "cop7", COP7 },
3369 { "pc", PC },
3370 { "zpc", ZPC },
3371 { "sr", SR },
3373 { "ccr", CCR },
3374 { "cc", CCR },
3376 { "acc", ACC },
3377 { "macsr", MACSR },
3378 { "mask", MASK },
3380 /* control registers */
3381 { "sfc", SFC }, /* Source Function Code */
3382 { "sfcr", SFC },
3383 { "dfc", DFC }, /* Destination Function Code */
3384 { "dfcr", DFC },
3385 { "cacr", CACR }, /* Cache Control Register */
3386 { "caar", CAAR }, /* Cache Address Register */
3388 { "usp", USP }, /* User Stack Pointer */
3389 { "vbr", VBR }, /* Vector Base Register */
3390 { "msp", MSP }, /* Master Stack Pointer */
3391 { "isp", ISP }, /* Interrupt Stack Pointer */
3393 { "itt0", ITT0 }, /* Instruction Transparent Translation Reg 0 */
3394 { "itt1", ITT1 }, /* Instruction Transparent Translation Reg 1 */
3395 { "dtt0", DTT0 }, /* Data Transparent Translation Register 0 */
3396 { "dtt1", DTT1 }, /* Data Transparent Translation Register 1 */
3398 /* 68ec040 versions of same */
3399 { "iacr0", ITT0 }, /* Instruction Access Control Register 0 */
3400 { "iacr1", ITT1 }, /* Instruction Access Control Register 0 */
3401 { "dacr0", DTT0 }, /* Data Access Control Register 0 */
3402 { "dacr1", DTT1 }, /* Data Access Control Register 0 */
3404 /* mcf5200 versions of same. The ColdFire programmer's reference
3405 manual indicated that the order is 2,3,0,1, but Ken Rose
3406 <rose@netcom.com> says that 0,1,2,3 is the correct order. */
3407 { "acr0", ITT0 }, /* Access Control Unit 0 */
3408 { "acr1", ITT1 }, /* Access Control Unit 1 */
3409 { "acr2", DTT0 }, /* Access Control Unit 2 */
3410 { "acr3", DTT1 }, /* Access Control Unit 3 */
3412 { "tc", TC }, /* MMU Translation Control Register */
3413 { "tcr", TC },
3415 { "mmusr", MMUSR }, /* MMU Status Register */
3416 { "srp", SRP }, /* User Root Pointer */
3417 { "urp", URP }, /* Supervisor Root Pointer */
3419 { "buscr", BUSCR },
3420 { "pcr", PCR },
3422 { "rombar", ROMBAR }, /* ROM Base Address Register */
3423 { "rambar0", RAMBAR0 }, /* ROM Base Address Register */
3424 { "rambar1", RAMBAR1 }, /* ROM Base Address Register */
3425 { "mbar", MBAR }, /* Module Base Address Register */
3426 /* end of control registers */
3428 { "ac", AC },
3429 { "bc", BC },
3430 { "cal", CAL },
3431 { "crp", CRP },
3432 { "drp", DRP },
3433 { "pcsr", PCSR },
3434 { "psr", PSR },
3435 { "scc", SCC },
3436 { "val", VAL },
3437 { "bad0", BAD0 },
3438 { "bad1", BAD1 },
3439 { "bad2", BAD2 },
3440 { "bad3", BAD3 },
3441 { "bad4", BAD4 },
3442 { "bad5", BAD5 },
3443 { "bad6", BAD6 },
3444 { "bad7", BAD7 },
3445 { "bac0", BAC0 },
3446 { "bac1", BAC1 },
3447 { "bac2", BAC2 },
3448 { "bac3", BAC3 },
3449 { "bac4", BAC4 },
3450 { "bac5", BAC5 },
3451 { "bac6", BAC6 },
3452 { "bac7", BAC7 },
3454 { "ic", IC },
3455 { "dc", DC },
3456 { "nc", NC },
3458 { "tt0", TT0 },
3459 { "tt1", TT1 },
3460 /* 68ec030 versions of same */
3461 { "ac0", TT0 },
3462 { "ac1", TT1 },
3463 /* 68ec030 access control unit, identical to 030 MMU status reg */
3464 { "acusr", PSR },
3466 /* Suppressed data and address registers. */
3467 { "zd0", ZDATA0 },
3468 { "zd1", ZDATA1 },
3469 { "zd2", ZDATA2 },
3470 { "zd3", ZDATA3 },
3471 { "zd4", ZDATA4 },
3472 { "zd5", ZDATA5 },
3473 { "zd6", ZDATA6 },
3474 { "zd7", ZDATA7 },
3475 { "za0", ZADDR0 },
3476 { "za1", ZADDR1 },
3477 { "za2", ZADDR2 },
3478 { "za3", ZADDR3 },
3479 { "za4", ZADDR4 },
3480 { "za5", ZADDR5 },
3481 { "za6", ZADDR6 },
3482 { "za7", ZADDR7 },
3484 /* Upper and lower data and address registers, used by macw and msacw. */
3485 { "d0l", DATA0L },
3486 { "d1l", DATA1L },
3487 { "d2l", DATA2L },
3488 { "d3l", DATA3L },
3489 { "d4l", DATA4L },
3490 { "d5l", DATA5L },
3491 { "d6l", DATA6L },
3492 { "d7l", DATA7L },
3494 { "a0l", ADDR0L },
3495 { "a1l", ADDR1L },
3496 { "a2l", ADDR2L },
3497 { "a3l", ADDR3L },
3498 { "a4l", ADDR4L },
3499 { "a5l", ADDR5L },
3500 { "a6l", ADDR6L },
3501 { "a7l", ADDR7L },
3503 { "d0u", DATA0U },
3504 { "d1u", DATA1U },
3505 { "d2u", DATA2U },
3506 { "d3u", DATA3U },
3507 { "d4u", DATA4U },
3508 { "d5u", DATA5U },
3509 { "d6u", DATA6U },
3510 { "d7u", DATA7U },
3512 { "a0u", ADDR0U },
3513 { "a1u", ADDR1U },
3514 { "a2u", ADDR2U },
3515 { "a3u", ADDR3U },
3516 { "a4u", ADDR4U },
3517 { "a5u", ADDR5U },
3518 { "a6u", ADDR6U },
3519 { "a7u", ADDR7U },
3521 { 0, 0 }
3524 static void
3525 init_regtable ()
3527 int i;
3528 for (i = 0; init_table[i].name; i++)
3529 insert_reg (init_table[i].name, init_table[i].number);
3532 static int no_68851, no_68881;
3534 #ifdef OBJ_AOUT
3535 /* a.out machine type. Default to 68020. */
3536 int m68k_aout_machtype = 2;
3537 #endif
3539 void
3540 md_assemble (str)
3541 char *str;
3543 const char *er;
3544 short *fromP;
3545 char *toP = NULL;
3546 int m, n = 0;
3547 char *to_beg_P;
3548 int shorts_this_frag;
3549 fixS *fixP;
3551 /* In MRI mode, the instruction and operands are separated by a
3552 space. Anything following the operands is a comment. The label
3553 has already been removed. */
3554 if (flag_mri)
3556 char *s;
3557 int fields = 0;
3558 int infield = 0;
3559 int inquote = 0;
3561 for (s = str; *s != '\0'; s++)
3563 if ((*s == ' ' || *s == '\t') && ! inquote)
3565 if (infield)
3567 ++fields;
3568 if (fields >= 2)
3570 *s = '\0';
3571 break;
3573 infield = 0;
3576 else
3578 if (! infield)
3579 infield = 1;
3580 if (*s == '\'')
3581 inquote = ! inquote;
3586 memset ((char *) (&the_ins), '\0', sizeof (the_ins));
3587 m68k_ip (str);
3588 er = the_ins.error;
3589 if (!er)
3591 for (n = 0; n < the_ins.numargs; n++)
3592 if (the_ins.operands[n].error)
3594 er = the_ins.operands[n].error;
3595 break;
3598 if (er)
3600 as_bad (_("%s -- statement `%s' ignored"), er, str);
3601 return;
3604 /* If there is a current label, record that it marks an instruction. */
3605 if (current_label != NULL)
3607 current_label->text = 1;
3608 current_label = NULL;
3611 #ifdef OBJ_ELF
3612 /* Tie dwarf2 debug info to the address at the start of the insn. */
3613 dwarf2_emit_insn (0);
3614 #endif
3616 if (the_ins.nfrag == 0)
3618 /* No frag hacking involved; just put it out */
3619 toP = frag_more (2 * the_ins.numo);
3620 fromP = &the_ins.opcode[0];
3621 for (m = the_ins.numo; m; --m)
3623 md_number_to_chars (toP, (long) (*fromP), 2);
3624 toP += 2;
3625 fromP++;
3627 /* put out symbol-dependent info */
3628 for (m = 0; m < the_ins.nrel; m++)
3630 switch (the_ins.reloc[m].wid)
3632 case 'B':
3633 n = 1;
3634 break;
3635 case 'b':
3636 n = 1;
3637 break;
3638 case '3':
3639 n = 1;
3640 break;
3641 case 'w':
3642 case 'W':
3643 n = 2;
3644 break;
3645 case 'l':
3646 n = 4;
3647 break;
3648 default:
3649 as_fatal (_("Don't know how to figure width of %c in md_assemble()"),
3650 the_ins.reloc[m].wid);
3653 fixP = fix_new_exp (frag_now,
3654 ((toP - frag_now->fr_literal)
3655 - the_ins.numo * 2 + the_ins.reloc[m].n),
3657 &the_ins.reloc[m].exp,
3658 the_ins.reloc[m].pcrel,
3659 get_reloc_code (n, the_ins.reloc[m].pcrel,
3660 the_ins.reloc[m].pic_reloc));
3661 fixP->fx_pcrel_adjust = the_ins.reloc[m].pcrel_fix;
3662 if (the_ins.reloc[m].wid == 'B')
3663 fixP->fx_signed = 1;
3665 return;
3668 /* There's some frag hacking */
3670 /* Calculate the max frag size. */
3671 int wid;
3673 wid = 2 * the_ins.fragb[0].fragoff;
3674 for (n = 1; n < the_ins.nfrag; n++)
3675 wid += 2 * (the_ins.numo - the_ins.fragb[n - 1].fragoff);
3676 /* frag_var part. */
3677 wid += 10;
3678 /* Make sure the whole insn fits in one chunk, in particular that
3679 the var part is attached, as we access one byte before the
3680 variable frag for byte branches. */
3681 frag_grow (wid);
3684 for (n = 0, fromP = &the_ins.opcode[0]; n < the_ins.nfrag; n++)
3686 int wid;
3688 if (n == 0)
3689 wid = 2 * the_ins.fragb[n].fragoff;
3690 else
3691 wid = 2 * (the_ins.numo - the_ins.fragb[n - 1].fragoff);
3692 toP = frag_more (wid);
3693 to_beg_P = toP;
3694 shorts_this_frag = 0;
3695 for (m = wid / 2; m; --m)
3697 md_number_to_chars (toP, (long) (*fromP), 2);
3698 toP += 2;
3699 fromP++;
3700 shorts_this_frag++;
3702 for (m = 0; m < the_ins.nrel; m++)
3704 if ((the_ins.reloc[m].n) >= 2 * shorts_this_frag)
3706 the_ins.reloc[m].n -= 2 * shorts_this_frag;
3707 break;
3709 wid = the_ins.reloc[m].wid;
3710 if (wid == 0)
3711 continue;
3712 the_ins.reloc[m].wid = 0;
3713 wid = (wid == 'b') ? 1 : (wid == 'w') ? 2 : (wid == 'l') ? 4 : 4000;
3715 fixP = fix_new_exp (frag_now,
3716 ((toP - frag_now->fr_literal)
3717 - the_ins.numo * 2 + the_ins.reloc[m].n),
3718 wid,
3719 &the_ins.reloc[m].exp,
3720 the_ins.reloc[m].pcrel,
3721 get_reloc_code (wid, the_ins.reloc[m].pcrel,
3722 the_ins.reloc[m].pic_reloc));
3723 fixP->fx_pcrel_adjust = the_ins.reloc[m].pcrel_fix;
3725 (void) frag_var (rs_machine_dependent, 10, 0,
3726 (relax_substateT) (the_ins.fragb[n].fragty),
3727 the_ins.fragb[n].fadd, the_ins.fragb[n].foff, to_beg_P);
3729 n = (the_ins.numo - the_ins.fragb[n - 1].fragoff);
3730 shorts_this_frag = 0;
3731 if (n)
3733 toP = frag_more (n * sizeof (short));
3734 while (n--)
3736 md_number_to_chars (toP, (long) (*fromP), 2);
3737 toP += 2;
3738 fromP++;
3739 shorts_this_frag++;
3742 for (m = 0; m < the_ins.nrel; m++)
3744 int wid;
3746 wid = the_ins.reloc[m].wid;
3747 if (wid == 0)
3748 continue;
3749 the_ins.reloc[m].wid = 0;
3750 wid = (wid == 'b') ? 1 : (wid == 'w') ? 2 : (wid == 'l') ? 4 : 4000;
3752 fixP = fix_new_exp (frag_now,
3753 ((the_ins.reloc[m].n + toP - frag_now->fr_literal)
3754 - shorts_this_frag * 2),
3755 wid,
3756 &the_ins.reloc[m].exp,
3757 the_ins.reloc[m].pcrel,
3758 get_reloc_code (wid, the_ins.reloc[m].pcrel,
3759 the_ins.reloc[m].pic_reloc));
3760 fixP->fx_pcrel_adjust = the_ins.reloc[m].pcrel_fix;
3764 void
3765 md_begin ()
3768 * md_begin -- set up hash tables with 68000 instructions.
3769 * similar to what the vax assembler does. ---phr
3771 /* RMS claims the thing to do is take the m68k-opcode.h table, and make
3772 a copy of it at runtime, adding in the information we want but isn't
3773 there. I think it'd be better to have an awk script hack the table
3774 at compile time. Or even just xstr the table and use it as-is. But
3775 my lord ghod hath spoken, so we do it this way. Excuse the ugly var
3776 names. */
3778 const struct m68k_opcode *ins;
3779 struct m68k_incant *hack, *slak;
3780 const char *retval = 0; /* empty string, or error msg text */
3781 int i;
3783 if (flag_mri)
3785 flag_reg_prefix_optional = 1;
3786 m68k_abspcadd = 1;
3787 if (! m68k_rel32_from_cmdline)
3788 m68k_rel32 = 0;
3791 op_hash = hash_new ();
3793 obstack_begin (&robyn, 4000);
3794 for (i = 0; i < m68k_numopcodes; i++)
3796 hack = slak = (struct m68k_incant *) obstack_alloc (&robyn, sizeof (struct m68k_incant));
3799 ins = &m68k_opcodes[i];
3800 /* We *could* ignore insns that don't match our arch here
3801 but just leaving them out of the hash. */
3802 slak->m_operands = ins->args;
3803 slak->m_opnum = strlen (slak->m_operands) / 2;
3804 slak->m_arch = ins->arch;
3805 slak->m_opcode = ins->opcode;
3806 /* This is kludgey */
3807 slak->m_codenum = ((ins->match) & 0xffffL) ? 2 : 1;
3808 if (i + 1 != m68k_numopcodes
3809 && !strcmp (ins->name, m68k_opcodes[i + 1].name))
3811 slak->m_next = (struct m68k_incant *) obstack_alloc (&robyn, sizeof (struct m68k_incant));
3812 i++;
3814 else
3815 slak->m_next = 0;
3816 slak = slak->m_next;
3818 while (slak);
3820 retval = hash_insert (op_hash, ins->name, (char *) hack);
3821 if (retval)
3822 as_fatal (_("Internal Error: Can't hash %s: %s"), ins->name, retval);
3825 for (i = 0; i < m68k_numaliases; i++)
3827 const char *name = m68k_opcode_aliases[i].primary;
3828 const char *alias = m68k_opcode_aliases[i].alias;
3829 PTR val = hash_find (op_hash, name);
3830 if (!val)
3831 as_fatal (_("Internal Error: Can't find %s in hash table"), name);
3832 retval = hash_insert (op_hash, alias, val);
3833 if (retval)
3834 as_fatal (_("Internal Error: Can't hash %s: %s"), alias, retval);
3837 /* In MRI mode, all unsized branches are variable sized. Normally,
3838 they are word sized. */
3839 if (flag_mri)
3841 static struct m68k_opcode_alias mri_aliases[] =
3843 { "bhi", "jhi", },
3844 { "bls", "jls", },
3845 { "bcc", "jcc", },
3846 { "bcs", "jcs", },
3847 { "bne", "jne", },
3848 { "beq", "jeq", },
3849 { "bvc", "jvc", },
3850 { "bvs", "jvs", },
3851 { "bpl", "jpl", },
3852 { "bmi", "jmi", },
3853 { "bge", "jge", },
3854 { "blt", "jlt", },
3855 { "bgt", "jgt", },
3856 { "ble", "jle", },
3857 { "bra", "jra", },
3858 { "bsr", "jbsr", },
3861 for (i = 0;
3862 i < (int) (sizeof mri_aliases / sizeof mri_aliases[0]);
3863 i++)
3865 const char *name = mri_aliases[i].primary;
3866 const char *alias = mri_aliases[i].alias;
3867 PTR val = hash_find (op_hash, name);
3868 if (!val)
3869 as_fatal (_("Internal Error: Can't find %s in hash table"), name);
3870 retval = hash_jam (op_hash, alias, val);
3871 if (retval)
3872 as_fatal (_("Internal Error: Can't hash %s: %s"), alias, retval);
3876 for (i = 0; i < (int) sizeof (notend_table); i++)
3878 notend_table[i] = 0;
3879 alt_notend_table[i] = 0;
3881 notend_table[','] = 1;
3882 notend_table['{'] = 1;
3883 notend_table['}'] = 1;
3884 alt_notend_table['a'] = 1;
3885 alt_notend_table['A'] = 1;
3886 alt_notend_table['d'] = 1;
3887 alt_notend_table['D'] = 1;
3888 alt_notend_table['#'] = 1;
3889 alt_notend_table['&'] = 1;
3890 alt_notend_table['f'] = 1;
3891 alt_notend_table['F'] = 1;
3892 #ifdef REGISTER_PREFIX
3893 alt_notend_table[REGISTER_PREFIX] = 1;
3894 #endif
3896 /* We need to put '(' in alt_notend_table to handle
3897 cas2 %d0:%d2,%d3:%d4,(%a0):(%a1)
3899 alt_notend_table['('] = 1;
3901 /* We need to put '@' in alt_notend_table to handle
3902 cas2 %d0:%d2,%d3:%d4,@(%d0):@(%d1)
3904 alt_notend_table['@'] = 1;
3906 /* We need to put digits in alt_notend_table to handle
3907 bfextu %d0{24:1},%d0
3909 alt_notend_table['0'] = 1;
3910 alt_notend_table['1'] = 1;
3911 alt_notend_table['2'] = 1;
3912 alt_notend_table['3'] = 1;
3913 alt_notend_table['4'] = 1;
3914 alt_notend_table['5'] = 1;
3915 alt_notend_table['6'] = 1;
3916 alt_notend_table['7'] = 1;
3917 alt_notend_table['8'] = 1;
3918 alt_notend_table['9'] = 1;
3920 #ifndef MIT_SYNTAX_ONLY
3921 /* Insert pseudo ops, these have to go into the opcode table since
3922 gas expects pseudo ops to start with a dot */
3924 int n = 0;
3925 while (mote_pseudo_table[n].poc_name)
3927 hack = (struct m68k_incant *)
3928 obstack_alloc (&robyn, sizeof (struct m68k_incant));
3929 hash_insert (op_hash,
3930 mote_pseudo_table[n].poc_name, (char *) hack);
3931 hack->m_operands = 0;
3932 hack->m_opnum = n;
3933 n++;
3936 #endif
3938 init_regtable ();
3940 #ifdef OBJ_ELF
3941 record_alignment (text_section, 2);
3942 record_alignment (data_section, 2);
3943 record_alignment (bss_section, 2);
3944 #endif
3947 static void
3948 select_control_regs ()
3950 /* Note which set of "movec" control registers is available. */
3951 switch (cpu_of_arch (current_architecture))
3953 case 0:
3954 as_warn (_("architecture not yet selected: defaulting to 68020"));
3955 control_regs = m68020_control_regs;
3956 break;
3958 case m68000:
3959 control_regs = m68000_control_regs;
3960 break;
3961 case m68010:
3962 control_regs = m68010_control_regs;
3963 break;
3964 case m68020:
3965 case m68030:
3966 control_regs = m68020_control_regs;
3967 break;
3968 case m68040:
3969 control_regs = m68040_control_regs;
3970 break;
3971 case m68060:
3972 control_regs = m68060_control_regs;
3973 break;
3974 case cpu32:
3975 control_regs = cpu32_control_regs;
3976 break;
3977 case mcf5200:
3978 case mcf5206e:
3979 case mcf5307:
3980 case mcf5407:
3981 control_regs = mcf_control_regs;
3982 break;
3983 default:
3984 abort ();
3988 void
3989 m68k_init_after_args ()
3991 if (cpu_of_arch (current_architecture) == 0)
3993 int i;
3994 const char *default_cpu = TARGET_CPU;
3996 if (*default_cpu == 'm')
3997 default_cpu++;
3998 for (i = 0; i < n_archs; i++)
3999 if (strcasecmp (default_cpu, archs[i].name) == 0)
4000 break;
4001 if (i == n_archs)
4003 as_bad (_("unrecognized default cpu `%s' ???"), TARGET_CPU);
4004 current_architecture |= m68020;
4006 else
4007 current_architecture |= archs[i].arch;
4009 /* Permit m68881 specification with all cpus; those that can't work
4010 with a coprocessor could be doing emulation. */
4011 if (current_architecture & m68851)
4013 if (current_architecture & m68040)
4015 as_warn (_("68040 and 68851 specified; mmu instructions may assemble incorrectly"));
4018 /* What other incompatibilities could we check for? */
4020 /* Toss in some default assumptions about coprocessors. */
4021 if (!no_68881
4022 && (cpu_of_arch (current_architecture)
4023 /* Can CPU32 have a 68881 coprocessor?? */
4024 & (m68020 | m68030 | cpu32)))
4026 current_architecture |= m68881;
4028 if (!no_68851
4029 && (cpu_of_arch (current_architecture) & m68020up) != 0
4030 && (cpu_of_arch (current_architecture) & m68040up) == 0)
4032 current_architecture |= m68851;
4034 if (no_68881 && (current_architecture & m68881))
4035 as_bad (_("options for 68881 and no-68881 both given"));
4036 if (no_68851 && (current_architecture & m68851))
4037 as_bad (_("options for 68851 and no-68851 both given"));
4039 #ifdef OBJ_AOUT
4040 /* Work out the magic number. This isn't very general. */
4041 if (current_architecture & m68000)
4042 m68k_aout_machtype = 0;
4043 else if (current_architecture & m68010)
4044 m68k_aout_machtype = 1;
4045 else if (current_architecture & m68020)
4046 m68k_aout_machtype = 2;
4047 else
4048 m68k_aout_machtype = 2;
4049 #endif
4051 /* Note which set of "movec" control registers is available. */
4052 select_control_regs ();
4054 if (cpu_of_arch (current_architecture) < m68020
4055 || arch_coldfire_p (current_architecture))
4056 md_relax_table[TAB (PCINDEX, BYTE)].rlx_more = 0;
4059 /* This is called when a label is defined. */
4061 void
4062 m68k_frob_label (sym)
4063 symbolS *sym;
4065 struct label_line *n;
4067 n = (struct label_line *) xmalloc (sizeof *n);
4068 n->next = labels;
4069 n->label = sym;
4070 as_where (&n->file, &n->line);
4071 n->text = 0;
4072 labels = n;
4073 current_label = n;
4076 /* This is called when a value that is not an instruction is emitted. */
4078 void
4079 m68k_flush_pending_output ()
4081 current_label = NULL;
4084 /* This is called at the end of the assembly, when the final value of
4085 the label is known. We warn if this is a text symbol aligned at an
4086 odd location. */
4088 void
4089 m68k_frob_symbol (sym)
4090 symbolS *sym;
4092 if (S_GET_SEGMENT (sym) == reg_section
4093 && (int) S_GET_VALUE (sym) < 0)
4095 S_SET_SEGMENT (sym, absolute_section);
4096 S_SET_VALUE (sym, ~(int)S_GET_VALUE (sym));
4098 else if ((S_GET_VALUE (sym) & 1) != 0)
4100 struct label_line *l;
4102 for (l = labels; l != NULL; l = l->next)
4104 if (l->label == sym)
4106 if (l->text)
4107 as_warn_where (l->file, l->line,
4108 _("text label `%s' aligned to odd boundary"),
4109 S_GET_NAME (sym));
4110 break;
4116 /* This is called if we go in or out of MRI mode because of the .mri
4117 pseudo-op. */
4119 void
4120 m68k_mri_mode_change (on)
4121 int on;
4123 if (on)
4125 if (! flag_reg_prefix_optional)
4127 flag_reg_prefix_optional = 1;
4128 #ifdef REGISTER_PREFIX
4129 init_regtable ();
4130 #endif
4132 m68k_abspcadd = 1;
4133 if (! m68k_rel32_from_cmdline)
4134 m68k_rel32 = 0;
4136 else
4138 if (! reg_prefix_optional_seen)
4140 #ifdef REGISTER_PREFIX_OPTIONAL
4141 flag_reg_prefix_optional = REGISTER_PREFIX_OPTIONAL;
4142 #else
4143 flag_reg_prefix_optional = 0;
4144 #endif
4145 #ifdef REGISTER_PREFIX
4146 init_regtable ();
4147 #endif
4149 m68k_abspcadd = 0;
4150 if (! m68k_rel32_from_cmdline)
4151 m68k_rel32 = 1;
4155 /* Equal to MAX_PRECISION in atof-ieee.c */
4156 #define MAX_LITTLENUMS 6
4158 /* Turn a string in input_line_pointer into a floating point constant
4159 of type TYPE, and store the appropriate bytes in *LITP. The number
4160 of LITTLENUMS emitted is stored in *SIZEP. An error message is
4161 returned, or NULL on OK. */
4163 char *
4164 md_atof (type, litP, sizeP)
4165 char type;
4166 char *litP;
4167 int *sizeP;
4169 int prec;
4170 LITTLENUM_TYPE words[MAX_LITTLENUMS];
4171 LITTLENUM_TYPE *wordP;
4172 char *t;
4174 switch (type)
4176 case 'f':
4177 case 'F':
4178 case 's':
4179 case 'S':
4180 prec = 2;
4181 break;
4183 case 'd':
4184 case 'D':
4185 case 'r':
4186 case 'R':
4187 prec = 4;
4188 break;
4190 case 'x':
4191 case 'X':
4192 prec = 6;
4193 break;
4195 case 'p':
4196 case 'P':
4197 prec = 6;
4198 break;
4200 default:
4201 *sizeP = 0;
4202 return _("Bad call to MD_ATOF()");
4204 t = atof_ieee (input_line_pointer, type, words);
4205 if (t)
4206 input_line_pointer = t;
4208 *sizeP = prec * sizeof (LITTLENUM_TYPE);
4209 for (wordP = words; prec--;)
4211 md_number_to_chars (litP, (long) (*wordP++), sizeof (LITTLENUM_TYPE));
4212 litP += sizeof (LITTLENUM_TYPE);
4214 return 0;
4217 void
4218 md_number_to_chars (buf, val, n)
4219 char *buf;
4220 valueT val;
4221 int n;
4223 number_to_chars_bigendian (buf, val, n);
4226 void
4227 md_apply_fix3 (fixP, valP, seg)
4228 fixS *fixP;
4229 valueT *valP;
4230 segT seg ATTRIBUTE_UNUSED;
4232 offsetT val = *valP;
4233 addressT upper_limit;
4234 offsetT lower_limit;
4236 /* This is unnecessary but it convinces the native rs6000 compiler
4237 to generate the code we want. */
4238 char *buf = fixP->fx_frag->fr_literal;
4239 buf += fixP->fx_where;
4240 /* end ibm compiler workaround */
4242 val = ((val & 0xffffffff) ^ 0x80000000) - 0x80000000;
4244 if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
4245 fixP->fx_done = 1;
4247 #ifdef OBJ_ELF
4248 if (fixP->fx_addsy)
4250 memset (buf, 0, fixP->fx_size);
4251 fixP->fx_addnumber = val; /* Remember value for emit_reloc */
4253 if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
4254 && !S_IS_DEFINED (fixP->fx_addsy)
4255 && !S_IS_WEAK (fixP->fx_addsy))
4256 S_SET_WEAK (fixP->fx_addsy);
4257 return;
4259 #endif
4261 #ifdef BFD_ASSEMBLER
4262 if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
4263 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
4264 return;
4265 #endif
4267 switch (fixP->fx_size)
4269 /* The cast to offsetT below are necessary to make code
4270 correct for machines where ints are smaller than offsetT. */
4271 case 1:
4272 *buf++ = val;
4273 upper_limit = 0x7f;
4274 lower_limit = - (offsetT) 0x80;
4275 break;
4276 case 2:
4277 *buf++ = (val >> 8);
4278 *buf++ = val;
4279 upper_limit = 0x7fff;
4280 lower_limit = - (offsetT) 0x8000;
4281 break;
4282 case 4:
4283 *buf++ = (val >> 24);
4284 *buf++ = (val >> 16);
4285 *buf++ = (val >> 8);
4286 *buf++ = val;
4287 upper_limit = 0x7fffffff;
4288 lower_limit = - (offsetT) 0x7fffffff - 1; /* avoid constant overflow */
4289 break;
4290 default:
4291 BAD_CASE (fixP->fx_size);
4294 /* Fix up a negative reloc. */
4295 if (fixP->fx_addsy == NULL && fixP->fx_subsy != NULL)
4297 fixP->fx_addsy = fixP->fx_subsy;
4298 fixP->fx_subsy = NULL;
4299 fixP->fx_tcbit = 1;
4302 /* For non-pc-relative values, it's conceivable we might get something
4303 like "0xff" for a byte field. So extend the upper part of the range
4304 to accept such numbers. We arbitrarily disallow "-0xff" or "0xff+0xff",
4305 so that we can do any range checking at all. */
4306 if (! fixP->fx_pcrel && ! fixP->fx_signed)
4307 upper_limit = upper_limit * 2 + 1;
4309 if ((addressT) val > upper_limit
4310 && (val > 0 || val < lower_limit))
4311 as_bad_where (fixP->fx_file, fixP->fx_line, _("value out of range"));
4313 /* A one byte PC-relative reloc means a short branch. We can't use
4314 a short branch with a value of 0 or -1, because those indicate
4315 different opcodes (branches with longer offsets). fixup_segment
4316 in write.c may have clobbered fx_pcrel, so we need to examine the
4317 reloc type. */
4318 if ((fixP->fx_pcrel
4319 #ifdef BFD_ASSEMBLER
4320 || fixP->fx_r_type == BFD_RELOC_8_PCREL
4321 #endif
4323 && fixP->fx_size == 1
4324 && (fixP->fx_addsy == NULL
4325 || S_IS_DEFINED (fixP->fx_addsy))
4326 && (val == 0 || val == -1))
4327 as_bad_where (fixP->fx_file, fixP->fx_line, _("invalid byte branch offset"));
4330 /* *fragP has been relaxed to its final size, and now needs to have
4331 the bytes inside it modified to conform to the new size There is UGLY
4332 MAGIC here. ..
4334 static void
4335 md_convert_frag_1 (fragP)
4336 register fragS *fragP;
4338 long disp;
4339 fixS *fixP;
4341 /* Address in object code of the displacement. */
4342 register int object_address = fragP->fr_fix + fragP->fr_address;
4344 /* Address in gas core of the place to store the displacement. */
4345 /* This convinces the native rs6000 compiler to generate the code we
4346 want. */
4347 register char *buffer_address = fragP->fr_literal;
4348 buffer_address += fragP->fr_fix;
4349 /* end ibm compiler workaround */
4351 /* The displacement of the address, from current location. */
4352 disp = fragP->fr_symbol ? S_GET_VALUE (fragP->fr_symbol) : 0;
4353 disp = (disp + fragP->fr_offset) - object_address;
4355 switch (fragP->fr_subtype)
4357 case TAB (BRANCHBWL, BYTE):
4358 case TAB (BRABSJUNC, BYTE):
4359 case TAB (BRABSJCOND, BYTE):
4360 case TAB (BRANCHBW, BYTE):
4361 know (issbyte (disp));
4362 if (disp == 0)
4363 as_bad_where (fragP->fr_file, fragP->fr_line,
4364 _("short branch with zero offset: use :w"));
4365 fixP = fix_new (fragP, fragP->fr_fix - 1, 1, fragP->fr_symbol,
4366 fragP->fr_offset, 1, RELAX_RELOC_PC8);
4367 fixP->fx_pcrel_adjust = -1;
4368 break;
4369 case TAB (BRANCHBWL, SHORT):
4370 case TAB (BRABSJUNC, SHORT):
4371 case TAB (BRABSJCOND, SHORT):
4372 case TAB (BRANCHBW, SHORT):
4373 fragP->fr_opcode[1] = 0x00;
4374 fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol, fragP->fr_offset,
4375 1, RELAX_RELOC_PC16);
4376 fragP->fr_fix += 2;
4377 break;
4378 case TAB (BRANCHBWL, LONG):
4379 fragP->fr_opcode[1] = (char) 0xFF;
4380 fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol, fragP->fr_offset,
4381 1, RELAX_RELOC_PC32);
4382 fragP->fr_fix += 4;
4383 break;
4384 case TAB (BRABSJUNC, LONG):
4385 if (fragP->fr_opcode[0] == 0x61) /* jbsr */
4387 fragP->fr_opcode[0] = 0x4E;
4388 fragP->fr_opcode[1] = (char) 0xB9; /* JSR with ABSL LONG operand */
4389 fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol, fragP->fr_offset,
4390 0, RELAX_RELOC_ABS32);
4391 fragP->fr_fix += 4;
4393 else if (fragP->fr_opcode[0] == 0x60) /* jbra */
4395 fragP->fr_opcode[0] = 0x4E;
4396 fragP->fr_opcode[1] = (char) 0xF9; /* JMP with ABSL LONG operand */
4397 fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol, fragP->fr_offset,
4398 0, RELAX_RELOC_ABS32);
4399 fragP->fr_fix += 4;
4401 else
4403 /* This cannot happen, because jbsr and jbra are the only two
4404 unconditional branches. */
4405 abort ();
4407 break;
4408 case TAB (BRABSJCOND, LONG):
4409 /* Only Bcc 68000 instructions can come here. */
4410 /* Change bcc into b!cc/jmp absl long. */
4412 fragP->fr_opcode[0] ^= 0x01; /* invert bcc */
4413 fragP->fr_opcode[1] = 0x6;/* branch offset = 6 */
4415 /* JF: these used to be fr_opcode[2,3], but they may be in a
4416 different frag, in which case refering to them is a no-no.
4417 Only fr_opcode[0,1] are guaranteed to work. */
4418 *buffer_address++ = 0x4e; /* put in jmp long (0x4ef9) */
4419 *buffer_address++ = (char) 0xf9;
4420 fragP->fr_fix += 2; /* account for jmp instruction */
4421 fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
4422 fragP->fr_offset, 0, RELAX_RELOC_ABS32);
4423 fragP->fr_fix += 4;
4424 break;
4425 case TAB (FBRANCH, SHORT):
4426 know ((fragP->fr_opcode[1] & 0x40) == 0);
4427 fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol, fragP->fr_offset,
4428 1, RELAX_RELOC_PC16);
4429 fragP->fr_fix += 2;
4430 break;
4431 case TAB (FBRANCH, LONG):
4432 fragP->fr_opcode[1] |= 0x40; /* Turn on LONG bit */
4433 fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol, fragP->fr_offset,
4434 1, RELAX_RELOC_PC32);
4435 fragP->fr_fix += 4;
4436 break;
4437 case TAB (DBCCLBR, SHORT):
4438 case TAB (DBCCABSJ, SHORT):
4439 fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol, fragP->fr_offset,
4440 1, RELAX_RELOC_PC16);
4441 fragP->fr_fix += 2;
4442 break;
4443 case TAB (DBCCLBR, LONG):
4444 /* only DBcc instructions can come here */
4445 /* Change dbcc into dbcc/bral. */
4447 /* JF: these used to be fr_opcode[2-7], but that's wrong */
4448 *buffer_address++ = 0x00; /* branch offset = 4 */
4449 *buffer_address++ = 0x04;
4450 *buffer_address++ = 0x60; /* put in bra pc+6 */
4451 *buffer_address++ = 0x06;
4452 *buffer_address++ = 0x60; /* Put in bral (0x60ff). */
4453 *buffer_address++ = (char) 0xff;
4455 fragP->fr_fix += 6; /* account for bra/jmp instructions */
4456 fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol, fragP->fr_offset, 1,
4457 RELAX_RELOC_PC32);
4458 fragP->fr_fix += 4;
4459 break;
4460 case TAB (DBCCABSJ, LONG):
4461 /* only DBcc instructions can come here */
4462 /* Change dbcc into dbcc/jmp. */
4464 /* JF: these used to be fr_opcode[2-7], but that's wrong */
4465 *buffer_address++ = 0x00; /* branch offset = 4 */
4466 *buffer_address++ = 0x04;
4467 *buffer_address++ = 0x60; /* put in bra pc+6 */
4468 *buffer_address++ = 0x06;
4469 *buffer_address++ = 0x4e; /* Put in jmp long (0x4ef9). */
4470 *buffer_address++ = (char) 0xf9;
4472 fragP->fr_fix += 6; /* account for bra/jmp instructions */
4473 fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol, fragP->fr_offset, 0,
4474 RELAX_RELOC_ABS32);
4475 fragP->fr_fix += 4;
4476 break;
4477 case TAB (PCREL1632, SHORT):
4478 fragP->fr_opcode[1] &= ~0x3F;
4479 fragP->fr_opcode[1] |= 0x3A; /* 072 - mode 7.2 */
4480 fix_new (fragP, (int) (fragP->fr_fix), 2, fragP->fr_symbol,
4481 fragP->fr_offset, 1, RELAX_RELOC_PC16);
4482 fragP->fr_fix += 2;
4483 break;
4484 case TAB (PCREL1632, LONG):
4485 /* Already set to mode 7.3; this indicates: PC indirect with
4486 suppressed index, 32-bit displacement. */
4487 *buffer_address++ = 0x01;
4488 *buffer_address++ = 0x70;
4489 fragP->fr_fix += 2;
4490 fixP = fix_new (fragP, (int) (fragP->fr_fix), 4, fragP->fr_symbol,
4491 fragP->fr_offset, 1, RELAX_RELOC_PC32);
4492 fixP->fx_pcrel_adjust = 2;
4493 fragP->fr_fix += 4;
4494 break;
4495 case TAB (PCINDEX, BYTE):
4496 assert (fragP->fr_fix >= 2);
4497 buffer_address[-2] &= ~1;
4498 fixP = fix_new (fragP, fragP->fr_fix - 1, 1, fragP->fr_symbol,
4499 fragP->fr_offset, 1, RELAX_RELOC_PC8);
4500 fixP->fx_pcrel_adjust = 1;
4501 break;
4502 case TAB (PCINDEX, SHORT):
4503 assert (fragP->fr_fix >= 2);
4504 buffer_address[-2] |= 0x1;
4505 buffer_address[-1] = 0x20;
4506 fixP = fix_new (fragP, (int) (fragP->fr_fix), 2, fragP->fr_symbol,
4507 fragP->fr_offset, 1, RELAX_RELOC_PC16);
4508 fixP->fx_pcrel_adjust = 2;
4509 fragP->fr_fix += 2;
4510 break;
4511 case TAB (PCINDEX, LONG):
4512 assert (fragP->fr_fix >= 2);
4513 buffer_address[-2] |= 0x1;
4514 buffer_address[-1] = 0x30;
4515 fixP = fix_new (fragP, (int) (fragP->fr_fix), 4, fragP->fr_symbol,
4516 fragP->fr_offset, 1, RELAX_RELOC_PC32);
4517 fixP->fx_pcrel_adjust = 2;
4518 fragP->fr_fix += 4;
4519 break;
4520 case TAB (ABSTOPCREL, SHORT):
4521 fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol, fragP->fr_offset,
4522 1, RELAX_RELOC_PC16);
4523 fragP->fr_fix += 2;
4524 break;
4525 case TAB (ABSTOPCREL, LONG):
4526 /* The thing to do here is force it to ABSOLUTE LONG, since
4527 ABSTOPCREL is really trying to shorten an ABSOLUTE address anyway */
4528 if ((fragP->fr_opcode[1] & 0x3F) != 0x3A)
4529 abort ();
4530 fragP->fr_opcode[1] &= ~0x3F;
4531 fragP->fr_opcode[1] |= 0x39; /* Mode 7.1 */
4532 fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol, fragP->fr_offset,
4533 0, RELAX_RELOC_ABS32);
4534 fragP->fr_fix += 4;
4535 break;
4539 #ifndef BFD_ASSEMBLER
4541 void
4542 md_convert_frag (headers, sec, fragP)
4543 object_headers *headers ATTRIBUTE_UNUSED;
4544 segT sec ATTRIBUTE_UNUSED;
4545 fragS *fragP;
4547 md_convert_frag_1 (fragP);
4550 #else
4552 void
4553 md_convert_frag (abfd, sec, fragP)
4554 bfd *abfd ATTRIBUTE_UNUSED;
4555 segT sec ATTRIBUTE_UNUSED;
4556 fragS *fragP;
4558 md_convert_frag_1 (fragP);
4560 #endif
4562 /* Force truly undefined symbols to their maximum size, and generally set up
4563 the frag list to be relaxed
4566 md_estimate_size_before_relax (fragP, segment)
4567 register fragS *fragP;
4568 segT segment;
4570 /* Handle SZ_UNDEF first, it can be changed to BYTE or SHORT. */
4571 switch (fragP->fr_subtype)
4573 case TAB (BRANCHBWL, SZ_UNDEF):
4574 case TAB (BRABSJUNC, SZ_UNDEF):
4575 case TAB (BRABSJCOND, SZ_UNDEF):
4577 if (S_GET_SEGMENT (fragP->fr_symbol) == segment
4578 && relaxable_symbol (fragP->fr_symbol))
4580 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), BYTE);
4582 else if (flag_short_refs)
4584 /* Symbol is undefined and we want short ref. */
4585 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT);
4587 else
4589 /* Symbol is still undefined. Make it LONG. */
4590 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), LONG);
4592 break;
4595 case TAB (BRANCHBW, SZ_UNDEF):
4597 if (S_GET_SEGMENT (fragP->fr_symbol) == segment
4598 && relaxable_symbol (fragP->fr_symbol))
4600 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), BYTE);
4602 else
4604 /* Symbol is undefined and we don't have long branches. */
4605 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT);
4607 break;
4610 case TAB (FBRANCH, SZ_UNDEF):
4611 case TAB (DBCCLBR, SZ_UNDEF):
4612 case TAB (DBCCABSJ, SZ_UNDEF):
4613 case TAB (PCREL1632, SZ_UNDEF):
4615 if ((S_GET_SEGMENT (fragP->fr_symbol) == segment
4616 && relaxable_symbol (fragP->fr_symbol))
4617 || flag_short_refs)
4619 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT);
4621 else
4623 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), LONG);
4625 break;
4628 case TAB (PCINDEX, SZ_UNDEF):
4629 if ((S_GET_SEGMENT (fragP->fr_symbol) == segment
4630 && relaxable_symbol (fragP->fr_symbol)))
4632 fragP->fr_subtype = TAB (PCINDEX, BYTE);
4634 else
4636 fragP->fr_subtype = TAB (PCINDEX, LONG);
4638 break;
4640 case TAB (ABSTOPCREL, SZ_UNDEF):
4642 if ((S_GET_SEGMENT (fragP->fr_symbol) == segment
4643 && relaxable_symbol (fragP->fr_symbol)))
4645 fragP->fr_subtype = TAB (ABSTOPCREL, SHORT);
4647 else
4649 fragP->fr_subtype = TAB (ABSTOPCREL, LONG);
4651 break;
4654 default:
4655 break;
4658 /* Now that SZ_UNDEF are taken care of, check others. */
4659 switch (fragP->fr_subtype)
4661 case TAB (BRANCHBWL, BYTE):
4662 case TAB (BRABSJUNC, BYTE):
4663 case TAB (BRABSJCOND, BYTE):
4664 case TAB (BRANCHBW, BYTE):
4665 /* We can't do a short jump to the next instruction, so in that
4666 case we force word mode. If the symbol is at the start of a
4667 frag, and it is the next frag with any data in it (usually
4668 this is just the next frag, but assembler listings may
4669 introduce empty frags), we must use word mode. */
4670 if (fragP->fr_symbol)
4672 fragS *sym_frag;
4674 sym_frag = symbol_get_frag (fragP->fr_symbol);
4675 if (S_GET_VALUE (fragP->fr_symbol) == sym_frag->fr_address)
4677 fragS *l;
4679 for (l = fragP->fr_next; l && l != sym_frag; l = l->fr_next)
4680 if (l->fr_fix != 0)
4681 break;
4682 if (l == sym_frag)
4683 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT);
4686 break;
4687 default:
4688 break;
4690 return md_relax_table[fragP->fr_subtype].rlx_length;
4693 #if defined(OBJ_AOUT) | defined(OBJ_BOUT)
4694 /* the bit-field entries in the relocation_info struct plays hell
4695 with the byte-order problems of cross-assembly. So as a hack,
4696 I added this mach. dependent ri twiddler. Ugly, but it gets
4697 you there. -KWK */
4698 /* on m68k: first 4 bytes are normal unsigned long, next three bytes
4699 are symbolnum, most sig. byte first. Last byte is broken up with
4700 bit 7 as pcrel, bits 6 & 5 as length, bit 4 as pcrel, and the lower
4701 nibble as nuthin. (on Sun 3 at least) */
4702 /* Translate the internal relocation information into target-specific
4703 format. */
4704 #ifdef comment
4705 void
4706 md_ri_to_chars (the_bytes, ri)
4707 char *the_bytes;
4708 struct reloc_info_generic *ri;
4710 /* this is easy */
4711 md_number_to_chars (the_bytes, ri->r_address, 4);
4712 /* now the fun stuff */
4713 the_bytes[4] = (ri->r_symbolnum >> 16) & 0x0ff;
4714 the_bytes[5] = (ri->r_symbolnum >> 8) & 0x0ff;
4715 the_bytes[6] = ri->r_symbolnum & 0x0ff;
4716 the_bytes[7] = (((ri->r_pcrel << 7) & 0x80) | ((ri->r_length << 5) & 0x60) |
4717 ((ri->r_extern << 4) & 0x10));
4720 #endif /* comment */
4722 #ifndef BFD_ASSEMBLER
4723 void
4724 tc_aout_fix_to_chars (where, fixP, segment_address_in_file)
4725 char *where;
4726 fixS *fixP;
4727 relax_addressT segment_address_in_file;
4730 * In: length of relocation (or of address) in chars: 1, 2 or 4.
4731 * Out: GNU LD relocation length code: 0, 1, or 2.
4734 static const unsigned char nbytes_r_length[] = {42, 0, 1, 42, 2};
4735 long r_symbolnum;
4737 know (fixP->fx_addsy != NULL);
4739 md_number_to_chars (where,
4740 fixP->fx_frag->fr_address + fixP->fx_where - segment_address_in_file,
4743 r_symbolnum = (S_IS_DEFINED (fixP->fx_addsy)
4744 ? S_GET_TYPE (fixP->fx_addsy)
4745 : fixP->fx_addsy->sy_number);
4747 where[4] = (r_symbolnum >> 16) & 0x0ff;
4748 where[5] = (r_symbolnum >> 8) & 0x0ff;
4749 where[6] = r_symbolnum & 0x0ff;
4750 where[7] = (((fixP->fx_pcrel << 7) & 0x80) | ((nbytes_r_length[fixP->fx_size] << 5) & 0x60) |
4751 (((!S_IS_DEFINED (fixP->fx_addsy)) << 4) & 0x10));
4753 #endif
4755 #endif /* OBJ_AOUT or OBJ_BOUT */
4757 #ifndef WORKING_DOT_WORD
4758 const int md_short_jump_size = 4;
4759 const int md_long_jump_size = 6;
4761 void
4762 md_create_short_jump (ptr, from_addr, to_addr, frag, to_symbol)
4763 char *ptr;
4764 addressT from_addr, to_addr;
4765 fragS *frag ATTRIBUTE_UNUSED;
4766 symbolS *to_symbol ATTRIBUTE_UNUSED;
4768 valueT offset;
4770 offset = to_addr - (from_addr + 2);
4772 md_number_to_chars (ptr, (valueT) 0x6000, 2);
4773 md_number_to_chars (ptr + 2, (valueT) offset, 2);
4776 void
4777 md_create_long_jump (ptr, from_addr, to_addr, frag, to_symbol)
4778 char *ptr;
4779 addressT from_addr, to_addr;
4780 fragS *frag;
4781 symbolS *to_symbol;
4783 valueT offset;
4785 if (!HAVE_LONG_BRANCH(current_architecture))
4787 offset = to_addr - S_GET_VALUE (to_symbol);
4788 md_number_to_chars (ptr, (valueT) 0x4EF9, 2);
4789 md_number_to_chars (ptr + 2, (valueT) offset, 4);
4790 fix_new (frag, (ptr + 2) - frag->fr_literal, 4, to_symbol, (offsetT) 0,
4791 0, NO_RELOC);
4793 else
4795 offset = to_addr - (from_addr + 2);
4796 md_number_to_chars (ptr, (valueT) 0x60ff, 2);
4797 md_number_to_chars (ptr + 2, (valueT) offset, 4);
4801 #endif
4803 /* Different values of OK tell what its OK to return. Things that
4804 aren't OK are an error (what a shock, no?)
4806 0: Everything is OK
4807 10: Absolute 1:8 only
4808 20: Absolute 0:7 only
4809 30: absolute 0:15 only
4810 40: Absolute 0:31 only
4811 50: absolute 0:127 only
4812 55: absolute -64:63 only
4813 60: absolute -128:127 only
4814 70: absolute 0:4095 only
4815 80: No bignums
4819 static int
4820 get_num (exp, ok)
4821 struct m68k_exp *exp;
4822 int ok;
4824 if (exp->exp.X_op == O_absent)
4826 /* Do the same thing the VAX asm does */
4827 op (exp) = O_constant;
4828 adds (exp) = 0;
4829 subs (exp) = 0;
4830 offs (exp) = 0;
4831 if (ok == 10)
4833 as_warn (_("expression out of range: defaulting to 1"));
4834 offs (exp) = 1;
4837 else if (exp->exp.X_op == O_constant)
4839 switch (ok)
4841 case 10:
4842 if (offs (exp) < 1 || offs (exp) > 8)
4844 as_warn (_("expression out of range: defaulting to 1"));
4845 offs (exp) = 1;
4847 break;
4848 case 20:
4849 if (offs (exp) < 0 || offs (exp) > 7)
4850 goto outrange;
4851 break;
4852 case 30:
4853 if (offs (exp) < 0 || offs (exp) > 15)
4854 goto outrange;
4855 break;
4856 case 40:
4857 if (offs (exp) < 0 || offs (exp) > 32)
4858 goto outrange;
4859 break;
4860 case 50:
4861 if (offs (exp) < 0 || offs (exp) > 127)
4862 goto outrange;
4863 break;
4864 case 55:
4865 if (offs (exp) < -64 || offs (exp) > 63)
4866 goto outrange;
4867 break;
4868 case 60:
4869 if (offs (exp) < -128 || offs (exp) > 127)
4870 goto outrange;
4871 break;
4872 case 70:
4873 if (offs (exp) < 0 || offs (exp) > 4095)
4875 outrange:
4876 as_warn (_("expression out of range: defaulting to 0"));
4877 offs (exp) = 0;
4879 break;
4880 default:
4881 break;
4884 else if (exp->exp.X_op == O_big)
4886 if (offs (exp) <= 0 /* flonum */
4887 && (ok == 80 /* no bignums */
4888 || (ok > 10 /* small-int ranges including 0 ok */
4889 /* If we have a flonum zero, a zero integer should
4890 do as well (e.g., in moveq). */
4891 && generic_floating_point_number.exponent == 0
4892 && generic_floating_point_number.low[0] == 0)))
4894 /* HACK! Turn it into a long */
4895 LITTLENUM_TYPE words[6];
4897 gen_to_words (words, 2, 8L); /* These numbers are magic! */
4898 op (exp) = O_constant;
4899 adds (exp) = 0;
4900 subs (exp) = 0;
4901 offs (exp) = words[1] | (words[0] << 16);
4903 else if (ok != 0)
4905 op (exp) = O_constant;
4906 adds (exp) = 0;
4907 subs (exp) = 0;
4908 offs (exp) = (ok == 10) ? 1 : 0;
4909 as_warn (_("Can't deal with expression; defaulting to %ld"),
4910 offs (exp));
4913 else
4915 if (ok >= 10 && ok <= 70)
4917 op (exp) = O_constant;
4918 adds (exp) = 0;
4919 subs (exp) = 0;
4920 offs (exp) = (ok == 10) ? 1 : 0;
4921 as_warn (_("Can't deal with expression; defaulting to %ld"),
4922 offs (exp));
4926 if (exp->size != SIZE_UNSPEC)
4928 switch (exp->size)
4930 case SIZE_UNSPEC:
4931 case SIZE_LONG:
4932 break;
4933 case SIZE_BYTE:
4934 if (!isbyte (offs (exp)))
4935 as_warn (_("expression doesn't fit in BYTE"));
4936 break;
4937 case SIZE_WORD:
4938 if (!isword (offs (exp)))
4939 as_warn (_("expression doesn't fit in WORD"));
4940 break;
4944 return offs (exp);
4947 /* These are the back-ends for the various machine dependent pseudo-ops. */
4949 static void
4950 s_data1 (ignore)
4951 int ignore ATTRIBUTE_UNUSED;
4953 subseg_set (data_section, 1);
4954 demand_empty_rest_of_line ();
4957 static void
4958 s_data2 (ignore)
4959 int ignore ATTRIBUTE_UNUSED;
4961 subseg_set (data_section, 2);
4962 demand_empty_rest_of_line ();
4965 static void
4966 s_bss (ignore)
4967 int ignore ATTRIBUTE_UNUSED;
4969 /* We don't support putting frags in the BSS segment, we fake it
4970 by marking in_bss, then looking at s_skip for clues. */
4972 subseg_set (bss_section, 0);
4973 demand_empty_rest_of_line ();
4976 static void
4977 s_even (ignore)
4978 int ignore ATTRIBUTE_UNUSED;
4980 register int temp;
4981 register long temp_fill;
4983 temp = 1; /* JF should be 2? */
4984 temp_fill = get_absolute_expression ();
4985 if (!need_pass_2) /* Never make frag if expect extra pass. */
4986 frag_align (temp, (int) temp_fill, 0);
4987 demand_empty_rest_of_line ();
4988 record_alignment (now_seg, temp);
4991 static void
4992 s_proc (ignore)
4993 int ignore ATTRIBUTE_UNUSED;
4995 demand_empty_rest_of_line ();
4998 /* Pseudo-ops handled for MRI compatibility. */
5000 /* This function returns non-zero if the argument is a conditional
5001 pseudo-op. This is called when checking whether a pending
5002 alignment is needed. */
5005 m68k_conditional_pseudoop (pop)
5006 pseudo_typeS *pop;
5008 return (pop->poc_handler == s_mri_if
5009 || pop->poc_handler == s_mri_else);
5012 /* Handle an MRI style chip specification. */
5014 static void
5015 mri_chip ()
5017 char *s;
5018 char c;
5019 int i;
5021 s = input_line_pointer;
5022 /* We can't use get_symbol_end since the processor names are not proper
5023 symbols. */
5024 while (is_part_of_name (c = *input_line_pointer++))
5026 *--input_line_pointer = 0;
5027 for (i = 0; i < n_archs; i++)
5028 if (strcasecmp (s, archs[i].name) == 0)
5029 break;
5030 if (i >= n_archs)
5032 as_bad (_("%s: unrecognized processor name"), s);
5033 *input_line_pointer = c;
5034 ignore_rest_of_line ();
5035 return;
5037 *input_line_pointer = c;
5039 if (*input_line_pointer == '/')
5040 current_architecture = 0;
5041 else
5042 current_architecture &= m68881 | m68851;
5043 current_architecture |= archs[i].arch;
5045 while (*input_line_pointer == '/')
5047 ++input_line_pointer;
5048 s = input_line_pointer;
5049 /* We can't use get_symbol_end since the processor names are not
5050 proper symbols. */
5051 while (is_part_of_name (c = *input_line_pointer++))
5053 *--input_line_pointer = 0;
5054 if (strcmp (s, "68881") == 0)
5055 current_architecture |= m68881;
5056 else if (strcmp (s, "68851") == 0)
5057 current_architecture |= m68851;
5058 *input_line_pointer = c;
5061 /* Update info about available control registers. */
5062 select_control_regs ();
5065 /* The MRI CHIP pseudo-op. */
5067 static void
5068 s_chip (ignore)
5069 int ignore ATTRIBUTE_UNUSED;
5071 char *stop = NULL;
5072 char stopc;
5074 if (flag_mri)
5075 stop = mri_comment_field (&stopc);
5076 mri_chip ();
5077 if (flag_mri)
5078 mri_comment_end (stop, stopc);
5079 demand_empty_rest_of_line ();
5082 /* The MRI FOPT pseudo-op. */
5084 static void
5085 s_fopt (ignore)
5086 int ignore ATTRIBUTE_UNUSED;
5088 SKIP_WHITESPACE ();
5090 if (strncasecmp (input_line_pointer, "ID=", 3) == 0)
5092 int temp;
5094 input_line_pointer += 3;
5095 temp = get_absolute_expression ();
5096 if (temp < 0 || temp > 7)
5097 as_bad (_("bad coprocessor id"));
5098 else
5099 m68k_float_copnum = COP0 + temp;
5101 else
5103 as_bad (_("unrecognized fopt option"));
5104 ignore_rest_of_line ();
5105 return;
5108 demand_empty_rest_of_line ();
5111 /* The structure used to handle the MRI OPT pseudo-op. */
5113 struct opt_action
5115 /* The name of the option. */
5116 const char *name;
5118 /* If this is not NULL, just call this function. The first argument
5119 is the ARG field of this structure, the second argument is
5120 whether the option was negated. */
5121 void (*pfn) PARAMS ((int arg, int on));
5123 /* If this is not NULL, and the PFN field is NULL, set the variable
5124 this points to. Set it to the ARG field if the option was not
5125 negated, and the NOTARG field otherwise. */
5126 int *pvar;
5128 /* The value to pass to PFN or to assign to *PVAR. */
5129 int arg;
5131 /* The value to assign to *PVAR if the option is negated. If PFN is
5132 NULL, and PVAR is not NULL, and ARG and NOTARG are the same, then
5133 the option may not be negated. */
5134 int notarg;
5137 /* The table used to handle the MRI OPT pseudo-op. */
5139 static void skip_to_comma PARAMS ((int, int));
5140 static void opt_nest PARAMS ((int, int));
5141 static void opt_chip PARAMS ((int, int));
5142 static void opt_list PARAMS ((int, int));
5143 static void opt_list_symbols PARAMS ((int, int));
5145 static const struct opt_action opt_table[] =
5147 { "abspcadd", 0, &m68k_abspcadd, 1, 0 },
5149 /* We do relaxing, so there is little use for these options. */
5150 { "b", 0, 0, 0, 0 },
5151 { "brs", 0, 0, 0, 0 },
5152 { "brb", 0, 0, 0, 0 },
5153 { "brl", 0, 0, 0, 0 },
5154 { "brw", 0, 0, 0, 0 },
5156 { "c", 0, 0, 0, 0 },
5157 { "cex", 0, 0, 0, 0 },
5158 { "case", 0, &symbols_case_sensitive, 1, 0 },
5159 { "cl", 0, 0, 0, 0 },
5160 { "cre", 0, 0, 0, 0 },
5161 { "d", 0, &flag_keep_locals, 1, 0 },
5162 { "e", 0, 0, 0, 0 },
5163 { "f", 0, &flag_short_refs, 1, 0 },
5164 { "frs", 0, &flag_short_refs, 1, 0 },
5165 { "frl", 0, &flag_short_refs, 0, 1 },
5166 { "g", 0, 0, 0, 0 },
5167 { "i", 0, 0, 0, 0 },
5168 { "m", 0, 0, 0, 0 },
5169 { "mex", 0, 0, 0, 0 },
5170 { "mc", 0, 0, 0, 0 },
5171 { "md", 0, 0, 0, 0 },
5172 { "nest", opt_nest, 0, 0, 0 },
5173 { "next", skip_to_comma, 0, 0, 0 },
5174 { "o", 0, 0, 0, 0 },
5175 { "old", 0, 0, 0, 0 },
5176 { "op", skip_to_comma, 0, 0, 0 },
5177 { "pco", 0, 0, 0, 0 },
5178 { "p", opt_chip, 0, 0, 0 },
5179 { "pcr", 0, 0, 0, 0 },
5180 { "pcs", 0, 0, 0, 0 },
5181 { "r", 0, 0, 0, 0 },
5182 { "quick", 0, &m68k_quick, 1, 0 },
5183 { "rel32", 0, &m68k_rel32, 1, 0 },
5184 { "s", opt_list, 0, 0, 0 },
5185 { "t", opt_list_symbols, 0, 0, 0 },
5186 { "w", 0, &flag_no_warnings, 0, 1 },
5187 { "x", 0, 0, 0, 0 }
5190 #define OPTCOUNT ((int) (sizeof opt_table / sizeof opt_table[0]))
5192 /* The MRI OPT pseudo-op. */
5194 static void
5195 s_opt (ignore)
5196 int ignore ATTRIBUTE_UNUSED;
5200 int t;
5201 char *s;
5202 char c;
5203 int i;
5204 const struct opt_action *o;
5206 SKIP_WHITESPACE ();
5208 t = 1;
5209 if (*input_line_pointer == '-')
5211 ++input_line_pointer;
5212 t = 0;
5214 else if (strncasecmp (input_line_pointer, "NO", 2) == 0)
5216 input_line_pointer += 2;
5217 t = 0;
5220 s = input_line_pointer;
5221 c = get_symbol_end ();
5223 for (i = 0, o = opt_table; i < OPTCOUNT; i++, o++)
5225 if (strcasecmp (s, o->name) == 0)
5227 if (o->pfn)
5229 /* Restore input_line_pointer now in case the option
5230 takes arguments. */
5231 *input_line_pointer = c;
5232 (*o->pfn) (o->arg, t);
5234 else if (o->pvar != NULL)
5236 if (! t && o->arg == o->notarg)
5237 as_bad (_("option `%s' may not be negated"), s);
5238 *input_line_pointer = c;
5239 *o->pvar = t ? o->arg : o->notarg;
5241 else
5242 *input_line_pointer = c;
5243 break;
5246 if (i >= OPTCOUNT)
5248 as_bad (_("option `%s' not recognized"), s);
5249 *input_line_pointer = c;
5252 while (*input_line_pointer++ == ',');
5254 /* Move back to terminating character. */
5255 --input_line_pointer;
5256 demand_empty_rest_of_line ();
5259 /* Skip ahead to a comma. This is used for OPT options which we do
5260 not suppor tand which take arguments. */
5262 static void
5263 skip_to_comma (arg, on)
5264 int arg ATTRIBUTE_UNUSED;
5265 int on ATTRIBUTE_UNUSED;
5267 while (*input_line_pointer != ','
5268 && ! is_end_of_line[(unsigned char) *input_line_pointer])
5269 ++input_line_pointer;
5272 /* Handle the OPT NEST=depth option. */
5274 static void
5275 opt_nest (arg, on)
5276 int arg ATTRIBUTE_UNUSED;
5277 int on ATTRIBUTE_UNUSED;
5279 if (*input_line_pointer != '=')
5281 as_bad (_("bad format of OPT NEST=depth"));
5282 return;
5285 ++input_line_pointer;
5286 max_macro_nest = get_absolute_expression ();
5289 /* Handle the OPT P=chip option. */
5291 static void
5292 opt_chip (arg, on)
5293 int arg ATTRIBUTE_UNUSED;
5294 int on ATTRIBUTE_UNUSED;
5296 if (*input_line_pointer != '=')
5298 /* This is just OPT P, which we do not support. */
5299 return;
5302 ++input_line_pointer;
5303 mri_chip ();
5306 /* Handle the OPT S option. */
5308 static void
5309 opt_list (arg, on)
5310 int arg ATTRIBUTE_UNUSED;
5311 int on;
5313 listing_list (on);
5316 /* Handle the OPT T option. */
5318 static void
5319 opt_list_symbols (arg, on)
5320 int arg ATTRIBUTE_UNUSED;
5321 int on;
5323 if (on)
5324 listing |= LISTING_SYMBOLS;
5325 else
5326 listing &= ~LISTING_SYMBOLS;
5329 /* Handle the MRI REG pseudo-op. */
5331 static void
5332 s_reg (ignore)
5333 int ignore ATTRIBUTE_UNUSED;
5335 char *s;
5336 int c;
5337 struct m68k_op rop;
5338 int mask;
5339 char *stop = NULL;
5340 char stopc;
5342 if (line_label == NULL)
5344 as_bad (_("missing label"));
5345 ignore_rest_of_line ();
5346 return;
5349 if (flag_mri)
5350 stop = mri_comment_field (&stopc);
5352 SKIP_WHITESPACE ();
5354 s = input_line_pointer;
5355 while (ISALNUM (*input_line_pointer)
5356 #ifdef REGISTER_PREFIX
5357 || *input_line_pointer == REGISTER_PREFIX
5358 #endif
5359 || *input_line_pointer == '/'
5360 || *input_line_pointer == '-')
5361 ++input_line_pointer;
5362 c = *input_line_pointer;
5363 *input_line_pointer = '\0';
5365 if (m68k_ip_op (s, &rop) != 0)
5367 if (rop.error == NULL)
5368 as_bad (_("bad register list"));
5369 else
5370 as_bad (_("bad register list: %s"), rop.error);
5371 *input_line_pointer = c;
5372 ignore_rest_of_line ();
5373 return;
5376 *input_line_pointer = c;
5378 if (rop.mode == REGLST)
5379 mask = rop.mask;
5380 else if (rop.mode == DREG)
5381 mask = 1 << (rop.reg - DATA0);
5382 else if (rop.mode == AREG)
5383 mask = 1 << (rop.reg - ADDR0 + 8);
5384 else if (rop.mode == FPREG)
5385 mask = 1 << (rop.reg - FP0 + 16);
5386 else if (rop.mode == CONTROL
5387 && rop.reg == FPI)
5388 mask = 1 << 24;
5389 else if (rop.mode == CONTROL
5390 && rop.reg == FPS)
5391 mask = 1 << 25;
5392 else if (rop.mode == CONTROL
5393 && rop.reg == FPC)
5394 mask = 1 << 26;
5395 else
5397 as_bad (_("bad register list"));
5398 ignore_rest_of_line ();
5399 return;
5402 S_SET_SEGMENT (line_label, reg_section);
5403 S_SET_VALUE (line_label, ~mask);
5404 symbol_set_frag (line_label, &zero_address_frag);
5406 if (flag_mri)
5407 mri_comment_end (stop, stopc);
5409 demand_empty_rest_of_line ();
5412 /* This structure is used for the MRI SAVE and RESTORE pseudo-ops. */
5414 struct save_opts
5416 struct save_opts *next;
5417 int abspcadd;
5418 int symbols_case_sensitive;
5419 int keep_locals;
5420 int short_refs;
5421 int architecture;
5422 int quick;
5423 int rel32;
5424 int listing;
5425 int no_warnings;
5426 /* FIXME: We don't save OPT S. */
5429 /* This variable holds the stack of saved options. */
5431 static struct save_opts *save_stack;
5433 /* The MRI SAVE pseudo-op. */
5435 static void
5436 s_save (ignore)
5437 int ignore ATTRIBUTE_UNUSED;
5439 struct save_opts *s;
5441 s = (struct save_opts *) xmalloc (sizeof (struct save_opts));
5442 s->abspcadd = m68k_abspcadd;
5443 s->symbols_case_sensitive = symbols_case_sensitive;
5444 s->keep_locals = flag_keep_locals;
5445 s->short_refs = flag_short_refs;
5446 s->architecture = current_architecture;
5447 s->quick = m68k_quick;
5448 s->rel32 = m68k_rel32;
5449 s->listing = listing;
5450 s->no_warnings = flag_no_warnings;
5452 s->next = save_stack;
5453 save_stack = s;
5455 demand_empty_rest_of_line ();
5458 /* The MRI RESTORE pseudo-op. */
5460 static void
5461 s_restore (ignore)
5462 int ignore ATTRIBUTE_UNUSED;
5464 struct save_opts *s;
5466 if (save_stack == NULL)
5468 as_bad (_("restore without save"));
5469 ignore_rest_of_line ();
5470 return;
5473 s = save_stack;
5474 save_stack = s->next;
5476 m68k_abspcadd = s->abspcadd;
5477 symbols_case_sensitive = s->symbols_case_sensitive;
5478 flag_keep_locals = s->keep_locals;
5479 flag_short_refs = s->short_refs;
5480 current_architecture = s->architecture;
5481 m68k_quick = s->quick;
5482 m68k_rel32 = s->rel32;
5483 listing = s->listing;
5484 flag_no_warnings = s->no_warnings;
5486 free (s);
5488 demand_empty_rest_of_line ();
5491 /* Types of MRI structured control directives. */
5493 enum mri_control_type
5495 mri_for,
5496 mri_if,
5497 mri_repeat,
5498 mri_while
5501 /* This structure is used to stack the MRI structured control
5502 directives. */
5504 struct mri_control_info
5506 /* The directive within which this one is enclosed. */
5507 struct mri_control_info *outer;
5509 /* The type of directive. */
5510 enum mri_control_type type;
5512 /* Whether an ELSE has been in an IF. */
5513 int else_seen;
5515 /* The add or sub statement at the end of a FOR. */
5516 char *incr;
5518 /* The label of the top of a FOR or REPEAT loop. */
5519 char *top;
5521 /* The label to jump to for the next iteration, or the else
5522 expression of a conditional. */
5523 char *next;
5525 /* The label to jump to to break out of the loop, or the label past
5526 the end of a conditional. */
5527 char *bottom;
5530 /* The stack of MRI structured control directives. */
5532 static struct mri_control_info *mri_control_stack;
5534 /* The current MRI structured control directive index number, used to
5535 generate label names. */
5537 static int mri_control_index;
5539 /* Some function prototypes. */
5541 static void mri_assemble PARAMS ((char *));
5542 static char *mri_control_label PARAMS ((void));
5543 static struct mri_control_info *push_mri_control
5544 PARAMS ((enum mri_control_type));
5545 static void pop_mri_control PARAMS ((void));
5546 static int parse_mri_condition PARAMS ((int *));
5547 static int parse_mri_control_operand
5548 PARAMS ((int *, char **, char **, char **, char **));
5549 static int swap_mri_condition PARAMS ((int));
5550 static int reverse_mri_condition PARAMS ((int));
5551 static void build_mri_control_operand
5552 PARAMS ((int, int, char *, char *, char *, char *, const char *,
5553 const char *, int));
5554 static void parse_mri_control_expression
5555 PARAMS ((char *, int, const char *, const char *, int));
5557 /* Assemble an instruction for an MRI structured control directive. */
5559 static void
5560 mri_assemble (str)
5561 char *str;
5563 char *s;
5565 /* md_assemble expects the opcode to be in lower case. */
5566 for (s = str; *s != ' ' && *s != '\0'; s++)
5567 *s = TOLOWER (*s);
5569 md_assemble (str);
5572 /* Generate a new MRI label structured control directive label name. */
5574 static char *
5575 mri_control_label ()
5577 char *n;
5579 n = (char *) xmalloc (20);
5580 sprintf (n, "%smc%d", FAKE_LABEL_NAME, mri_control_index);
5581 ++mri_control_index;
5582 return n;
5585 /* Create a new MRI structured control directive. */
5587 static struct mri_control_info *
5588 push_mri_control (type)
5589 enum mri_control_type type;
5591 struct mri_control_info *n;
5593 n = (struct mri_control_info *) xmalloc (sizeof (struct mri_control_info));
5595 n->type = type;
5596 n->else_seen = 0;
5597 if (type == mri_if || type == mri_while)
5598 n->top = NULL;
5599 else
5600 n->top = mri_control_label ();
5601 n->next = mri_control_label ();
5602 n->bottom = mri_control_label ();
5604 n->outer = mri_control_stack;
5605 mri_control_stack = n;
5607 return n;
5610 /* Pop off the stack of MRI structured control directives. */
5612 static void
5613 pop_mri_control ()
5615 struct mri_control_info *n;
5617 n = mri_control_stack;
5618 mri_control_stack = n->outer;
5619 if (n->top != NULL)
5620 free (n->top);
5621 free (n->next);
5622 free (n->bottom);
5623 free (n);
5626 /* Recognize a condition code in an MRI structured control expression. */
5628 static int
5629 parse_mri_condition (pcc)
5630 int *pcc;
5632 char c1, c2;
5634 know (*input_line_pointer == '<');
5636 ++input_line_pointer;
5637 c1 = *input_line_pointer++;
5638 c2 = *input_line_pointer++;
5640 if (*input_line_pointer != '>')
5642 as_bad (_("syntax error in structured control directive"));
5643 return 0;
5646 ++input_line_pointer;
5647 SKIP_WHITESPACE ();
5649 c1 = TOLOWER (c1);
5650 c2 = TOLOWER (c2);
5652 *pcc = (c1 << 8) | c2;
5654 return 1;
5657 /* Parse a single operand in an MRI structured control expression. */
5659 static int
5660 parse_mri_control_operand (pcc, leftstart, leftstop, rightstart, rightstop)
5661 int *pcc;
5662 char **leftstart;
5663 char **leftstop;
5664 char **rightstart;
5665 char **rightstop;
5667 char *s;
5669 SKIP_WHITESPACE ();
5671 *pcc = -1;
5672 *leftstart = NULL;
5673 *leftstop = NULL;
5674 *rightstart = NULL;
5675 *rightstop = NULL;
5677 if (*input_line_pointer == '<')
5679 /* It's just a condition code. */
5680 return parse_mri_condition (pcc);
5683 /* Look ahead for the condition code. */
5684 for (s = input_line_pointer; *s != '\0'; ++s)
5686 if (*s == '<' && s[1] != '\0' && s[2] != '\0' && s[3] == '>')
5687 break;
5689 if (*s == '\0')
5691 as_bad (_("missing condition code in structured control directive"));
5692 return 0;
5695 *leftstart = input_line_pointer;
5696 *leftstop = s;
5697 if (*leftstop > *leftstart
5698 && ((*leftstop)[-1] == ' ' || (*leftstop)[-1] == '\t'))
5699 --*leftstop;
5701 input_line_pointer = s;
5702 if (! parse_mri_condition (pcc))
5703 return 0;
5705 /* Look ahead for AND or OR or end of line. */
5706 for (s = input_line_pointer; *s != '\0'; ++s)
5708 /* We must make sure we don't misinterpret AND/OR at the end of labels!
5709 if d0 <eq> #FOOAND and d1 <ne> #BAROR then
5710 ^^^ ^^ */
5711 if ((s == input_line_pointer
5712 || *(s-1) == ' '
5713 || *(s-1) == '\t')
5714 && ((strncasecmp (s, "AND", 3) == 0
5715 && (s[3] == '.' || ! is_part_of_name (s[3])))
5716 || (strncasecmp (s, "OR", 2) == 0
5717 && (s[2] == '.' || ! is_part_of_name (s[2])))))
5718 break;
5721 *rightstart = input_line_pointer;
5722 *rightstop = s;
5723 if (*rightstop > *rightstart
5724 && ((*rightstop)[-1] == ' ' || (*rightstop)[-1] == '\t'))
5725 --*rightstop;
5727 input_line_pointer = s;
5729 return 1;
5732 #define MCC(b1, b2) (((b1) << 8) | (b2))
5734 /* Swap the sense of a condition. This changes the condition so that
5735 it generates the same result when the operands are swapped. */
5737 static int
5738 swap_mri_condition (cc)
5739 int cc;
5741 switch (cc)
5743 case MCC ('h', 'i'): return MCC ('c', 's');
5744 case MCC ('l', 's'): return MCC ('c', 'c');
5745 /* <HS> is an alias for <CC> */
5746 case MCC ('h', 's'):
5747 case MCC ('c', 'c'): return MCC ('l', 's');
5748 /* <LO> is an alias for <CS> */
5749 case MCC ('l', 'o'):
5750 case MCC ('c', 's'): return MCC ('h', 'i');
5751 case MCC ('p', 'l'): return MCC ('m', 'i');
5752 case MCC ('m', 'i'): return MCC ('p', 'l');
5753 case MCC ('g', 'e'): return MCC ('l', 'e');
5754 case MCC ('l', 't'): return MCC ('g', 't');
5755 case MCC ('g', 't'): return MCC ('l', 't');
5756 case MCC ('l', 'e'): return MCC ('g', 'e');
5757 /* issue a warning for conditions we can not swap */
5758 case MCC ('n', 'e'): return MCC ('n', 'e'); // no problem here
5759 case MCC ('e', 'q'): return MCC ('e', 'q'); // also no problem
5760 case MCC ('v', 'c'):
5761 case MCC ('v', 's'):
5762 default :
5763 as_warn (_("Condition <%c%c> in structured control directive can not be encoded correctly"),
5764 (char) (cc >> 8), (char) (cc));
5765 break;
5767 return cc;
5770 /* Reverse the sense of a condition. */
5772 static int
5773 reverse_mri_condition (cc)
5774 int cc;
5776 switch (cc)
5778 case MCC ('h', 'i'): return MCC ('l', 's');
5779 case MCC ('l', 's'): return MCC ('h', 'i');
5780 /* <HS> is an alias for <CC> */
5781 case MCC ('h', 's'): return MCC ('l', 'o');
5782 case MCC ('c', 'c'): return MCC ('c', 's');
5783 /* <LO> is an alias for <CS> */
5784 case MCC ('l', 'o'): return MCC ('h', 's');
5785 case MCC ('c', 's'): return MCC ('c', 'c');
5786 case MCC ('n', 'e'): return MCC ('e', 'q');
5787 case MCC ('e', 'q'): return MCC ('n', 'e');
5788 case MCC ('v', 'c'): return MCC ('v', 's');
5789 case MCC ('v', 's'): return MCC ('v', 'c');
5790 case MCC ('p', 'l'): return MCC ('m', 'i');
5791 case MCC ('m', 'i'): return MCC ('p', 'l');
5792 case MCC ('g', 'e'): return MCC ('l', 't');
5793 case MCC ('l', 't'): return MCC ('g', 'e');
5794 case MCC ('g', 't'): return MCC ('l', 'e');
5795 case MCC ('l', 'e'): return MCC ('g', 't');
5797 return cc;
5800 /* Build an MRI structured control expression. This generates test
5801 and branch instructions. It goes to TRUELAB if the condition is
5802 true, and to FALSELAB if the condition is false. Exactly one of
5803 TRUELAB and FALSELAB will be NULL, meaning to fall through. QUAL
5804 is the size qualifier for the expression. EXTENT is the size to
5805 use for the branch. */
5807 static void
5808 build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart,
5809 rightstop, truelab, falselab, extent)
5810 int qual;
5811 int cc;
5812 char *leftstart;
5813 char *leftstop;
5814 char *rightstart;
5815 char *rightstop;
5816 const char *truelab;
5817 const char *falselab;
5818 int extent;
5820 char *buf;
5821 char *s;
5823 if (leftstart != NULL)
5825 struct m68k_op leftop, rightop;
5826 char c;
5828 /* Swap the compare operands, if necessary, to produce a legal
5829 m68k compare instruction. Comparing a register operand with
5830 a non-register operand requires the register to be on the
5831 right (cmp, cmpa). Comparing an immediate value with
5832 anything requires the immediate value to be on the left
5833 (cmpi). */
5835 c = *leftstop;
5836 *leftstop = '\0';
5837 (void) m68k_ip_op (leftstart, &leftop);
5838 *leftstop = c;
5840 c = *rightstop;
5841 *rightstop = '\0';
5842 (void) m68k_ip_op (rightstart, &rightop);
5843 *rightstop = c;
5845 if (rightop.mode == IMMED
5846 || ((leftop.mode == DREG || leftop.mode == AREG)
5847 && (rightop.mode != DREG && rightop.mode != AREG)))
5849 char *temp;
5851 /* Correct conditional handling:
5852 if #1 <lt> d0 then ;means if (1 < d0)
5854 endi
5856 should assemble to:
5858 cmp #1,d0 if we do *not* swap the operands
5859 bgt true we need the swapped condition!
5860 ble false
5861 true:
5863 false:
5865 temp = leftstart;
5866 leftstart = rightstart;
5867 rightstart = temp;
5868 temp = leftstop;
5869 leftstop = rightstop;
5870 rightstop = temp;
5872 else
5874 cc = swap_mri_condition (cc);
5878 if (truelab == NULL)
5880 cc = reverse_mri_condition (cc);
5881 truelab = falselab;
5884 if (leftstart != NULL)
5886 buf = (char *) xmalloc (20
5887 + (leftstop - leftstart)
5888 + (rightstop - rightstart));
5889 s = buf;
5890 *s++ = 'c';
5891 *s++ = 'm';
5892 *s++ = 'p';
5893 if (qual != '\0')
5894 *s++ = TOLOWER (qual);
5895 *s++ = ' ';
5896 memcpy (s, leftstart, leftstop - leftstart);
5897 s += leftstop - leftstart;
5898 *s++ = ',';
5899 memcpy (s, rightstart, rightstop - rightstart);
5900 s += rightstop - rightstart;
5901 *s = '\0';
5902 mri_assemble (buf);
5903 free (buf);
5906 buf = (char *) xmalloc (20 + strlen (truelab));
5907 s = buf;
5908 *s++ = 'b';
5909 *s++ = cc >> 8;
5910 *s++ = cc & 0xff;
5911 if (extent != '\0')
5912 *s++ = TOLOWER (extent);
5913 *s++ = ' ';
5914 strcpy (s, truelab);
5915 mri_assemble (buf);
5916 free (buf);
5919 /* Parse an MRI structured control expression. This generates test
5920 and branch instructions. STOP is where the expression ends. It
5921 goes to TRUELAB if the condition is true, and to FALSELAB if the
5922 condition is false. Exactly one of TRUELAB and FALSELAB will be
5923 NULL, meaning to fall through. QUAL is the size qualifier for the
5924 expression. EXTENT is the size to use for the branch. */
5926 static void
5927 parse_mri_control_expression (stop, qual, truelab, falselab, extent)
5928 char *stop;
5929 int qual;
5930 const char *truelab;
5931 const char *falselab;
5932 int extent;
5934 int c;
5935 int cc;
5936 char *leftstart;
5937 char *leftstop;
5938 char *rightstart;
5939 char *rightstop;
5941 c = *stop;
5942 *stop = '\0';
5944 if (! parse_mri_control_operand (&cc, &leftstart, &leftstop,
5945 &rightstart, &rightstop))
5947 *stop = c;
5948 return;
5951 if (strncasecmp (input_line_pointer, "AND", 3) == 0)
5953 const char *flab;
5955 if (falselab != NULL)
5956 flab = falselab;
5957 else
5958 flab = mri_control_label ();
5960 build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart,
5961 rightstop, (const char *) NULL, flab, extent);
5963 input_line_pointer += 3;
5964 if (*input_line_pointer != '.'
5965 || input_line_pointer[1] == '\0')
5966 qual = '\0';
5967 else
5969 qual = input_line_pointer[1];
5970 input_line_pointer += 2;
5973 if (! parse_mri_control_operand (&cc, &leftstart, &leftstop,
5974 &rightstart, &rightstop))
5976 *stop = c;
5977 return;
5980 build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart,
5981 rightstop, truelab, falselab, extent);
5983 if (falselab == NULL)
5984 colon (flab);
5986 else if (strncasecmp (input_line_pointer, "OR", 2) == 0)
5988 const char *tlab;
5990 if (truelab != NULL)
5991 tlab = truelab;
5992 else
5993 tlab = mri_control_label ();
5995 build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart,
5996 rightstop, tlab, (const char *) NULL, extent);
5998 input_line_pointer += 2;
5999 if (*input_line_pointer != '.'
6000 || input_line_pointer[1] == '\0')
6001 qual = '\0';
6002 else
6004 qual = input_line_pointer[1];
6005 input_line_pointer += 2;
6008 if (! parse_mri_control_operand (&cc, &leftstart, &leftstop,
6009 &rightstart, &rightstop))
6011 *stop = c;
6012 return;
6015 build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart,
6016 rightstop, truelab, falselab, extent);
6018 if (truelab == NULL)
6019 colon (tlab);
6021 else
6023 build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart,
6024 rightstop, truelab, falselab, extent);
6027 *stop = c;
6028 if (input_line_pointer != stop)
6029 as_bad (_("syntax error in structured control directive"));
6032 /* Handle the MRI IF pseudo-op. This may be a structured control
6033 directive, or it may be a regular assembler conditional, depending
6034 on its operands. */
6036 static void
6037 s_mri_if (qual)
6038 int qual;
6040 char *s;
6041 int c;
6042 struct mri_control_info *n;
6044 /* A structured control directive must end with THEN with an
6045 optional qualifier. */
6046 s = input_line_pointer;
6047 /* We only accept '*' as introduction of comments if preceded by white space
6048 or at first column of a line (I think this can't actually happen here?)
6049 This is important when assembling:
6050 if d0 <ne> 12(a0,d0*2) then
6051 if d0 <ne> #CONST*20 then */
6052 while ( ! ( is_end_of_line[(unsigned char) *s]
6053 || ( flag_mri
6054 && *s == '*'
6055 && ( s == input_line_pointer
6056 || *(s-1) == ' '
6057 || *(s-1) == '\t'))))
6058 ++s;
6059 --s;
6060 while (s > input_line_pointer && (*s == ' ' || *s == '\t'))
6061 --s;
6063 if (s - input_line_pointer > 1
6064 && s[-1] == '.')
6065 s -= 2;
6067 if (s - input_line_pointer < 3
6068 || strncasecmp (s - 3, "THEN", 4) != 0)
6070 if (qual != '\0')
6072 as_bad (_("missing then"));
6073 ignore_rest_of_line ();
6074 return;
6077 /* It's a conditional. */
6078 s_if (O_ne);
6079 return;
6082 /* Since this might be a conditional if, this pseudo-op will be
6083 called even if we are supported to be ignoring input. Double
6084 check now. Clobber *input_line_pointer so that ignore_input
6085 thinks that this is not a special pseudo-op. */
6086 c = *input_line_pointer;
6087 *input_line_pointer = 0;
6088 if (ignore_input ())
6090 *input_line_pointer = c;
6091 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6092 ++input_line_pointer;
6093 demand_empty_rest_of_line ();
6094 return;
6096 *input_line_pointer = c;
6098 n = push_mri_control (mri_if);
6100 parse_mri_control_expression (s - 3, qual, (const char *) NULL,
6101 n->next, s[1] == '.' ? s[2] : '\0');
6103 if (s[1] == '.')
6104 input_line_pointer = s + 3;
6105 else
6106 input_line_pointer = s + 1;
6108 if (flag_mri)
6110 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6111 ++input_line_pointer;
6114 demand_empty_rest_of_line ();
6117 /* Handle the MRI else pseudo-op. If we are currently doing an MRI
6118 structured IF, associate the ELSE with the IF. Otherwise, assume
6119 it is a conditional else. */
6121 static void
6122 s_mri_else (qual)
6123 int qual;
6125 int c;
6126 char *buf;
6127 char q[2];
6129 if (qual == '\0'
6130 && (mri_control_stack == NULL
6131 || mri_control_stack->type != mri_if
6132 || mri_control_stack->else_seen))
6134 s_else (0);
6135 return;
6138 c = *input_line_pointer;
6139 *input_line_pointer = 0;
6140 if (ignore_input ())
6142 *input_line_pointer = c;
6143 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6144 ++input_line_pointer;
6145 demand_empty_rest_of_line ();
6146 return;
6148 *input_line_pointer = c;
6150 if (mri_control_stack == NULL
6151 || mri_control_stack->type != mri_if
6152 || mri_control_stack->else_seen)
6154 as_bad (_("else without matching if"));
6155 ignore_rest_of_line ();
6156 return;
6159 mri_control_stack->else_seen = 1;
6161 buf = (char *) xmalloc (20 + strlen (mri_control_stack->bottom));
6162 q[0] = TOLOWER (qual);
6163 q[1] = '\0';
6164 sprintf (buf, "bra%s %s", q, mri_control_stack->bottom);
6165 mri_assemble (buf);
6166 free (buf);
6168 colon (mri_control_stack->next);
6170 if (flag_mri)
6172 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6173 ++input_line_pointer;
6176 demand_empty_rest_of_line ();
6179 /* Handle the MRI ENDI pseudo-op. */
6181 static void
6182 s_mri_endi (ignore)
6183 int ignore ATTRIBUTE_UNUSED;
6185 if (mri_control_stack == NULL
6186 || mri_control_stack->type != mri_if)
6188 as_bad (_("endi without matching if"));
6189 ignore_rest_of_line ();
6190 return;
6193 /* ignore_input will not return true for ENDI, so we don't need to
6194 worry about checking it again here. */
6196 if (! mri_control_stack->else_seen)
6197 colon (mri_control_stack->next);
6198 colon (mri_control_stack->bottom);
6200 pop_mri_control ();
6202 if (flag_mri)
6204 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6205 ++input_line_pointer;
6208 demand_empty_rest_of_line ();
6211 /* Handle the MRI BREAK pseudo-op. */
6213 static void
6214 s_mri_break (extent)
6215 int extent;
6217 struct mri_control_info *n;
6218 char *buf;
6219 char ex[2];
6221 n = mri_control_stack;
6222 while (n != NULL
6223 && n->type != mri_for
6224 && n->type != mri_repeat
6225 && n->type != mri_while)
6226 n = n->outer;
6227 if (n == NULL)
6229 as_bad (_("break outside of structured loop"));
6230 ignore_rest_of_line ();
6231 return;
6234 buf = (char *) xmalloc (20 + strlen (n->bottom));
6235 ex[0] = TOLOWER (extent);
6236 ex[1] = '\0';
6237 sprintf (buf, "bra%s %s", ex, n->bottom);
6238 mri_assemble (buf);
6239 free (buf);
6241 if (flag_mri)
6243 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6244 ++input_line_pointer;
6247 demand_empty_rest_of_line ();
6250 /* Handle the MRI NEXT pseudo-op. */
6252 static void
6253 s_mri_next (extent)
6254 int extent;
6256 struct mri_control_info *n;
6257 char *buf;
6258 char ex[2];
6260 n = mri_control_stack;
6261 while (n != NULL
6262 && n->type != mri_for
6263 && n->type != mri_repeat
6264 && n->type != mri_while)
6265 n = n->outer;
6266 if (n == NULL)
6268 as_bad (_("next outside of structured loop"));
6269 ignore_rest_of_line ();
6270 return;
6273 buf = (char *) xmalloc (20 + strlen (n->next));
6274 ex[0] = TOLOWER (extent);
6275 ex[1] = '\0';
6276 sprintf (buf, "bra%s %s", ex, n->next);
6277 mri_assemble (buf);
6278 free (buf);
6280 if (flag_mri)
6282 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6283 ++input_line_pointer;
6286 demand_empty_rest_of_line ();
6289 /* Handle the MRI FOR pseudo-op. */
6291 static void
6292 s_mri_for (qual)
6293 int qual;
6295 const char *varstart, *varstop;
6296 const char *initstart, *initstop;
6297 const char *endstart, *endstop;
6298 const char *bystart, *bystop;
6299 int up;
6300 int by;
6301 int extent;
6302 struct mri_control_info *n;
6303 char *buf;
6304 char *s;
6305 char ex[2];
6307 /* The syntax is
6308 FOR.q var = init { TO | DOWNTO } end [ BY by ] DO.e
6311 SKIP_WHITESPACE ();
6312 varstart = input_line_pointer;
6314 /* Look for the '='. */
6315 while (! is_end_of_line[(unsigned char) *input_line_pointer]
6316 && *input_line_pointer != '=')
6317 ++input_line_pointer;
6318 if (*input_line_pointer != '=')
6320 as_bad (_("missing ="));
6321 ignore_rest_of_line ();
6322 return;
6325 varstop = input_line_pointer;
6326 if (varstop > varstart
6327 && (varstop[-1] == ' ' || varstop[-1] == '\t'))
6328 --varstop;
6330 ++input_line_pointer;
6332 initstart = input_line_pointer;
6334 /* Look for TO or DOWNTO. */
6335 up = 1;
6336 initstop = NULL;
6337 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6339 if (strncasecmp (input_line_pointer, "TO", 2) == 0
6340 && ! is_part_of_name (input_line_pointer[2]))
6342 initstop = input_line_pointer;
6343 input_line_pointer += 2;
6344 break;
6346 if (strncasecmp (input_line_pointer, "DOWNTO", 6) == 0
6347 && ! is_part_of_name (input_line_pointer[6]))
6349 initstop = input_line_pointer;
6350 up = 0;
6351 input_line_pointer += 6;
6352 break;
6354 ++input_line_pointer;
6356 if (initstop == NULL)
6358 as_bad (_("missing to or downto"));
6359 ignore_rest_of_line ();
6360 return;
6362 if (initstop > initstart
6363 && (initstop[-1] == ' ' || initstop[-1] == '\t'))
6364 --initstop;
6366 SKIP_WHITESPACE ();
6367 endstart = input_line_pointer;
6369 /* Look for BY or DO. */
6370 by = 0;
6371 endstop = NULL;
6372 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6374 if (strncasecmp (input_line_pointer, "BY", 2) == 0
6375 && ! is_part_of_name (input_line_pointer[2]))
6377 endstop = input_line_pointer;
6378 by = 1;
6379 input_line_pointer += 2;
6380 break;
6382 if (strncasecmp (input_line_pointer, "DO", 2) == 0
6383 && (input_line_pointer[2] == '.'
6384 || ! is_part_of_name (input_line_pointer[2])))
6386 endstop = input_line_pointer;
6387 input_line_pointer += 2;
6388 break;
6390 ++input_line_pointer;
6392 if (endstop == NULL)
6394 as_bad (_("missing do"));
6395 ignore_rest_of_line ();
6396 return;
6398 if (endstop > endstart
6399 && (endstop[-1] == ' ' || endstop[-1] == '\t'))
6400 --endstop;
6402 if (! by)
6404 bystart = "#1";
6405 bystop = bystart + 2;
6407 else
6409 SKIP_WHITESPACE ();
6410 bystart = input_line_pointer;
6412 /* Look for DO. */
6413 bystop = NULL;
6414 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6416 if (strncasecmp (input_line_pointer, "DO", 2) == 0
6417 && (input_line_pointer[2] == '.'
6418 || ! is_part_of_name (input_line_pointer[2])))
6420 bystop = input_line_pointer;
6421 input_line_pointer += 2;
6422 break;
6424 ++input_line_pointer;
6426 if (bystop == NULL)
6428 as_bad (_("missing do"));
6429 ignore_rest_of_line ();
6430 return;
6432 if (bystop > bystart
6433 && (bystop[-1] == ' ' || bystop[-1] == '\t'))
6434 --bystop;
6437 if (*input_line_pointer != '.')
6438 extent = '\0';
6439 else
6441 extent = input_line_pointer[1];
6442 input_line_pointer += 2;
6445 /* We have fully parsed the FOR operands. Now build the loop. */
6447 n = push_mri_control (mri_for);
6449 buf = (char *) xmalloc (50 + (input_line_pointer - varstart));
6451 /* move init,var */
6452 s = buf;
6453 *s++ = 'm';
6454 *s++ = 'o';
6455 *s++ = 'v';
6456 *s++ = 'e';
6457 if (qual != '\0')
6458 *s++ = TOLOWER (qual);
6459 *s++ = ' ';
6460 memcpy (s, initstart, initstop - initstart);
6461 s += initstop - initstart;
6462 *s++ = ',';
6463 memcpy (s, varstart, varstop - varstart);
6464 s += varstop - varstart;
6465 *s = '\0';
6466 mri_assemble (buf);
6468 colon (n->top);
6470 /* cmp end,var */
6471 s = buf;
6472 *s++ = 'c';
6473 *s++ = 'm';
6474 *s++ = 'p';
6475 if (qual != '\0')
6476 *s++ = TOLOWER (qual);
6477 *s++ = ' ';
6478 memcpy (s, endstart, endstop - endstart);
6479 s += endstop - endstart;
6480 *s++ = ',';
6481 memcpy (s, varstart, varstop - varstart);
6482 s += varstop - varstart;
6483 *s = '\0';
6484 mri_assemble (buf);
6486 /* bcc bottom */
6487 ex[0] = TOLOWER (extent);
6488 ex[1] = '\0';
6489 if (up)
6490 sprintf (buf, "blt%s %s", ex, n->bottom);
6491 else
6492 sprintf (buf, "bgt%s %s", ex, n->bottom);
6493 mri_assemble (buf);
6495 /* Put together the add or sub instruction used by ENDF. */
6496 s = buf;
6497 if (up)
6498 strcpy (s, "add");
6499 else
6500 strcpy (s, "sub");
6501 s += 3;
6502 if (qual != '\0')
6503 *s++ = TOLOWER (qual);
6504 *s++ = ' ';
6505 memcpy (s, bystart, bystop - bystart);
6506 s += bystop - bystart;
6507 *s++ = ',';
6508 memcpy (s, varstart, varstop - varstart);
6509 s += varstop - varstart;
6510 *s = '\0';
6511 n->incr = buf;
6513 if (flag_mri)
6515 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6516 ++input_line_pointer;
6519 demand_empty_rest_of_line ();
6522 /* Handle the MRI ENDF pseudo-op. */
6524 static void
6525 s_mri_endf (ignore)
6526 int ignore ATTRIBUTE_UNUSED;
6528 if (mri_control_stack == NULL
6529 || mri_control_stack->type != mri_for)
6531 as_bad (_("endf without for"));
6532 ignore_rest_of_line ();
6533 return;
6536 colon (mri_control_stack->next);
6538 mri_assemble (mri_control_stack->incr);
6540 sprintf (mri_control_stack->incr, "bra %s", mri_control_stack->top);
6541 mri_assemble (mri_control_stack->incr);
6543 free (mri_control_stack->incr);
6545 colon (mri_control_stack->bottom);
6547 pop_mri_control ();
6549 if (flag_mri)
6551 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6552 ++input_line_pointer;
6555 demand_empty_rest_of_line ();
6558 /* Handle the MRI REPEAT pseudo-op. */
6560 static void
6561 s_mri_repeat (ignore)
6562 int ignore ATTRIBUTE_UNUSED;
6564 struct mri_control_info *n;
6566 n = push_mri_control (mri_repeat);
6567 colon (n->top);
6568 if (flag_mri)
6570 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6571 ++input_line_pointer;
6573 demand_empty_rest_of_line ();
6576 /* Handle the MRI UNTIL pseudo-op. */
6578 static void
6579 s_mri_until (qual)
6580 int qual;
6582 char *s;
6584 if (mri_control_stack == NULL
6585 || mri_control_stack->type != mri_repeat)
6587 as_bad (_("until without repeat"));
6588 ignore_rest_of_line ();
6589 return;
6592 colon (mri_control_stack->next);
6594 for (s = input_line_pointer; ! is_end_of_line[(unsigned char) *s]; s++)
6597 parse_mri_control_expression (s, qual, (const char *) NULL,
6598 mri_control_stack->top, '\0');
6600 colon (mri_control_stack->bottom);
6602 input_line_pointer = s;
6604 pop_mri_control ();
6606 if (flag_mri)
6608 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6609 ++input_line_pointer;
6612 demand_empty_rest_of_line ();
6615 /* Handle the MRI WHILE pseudo-op. */
6617 static void
6618 s_mri_while (qual)
6619 int qual;
6621 char *s;
6623 struct mri_control_info *n;
6625 s = input_line_pointer;
6626 /* We only accept '*' as introduction of comments if preceded by white space
6627 or at first column of a line (I think this can't actually happen here?)
6628 This is important when assembling:
6629 while d0 <ne> 12(a0,d0*2) do
6630 while d0 <ne> #CONST*20 do */
6631 while (! (is_end_of_line[(unsigned char) *s]
6632 || (flag_mri
6633 && *s == '*'
6634 && (s == input_line_pointer
6635 || *(s-1) == ' '
6636 || *(s-1) == '\t'))))
6637 s++;
6638 --s;
6639 while (*s == ' ' || *s == '\t')
6640 --s;
6641 if (s - input_line_pointer > 1
6642 && s[-1] == '.')
6643 s -= 2;
6644 if (s - input_line_pointer < 2
6645 || strncasecmp (s - 1, "DO", 2) != 0)
6647 as_bad (_("missing do"));
6648 ignore_rest_of_line ();
6649 return;
6652 n = push_mri_control (mri_while);
6654 colon (n->next);
6656 parse_mri_control_expression (s - 1, qual, (const char *) NULL, n->bottom,
6657 s[1] == '.' ? s[2] : '\0');
6659 input_line_pointer = s + 1;
6660 if (*input_line_pointer == '.')
6661 input_line_pointer += 2;
6663 if (flag_mri)
6665 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6666 ++input_line_pointer;
6669 demand_empty_rest_of_line ();
6672 /* Handle the MRI ENDW pseudo-op. */
6674 static void
6675 s_mri_endw (ignore)
6676 int ignore ATTRIBUTE_UNUSED;
6678 char *buf;
6680 if (mri_control_stack == NULL
6681 || mri_control_stack->type != mri_while)
6683 as_bad (_("endw without while"));
6684 ignore_rest_of_line ();
6685 return;
6688 buf = (char *) xmalloc (20 + strlen (mri_control_stack->next));
6689 sprintf (buf, "bra %s", mri_control_stack->next);
6690 mri_assemble (buf);
6691 free (buf);
6693 colon (mri_control_stack->bottom);
6695 pop_mri_control ();
6697 if (flag_mri)
6699 while (! is_end_of_line[(unsigned char) *input_line_pointer])
6700 ++input_line_pointer;
6703 demand_empty_rest_of_line ();
6707 * md_parse_option
6708 * Invocation line includes a switch not recognized by the base assembler.
6709 * See if it's a processor-specific option. These are:
6711 * -[A]m[c]68000, -[A]m[c]68008, -[A]m[c]68010, -[A]m[c]68020, -[A]m[c]68030, -[A]m[c]68040
6712 * -[A]m[c]68881, -[A]m[c]68882, -[A]m[c]68851
6713 * Select the architecture. Instructions or features not
6714 * supported by the selected architecture cause fatal
6715 * errors. More than one may be specified. The default is
6716 * -m68020 -m68851 -m68881. Note that -m68008 is a synonym
6717 * for -m68000, and -m68882 is a synonym for -m68881.
6718 * -[A]m[c]no-68851, -[A]m[c]no-68881
6719 * Don't accept 688?1 instructions. (The "c" is kind of silly,
6720 * so don't use or document it, but that's the way the parsing
6721 * works).
6723 * -pic Indicates PIC.
6724 * -k Indicates PIC. (Sun 3 only.)
6725 * --pcrel Never turn PC-relative branches into absolute jumps.
6727 * --bitwise-or
6728 * Permit `|' to be used in expressions.
6732 #ifdef OBJ_ELF
6733 const char *md_shortopts = "lSA:m:kQ:V";
6734 #else
6735 const char *md_shortopts = "lSA:m:k";
6736 #endif
6738 struct option md_longopts[] = {
6739 #define OPTION_PIC (OPTION_MD_BASE)
6740 {"pic", no_argument, NULL, OPTION_PIC},
6741 #define OPTION_REGISTER_PREFIX_OPTIONAL (OPTION_MD_BASE + 1)
6742 {"register-prefix-optional", no_argument, NULL,
6743 OPTION_REGISTER_PREFIX_OPTIONAL},
6744 #define OPTION_BITWISE_OR (OPTION_MD_BASE + 2)
6745 {"bitwise-or", no_argument, NULL, OPTION_BITWISE_OR},
6746 #define OPTION_BASE_SIZE_DEFAULT_16 (OPTION_MD_BASE + 3)
6747 {"base-size-default-16", no_argument, NULL, OPTION_BASE_SIZE_DEFAULT_16},
6748 #define OPTION_BASE_SIZE_DEFAULT_32 (OPTION_MD_BASE + 4)
6749 {"base-size-default-32", no_argument, NULL, OPTION_BASE_SIZE_DEFAULT_32},
6750 #define OPTION_DISP_SIZE_DEFAULT_16 (OPTION_MD_BASE + 5)
6751 {"disp-size-default-16", no_argument, NULL, OPTION_DISP_SIZE_DEFAULT_16},
6752 #define OPTION_DISP_SIZE_DEFAULT_32 (OPTION_MD_BASE + 6)
6753 {"disp-size-default-32", no_argument, NULL, OPTION_DISP_SIZE_DEFAULT_32},
6754 #define OPTION_PCREL (OPTION_MD_BASE + 7)
6755 {"pcrel", no_argument, NULL, OPTION_PCREL},
6756 {NULL, no_argument, NULL, 0}
6758 size_t md_longopts_size = sizeof (md_longopts);
6761 md_parse_option (c, arg)
6762 int c;
6763 char *arg;
6765 switch (c)
6767 case 'l': /* -l means keep external to 2 bit offset
6768 rather than 16 bit one */
6769 flag_short_refs = 1;
6770 break;
6772 case 'S': /* -S means that jbsr's always turn into
6773 jsr's. */
6774 flag_long_jumps = 1;
6775 break;
6777 case OPTION_PCREL: /* --pcrel means never turn PC-relative
6778 branches into absolute jumps. */
6779 flag_keep_pcrel = 1;
6780 break;
6782 case 'A':
6783 if (*arg == 'm')
6784 arg++;
6785 /* intentional fall-through */
6786 case 'm':
6788 if (arg[0] == 'n' && arg[1] == 'o' && arg[2] == '-')
6790 int i;
6791 unsigned long arch;
6792 const char *oarg = arg;
6794 arg += 3;
6795 if (*arg == 'm')
6797 arg++;
6798 if (arg[0] == 'c' && arg[1] == '6')
6799 arg++;
6801 for (i = 0; i < n_archs; i++)
6802 if (!strcmp (arg, archs[i].name))
6803 break;
6804 if (i == n_archs)
6806 unknown:
6807 as_bad (_("unrecognized option `%s'"), oarg);
6808 return 0;
6810 arch = archs[i].arch;
6811 if (arch == m68881)
6812 no_68881 = 1;
6813 else if (arch == m68851)
6814 no_68851 = 1;
6815 else
6816 goto unknown;
6818 else
6820 int i;
6822 if (arg[0] == 'c' && arg[1] == '6')
6823 arg++;
6825 for (i = 0; i < n_archs; i++)
6826 if (!strcmp (arg, archs[i].name))
6828 unsigned long arch = archs[i].arch;
6829 if (cpu_of_arch (arch))
6830 /* It's a cpu spec. */
6832 current_architecture &= ~m68000up;
6833 current_architecture |= arch;
6835 else if (arch == m68881)
6837 current_architecture |= m68881;
6838 no_68881 = 0;
6840 else if (arch == m68851)
6842 current_architecture |= m68851;
6843 no_68851 = 0;
6845 else
6846 /* ??? */
6847 abort ();
6848 break;
6850 if (i == n_archs)
6852 as_bad (_("unrecognized architecture specification `%s'"), arg);
6853 return 0;
6856 break;
6858 case OPTION_PIC:
6859 case 'k':
6860 flag_want_pic = 1;
6861 break; /* -pic, Position Independent Code */
6863 case OPTION_REGISTER_PREFIX_OPTIONAL:
6864 flag_reg_prefix_optional = 1;
6865 reg_prefix_optional_seen = 1;
6866 break;
6868 /* -V: SVR4 argument to print version ID. */
6869 case 'V':
6870 print_version_id ();
6871 break;
6873 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
6874 should be emitted or not. FIXME: Not implemented. */
6875 case 'Q':
6876 break;
6878 case OPTION_BITWISE_OR:
6880 char *n, *t;
6881 const char *s;
6883 n = (char *) xmalloc (strlen (m68k_comment_chars) + 1);
6884 t = n;
6885 for (s = m68k_comment_chars; *s != '\0'; s++)
6886 if (*s != '|')
6887 *t++ = *s;
6888 *t = '\0';
6889 m68k_comment_chars = n;
6891 break;
6893 case OPTION_BASE_SIZE_DEFAULT_16:
6894 m68k_index_width_default = SIZE_WORD;
6895 break;
6897 case OPTION_BASE_SIZE_DEFAULT_32:
6898 m68k_index_width_default = SIZE_LONG;
6899 break;
6901 case OPTION_DISP_SIZE_DEFAULT_16:
6902 m68k_rel32 = 0;
6903 m68k_rel32_from_cmdline = 1;
6904 break;
6906 case OPTION_DISP_SIZE_DEFAULT_32:
6907 m68k_rel32 = 1;
6908 m68k_rel32_from_cmdline = 1;
6909 break;
6911 default:
6912 return 0;
6915 return 1;
6918 void
6919 md_show_usage (stream)
6920 FILE *stream;
6922 const char *default_cpu = TARGET_CPU;
6923 int default_arch, i;
6925 /* Get the canonical name for the default target CPU. */
6926 if (*default_cpu == 'm')
6927 default_cpu++;
6928 for (i = 0; i < n_archs; i++)
6930 if (strcasecmp (default_cpu, archs[i].name) == 0)
6932 default_arch = archs[i].arch;
6933 for (i = 0; i < n_archs; i++)
6935 if (archs[i].arch == default_arch
6936 && !archs[i].alias)
6938 default_cpu = archs[i].name;
6939 break;
6945 fprintf (stream, _("\
6946 680X0 options:\n\
6947 -l use 1 word for refs to undefined symbols [default 2]\n\
6948 -m68000 | -m68008 | -m68010 | -m68020 | -m68030 | -m68040 | -m68060 |\n\
6949 -m68302 | -m68331 | -m68332 | -m68333 | -m68340 | -m68360 | -mcpu32 |\n\
6950 -m5200 | -m5202 | -m5204 | -m5206 | -m5206e | -m5307 | -m5407\n\
6951 specify variant of 680X0 architecture [default %s]\n\
6952 -m68881 | -m68882 | -mno-68881 | -mno-68882\n\
6953 target has/lacks floating-point coprocessor\n\
6954 [default yes for 68020, 68030, and cpu32]\n"),
6955 default_cpu);
6956 fprintf (stream, _("\
6957 -m68851 | -mno-68851\n\
6958 target has/lacks memory-management unit coprocessor\n\
6959 [default yes for 68020 and up]\n\
6960 -pic, -k generate position independent code\n\
6961 -S turn jbsr into jsr\n\
6962 --pcrel never turn PC-relative branches into absolute jumps\n\
6963 --register-prefix-optional\n\
6964 recognize register names without prefix character\n\
6965 --bitwise-or do not treat `|' as a comment character\n"));
6966 fprintf (stream, _("\
6967 --base-size-default-16 base reg without size is 16 bits\n\
6968 --base-size-default-32 base reg without size is 32 bits (default)\n\
6969 --disp-size-default-16 displacement with unknown size is 16 bits\n\
6970 --disp-size-default-32 displacement with unknown size is 32 bits (default)\n"));
6973 #ifdef TEST2
6975 /* TEST2: Test md_assemble() */
6976 /* Warning, this routine probably doesn't work anymore */
6978 main ()
6980 struct m68k_it the_ins;
6981 char buf[120];
6982 char *cp;
6983 int n;
6985 m68k_ip_begin ();
6986 for (;;)
6988 if (!gets (buf) || !*buf)
6989 break;
6990 if (buf[0] == '|' || buf[1] == '.')
6991 continue;
6992 for (cp = buf; *cp; cp++)
6993 if (*cp == '\t')
6994 *cp = ' ';
6995 if (is_label (buf))
6996 continue;
6997 memset (&the_ins, '\0', sizeof (the_ins));
6998 m68k_ip (&the_ins, buf);
6999 if (the_ins.error)
7001 printf (_("Error %s in %s\n"), the_ins.error, buf);
7003 else
7005 printf (_("Opcode(%d.%s): "), the_ins.numo, the_ins.args);
7006 for (n = 0; n < the_ins.numo; n++)
7007 printf (" 0x%x", the_ins.opcode[n] & 0xffff);
7008 printf (" ");
7009 print_the_insn (&the_ins.opcode[0], stdout);
7010 (void) putchar ('\n');
7012 for (n = 0; n < strlen (the_ins.args) / 2; n++)
7014 if (the_ins.operands[n].error)
7016 printf ("op%d Error %s in %s\n", n, the_ins.operands[n].error, buf);
7017 continue;
7019 printf ("mode %d, reg %d, ", the_ins.operands[n].mode, the_ins.operands[n].reg);
7020 if (the_ins.operands[n].b_const)
7021 printf ("Constant: '%.*s', ", 1 + the_ins.operands[n].e_const - the_ins.operands[n].b_const, the_ins.operands[n].b_const);
7022 printf ("ireg %d, isiz %d, imul %d, ", the_ins.operands[n].ireg, the_ins.operands[n].isiz, the_ins.operands[n].imul);
7023 if (the_ins.operands[n].b_iadd)
7024 printf ("Iadd: '%.*s',", 1 + the_ins.operands[n].e_iadd - the_ins.operands[n].b_iadd, the_ins.operands[n].b_iadd);
7025 (void) putchar ('\n');
7028 m68k_ip_end ();
7029 return 0;
7032 is_label (str)
7033 char *str;
7035 while (*str == ' ')
7036 str++;
7037 while (*str && *str != ' ')
7038 str++;
7039 if (str[-1] == ':' || str[1] == '=')
7040 return 1;
7041 return 0;
7044 #endif
7046 /* Possible states for relaxation:
7048 0 0 branch offset byte (bra, etc)
7049 0 1 word
7050 0 2 long
7052 1 0 indexed offsets byte a0@(32,d4:w:1) etc
7053 1 1 word
7054 1 2 long
7056 2 0 two-offset index word-word a0@(32,d4)@(45) etc
7057 2 1 word-long
7058 2 2 long-word
7059 2 3 long-long
7063 /* We have no need to default values of symbols. */
7065 symbolS *
7066 md_undefined_symbol (name)
7067 char *name ATTRIBUTE_UNUSED;
7069 return 0;
7072 /* Round up a section size to the appropriate boundary. */
7073 valueT
7074 md_section_align (segment, size)
7075 segT segment ATTRIBUTE_UNUSED;
7076 valueT size;
7078 #ifdef OBJ_AOUT
7079 #ifdef BFD_ASSEMBLER
7080 /* For a.out, force the section size to be aligned. If we don't do
7081 this, BFD will align it for us, but it will not write out the
7082 final bytes of the section. This may be a bug in BFD, but it is
7083 easier to fix it here since that is how the other a.out targets
7084 work. */
7085 int align;
7087 align = bfd_get_section_alignment (stdoutput, segment);
7088 size = ((size + (1 << align) - 1) & ((valueT) -1 << align));
7089 #endif
7090 #endif
7092 return size;
7095 /* Exactly what point is a PC-relative offset relative TO?
7096 On the 68k, it is relative to the address of the first extension
7097 word. The difference between the addresses of the offset and the
7098 first extension word is stored in fx_pcrel_adjust. */
7099 long
7100 md_pcrel_from (fixP)
7101 fixS *fixP;
7103 int adjust;
7105 /* Because fx_pcrel_adjust is a char, and may be unsigned, we explicitly
7106 sign extend the value here. */
7107 adjust = ((fixP->fx_pcrel_adjust & 0xff) ^ 0x80) - 0x80;
7108 if (adjust == 64)
7109 adjust = -1;
7110 return fixP->fx_where + fixP->fx_frag->fr_address - adjust;
7113 #ifndef BFD_ASSEMBLER
7114 #ifdef OBJ_COFF
7116 void
7117 tc_coff_symbol_emit_hook (ignore)
7118 symbolS *ignore ATTRIBUTE_UNUSED;
7123 tc_coff_sizemachdep (frag)
7124 fragS *frag;
7126 switch (frag->fr_subtype & 0x3)
7128 case BYTE:
7129 return 1;
7130 case SHORT:
7131 return 2;
7132 case LONG:
7133 return 4;
7134 default:
7135 abort ();
7136 return 0;
7140 #endif
7141 #endif
7142 #ifdef OBJ_ELF
7143 void
7144 m68k_elf_final_processing ()
7146 /* Set file-specific flags if this is a cpu32 processor */
7147 if (cpu_of_arch (current_architecture) & cpu32)
7148 elf_elfheader (stdoutput)->e_flags |= EF_CPU32;
7149 else if ((cpu_of_arch (current_architecture) & m68000up)
7150 && !(cpu_of_arch (current_architecture) & m68020up))
7151 elf_elfheader (stdoutput)->e_flags |= EF_M68000;
7153 #endif