OpenCores
URL https://opencores.org/ocsvn/scarts/scarts/trunk

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-binutils/] [binutils-2.19.1/] [gas/] [config/] [tc-m68k.c] - Blame information for rev 6

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.