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