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