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