~ubuntu-branches/ubuntu/hoary/binutils/hoary

« back to all changes in this revision

Viewing changes to gas/config/tc-mn10300.c

  • Committer: Bazaar Package Importer
  • Author(s): James Troup
  • Date: 2004-05-19 10:35:44 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20040519103544-17h3o6e8pwndydrg
Tags: 2.14.90.0.7-8
debian/rules: don't use gcc-2.95 on m68k.  Thanks to Adam Conrad for
pointing this out.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* tc-mn10300.c -- Assembler code for the Matsushita 10300
 
2
   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
 
3
   Free Software Foundation, Inc.
 
4
 
 
5
   This file is part of GAS, the GNU Assembler.
 
6
 
 
7
   GAS is free software; you can redistribute it and/or modify
 
8
   it under the terms of the GNU General Public License as published by
 
9
   the Free Software Foundation; either version 2, or (at your option)
 
10
   any later version.
 
11
 
 
12
   GAS is distributed in the hope that it will be useful,
 
13
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 
14
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
15
   GNU General Public License for more details.
 
16
 
 
17
   You should have received a copy of the GNU General Public License
 
18
   along with GAS; see the file COPYING.  If not, write to
 
19
   the Free Software Foundation, 59 Temple Place - Suite 330,
 
20
   Boston, MA 02111-1307, USA.  */
 
21
 
 
22
#include <stdio.h>
 
23
#include "as.h"
 
24
#include "safe-ctype.h"
 
25
#include "subsegs.h"
 
26
#include "opcode/mn10300.h"
 
27
#include "dwarf2dbg.h"
 
28
 
 
29
/* Structure to hold information about predefined registers.  */
 
30
struct reg_name
 
31
{
 
32
  const char *name;
 
33
  int value;
 
34
};
 
35
 
 
36
/* Generic assembler global variables which must be defined by all
 
37
   targets.  */
 
38
 
 
39
/* Characters which always start a comment.  */
 
40
const char comment_chars[] = "#";
 
41
 
 
42
/* Characters which start a comment at the beginning of a line.  */
 
43
const char line_comment_chars[] = ";#";
 
44
 
 
45
/* Characters which may be used to separate multiple commands on a
 
46
   single line.  */
 
47
const char line_separator_chars[] = ";";
 
48
 
 
49
/* Characters which are used to indicate an exponent in a floating
 
50
   point number.  */
 
51
const char EXP_CHARS[] = "eE";
 
52
 
 
53
/* Characters which mean that a number is a floating point constant,
 
54
   as in 0d1.0.  */
 
55
const char FLT_CHARS[] = "dD";
 
56
 
 
57
const relax_typeS md_relax_table[] = {
 
58
  /* bCC relaxing  */
 
59
  {0x7f, -0x80, 2, 1},
 
60
  {0x7fff, -0x8000, 5, 2},
 
61
  {0x7fffffff, -0x80000000, 7, 0},
 
62
 
 
63
  /* bCC relaxing (uncommon cases)  */
 
64
  {0x7f, -0x80, 3, 4},
 
65
  {0x7fff, -0x8000, 6, 5},
 
66
  {0x7fffffff, -0x80000000, 8, 0},
 
67
 
 
68
  /* call relaxing  */
 
69
  {0x7fff, -0x8000, 5, 7},
 
70
  {0x7fffffff, -0x80000000, 7, 0},
 
71
 
 
72
  /* calls relaxing  */
 
73
  {0x7fff, -0x8000, 4, 9},
 
74
  {0x7fffffff, -0x80000000, 6, 0},
 
75
 
 
76
  /* jmp relaxing  */
 
77
  {0x7f, -0x80, 2, 11},
 
78
  {0x7fff, -0x8000, 3, 12},
 
79
  {0x7fffffff, -0x80000000, 5, 0},
 
80
 
 
81
  /* fbCC relaxing  */
 
82
  {0x7f, -0x80, 3, 14},
 
83
  {0x7fff, -0x8000, 6, 15},
 
84
  {0x7fffffff, -0x80000000, 8, 0},
 
85
 
 
86
};
 
87
 
 
88
/* Local functions.  */
 
89
static void mn10300_insert_operand PARAMS ((unsigned long *, unsigned long *,
 
90
                                            const struct mn10300_operand *,
 
91
                                            offsetT, char *, unsigned,
 
92
                                            unsigned));
 
93
static unsigned long check_operand PARAMS ((unsigned long,
 
94
                                            const struct mn10300_operand *,
 
95
                                            offsetT));
 
96
static int reg_name_search PARAMS ((const struct reg_name *, int, const char *));
 
97
static bfd_boolean data_register_name PARAMS ((expressionS *expressionP));
 
98
static bfd_boolean address_register_name PARAMS ((expressionS *expressionP));
 
99
static bfd_boolean other_register_name PARAMS ((expressionS *expressionP));
 
100
static bfd_boolean r_register_name PARAMS ((expressionS *expressionP));
 
101
static bfd_boolean xr_register_name PARAMS ((expressionS *expressionP));
 
102
static void set_arch_mach PARAMS ((int));
 
103
 
 
104
/*  Set linkrelax here to avoid fixups in most sections.  */
 
105
int linkrelax = 1;
 
106
 
 
107
static int current_machine;
 
108
 
 
109
/* Fixups.  */
 
110
#define MAX_INSN_FIXUPS (5)
 
111
struct mn10300_fixup
 
112
{
 
113
  expressionS exp;
 
114
  int opindex;
 
115
  bfd_reloc_code_real_type reloc;
 
116
};
 
117
struct mn10300_fixup fixups[MAX_INSN_FIXUPS];
 
118
static int fc;
 
119
 
 
120
/* We must store the value of each register operand so that we can
 
121
   verify that certain registers do not match.  */
 
122
int mn10300_reg_operands[MN10300_MAX_OPERANDS];
 
123
 
 
124
const char *md_shortopts = "";
 
125
struct option md_longopts[] = {
 
126
  {NULL, no_argument, NULL, 0}
 
127
};
 
128
size_t md_longopts_size = sizeof (md_longopts);
 
129
 
 
130
/* The target specific pseudo-ops which we support.  */
 
131
const pseudo_typeS md_pseudo_table[] =
 
132
{
 
133
  { "am30",     set_arch_mach,          AM30 },
 
134
  { "am33",     set_arch_mach,          AM33 },
 
135
  { "am33_2",   (void (*) PARAMS ((int))) set_arch_mach, AM33_2 },
 
136
  { "mn10300",  set_arch_mach,          MN103 },
 
137
  {NULL, 0, 0}
 
138
};
 
139
 
 
140
#define HAVE_AM33_2 (current_machine == AM33_2)
 
141
#define HAVE_AM33 (current_machine == AM33 || HAVE_AM33_2)
 
142
#define HAVE_AM30 (current_machine == AM30)
 
143
 
 
144
/* Opcode hash table.  */
 
145
static struct hash_control *mn10300_hash;
 
146
 
 
147
/* This table is sorted. Suitable for searching by a binary search.  */
 
148
static const struct reg_name data_registers[] =
 
149
{
 
150
  { "d0", 0 },
 
151
  { "d1", 1 },
 
152
  { "d2", 2 },
 
153
  { "d3", 3 },
 
154
};
 
155
#define DATA_REG_NAME_CNT                               \
 
156
  (sizeof (data_registers) / sizeof (struct reg_name))
 
157
 
 
158
static const struct reg_name address_registers[] =
 
159
{
 
160
  { "a0", 0 },
 
161
  { "a1", 1 },
 
162
  { "a2", 2 },
 
163
  { "a3", 3 },
 
164
};
 
165
 
 
166
#define ADDRESS_REG_NAME_CNT                                    \
 
167
  (sizeof (address_registers) / sizeof (struct reg_name))
 
168
 
 
169
static const struct reg_name r_registers[] =
 
170
{
 
171
  { "a0", 8 },
 
172
  { "a1", 9 },
 
173
  { "a2", 10 },
 
174
  { "a3", 11 },
 
175
  { "d0", 12 },
 
176
  { "d1", 13 },
 
177
  { "d2", 14 },
 
178
  { "d3", 15 },
 
179
  { "e0", 0 },
 
180
  { "e1", 1 },
 
181
  { "e10", 10 },
 
182
  { "e11", 11 },
 
183
  { "e12", 12 },
 
184
  { "e13", 13 },
 
185
  { "e14", 14 },
 
186
  { "e15", 15 },
 
187
  { "e2", 2 },
 
188
  { "e3", 3 },
 
189
  { "e4", 4 },
 
190
  { "e5", 5 },
 
191
  { "e6", 6 },
 
192
  { "e7", 7 },
 
193
  { "e8", 8 },
 
194
  { "e9", 9 },
 
195
  { "r0", 0 },
 
196
  { "r1", 1 },
 
197
  { "r10", 10 },
 
198
  { "r11", 11 },
 
199
  { "r12", 12 },
 
200
  { "r13", 13 },
 
201
  { "r14", 14 },
 
202
  { "r15", 15 },
 
203
  { "r2", 2 },
 
204
  { "r3", 3 },
 
205
  { "r4", 4 },
 
206
  { "r5", 5 },
 
207
  { "r6", 6 },
 
208
  { "r7", 7 },
 
209
  { "r8", 8 },
 
210
  { "r9", 9 },
 
211
};
 
212
 
 
213
#define R_REG_NAME_CNT                                  \
 
214
  (sizeof (r_registers) / sizeof (struct reg_name))
 
215
 
 
216
static const struct reg_name xr_registers[] =
 
217
{
 
218
  { "mcrh", 2 },
 
219
  { "mcrl", 3 },
 
220
  { "mcvf", 4 },
 
221
  { "mdrq", 1 },
 
222
  { "sp", 0 },
 
223
  { "xr0", 0 },
 
224
  { "xr1", 1 },
 
225
  { "xr10", 10 },
 
226
  { "xr11", 11 },
 
227
  { "xr12", 12 },
 
228
  { "xr13", 13 },
 
229
  { "xr14", 14 },
 
230
  { "xr15", 15 },
 
231
  { "xr2", 2 },
 
232
  { "xr3", 3 },
 
233
  { "xr4", 4 },
 
234
  { "xr5", 5 },
 
235
  { "xr6", 6 },
 
236
  { "xr7", 7 },
 
237
  { "xr8", 8 },
 
238
  { "xr9", 9 },
 
239
};
 
240
 
 
241
#define XR_REG_NAME_CNT                                 \
 
242
  (sizeof (xr_registers) / sizeof (struct reg_name))
 
243
 
 
244
/* We abuse the `value' field, that would be otherwise unused, to
 
245
   encode the architecture on which (access to) the register was
 
246
   introduced.  FIXME: we should probably warn when we encounter a
 
247
   register name when assembling for an architecture that doesn't
 
248
   support it, before parsing it as a symbol name.  */
 
249
static const struct reg_name other_registers[] =
 
250
{
 
251
  { "epsw", AM33 },
 
252
  { "mdr", 0 },
 
253
  { "pc", AM33 },
 
254
  { "psw", 0 },
 
255
  { "sp", 0 },
 
256
};
 
257
 
 
258
#define OTHER_REG_NAME_CNT                              \
 
259
  (sizeof (other_registers) / sizeof (struct reg_name))
 
260
 
 
261
static const struct reg_name float_registers[] =
 
262
{
 
263
  { "fs0", 0 },
 
264
  { "fs1", 1 },
 
265
  { "fs10", 10 },
 
266
  { "fs11", 11 },
 
267
  { "fs12", 12 },
 
268
  { "fs13", 13 },
 
269
  { "fs14", 14 },
 
270
  { "fs15", 15 },
 
271
  { "fs16", 16 },
 
272
  { "fs17", 17 },
 
273
  { "fs18", 18 },
 
274
  { "fs19", 19 },
 
275
  { "fs2",   2 },
 
276
  { "fs20", 20 },
 
277
  { "fs21", 21 },
 
278
  { "fs22", 22 },
 
279
  { "fs23", 23 },
 
280
  { "fs24", 24 },
 
281
  { "fs25", 25 },
 
282
  { "fs26", 26 },
 
283
  { "fs27", 27 },
 
284
  { "fs28", 28 },
 
285
  { "fs29", 29 },
 
286
  { "fs3",   3 },
 
287
  { "fs30", 30 },
 
288
  { "fs31", 31 },
 
289
  { "fs4",   4 },
 
290
  { "fs5",   5 },
 
291
  { "fs6",   6 },
 
292
  { "fs7",   7 },
 
293
  { "fs8",   8 },
 
294
  { "fs9",   9 },
 
295
};
 
296
 
 
297
#define FLOAT_REG_NAME_CNT \
 
298
  (sizeof (float_registers) / sizeof (struct reg_name))
 
299
 
 
300
static const struct reg_name double_registers[] =
 
301
{
 
302
  { "fd0",   0 },
 
303
  { "fd10", 10 },
 
304
  { "fd12", 12 },
 
305
  { "fd14", 14 },
 
306
  { "fd16", 16 },
 
307
  { "fd18", 18 },
 
308
  { "fd2",   2 },
 
309
  { "fd20", 20 },
 
310
  { "fd22", 22 },
 
311
  { "fd24", 24 },
 
312
  { "fd26", 26 },
 
313
  { "fd28", 28 },
 
314
  { "fd30", 30 },
 
315
  { "fd4",   4 },
 
316
  { "fd6",   6 },
 
317
  { "fd8",   8 },
 
318
};
 
319
 
 
320
#define DOUBLE_REG_NAME_CNT \
 
321
  (sizeof (double_registers) / sizeof (struct reg_name))
 
322
 
 
323
 
 
324
/* reg_name_search does a binary search of the given register table
 
325
   to see if "name" is a valid regiter name.  Returns the register
 
326
   number from the array on success, or -1 on failure.  */
 
327
 
 
328
static int
 
329
reg_name_search (regs, regcount, name)
 
330
     const struct reg_name *regs;
 
331
     int regcount;
 
332
     const char *name;
 
333
{
 
334
  int middle, low, high;
 
335
  int cmp;
 
336
 
 
337
  low = 0;
 
338
  high = regcount - 1;
 
339
 
 
340
  do
 
341
    {
 
342
      middle = (low + high) / 2;
 
343
      cmp = strcasecmp (name, regs[middle].name);
 
344
      if (cmp < 0)
 
345
        high = middle - 1;
 
346
      else if (cmp > 0)
 
347
        low = middle + 1;
 
348
      else
 
349
        return regs[middle].value;
 
350
    }
 
351
  while (low <= high);
 
352
  return -1;
 
353
}
 
354
 
 
355
/* Summary of register_name().
 
356
 *
 
357
 * in: Input_line_pointer points to 1st char of operand.
 
358
 *
 
359
 * out: An expressionS.
 
360
 *      The operand may have been a register: in this case, X_op == O_register,
 
361
 *      X_add_number is set to the register number, and truth is returned.
 
362
 *      Input_line_pointer->(next non-blank) char after operand, or is in
 
363
 *      its original state.
 
364
 */
 
365
 
 
366
static bfd_boolean
 
367
r_register_name (expressionP)
 
368
     expressionS *expressionP;
 
369
{
 
370
  int reg_number;
 
371
  char *name;
 
372
  char *start;
 
373
  char c;
 
374
 
 
375
  /* Find the spelling of the operand.  */
 
376
  start = name = input_line_pointer;
 
377
 
 
378
  c = get_symbol_end ();
 
379
  reg_number = reg_name_search (r_registers, R_REG_NAME_CNT, name);
 
380
 
 
381
  /* Put back the delimiting char.  */
 
382
  *input_line_pointer = c;
 
383
 
 
384
  /* Look to see if it's in the register table.  */
 
385
  if (reg_number >= 0)
 
386
    {
 
387
      expressionP->X_op = O_register;
 
388
      expressionP->X_add_number = reg_number;
 
389
 
 
390
      /* Make the rest nice.  */
 
391
      expressionP->X_add_symbol = NULL;
 
392
      expressionP->X_op_symbol = NULL;
 
393
 
 
394
      return TRUE;
 
395
    }
 
396
 
 
397
  /* Reset the line as if we had not done anything.  */
 
398
  input_line_pointer = start;
 
399
  return FALSE;
 
400
}
 
401
 
 
402
/* Summary of register_name().
 
403
 *
 
404
 * in: Input_line_pointer points to 1st char of operand.
 
405
 *
 
406
 * out: An expressionS.
 
407
 *      The operand may have been a register: in this case, X_op == O_register,
 
408
 *      X_add_number is set to the register number, and truth is returned.
 
409
 *      Input_line_pointer->(next non-blank) char after operand, or is in
 
410
 *      its original state.
 
411
 */
 
412
 
 
413
static bfd_boolean
 
414
xr_register_name (expressionP)
 
415
     expressionS *expressionP;
 
416
{
 
417
  int reg_number;
 
418
  char *name;
 
419
  char *start;
 
420
  char c;
 
421
 
 
422
  /* Find the spelling of the operand.  */
 
423
  start = name = input_line_pointer;
 
424
 
 
425
  c = get_symbol_end ();
 
426
  reg_number = reg_name_search (xr_registers, XR_REG_NAME_CNT, name);
 
427
 
 
428
  /* Put back the delimiting char.  */
 
429
  *input_line_pointer = c;
 
430
 
 
431
  /* Look to see if it's in the register table.  */
 
432
  if (reg_number >= 0)
 
433
    {
 
434
      expressionP->X_op = O_register;
 
435
      expressionP->X_add_number = reg_number;
 
436
 
 
437
      /* Make the rest nice.  */
 
438
      expressionP->X_add_symbol = NULL;
 
439
      expressionP->X_op_symbol = NULL;
 
440
 
 
441
      return TRUE;
 
442
    }
 
443
 
 
444
  /* Reset the line as if we had not done anything.  */
 
445
  input_line_pointer = start;
 
446
  return FALSE;
 
447
}
 
448
 
 
449
/* Summary of register_name().
 
450
 *
 
451
 * in: Input_line_pointer points to 1st char of operand.
 
452
 *
 
453
 * out: An expressionS.
 
454
 *      The operand may have been a register: in this case, X_op == O_register,
 
455
 *      X_add_number is set to the register number, and truth is returned.
 
456
 *      Input_line_pointer->(next non-blank) char after operand, or is in
 
457
 *      its original state.
 
458
 */
 
459
 
 
460
static bfd_boolean
 
461
data_register_name (expressionP)
 
462
     expressionS *expressionP;
 
463
{
 
464
  int reg_number;
 
465
  char *name;
 
466
  char *start;
 
467
  char c;
 
468
 
 
469
  /* Find the spelling of the operand.  */
 
470
  start = name = input_line_pointer;
 
471
 
 
472
  c = get_symbol_end ();
 
473
  reg_number = reg_name_search (data_registers, DATA_REG_NAME_CNT, name);
 
474
 
 
475
  /* Put back the delimiting char.  */
 
476
  *input_line_pointer = c;
 
477
 
 
478
  /* Look to see if it's in the register table.  */
 
479
  if (reg_number >= 0)
 
480
    {
 
481
      expressionP->X_op = O_register;
 
482
      expressionP->X_add_number = reg_number;
 
483
 
 
484
      /* Make the rest nice.  */
 
485
      expressionP->X_add_symbol = NULL;
 
486
      expressionP->X_op_symbol = NULL;
 
487
 
 
488
      return TRUE;
 
489
    }
 
490
 
 
491
  /* Reset the line as if we had not done anything.  */
 
492
  input_line_pointer = start;
 
493
  return FALSE;
 
494
}
 
495
 
 
496
/* Summary of register_name().
 
497
 *
 
498
 * in: Input_line_pointer points to 1st char of operand.
 
499
 *
 
500
 * out: An expressionS.
 
501
 *      The operand may have been a register: in this case, X_op == O_register,
 
502
 *      X_add_number is set to the register number, and truth is returned.
 
503
 *      Input_line_pointer->(next non-blank) char after operand, or is in
 
504
 *      its original state.
 
505
 */
 
506
 
 
507
static bfd_boolean
 
508
address_register_name (expressionP)
 
509
     expressionS *expressionP;
 
510
{
 
511
  int reg_number;
 
512
  char *name;
 
513
  char *start;
 
514
  char c;
 
515
 
 
516
  /* Find the spelling of the operand.  */
 
517
  start = name = input_line_pointer;
 
518
 
 
519
  c = get_symbol_end ();
 
520
  reg_number = reg_name_search (address_registers, ADDRESS_REG_NAME_CNT, name);
 
521
 
 
522
  /* Put back the delimiting char.  */
 
523
  *input_line_pointer = c;
 
524
 
 
525
  /* Look to see if it's in the register table.  */
 
526
  if (reg_number >= 0)
 
527
    {
 
528
      expressionP->X_op = O_register;
 
529
      expressionP->X_add_number = reg_number;
 
530
 
 
531
      /* Make the rest nice.  */
 
532
      expressionP->X_add_symbol = NULL;
 
533
      expressionP->X_op_symbol = NULL;
 
534
 
 
535
      return TRUE;
 
536
    }
 
537
 
 
538
  /* Reset the line as if we had not done anything.  */
 
539
  input_line_pointer = start;
 
540
  return FALSE;
 
541
}
 
542
 
 
543
/* Summary of register_name().
 
544
 *
 
545
 * in: Input_line_pointer points to 1st char of operand.
 
546
 *
 
547
 * out: An expressionS.
 
548
 *      The operand may have been a register: in this case, X_op == O_register,
 
549
 *      X_add_number is set to the register number, and truth is returned.
 
550
 *      Input_line_pointer->(next non-blank) char after operand, or is in
 
551
 *      its original state.
 
552
 */
 
553
 
 
554
static bfd_boolean
 
555
other_register_name (expressionP)
 
556
     expressionS *expressionP;
 
557
{
 
558
  int reg_number;
 
559
  char *name;
 
560
  char *start;
 
561
  char c;
 
562
 
 
563
  /* Find the spelling of the operand.  */
 
564
  start = name = input_line_pointer;
 
565
 
 
566
  c = get_symbol_end ();
 
567
  reg_number = reg_name_search (other_registers, OTHER_REG_NAME_CNT, name);
 
568
 
 
569
  /* Put back the delimiting char.  */
 
570
  *input_line_pointer = c;
 
571
 
 
572
  /* Look to see if it's in the register table.  */
 
573
  if (reg_number == 0
 
574
      || (reg_number == AM33 && HAVE_AM33))
 
575
    {
 
576
      expressionP->X_op = O_register;
 
577
      expressionP->X_add_number = 0;
 
578
 
 
579
      /* Make the rest nice.  */
 
580
      expressionP->X_add_symbol = NULL;
 
581
      expressionP->X_op_symbol = NULL;
 
582
 
 
583
      return TRUE;
 
584
    }
 
585
 
 
586
  /* Reset the line as if we had not done anything.  */
 
587
  input_line_pointer = start;
 
588
  return FALSE;
 
589
}
 
590
 
 
591
static bfd_boolean double_register_name PARAMS ((expressionS *));
 
592
static bfd_boolean float_register_name  PARAMS ((expressionS *));
 
593
 
 
594
/* Summary of float_register_name:
 
595
 
 
596
   in: Input_line_pointer points to 1st char of operand.
 
597
 
 
598
   out: A expressionS.
 
599
        The operand may have been a register: in this case, X_op == O_register,
 
600
        X_add_number is set to the register number, and truth is returned.
 
601
        Input_line_pointer->(next non-blank) char after operand, or is in
 
602
        its original state.  */
 
603
 
 
604
static bfd_boolean
 
605
float_register_name (expressionP)
 
606
     expressionS *expressionP;
 
607
{
 
608
  int reg_number;
 
609
  char *name;
 
610
  char *start;
 
611
  char c;
 
612
 
 
613
  /* Find the spelling of the operand.  */
 
614
  start = name = input_line_pointer;
 
615
 
 
616
  c = get_symbol_end ();
 
617
  reg_number = reg_name_search (float_registers, FLOAT_REG_NAME_CNT, name);
 
618
 
 
619
  /* Put back the delimiting char.  */
 
620
  * input_line_pointer = c;
 
621
 
 
622
  /* Look to see if it's in the register table.  */
 
623
  if (reg_number >= 0)
 
624
    {
 
625
      expressionP->X_op = O_register;
 
626
      expressionP->X_add_number = reg_number;
 
627
 
 
628
      /* Make the rest nice.  */
 
629
      expressionP->X_add_symbol = NULL;
 
630
      expressionP->X_op_symbol = NULL;
 
631
 
 
632
      return TRUE;
 
633
    }
 
634
 
 
635
  /* Reset the line as if we had not done anything.  */
 
636
  input_line_pointer = start;
 
637
  return FALSE;
 
638
}
 
639
 
 
640
/* Summary of double_register_name:
 
641
 
 
642
   in: Input_line_pointer points to 1st char of operand.
 
643
 
 
644
   out: A expressionS.
 
645
        The operand may have been a register: in this case, X_op == O_register,
 
646
        X_add_number is set to the register number, and truth is returned.
 
647
        Input_line_pointer->(next non-blank) char after operand, or is in
 
648
        its original state.  */
 
649
 
 
650
static bfd_boolean
 
651
double_register_name (expressionP)
 
652
     expressionS *expressionP;
 
653
{
 
654
  int reg_number;
 
655
  char *name;
 
656
  char *start;
 
657
  char c;
 
658
 
 
659
  /* Find the spelling of the operand.  */
 
660
  start = name = input_line_pointer;
 
661
 
 
662
  c = get_symbol_end ();
 
663
  reg_number = reg_name_search (double_registers, DOUBLE_REG_NAME_CNT, name);
 
664
 
 
665
  /* Put back the delimiting char.  */
 
666
  * input_line_pointer = c;
 
667
 
 
668
  /* Look to see if it's in the register table.  */
 
669
  if (reg_number >= 0)
 
670
    {
 
671
      expressionP->X_op = O_register;
 
672
      expressionP->X_add_number = reg_number;
 
673
 
 
674
      /* Make the rest nice.  */
 
675
      expressionP->X_add_symbol = NULL;
 
676
      expressionP->X_op_symbol = NULL;
 
677
 
 
678
      return TRUE;
 
679
    }
 
680
 
 
681
  /* Reset the line as if we had not done anything.  */
 
682
  input_line_pointer = start;
 
683
  return FALSE;
 
684
}
 
685
 
 
686
void
 
687
md_show_usage (stream)
 
688
     FILE *stream;
 
689
{
 
690
  fprintf (stream, _("MN10300 options:\n\
 
691
none yet\n"));
 
692
}
 
693
 
 
694
int
 
695
md_parse_option (c, arg)
 
696
     int c ATTRIBUTE_UNUSED;
 
697
     char *arg ATTRIBUTE_UNUSED;
 
698
{
 
699
  return 0;
 
700
}
 
701
 
 
702
symbolS *
 
703
md_undefined_symbol (name)
 
704
     char *name ATTRIBUTE_UNUSED;
 
705
{
 
706
  return 0;
 
707
}
 
708
 
 
709
char *
 
710
md_atof (type, litp, sizep)
 
711
     int type;
 
712
     char *litp;
 
713
     int *sizep;
 
714
{
 
715
  int prec;
 
716
  LITTLENUM_TYPE words[4];
 
717
  char *t;
 
718
  int i;
 
719
 
 
720
  switch (type)
 
721
    {
 
722
    case 'f':
 
723
      prec = 2;
 
724
      break;
 
725
 
 
726
    case 'd':
 
727
      prec = 4;
 
728
      break;
 
729
 
 
730
    default:
 
731
      *sizep = 0;
 
732
      return "bad call to md_atof";
 
733
    }
 
734
 
 
735
  t = atof_ieee (input_line_pointer, type, words);
 
736
  if (t)
 
737
    input_line_pointer = t;
 
738
 
 
739
  *sizep = prec * 2;
 
740
 
 
741
  for (i = prec - 1; i >= 0; i--)
 
742
    {
 
743
      md_number_to_chars (litp, (valueT) words[i], 2);
 
744
      litp += 2;
 
745
    }
 
746
 
 
747
  return NULL;
 
748
}
 
749
 
 
750
void
 
751
md_convert_frag (abfd, sec, fragP)
 
752
     bfd *abfd ATTRIBUTE_UNUSED;
 
753
     asection *sec;
 
754
     fragS *fragP;
 
755
{
 
756
  static unsigned long label_count = 0;
 
757
  char buf[40];
 
758
 
 
759
  subseg_change (sec, 0);
 
760
  if (fragP->fr_subtype == 0)
 
761
    {
 
762
      fix_new (fragP, fragP->fr_fix + 1, 1, fragP->fr_symbol,
 
763
               fragP->fr_offset + 1, 1, BFD_RELOC_8_PCREL);
 
764
      fragP->fr_var = 0;
 
765
      fragP->fr_fix += 2;
 
766
    }
 
767
  else if (fragP->fr_subtype == 1)
 
768
    {
 
769
      /* Reverse the condition of the first branch.  */
 
770
      int offset = fragP->fr_fix;
 
771
      int opcode = fragP->fr_literal[offset] & 0xff;
 
772
 
 
773
      switch (opcode)
 
774
        {
 
775
        case 0xc8:
 
776
          opcode = 0xc9;
 
777
          break;
 
778
        case 0xc9:
 
779
          opcode = 0xc8;
 
780
          break;
 
781
        case 0xc0:
 
782
          opcode = 0xc2;
 
783
          break;
 
784
        case 0xc2:
 
785
          opcode = 0xc0;
 
786
          break;
 
787
        case 0xc3:
 
788
          opcode = 0xc1;
 
789
          break;
 
790
        case 0xc1:
 
791
          opcode = 0xc3;
 
792
          break;
 
793
        case 0xc4:
 
794
          opcode = 0xc6;
 
795
          break;
 
796
        case 0xc6:
 
797
          opcode = 0xc4;
 
798
          break;
 
799
        case 0xc7:
 
800
          opcode = 0xc5;
 
801
          break;
 
802
        case 0xc5:
 
803
          opcode = 0xc7;
 
804
          break;
 
805
        default:
 
806
          abort ();
 
807
        }
 
808
      fragP->fr_literal[offset] = opcode;
 
809
 
 
810
      /* Create a fixup for the reversed conditional branch.  */
 
811
      sprintf (buf, ".%s_%ld", FAKE_LABEL_NAME, label_count++);
 
812
      fix_new (fragP, fragP->fr_fix + 1, 1,
 
813
               symbol_new (buf, sec, 0, fragP->fr_next),
 
814
               fragP->fr_offset + 1, 1, BFD_RELOC_8_PCREL);
 
815
 
 
816
      /* Now create the unconditional branch + fixup to the
 
817
         final target.  */
 
818
      fragP->fr_literal[offset + 2] = 0xcc;
 
819
      fix_new (fragP, fragP->fr_fix + 3, 2, fragP->fr_symbol,
 
820
               fragP->fr_offset + 1, 1, BFD_RELOC_16_PCREL);
 
821
      fragP->fr_var = 0;
 
822
      fragP->fr_fix += 5;
 
823
    }
 
824
  else if (fragP->fr_subtype == 2)
 
825
    {
 
826
      /* Reverse the condition of the first branch.  */
 
827
      int offset = fragP->fr_fix;
 
828
      int opcode = fragP->fr_literal[offset] & 0xff;
 
829
 
 
830
      switch (opcode)
 
831
        {
 
832
        case 0xc8:
 
833
          opcode = 0xc9;
 
834
          break;
 
835
        case 0xc9:
 
836
          opcode = 0xc8;
 
837
          break;
 
838
        case 0xc0:
 
839
          opcode = 0xc2;
 
840
          break;
 
841
        case 0xc2:
 
842
          opcode = 0xc0;
 
843
          break;
 
844
        case 0xc3:
 
845
          opcode = 0xc1;
 
846
          break;
 
847
        case 0xc1:
 
848
          opcode = 0xc3;
 
849
          break;
 
850
        case 0xc4:
 
851
          opcode = 0xc6;
 
852
          break;
 
853
        case 0xc6:
 
854
          opcode = 0xc4;
 
855
          break;
 
856
        case 0xc7:
 
857
          opcode = 0xc5;
 
858
          break;
 
859
        case 0xc5:
 
860
          opcode = 0xc7;
 
861
          break;
 
862
        default:
 
863
          abort ();
 
864
        }
 
865
      fragP->fr_literal[offset] = opcode;
 
866
 
 
867
      /* Create a fixup for the reversed conditional branch.  */
 
868
      sprintf (buf, ".%s_%ld", FAKE_LABEL_NAME, label_count++);
 
869
      fix_new (fragP, fragP->fr_fix + 1, 1,
 
870
               symbol_new (buf, sec, 0, fragP->fr_next),
 
871
               fragP->fr_offset + 1, 1, BFD_RELOC_8_PCREL);
 
872
 
 
873
      /* Now create the unconditional branch + fixup to the
 
874
         final target.  */
 
875
      fragP->fr_literal[offset + 2] = 0xdc;
 
876
      fix_new (fragP, fragP->fr_fix + 3, 4, fragP->fr_symbol,
 
877
               fragP->fr_offset + 1, 1, BFD_RELOC_32_PCREL);
 
878
      fragP->fr_var = 0;
 
879
      fragP->fr_fix += 7;
 
880
    }
 
881
  else if (fragP->fr_subtype == 3)
 
882
    {
 
883
      fix_new (fragP, fragP->fr_fix + 2, 1, fragP->fr_symbol,
 
884
               fragP->fr_offset + 2, 1, BFD_RELOC_8_PCREL);
 
885
      fragP->fr_var = 0;
 
886
      fragP->fr_fix += 3;
 
887
    }
 
888
  else if (fragP->fr_subtype == 4)
 
889
    {
 
890
      /* Reverse the condition of the first branch.  */
 
891
      int offset = fragP->fr_fix;
 
892
      int opcode = fragP->fr_literal[offset + 1] & 0xff;
 
893
 
 
894
      switch (opcode)
 
895
        {
 
896
        case 0xe8:
 
897
          opcode = 0xe9;
 
898
          break;
 
899
        case 0xe9:
 
900
          opcode = 0xe8;
 
901
          break;
 
902
        case 0xea:
 
903
          opcode = 0xeb;
 
904
          break;
 
905
        case 0xeb:
 
906
          opcode = 0xea;
 
907
          break;
 
908
        default:
 
909
          abort ();
 
910
        }
 
911
      fragP->fr_literal[offset + 1] = opcode;
 
912
 
 
913
      /* Create a fixup for the reversed conditional branch.  */
 
914
      sprintf (buf, ".%s_%ld", FAKE_LABEL_NAME, label_count++);
 
915
      fix_new (fragP, fragP->fr_fix + 2, 1,
 
916
               symbol_new (buf, sec, 0, fragP->fr_next),
 
917
               fragP->fr_offset + 2, 1, BFD_RELOC_8_PCREL);
 
918
 
 
919
      /* Now create the unconditional branch + fixup to the
 
920
         final target.  */
 
921
      fragP->fr_literal[offset + 3] = 0xcc;
 
922
      fix_new (fragP, fragP->fr_fix + 4, 2, fragP->fr_symbol,
 
923
               fragP->fr_offset + 1, 1, BFD_RELOC_16_PCREL);
 
924
      fragP->fr_var = 0;
 
925
      fragP->fr_fix += 6;
 
926
    }
 
927
  else if (fragP->fr_subtype == 5)
 
928
    {
 
929
      /* Reverse the condition of the first branch.  */
 
930
      int offset = fragP->fr_fix;
 
931
      int opcode = fragP->fr_literal[offset + 1] & 0xff;
 
932
 
 
933
      switch (opcode)
 
934
        {
 
935
        case 0xe8:
 
936
          opcode = 0xe9;
 
937
          break;
 
938
        case 0xea:
 
939
          opcode = 0xeb;
 
940
          break;
 
941
        case 0xeb:
 
942
          opcode = 0xea;
 
943
          break;
 
944
        default:
 
945
          abort ();
 
946
        }
 
947
      fragP->fr_literal[offset + 1] = opcode;
 
948
 
 
949
      /* Create a fixup for the reversed conditional branch.  */
 
950
      sprintf (buf, ".%s_%ld", FAKE_LABEL_NAME, label_count++);
 
951
      fix_new (fragP, fragP->fr_fix + 2, 1,
 
952
               symbol_new (buf, sec, 0, fragP->fr_next),
 
953
               fragP->fr_offset + 2, 1, BFD_RELOC_8_PCREL);
 
954
 
 
955
      /* Now create the unconditional branch + fixup to the
 
956
         final target.  */
 
957
      fragP->fr_literal[offset + 3] = 0xdc;
 
958
      fix_new (fragP, fragP->fr_fix + 4, 4, fragP->fr_symbol,
 
959
               fragP->fr_offset + 1, 1, BFD_RELOC_32_PCREL);
 
960
      fragP->fr_var = 0;
 
961
      fragP->fr_fix += 8;
 
962
    }
 
963
  else if (fragP->fr_subtype == 6)
 
964
    {
 
965
      int offset = fragP->fr_fix;
 
966
      fragP->fr_literal[offset] = 0xcd;
 
967
      fix_new (fragP, fragP->fr_fix + 1, 2, fragP->fr_symbol,
 
968
               fragP->fr_offset + 1, 1, BFD_RELOC_16_PCREL);
 
969
      fragP->fr_var = 0;
 
970
      fragP->fr_fix += 5;
 
971
    }
 
972
  else if (fragP->fr_subtype == 7)
 
973
    {
 
974
      int offset = fragP->fr_fix;
 
975
      fragP->fr_literal[offset] = 0xdd;
 
976
      fragP->fr_literal[offset + 5] = fragP->fr_literal[offset + 3];
 
977
      fragP->fr_literal[offset + 6] = fragP->fr_literal[offset + 4];
 
978
 
 
979
      fix_new (fragP, fragP->fr_fix + 1, 4, fragP->fr_symbol,
 
980
               fragP->fr_offset + 1, 1, BFD_RELOC_32_PCREL);
 
981
      fragP->fr_var = 0;
 
982
      fragP->fr_fix += 7;
 
983
    }
 
984
  else if (fragP->fr_subtype == 8)
 
985
    {
 
986
      int offset = fragP->fr_fix;
 
987
      fragP->fr_literal[offset] = 0xfa;
 
988
      fragP->fr_literal[offset + 1] = 0xff;
 
989
      fix_new (fragP, fragP->fr_fix + 2, 2, fragP->fr_symbol,
 
990
               fragP->fr_offset + 2, 1, BFD_RELOC_16_PCREL);
 
991
      fragP->fr_var = 0;
 
992
      fragP->fr_fix += 4;
 
993
    }
 
994
  else if (fragP->fr_subtype == 9)
 
995
    {
 
996
      int offset = fragP->fr_fix;
 
997
      fragP->fr_literal[offset] = 0xfc;
 
998
      fragP->fr_literal[offset + 1] = 0xff;
 
999
 
 
1000
      fix_new (fragP, fragP->fr_fix + 2, 4, fragP->fr_symbol,
 
1001
               fragP->fr_offset + 2, 1, BFD_RELOC_32_PCREL);
 
1002
      fragP->fr_var = 0;
 
1003
      fragP->fr_fix += 6;
 
1004
    }
 
1005
  else if (fragP->fr_subtype == 10)
 
1006
    {
 
1007
      fragP->fr_literal[fragP->fr_fix] = 0xca;
 
1008
      fix_new (fragP, fragP->fr_fix + 1, 1, fragP->fr_symbol,
 
1009
               fragP->fr_offset + 1, 1, BFD_RELOC_8_PCREL);
 
1010
      fragP->fr_var = 0;
 
1011
      fragP->fr_fix += 2;
 
1012
    }
 
1013
  else if (fragP->fr_subtype == 11)
 
1014
    {
 
1015
      int offset = fragP->fr_fix;
 
1016
      fragP->fr_literal[offset] = 0xcc;
 
1017
 
 
1018
      fix_new (fragP, fragP->fr_fix + 1, 4, fragP->fr_symbol,
 
1019
               fragP->fr_offset + 1, 1, BFD_RELOC_16_PCREL);
 
1020
      fragP->fr_var = 0;
 
1021
      fragP->fr_fix += 3;
 
1022
    }
 
1023
  else if (fragP->fr_subtype == 12)
 
1024
    {
 
1025
      int offset = fragP->fr_fix;
 
1026
      fragP->fr_literal[offset] = 0xdc;
 
1027
 
 
1028
      fix_new (fragP, fragP->fr_fix + 1, 4, fragP->fr_symbol,
 
1029
               fragP->fr_offset + 1, 1, BFD_RELOC_32_PCREL);
 
1030
      fragP->fr_var = 0;
 
1031
      fragP->fr_fix += 5;
 
1032
    }
 
1033
  else if (fragP->fr_subtype == 13)
 
1034
    {
 
1035
      fix_new (fragP, fragP->fr_fix + 2, 1, fragP->fr_symbol,
 
1036
               fragP->fr_offset + 2, 1, BFD_RELOC_8_PCREL);
 
1037
      fragP->fr_var = 0;
 
1038
      fragP->fr_fix += 3;
 
1039
    }
 
1040
  else if (fragP->fr_subtype == 14)
 
1041
    {
 
1042
      /* Reverse the condition of the first branch.  */
 
1043
      int offset = fragP->fr_fix;
 
1044
      int opcode = fragP->fr_literal[offset + 1] & 0xff;
 
1045
 
 
1046
      switch (opcode)
 
1047
        {
 
1048
        case 0xd0:
 
1049
          opcode = 0xd1;
 
1050
          break;
 
1051
        case 0xd1:
 
1052
          opcode = 0xd0;
 
1053
          break;
 
1054
        case 0xd2:
 
1055
          opcode = 0xdc;
 
1056
          break;
 
1057
        case 0xd3:
 
1058
          opcode = 0xdb;
 
1059
          break;
 
1060
        case 0xd4:
 
1061
          opcode = 0xda;
 
1062
          break;
 
1063
        case 0xd5:
 
1064
          opcode = 0xd9;
 
1065
          break;
 
1066
        case 0xd6:
 
1067
          opcode = 0xd8;
 
1068
          break;
 
1069
        case 0xd7:
 
1070
          opcode = 0xdd;
 
1071
          break;
 
1072
        case 0xd8:
 
1073
          opcode = 0xd6;
 
1074
          break;
 
1075
        case 0xd9:
 
1076
          opcode = 0xd5;
 
1077
          break;
 
1078
        case 0xda:
 
1079
          opcode = 0xd4;
 
1080
          break;
 
1081
        case 0xdb:
 
1082
          opcode = 0xd3;
 
1083
          break;
 
1084
        case 0xdc:
 
1085
          opcode = 0xd2;
 
1086
          break;
 
1087
        case 0xdd:
 
1088
          opcode = 0xd7;
 
1089
          break;
 
1090
        default:
 
1091
          abort ();
 
1092
        }
 
1093
      fragP->fr_literal[offset + 1] = opcode;
 
1094
 
 
1095
      /* Create a fixup for the reversed conditional branch.  */
 
1096
      sprintf (buf, ".%s_%ld", FAKE_LABEL_NAME, label_count++);
 
1097
      fix_new (fragP, fragP->fr_fix + 2, 1,
 
1098
               symbol_new (buf, sec, 0, fragP->fr_next),
 
1099
               fragP->fr_offset + 2, 1, BFD_RELOC_8_PCREL);
 
1100
 
 
1101
      /* Now create the unconditional branch + fixup to the
 
1102
         final target.  */
 
1103
      fragP->fr_literal[offset + 3] = 0xcc;
 
1104
      fix_new (fragP, fragP->fr_fix + 4, 2, fragP->fr_symbol,
 
1105
               fragP->fr_offset + 1, 1, BFD_RELOC_16_PCREL);
 
1106
      fragP->fr_var = 0;
 
1107
      fragP->fr_fix += 6;
 
1108
    }
 
1109
  else if (fragP->fr_subtype == 15)
 
1110
    {
 
1111
      /* Reverse the condition of the first branch.  */
 
1112
      int offset = fragP->fr_fix;
 
1113
      int opcode = fragP->fr_literal[offset + 1] & 0xff;
 
1114
 
 
1115
      switch (opcode)
 
1116
        {
 
1117
        case 0xd0:
 
1118
          opcode = 0xd1;
 
1119
          break;
 
1120
        case 0xd1:
 
1121
          opcode = 0xd0;
 
1122
          break;
 
1123
        case 0xd2:
 
1124
          opcode = 0xdc;
 
1125
          break;
 
1126
        case 0xd3:
 
1127
          opcode = 0xdb;
 
1128
          break;
 
1129
        case 0xd4:
 
1130
          opcode = 0xda;
 
1131
          break;
 
1132
        case 0xd5:
 
1133
          opcode = 0xd9;
 
1134
          break;
 
1135
        case 0xd6:
 
1136
          opcode = 0xd8;
 
1137
          break;
 
1138
        case 0xd7:
 
1139
          opcode = 0xdd;
 
1140
          break;
 
1141
        case 0xd8:
 
1142
          opcode = 0xd6;
 
1143
          break;
 
1144
        case 0xd9:
 
1145
          opcode = 0xd5;
 
1146
          break;
 
1147
        case 0xda:
 
1148
          opcode = 0xd4;
 
1149
          break;
 
1150
        case 0xdb:
 
1151
          opcode = 0xd3;
 
1152
          break;
 
1153
        case 0xdc:
 
1154
          opcode = 0xd2;
 
1155
          break;
 
1156
        case 0xdd:
 
1157
          opcode = 0xd7;
 
1158
          break;
 
1159
        default:
 
1160
          abort ();
 
1161
        }
 
1162
      fragP->fr_literal[offset + 1] = opcode;
 
1163
 
 
1164
      /* Create a fixup for the reversed conditional branch.  */
 
1165
      sprintf (buf, ".%s_%ld", FAKE_LABEL_NAME, label_count++);
 
1166
      fix_new (fragP, fragP->fr_fix + 2, 1,
 
1167
               symbol_new (buf, sec, 0, fragP->fr_next),
 
1168
               fragP->fr_offset + 2, 1, BFD_RELOC_8_PCREL);
 
1169
 
 
1170
      /* Now create the unconditional branch + fixup to the
 
1171
         final target.  */
 
1172
      fragP->fr_literal[offset + 3] = 0xdc;
 
1173
      fix_new (fragP, fragP->fr_fix + 4, 4, fragP->fr_symbol,
 
1174
               fragP->fr_offset + 1, 1, BFD_RELOC_32_PCREL);
 
1175
      fragP->fr_var = 0;
 
1176
      fragP->fr_fix += 8;
 
1177
    }
 
1178
  else
 
1179
    abort ();
 
1180
}
 
1181
 
 
1182
valueT
 
1183
md_section_align (seg, addr)
 
1184
     asection *seg;
 
1185
     valueT addr;
 
1186
{
 
1187
  int align = bfd_get_section_alignment (stdoutput, seg);
 
1188
  return ((addr + (1 << align) - 1) & (-1 << align));
 
1189
}
 
1190
 
 
1191
void
 
1192
md_begin ()
 
1193
{
 
1194
  char *prev_name = "";
 
1195
  register const struct mn10300_opcode *op;
 
1196
 
 
1197
  mn10300_hash = hash_new ();
 
1198
 
 
1199
  /* Insert unique names into hash table.  The MN10300 instruction set
 
1200
     has many identical opcode names that have different opcodes based
 
1201
     on the operands.  This hash table then provides a quick index to
 
1202
     the first opcode with a particular name in the opcode table.  */
 
1203
 
 
1204
  op = mn10300_opcodes;
 
1205
  while (op->name)
 
1206
    {
 
1207
      if (strcmp (prev_name, op->name))
 
1208
        {
 
1209
          prev_name = (char *) op->name;
 
1210
          hash_insert (mn10300_hash, op->name, (char *) op);
 
1211
        }
 
1212
      op++;
 
1213
    }
 
1214
 
 
1215
  /* Set the default machine type.  */
 
1216
#ifdef TE_LINUX
 
1217
  if (!bfd_set_arch_mach (stdoutput, bfd_arch_mn10300, AM33_2))
 
1218
    as_warn (_("could not set architecture and machine"));
 
1219
 
 
1220
  current_machine = AM33_2;
 
1221
#else  
 
1222
  if (!bfd_set_arch_mach (stdoutput, bfd_arch_mn10300, MN103))
 
1223
    as_warn (_("could not set architecture and machine"));
 
1224
 
 
1225
  current_machine = MN103;
 
1226
#endif
 
1227
}
 
1228
 
 
1229
static symbolS *GOT_symbol;
 
1230
 
 
1231
static inline int mn10300_check_fixup PARAMS ((struct mn10300_fixup *));
 
1232
static inline int mn10300_PIC_related_p PARAMS ((symbolS *));
 
1233
 
 
1234
static inline int
 
1235
mn10300_PIC_related_p (sym)
 
1236
     symbolS *sym;
 
1237
{
 
1238
  expressionS *exp;
 
1239
 
 
1240
  if (! sym)
 
1241
    return 0;
 
1242
 
 
1243
  if (sym == GOT_symbol)
 
1244
    return 1;
 
1245
 
 
1246
  exp = symbol_get_value_expression (sym);
 
1247
 
 
1248
  return (exp->X_op == O_PIC_reloc
 
1249
          || mn10300_PIC_related_p (exp->X_add_symbol)
 
1250
          || mn10300_PIC_related_p (exp->X_op_symbol));
 
1251
}
 
1252
 
 
1253
static inline int
 
1254
mn10300_check_fixup (fixup)
 
1255
     struct mn10300_fixup *fixup;
 
1256
{
 
1257
  expressionS *exp = &fixup->exp;
 
1258
 
 
1259
 repeat:
 
1260
  switch (exp->X_op)
 
1261
    {
 
1262
    case O_add:
 
1263
    case O_subtract: /* If we're sufficiently unlucky that the label
 
1264
                        and the expression that references it happen
 
1265
                        to end up in different frags, the subtract
 
1266
                        won't be simplified within expression().  */
 
1267
      /* The PIC-related operand must be the first operand of a sum.  */
 
1268
      if (exp != &fixup->exp || mn10300_PIC_related_p (exp->X_op_symbol))
 
1269
        return 1;
 
1270
 
 
1271
      if (exp->X_add_symbol && exp->X_add_symbol == GOT_symbol)
 
1272
        fixup->reloc = BFD_RELOC_32_GOT_PCREL;
 
1273
 
 
1274
      exp = symbol_get_value_expression (exp->X_add_symbol);
 
1275
      goto repeat;
 
1276
 
 
1277
    case O_symbol:
 
1278
      if (exp->X_add_symbol && exp->X_add_symbol == GOT_symbol)
 
1279
        fixup->reloc = BFD_RELOC_32_GOT_PCREL;
 
1280
      break;
 
1281
 
 
1282
    case O_PIC_reloc:
 
1283
      fixup->reloc = exp->X_md;
 
1284
      exp->X_op = O_symbol;
 
1285
      if (fixup->reloc == BFD_RELOC_32_PLT_PCREL
 
1286
          && fixup->opindex >= 0
 
1287
          && (mn10300_operands[fixup->opindex].flags
 
1288
              & MN10300_OPERAND_RELAX))
 
1289
        return 1;
 
1290
      break;
 
1291
 
 
1292
    default:
 
1293
      return (mn10300_PIC_related_p (exp->X_add_symbol)
 
1294
              || mn10300_PIC_related_p (exp->X_op_symbol));
 
1295
    }
 
1296
 
 
1297
  return 0;
 
1298
}
 
1299
 
 
1300
void
 
1301
mn10300_cons_fix_new (frag, off, size, exp)
 
1302
     fragS *frag;
 
1303
     int off, size;
 
1304
     expressionS *exp;
 
1305
{
 
1306
  struct mn10300_fixup fixup;
 
1307
 
 
1308
  fixup.opindex = -1;
 
1309
  fixup.exp = *exp;
 
1310
  fixup.reloc = BFD_RELOC_UNUSED;
 
1311
 
 
1312
  mn10300_check_fixup (&fixup);
 
1313
 
 
1314
  if (fixup.reloc == BFD_RELOC_MN10300_GOT32)
 
1315
    switch (size)
 
1316
      {
 
1317
      case 2:
 
1318
        fixup.reloc = BFD_RELOC_MN10300_GOT16;
 
1319
        break;
 
1320
 
 
1321
      case 3:
 
1322
        fixup.reloc = BFD_RELOC_MN10300_GOT24;
 
1323
        break;
 
1324
 
 
1325
      case 4:
 
1326
        break;
 
1327
 
 
1328
      default:
 
1329
        goto error;
 
1330
      }
 
1331
  else if (fixup.reloc == BFD_RELOC_UNUSED)
 
1332
    switch (size)
 
1333
      {
 
1334
      case 1:
 
1335
        fixup.reloc = BFD_RELOC_8;
 
1336
        break;
 
1337
 
 
1338
      case 2:
 
1339
        fixup.reloc = BFD_RELOC_16;
 
1340
        break;
 
1341
 
 
1342
      case 3:
 
1343
        fixup.reloc = BFD_RELOC_24;
 
1344
        break;
 
1345
 
 
1346
      case 4:
 
1347
        fixup.reloc = BFD_RELOC_32;
 
1348
        break;
 
1349
 
 
1350
      default:
 
1351
        goto error;
 
1352
      }
 
1353
  else if (size != 4)
 
1354
    {
 
1355
    error:
 
1356
      as_bad (_("unsupported BFD relocation size %u"), size);
 
1357
      fixup.reloc = BFD_RELOC_UNUSED;
 
1358
    }
 
1359
    
 
1360
  fix_new_exp (frag, off, size, &fixup.exp, 0, fixup.reloc);
 
1361
}
 
1362
 
 
1363
void
 
1364
md_assemble (str)
 
1365
     char *str;
 
1366
{
 
1367
  char *s;
 
1368
  struct mn10300_opcode *opcode;
 
1369
  struct mn10300_opcode *next_opcode;
 
1370
  const unsigned char *opindex_ptr;
 
1371
  int next_opindex, relaxable;
 
1372
  unsigned long insn, extension, size = 0;
 
1373
  char *f;
 
1374
  int i;
 
1375
  int match;
 
1376
 
 
1377
  /* Get the opcode.  */
 
1378
  for (s = str; *s != '\0' && !ISSPACE (*s); s++)
 
1379
    ;
 
1380
  if (*s != '\0')
 
1381
    *s++ = '\0';
 
1382
 
 
1383
  /* Find the first opcode with the proper name.  */
 
1384
  opcode = (struct mn10300_opcode *) hash_find (mn10300_hash, str);
 
1385
  if (opcode == NULL)
 
1386
    {
 
1387
      as_bad (_("Unrecognized opcode: `%s'"), str);
 
1388
      return;
 
1389
    }
 
1390
 
 
1391
  str = s;
 
1392
  while (ISSPACE (*str))
 
1393
    ++str;
 
1394
 
 
1395
  input_line_pointer = str;
 
1396
 
 
1397
  for (;;)
 
1398
    {
 
1399
      const char *errmsg;
 
1400
      int op_idx;
 
1401
      char *hold;
 
1402
      int extra_shift = 0;
 
1403
 
 
1404
      errmsg = _("Invalid opcode/operands");
 
1405
 
 
1406
      /* Reset the array of register operands.  */
 
1407
      memset (mn10300_reg_operands, -1, sizeof (mn10300_reg_operands));
 
1408
 
 
1409
      relaxable = 0;
 
1410
      fc = 0;
 
1411
      match = 0;
 
1412
      next_opindex = 0;
 
1413
      insn = opcode->opcode;
 
1414
      extension = 0;
 
1415
 
 
1416
      /* If the instruction is not available on the current machine
 
1417
         then it can not possibly match.  */
 
1418
      if (opcode->machine
 
1419
          && !(opcode->machine == AM33_2 && HAVE_AM33_2)
 
1420
          && !(opcode->machine == AM33 && HAVE_AM33)
 
1421
          && !(opcode->machine == AM30 && HAVE_AM30))
 
1422
        goto error;
 
1423
 
 
1424
      for (op_idx = 1, opindex_ptr = opcode->operands;
 
1425
           *opindex_ptr != 0;
 
1426
           opindex_ptr++, op_idx++)
 
1427
        {
 
1428
          const struct mn10300_operand *operand;
 
1429
          expressionS ex;
 
1430
 
 
1431
          if (next_opindex == 0)
 
1432
            {
 
1433
              operand = &mn10300_operands[*opindex_ptr];
 
1434
            }
 
1435
          else
 
1436
            {
 
1437
              operand = &mn10300_operands[next_opindex];
 
1438
              next_opindex = 0;
 
1439
            }
 
1440
 
 
1441
          while (*str == ' ' || *str == ',')
 
1442
            ++str;
 
1443
 
 
1444
          if (operand->flags & MN10300_OPERAND_RELAX)
 
1445
            relaxable = 1;
 
1446
 
 
1447
          /* Gather the operand.  */
 
1448
          hold = input_line_pointer;
 
1449
          input_line_pointer = str;
 
1450
 
 
1451
          if (operand->flags & MN10300_OPERAND_PAREN)
 
1452
            {
 
1453
              if (*input_line_pointer != ')' && *input_line_pointer != '(')
 
1454
                {
 
1455
                  input_line_pointer = hold;
 
1456
                  str = hold;
 
1457
                  goto error;
 
1458
                }
 
1459
              input_line_pointer++;
 
1460
              goto keep_going;
 
1461
            }
 
1462
          /* See if we can match the operands.  */
 
1463
          else if (operand->flags & MN10300_OPERAND_DREG)
 
1464
            {
 
1465
              if (!data_register_name (&ex))
 
1466
                {
 
1467
                  input_line_pointer = hold;
 
1468
                  str = hold;
 
1469
                  goto error;
 
1470
                }
 
1471
            }
 
1472
          else if (operand->flags & MN10300_OPERAND_AREG)
 
1473
            {
 
1474
              if (!address_register_name (&ex))
 
1475
                {
 
1476
                  input_line_pointer = hold;
 
1477
                  str = hold;
 
1478
                  goto error;
 
1479
                }
 
1480
            }
 
1481
          else if (operand->flags & MN10300_OPERAND_SP)
 
1482
            {
 
1483
              char *start = input_line_pointer;
 
1484
              char c = get_symbol_end ();
 
1485
 
 
1486
              if (strcasecmp (start, "sp") != 0)
 
1487
                {
 
1488
                  *input_line_pointer = c;
 
1489
                  input_line_pointer = hold;
 
1490
                  str = hold;
 
1491
                  goto error;
 
1492
                }
 
1493
              *input_line_pointer = c;
 
1494
              goto keep_going;
 
1495
            }
 
1496
          else if (operand->flags & MN10300_OPERAND_RREG)
 
1497
            {
 
1498
              if (!r_register_name (&ex))
 
1499
                {
 
1500
                  input_line_pointer = hold;
 
1501
                  str = hold;
 
1502
                  goto error;
 
1503
                }
 
1504
            }
 
1505
          else if (operand->flags & MN10300_OPERAND_XRREG)
 
1506
            {
 
1507
              if (!xr_register_name (&ex))
 
1508
                {
 
1509
                  input_line_pointer = hold;
 
1510
                  str = hold;
 
1511
                  goto error;
 
1512
                }
 
1513
            }
 
1514
          else if (operand->flags & MN10300_OPERAND_FSREG)
 
1515
            {
 
1516
              if (!float_register_name (&ex))
 
1517
                {
 
1518
                  input_line_pointer = hold;
 
1519
                  str = hold;
 
1520
                  goto error;
 
1521
                }
 
1522
            }
 
1523
          else if (operand->flags & MN10300_OPERAND_FDREG)
 
1524
            {
 
1525
              if (!double_register_name (&ex))
 
1526
                {
 
1527
                  input_line_pointer = hold;
 
1528
                  str = hold;
 
1529
                  goto error;
 
1530
                }
 
1531
            }
 
1532
          else if (operand->flags & MN10300_OPERAND_FPCR)
 
1533
            {
 
1534
              char *start = input_line_pointer;
 
1535
              char c = get_symbol_end ();
 
1536
 
 
1537
              if (strcasecmp (start, "fpcr") != 0)
 
1538
                {
 
1539
                  *input_line_pointer = c;
 
1540
                  input_line_pointer = hold;
 
1541
                  str = hold;
 
1542
                  goto error;
 
1543
                }
 
1544
              *input_line_pointer = c;
 
1545
              goto keep_going;
 
1546
            }
 
1547
          else if (operand->flags & MN10300_OPERAND_USP)
 
1548
            {
 
1549
              char *start = input_line_pointer;
 
1550
              char c = get_symbol_end ();
 
1551
 
 
1552
              if (strcasecmp (start, "usp") != 0)
 
1553
                {
 
1554
                  *input_line_pointer = c;
 
1555
                  input_line_pointer = hold;
 
1556
                  str = hold;
 
1557
                  goto error;
 
1558
                }
 
1559
              *input_line_pointer = c;
 
1560
              goto keep_going;
 
1561
            }
 
1562
          else if (operand->flags & MN10300_OPERAND_SSP)
 
1563
            {
 
1564
              char *start = input_line_pointer;
 
1565
              char c = get_symbol_end ();
 
1566
 
 
1567
              if (strcasecmp (start, "ssp") != 0)
 
1568
                {
 
1569
                  *input_line_pointer = c;
 
1570
                  input_line_pointer = hold;
 
1571
                  str = hold;
 
1572
                  goto error;
 
1573
                }
 
1574
              *input_line_pointer = c;
 
1575
              goto keep_going;
 
1576
            }
 
1577
          else if (operand->flags & MN10300_OPERAND_MSP)
 
1578
            {
 
1579
              char *start = input_line_pointer;
 
1580
              char c = get_symbol_end ();
 
1581
 
 
1582
              if (strcasecmp (start, "msp") != 0)
 
1583
                {
 
1584
                  *input_line_pointer = c;
 
1585
                  input_line_pointer = hold;
 
1586
                  str = hold;
 
1587
                  goto error;
 
1588
                }
 
1589
              *input_line_pointer = c;
 
1590
              goto keep_going;
 
1591
            }
 
1592
          else if (operand->flags & MN10300_OPERAND_PC)
 
1593
            {
 
1594
              char *start = input_line_pointer;
 
1595
              char c = get_symbol_end ();
 
1596
 
 
1597
              if (strcasecmp (start, "pc") != 0)
 
1598
                {
 
1599
                  *input_line_pointer = c;
 
1600
                  input_line_pointer = hold;
 
1601
                  str = hold;
 
1602
                  goto error;
 
1603
                }
 
1604
              *input_line_pointer = c;
 
1605
              goto keep_going;
 
1606
            }
 
1607
          else if (operand->flags & MN10300_OPERAND_EPSW)
 
1608
            {
 
1609
              char *start = input_line_pointer;
 
1610
              char c = get_symbol_end ();
 
1611
 
 
1612
              if (strcasecmp (start, "epsw") != 0)
 
1613
                {
 
1614
                  *input_line_pointer = c;
 
1615
                  input_line_pointer = hold;
 
1616
                  str = hold;
 
1617
                  goto error;
 
1618
                }
 
1619
              *input_line_pointer = c;
 
1620
              goto keep_going;
 
1621
            }
 
1622
          else if (operand->flags & MN10300_OPERAND_PLUS)
 
1623
            {
 
1624
              if (*input_line_pointer != '+')
 
1625
                {
 
1626
                  input_line_pointer = hold;
 
1627
                  str = hold;
 
1628
                  goto error;
 
1629
                }
 
1630
              input_line_pointer++;
 
1631
              goto keep_going;
 
1632
            }
 
1633
          else if (operand->flags & MN10300_OPERAND_PSW)
 
1634
            {
 
1635
              char *start = input_line_pointer;
 
1636
              char c = get_symbol_end ();
 
1637
 
 
1638
              if (strcasecmp (start, "psw") != 0)
 
1639
                {
 
1640
                  *input_line_pointer = c;
 
1641
                  input_line_pointer = hold;
 
1642
                  str = hold;
 
1643
                  goto error;
 
1644
                }
 
1645
              *input_line_pointer = c;
 
1646
              goto keep_going;
 
1647
            }
 
1648
          else if (operand->flags & MN10300_OPERAND_MDR)
 
1649
            {
 
1650
              char *start = input_line_pointer;
 
1651
              char c = get_symbol_end ();
 
1652
 
 
1653
              if (strcasecmp (start, "mdr") != 0)
 
1654
                {
 
1655
                  *input_line_pointer = c;
 
1656
                  input_line_pointer = hold;
 
1657
                  str = hold;
 
1658
                  goto error;
 
1659
                }
 
1660
              *input_line_pointer = c;
 
1661
              goto keep_going;
 
1662
            }
 
1663
          else if (operand->flags & MN10300_OPERAND_REG_LIST)
 
1664
            {
 
1665
              unsigned int value = 0;
 
1666
              if (*input_line_pointer != '[')
 
1667
                {
 
1668
                  input_line_pointer = hold;
 
1669
                  str = hold;
 
1670
                  goto error;
 
1671
                }
 
1672
 
 
1673
              /* Eat the '['.  */
 
1674
              input_line_pointer++;
 
1675
 
 
1676
              /* We used to reject a null register list here; however,
 
1677
                 we accept it now so the compiler can emit "call"
 
1678
                 instructions for all calls to named functions.
 
1679
 
 
1680
                 The linker can then fill in the appropriate bits for the
 
1681
                 register list and stack size or change the instruction
 
1682
                 into a "calls" if using "call" is not profitable.  */
 
1683
              while (*input_line_pointer != ']')
 
1684
                {
 
1685
                  char *start;
 
1686
                  char c;
 
1687
 
 
1688
                  if (*input_line_pointer == ',')
 
1689
                    input_line_pointer++;
 
1690
 
 
1691
                  start = input_line_pointer;
 
1692
                  c = get_symbol_end ();
 
1693
 
 
1694
                  if (strcasecmp (start, "d2") == 0)
 
1695
                    {
 
1696
                      value |= 0x80;
 
1697
                      *input_line_pointer = c;
 
1698
                    }
 
1699
                  else if (strcasecmp (start, "d3") == 0)
 
1700
                    {
 
1701
                      value |= 0x40;
 
1702
                      *input_line_pointer = c;
 
1703
                    }
 
1704
                  else if (strcasecmp (start, "a2") == 0)
 
1705
                    {
 
1706
                      value |= 0x20;
 
1707
                      *input_line_pointer = c;
 
1708
                    }
 
1709
                  else if (strcasecmp (start, "a3") == 0)
 
1710
                    {
 
1711
                      value |= 0x10;
 
1712
                      *input_line_pointer = c;
 
1713
                    }
 
1714
                  else if (strcasecmp (start, "other") == 0)
 
1715
                    {
 
1716
                      value |= 0x08;
 
1717
                      *input_line_pointer = c;
 
1718
                    }
 
1719
                  else if (HAVE_AM33
 
1720
                           && strcasecmp (start, "exreg0") == 0)
 
1721
                    {
 
1722
                      value |= 0x04;
 
1723
                      *input_line_pointer = c;
 
1724
                    }
 
1725
                  else if (HAVE_AM33
 
1726
                           && strcasecmp (start, "exreg1") == 0)
 
1727
                    {
 
1728
                      value |= 0x02;
 
1729
                      *input_line_pointer = c;
 
1730
                    }
 
1731
                  else if (HAVE_AM33
 
1732
                           && strcasecmp (start, "exother") == 0)
 
1733
                    {
 
1734
                      value |= 0x01;
 
1735
                      *input_line_pointer = c;
 
1736
                    }
 
1737
                  else if (HAVE_AM33
 
1738
                           && strcasecmp (start, "all") == 0)
 
1739
                    {
 
1740
                      value |= 0xff;
 
1741
                      *input_line_pointer = c;
 
1742
                    }
 
1743
                  else
 
1744
                    {
 
1745
                      input_line_pointer = hold;
 
1746
                      str = hold;
 
1747
                      goto error;
 
1748
                    }
 
1749
                }
 
1750
              input_line_pointer++;
 
1751
              mn10300_insert_operand (&insn, &extension, operand,
 
1752
                                      value, (char *) NULL, 0, 0);
 
1753
              goto keep_going;
 
1754
 
 
1755
            }
 
1756
          else if (data_register_name (&ex))
 
1757
            {
 
1758
              input_line_pointer = hold;
 
1759
              str = hold;
 
1760
              goto error;
 
1761
            }
 
1762
          else if (address_register_name (&ex))
 
1763
            {
 
1764
              input_line_pointer = hold;
 
1765
              str = hold;
 
1766
              goto error;
 
1767
            }
 
1768
          else if (other_register_name (&ex))
 
1769
            {
 
1770
              input_line_pointer = hold;
 
1771
              str = hold;
 
1772
              goto error;
 
1773
            }
 
1774
          else if (HAVE_AM33 && r_register_name (&ex))
 
1775
            {
 
1776
              input_line_pointer = hold;
 
1777
              str = hold;
 
1778
              goto error;
 
1779
            }
 
1780
          else if (HAVE_AM33 && xr_register_name (&ex))
 
1781
            {
 
1782
              input_line_pointer = hold;
 
1783
              str = hold;
 
1784
              goto error;
 
1785
            }
 
1786
          else if (HAVE_AM33_2 && float_register_name (&ex))
 
1787
            {
 
1788
              input_line_pointer = hold;
 
1789
              str = hold;
 
1790
              goto error;
 
1791
            }
 
1792
          else if (HAVE_AM33_2 && double_register_name (&ex))
 
1793
            {
 
1794
              input_line_pointer = hold;
 
1795
              str = hold;
 
1796
              goto error;
 
1797
            }
 
1798
          else if (*str == ')' || *str == '(')
 
1799
            {
 
1800
              input_line_pointer = hold;
 
1801
              str = hold;
 
1802
              goto error;
 
1803
            }
 
1804
          else
 
1805
            {
 
1806
              expression (&ex);
 
1807
            }
 
1808
 
 
1809
          switch (ex.X_op)
 
1810
            {
 
1811
            case O_illegal:
 
1812
              errmsg = _("illegal operand");
 
1813
              goto error;
 
1814
            case O_absent:
 
1815
              errmsg = _("missing operand");
 
1816
              goto error;
 
1817
            case O_register:
 
1818
              {
 
1819
                int mask;
 
1820
 
 
1821
                mask = MN10300_OPERAND_DREG | MN10300_OPERAND_AREG;
 
1822
                if (HAVE_AM33)
 
1823
                  mask |= MN10300_OPERAND_RREG | MN10300_OPERAND_XRREG;
 
1824
                if (HAVE_AM33_2)
 
1825
                  mask |= MN10300_OPERAND_FSREG | MN10300_OPERAND_FDREG;
 
1826
                if ((operand->flags & mask) == 0)
 
1827
                  {
 
1828
                    input_line_pointer = hold;
 
1829
                    str = hold;
 
1830
                    goto error;
 
1831
                  }
 
1832
 
 
1833
                if (opcode->format == FMT_D1 || opcode->format == FMT_S1)
 
1834
                  extra_shift = 8;
 
1835
                else if (opcode->format == FMT_D2
 
1836
                         || opcode->format == FMT_D4
 
1837
                         || opcode->format == FMT_S2
 
1838
                         || opcode->format == FMT_S4
 
1839
                         || opcode->format == FMT_S6
 
1840
                         || opcode->format == FMT_D5)
 
1841
                  extra_shift = 16;
 
1842
                else if (opcode->format == FMT_D7)
 
1843
                  extra_shift = 8;
 
1844
                else if (opcode->format == FMT_D8 || opcode->format == FMT_D9)
 
1845
                  extra_shift = 8;
 
1846
                else
 
1847
                  extra_shift = 0;
 
1848
 
 
1849
                mn10300_insert_operand (&insn, &extension, operand,
 
1850
                                        ex.X_add_number, (char *) NULL,
 
1851
                                        0, extra_shift);
 
1852
 
 
1853
                /* And note the register number in the register array.  */
 
1854
                mn10300_reg_operands[op_idx - 1] = ex.X_add_number;
 
1855
                break;
 
1856
              }
 
1857
 
 
1858
            case O_constant:
 
1859
              /* If this operand can be promoted, and it doesn't
 
1860
                 fit into the allocated bitfield for this insn,
 
1861
                 then promote it (ie this opcode does not match).  */
 
1862
              if (operand->flags
 
1863
                  & (MN10300_OPERAND_PROMOTE | MN10300_OPERAND_RELAX)
 
1864
                  && !check_operand (insn, operand, ex.X_add_number))
 
1865
                {
 
1866
                  input_line_pointer = hold;
 
1867
                  str = hold;
 
1868
                  goto error;
 
1869
                }
 
1870
 
 
1871
              mn10300_insert_operand (&insn, &extension, operand,
 
1872
                                      ex.X_add_number, (char *) NULL,
 
1873
                                      0, 0);
 
1874
              break;
 
1875
 
 
1876
            default:
 
1877
              /* If this operand can be promoted, then this opcode didn't
 
1878
                 match since we can't know if it needed promotion!  */
 
1879
              if (operand->flags & MN10300_OPERAND_PROMOTE)
 
1880
                {
 
1881
                  input_line_pointer = hold;
 
1882
                  str = hold;
 
1883
                  goto error;
 
1884
                }
 
1885
 
 
1886
              /* We need to generate a fixup for this expression.  */
 
1887
              if (fc >= MAX_INSN_FIXUPS)
 
1888
                as_fatal (_("too many fixups"));
 
1889
              fixups[fc].exp = ex;
 
1890
              fixups[fc].opindex = *opindex_ptr;
 
1891
              fixups[fc].reloc = BFD_RELOC_UNUSED;
 
1892
              if (mn10300_check_fixup (& fixups[fc]))
 
1893
                goto error;
 
1894
              ++fc;
 
1895
              break;
 
1896
            }
 
1897
 
 
1898
keep_going:
 
1899
          str = input_line_pointer;
 
1900
          input_line_pointer = hold;
 
1901
 
 
1902
          while (*str == ' ' || *str == ',')
 
1903
            ++str;
 
1904
 
 
1905
        }
 
1906
 
 
1907
      /* Make sure we used all the operands!  */
 
1908
      if (*str != ',')
 
1909
        match = 1;
 
1910
 
 
1911
      /* If this instruction has registers that must not match, verify
 
1912
         that they do indeed not match.  */
 
1913
      if (opcode->no_match_operands)
 
1914
        {
 
1915
          int i;
 
1916
 
 
1917
          /* Look at each operand to see if it's marked.  */
 
1918
          for (i = 0; i < MN10300_MAX_OPERANDS; i++)
 
1919
            {
 
1920
              if ((1 << i) & opcode->no_match_operands)
 
1921
                {
 
1922
                  int j;
 
1923
 
 
1924
                  /* operand I is marked.  Check that it does not match any
 
1925
                     operands > I which are marked.  */
 
1926
                  for (j = i + 1; j < MN10300_MAX_OPERANDS; j++)
 
1927
                    {
 
1928
                      if (((1 << j) & opcode->no_match_operands)
 
1929
                          && mn10300_reg_operands[i] == mn10300_reg_operands[j])
 
1930
                        {
 
1931
                          errmsg = _("Invalid register specification.");
 
1932
                          match = 0;
 
1933
                          goto error;
 
1934
                        }
 
1935
                    }
 
1936
                }
 
1937
            }
 
1938
        }
 
1939
 
 
1940
    error:
 
1941
      if (match == 0)
 
1942
        {
 
1943
          next_opcode = opcode + 1;
 
1944
          if (!strcmp (next_opcode->name, opcode->name))
 
1945
            {
 
1946
              opcode = next_opcode;
 
1947
              continue;
 
1948
            }
 
1949
 
 
1950
          as_bad ("%s", errmsg);
 
1951
          return;
 
1952
        }
 
1953
      break;
 
1954
    }
 
1955
 
 
1956
  while (ISSPACE (*str))
 
1957
    ++str;
 
1958
 
 
1959
  if (*str != '\0')
 
1960
    as_bad (_("junk at end of line: `%s'"), str);
 
1961
 
 
1962
  input_line_pointer = str;
 
1963
 
 
1964
  /* Determine the size of the instruction.  */
 
1965
  if (opcode->format == FMT_S0)
 
1966
    size = 1;
 
1967
 
 
1968
  if (opcode->format == FMT_S1 || opcode->format == FMT_D0)
 
1969
    size = 2;
 
1970
 
 
1971
  if (opcode->format == FMT_S2 || opcode->format == FMT_D1)
 
1972
    size = 3;
 
1973
 
 
1974
  if (opcode->format == FMT_D6)
 
1975
    size = 3;
 
1976
 
 
1977
  if (opcode->format == FMT_D7 || opcode->format == FMT_D10)
 
1978
    size = 4;
 
1979
 
 
1980
  if (opcode->format == FMT_D8)
 
1981
    size = 6;
 
1982
 
 
1983
  if (opcode->format == FMT_D9)
 
1984
    size = 7;
 
1985
 
 
1986
  if (opcode->format == FMT_S4)
 
1987
    size = 5;
 
1988
 
 
1989
  if (opcode->format == FMT_S6 || opcode->format == FMT_D5)
 
1990
    size = 7;
 
1991
 
 
1992
  if (opcode->format == FMT_D2)
 
1993
    size = 4;
 
1994
 
 
1995
  if (opcode->format == FMT_D3)
 
1996
    size = 5;
 
1997
 
 
1998
  if (opcode->format == FMT_D4)
 
1999
    size = 6;
 
2000
 
 
2001
  if (relaxable && fc > 0)
 
2002
    {
 
2003
      int type;
 
2004
 
 
2005
      /* We want to anchor the line info to the previous frag (if
 
2006
         there isn't one, create it), so that, when the insn is
 
2007
         resized, we still get the right address for the beginning of
 
2008
         the region.  */
 
2009
      f = frag_more (0);
 
2010
      dwarf2_emit_insn (0);
 
2011
 
 
2012
      /* bCC  */
 
2013
      if (size == 2)
 
2014
        {
 
2015
          /* Handle bra specially.  Basically treat it like jmp so
 
2016
             that we automatically handle 8, 16 and 32 bit offsets
 
2017
             correctly as well as jumps to an undefined address.
 
2018
 
 
2019
             It is also important to not treat it like other bCC
 
2020
             instructions since the long forms of bra is different
 
2021
             from other bCC instructions.  */
 
2022
          if (opcode->opcode == 0xca00)
 
2023
            type = 10;
 
2024
          else
 
2025
            type = 0;
 
2026
        }
 
2027
      /* call  */
 
2028
      else if (size == 5)
 
2029
        type = 6;
 
2030
      /* calls  */
 
2031
      else if (size == 4)
 
2032
        type = 8;
 
2033
      /* jmp  */
 
2034
      else if (size == 3 && opcode->opcode == 0xcc0000)
 
2035
        type = 10;
 
2036
      else if (size == 3 && (opcode->opcode & 0xfff000) == 0xf8d000)
 
2037
        type = 13;
 
2038
      /* bCC (uncommon cases)  */
 
2039
      else
 
2040
        type = 3;
 
2041
 
 
2042
      f = frag_var (rs_machine_dependent, 8, 8 - size, type,
 
2043
                    fixups[0].exp.X_add_symbol,
 
2044
                    fixups[0].exp.X_add_number,
 
2045
                    (char *)fixups[0].opindex);
 
2046
 
 
2047
      /* This is pretty hokey.  We basically just care about the
 
2048
         opcode, so we have to write out the first word big endian.
 
2049
 
 
2050
         The exception is "call", which has two operands that we
 
2051
         care about.
 
2052
 
 
2053
         The first operand (the register list) happens to be in the
 
2054
         first instruction word, and will be in the right place if
 
2055
         we output the first word in big endian mode.
 
2056
 
 
2057
         The second operand (stack size) is in the extension word,
 
2058
         and we want it to appear as the first character in the extension
 
2059
         word (as it appears in memory).  Luckily, writing the extension
 
2060
         word in big endian format will do what we want.  */
 
2061
      number_to_chars_bigendian (f, insn, size > 4 ? 4 : size);
 
2062
      if (size > 8)
 
2063
        {
 
2064
          number_to_chars_bigendian (f + 4, extension, 4);
 
2065
          number_to_chars_bigendian (f + 8, 0, size - 8);
 
2066
        }
 
2067
      else if (size > 4)
 
2068
        number_to_chars_bigendian (f + 4, extension, size - 4);
 
2069
    }
 
2070
  else
 
2071
    {
 
2072
      /* Allocate space for the instruction.  */
 
2073
      f = frag_more (size);
 
2074
 
 
2075
      /* Fill in bytes for the instruction.  Note that opcode fields
 
2076
         are written big-endian, 16 & 32bit immediates are written
 
2077
         little endian.  Egad.  */
 
2078
      if (opcode->format == FMT_S0
 
2079
          || opcode->format == FMT_S1
 
2080
          || opcode->format == FMT_D0
 
2081
          || opcode->format == FMT_D6
 
2082
          || opcode->format == FMT_D7
 
2083
          || opcode->format == FMT_D10
 
2084
          || opcode->format == FMT_D1)
 
2085
        {
 
2086
          number_to_chars_bigendian (f, insn, size);
 
2087
        }
 
2088
      else if (opcode->format == FMT_S2
 
2089
               && opcode->opcode != 0xdf0000
 
2090
               && opcode->opcode != 0xde0000)
 
2091
        {
 
2092
          /* A format S2 instruction that is _not_ "ret" and "retf".  */
 
2093
          number_to_chars_bigendian (f, (insn >> 16) & 0xff, 1);
 
2094
          number_to_chars_littleendian (f + 1, insn & 0xffff, 2);
 
2095
        }
 
2096
      else if (opcode->format == FMT_S2)
 
2097
        {
 
2098
          /* This must be a ret or retf, which is written entirely in
 
2099
             big-endian format.  */
 
2100
          number_to_chars_bigendian (f, insn, 3);
 
2101
        }
 
2102
      else if (opcode->format == FMT_S4
 
2103
               && opcode->opcode != 0xdc000000)
 
2104
        {
 
2105
          /* This must be a format S4 "call" instruction.  What a pain.  */
 
2106
          unsigned long temp = (insn >> 8) & 0xffff;
 
2107
          number_to_chars_bigendian (f, (insn >> 24) & 0xff, 1);
 
2108
          number_to_chars_littleendian (f + 1, temp, 2);
 
2109
          number_to_chars_bigendian (f + 3, insn & 0xff, 1);
 
2110
          number_to_chars_bigendian (f + 4, extension & 0xff, 1);
 
2111
        }
 
2112
      else if (opcode->format == FMT_S4)
 
2113
        {
 
2114
          /* This must be a format S4 "jmp" instruction.  */
 
2115
          unsigned long temp = ((insn & 0xffffff) << 8) | (extension & 0xff);
 
2116
          number_to_chars_bigendian (f, (insn >> 24) & 0xff, 1);
 
2117
          number_to_chars_littleendian (f + 1, temp, 4);
 
2118
        }
 
2119
      else if (opcode->format == FMT_S6)
 
2120
        {
 
2121
          unsigned long temp = ((insn & 0xffffff) << 8)
 
2122
            | ((extension >> 16) & 0xff);
 
2123
          number_to_chars_bigendian (f, (insn >> 24) & 0xff, 1);
 
2124
          number_to_chars_littleendian (f + 1, temp, 4);
 
2125
          number_to_chars_bigendian (f + 5, (extension >> 8) & 0xff, 1);
 
2126
          number_to_chars_bigendian (f + 6, extension & 0xff, 1);
 
2127
        }
 
2128
      else if (opcode->format == FMT_D2
 
2129
               && opcode->opcode != 0xfaf80000
 
2130
               && opcode->opcode != 0xfaf00000
 
2131
               && opcode->opcode != 0xfaf40000)
 
2132
        {
 
2133
          /* A format D2 instruction where the 16bit immediate is
 
2134
             really a single 16bit value, not two 8bit values.  */
 
2135
          number_to_chars_bigendian (f, (insn >> 16) & 0xffff, 2);
 
2136
          number_to_chars_littleendian (f + 2, insn & 0xffff, 2);
 
2137
        }
 
2138
      else if (opcode->format == FMT_D2)
 
2139
        {
 
2140
          /* A format D2 instruction where the 16bit immediate
 
2141
             is really two 8bit immediates.  */
 
2142
          number_to_chars_bigendian (f, insn, 4);
 
2143
        }
 
2144
      else if (opcode->format == FMT_D3)
 
2145
        {
 
2146
          number_to_chars_bigendian (f, (insn >> 16) & 0xffff, 2);
 
2147
          number_to_chars_littleendian (f + 2, insn & 0xffff, 2);
 
2148
          number_to_chars_bigendian (f + 4, extension & 0xff, 1);
 
2149
        }
 
2150
      else if (opcode->format == FMT_D4)
 
2151
        {
 
2152
          unsigned long temp = ((insn & 0xffff) << 16) | (extension & 0xffff);
 
2153
 
 
2154
          number_to_chars_bigendian (f, (insn >> 16) & 0xffff, 2);
 
2155
          number_to_chars_littleendian (f + 2, temp, 4);
 
2156
        }
 
2157
      else if (opcode->format == FMT_D5)
 
2158
        {
 
2159
          unsigned long temp = (((insn & 0xffff) << 16)
 
2160
                                | ((extension >> 8) & 0xffff));
 
2161
 
 
2162
          number_to_chars_bigendian (f, (insn >> 16) & 0xffff, 2);
 
2163
          number_to_chars_littleendian (f + 2, temp, 4);
 
2164
          number_to_chars_bigendian (f + 6, extension & 0xff, 1);
 
2165
        }
 
2166
      else if (opcode->format == FMT_D8)
 
2167
        {
 
2168
          unsigned long temp = ((insn & 0xff) << 16) | (extension & 0xffff);
 
2169
 
 
2170
          number_to_chars_bigendian (f, (insn >> 8) & 0xffffff, 3);
 
2171
          number_to_chars_bigendian (f + 3, (temp & 0xff), 1);
 
2172
          number_to_chars_littleendian (f + 4, temp >> 8, 2);
 
2173
        }
 
2174
      else if (opcode->format == FMT_D9)
 
2175
        {
 
2176
          unsigned long temp = ((insn & 0xff) << 24) | (extension & 0xffffff);
 
2177
 
 
2178
          number_to_chars_bigendian (f, (insn >> 8) & 0xffffff, 3);
 
2179
          number_to_chars_littleendian (f + 3, temp, 4);
 
2180
        }
 
2181
 
 
2182
      /* Create any fixups.  */
 
2183
      for (i = 0; i < fc; i++)
 
2184
        {
 
2185
          const struct mn10300_operand *operand;
 
2186
 
 
2187
          operand = &mn10300_operands[fixups[i].opindex];
 
2188
          if (fixups[i].reloc != BFD_RELOC_UNUSED
 
2189
              && fixups[i].reloc != BFD_RELOC_32_GOT_PCREL
 
2190
              && fixups[i].reloc != BFD_RELOC_32_GOTOFF
 
2191
              && fixups[i].reloc != BFD_RELOC_32_PLT_PCREL
 
2192
              && fixups[i].reloc != BFD_RELOC_MN10300_GOT32)
 
2193
            {
 
2194
              reloc_howto_type *reloc_howto;
 
2195
              int size;
 
2196
              int offset;
 
2197
              fixS *fixP;
 
2198
 
 
2199
              reloc_howto = bfd_reloc_type_lookup (stdoutput,
 
2200
                                                   fixups[i].reloc);
 
2201
 
 
2202
              if (!reloc_howto)
 
2203
                abort ();
 
2204
 
 
2205
              size = bfd_get_reloc_size (reloc_howto);
 
2206
 
 
2207
              if (size < 1 || size > 4)
 
2208
                abort ();
 
2209
 
 
2210
              offset = 4 - size;
 
2211
              fixP = fix_new_exp (frag_now, f - frag_now->fr_literal + offset,
 
2212
                                  size, &fixups[i].exp,
 
2213
                                  reloc_howto->pc_relative,
 
2214
                                  fixups[i].reloc);
 
2215
            }
 
2216
          else
 
2217
            {
 
2218
              int reloc, pcrel, reloc_size, offset;
 
2219
              fixS *fixP;
 
2220
 
 
2221
              reloc = BFD_RELOC_NONE;
 
2222
              if (fixups[i].reloc != BFD_RELOC_UNUSED)
 
2223
                reloc = fixups[i].reloc;
 
2224
              /* How big is the reloc?  Remember SPLIT relocs are
 
2225
                 implicitly 32bits.  */
 
2226
              if ((operand->flags & MN10300_OPERAND_SPLIT) != 0)
 
2227
                reloc_size = 32;
 
2228
              else if ((operand->flags & MN10300_OPERAND_24BIT) != 0)
 
2229
                reloc_size = 24;
 
2230
              else
 
2231
                reloc_size = operand->bits;
 
2232
 
 
2233
              /* Is the reloc pc-relative?  */
 
2234
              pcrel = (operand->flags & MN10300_OPERAND_PCREL) != 0;
 
2235
              if (reloc != BFD_RELOC_NONE)
 
2236
                pcrel = bfd_reloc_type_lookup (stdoutput, reloc)->pc_relative;
 
2237
 
 
2238
              offset = size - (reloc_size + operand->shift) / 8;
 
2239
 
 
2240
              /* Choose a proper BFD relocation type.  */
 
2241
              if (reloc != BFD_RELOC_NONE)
 
2242
                ;
 
2243
              else if (pcrel)
 
2244
                {
 
2245
                  if (reloc_size == 32)
 
2246
                    reloc = BFD_RELOC_32_PCREL;
 
2247
                  else if (reloc_size == 16)
 
2248
                    reloc = BFD_RELOC_16_PCREL;
 
2249
                  else if (reloc_size == 8)
 
2250
                    reloc = BFD_RELOC_8_PCREL;
 
2251
                  else
 
2252
                    abort ();
 
2253
                }
 
2254
              else
 
2255
                {
 
2256
                  if (reloc_size == 32)
 
2257
                    reloc = BFD_RELOC_32;
 
2258
                  else if (reloc_size == 16)
 
2259
                    reloc = BFD_RELOC_16;
 
2260
                  else if (reloc_size == 8)
 
2261
                    reloc = BFD_RELOC_8;
 
2262
                  else
 
2263
                    abort ();
 
2264
                }
 
2265
 
 
2266
              /* Convert the size of the reloc into what fix_new_exp wants.  */
 
2267
              reloc_size = reloc_size / 8;
 
2268
              if (reloc_size == 8)
 
2269
                reloc_size = 0;
 
2270
              else if (reloc_size == 16)
 
2271
                reloc_size = 1;
 
2272
              else if (reloc_size == 32)
 
2273
                reloc_size = 2;
 
2274
 
 
2275
              fixP = fix_new_exp (frag_now, f - frag_now->fr_literal + offset,
 
2276
                                  reloc_size, &fixups[i].exp, pcrel,
 
2277
                                  ((bfd_reloc_code_real_type) reloc));
 
2278
 
 
2279
              if (pcrel)
 
2280
                fixP->fx_offset += offset;
 
2281
            }
 
2282
        }
 
2283
 
 
2284
      dwarf2_emit_insn (size);
 
2285
    }
 
2286
}
 
2287
 
 
2288
/* If while processing a fixup, a reloc really needs to be created
 
2289
   then it is done here.  */
 
2290
 
 
2291
arelent *
 
2292
tc_gen_reloc (seg, fixp)
 
2293
     asection *seg ATTRIBUTE_UNUSED;
 
2294
     fixS *fixp;
 
2295
{
 
2296
  arelent *reloc;
 
2297
  reloc = (arelent *) xmalloc (sizeof (arelent));
 
2298
 
 
2299
  reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
 
2300
  if (reloc->howto == (reloc_howto_type *) NULL)
 
2301
    {
 
2302
      as_bad_where (fixp->fx_file, fixp->fx_line,
 
2303
                    _("reloc %d not supported by object file format"),
 
2304
                    (int) fixp->fx_r_type);
 
2305
      return NULL;
 
2306
    }
 
2307
  reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
 
2308
 
 
2309
  if (fixp->fx_subsy
 
2310
      && S_GET_SEGMENT (fixp->fx_subsy) == absolute_section)
 
2311
    {
 
2312
      fixp->fx_offset -= S_GET_VALUE (fixp->fx_subsy);
 
2313
      fixp->fx_subsy = 0;
 
2314
    }
 
2315
 
 
2316
  if (fixp->fx_addsy && fixp->fx_subsy)
 
2317
    {
 
2318
      reloc->sym_ptr_ptr = NULL;
 
2319
 
 
2320
      /* If we got a difference between two symbols, and the
 
2321
         subtracted symbol is in the current section, use a
 
2322
         PC-relative relocation.  If both symbols are in the same
 
2323
         section, the difference would have already been simplified
 
2324
         to a constant.  */
 
2325
      if (S_GET_SEGMENT (fixp->fx_subsy) == seg)
 
2326
        {
 
2327
          reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
 
2328
          *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
 
2329
          reloc->addend = (reloc->address - S_GET_VALUE (fixp->fx_subsy)
 
2330
                           + fixp->fx_offset);
 
2331
 
 
2332
          switch (fixp->fx_r_type)
 
2333
            {
 
2334
            case BFD_RELOC_8:
 
2335
              reloc->howto = bfd_reloc_type_lookup (stdoutput,
 
2336
                                                    BFD_RELOC_8_PCREL);
 
2337
              return reloc;
 
2338
 
 
2339
            case BFD_RELOC_16:
 
2340
              reloc->howto = bfd_reloc_type_lookup (stdoutput,
 
2341
                                                    BFD_RELOC_16_PCREL);
 
2342
              return reloc;
 
2343
 
 
2344
            case BFD_RELOC_24:
 
2345
              reloc->howto = bfd_reloc_type_lookup (stdoutput,
 
2346
                                                    BFD_RELOC_24_PCREL);
 
2347
              return reloc;
 
2348
 
 
2349
            case BFD_RELOC_32:
 
2350
              reloc->howto = bfd_reloc_type_lookup (stdoutput,
 
2351
                                                    BFD_RELOC_32_PCREL);
 
2352
              return reloc;
 
2353
 
 
2354
            default:
 
2355
              /* Try to compute the absolute value below.  */
 
2356
              break;
 
2357
            }
 
2358
        }
 
2359
 
 
2360
      if ((S_GET_SEGMENT (fixp->fx_addsy) != S_GET_SEGMENT (fixp->fx_subsy))
 
2361
          || S_GET_SEGMENT (fixp->fx_addsy) == undefined_section)
 
2362
        {
 
2363
          as_bad_where (fixp->fx_file, fixp->fx_line,
 
2364
                        "Difference of symbols in different sections is not supported");
 
2365
        }
 
2366
      else
 
2367
        {
 
2368
          char *fixpos = fixp->fx_where + fixp->fx_frag->fr_literal;
 
2369
 
 
2370
          reloc->addend = (S_GET_VALUE (fixp->fx_addsy)
 
2371
                           - S_GET_VALUE (fixp->fx_subsy) + fixp->fx_offset);
 
2372
 
 
2373
          switch (fixp->fx_r_type)
 
2374
            {
 
2375
            case BFD_RELOC_8:
 
2376
              md_number_to_chars (fixpos, reloc->addend, 1);
 
2377
              break;
 
2378
 
 
2379
            case BFD_RELOC_16:
 
2380
              md_number_to_chars (fixpos, reloc->addend, 2);
 
2381
              break;
 
2382
 
 
2383
            case BFD_RELOC_24:
 
2384
              md_number_to_chars (fixpos, reloc->addend, 3);
 
2385
              break;
 
2386
 
 
2387
            case BFD_RELOC_32:
 
2388
              md_number_to_chars (fixpos, reloc->addend, 4);
 
2389
              break;
 
2390
 
 
2391
            default:
 
2392
              reloc->sym_ptr_ptr = (asymbol **) &bfd_abs_symbol;
 
2393
              return reloc;
 
2394
            }
 
2395
        }
 
2396
 
 
2397
      if (reloc->sym_ptr_ptr)
 
2398
        free (reloc->sym_ptr_ptr);
 
2399
      free (reloc);
 
2400
      return NULL;
 
2401
    }
 
2402
  else
 
2403
    {
 
2404
      reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
 
2405
      *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
 
2406
      reloc->addend = fixp->fx_offset;
 
2407
    }
 
2408
  return reloc;
 
2409
}
 
2410
 
 
2411
int
 
2412
md_estimate_size_before_relax (fragp, seg)
 
2413
     fragS *fragp;
 
2414
     asection *seg;
 
2415
{
 
2416
  if (fragp->fr_subtype == 6
 
2417
      && (!S_IS_DEFINED (fragp->fr_symbol)
 
2418
          || seg != S_GET_SEGMENT (fragp->fr_symbol)))
 
2419
    fragp->fr_subtype = 7;
 
2420
  else if (fragp->fr_subtype == 8
 
2421
           && (!S_IS_DEFINED (fragp->fr_symbol)
 
2422
               || seg != S_GET_SEGMENT (fragp->fr_symbol)))
 
2423
    fragp->fr_subtype = 9;
 
2424
  else if (fragp->fr_subtype == 10
 
2425
           &&  (!S_IS_DEFINED (fragp->fr_symbol)
 
2426
                || seg != S_GET_SEGMENT (fragp->fr_symbol)))
 
2427
    fragp->fr_subtype = 12;
 
2428
 
 
2429
  if (fragp->fr_subtype == 13)
 
2430
    return 3;
 
2431
  if (fragp->fr_subtype >= sizeof (md_relax_table) / sizeof (md_relax_table[0]))
 
2432
    abort ();
 
2433
 
 
2434
  return md_relax_table[fragp->fr_subtype].rlx_length;
 
2435
}
 
2436
 
 
2437
long
 
2438
md_pcrel_from (fixp)
 
2439
     fixS *fixp;
 
2440
{
 
2441
  if (fixp->fx_addsy != (symbolS *) NULL && !S_IS_DEFINED (fixp->fx_addsy))
 
2442
    {
 
2443
      /* The symbol is undefined.  Let the linker figure it out.  */
 
2444
      return 0;
 
2445
    }
 
2446
  return fixp->fx_frag->fr_address + fixp->fx_where;
 
2447
}
 
2448
 
 
2449
void
 
2450
md_apply_fix3 (fixP, valP, seg)
 
2451
     fixS * fixP;
 
2452
     valueT * valP;
 
2453
     segT seg;
 
2454
{
 
2455
  char * fixpos = fixP->fx_where + fixP->fx_frag->fr_literal;
 
2456
  int size = 0;
 
2457
  int value = (int) * valP;
 
2458
 
 
2459
  assert (fixP->fx_r_type < BFD_RELOC_UNUSED);
 
2460
 
 
2461
  /* This should never happen.  */
 
2462
  if (seg->flags & SEC_ALLOC)
 
2463
    abort ();
 
2464
 
 
2465
  /* The value we are passed in *valuep includes the symbol values.
 
2466
     Since we are using BFD_ASSEMBLER, if we are doing this relocation
 
2467
     the code in write.c is going to call bfd_install_relocation, which
 
2468
     is also going to use the symbol value.  That means that if the
 
2469
     reloc is fully resolved we want to use *valuep since
 
2470
     bfd_install_relocation is not being used.
 
2471
 
 
2472
     However, if the reloc is not fully resolved we do not want to use
 
2473
     *valuep, and must use fx_offset instead.  However, if the reloc
 
2474
     is PC relative, we do want to use *valuep since it includes the
 
2475
     result of md_pcrel_from.  */
 
2476
  if (fixP->fx_addsy != (symbolS *) NULL && ! fixP->fx_pcrel)
 
2477
    value = fixP->fx_offset;
 
2478
 
 
2479
  /* If the fix is relative to a symbol which is not defined, or not
 
2480
     in the same segment as the fix, we cannot resolve it here.  */
 
2481
  if (fixP->fx_addsy != NULL
 
2482
      && (! S_IS_DEFINED (fixP->fx_addsy)
 
2483
          || (S_GET_SEGMENT (fixP->fx_addsy) != seg)))
 
2484
    {
 
2485
      fixP->fx_done = 0;
 
2486
      return;
 
2487
    }
 
2488
 
 
2489
  switch (fixP->fx_r_type)
 
2490
    {
 
2491
    case BFD_RELOC_8:
 
2492
    case BFD_RELOC_8_PCREL:
 
2493
      size = 1;
 
2494
      break;
 
2495
 
 
2496
    case BFD_RELOC_16:
 
2497
    case BFD_RELOC_16_PCREL:
 
2498
      size = 2;
 
2499
      break;
 
2500
 
 
2501
    case BFD_RELOC_32:
 
2502
    case BFD_RELOC_32_PCREL:
 
2503
      size = 4;
 
2504
      break;
 
2505
 
 
2506
    case BFD_RELOC_VTABLE_INHERIT:
 
2507
    case BFD_RELOC_VTABLE_ENTRY:
 
2508
      fixP->fx_done = 0;
 
2509
      return;
 
2510
 
 
2511
    case BFD_RELOC_NONE:
 
2512
    default:
 
2513
      as_bad_where (fixP->fx_file, fixP->fx_line,
 
2514
                   _("Bad relocation fixup type (%d)"), fixP->fx_r_type);
 
2515
    }
 
2516
 
 
2517
  md_number_to_chars (fixpos, value, size);
 
2518
 
 
2519
  /* If a symbol remains, pass the fixup, as a reloc, onto the linker.  */
 
2520
  if (fixP->fx_addsy == NULL)
 
2521
    fixP->fx_done = 1;
 
2522
}
 
2523
 
 
2524
/* Return zero if the fixup in fixp should be left alone and not
 
2525
   adjusted.  */
 
2526
 
 
2527
bfd_boolean
 
2528
mn10300_fix_adjustable (fixp)
 
2529
     struct fix *fixp;
 
2530
{
 
2531
  if (! TC_RELOC_RTSYM_LOC_FIXUP (fixp))
 
2532
    return 0;
 
2533
 
 
2534
  if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
 
2535
      || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
 
2536
    return 0;
 
2537
 
 
2538
  /* Do not adjust relocations involving symbols in code sections,
 
2539
     because it breaks linker relaxations.  This could be fixed in the
 
2540
     linker, but this fix is simpler, and it pretty much only affects
 
2541
     object size a little bit.  */
 
2542
  if (S_GET_SEGMENT (fixp->fx_addsy)->flags & SEC_CODE)
 
2543
    return 0;
 
2544
 
 
2545
  return 1;
 
2546
}
 
2547
 
 
2548
/* Insert an operand value into an instruction.  */
 
2549
 
 
2550
static void
 
2551
mn10300_insert_operand (insnp, extensionp, operand, val, file, line, shift)
 
2552
     unsigned long *insnp;
 
2553
     unsigned long *extensionp;
 
2554
     const struct mn10300_operand *operand;
 
2555
     offsetT val;
 
2556
     char *file;
 
2557
     unsigned int line;
 
2558
     unsigned int shift;
 
2559
{
 
2560
  /* No need to check 32bit operands for a bit.  Note that
 
2561
     MN10300_OPERAND_SPLIT is an implicit 32bit operand.  */
 
2562
  if (operand->bits != 32
 
2563
      && (operand->flags & MN10300_OPERAND_SPLIT) == 0)
 
2564
    {
 
2565
      long min, max;
 
2566
      offsetT test;
 
2567
      int bits;
 
2568
 
 
2569
      bits = operand->bits;
 
2570
      if (operand->flags & MN10300_OPERAND_24BIT)
 
2571
        bits = 24;
 
2572
 
 
2573
      if ((operand->flags & MN10300_OPERAND_SIGNED) != 0)
 
2574
        {
 
2575
          max = (1 << (bits - 1)) - 1;
 
2576
          min = - (1 << (bits - 1));
 
2577
        }
 
2578
      else
 
2579
        {
 
2580
          max = (1 << bits) - 1;
 
2581
          min = 0;
 
2582
        }
 
2583
 
 
2584
      test = val;
 
2585
 
 
2586
      if (test < (offsetT) min || test > (offsetT) max)
 
2587
        {
 
2588
          const char *err =
 
2589
            _("operand out of range (%s not between %ld and %ld)");
 
2590
          char buf[100];
 
2591
 
 
2592
          sprint_value (buf, test);
 
2593
          if (file == (char *) NULL)
 
2594
            as_warn (err, buf, min, max);
 
2595
          else
 
2596
            as_warn_where (file, line, err, buf, min, max);
 
2597
        }
 
2598
    }
 
2599
 
 
2600
  if ((operand->flags & MN10300_OPERAND_SPLIT) != 0)
 
2601
    {
 
2602
      *insnp |= (val >> (32 - operand->bits)) & ((1 << operand->bits) - 1);
 
2603
      *extensionp |= ((val & ((1 << (32 - operand->bits)) - 1))
 
2604
                      << operand->shift);
 
2605
    }
 
2606
  else if ((operand->flags & MN10300_OPERAND_24BIT) != 0)
 
2607
    {
 
2608
      *insnp |= (val >> (24 - operand->bits)) & ((1 << operand->bits) - 1);
 
2609
      *extensionp |= ((val & ((1 << (24 - operand->bits)) - 1))
 
2610
                      << operand->shift);
 
2611
    }
 
2612
  else if ((operand->flags & (MN10300_OPERAND_FSREG | MN10300_OPERAND_FDREG)))
 
2613
    {
 
2614
      /* See devo/opcodes/m10300-opc.c just before #define FSM0 for an
 
2615
         explanation of these variables.  Note that FMT-implied shifts
 
2616
        are not taken into account for FP registers.  */
 
2617
      unsigned long mask_low, mask_high;
 
2618
      int shl_low, shr_high, shl_high;
 
2619
 
 
2620
      switch (operand->bits)
 
2621
        {
 
2622
        case 5:
 
2623
          /* Handle regular FP registers.  */
 
2624
          if (operand->shift >= 0)
 
2625
            {
 
2626
              /* This is an `m' register.  */
 
2627
              shl_low = operand->shift;
 
2628
              shl_high = 8 + (8 & shl_low) + (shl_low & 4) / 4;
 
2629
            }
 
2630
          else
 
2631
            {
 
2632
              /* This is an `n' register.  */
 
2633
              shl_low = -operand->shift;
 
2634
              shl_high = shl_low / 4;
 
2635
            }
 
2636
 
 
2637
          mask_low = 0x0f;
 
2638
          mask_high = 0x10;
 
2639
          shr_high = 4;
 
2640
          break;
 
2641
 
 
2642
        case 3:
 
2643
          /* Handle accumulators.  */
 
2644
          shl_low = -operand->shift;
 
2645
          shl_high = 0;
 
2646
          mask_low = 0x03;
 
2647
          mask_high = 0x04;
 
2648
          shr_high = 2;
 
2649
          break;
 
2650
 
 
2651
        default:
 
2652
          abort ();
 
2653
        }
 
2654
      *insnp |= ((((val & mask_high) >> shr_high) << shl_high)
 
2655
                 | ((val & mask_low) << shl_low));
 
2656
    }
 
2657
  else if ((operand->flags & MN10300_OPERAND_EXTENDED) == 0)
 
2658
    {
 
2659
      *insnp |= (((long) val & ((1 << operand->bits) - 1))
 
2660
                 << (operand->shift + shift));
 
2661
 
 
2662
      if ((operand->flags & MN10300_OPERAND_REPEATED) != 0)
 
2663
        *insnp |= (((long) val & ((1 << operand->bits) - 1))
 
2664
                   << (operand->shift + shift + operand->bits));
 
2665
    }
 
2666
  else
 
2667
    {
 
2668
      *extensionp |= (((long) val & ((1 << operand->bits) - 1))
 
2669
                      << (operand->shift + shift));
 
2670
 
 
2671
      if ((operand->flags & MN10300_OPERAND_REPEATED) != 0)
 
2672
        *extensionp |= (((long) val & ((1 << operand->bits) - 1))
 
2673
                        << (operand->shift + shift + operand->bits));
 
2674
    }
 
2675
}
 
2676
 
 
2677
static unsigned long
 
2678
check_operand (insn, operand, val)
 
2679
     unsigned long insn ATTRIBUTE_UNUSED;
 
2680
     const struct mn10300_operand *operand;
 
2681
     offsetT val;
 
2682
{
 
2683
  /* No need to check 32bit operands for a bit.  Note that
 
2684
     MN10300_OPERAND_SPLIT is an implicit 32bit operand.  */
 
2685
  if (operand->bits != 32
 
2686
      && (operand->flags & MN10300_OPERAND_SPLIT) == 0)
 
2687
    {
 
2688
      long min, max;
 
2689
      offsetT test;
 
2690
      int bits;
 
2691
 
 
2692
      bits = operand->bits;
 
2693
      if (operand->flags & MN10300_OPERAND_24BIT)
 
2694
        bits = 24;
 
2695
 
 
2696
      if ((operand->flags & MN10300_OPERAND_SIGNED) != 0)
 
2697
        {
 
2698
          max = (1 << (bits - 1)) - 1;
 
2699
          min = - (1 << (bits - 1));
 
2700
        }
 
2701
      else
 
2702
        {
 
2703
          max = (1 << bits) - 1;
 
2704
          min = 0;
 
2705
        }
 
2706
 
 
2707
      test = val;
 
2708
 
 
2709
      if (test < (offsetT) min || test > (offsetT) max)
 
2710
        return 0;
 
2711
      else
 
2712
        return 1;
 
2713
    }
 
2714
  return 1;
 
2715
}
 
2716
 
 
2717
static void
 
2718
set_arch_mach (mach)
 
2719
     int mach;
 
2720
{
 
2721
  if (!bfd_set_arch_mach (stdoutput, bfd_arch_mn10300, mach))
 
2722
    as_warn (_("could not set architecture and machine"));
 
2723
 
 
2724
  current_machine = mach;
 
2725
}
 
2726
 
 
2727
static inline char * mn10300_end_of_match PARAMS ((char *, char *));
 
2728
 
 
2729
static inline char *
 
2730
mn10300_end_of_match (cont, what)
 
2731
     char *cont, *what;
 
2732
{
 
2733
  int len = strlen (what);
 
2734
 
 
2735
  if (strncmp (cont, what, strlen (what)) == 0
 
2736
      && ! is_part_of_name (cont[len]))
 
2737
    return cont + len;
 
2738
 
 
2739
  return NULL;
 
2740
}  
 
2741
 
 
2742
int
 
2743
mn10300_parse_name (name, exprP, nextcharP)
 
2744
     char const *name;
 
2745
     expressionS *exprP;
 
2746
     char *nextcharP;
 
2747
{
 
2748
  char *next = input_line_pointer;
 
2749
  char *next_end;
 
2750
  int reloc_type;
 
2751
  segT segment;
 
2752
 
 
2753
  exprP->X_op_symbol = NULL;
 
2754
 
 
2755
  if (strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0)
 
2756
    {
 
2757
      if (! GOT_symbol)
 
2758
        GOT_symbol = symbol_find_or_make (name);
 
2759
 
 
2760
      exprP->X_add_symbol = GOT_symbol;
 
2761
    no_suffix:
 
2762
      /* If we have an absolute symbol or a reg,
 
2763
         then we know its value now.  */
 
2764
      segment = S_GET_SEGMENT (exprP->X_add_symbol);
 
2765
      if (segment == absolute_section)
 
2766
        {
 
2767
          exprP->X_op = O_constant;
 
2768
          exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol);
 
2769
          exprP->X_add_symbol = NULL;
 
2770
        }
 
2771
      else if (segment == reg_section)
 
2772
        {
 
2773
          exprP->X_op = O_register;
 
2774
          exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol);
 
2775
          exprP->X_add_symbol = NULL;
 
2776
        }
 
2777
      else
 
2778
        {
 
2779
          exprP->X_op = O_symbol;
 
2780
          exprP->X_add_number = 0;
 
2781
        }
 
2782
 
 
2783
      return 1;
 
2784
    }
 
2785
 
 
2786
  exprP->X_add_symbol = symbol_find_or_make (name);
 
2787
  
 
2788
  if (*nextcharP != '@')
 
2789
    goto no_suffix;
 
2790
  else if ((next_end = mn10300_end_of_match (next + 1, "GOTOFF")))
 
2791
    reloc_type = BFD_RELOC_32_GOTOFF;
 
2792
  else if ((next_end = mn10300_end_of_match (next + 1, "GOT")))
 
2793
    reloc_type = BFD_RELOC_MN10300_GOT32;
 
2794
  else if ((next_end = mn10300_end_of_match (next + 1, "PLT")))
 
2795
    reloc_type = BFD_RELOC_32_PLT_PCREL;
 
2796
  else
 
2797
    goto no_suffix;
 
2798
 
 
2799
  *input_line_pointer = *nextcharP;
 
2800
  input_line_pointer = next_end;
 
2801
  *nextcharP = *input_line_pointer;
 
2802
  *input_line_pointer = '\0';
 
2803
 
 
2804
  exprP->X_op = O_PIC_reloc;
 
2805
  exprP->X_add_number = 0;
 
2806
  exprP->X_md = reloc_type;
 
2807
 
 
2808
  return 1;
 
2809
}