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