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