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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [binutils-2.18.50/] [gas/] [config/] [tc-sh.c] - Blame information for rev 866

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 38 julius
/* tc-sh.c -- Assemble code for the Renesas / SuperH SH
2
   Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3
   2003, 2004, 2005, 2006, 2007  Free Software Foundation, Inc.
4
 
5
   This file is part of GAS, the GNU Assembler.
6
 
7
   GAS is free software; you can redistribute it and/or modify
8
   it under the terms of the GNU General Public License as published by
9
   the Free Software Foundation; either version 3, 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, 51 Franklin Street - Fifth Floor,
20
   Boston, MA 02110-1301, USA.  */
21
 
22
/* Written By Steve Chamberlain <sac@cygnus.com>  */
23
 
24
#include "as.h"
25
#include "subsegs.h"
26
#define DEFINE_TABLE
27
#include "opcodes/sh-opc.h"
28
#include "safe-ctype.h"
29
#include "struc-symbol.h"
30
 
31
#ifdef OBJ_ELF
32
#include "elf/sh.h"
33
#endif
34
 
35
#include "dwarf2dbg.h"
36
#include "dw2gencfi.h"
37
 
38
typedef struct
39
  {
40
    sh_arg_type type;
41
    int reg;
42
    expressionS immediate;
43
  }
44
sh_operand_info;
45
 
46
const char comment_chars[] = "!";
47
const char line_separator_chars[] = ";";
48
const char line_comment_chars[] = "!#";
49
 
50
static void s_uses (int);
51
static void s_uacons (int);
52
 
53
#ifdef OBJ_ELF
54
static void sh_elf_cons (int);
55
 
56
symbolS *GOT_symbol;            /* Pre-defined "_GLOBAL_OFFSET_TABLE_" */
57
#endif
58
 
59
static void
60
big (int ignore ATTRIBUTE_UNUSED)
61
{
62
  if (! target_big_endian)
63
    as_bad (_("directive .big encountered when option -big required"));
64
 
65
  /* Stop further messages.  */
66
  target_big_endian = 1;
67
}
68
 
69
static void
70
little (int ignore ATTRIBUTE_UNUSED)
71
{
72
  if (target_big_endian)
73
    as_bad (_("directive .little encountered when option -little required"));
74
 
75
  /* Stop further messages.  */
76
  target_big_endian = 0;
77
}
78
 
79
/* This table describes all the machine specific pseudo-ops the assembler
80
   has to support.  The fields are:
81
   pseudo-op name without dot
82
   function to call to execute this pseudo-op
83
   Integer arg to pass to the function.  */
84
 
85
const pseudo_typeS md_pseudo_table[] =
86
{
87
#ifdef OBJ_ELF
88
  {"long", sh_elf_cons, 4},
89
  {"int", sh_elf_cons, 4},
90
  {"word", sh_elf_cons, 2},
91
  {"short", sh_elf_cons, 2},
92
#else
93
  {"int", cons, 4},
94
  {"word", cons, 2},
95
#endif /* OBJ_ELF */
96
  {"big", big, 0},
97
  {"form", listing_psize, 0},
98
  {"little", little, 0},
99
  {"heading", listing_title, 0},
100
  {"import", s_ignore, 0},
101
  {"page", listing_eject, 0},
102
  {"program", s_ignore, 0},
103
  {"uses", s_uses, 0},
104
  {"uaword", s_uacons, 2},
105
  {"ualong", s_uacons, 4},
106
  {"uaquad", s_uacons, 8},
107
  {"2byte", s_uacons, 2},
108
  {"4byte", s_uacons, 4},
109
  {"8byte", s_uacons, 8},
110
#ifdef HAVE_SH64
111
  {"mode", s_sh64_mode, 0 },
112
 
113
  /* Have the old name too.  */
114
  {"isa", s_sh64_mode, 0 },
115
 
116
  /* Assert that the right ABI is used.  */
117
  {"abi", s_sh64_abi, 0 },
118
 
119
  { "vtable_inherit", sh64_vtable_inherit, 0 },
120
  { "vtable_entry", sh64_vtable_entry, 0 },
121
#endif /* HAVE_SH64 */
122
  {0, 0, 0}
123
};
124
 
125
int sh_relax;           /* set if -relax seen */
126
 
127
/* Whether -small was seen.  */
128
 
129
int sh_small;
130
 
131
/* Flag to generate relocations against symbol values for local symbols.  */
132
 
133
static int dont_adjust_reloc_32;
134
 
135
/* Flag to indicate that '$' is allowed as a register prefix.  */
136
 
137
static int allow_dollar_register_prefix;
138
 
139
/* Preset architecture set, if given; zero otherwise.  */
140
 
141
static unsigned int preset_target_arch;
142
 
143
/* The bit mask of architectures that could
144
   accommodate the insns seen so far.  */
145
static unsigned int valid_arch;
146
 
147
const char EXP_CHARS[] = "eE";
148
 
149
/* Chars that mean this number is a floating point constant.  */
150
/* As in 0f12.456 */
151
/* or    0d1.2345e12 */
152
const char FLT_CHARS[] = "rRsSfFdDxXpP";
153
 
154
#define C(a,b) ENCODE_RELAX(a,b)
155
 
156
#define ENCODE_RELAX(what,length) (((what) << 4) + (length))
157
#define GET_WHAT(x) ((x>>4))
158
 
159
/* These are the three types of relaxable instruction.  */
160
/* These are the types of relaxable instructions; except for END which is
161
   a marker.  */
162
#define COND_JUMP 1
163
#define COND_JUMP_DELAY 2
164
#define UNCOND_JUMP  3
165
 
166
#ifdef HAVE_SH64
167
 
168
/* A 16-bit (times four) pc-relative operand, at most expanded to 32 bits.  */
169
#define SH64PCREL16_32 4
170
/* A 16-bit (times four) pc-relative operand, at most expanded to 64 bits.  */
171
#define SH64PCREL16_64 5
172
 
173
/* Variants of the above for adjusting the insn to PTA or PTB according to
174
   the label.  */
175
#define SH64PCREL16PT_32 6
176
#define SH64PCREL16PT_64 7
177
 
178
/* A MOVI expansion, expanding to at most 32 or 64 bits.  */
179
#define MOVI_IMM_32 8
180
#define MOVI_IMM_32_PCREL 9
181
#define MOVI_IMM_64 10
182
#define MOVI_IMM_64_PCREL 11
183
#define END 12
184
 
185
#else  /* HAVE_SH64 */
186
 
187
#define END 4
188
 
189
#endif /* HAVE_SH64 */
190
 
191
#define UNDEF_DISP 0
192
#define COND8  1
193
#define COND12 2
194
#define COND32 3
195
#define UNDEF_WORD_DISP 4
196
 
197
#define UNCOND12 1
198
#define UNCOND32 2
199
 
200
#ifdef HAVE_SH64
201
#define UNDEF_SH64PCREL 0
202
#define SH64PCREL16 1
203
#define SH64PCREL32 2
204
#define SH64PCREL48 3
205
#define SH64PCREL64 4
206
#define SH64PCRELPLT 5
207
 
208
#define UNDEF_MOVI 0
209
#define MOVI_16 1
210
#define MOVI_32 2
211
#define MOVI_48 3
212
#define MOVI_64 4
213
#define MOVI_PLT 5
214
#define MOVI_GOTOFF 6
215
#define MOVI_GOTPC 7
216
#endif /* HAVE_SH64 */
217
 
218
/* Branch displacements are from the address of the branch plus
219
   four, thus all minimum and maximum values have 4 added to them.  */
220
#define COND8_F 258
221
#define COND8_M -252
222
#define COND8_LENGTH 2
223
 
224
/* There is one extra instruction before the branch, so we must add
225
   two more bytes to account for it.  */
226
#define COND12_F 4100
227
#define COND12_M -4090
228
#define COND12_LENGTH 6
229
 
230
#define COND12_DELAY_LENGTH 4
231
 
232
/* ??? The minimum and maximum values are wrong, but this does not matter
233
   since this relocation type is not supported yet.  */
234
#define COND32_F (1<<30)
235
#define COND32_M -(1<<30)
236
#define COND32_LENGTH 14
237
 
238
#define UNCOND12_F 4098
239
#define UNCOND12_M -4092
240
#define UNCOND12_LENGTH 2
241
 
242
/* ??? The minimum and maximum values are wrong, but this does not matter
243
   since this relocation type is not supported yet.  */
244
#define UNCOND32_F (1<<30)
245
#define UNCOND32_M -(1<<30)
246
#define UNCOND32_LENGTH 14
247
 
248
#ifdef HAVE_SH64
249
/* The trivial expansion of a SH64PCREL16 relaxation is just a "PT label,
250
   TRd" as is the current insn, so no extra length.  Note that the "reach"
251
   is calculated from the address *after* that insn, but the offset in the
252
   insn is calculated from the beginning of the insn.  We also need to
253
   take into account the implicit 1 coded as the "A" in PTA when counting
254
   forward.  If PTB reaches an odd address, we trap that as an error
255
   elsewhere, so we don't have to have different relaxation entries.  We
256
   don't add a one to the negative range, since PTB would then have the
257
   farthest backward-reaching value skipped, not generated at relaxation.  */
258
#define SH64PCREL16_F (32767 * 4 - 4 + 1)
259
#define SH64PCREL16_M (-32768 * 4 - 4)
260
#define SH64PCREL16_LENGTH 0
261
 
262
/* The next step is to change that PT insn into
263
     MOVI ((label - datalabel Ln) >> 16) & 65535, R25
264
     SHORI (label - datalabel Ln) & 65535, R25
265
    Ln:
266
     PTREL R25,TRd
267
   which means two extra insns, 8 extra bytes.  This is the limit for the
268
   32-bit ABI.
269
 
270
   The expressions look a bit bad since we have to adjust this to avoid overflow on a
271
   32-bit host.  */
272
#define SH64PCREL32_F ((((long) 1 << 30) - 1) * 2 + 1 - 4)
273
#define SH64PCREL32_LENGTH (2 * 4)
274
 
275
/* Similarly, we just change the MOVI and add a SHORI for the 48-bit
276
   expansion.  */
277
#if BFD_HOST_64BIT_LONG
278
/* The "reach" type is long, so we can only do this for a 64-bit-long
279
   host.  */
280
#define SH64PCREL32_M (((long) -1 << 30) * 2 - 4)
281
#define SH64PCREL48_F ((((long) 1 << 47) - 1) - 4)
282
#define SH64PCREL48_M (((long) -1 << 47) - 4)
283
#define SH64PCREL48_LENGTH (3 * 4)
284
#else
285
/* If the host does not have 64-bit longs, just make this state identical
286
   in reach to the 32-bit state.  Note that we have a slightly incorrect
287
   reach, but the correct one above will overflow a 32-bit number.  */
288
#define SH64PCREL32_M (((long) -1 << 30) * 2)
289
#define SH64PCREL48_F SH64PCREL32_F
290
#define SH64PCREL48_M SH64PCREL32_M
291
#define SH64PCREL48_LENGTH (3 * 4)
292
#endif /* BFD_HOST_64BIT_LONG */
293
 
294
/* And similarly for the 64-bit expansion; a MOVI + SHORI + SHORI + SHORI
295
   + PTREL sequence.  */
296
#define SH64PCREL64_LENGTH (4 * 4)
297
 
298
/* For MOVI, we make the MOVI + SHORI... expansion you can see in the
299
   SH64PCREL expansions.  The PCREL one is similar, but the other has no
300
   pc-relative reach; it must be fully expanded in
301
   shmedia_md_estimate_size_before_relax.  */
302
#define MOVI_16_LENGTH 0
303
#define MOVI_16_F (32767 - 4)
304
#define MOVI_16_M (-32768 - 4)
305
#define MOVI_32_LENGTH 4
306
#define MOVI_32_F ((((long) 1 << 30) - 1) * 2 + 1 - 4)
307
#define MOVI_48_LENGTH 8
308
 
309
#if BFD_HOST_64BIT_LONG
310
/* The "reach" type is long, so we can only do this for a 64-bit-long
311
   host.  */
312
#define MOVI_32_M (((long) -1 << 30) * 2 - 4)
313
#define MOVI_48_F ((((long) 1 << 47) - 1) - 4)
314
#define MOVI_48_M (((long) -1 << 47) - 4)
315
#else
316
/* If the host does not have 64-bit longs, just make this state identical
317
   in reach to the 32-bit state.  Note that we have a slightly incorrect
318
   reach, but the correct one above will overflow a 32-bit number.  */
319
#define MOVI_32_M (((long) -1 << 30) * 2)
320
#define MOVI_48_F MOVI_32_F
321
#define MOVI_48_M MOVI_32_M
322
#endif /* BFD_HOST_64BIT_LONG */
323
 
324
#define MOVI_64_LENGTH 12
325
#endif /* HAVE_SH64 */
326
 
327
#define EMPTY { 0, 0, 0, 0 }
328
 
329
const relax_typeS md_relax_table[C (END, 0)] = {
330
  EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
331
  EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
332
 
333
  EMPTY,
334
  /* C (COND_JUMP, COND8) */
335
  { COND8_F, COND8_M, COND8_LENGTH, C (COND_JUMP, COND12) },
336
  /* C (COND_JUMP, COND12) */
337
  { COND12_F, COND12_M, COND12_LENGTH, C (COND_JUMP, COND32), },
338
  /* C (COND_JUMP, COND32) */
339
  { COND32_F, COND32_M, COND32_LENGTH, 0, },
340
  /* C (COND_JUMP, UNDEF_WORD_DISP) */
341
  { 0, 0, COND32_LENGTH, 0, },
342
  EMPTY, EMPTY, EMPTY,
343
  EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
344
 
345
  EMPTY,
346
  /* C (COND_JUMP_DELAY, COND8) */
347
  { COND8_F, COND8_M, COND8_LENGTH, C (COND_JUMP_DELAY, COND12) },
348
  /* C (COND_JUMP_DELAY, COND12) */
349
  { COND12_F, COND12_M, COND12_DELAY_LENGTH, C (COND_JUMP_DELAY, COND32), },
350
  /* C (COND_JUMP_DELAY, COND32) */
351
  { COND32_F, COND32_M, COND32_LENGTH, 0, },
352
  /* C (COND_JUMP_DELAY, UNDEF_WORD_DISP) */
353
  { 0, 0, COND32_LENGTH, 0, },
354
  EMPTY, EMPTY, EMPTY,
355
  EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
356
 
357
  EMPTY,
358
  /* C (UNCOND_JUMP, UNCOND12) */
359
  { UNCOND12_F, UNCOND12_M, UNCOND12_LENGTH, C (UNCOND_JUMP, UNCOND32), },
360
  /* C (UNCOND_JUMP, UNCOND32) */
361
  { UNCOND32_F, UNCOND32_M, UNCOND32_LENGTH, 0, },
362
  EMPTY,
363
  /* C (UNCOND_JUMP, UNDEF_WORD_DISP) */
364
  { 0, 0, UNCOND32_LENGTH, 0, },
365
  EMPTY, EMPTY, EMPTY,
366
  EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
367
 
368
#ifdef HAVE_SH64
369
  /* C (SH64PCREL16_32, SH64PCREL16) */
370
  EMPTY,
371
  { SH64PCREL16_F, SH64PCREL16_M, SH64PCREL16_LENGTH, C (SH64PCREL16_32, SH64PCREL32) },
372
  /* C (SH64PCREL16_32, SH64PCREL32) */
373
  { 0, 0, SH64PCREL32_LENGTH, 0 },
374
  EMPTY, EMPTY,
375
  /* C (SH64PCREL16_32, SH64PCRELPLT) */
376
  { 0, 0, SH64PCREL32_LENGTH, 0 },
377
  EMPTY, EMPTY,
378
  EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
379
 
380
  /* C (SH64PCREL16_64, SH64PCREL16) */
381
  EMPTY,
382
  { SH64PCREL16_F, SH64PCREL16_M, SH64PCREL16_LENGTH, C (SH64PCREL16_64, SH64PCREL32) },
383
  /* C (SH64PCREL16_64, SH64PCREL32) */
384
  { SH64PCREL32_F, SH64PCREL32_M, SH64PCREL32_LENGTH, C (SH64PCREL16_64, SH64PCREL48) },
385
  /* C (SH64PCREL16_64, SH64PCREL48) */
386
  { SH64PCREL48_F, SH64PCREL48_M, SH64PCREL48_LENGTH, C (SH64PCREL16_64, SH64PCREL64) },
387
  /* C (SH64PCREL16_64, SH64PCREL64) */
388
  { 0, 0, SH64PCREL64_LENGTH, 0 },
389
  /* C (SH64PCREL16_64, SH64PCRELPLT) */
390
  { 0, 0, SH64PCREL64_LENGTH, 0 },
391
  EMPTY, EMPTY,
392
  EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
393
 
394
  /* C (SH64PCREL16PT_32, SH64PCREL16) */
395
  EMPTY,
396
  { SH64PCREL16_F, SH64PCREL16_M, SH64PCREL16_LENGTH, C (SH64PCREL16PT_32, SH64PCREL32) },
397
  /* C (SH64PCREL16PT_32, SH64PCREL32) */
398
  { 0, 0, SH64PCREL32_LENGTH, 0 },
399
  EMPTY, EMPTY,
400
  /* C (SH64PCREL16PT_32, SH64PCRELPLT) */
401
  { 0, 0, SH64PCREL32_LENGTH, 0 },
402
  EMPTY, EMPTY,
403
  EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
404
 
405
  /* C (SH64PCREL16PT_64, SH64PCREL16) */
406
  EMPTY,
407
  { SH64PCREL16_F, SH64PCREL16_M, SH64PCREL16_LENGTH, C (SH64PCREL16PT_64, SH64PCREL32) },
408
  /* C (SH64PCREL16PT_64, SH64PCREL32) */
409
  { SH64PCREL32_F,
410
    SH64PCREL32_M,
411
    SH64PCREL32_LENGTH,
412
    C (SH64PCREL16PT_64, SH64PCREL48) },
413
  /* C (SH64PCREL16PT_64, SH64PCREL48) */
414
  { SH64PCREL48_F, SH64PCREL48_M, SH64PCREL48_LENGTH, C (SH64PCREL16PT_64, SH64PCREL64) },
415
  /* C (SH64PCREL16PT_64, SH64PCREL64) */
416
  { 0, 0, SH64PCREL64_LENGTH, 0 },
417
  /* C (SH64PCREL16PT_64, SH64PCRELPLT) */
418
  { 0, 0, SH64PCREL64_LENGTH, 0},
419
  EMPTY, EMPTY,
420
  EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
421
 
422
  /* C (MOVI_IMM_32, UNDEF_MOVI) */
423
  { 0, 0, MOVI_32_LENGTH, 0 },
424
  /* C (MOVI_IMM_32, MOVI_16) */
425
  { MOVI_16_F, MOVI_16_M, MOVI_16_LENGTH, C (MOVI_IMM_32, MOVI_32) },
426
  /* C (MOVI_IMM_32, MOVI_32) */
427
  { MOVI_32_F, MOVI_32_M, MOVI_32_LENGTH, 0 },
428
  EMPTY, EMPTY, EMPTY,
429
  /* C (MOVI_IMM_32, MOVI_GOTOFF) */
430
  { 0, 0, MOVI_32_LENGTH, 0 },
431
  EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
432
 
433
  /* C (MOVI_IMM_32_PCREL, MOVI_16) */
434
  EMPTY,
435
  { MOVI_16_F, MOVI_16_M, MOVI_16_LENGTH, C (MOVI_IMM_32_PCREL, MOVI_32) },
436
  /* C (MOVI_IMM_32_PCREL, MOVI_32) */
437
  { 0, 0, MOVI_32_LENGTH, 0 },
438
  EMPTY, EMPTY,
439
  /* C (MOVI_IMM_32_PCREL, MOVI_PLT) */
440
  { 0, 0, MOVI_32_LENGTH, 0 },
441
  EMPTY,
442
  /* C (MOVI_IMM_32_PCREL, MOVI_GOTPC) */
443
  { 0, 0, MOVI_32_LENGTH, 0 },
444
  EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
445
 
446
  /* C (MOVI_IMM_64, UNDEF_MOVI) */
447
  { 0, 0, MOVI_64_LENGTH, 0 },
448
  /* C (MOVI_IMM_64, MOVI_16) */
449
  { MOVI_16_F, MOVI_16_M, MOVI_16_LENGTH, C (MOVI_IMM_64, MOVI_32) },
450
  /* C (MOVI_IMM_64, MOVI_32) */
451
  { MOVI_32_F, MOVI_32_M, MOVI_32_LENGTH, C (MOVI_IMM_64, MOVI_48) },
452
  /* C (MOVI_IMM_64, MOVI_48) */
453
  { MOVI_48_F, MOVI_48_M, MOVI_48_LENGTH, C (MOVI_IMM_64, MOVI_64) },
454
  /* C (MOVI_IMM_64, MOVI_64) */
455
  { 0, 0, MOVI_64_LENGTH, 0 },
456
  EMPTY,
457
  /* C (MOVI_IMM_64, MOVI_GOTOFF) */
458
  { 0, 0, MOVI_64_LENGTH, 0 },
459
  EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
460
 
461
  /* C (MOVI_IMM_64_PCREL, MOVI_16) */
462
  EMPTY,
463
  { MOVI_16_F, MOVI_16_M, MOVI_16_LENGTH, C (MOVI_IMM_64_PCREL, MOVI_32) },
464
  /* C (MOVI_IMM_64_PCREL, MOVI_32) */
465
  { MOVI_32_F, MOVI_32_M, MOVI_32_LENGTH, C (MOVI_IMM_64_PCREL, MOVI_48) },
466
  /* C (MOVI_IMM_64_PCREL, MOVI_48) */
467
  { MOVI_48_F, MOVI_48_M, MOVI_48_LENGTH, C (MOVI_IMM_64_PCREL, MOVI_64) },
468
  /* C (MOVI_IMM_64_PCREL, MOVI_64) */
469
  { 0, 0, MOVI_64_LENGTH, 0 },
470
  /* C (MOVI_IMM_64_PCREL, MOVI_PLT) */
471
  { 0, 0, MOVI_64_LENGTH, 0 },
472
  EMPTY,
473
  /* C (MOVI_IMM_64_PCREL, MOVI_GOTPC) */
474
  { 0, 0, MOVI_64_LENGTH, 0 },
475
  EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
476
 
477
#endif /* HAVE_SH64 */
478
 
479
};
480
 
481
#undef EMPTY
482
 
483
static struct hash_control *opcode_hash_control;        /* Opcode mnemonics */
484
 
485
 
486
#ifdef OBJ_ELF
487
/* Determinet whether the symbol needs any kind of PIC relocation.  */
488
 
489
inline static int
490
sh_PIC_related_p (symbolS *sym)
491
{
492
  expressionS *exp;
493
 
494
  if (! sym)
495
    return 0;
496
 
497
  if (sym == GOT_symbol)
498
    return 1;
499
 
500
#ifdef HAVE_SH64
501
  if (sh_PIC_related_p (*symbol_get_tc (sym)))
502
    return 1;
503
#endif
504
 
505
  exp = symbol_get_value_expression (sym);
506
 
507
  return (exp->X_op == O_PIC_reloc
508
          || sh_PIC_related_p (exp->X_add_symbol)
509
          || sh_PIC_related_p (exp->X_op_symbol));
510
}
511
 
512
/* Determine the relocation type to be used to represent the
513
   expression, that may be rearranged.  */
514
 
515
static int
516
sh_check_fixup (expressionS *main_exp, bfd_reloc_code_real_type *r_type_p)
517
{
518
  expressionS *exp = main_exp;
519
 
520
  /* This is here for backward-compatibility only.  GCC used to generated:
521
 
522
        f@PLT + . - (.LPCS# + 2)
523
 
524
     but we'd rather be able to handle this as a PIC-related reference
525
     plus/minus a symbol.  However, gas' parser gives us:
526
 
527
        O_subtract (O_add (f@PLT, .), .LPCS#+2)
528
 
529
     so we attempt to transform this into:
530
 
531
        O_subtract (f@PLT, O_subtract (.LPCS#+2, .))
532
 
533
     which we can handle simply below.  */
534
  if (exp->X_op == O_subtract)
535
    {
536
      if (sh_PIC_related_p (exp->X_op_symbol))
537
        return 1;
538
 
539
      exp = symbol_get_value_expression (exp->X_add_symbol);
540
 
541
      if (exp && sh_PIC_related_p (exp->X_op_symbol))
542
        return 1;
543
 
544
      if (exp && exp->X_op == O_add
545
          && sh_PIC_related_p (exp->X_add_symbol))
546
        {
547
          symbolS *sym = exp->X_add_symbol;
548
 
549
          exp->X_op = O_subtract;
550
          exp->X_add_symbol = main_exp->X_op_symbol;
551
 
552
          main_exp->X_op_symbol = main_exp->X_add_symbol;
553
          main_exp->X_add_symbol = sym;
554
 
555
          main_exp->X_add_number += exp->X_add_number;
556
          exp->X_add_number = 0;
557
        }
558
 
559
      exp = main_exp;
560
    }
561
  else if (exp->X_op == O_add && sh_PIC_related_p (exp->X_op_symbol))
562
    return 1;
563
 
564
  if (exp->X_op == O_symbol || exp->X_op == O_add || exp->X_op == O_subtract)
565
    {
566
#ifdef HAVE_SH64
567
      if (exp->X_add_symbol
568
          && (exp->X_add_symbol == GOT_symbol
569
              || (GOT_symbol
570
                  && *symbol_get_tc (exp->X_add_symbol) == GOT_symbol)))
571
        {
572
          switch (*r_type_p)
573
            {
574
            case BFD_RELOC_SH_IMM_LOW16:
575
              *r_type_p = BFD_RELOC_SH_GOTPC_LOW16;
576
              break;
577
 
578
            case BFD_RELOC_SH_IMM_MEDLOW16:
579
              *r_type_p = BFD_RELOC_SH_GOTPC_MEDLOW16;
580
              break;
581
 
582
            case BFD_RELOC_SH_IMM_MEDHI16:
583
              *r_type_p = BFD_RELOC_SH_GOTPC_MEDHI16;
584
              break;
585
 
586
            case BFD_RELOC_SH_IMM_HI16:
587
              *r_type_p = BFD_RELOC_SH_GOTPC_HI16;
588
              break;
589
 
590
            case BFD_RELOC_NONE:
591
            case BFD_RELOC_UNUSED:
592
              *r_type_p = BFD_RELOC_SH_GOTPC;
593
              break;
594
 
595
            default:
596
              abort ();
597
            }
598
          return 0;
599
        }
600
#else
601
      if (exp->X_add_symbol && exp->X_add_symbol == GOT_symbol)
602
        {
603
          *r_type_p = BFD_RELOC_SH_GOTPC;
604
          return 0;
605
        }
606
#endif
607
      exp = symbol_get_value_expression (exp->X_add_symbol);
608
      if (! exp)
609
        return 0;
610
    }
611
 
612
  if (exp->X_op == O_PIC_reloc)
613
    {
614
#ifdef HAVE_SH64
615
      switch (*r_type_p)
616
        {
617
        case BFD_RELOC_NONE:
618
        case BFD_RELOC_UNUSED:
619
          *r_type_p = exp->X_md;
620
          break;
621
 
622
        case BFD_RELOC_SH_IMM_LOW16:
623
          switch (exp->X_md)
624
            {
625
            case BFD_RELOC_32_GOTOFF:
626
              *r_type_p = BFD_RELOC_SH_GOTOFF_LOW16;
627
              break;
628
 
629
            case BFD_RELOC_SH_GOTPLT32:
630
              *r_type_p = BFD_RELOC_SH_GOTPLT_LOW16;
631
              break;
632
 
633
            case BFD_RELOC_32_GOT_PCREL:
634
              *r_type_p = BFD_RELOC_SH_GOT_LOW16;
635
              break;
636
 
637
            case BFD_RELOC_32_PLT_PCREL:
638
              *r_type_p = BFD_RELOC_SH_PLT_LOW16;
639
              break;
640
 
641
            default:
642
              abort ();
643
            }
644
          break;
645
 
646
        case BFD_RELOC_SH_IMM_MEDLOW16:
647
          switch (exp->X_md)
648
            {
649
            case BFD_RELOC_32_GOTOFF:
650
              *r_type_p = BFD_RELOC_SH_GOTOFF_MEDLOW16;
651
              break;
652
 
653
            case BFD_RELOC_SH_GOTPLT32:
654
              *r_type_p = BFD_RELOC_SH_GOTPLT_MEDLOW16;
655
              break;
656
 
657
            case BFD_RELOC_32_GOT_PCREL:
658
              *r_type_p = BFD_RELOC_SH_GOT_MEDLOW16;
659
              break;
660
 
661
            case BFD_RELOC_32_PLT_PCREL:
662
              *r_type_p = BFD_RELOC_SH_PLT_MEDLOW16;
663
              break;
664
 
665
            default:
666
              abort ();
667
            }
668
          break;
669
 
670
        case BFD_RELOC_SH_IMM_MEDHI16:
671
          switch (exp->X_md)
672
            {
673
            case BFD_RELOC_32_GOTOFF:
674
              *r_type_p = BFD_RELOC_SH_GOTOFF_MEDHI16;
675
              break;
676
 
677
            case BFD_RELOC_SH_GOTPLT32:
678
              *r_type_p = BFD_RELOC_SH_GOTPLT_MEDHI16;
679
              break;
680
 
681
            case BFD_RELOC_32_GOT_PCREL:
682
              *r_type_p = BFD_RELOC_SH_GOT_MEDHI16;
683
              break;
684
 
685
            case BFD_RELOC_32_PLT_PCREL:
686
              *r_type_p = BFD_RELOC_SH_PLT_MEDHI16;
687
              break;
688
 
689
            default:
690
              abort ();
691
            }
692
          break;
693
 
694
        case BFD_RELOC_SH_IMM_HI16:
695
          switch (exp->X_md)
696
            {
697
            case BFD_RELOC_32_GOTOFF:
698
              *r_type_p = BFD_RELOC_SH_GOTOFF_HI16;
699
              break;
700
 
701
            case BFD_RELOC_SH_GOTPLT32:
702
              *r_type_p = BFD_RELOC_SH_GOTPLT_HI16;
703
              break;
704
 
705
            case BFD_RELOC_32_GOT_PCREL:
706
              *r_type_p = BFD_RELOC_SH_GOT_HI16;
707
              break;
708
 
709
            case BFD_RELOC_32_PLT_PCREL:
710
              *r_type_p = BFD_RELOC_SH_PLT_HI16;
711
              break;
712
 
713
            default:
714
              abort ();
715
            }
716
          break;
717
 
718
        default:
719
          abort ();
720
        }
721
#else
722
      *r_type_p = exp->X_md;
723
#endif
724
      if (exp == main_exp)
725
        exp->X_op = O_symbol;
726
      else
727
        {
728
          main_exp->X_add_symbol = exp->X_add_symbol;
729
          main_exp->X_add_number += exp->X_add_number;
730
        }
731
    }
732
  else
733
    return (sh_PIC_related_p (exp->X_add_symbol)
734
            || sh_PIC_related_p (exp->X_op_symbol));
735
 
736
  return 0;
737
}
738
 
739
/* Add expression EXP of SIZE bytes to offset OFF of fragment FRAG.  */
740
 
741
void
742
sh_cons_fix_new (fragS *frag, int off, int size, expressionS *exp)
743
{
744
  bfd_reloc_code_real_type r_type = BFD_RELOC_UNUSED;
745
 
746
  if (sh_check_fixup (exp, &r_type))
747
    as_bad (_("Invalid PIC expression."));
748
 
749
  if (r_type == BFD_RELOC_UNUSED)
750
    switch (size)
751
      {
752
      case 1:
753
        r_type = BFD_RELOC_8;
754
        break;
755
 
756
      case 2:
757
        r_type = BFD_RELOC_16;
758
        break;
759
 
760
      case 4:
761
        r_type = BFD_RELOC_32;
762
        break;
763
 
764
#ifdef HAVE_SH64
765
      case 8:
766
        r_type = BFD_RELOC_64;
767
        break;
768
#endif
769
 
770
      default:
771
        goto error;
772
      }
773
  else if (size != 4)
774
    {
775
    error:
776
      as_bad (_("unsupported BFD relocation size %u"), size);
777
      r_type = BFD_RELOC_UNUSED;
778
    }
779
 
780
  fix_new_exp (frag, off, size, exp, 0, r_type);
781
}
782
 
783
/* The regular cons() function, that reads constants, doesn't support
784
   suffixes such as @GOT, @GOTOFF and @PLT, that generate
785
   machine-specific relocation types.  So we must define it here.  */
786
/* Clobbers input_line_pointer, checks end-of-line.  */
787
/* NBYTES 1=.byte, 2=.word, 4=.long */
788
static void
789
sh_elf_cons (register int nbytes)
790
{
791
  expressionS exp;
792
 
793
#ifdef HAVE_SH64
794
 
795
  /* Update existing range to include a previous insn, if there was one.  */
796
  sh64_update_contents_mark (TRUE);
797
 
798
  /* We need to make sure the contents type is set to data.  */
799
  sh64_flag_output ();
800
 
801
#endif /* HAVE_SH64 */
802
 
803
  if (is_it_end_of_statement ())
804
    {
805
      demand_empty_rest_of_line ();
806
      return;
807
    }
808
 
809
#ifdef md_cons_align
810
  md_cons_align (nbytes);
811
#endif
812
 
813
  do
814
    {
815
      expression (&exp);
816
      emit_expr (&exp, (unsigned int) nbytes);
817
    }
818
  while (*input_line_pointer++ == ',');
819
 
820
  input_line_pointer--;         /* Put terminator back into stream.  */
821
  if (*input_line_pointer == '#' || *input_line_pointer == '!')
822
    {
823
       while (! is_end_of_line[(unsigned char) *input_line_pointer++]);
824
    }
825
  else
826
    demand_empty_rest_of_line ();
827
}
828
 
829
/* The regular frag_offset_fixed_p doesn't work for rs_align_test
830
   frags.  */
831
 
832
static bfd_boolean
833
align_test_frag_offset_fixed_p (const fragS *frag1, const fragS *frag2,
834
                                bfd_vma *offset)
835
{
836
  const fragS *frag;
837
  bfd_vma off;
838
 
839
  /* Start with offset initialised to difference between the two frags.
840
     Prior to assigning frag addresses this will be zero.  */
841
  off = frag1->fr_address - frag2->fr_address;
842
  if (frag1 == frag2)
843
    {
844
      *offset = off;
845
      return TRUE;
846
    }
847
 
848
  /* Maybe frag2 is after frag1.  */
849
  frag = frag1;
850
  while (frag->fr_type == rs_fill
851
         || frag->fr_type == rs_align_test)
852
    {
853
      if (frag->fr_type == rs_fill)
854
        off += frag->fr_fix + frag->fr_offset * frag->fr_var;
855
      else
856
        off += frag->fr_fix;
857
      frag = frag->fr_next;
858
      if (frag == NULL)
859
        break;
860
      if (frag == frag2)
861
        {
862
          *offset = off;
863
          return TRUE;
864
        }
865
    }
866
 
867
  /* Maybe frag1 is after frag2.  */
868
  off = frag1->fr_address - frag2->fr_address;
869
  frag = frag2;
870
  while (frag->fr_type == rs_fill
871
         || frag->fr_type == rs_align_test)
872
    {
873
      if (frag->fr_type == rs_fill)
874
        off -= frag->fr_fix + frag->fr_offset * frag->fr_var;
875
      else
876
        off -= frag->fr_fix;
877
      frag = frag->fr_next;
878
      if (frag == NULL)
879
        break;
880
      if (frag == frag1)
881
        {
882
          *offset = off;
883
          return TRUE;
884
        }
885
    }
886
 
887
  return FALSE;
888
}
889
 
890
/* Optimize a difference of symbols which have rs_align_test frag if
891
   possible.  */
892
 
893
int
894
sh_optimize_expr (expressionS *l, operatorT op, expressionS *r)
895
{
896
  bfd_vma frag_off;
897
 
898
  if (op == O_subtract
899
      && l->X_op == O_symbol
900
      && r->X_op == O_symbol
901
      && S_GET_SEGMENT (l->X_add_symbol) == S_GET_SEGMENT (r->X_add_symbol)
902
      && (SEG_NORMAL (S_GET_SEGMENT (l->X_add_symbol))
903
          || r->X_add_symbol == l->X_add_symbol)
904
      && align_test_frag_offset_fixed_p (symbol_get_frag (l->X_add_symbol),
905
                                         symbol_get_frag (r->X_add_symbol),
906
                                         &frag_off))
907
    {
908
      l->X_add_number -= r->X_add_number;
909
      l->X_add_number -= frag_off / OCTETS_PER_BYTE;
910
      l->X_add_number += (S_GET_VALUE (l->X_add_symbol)
911
                          - S_GET_VALUE (r->X_add_symbol));
912
      l->X_op = O_constant;
913
      l->X_add_symbol = 0;
914
      return 1;
915
    }
916
  return 0;
917
}
918
#endif /* OBJ_ELF */
919
 
920
/* This function is called once, at assembler startup time.  This should
921
   set up all the tables, etc that the MD part of the assembler needs.  */
922
 
923
void
924
md_begin (void)
925
{
926
  const sh_opcode_info *opcode;
927
  char *prev_name = "";
928
  unsigned int target_arch;
929
 
930
  target_arch
931
    = preset_target_arch ? preset_target_arch : arch_sh_up & ~arch_sh_has_dsp;
932
  valid_arch = target_arch;
933
 
934
#ifdef HAVE_SH64
935
  shmedia_md_begin ();
936
#endif
937
 
938
  opcode_hash_control = hash_new ();
939
 
940
  /* Insert unique names into hash table.  */
941
  for (opcode = sh_table; opcode->name; opcode++)
942
    {
943
      if (strcmp (prev_name, opcode->name) != 0)
944
        {
945
          if (!SH_MERGE_ARCH_SET_VALID (opcode->arch, target_arch))
946
            continue;
947
          prev_name = opcode->name;
948
          hash_insert (opcode_hash_control, opcode->name, (char *) opcode);
949
        }
950
    }
951
}
952
 
953
static int reg_m;
954
static int reg_n;
955
static int reg_x, reg_y;
956
static int reg_efg;
957
static int reg_b;
958
 
959
#define IDENT_CHAR(c) (ISALNUM (c) || (c) == '_')
960
 
961
/* Try to parse a reg name.  Return the number of chars consumed.  */
962
 
963
static unsigned int
964
parse_reg_without_prefix (char *src, int *mode, int *reg)
965
{
966
  char l0 = TOLOWER (src[0]);
967
  char l1 = l0 ? TOLOWER (src[1]) : 0;
968
 
969
  /* We use ! IDENT_CHAR for the next character after the register name, to
970
     make sure that we won't accidentally recognize a symbol name such as
971
     'sram' or sr_ram as being a reference to the register 'sr'.  */
972
 
973
  if (l0 == 'r')
974
    {
975
      if (l1 == '1')
976
        {
977
          if (src[2] >= '0' && src[2] <= '5'
978
              && ! IDENT_CHAR ((unsigned char) src[3]))
979
            {
980
              *mode = A_REG_N;
981
              *reg = 10 + src[2] - '0';
982
              return 3;
983
            }
984
        }
985
      if (l1 >= '0' && l1 <= '9'
986
          && ! IDENT_CHAR ((unsigned char) src[2]))
987
        {
988
          *mode = A_REG_N;
989
          *reg = (l1 - '0');
990
          return 2;
991
        }
992
      if (l1 >= '0' && l1 <= '7' && strncasecmp (&src[2], "_bank", 5) == 0
993
          && ! IDENT_CHAR ((unsigned char) src[7]))
994
        {
995
          *mode = A_REG_B;
996
          *reg  = (l1 - '0');
997
          return 7;
998
        }
999
 
1000
      if (l1 == 'e' && ! IDENT_CHAR ((unsigned char) src[2]))
1001
        {
1002
          *mode = A_RE;
1003
          return 2;
1004
        }
1005
      if (l1 == 's' && ! IDENT_CHAR ((unsigned char) src[2]))
1006
        {
1007
          *mode = A_RS;
1008
          return 2;
1009
        }
1010
    }
1011
 
1012
  if (l0 == 'a')
1013
    {
1014
      if (l1 == '0')
1015
        {
1016
          if (! IDENT_CHAR ((unsigned char) src[2]))
1017
            {
1018
              *mode = DSP_REG_N;
1019
              *reg = A_A0_NUM;
1020
              return 2;
1021
            }
1022
          if (TOLOWER (src[2]) == 'g' && ! IDENT_CHAR ((unsigned char) src[3]))
1023
            {
1024
              *mode = DSP_REG_N;
1025
              *reg = A_A0G_NUM;
1026
              return 3;
1027
            }
1028
        }
1029
      if (l1 == '1')
1030
        {
1031
          if (! IDENT_CHAR ((unsigned char) src[2]))
1032
            {
1033
              *mode = DSP_REG_N;
1034
              *reg = A_A1_NUM;
1035
              return 2;
1036
            }
1037
          if (TOLOWER (src[2]) == 'g' && ! IDENT_CHAR ((unsigned char) src[3]))
1038
            {
1039
              *mode = DSP_REG_N;
1040
              *reg = A_A1G_NUM;
1041
              return 3;
1042
            }
1043
        }
1044
 
1045
      if (l1 == 'x' && src[2] >= '0' && src[2] <= '1'
1046
          && ! IDENT_CHAR ((unsigned char) src[3]))
1047
        {
1048
          *mode = A_REG_N;
1049
          *reg = 4 + (l1 - '0');
1050
          return 3;
1051
        }
1052
      if (l1 == 'y' && src[2] >= '0' && src[2] <= '1'
1053
          && ! IDENT_CHAR ((unsigned char) src[3]))
1054
        {
1055
          *mode = A_REG_N;
1056
          *reg = 6 + (l1 - '0');
1057
          return 3;
1058
        }
1059
      if (l1 == 's' && src[2] >= '0' && src[2] <= '3'
1060
          && ! IDENT_CHAR ((unsigned char) src[3]))
1061
        {
1062
          int n = l1 - '0';
1063
 
1064
          *mode = A_REG_N;
1065
          *reg = n | ((~n & 2) << 1);
1066
          return 3;
1067
        }
1068
    }
1069
 
1070
  if (l0 == 'i' && l1 && ! IDENT_CHAR ((unsigned char) src[2]))
1071
    {
1072
      if (l1 == 's')
1073
        {
1074
          *mode = A_REG_N;
1075
          *reg = 8;
1076
          return 2;
1077
        }
1078
      if (l1 == 'x')
1079
        {
1080
          *mode = A_REG_N;
1081
          *reg = 8;
1082
          return 2;
1083
        }
1084
      if (l1 == 'y')
1085
        {
1086
          *mode = A_REG_N;
1087
          *reg = 9;
1088
          return 2;
1089
        }
1090
    }
1091
 
1092
  if (l0 == 'x' && l1 >= '0' && l1 <= '1'
1093
      && ! IDENT_CHAR ((unsigned char) src[2]))
1094
    {
1095
      *mode = DSP_REG_N;
1096
      *reg = A_X0_NUM + l1 - '0';
1097
      return 2;
1098
    }
1099
 
1100
  if (l0 == 'y' && l1 >= '0' && l1 <= '1'
1101
      && ! IDENT_CHAR ((unsigned char) src[2]))
1102
    {
1103
      *mode = DSP_REG_N;
1104
      *reg = A_Y0_NUM + l1 - '0';
1105
      return 2;
1106
    }
1107
 
1108
  if (l0 == 'm' && l1 >= '0' && l1 <= '1'
1109
      && ! IDENT_CHAR ((unsigned char) src[2]))
1110
    {
1111
      *mode = DSP_REG_N;
1112
      *reg = l1 == '0' ? A_M0_NUM : A_M1_NUM;
1113
      return 2;
1114
    }
1115
 
1116
  if (l0 == 's'
1117
      && l1 == 's'
1118
      && TOLOWER (src[2]) == 'r' && ! IDENT_CHAR ((unsigned char) src[3]))
1119
    {
1120
      *mode = A_SSR;
1121
      return 3;
1122
    }
1123
 
1124
  if (l0 == 's' && l1 == 'p' && TOLOWER (src[2]) == 'c'
1125
      && ! IDENT_CHAR ((unsigned char) src[3]))
1126
    {
1127
      *mode = A_SPC;
1128
      return 3;
1129
    }
1130
 
1131
  if (l0 == 's' && l1 == 'g' && TOLOWER (src[2]) == 'r'
1132
      && ! IDENT_CHAR ((unsigned char) src[3]))
1133
    {
1134
      *mode = A_SGR;
1135
      return 3;
1136
    }
1137
 
1138
  if (l0 == 'd' && l1 == 's' && TOLOWER (src[2]) == 'r'
1139
      && ! IDENT_CHAR ((unsigned char) src[3]))
1140
    {
1141
      *mode = A_DSR;
1142
      return 3;
1143
    }
1144
 
1145
  if (l0 == 'd' && l1 == 'b' && TOLOWER (src[2]) == 'r'
1146
      && ! IDENT_CHAR ((unsigned char) src[3]))
1147
    {
1148
      *mode = A_DBR;
1149
      return 3;
1150
    }
1151
 
1152
  if (l0 == 's' && l1 == 'r' && ! IDENT_CHAR ((unsigned char) src[2]))
1153
    {
1154
      *mode = A_SR;
1155
      return 2;
1156
    }
1157
 
1158
  if (l0 == 's' && l1 == 'p' && ! IDENT_CHAR ((unsigned char) src[2]))
1159
    {
1160
      *mode = A_REG_N;
1161
      *reg = 15;
1162
      return 2;
1163
    }
1164
 
1165
  if (l0 == 'p' && l1 == 'r' && ! IDENT_CHAR ((unsigned char) src[2]))
1166
    {
1167
      *mode = A_PR;
1168
      return 2;
1169
    }
1170
  if (l0 == 'p' && l1 == 'c' && ! IDENT_CHAR ((unsigned char) src[2]))
1171
    {
1172
      /* Don't use A_DISP_PC here - that would accept stuff like 'mova pc,r0'
1173
         and use an uninitialized immediate.  */
1174
      *mode = A_PC;
1175
      return 2;
1176
    }
1177
  if (l0 == 'g' && l1 == 'b' && TOLOWER (src[2]) == 'r'
1178
      && ! IDENT_CHAR ((unsigned char) src[3]))
1179
    {
1180
      *mode = A_GBR;
1181
      return 3;
1182
    }
1183
  if (l0 == 'v' && l1 == 'b' && TOLOWER (src[2]) == 'r'
1184
      && ! IDENT_CHAR ((unsigned char) src[3]))
1185
    {
1186
      *mode = A_VBR;
1187
      return 3;
1188
    }
1189
 
1190
  if (l0 == 't' && l1 == 'b' && TOLOWER (src[2]) == 'r'
1191
      && ! IDENT_CHAR ((unsigned char) src[3]))
1192
    {
1193
      *mode = A_TBR;
1194
      return 3;
1195
    }
1196
  if (l0 == 'm' && l1 == 'a' && TOLOWER (src[2]) == 'c'
1197
      && ! IDENT_CHAR ((unsigned char) src[4]))
1198
    {
1199
      if (TOLOWER (src[3]) == 'l')
1200
        {
1201
          *mode = A_MACL;
1202
          return 4;
1203
        }
1204
      if (TOLOWER (src[3]) == 'h')
1205
        {
1206
          *mode = A_MACH;
1207
          return 4;
1208
        }
1209
    }
1210
  if (l0 == 'm' && l1 == 'o' && TOLOWER (src[2]) == 'd'
1211
      && ! IDENT_CHAR ((unsigned char) src[3]))
1212
    {
1213
      *mode = A_MOD;
1214
      return 3;
1215
    }
1216
  if (l0 == 'f' && l1 == 'r')
1217
    {
1218
      if (src[2] == '1')
1219
        {
1220
          if (src[3] >= '0' && src[3] <= '5'
1221
              && ! IDENT_CHAR ((unsigned char) src[4]))
1222
            {
1223
              *mode = F_REG_N;
1224
              *reg = 10 + src[3] - '0';
1225
              return 4;
1226
            }
1227
        }
1228
      if (src[2] >= '0' && src[2] <= '9'
1229
          && ! IDENT_CHAR ((unsigned char) src[3]))
1230
        {
1231
          *mode = F_REG_N;
1232
          *reg = (src[2] - '0');
1233
          return 3;
1234
        }
1235
    }
1236
  if (l0 == 'd' && l1 == 'r')
1237
    {
1238
      if (src[2] == '1')
1239
        {
1240
          if (src[3] >= '0' && src[3] <= '4' && ! ((src[3] - '0') & 1)
1241
              && ! IDENT_CHAR ((unsigned char) src[4]))
1242
            {
1243
              *mode = D_REG_N;
1244
              *reg = 10 + src[3] - '0';
1245
              return 4;
1246
            }
1247
        }
1248
      if (src[2] >= '0' && src[2] <= '8' && ! ((src[2] - '0') & 1)
1249
          && ! IDENT_CHAR ((unsigned char) src[3]))
1250
        {
1251
          *mode = D_REG_N;
1252
          *reg = (src[2] - '0');
1253
          return 3;
1254
        }
1255
    }
1256
  if (l0 == 'x' && l1 == 'd')
1257
    {
1258
      if (src[2] == '1')
1259
        {
1260
          if (src[3] >= '0' && src[3] <= '4' && ! ((src[3] - '0') & 1)
1261
              && ! IDENT_CHAR ((unsigned char) src[4]))
1262
            {
1263
              *mode = X_REG_N;
1264
              *reg = 11 + src[3] - '0';
1265
              return 4;
1266
            }
1267
        }
1268
      if (src[2] >= '0' && src[2] <= '8' && ! ((src[2] - '0') & 1)
1269
          && ! IDENT_CHAR ((unsigned char) src[3]))
1270
        {
1271
          *mode = X_REG_N;
1272
          *reg = (src[2] - '0') + 1;
1273
          return 3;
1274
        }
1275
    }
1276
  if (l0 == 'f' && l1 == 'v')
1277
    {
1278
      if (src[2] == '1'&& src[3] == '2' && ! IDENT_CHAR ((unsigned char) src[4]))
1279
        {
1280
          *mode = V_REG_N;
1281
          *reg = 12;
1282
          return 4;
1283
        }
1284
      if ((src[2] == '0' || src[2] == '4' || src[2] == '8')
1285
          && ! IDENT_CHAR ((unsigned char) src[3]))
1286
        {
1287
          *mode = V_REG_N;
1288
          *reg = (src[2] - '0');
1289
          return 3;
1290
        }
1291
    }
1292
  if (l0 == 'f' && l1 == 'p' && TOLOWER (src[2]) == 'u'
1293
      && TOLOWER (src[3]) == 'l'
1294
      && ! IDENT_CHAR ((unsigned char) src[4]))
1295
    {
1296
      *mode = FPUL_N;
1297
      return 4;
1298
    }
1299
 
1300
  if (l0 == 'f' && l1 == 'p' && TOLOWER (src[2]) == 's'
1301
      && TOLOWER (src[3]) == 'c'
1302
      && TOLOWER (src[4]) == 'r' && ! IDENT_CHAR ((unsigned char) src[5]))
1303
    {
1304
      *mode = FPSCR_N;
1305
      return 5;
1306
    }
1307
 
1308
  if (l0 == 'x' && l1 == 'm' && TOLOWER (src[2]) == 't'
1309
      && TOLOWER (src[3]) == 'r'
1310
      && TOLOWER (src[4]) == 'x' && ! IDENT_CHAR ((unsigned char) src[5]))
1311
    {
1312
      *mode = XMTRX_M4;
1313
      return 5;
1314
    }
1315
 
1316
  return 0;
1317
}
1318
 
1319
/* Like parse_reg_without_prefix, but this version supports
1320
   $-prefixed register names if enabled by the user.  */
1321
 
1322
static unsigned int
1323
parse_reg (char *src, int *mode, int *reg)
1324
{
1325
  unsigned int prefix;
1326
  unsigned int consumed;
1327
 
1328
  if (src[0] == '$')
1329
    {
1330
      if (allow_dollar_register_prefix)
1331
        {
1332
          src ++;
1333
          prefix = 1;
1334
        }
1335
      else
1336
        return 0;
1337
    }
1338
  else
1339
    prefix = 0;
1340
 
1341
  consumed = parse_reg_without_prefix (src, mode, reg);
1342
 
1343
  if (consumed == 0)
1344
    return 0;
1345
 
1346
  return consumed + prefix;
1347
}
1348
 
1349
static char *
1350
parse_exp (char *s, sh_operand_info *op)
1351
{
1352
  char *save;
1353
  char *new;
1354
 
1355
  save = input_line_pointer;
1356
  input_line_pointer = s;
1357
  expression (&op->immediate);
1358
  if (op->immediate.X_op == O_absent)
1359
    as_bad (_("missing operand"));
1360
#ifdef OBJ_ELF
1361
  else if (op->immediate.X_op == O_PIC_reloc
1362
           || sh_PIC_related_p (op->immediate.X_add_symbol)
1363
           || sh_PIC_related_p (op->immediate.X_op_symbol))
1364
    as_bad (_("misplaced PIC operand"));
1365
#endif
1366
  new = input_line_pointer;
1367
  input_line_pointer = save;
1368
  return new;
1369
}
1370
 
1371
/* The many forms of operand:
1372
 
1373
   Rn                   Register direct
1374
   @Rn                  Register indirect
1375
   @Rn+                 Autoincrement
1376
   @-Rn                 Autodecrement
1377
   @(disp:4,Rn)
1378
   @(disp:8,GBR)
1379
   @(disp:8,PC)
1380
 
1381
   @(R0,Rn)
1382
   @(R0,GBR)
1383
 
1384
   disp:8
1385
   disp:12
1386
   #imm8
1387
   pr, gbr, vbr, macl, mach
1388
 */
1389
 
1390
static char *
1391
parse_at (char *src, sh_operand_info *op)
1392
{
1393
  int len;
1394
  int mode;
1395
  src++;
1396
  if (src[0] == '@')
1397
    {
1398
      src = parse_at (src, op);
1399
      if (op->type == A_DISP_TBR)
1400
        op->type = A_DISP2_TBR;
1401
      else
1402
        as_bad (_("illegal double indirection"));
1403
    }
1404
  else if (src[0] == '-')
1405
    {
1406
      /* Must be predecrement.  */
1407
      src++;
1408
 
1409
      len = parse_reg (src, &mode, &(op->reg));
1410
      if (mode != A_REG_N)
1411
        as_bad (_("illegal register after @-"));
1412
 
1413
      op->type = A_DEC_N;
1414
      src += len;
1415
    }
1416
  else if (src[0] == '(')
1417
    {
1418
      /* Could be @(disp, rn), @(disp, gbr), @(disp, pc),  @(r0, gbr) or
1419
         @(r0, rn).  */
1420
      src++;
1421
      len = parse_reg (src, &mode, &(op->reg));
1422
      if (len && mode == A_REG_N)
1423
        {
1424
          src += len;
1425
          if (op->reg != 0)
1426
            {
1427
              as_bad (_("must be @(r0,...)"));
1428
            }
1429
          if (src[0] == ',')
1430
            {
1431
              src++;
1432
              /* Now can be rn or gbr.  */
1433
              len = parse_reg (src, &mode, &(op->reg));
1434
            }
1435
          else
1436
            {
1437
              len = 0;
1438
            }
1439
          if (len)
1440
            {
1441
              if (mode == A_GBR)
1442
                {
1443
                  op->type = A_R0_GBR;
1444
                }
1445
              else if (mode == A_REG_N)
1446
                {
1447
                  op->type = A_IND_R0_REG_N;
1448
                }
1449
              else
1450
                {
1451
                  as_bad (_("syntax error in @(r0,...)"));
1452
                }
1453
            }
1454
          else
1455
            {
1456
              as_bad (_("syntax error in @(r0...)"));
1457
            }
1458
        }
1459
      else
1460
        {
1461
          /* Must be an @(disp,.. thing).  */
1462
          src = parse_exp (src, op);
1463
          if (src[0] == ',')
1464
            src++;
1465
          /* Now can be rn, gbr or pc.  */
1466
          len = parse_reg (src, &mode, &op->reg);
1467
          if (len)
1468
            {
1469
              if (mode == A_REG_N)
1470
                {
1471
                  op->type = A_DISP_REG_N;
1472
                }
1473
              else if (mode == A_GBR)
1474
                {
1475
                  op->type = A_DISP_GBR;
1476
                }
1477
              else if (mode == A_TBR)
1478
                {
1479
                  op->type = A_DISP_TBR;
1480
                }
1481
              else if (mode == A_PC)
1482
                {
1483
                  /* We want @(expr, pc) to uniformly address . + expr,
1484
                     no matter if expr is a constant, or a more complex
1485
                     expression, e.g. sym-. or sym1-sym2.
1486
                     However, we also used to accept @(sym,pc)
1487
                     as addressing sym, i.e. meaning the same as plain sym.
1488
                     Some existing code does use the @(sym,pc) syntax, so
1489
                     we give it the old semantics for now, but warn about
1490
                     its use, so that users have some time to fix their code.
1491
 
1492
                     Note that due to this backward compatibility hack,
1493
                     we'll get unexpected results when @(offset, pc) is used,
1494
                     and offset is a symbol that is set later to an an address
1495
                     difference, or an external symbol that is set to an
1496
                     address difference in another source file, so we want to
1497
                     eventually remove it.  */
1498
                  if (op->immediate.X_op == O_symbol)
1499
                    {
1500
                      op->type = A_DISP_PC;
1501
                      as_warn (_("Deprecated syntax."));
1502
                    }
1503
                  else
1504
                    {
1505
                      op->type = A_DISP_PC_ABS;
1506
                      /* Such operands don't get corrected for PC==.+4, so
1507
                         make the correction here.  */
1508
                      op->immediate.X_add_number -= 4;
1509
                    }
1510
                }
1511
              else
1512
                {
1513
                  as_bad (_("syntax error in @(disp,[Rn, gbr, pc])"));
1514
                }
1515
            }
1516
          else
1517
            {
1518
              as_bad (_("syntax error in @(disp,[Rn, gbr, pc])"));
1519
            }
1520
        }
1521
      src += len;
1522
      if (src[0] != ')')
1523
        as_bad (_("expecting )"));
1524
      else
1525
        src++;
1526
    }
1527
  else
1528
    {
1529
      src += parse_reg (src, &mode, &(op->reg));
1530
      if (mode != A_REG_N)
1531
        as_bad (_("illegal register after @"));
1532
 
1533
      if (src[0] == '+')
1534
        {
1535
          char l0, l1;
1536
 
1537
          src++;
1538
          l0 = TOLOWER (src[0]);
1539
          l1 = TOLOWER (src[1]);
1540
 
1541
          if ((l0 == 'r' && l1 == '8')
1542
              || (l0 == 'i' && (l1 == 'x' || l1 == 's')))
1543
            {
1544
              src += 2;
1545
              op->type = AX_PMOD_N;
1546
            }
1547
          else if (   (l0 == 'r' && l1 == '9')
1548
                   || (l0 == 'i' && l1 == 'y'))
1549
            {
1550
              src += 2;
1551
              op->type = AY_PMOD_N;
1552
            }
1553
          else
1554
            op->type = A_INC_N;
1555
        }
1556
      else
1557
        op->type = A_IND_N;
1558
    }
1559
  return src;
1560
}
1561
 
1562
static void
1563
get_operand (char **ptr, sh_operand_info *op)
1564
{
1565
  char *src = *ptr;
1566
  int mode = -1;
1567
  unsigned int len;
1568
 
1569
  if (src[0] == '#')
1570
    {
1571
      src++;
1572
      *ptr = parse_exp (src, op);
1573
      op->type = A_IMM;
1574
      return;
1575
    }
1576
 
1577
  else if (src[0] == '@')
1578
    {
1579
      *ptr = parse_at (src, op);
1580
      return;
1581
    }
1582
  len = parse_reg (src, &mode, &(op->reg));
1583
  if (len)
1584
    {
1585
      *ptr = src + len;
1586
      op->type = mode;
1587
      return;
1588
    }
1589
  else
1590
    {
1591
      /* Not a reg, the only thing left is a displacement.  */
1592
      *ptr = parse_exp (src, op);
1593
      op->type = A_DISP_PC;
1594
      return;
1595
    }
1596
}
1597
 
1598
static char *
1599
get_operands (sh_opcode_info *info, char *args, sh_operand_info *operand)
1600
{
1601
  char *ptr = args;
1602
  if (info->arg[0])
1603
    {
1604
      /* The pre-processor will eliminate whitespace in front of '@'
1605
         after the first argument; we may be called multiple times
1606
         from assemble_ppi, so don't insist on finding whitespace here.  */
1607
      if (*ptr == ' ')
1608
        ptr++;
1609
 
1610
      get_operand (&ptr, operand + 0);
1611
      if (info->arg[1])
1612
        {
1613
          if (*ptr == ',')
1614
            {
1615
              ptr++;
1616
            }
1617
          get_operand (&ptr, operand + 1);
1618
          /* ??? Hack: psha/pshl have a varying operand number depending on
1619
             the type of the first operand.  We handle this by having the
1620
             three-operand version first and reducing the number of operands
1621
             parsed to two if we see that the first operand is an immediate.
1622
             This works because no insn with three operands has an immediate
1623
             as first operand.  */
1624
          if (info->arg[2] && operand[0].type != A_IMM)
1625
            {
1626
              if (*ptr == ',')
1627
                {
1628
                  ptr++;
1629
                }
1630
              get_operand (&ptr, operand + 2);
1631
            }
1632
          else
1633
            {
1634
              operand[2].type = 0;
1635
            }
1636
        }
1637
      else
1638
        {
1639
          operand[1].type = 0;
1640
          operand[2].type = 0;
1641
        }
1642
    }
1643
  else
1644
    {
1645
      operand[0].type = 0;
1646
      operand[1].type = 0;
1647
      operand[2].type = 0;
1648
    }
1649
  return ptr;
1650
}
1651
 
1652
/* Passed a pointer to a list of opcodes which use different
1653
   addressing modes, return the opcode which matches the opcodes
1654
   provided.  */
1655
 
1656
static sh_opcode_info *
1657
get_specific (sh_opcode_info *opcode, sh_operand_info *operands)
1658
{
1659
  sh_opcode_info *this_try = opcode;
1660
  char *name = opcode->name;
1661
  int n = 0;
1662
 
1663
  while (opcode->name)
1664
    {
1665
      this_try = opcode++;
1666
      if ((this_try->name != name) && (strcmp (this_try->name, name) != 0))
1667
        {
1668
          /* We've looked so far down the table that we've run out of
1669
             opcodes with the same name.  */
1670
          return 0;
1671
        }
1672
 
1673
      /* Look at both operands needed by the opcodes and provided by
1674
         the user - since an arg test will often fail on the same arg
1675
         again and again, we'll try and test the last failing arg the
1676
         first on each opcode try.  */
1677
      for (n = 0; this_try->arg[n]; n++)
1678
        {
1679
          sh_operand_info *user = operands + n;
1680
          sh_arg_type arg = this_try->arg[n];
1681
 
1682
          if (SH_MERGE_ARCH_SET_VALID (valid_arch, arch_sh2a_nofpu_up)
1683
              && (   arg == A_DISP_REG_M
1684
                  || arg == A_DISP_REG_N))
1685
            {
1686
              /* Check a few key IMM* fields for overflow.  */
1687
              int opf;
1688
              long val = user->immediate.X_add_number;
1689
 
1690
              for (opf = 0; opf < 4; opf ++)
1691
                switch (this_try->nibbles[opf])
1692
                  {
1693
                  case IMM0_4:
1694
                  case IMM1_4:
1695
                    if (val < 0 || val > 15)
1696
                      goto fail;
1697
                    break;
1698
                  case IMM0_4BY2:
1699
                  case IMM1_4BY2:
1700
                    if (val < 0 || val > 15 * 2)
1701
                      goto fail;
1702
                    break;
1703
                  case IMM0_4BY4:
1704
                  case IMM1_4BY4:
1705
                    if (val < 0 || val > 15 * 4)
1706
                      goto fail;
1707
                    break;
1708
                  default:
1709
                    break;
1710
                  }
1711
            }
1712
          switch (arg)
1713
            {
1714
            case A_DISP_PC:
1715
              if (user->type == A_DISP_PC_ABS)
1716
                break;
1717
              /* Fall through.  */
1718
            case A_IMM:
1719
            case A_BDISP12:
1720
            case A_BDISP8:
1721
            case A_DISP_GBR:
1722
            case A_DISP2_TBR:
1723
            case A_MACH:
1724
            case A_PR:
1725
            case A_MACL:
1726
              if (user->type != arg)
1727
                goto fail;
1728
              break;
1729
            case A_R0:
1730
              /* opcode needs r0 */
1731
              if (user->type != A_REG_N || user->reg != 0)
1732
                goto fail;
1733
              break;
1734
            case A_R0_GBR:
1735
              if (user->type != A_R0_GBR || user->reg != 0)
1736
                goto fail;
1737
              break;
1738
            case F_FR0:
1739
              if (user->type != F_REG_N || user->reg != 0)
1740
                goto fail;
1741
              break;
1742
 
1743
            case A_REG_N:
1744
            case A_INC_N:
1745
            case A_DEC_N:
1746
            case A_IND_N:
1747
            case A_IND_R0_REG_N:
1748
            case A_DISP_REG_N:
1749
            case F_REG_N:
1750
            case D_REG_N:
1751
            case X_REG_N:
1752
            case V_REG_N:
1753
            case FPUL_N:
1754
            case FPSCR_N:
1755
            case DSP_REG_N:
1756
              /* Opcode needs rn */
1757
              if (user->type != arg)
1758
                goto fail;
1759
              reg_n = user->reg;
1760
              break;
1761
            case DX_REG_N:
1762
              if (user->type != D_REG_N && user->type != X_REG_N)
1763
                goto fail;
1764
              reg_n = user->reg;
1765
              break;
1766
            case A_GBR:
1767
            case A_TBR:
1768
            case A_SR:
1769
            case A_VBR:
1770
            case A_DSR:
1771
            case A_MOD:
1772
            case A_RE:
1773
            case A_RS:
1774
            case A_SSR:
1775
            case A_SPC:
1776
            case A_SGR:
1777
            case A_DBR:
1778
              if (user->type != arg)
1779
                goto fail;
1780
              break;
1781
 
1782
            case A_REG_B:
1783
              if (user->type != arg)
1784
                goto fail;
1785
              reg_b = user->reg;
1786
              break;
1787
 
1788
            case A_INC_R15:
1789
              if (user->type != A_INC_N)
1790
                goto fail;
1791
              if (user->reg != 15)
1792
                goto fail;
1793
              reg_n = user->reg;
1794
              break;
1795
 
1796
            case A_DEC_R15:
1797
              if (user->type != A_DEC_N)
1798
                goto fail;
1799
              if (user->reg != 15)
1800
                goto fail;
1801
              reg_n = user->reg;
1802
              break;
1803
 
1804
            case A_REG_M:
1805
            case A_INC_M:
1806
            case A_DEC_M:
1807
            case A_IND_M:
1808
            case A_IND_R0_REG_M:
1809
            case A_DISP_REG_M:
1810
            case DSP_REG_M:
1811
              /* Opcode needs rn */
1812
              if (user->type != arg - A_REG_M + A_REG_N)
1813
                goto fail;
1814
              reg_m = user->reg;
1815
              break;
1816
 
1817
            case AS_DEC_N:
1818
              if (user->type != A_DEC_N)
1819
                goto fail;
1820
              if (user->reg < 2 || user->reg > 5)
1821
                goto fail;
1822
              reg_n = user->reg;
1823
              break;
1824
 
1825
            case AS_INC_N:
1826
              if (user->type != A_INC_N)
1827
                goto fail;
1828
              if (user->reg < 2 || user->reg > 5)
1829
                goto fail;
1830
              reg_n = user->reg;
1831
              break;
1832
 
1833
            case AS_IND_N:
1834
              if (user->type != A_IND_N)
1835
                goto fail;
1836
              if (user->reg < 2 || user->reg > 5)
1837
                goto fail;
1838
              reg_n = user->reg;
1839
              break;
1840
 
1841
            case AS_PMOD_N:
1842
              if (user->type != AX_PMOD_N)
1843
                goto fail;
1844
              if (user->reg < 2 || user->reg > 5)
1845
                goto fail;
1846
              reg_n = user->reg;
1847
              break;
1848
 
1849
            case AX_INC_N:
1850
              if (user->type != A_INC_N)
1851
                goto fail;
1852
              if (user->reg < 4 || user->reg > 5)
1853
                goto fail;
1854
              reg_n = user->reg;
1855
              break;
1856
 
1857
            case AX_IND_N:
1858
              if (user->type != A_IND_N)
1859
                goto fail;
1860
              if (user->reg < 4 || user->reg > 5)
1861
                goto fail;
1862
              reg_n = user->reg;
1863
              break;
1864
 
1865
            case AX_PMOD_N:
1866
              if (user->type != AX_PMOD_N)
1867
                goto fail;
1868
              if (user->reg < 4 || user->reg > 5)
1869
                goto fail;
1870
              reg_n = user->reg;
1871
              break;
1872
 
1873
            case AXY_INC_N:
1874
              if (user->type != A_INC_N)
1875
                goto fail;
1876
              if ((user->reg < 4 || user->reg > 5)
1877
                  && (user->reg < 0 || user->reg > 1))
1878
                goto fail;
1879
              reg_n = user->reg;
1880
              break;
1881
 
1882
            case AXY_IND_N:
1883
              if (user->type != A_IND_N)
1884
                goto fail;
1885
              if ((user->reg < 4 || user->reg > 5)
1886
                  && (user->reg < 0 || user->reg > 1))
1887
                goto fail;
1888
              reg_n = user->reg;
1889
              break;
1890
 
1891
            case AXY_PMOD_N:
1892
              if (user->type != AX_PMOD_N)
1893
                goto fail;
1894
              if ((user->reg < 4 || user->reg > 5)
1895
                  && (user->reg < 0 || user->reg > 1))
1896
                goto fail;
1897
              reg_n = user->reg;
1898
              break;
1899
 
1900
            case AY_INC_N:
1901
              if (user->type != A_INC_N)
1902
                goto fail;
1903
              if (user->reg < 6 || user->reg > 7)
1904
                goto fail;
1905
              reg_n = user->reg;
1906
              break;
1907
 
1908
            case AY_IND_N:
1909
              if (user->type != A_IND_N)
1910
                goto fail;
1911
              if (user->reg < 6 || user->reg > 7)
1912
                goto fail;
1913
              reg_n = user->reg;
1914
              break;
1915
 
1916
            case AY_PMOD_N:
1917
              if (user->type != AY_PMOD_N)
1918
                goto fail;
1919
              if (user->reg < 6 || user->reg > 7)
1920
                goto fail;
1921
              reg_n = user->reg;
1922
              break;
1923
 
1924
            case AYX_INC_N:
1925
              if (user->type != A_INC_N)
1926
                goto fail;
1927
              if ((user->reg < 6 || user->reg > 7)
1928
                  && (user->reg < 2 || user->reg > 3))
1929
                goto fail;
1930
              reg_n = user->reg;
1931
              break;
1932
 
1933
            case AYX_IND_N:
1934
              if (user->type != A_IND_N)
1935
                goto fail;
1936
              if ((user->reg < 6 || user->reg > 7)
1937
                  && (user->reg < 2 || user->reg > 3))
1938
                goto fail;
1939
              reg_n = user->reg;
1940
              break;
1941
 
1942
            case AYX_PMOD_N:
1943
              if (user->type != AY_PMOD_N)
1944
                goto fail;
1945
              if ((user->reg < 6 || user->reg > 7)
1946
                  && (user->reg < 2 || user->reg > 3))
1947
                goto fail;
1948
              reg_n = user->reg;
1949
              break;
1950
 
1951
            case DSP_REG_A_M:
1952
              if (user->type != DSP_REG_N)
1953
                goto fail;
1954
              if (user->reg != A_A0_NUM
1955
                  && user->reg != A_A1_NUM)
1956
                goto fail;
1957
              reg_m = user->reg;
1958
              break;
1959
 
1960
            case DSP_REG_AX:
1961
              if (user->type != DSP_REG_N)
1962
                goto fail;
1963
              switch (user->reg)
1964
                {
1965
                case A_A0_NUM:
1966
                  reg_x = 0;
1967
                  break;
1968
                case A_A1_NUM:
1969
                  reg_x = 2;
1970
                  break;
1971
                case A_X0_NUM:
1972
                  reg_x = 1;
1973
                  break;
1974
                case A_X1_NUM:
1975
                  reg_x = 3;
1976
                  break;
1977
                default:
1978
                  goto fail;
1979
                }
1980
              break;
1981
 
1982
            case DSP_REG_XY:
1983
              if (user->type != DSP_REG_N)
1984
                goto fail;
1985
              switch (user->reg)
1986
                {
1987
                case A_X0_NUM:
1988
                  reg_x = 0;
1989
                  break;
1990
                case A_X1_NUM:
1991
                  reg_x = 2;
1992
                  break;
1993
                case A_Y0_NUM:
1994
                  reg_x = 1;
1995
                  break;
1996
                case A_Y1_NUM:
1997
                  reg_x = 3;
1998
                  break;
1999
                default:
2000
                  goto fail;
2001
                }
2002
              break;
2003
 
2004
            case DSP_REG_AY:
2005
              if (user->type != DSP_REG_N)
2006
                goto fail;
2007
              switch (user->reg)
2008
                {
2009
                case A_A0_NUM:
2010
                  reg_y = 0;
2011
                  break;
2012
                case A_A1_NUM:
2013
                  reg_y = 1;
2014
                  break;
2015
                case A_Y0_NUM:
2016
                  reg_y = 2;
2017
                  break;
2018
                case A_Y1_NUM:
2019
                  reg_y = 3;
2020
                  break;
2021
                default:
2022
                  goto fail;
2023
                }
2024
              break;
2025
 
2026
            case DSP_REG_YX:
2027
              if (user->type != DSP_REG_N)
2028
                goto fail;
2029
              switch (user->reg)
2030
                {
2031
                case A_Y0_NUM:
2032
                  reg_y = 0;
2033
                  break;
2034
                case A_Y1_NUM:
2035
                  reg_y = 1;
2036
                  break;
2037
                case A_X0_NUM:
2038
                  reg_y = 2;
2039
                  break;
2040
                case A_X1_NUM:
2041
                  reg_y = 3;
2042
                  break;
2043
                default:
2044
                  goto fail;
2045
                }
2046
              break;
2047
 
2048
            case DSP_REG_X:
2049
              if (user->type != DSP_REG_N)
2050
                goto fail;
2051
              switch (user->reg)
2052
                {
2053
                case A_X0_NUM:
2054
                  reg_x = 0;
2055
                  break;
2056
                case A_X1_NUM:
2057
                  reg_x = 1;
2058
                  break;
2059
                case A_A0_NUM:
2060
                  reg_x = 2;
2061
                  break;
2062
                case A_A1_NUM:
2063
                  reg_x = 3;
2064
                  break;
2065
                default:
2066
                  goto fail;
2067
                }
2068
              break;
2069
 
2070
            case DSP_REG_Y:
2071
              if (user->type != DSP_REG_N)
2072
                goto fail;
2073
              switch (user->reg)
2074
                {
2075
                case A_Y0_NUM:
2076
                  reg_y = 0;
2077
                  break;
2078
                case A_Y1_NUM:
2079
                  reg_y = 1;
2080
                  break;
2081
                case A_M0_NUM:
2082
                  reg_y = 2;
2083
                  break;
2084
                case A_M1_NUM:
2085
                  reg_y = 3;
2086
                  break;
2087
                default:
2088
                  goto fail;
2089
                }
2090
              break;
2091
 
2092
            case DSP_REG_E:
2093
              if (user->type != DSP_REG_N)
2094
                goto fail;
2095
              switch (user->reg)
2096
                {
2097
                case A_X0_NUM:
2098
                  reg_efg = 0 << 10;
2099
                  break;
2100
                case A_X1_NUM:
2101
                  reg_efg = 1 << 10;
2102
                  break;
2103
                case A_Y0_NUM:
2104
                  reg_efg = 2 << 10;
2105
                  break;
2106
                case A_A1_NUM:
2107
                  reg_efg = 3 << 10;
2108
                  break;
2109
                default:
2110
                  goto fail;
2111
                }
2112
              break;
2113
 
2114
            case DSP_REG_F:
2115
              if (user->type != DSP_REG_N)
2116
                goto fail;
2117
              switch (user->reg)
2118
                {
2119
                case A_Y0_NUM:
2120
                  reg_efg |= 0 << 8;
2121
                  break;
2122
                case A_Y1_NUM:
2123
                  reg_efg |= 1 << 8;
2124
                  break;
2125
                case A_X0_NUM:
2126
                  reg_efg |= 2 << 8;
2127
                  break;
2128
                case A_A1_NUM:
2129
                  reg_efg |= 3 << 8;
2130
                  break;
2131
                default:
2132
                  goto fail;
2133
                }
2134
              break;
2135
 
2136
            case DSP_REG_G:
2137
              if (user->type != DSP_REG_N)
2138
                goto fail;
2139
              switch (user->reg)
2140
                {
2141
                case A_M0_NUM:
2142
                  reg_efg |= 0 << 2;
2143
                  break;
2144
                case A_M1_NUM:
2145
                  reg_efg |= 1 << 2;
2146
                  break;
2147
                case A_A0_NUM:
2148
                  reg_efg |= 2 << 2;
2149
                  break;
2150
                case A_A1_NUM:
2151
                  reg_efg |= 3 << 2;
2152
                  break;
2153
                default:
2154
                  goto fail;
2155
                }
2156
              break;
2157
 
2158
            case A_A0:
2159
              if (user->type != DSP_REG_N || user->reg != A_A0_NUM)
2160
                goto fail;
2161
              break;
2162
            case A_X0:
2163
              if (user->type != DSP_REG_N || user->reg != A_X0_NUM)
2164
                goto fail;
2165
              break;
2166
            case A_X1:
2167
              if (user->type != DSP_REG_N || user->reg != A_X1_NUM)
2168
                goto fail;
2169
              break;
2170
            case A_Y0:
2171
              if (user->type != DSP_REG_N || user->reg != A_Y0_NUM)
2172
                goto fail;
2173
              break;
2174
            case A_Y1:
2175
              if (user->type != DSP_REG_N || user->reg != A_Y1_NUM)
2176
                goto fail;
2177
              break;
2178
 
2179
            case F_REG_M:
2180
            case D_REG_M:
2181
            case X_REG_M:
2182
            case V_REG_M:
2183
            case FPUL_M:
2184
            case FPSCR_M:
2185
              /* Opcode needs rn */
2186
              if (user->type != arg - F_REG_M + F_REG_N)
2187
                goto fail;
2188
              reg_m = user->reg;
2189
              break;
2190
            case DX_REG_M:
2191
              if (user->type != D_REG_N && user->type != X_REG_N)
2192
                goto fail;
2193
              reg_m = user->reg;
2194
              break;
2195
            case XMTRX_M4:
2196
              if (user->type != XMTRX_M4)
2197
                goto fail;
2198
              reg_m = 4;
2199
              break;
2200
 
2201
            default:
2202
              printf (_("unhandled %d\n"), arg);
2203
              goto fail;
2204
            }
2205
        }
2206
      if ( !SH_MERGE_ARCH_SET_VALID (valid_arch, this_try->arch))
2207
        goto fail;
2208
      valid_arch = SH_MERGE_ARCH_SET (valid_arch, this_try->arch);
2209
      return this_try;
2210
    fail:
2211
      ;
2212
    }
2213
 
2214
  return 0;
2215
}
2216
 
2217
static void
2218
insert (char *where, int how, int pcrel, sh_operand_info *op)
2219
{
2220
  fix_new_exp (frag_now,
2221
               where - frag_now->fr_literal,
2222
               2,
2223
               &op->immediate,
2224
               pcrel,
2225
               how);
2226
}
2227
 
2228
static void
2229
insert4 (char * where, int how, int pcrel, sh_operand_info * op)
2230
{
2231
  fix_new_exp (frag_now,
2232
               where - frag_now->fr_literal,
2233
               4,
2234
               & op->immediate,
2235
               pcrel,
2236
               how);
2237
}
2238
static void
2239
build_relax (sh_opcode_info *opcode, sh_operand_info *op)
2240
{
2241
  int high_byte = target_big_endian ? 0 : 1;
2242
  char *p;
2243
 
2244
  if (opcode->arg[0] == A_BDISP8)
2245
    {
2246
      int what = (opcode->nibbles[1] & 4) ? COND_JUMP_DELAY : COND_JUMP;
2247
      p = frag_var (rs_machine_dependent,
2248
                    md_relax_table[C (what, COND32)].rlx_length,
2249
                    md_relax_table[C (what, COND8)].rlx_length,
2250
                    C (what, 0),
2251
                    op->immediate.X_add_symbol,
2252
                    op->immediate.X_add_number,
2253
                    0);
2254
      p[high_byte] = (opcode->nibbles[0] << 4) | (opcode->nibbles[1]);
2255
    }
2256
  else if (opcode->arg[0] == A_BDISP12)
2257
    {
2258
      p = frag_var (rs_machine_dependent,
2259
                    md_relax_table[C (UNCOND_JUMP, UNCOND32)].rlx_length,
2260
                    md_relax_table[C (UNCOND_JUMP, UNCOND12)].rlx_length,
2261
                    C (UNCOND_JUMP, 0),
2262
                    op->immediate.X_add_symbol,
2263
                    op->immediate.X_add_number,
2264
                    0);
2265
      p[high_byte] = (opcode->nibbles[0] << 4);
2266
    }
2267
 
2268
}
2269
 
2270
/* Insert ldrs & ldre with fancy relocations that relaxation can recognize.  */
2271
 
2272
static char *
2273
insert_loop_bounds (char *output, sh_operand_info *operand)
2274
{
2275
  char *name;
2276
  symbolS *end_sym;
2277
 
2278
  /* Since the low byte of the opcode will be overwritten by the reloc, we
2279
     can just stash the high byte into both bytes and ignore endianness.  */
2280
  output[0] = 0x8c;
2281
  output[1] = 0x8c;
2282
  insert (output, BFD_RELOC_SH_LOOP_START, 1, operand);
2283
  insert (output, BFD_RELOC_SH_LOOP_END, 1, operand + 1);
2284
 
2285
  if (sh_relax)
2286
    {
2287
      static int count = 0;
2288
 
2289
      /* If the last loop insn is a two-byte-insn, it is in danger of being
2290
         swapped with the insn after it.  To prevent this, create a new
2291
         symbol - complete with SH_LABEL reloc - after the last loop insn.
2292
         If the last loop insn is four bytes long, the symbol will be
2293
         right in the middle, but four byte insns are not swapped anyways.  */
2294
      /* A REPEAT takes 6 bytes.  The SH has a 32 bit address space.
2295
         Hence a 9 digit number should be enough to count all REPEATs.  */
2296
      name = alloca (11);
2297
      sprintf (name, "_R%x", count++ & 0x3fffffff);
2298
      end_sym = symbol_new (name, undefined_section, 0, &zero_address_frag);
2299
      /* Make this a local symbol.  */
2300
#ifdef OBJ_COFF
2301
      SF_SET_LOCAL (end_sym);
2302
#endif /* OBJ_COFF */
2303
      symbol_table_insert (end_sym);
2304
      end_sym->sy_value = operand[1].immediate;
2305
      end_sym->sy_value.X_add_number += 2;
2306
      fix_new (frag_now, frag_now_fix (), 2, end_sym, 0, 1, BFD_RELOC_SH_LABEL);
2307
    }
2308
 
2309
  output = frag_more (2);
2310
  output[0] = 0x8e;
2311
  output[1] = 0x8e;
2312
  insert (output, BFD_RELOC_SH_LOOP_START, 1, operand);
2313
  insert (output, BFD_RELOC_SH_LOOP_END, 1, operand + 1);
2314
 
2315
  return frag_more (2);
2316
}
2317
 
2318
/* Now we know what sort of opcodes it is, let's build the bytes.  */
2319
 
2320
static unsigned int
2321
build_Mytes (sh_opcode_info *opcode, sh_operand_info *operand)
2322
{
2323
  int index;
2324
  char nbuf[8];
2325
  char *output;
2326
  unsigned int size = 2;
2327
  int low_byte = target_big_endian ? 1 : 0;
2328
  int max_index = 4;
2329
 
2330
  nbuf[0] = 0;
2331
  nbuf[1] = 0;
2332
  nbuf[2] = 0;
2333
  nbuf[3] = 0;
2334
  nbuf[4] = 0;
2335
  nbuf[5] = 0;
2336
  nbuf[6] = 0;
2337
  nbuf[7] = 0;
2338
 
2339
  if (SH_MERGE_ARCH_SET (opcode->arch, arch_op32))
2340
    {
2341
      output = frag_more (4);
2342
      size = 4;
2343
      max_index = 8;
2344
    }
2345
  else
2346
    output = frag_more (2);
2347
 
2348
  for (index = 0; index < max_index; index++)
2349
    {
2350
      sh_nibble_type i = opcode->nibbles[index];
2351
      if (i < 16)
2352
        {
2353
          nbuf[index] = i;
2354
        }
2355
      else
2356
        {
2357
          switch (i)
2358
            {
2359
            case REG_N:
2360
            case REG_N_D:
2361
              nbuf[index] = reg_n;
2362
              break;
2363
            case REG_M:
2364
              nbuf[index] = reg_m;
2365
              break;
2366
            case SDT_REG_N:
2367
              if (reg_n < 2 || reg_n > 5)
2368
                as_bad (_("Invalid register: 'r%d'"), reg_n);
2369
              nbuf[index] = (reg_n & 3) | 4;
2370
              break;
2371
            case REG_NM:
2372
              nbuf[index] = reg_n | (reg_m >> 2);
2373
              break;
2374
            case REG_B:
2375
              nbuf[index] = reg_b | 0x08;
2376
              break;
2377
            case REG_N_B01:
2378
              nbuf[index] = reg_n | 0x01;
2379
              break;
2380
            case IMM0_3s:
2381
              nbuf[index] |= 0x08;
2382
            case IMM0_3c:
2383
              insert (output + low_byte, BFD_RELOC_SH_IMM3, 0, operand);
2384
              break;
2385
            case IMM0_3Us:
2386
              nbuf[index] |= 0x80;
2387
            case IMM0_3Uc:
2388
              insert (output + low_byte, BFD_RELOC_SH_IMM3U, 0, operand);
2389
              break;
2390
            case DISP0_12:
2391
              insert (output + 2, BFD_RELOC_SH_DISP12, 0, operand);
2392
              break;
2393
            case DISP0_12BY2:
2394
              insert (output + 2, BFD_RELOC_SH_DISP12BY2, 0, operand);
2395
              break;
2396
            case DISP0_12BY4:
2397
              insert (output + 2, BFD_RELOC_SH_DISP12BY4, 0, operand);
2398
              break;
2399
            case DISP0_12BY8:
2400
              insert (output + 2, BFD_RELOC_SH_DISP12BY8, 0, operand);
2401
              break;
2402
            case DISP1_12:
2403
              insert (output + 2, BFD_RELOC_SH_DISP12, 0, operand+1);
2404
              break;
2405
            case DISP1_12BY2:
2406
              insert (output + 2, BFD_RELOC_SH_DISP12BY2, 0, operand+1);
2407
              break;
2408
            case DISP1_12BY4:
2409
              insert (output + 2, BFD_RELOC_SH_DISP12BY4, 0, operand+1);
2410
              break;
2411
            case DISP1_12BY8:
2412
              insert (output + 2, BFD_RELOC_SH_DISP12BY8, 0, operand+1);
2413
              break;
2414
            case IMM0_20_4:
2415
              break;
2416
            case IMM0_20:
2417
              insert4 (output, BFD_RELOC_SH_DISP20, 0, operand);
2418
              break;
2419
            case IMM0_20BY8:
2420
              insert4 (output, BFD_RELOC_SH_DISP20BY8, 0, operand);
2421
              break;
2422
            case IMM0_4BY4:
2423
              insert (output + low_byte, BFD_RELOC_SH_IMM4BY4, 0, operand);
2424
              break;
2425
            case IMM0_4BY2:
2426
              insert (output + low_byte, BFD_RELOC_SH_IMM4BY2, 0, operand);
2427
              break;
2428
            case IMM0_4:
2429
              insert (output + low_byte, BFD_RELOC_SH_IMM4, 0, operand);
2430
              break;
2431
            case IMM1_4BY4:
2432
              insert (output + low_byte, BFD_RELOC_SH_IMM4BY4, 0, operand + 1);
2433
              break;
2434
            case IMM1_4BY2:
2435
              insert (output + low_byte, BFD_RELOC_SH_IMM4BY2, 0, operand + 1);
2436
              break;
2437
            case IMM1_4:
2438
              insert (output + low_byte, BFD_RELOC_SH_IMM4, 0, operand + 1);
2439
              break;
2440
            case IMM0_8BY4:
2441
              insert (output + low_byte, BFD_RELOC_SH_IMM8BY4, 0, operand);
2442
              break;
2443
            case IMM0_8BY2:
2444
              insert (output + low_byte, BFD_RELOC_SH_IMM8BY2, 0, operand);
2445
              break;
2446
            case IMM0_8:
2447
              insert (output + low_byte, BFD_RELOC_SH_IMM8, 0, operand);
2448
              break;
2449
            case IMM1_8BY4:
2450
              insert (output + low_byte, BFD_RELOC_SH_IMM8BY4, 0, operand + 1);
2451
              break;
2452
            case IMM1_8BY2:
2453
              insert (output + low_byte, BFD_RELOC_SH_IMM8BY2, 0, operand + 1);
2454
              break;
2455
            case IMM1_8:
2456
              insert (output + low_byte, BFD_RELOC_SH_IMM8, 0, operand + 1);
2457
              break;
2458
            case PCRELIMM_8BY4:
2459
              insert (output, BFD_RELOC_SH_PCRELIMM8BY4,
2460
                      operand->type != A_DISP_PC_ABS, operand);
2461
              break;
2462
            case PCRELIMM_8BY2:
2463
              insert (output, BFD_RELOC_SH_PCRELIMM8BY2,
2464
                      operand->type != A_DISP_PC_ABS, operand);
2465
              break;
2466
            case REPEAT:
2467
              output = insert_loop_bounds (output, operand);
2468
              nbuf[index] = opcode->nibbles[3];
2469
              operand += 2;
2470
              break;
2471
            default:
2472
              printf (_("failed for %d\n"), i);
2473
            }
2474
        }
2475
    }
2476
  if (!target_big_endian)
2477
    {
2478
      output[1] = (nbuf[0] << 4) | (nbuf[1]);
2479
      output[0] = (nbuf[2] << 4) | (nbuf[3]);
2480
    }
2481
  else
2482
    {
2483
      output[0] = (nbuf[0] << 4) | (nbuf[1]);
2484
      output[1] = (nbuf[2] << 4) | (nbuf[3]);
2485
    }
2486
  if (SH_MERGE_ARCH_SET (opcode->arch, arch_op32))
2487
    {
2488
      if (!target_big_endian)
2489
        {
2490
          output[3] = (nbuf[4] << 4) | (nbuf[5]);
2491
          output[2] = (nbuf[6] << 4) | (nbuf[7]);
2492
        }
2493
      else
2494
        {
2495
          output[2] = (nbuf[4] << 4) | (nbuf[5]);
2496
          output[3] = (nbuf[6] << 4) | (nbuf[7]);
2497
        }
2498
    }
2499
  return size;
2500
}
2501
 
2502
/* Find an opcode at the start of *STR_P in the hash table, and set
2503
   *STR_P to the first character after the last one read.  */
2504
 
2505
static sh_opcode_info *
2506
find_cooked_opcode (char **str_p)
2507
{
2508
  char *str = *str_p;
2509
  unsigned char *op_start;
2510
  unsigned char *op_end;
2511
  char name[20];
2512
  int nlen = 0;
2513
 
2514
  /* Drop leading whitespace.  */
2515
  while (*str == ' ')
2516
    str++;
2517
 
2518
  /* Find the op code end.
2519
     The pre-processor will eliminate whitespace in front of
2520
     any '@' after the first argument; we may be called from
2521
     assemble_ppi, so the opcode might be terminated by an '@'.  */
2522
  for (op_start = op_end = (unsigned char *) str;
2523
       *op_end
2524
       && nlen < 20
2525
       && !is_end_of_line[*op_end] && *op_end != ' ' && *op_end != '@';
2526
       op_end++)
2527
    {
2528
      unsigned char c = op_start[nlen];
2529
 
2530
      /* The machine independent code will convert CMP/EQ into cmp/EQ
2531
         because it thinks the '/' is the end of the symbol.  Moreover,
2532
         all but the first sub-insn is a parallel processing insn won't
2533
         be capitalized.  Instead of hacking up the machine independent
2534
         code, we just deal with it here.  */
2535
      c = TOLOWER (c);
2536
      name[nlen] = c;
2537
      nlen++;
2538
    }
2539
 
2540
  name[nlen] = 0;
2541
  *str_p = (char *) op_end;
2542
 
2543
  if (nlen == 0)
2544
    as_bad (_("can't find opcode "));
2545
 
2546
  return (sh_opcode_info *) hash_find (opcode_hash_control, name);
2547
}
2548
 
2549
/* Assemble a parallel processing insn.  */
2550
#define DDT_BASE 0xf000 /* Base value for double data transfer insns */
2551
 
2552
static unsigned int
2553
assemble_ppi (char *op_end, sh_opcode_info *opcode)
2554
{
2555
  int movx = 0;
2556
  int movy = 0;
2557
  int cond = 0;
2558
  int field_b = 0;
2559
  char *output;
2560
  int move_code;
2561
  unsigned int size;
2562
 
2563
  for (;;)
2564
    {
2565
      sh_operand_info operand[3];
2566
 
2567
      /* Some insn ignore one or more register fields, e.g. psts machl,a0.
2568
         Make sure we encode a defined insn pattern.  */
2569
      reg_x = 0;
2570
      reg_y = 0;
2571
      reg_n = 0;
2572
 
2573
      if (opcode->arg[0] != A_END)
2574
        op_end = get_operands (opcode, op_end, operand);
2575
    try_another_opcode:
2576
      opcode = get_specific (opcode, operand);
2577
      if (opcode == 0)
2578
        {
2579
          /* Couldn't find an opcode which matched the operands.  */
2580
          char *where = frag_more (2);
2581
          size = 2;
2582
 
2583
          where[0] = 0x0;
2584
          where[1] = 0x0;
2585
          as_bad (_("invalid operands for opcode"));
2586
          return size;
2587
        }
2588
 
2589
      if (opcode->nibbles[0] != PPI)
2590
        as_bad (_("insn can't be combined with parallel processing insn"));
2591
 
2592
      switch (opcode->nibbles[1])
2593
        {
2594
 
2595
        case NOPX:
2596
          if (movx)
2597
            as_bad (_("multiple movx specifications"));
2598
          movx = DDT_BASE;
2599
          break;
2600
        case NOPY:
2601
          if (movy)
2602
            as_bad (_("multiple movy specifications"));
2603
          movy = DDT_BASE;
2604
          break;
2605
 
2606
        case MOVX_NOPY:
2607
          if (movx)
2608
            as_bad (_("multiple movx specifications"));
2609
          if ((reg_n < 4 || reg_n > 5)
2610
              && (reg_n < 0 || reg_n > 1))
2611
            as_bad (_("invalid movx address register"));
2612
          if (movy && movy != DDT_BASE)
2613
            as_bad (_("insn cannot be combined with non-nopy"));
2614
          movx = ((((reg_n & 1) != 0) << 9)
2615
                  + (((reg_n & 4) == 0) << 8)
2616
                  + (reg_x << 6)
2617
                  + (opcode->nibbles[2] << 4)
2618
                  + opcode->nibbles[3]
2619
                  + DDT_BASE);
2620
          break;
2621
 
2622
        case MOVY_NOPX:
2623
          if (movy)
2624
            as_bad (_("multiple movy specifications"));
2625
          if ((reg_n < 6 || reg_n > 7)
2626
              && (reg_n < 2 || reg_n > 3))
2627
            as_bad (_("invalid movy address register"));
2628
          if (movx && movx != DDT_BASE)
2629
            as_bad (_("insn cannot be combined with non-nopx"));
2630
          movy = ((((reg_n & 1) != 0) << 8)
2631
                  + (((reg_n & 4) == 0) << 9)
2632
                  + (reg_y << 6)
2633
                  + (opcode->nibbles[2] << 4)
2634
                  + opcode->nibbles[3]
2635
                  + DDT_BASE);
2636
          break;
2637
 
2638
        case MOVX:
2639
          if (movx)
2640
            as_bad (_("multiple movx specifications"));
2641
          if (movy & 0x2ac)
2642
            as_bad (_("previous movy requires nopx"));
2643
          if (reg_n < 4 || reg_n > 5)
2644
            as_bad (_("invalid movx address register"));
2645
          if (opcode->nibbles[2] & 8)
2646
            {
2647
              if (reg_m == A_A1_NUM)
2648
                movx = 1 << 7;
2649
              else if (reg_m != A_A0_NUM)
2650
                as_bad (_("invalid movx dsp register"));
2651
            }
2652
          else
2653
            {
2654
              if (reg_x > 1)
2655
                as_bad (_("invalid movx dsp register"));
2656
              movx = reg_x << 7;
2657
            }
2658
          movx += ((reg_n - 4) << 9) + (opcode->nibbles[2] << 2) + DDT_BASE;
2659
          break;
2660
 
2661
        case MOVY:
2662
          if (movy)
2663
            as_bad (_("multiple movy specifications"));
2664
          if (movx & 0x153)
2665
            as_bad (_("previous movx requires nopy"));
2666
          if (opcode->nibbles[2] & 8)
2667
            {
2668
              /* Bit 3 in nibbles[2] is intended for bit 4 of the opcode,
2669
                 so add 8 more.  */
2670
              movy = 8;
2671
              if (reg_m == A_A1_NUM)
2672
                movy += 1 << 6;
2673
              else if (reg_m != A_A0_NUM)
2674
                as_bad (_("invalid movy dsp register"));
2675
            }
2676
          else
2677
            {
2678
              if (reg_y > 1)
2679
                as_bad (_("invalid movy dsp register"));
2680
              movy = reg_y << 6;
2681
            }
2682
          if (reg_n < 6 || reg_n > 7)
2683
            as_bad (_("invalid movy address register"));
2684
          movy += ((reg_n - 6) << 8) + opcode->nibbles[2] + DDT_BASE;
2685
          break;
2686
 
2687
        case PSH:
2688
          if (operand[0].immediate.X_op != O_constant)
2689
            as_bad (_("dsp immediate shift value not constant"));
2690
          field_b = ((opcode->nibbles[2] << 12)
2691
                     | (operand[0].immediate.X_add_number & 127) << 4
2692
                     | reg_n);
2693
          break;
2694
        case PPI3NC:
2695
          if (cond)
2696
            {
2697
              opcode++;
2698
              goto try_another_opcode;
2699
            }
2700
          /* Fall through.  */
2701
        case PPI3:
2702
          if (field_b)
2703
            as_bad (_("multiple parallel processing specifications"));
2704
          field_b = ((opcode->nibbles[2] << 12) + (opcode->nibbles[3] << 8)
2705
                     + (reg_x << 6) + (reg_y << 4) + reg_n);
2706
          switch (opcode->nibbles[4])
2707
            {
2708
            case HEX_0:
2709
            case HEX_XX00:
2710
            case HEX_00YY:
2711
              break;
2712
            case HEX_1:
2713
            case HEX_4:
2714
              field_b += opcode->nibbles[4] << 4;
2715
              break;
2716
            default:
2717
              abort ();
2718
            }
2719
          break;
2720
        case PDC:
2721
          if (cond)
2722
            as_bad (_("multiple condition specifications"));
2723
          cond = opcode->nibbles[2] << 8;
2724
          if (*op_end)
2725
            goto skip_cond_check;
2726
          break;
2727
        case PPIC:
2728
          if (field_b)
2729
            as_bad (_("multiple parallel processing specifications"));
2730
          field_b = ((opcode->nibbles[2] << 12) + (opcode->nibbles[3] << 8)
2731
                     + cond + (reg_x << 6) + (reg_y << 4) + reg_n);
2732
          cond = 0;
2733
          switch (opcode->nibbles[4])
2734
            {
2735
            case HEX_0:
2736
            case HEX_XX00:
2737
            case HEX_00YY:
2738
              break;
2739
            case HEX_1:
2740
            case HEX_4:
2741
              field_b += opcode->nibbles[4] << 4;
2742
              break;
2743
            default:
2744
              abort ();
2745
            }
2746
          break;
2747
        case PMUL:
2748
          if (field_b)
2749
            {
2750
              if ((field_b & 0xef00) == 0xa100)
2751
                field_b -= 0x8100;
2752
              /* pclr Dz pmuls Se,Sf,Dg */
2753
              else if ((field_b & 0xff00) == 0x8d00
2754
                       && (SH_MERGE_ARCH_SET_VALID (valid_arch, arch_sh4al_dsp_up)))
2755
                {
2756
                  valid_arch = SH_MERGE_ARCH_SET (valid_arch, arch_sh4al_dsp_up);
2757
                  field_b -= 0x8cf0;
2758
                }
2759
              else
2760
                as_bad (_("insn cannot be combined with pmuls"));
2761
              switch (field_b & 0xf)
2762
                {
2763
                case A_X0_NUM:
2764
                  field_b += 0 - A_X0_NUM;
2765
                  break;
2766
                case A_Y0_NUM:
2767
                  field_b += 1 - A_Y0_NUM;
2768
                  break;
2769
                case A_A0_NUM:
2770
                  field_b += 2 - A_A0_NUM;
2771
                  break;
2772
                case A_A1_NUM:
2773
                  field_b += 3 - A_A1_NUM;
2774
                  break;
2775
                default:
2776
                  as_bad (_("bad combined pmuls output operand"));
2777
                }
2778
                /* Generate warning if the destination register for padd / psub
2779
                   and pmuls is the same ( only for A0 or A1 ).
2780
                   If the last nibble is 1010 then A0 is used in both
2781
                   padd / psub and pmuls. If it is 1111 then A1 is used
2782
                   as destination register in both padd / psub and pmuls.  */
2783
 
2784
                if ((((field_b | reg_efg) & 0x000F) == 0x000A)
2785
                    || (((field_b | reg_efg) & 0x000F) == 0x000F))
2786
                  as_warn (_("destination register is same for parallel insns"));
2787
            }
2788
          field_b += 0x4000 + reg_efg;
2789
          break;
2790
        default:
2791
          abort ();
2792
        }
2793
      if (cond)
2794
        {
2795
          as_bad (_("condition not followed by conditionalizable insn"));
2796
          cond = 0;
2797
        }
2798
      if (! *op_end)
2799
        break;
2800
    skip_cond_check:
2801
      opcode = find_cooked_opcode (&op_end);
2802
      if (opcode == NULL)
2803
        {
2804
          (as_bad
2805
           (_("unrecognized characters at end of parallel processing insn")));
2806
          break;
2807
        }
2808
    }
2809
 
2810
  move_code = movx | movy;
2811
  if (field_b)
2812
    {
2813
      /* Parallel processing insn.  */
2814
      unsigned long ppi_code = (movx | movy | 0xf800) << 16 | field_b;
2815
 
2816
      output = frag_more (4);
2817
      size = 4;
2818
      if (! target_big_endian)
2819
        {
2820
          output[3] = ppi_code >> 8;
2821
          output[2] = ppi_code;
2822
        }
2823
      else
2824
        {
2825
          output[2] = ppi_code >> 8;
2826
          output[3] = ppi_code;
2827
        }
2828
      move_code |= 0xf800;
2829
    }
2830
  else
2831
    {
2832
      /* Just a double data transfer.  */
2833
      output = frag_more (2);
2834
      size = 2;
2835
    }
2836
  if (! target_big_endian)
2837
    {
2838
      output[1] = move_code >> 8;
2839
      output[0] = move_code;
2840
    }
2841
  else
2842
    {
2843
      output[0] = move_code >> 8;
2844
      output[1] = move_code;
2845
    }
2846
  return size;
2847
}
2848
 
2849
/* This is the guts of the machine-dependent assembler.  STR points to a
2850
   machine dependent instruction.  This function is supposed to emit
2851
   the frags/bytes it assembles to.  */
2852
 
2853
void
2854
md_assemble (char *str)
2855
{
2856
  char *op_end;
2857
  sh_operand_info operand[3];
2858
  sh_opcode_info *opcode;
2859
  unsigned int size = 0;
2860
  char *initial_str = str;
2861
 
2862
#ifdef HAVE_SH64
2863
  if (sh64_isa_mode == sh64_isa_shmedia)
2864
    {
2865
      shmedia_md_assemble (str);
2866
      return;
2867
    }
2868
  else
2869
    {
2870
      /* If we've seen pseudo-directives, make sure any emitted data or
2871
         frags are marked as data.  */
2872
      if (!seen_insn)
2873
        {
2874
          sh64_update_contents_mark (TRUE);
2875
          sh64_set_contents_type (CRT_SH5_ISA16);
2876
        }
2877
 
2878
      seen_insn = TRUE;
2879
    }
2880
#endif /* HAVE_SH64 */
2881
 
2882
  opcode = find_cooked_opcode (&str);
2883
  op_end = str;
2884
 
2885
  if (opcode == NULL)
2886
    {
2887
      /* The opcode is not in the hash table.
2888
         This means we definitely have an assembly failure,
2889
         but the instruction may be valid in another CPU variant.
2890
         In this case emit something better than 'unknown opcode'.
2891
         Search the full table in sh-opc.h to check. */
2892
 
2893
      char *name = initial_str;
2894
      int name_length = 0;
2895
      const sh_opcode_info *op;
2896
      int found = 0;
2897
 
2898
      /* identify opcode in string */
2899
      while (ISSPACE (*name))
2900
        {
2901
          name++;
2902
        }
2903
      while (!ISSPACE (name[name_length]))
2904
        {
2905
          name_length++;
2906
        }
2907
 
2908
      /* search for opcode in full list */
2909
      for (op = sh_table; op->name; op++)
2910
        {
2911
          if (strncasecmp (op->name, name, name_length) == 0
2912
              && op->name[name_length] == '\0')
2913
            {
2914
              found = 1;
2915
              break;
2916
            }
2917
        }
2918
 
2919
      if ( found )
2920
        {
2921
          as_bad (_("opcode not valid for this cpu variant"));
2922
        }
2923
      else
2924
        {
2925
          as_bad (_("unknown opcode"));
2926
        }
2927
      return;
2928
    }
2929
 
2930
  if (sh_relax
2931
      && ! seg_info (now_seg)->tc_segment_info_data.in_code)
2932
    {
2933
      /* Output a CODE reloc to tell the linker that the following
2934
         bytes are instructions, not data.  */
2935
      fix_new (frag_now, frag_now_fix (), 2, &abs_symbol, 0, 0,
2936
               BFD_RELOC_SH_CODE);
2937
      seg_info (now_seg)->tc_segment_info_data.in_code = 1;
2938
    }
2939
 
2940
  if (opcode->nibbles[0] == PPI)
2941
    {
2942
      size = assemble_ppi (op_end, opcode);
2943
    }
2944
  else
2945
    {
2946
      if (opcode->arg[0] == A_BDISP12
2947
          || opcode->arg[0] == A_BDISP8)
2948
        {
2949
          /* Since we skip get_specific here, we have to check & update
2950
             valid_arch now.  */
2951
          if (SH_MERGE_ARCH_SET_VALID (valid_arch, opcode->arch))
2952
            valid_arch = SH_MERGE_ARCH_SET (valid_arch, opcode->arch);
2953
          else
2954
            as_bad (_("Delayed branches not available on SH1"));
2955
          parse_exp (op_end + 1, &operand[0]);
2956
          build_relax (opcode, &operand[0]);
2957
 
2958
          /* All branches are currently 16 bit.  */
2959
          size = 2;
2960
        }
2961
      else
2962
        {
2963
          if (opcode->arg[0] == A_END)
2964
            {
2965
              /* Ignore trailing whitespace.  If there is any, it has already
2966
                 been compressed to a single space.  */
2967
              if (*op_end == ' ')
2968
                op_end++;
2969
            }
2970
          else
2971
            {
2972
              op_end = get_operands (opcode, op_end, operand);
2973
            }
2974
          opcode = get_specific (opcode, operand);
2975
 
2976
          if (opcode == 0)
2977
            {
2978
              /* Couldn't find an opcode which matched the operands.  */
2979
              char *where = frag_more (2);
2980
              size = 2;
2981
 
2982
              where[0] = 0x0;
2983
              where[1] = 0x0;
2984
              as_bad (_("invalid operands for opcode"));
2985
            }
2986
          else
2987
            {
2988
              if (*op_end)
2989
                as_bad (_("excess operands: '%s'"), op_end);
2990
 
2991
              size = build_Mytes (opcode, operand);
2992
            }
2993
        }
2994
    }
2995
 
2996
  dwarf2_emit_insn (size);
2997
}
2998
 
2999
/* This routine is called each time a label definition is seen.  It
3000
   emits a BFD_RELOC_SH_LABEL reloc if necessary.  */
3001
 
3002
void
3003
sh_frob_label (symbolS *sym)
3004
{
3005
  static fragS *last_label_frag;
3006
  static int last_label_offset;
3007
 
3008
  if (sh_relax
3009
      && seg_info (now_seg)->tc_segment_info_data.in_code)
3010
    {
3011
      int offset;
3012
 
3013
      offset = frag_now_fix ();
3014
      if (frag_now != last_label_frag
3015
          || offset != last_label_offset)
3016
        {
3017
          fix_new (frag_now, offset, 2, &abs_symbol, 0, 0, BFD_RELOC_SH_LABEL);
3018
          last_label_frag = frag_now;
3019
          last_label_offset = offset;
3020
        }
3021
    }
3022
 
3023
  dwarf2_emit_label (sym);
3024
}
3025
 
3026
/* This routine is called when the assembler is about to output some
3027
   data.  It emits a BFD_RELOC_SH_DATA reloc if necessary.  */
3028
 
3029
void
3030
sh_flush_pending_output (void)
3031
{
3032
  if (sh_relax
3033
      && seg_info (now_seg)->tc_segment_info_data.in_code)
3034
    {
3035
      fix_new (frag_now, frag_now_fix (), 2, &abs_symbol, 0, 0,
3036
               BFD_RELOC_SH_DATA);
3037
      seg_info (now_seg)->tc_segment_info_data.in_code = 0;
3038
    }
3039
}
3040
 
3041
symbolS *
3042
md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
3043
{
3044
  return 0;
3045
}
3046
 
3047
/* Various routines to kill one day.  */
3048
 
3049
char *
3050
md_atof (int type, char *litP, int *sizeP)
3051
{
3052
  return ieee_md_atof (type, litP, sizeP, target_big_endian);
3053
}
3054
 
3055
/* Handle the .uses pseudo-op.  This pseudo-op is used just before a
3056
   call instruction.  It refers to a label of the instruction which
3057
   loads the register which the call uses.  We use it to generate a
3058
   special reloc for the linker.  */
3059
 
3060
static void
3061
s_uses (int ignore ATTRIBUTE_UNUSED)
3062
{
3063
  expressionS ex;
3064
 
3065
  if (! sh_relax)
3066
    as_warn (_(".uses pseudo-op seen when not relaxing"));
3067
 
3068
  expression (&ex);
3069
 
3070
  if (ex.X_op != O_symbol || ex.X_add_number != 0)
3071
    {
3072
      as_bad (_("bad .uses format"));
3073
      ignore_rest_of_line ();
3074
      return;
3075
    }
3076
 
3077
  fix_new_exp (frag_now, frag_now_fix (), 2, &ex, 1, BFD_RELOC_SH_USES);
3078
 
3079
  demand_empty_rest_of_line ();
3080
}
3081
 
3082
enum options
3083
{
3084
  OPTION_RELAX = OPTION_MD_BASE,
3085
  OPTION_BIG,
3086
  OPTION_LITTLE,
3087
  OPTION_SMALL,
3088
  OPTION_DSP,
3089
  OPTION_ISA,
3090
  OPTION_RENESAS,
3091
  OPTION_ALLOW_REG_PREFIX,
3092
#ifdef HAVE_SH64
3093
  OPTION_ABI,
3094
  OPTION_NO_MIX,
3095
  OPTION_SHCOMPACT_CONST_CRANGE,
3096
  OPTION_NO_EXPAND,
3097
  OPTION_PT32,
3098
#endif
3099
  OPTION_DUMMY  /* Not used.  This is just here to make it easy to add and subtract options from this enum.  */
3100
};
3101
 
3102
const char *md_shortopts = "";
3103
struct option md_longopts[] =
3104
{
3105
  {"relax", no_argument, NULL, OPTION_RELAX},
3106
  {"big", no_argument, NULL, OPTION_BIG},
3107
  {"little", no_argument, NULL, OPTION_LITTLE},
3108
  /* The next two switches are here because the
3109
     generic parts of the linker testsuite uses them.  */
3110
  {"EB", no_argument, NULL, OPTION_BIG},
3111
  {"EL", no_argument, NULL, OPTION_LITTLE},
3112
  {"small", no_argument, NULL, OPTION_SMALL},
3113
  {"dsp", no_argument, NULL, OPTION_DSP},
3114
  {"isa", required_argument, NULL, OPTION_ISA},
3115
  {"renesas", no_argument, NULL, OPTION_RENESAS},
3116
  {"allow-reg-prefix", no_argument, NULL, OPTION_ALLOW_REG_PREFIX},
3117
 
3118
#ifdef HAVE_SH64
3119
  {"abi",                    required_argument, NULL, OPTION_ABI},
3120
  {"no-mix",                 no_argument, NULL, OPTION_NO_MIX},
3121
  {"shcompact-const-crange", no_argument, NULL, OPTION_SHCOMPACT_CONST_CRANGE},
3122
  {"no-expand",              no_argument, NULL, OPTION_NO_EXPAND},
3123
  {"expand-pt32",            no_argument, NULL, OPTION_PT32},
3124
#endif /* HAVE_SH64 */
3125
 
3126
  {NULL, no_argument, NULL, 0}
3127
};
3128
size_t md_longopts_size = sizeof (md_longopts);
3129
 
3130
int
3131
md_parse_option (int c, char *arg ATTRIBUTE_UNUSED)
3132
{
3133
  switch (c)
3134
    {
3135
    case OPTION_RELAX:
3136
      sh_relax = 1;
3137
      break;
3138
 
3139
    case OPTION_BIG:
3140
      target_big_endian = 1;
3141
      break;
3142
 
3143
    case OPTION_LITTLE:
3144
      target_big_endian = 0;
3145
      break;
3146
 
3147
    case OPTION_SMALL:
3148
      sh_small = 1;
3149
      break;
3150
 
3151
    case OPTION_DSP:
3152
      preset_target_arch = arch_sh_up & ~(arch_sh_sp_fpu|arch_sh_dp_fpu);
3153
      break;
3154
 
3155
    case OPTION_RENESAS:
3156
      dont_adjust_reloc_32 = 1;
3157
      break;
3158
 
3159
    case OPTION_ALLOW_REG_PREFIX:
3160
      allow_dollar_register_prefix = 1;
3161
      break;
3162
 
3163
    case OPTION_ISA:
3164
      if (strcasecmp (arg, "dsp") == 0)
3165
        preset_target_arch = arch_sh_up & ~(arch_sh_sp_fpu|arch_sh_dp_fpu);
3166
      else if (strcasecmp (arg, "fp") == 0)
3167
        preset_target_arch = arch_sh_up & ~arch_sh_has_dsp;
3168
      else if (strcasecmp (arg, "any") == 0)
3169
        preset_target_arch = arch_sh_up;
3170
#ifdef HAVE_SH64
3171
      else if (strcasecmp (arg, "shmedia") == 0)
3172
        {
3173
          if (sh64_isa_mode == sh64_isa_shcompact)
3174
            as_bad (_("Invalid combination: --isa=SHcompact with --isa=SHmedia"));
3175
          sh64_isa_mode = sh64_isa_shmedia;
3176
        }
3177
      else if (strcasecmp (arg, "shcompact") == 0)
3178
        {
3179
          if (sh64_isa_mode == sh64_isa_shmedia)
3180
            as_bad (_("Invalid combination: --isa=SHmedia with --isa=SHcompact"));
3181
          if (sh64_abi == sh64_abi_64)
3182
            as_bad (_("Invalid combination: --abi=64 with --isa=SHcompact"));
3183
          sh64_isa_mode = sh64_isa_shcompact;
3184
        }
3185
#endif /* HAVE_SH64 */
3186
      else
3187
        {
3188
          extern const bfd_arch_info_type bfd_sh_arch;
3189
          bfd_arch_info_type const *bfd_arch = &bfd_sh_arch;
3190
 
3191
          preset_target_arch = 0;
3192
          for (; bfd_arch; bfd_arch=bfd_arch->next)
3193
            {
3194
              int len = strlen(bfd_arch->printable_name);
3195
 
3196
              if (bfd_arch->mach == bfd_mach_sh5)
3197
                continue;
3198
 
3199
              if (strncasecmp (bfd_arch->printable_name, arg, len) != 0)
3200
                continue;
3201
 
3202
              if (arg[len] == '\0')
3203
                preset_target_arch =
3204
                  sh_get_arch_from_bfd_mach (bfd_arch->mach);
3205
              else if (strcasecmp(&arg[len], "-up") == 0)
3206
                preset_target_arch =
3207
                  sh_get_arch_up_from_bfd_mach (bfd_arch->mach);
3208
              else
3209
                continue;
3210
              break;
3211
            }
3212
 
3213
          if (!preset_target_arch)
3214
            as_bad ("Invalid argument to --isa option: %s", arg);
3215
        }
3216
      break;
3217
 
3218
#ifdef HAVE_SH64
3219
    case OPTION_ABI:
3220
      if (strcmp (arg, "32") == 0)
3221
        {
3222
          if (sh64_abi == sh64_abi_64)
3223
            as_bad (_("Invalid combination: --abi=32 with --abi=64"));
3224
          sh64_abi = sh64_abi_32;
3225
        }
3226
      else if (strcmp (arg, "64") == 0)
3227
        {
3228
          if (sh64_abi == sh64_abi_32)
3229
            as_bad (_("Invalid combination: --abi=64 with --abi=32"));
3230
          if (sh64_isa_mode == sh64_isa_shcompact)
3231
            as_bad (_("Invalid combination: --isa=SHcompact with --abi=64"));
3232
          sh64_abi = sh64_abi_64;
3233
        }
3234
      else
3235
        as_bad ("Invalid argument to --abi option: %s", arg);
3236
      break;
3237
 
3238
    case OPTION_NO_MIX:
3239
      sh64_mix = FALSE;
3240
      break;
3241
 
3242
    case OPTION_SHCOMPACT_CONST_CRANGE:
3243
      sh64_shcompact_const_crange = TRUE;
3244
      break;
3245
 
3246
    case OPTION_NO_EXPAND:
3247
      sh64_expand = FALSE;
3248
      break;
3249
 
3250
    case OPTION_PT32:
3251
      sh64_pt32 = TRUE;
3252
      break;
3253
#endif /* HAVE_SH64 */
3254
 
3255
    default:
3256
      return 0;
3257
    }
3258
 
3259
  return 1;
3260
}
3261
 
3262
void
3263
md_show_usage (FILE *stream)
3264
{
3265
  fprintf (stream, _("\
3266
SH options:\n\
3267
--little                generate little endian code\n\
3268
--big                   generate big endian code\n\
3269
--relax                 alter jump instructions for long displacements\n\
3270
--renesas               disable optimization with section symbol for\n\
3271
                        compatibility with Renesas assembler.\n\
3272
--small                 align sections to 4 byte boundaries, not 16\n\
3273
--dsp                   enable sh-dsp insns, and disable floating-point ISAs.\n\
3274
--allow-reg-prefix      allow '$' as a register name prefix.\n\
3275
--isa=[any              use most appropriate isa\n\
3276
    | dsp               same as '-dsp'\n\
3277
    | fp"));
3278
  {
3279
    extern const bfd_arch_info_type bfd_sh_arch;
3280
    bfd_arch_info_type const *bfd_arch = &bfd_sh_arch;
3281
 
3282
    for (; bfd_arch; bfd_arch=bfd_arch->next)
3283
      if (bfd_arch->mach != bfd_mach_sh5)
3284
        {
3285
          fprintf (stream, "\n    | %s", bfd_arch->printable_name);
3286
          fprintf (stream, "\n    | %s-up", bfd_arch->printable_name);
3287
        }
3288
  }
3289
  fprintf (stream, "]\n");
3290
#ifdef HAVE_SH64
3291
  fprintf (stream, _("\
3292
--isa=[shmedia          set as the default instruction set for SH64\n\
3293
    | SHmedia\n\
3294
    | shcompact\n\
3295
    | SHcompact]\n"));
3296
  fprintf (stream, _("\
3297
--abi=[32|64]           set size of expanded SHmedia operands and object\n\
3298
                        file type\n\
3299
--shcompact-const-crange  emit code-range descriptors for constants in\n\
3300
                        SHcompact code sections\n\
3301
--no-mix                disallow SHmedia code in the same section as\n\
3302
                        constants and SHcompact code\n\
3303
--no-expand             do not expand MOVI, PT, PTA or PTB instructions\n\
3304
--expand-pt32           with -abi=64, expand PT, PTA and PTB instructions\n\
3305
                        to 32 bits only\n"));
3306
#endif /* HAVE_SH64 */
3307
}
3308
 
3309
/* This struct is used to pass arguments to sh_count_relocs through
3310
   bfd_map_over_sections.  */
3311
 
3312
struct sh_count_relocs
3313
{
3314
  /* Symbol we are looking for.  */
3315
  symbolS *sym;
3316
  /* Count of relocs found.  */
3317
  int count;
3318
};
3319
 
3320
/* Count the number of fixups in a section which refer to a particular
3321
   symbol.  This is called via bfd_map_over_sections.  */
3322
 
3323
static void
3324
sh_count_relocs (bfd *abfd ATTRIBUTE_UNUSED, segT sec, void *data)
3325
{
3326
  struct sh_count_relocs *info = (struct sh_count_relocs *) data;
3327
  segment_info_type *seginfo;
3328
  symbolS *sym;
3329
  fixS *fix;
3330
 
3331
  seginfo = seg_info (sec);
3332
  if (seginfo == NULL)
3333
    return;
3334
 
3335
  sym = info->sym;
3336
  for (fix = seginfo->fix_root; fix != NULL; fix = fix->fx_next)
3337
    {
3338
      if (fix->fx_addsy == sym)
3339
        {
3340
          ++info->count;
3341
          fix->fx_tcbit = 1;
3342
        }
3343
    }
3344
}
3345
 
3346
/* Handle the count relocs for a particular section.
3347
   This is called via bfd_map_over_sections.  */
3348
 
3349
static void
3350
sh_frob_section (bfd *abfd ATTRIBUTE_UNUSED, segT sec,
3351
                 void *ignore ATTRIBUTE_UNUSED)
3352
{
3353
  segment_info_type *seginfo;
3354
  fixS *fix;
3355
 
3356
  seginfo = seg_info (sec);
3357
  if (seginfo == NULL)
3358
    return;
3359
 
3360
  for (fix = seginfo->fix_root; fix != NULL; fix = fix->fx_next)
3361
    {
3362
      symbolS *sym;
3363
 
3364
      sym = fix->fx_addsy;
3365
      /* Check for a local_symbol.  */
3366
      if (sym && sym->bsym == NULL)
3367
        {
3368
          struct local_symbol *ls = (struct local_symbol *)sym;
3369
          /* See if it's been converted.  If so, canonicalize.  */
3370
          if (local_symbol_converted_p (ls))
3371
            fix->fx_addsy = local_symbol_get_real_symbol (ls);
3372
        }
3373
    }
3374
 
3375
  for (fix = seginfo->fix_root; fix != NULL; fix = fix->fx_next)
3376
    {
3377
      symbolS *sym;
3378
      bfd_vma val;
3379
      fixS *fscan;
3380
      struct sh_count_relocs info;
3381
 
3382
      if (fix->fx_r_type != BFD_RELOC_SH_USES)
3383
        continue;
3384
 
3385
      /* The BFD_RELOC_SH_USES reloc should refer to a defined local
3386
         symbol in the same section.  */
3387
      sym = fix->fx_addsy;
3388
      if (sym == NULL
3389
          || fix->fx_subsy != NULL
3390
          || fix->fx_addnumber != 0
3391
          || S_GET_SEGMENT (sym) != sec
3392
          || S_IS_EXTERNAL (sym))
3393
        {
3394
          as_warn_where (fix->fx_file, fix->fx_line,
3395
                         _(".uses does not refer to a local symbol in the same section"));
3396
          continue;
3397
        }
3398
 
3399
      /* Look through the fixups again, this time looking for one
3400
         at the same location as sym.  */
3401
      val = S_GET_VALUE (sym);
3402
      for (fscan = seginfo->fix_root;
3403
           fscan != NULL;
3404
           fscan = fscan->fx_next)
3405
        if (val == fscan->fx_frag->fr_address + fscan->fx_where
3406
            && fscan->fx_r_type != BFD_RELOC_SH_ALIGN
3407
            && fscan->fx_r_type != BFD_RELOC_SH_CODE
3408
            && fscan->fx_r_type != BFD_RELOC_SH_DATA
3409
            && fscan->fx_r_type != BFD_RELOC_SH_LABEL)
3410
          break;
3411
      if (fscan == NULL)
3412
        {
3413
          as_warn_where (fix->fx_file, fix->fx_line,
3414
                         _("can't find fixup pointed to by .uses"));
3415
          continue;
3416
        }
3417
 
3418
      if (fscan->fx_tcbit)
3419
        {
3420
          /* We've already done this one.  */
3421
          continue;
3422
        }
3423
 
3424
      /* The variable fscan should also be a fixup to a local symbol
3425
         in the same section.  */
3426
      sym = fscan->fx_addsy;
3427
      if (sym == NULL
3428
          || fscan->fx_subsy != NULL
3429
          || fscan->fx_addnumber != 0
3430
          || S_GET_SEGMENT (sym) != sec
3431
          || S_IS_EXTERNAL (sym))
3432
        {
3433
          as_warn_where (fix->fx_file, fix->fx_line,
3434
                         _(".uses target does not refer to a local symbol in the same section"));
3435
          continue;
3436
        }
3437
 
3438
      /* Now we look through all the fixups of all the sections,
3439
         counting the number of times we find a reference to sym.  */
3440
      info.sym = sym;
3441
      info.count = 0;
3442
      bfd_map_over_sections (stdoutput, sh_count_relocs, &info);
3443
 
3444
      if (info.count < 1)
3445
        abort ();
3446
 
3447
      /* Generate a BFD_RELOC_SH_COUNT fixup at the location of sym.
3448
         We have already adjusted the value of sym to include the
3449
         fragment address, so we undo that adjustment here.  */
3450
      subseg_change (sec, 0);
3451
      fix_new (fscan->fx_frag,
3452
               S_GET_VALUE (sym) - fscan->fx_frag->fr_address,
3453
               4, &abs_symbol, info.count, 0, BFD_RELOC_SH_COUNT);
3454
    }
3455
}
3456
 
3457
/* This function is called after the symbol table has been completed,
3458
   but before the relocs or section contents have been written out.
3459
   If we have seen any .uses pseudo-ops, they point to an instruction
3460
   which loads a register with the address of a function.  We look
3461
   through the fixups to find where the function address is being
3462
   loaded from.  We then generate a COUNT reloc giving the number of
3463
   times that function address is referred to.  The linker uses this
3464
   information when doing relaxing, to decide when it can eliminate
3465
   the stored function address entirely.  */
3466
 
3467
void
3468
sh_frob_file (void)
3469
{
3470
#ifdef HAVE_SH64
3471
  shmedia_frob_file_before_adjust ();
3472
#endif
3473
 
3474
  if (! sh_relax)
3475
    return;
3476
 
3477
  bfd_map_over_sections (stdoutput, sh_frob_section, NULL);
3478
}
3479
 
3480
/* Called after relaxing.  Set the correct sizes of the fragments, and
3481
   create relocs so that md_apply_fix will fill in the correct values.  */
3482
 
3483
void
3484
md_convert_frag (bfd *headers ATTRIBUTE_UNUSED, segT seg, fragS *fragP)
3485
{
3486
  int donerelax = 0;
3487
 
3488
  switch (fragP->fr_subtype)
3489
    {
3490
    case C (COND_JUMP, COND8):
3491
    case C (COND_JUMP_DELAY, COND8):
3492
      subseg_change (seg, 0);
3493
      fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol, fragP->fr_offset,
3494
               1, BFD_RELOC_SH_PCDISP8BY2);
3495
      fragP->fr_fix += 2;
3496
      fragP->fr_var = 0;
3497
      break;
3498
 
3499
    case C (UNCOND_JUMP, UNCOND12):
3500
      subseg_change (seg, 0);
3501
      fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol, fragP->fr_offset,
3502
               1, BFD_RELOC_SH_PCDISP12BY2);
3503
      fragP->fr_fix += 2;
3504
      fragP->fr_var = 0;
3505
      break;
3506
 
3507
    case C (UNCOND_JUMP, UNCOND32):
3508
    case C (UNCOND_JUMP, UNDEF_WORD_DISP):
3509
      if (fragP->fr_symbol == NULL)
3510
        as_bad_where (fragP->fr_file, fragP->fr_line,
3511
                      _("displacement overflows 12-bit field"));
3512
      else if (S_IS_DEFINED (fragP->fr_symbol))
3513
        as_bad_where (fragP->fr_file, fragP->fr_line,
3514
                      _("displacement to defined symbol %s overflows 12-bit field"),
3515
                      S_GET_NAME (fragP->fr_symbol));
3516
      else
3517
        as_bad_where (fragP->fr_file, fragP->fr_line,
3518
                      _("displacement to undefined symbol %s overflows 12-bit field"),
3519
                      S_GET_NAME (fragP->fr_symbol));
3520
      /* Stabilize this frag, so we don't trip an assert.  */
3521
      fragP->fr_fix += fragP->fr_var;
3522
      fragP->fr_var = 0;
3523
      break;
3524
 
3525
    case C (COND_JUMP, COND12):
3526
    case C (COND_JUMP_DELAY, COND12):
3527
      /* A bcond won't fit, so turn it into a b!cond; bra disp; nop.  */
3528
      /* I found that a relax failure for gcc.c-torture/execute/930628-1.c
3529
         was due to gas incorrectly relaxing an out-of-range conditional
3530
         branch with delay slot.  It turned:
3531
                     bf.s    L6              (slot mov.l   r12,@(44,r0))
3532
         into:
3533
 
3534
2c:  8f 01 a0 8b     bf.s    32 <_main+32>   (slot bra       L6)
3535
30:  00 09           nop
3536
32:  10 cb           mov.l   r12,@(44,r0)
3537
         Therefore, branches with delay slots have to be handled
3538
         differently from ones without delay slots.  */
3539
      {
3540
        unsigned char *buffer =
3541
          (unsigned char *) (fragP->fr_fix + fragP->fr_literal);
3542
        int highbyte = target_big_endian ? 0 : 1;
3543
        int lowbyte = target_big_endian ? 1 : 0;
3544
        int delay = fragP->fr_subtype == C (COND_JUMP_DELAY, COND12);
3545
 
3546
        /* Toggle the true/false bit of the bcond.  */
3547
        buffer[highbyte] ^= 0x2;
3548
 
3549
        /* If this is a delayed branch, we may not put the bra in the
3550
           slot.  So we change it to a non-delayed branch, like that:
3551
           b! cond slot_label; bra disp; slot_label: slot_insn
3552
           ??? We should try if swapping the conditional branch and
3553
           its delay-slot insn already makes the branch reach.  */
3554
 
3555
        /* Build a relocation to six / four bytes farther on.  */
3556
        subseg_change (seg, 0);
3557
        fix_new (fragP, fragP->fr_fix, 2, section_symbol (seg),
3558
                 fragP->fr_address + fragP->fr_fix + (delay ? 4 : 6),
3559
                 1, BFD_RELOC_SH_PCDISP8BY2);
3560
 
3561
        /* Set up a jump instruction.  */
3562
        buffer[highbyte + 2] = 0xa0;
3563
        buffer[lowbyte + 2] = 0;
3564
        fix_new (fragP, fragP->fr_fix + 2, 2, fragP->fr_symbol,
3565
                 fragP->fr_offset, 1, BFD_RELOC_SH_PCDISP12BY2);
3566
 
3567
        if (delay)
3568
          {
3569
            buffer[highbyte] &= ~0x4; /* Removes delay slot from branch.  */
3570
            fragP->fr_fix += 4;
3571
          }
3572
        else
3573
          {
3574
            /* Fill in a NOP instruction.  */
3575
            buffer[highbyte + 4] = 0x0;
3576
            buffer[lowbyte + 4] = 0x9;
3577
 
3578
            fragP->fr_fix += 6;
3579
          }
3580
        fragP->fr_var = 0;
3581
        donerelax = 1;
3582
      }
3583
      break;
3584
 
3585
    case C (COND_JUMP, COND32):
3586
    case C (COND_JUMP_DELAY, COND32):
3587
    case C (COND_JUMP, UNDEF_WORD_DISP):
3588
    case C (COND_JUMP_DELAY, UNDEF_WORD_DISP):
3589
      if (fragP->fr_symbol == NULL)
3590
        as_bad_where (fragP->fr_file, fragP->fr_line,
3591
                      _("displacement overflows 8-bit field"));
3592
      else if (S_IS_DEFINED (fragP->fr_symbol))
3593
        as_bad_where (fragP->fr_file, fragP->fr_line,
3594
                      _("displacement to defined symbol %s overflows 8-bit field"),
3595
                      S_GET_NAME (fragP->fr_symbol));
3596
      else
3597
        as_bad_where (fragP->fr_file, fragP->fr_line,
3598
                      _("displacement to undefined symbol %s overflows 8-bit field "),
3599
                      S_GET_NAME (fragP->fr_symbol));
3600
      /* Stabilize this frag, so we don't trip an assert.  */
3601
      fragP->fr_fix += fragP->fr_var;
3602
      fragP->fr_var = 0;
3603
      break;
3604
 
3605
    default:
3606
#ifdef HAVE_SH64
3607
      shmedia_md_convert_frag (headers, seg, fragP, TRUE);
3608
#else
3609
      abort ();
3610
#endif
3611
    }
3612
 
3613
  if (donerelax && !sh_relax)
3614
    as_warn_where (fragP->fr_file, fragP->fr_line,
3615
                   _("overflow in branch to %s; converted into longer instruction sequence"),
3616
                   (fragP->fr_symbol != NULL
3617
                    ? S_GET_NAME (fragP->fr_symbol)
3618
                    : ""));
3619
}
3620
 
3621
valueT
3622
md_section_align (segT seg ATTRIBUTE_UNUSED, valueT size)
3623
{
3624
#ifdef OBJ_ELF
3625
  return size;
3626
#else /* ! OBJ_ELF */
3627
  return ((size + (1 << bfd_get_section_alignment (stdoutput, seg)) - 1)
3628
          & (-1 << bfd_get_section_alignment (stdoutput, seg)));
3629
#endif /* ! OBJ_ELF */
3630
}
3631
 
3632
/* This static variable is set by s_uacons to tell sh_cons_align that
3633
   the expression does not need to be aligned.  */
3634
 
3635
static int sh_no_align_cons = 0;
3636
 
3637
/* This handles the unaligned space allocation pseudo-ops, such as
3638
   .uaword.  .uaword is just like .word, but the value does not need
3639
   to be aligned.  */
3640
 
3641
static void
3642
s_uacons (int bytes)
3643
{
3644
  /* Tell sh_cons_align not to align this value.  */
3645
  sh_no_align_cons = 1;
3646
  cons (bytes);
3647
}
3648
 
3649
/* If a .word, et. al., pseud-op is seen, warn if the value is not
3650
   aligned correctly.  Note that this can cause warnings to be issued
3651
   when assembling initialized structured which were declared with the
3652
   packed attribute.  FIXME: Perhaps we should require an option to
3653
   enable this warning?  */
3654
 
3655
void
3656
sh_cons_align (int nbytes)
3657
{
3658
  int nalign;
3659
  char *p;
3660
 
3661
  if (sh_no_align_cons)
3662
    {
3663
      /* This is an unaligned pseudo-op.  */
3664
      sh_no_align_cons = 0;
3665
      return;
3666
    }
3667
 
3668
  nalign = 0;
3669
  while ((nbytes & 1) == 0)
3670
    {
3671
      ++nalign;
3672
      nbytes >>= 1;
3673
    }
3674
 
3675
  if (nalign == 0)
3676
    return;
3677
 
3678
  if (now_seg == absolute_section)
3679
    {
3680
      if ((abs_section_offset & ((1 << nalign) - 1)) != 0)
3681
        as_warn (_("misaligned data"));
3682
      return;
3683
    }
3684
 
3685
  p = frag_var (rs_align_test, 1, 1, (relax_substateT) 0,
3686
                (symbolS *) NULL, (offsetT) nalign, (char *) NULL);
3687
 
3688
  record_alignment (now_seg, nalign);
3689
}
3690
 
3691
/* When relaxing, we need to output a reloc for any .align directive
3692
   that requests alignment to a four byte boundary or larger.  This is
3693
   also where we check for misaligned data.  */
3694
 
3695
void
3696
sh_handle_align (fragS *frag)
3697
{
3698
  int bytes = frag->fr_next->fr_address - frag->fr_address - frag->fr_fix;
3699
 
3700
  if (frag->fr_type == rs_align_code)
3701
    {
3702
      static const unsigned char big_nop_pattern[] = { 0x00, 0x09 };
3703
      static const unsigned char little_nop_pattern[] = { 0x09, 0x00 };
3704
 
3705
      char *p = frag->fr_literal + frag->fr_fix;
3706
 
3707
      if (bytes & 1)
3708
        {
3709
          *p++ = 0;
3710
          bytes--;
3711
          frag->fr_fix += 1;
3712
        }
3713
 
3714
      if (target_big_endian)
3715
        {
3716
          memcpy (p, big_nop_pattern, sizeof big_nop_pattern);
3717
          frag->fr_var = sizeof big_nop_pattern;
3718
        }
3719
      else
3720
        {
3721
          memcpy (p, little_nop_pattern, sizeof little_nop_pattern);
3722
          frag->fr_var = sizeof little_nop_pattern;
3723
        }
3724
    }
3725
  else if (frag->fr_type == rs_align_test)
3726
    {
3727
      if (bytes != 0)
3728
        as_bad_where (frag->fr_file, frag->fr_line, _("misaligned data"));
3729
    }
3730
 
3731
  if (sh_relax
3732
      && (frag->fr_type == rs_align
3733
          || frag->fr_type == rs_align_code)
3734
      && frag->fr_address + frag->fr_fix > 0
3735
      && frag->fr_offset > 1
3736
      && now_seg != bss_section)
3737
    fix_new (frag, frag->fr_fix, 2, &abs_symbol, frag->fr_offset, 0,
3738
             BFD_RELOC_SH_ALIGN);
3739
}
3740
 
3741
/* See whether the relocation should be resolved locally.  */
3742
 
3743
static bfd_boolean
3744
sh_local_pcrel (fixS *fix)
3745
{
3746
  return (! sh_relax
3747
          && (fix->fx_r_type == BFD_RELOC_SH_PCDISP8BY2
3748
              || fix->fx_r_type == BFD_RELOC_SH_PCDISP12BY2
3749
              || fix->fx_r_type == BFD_RELOC_SH_PCRELIMM8BY2
3750
              || fix->fx_r_type == BFD_RELOC_SH_PCRELIMM8BY4
3751
              || fix->fx_r_type == BFD_RELOC_8_PCREL
3752
              || fix->fx_r_type == BFD_RELOC_SH_SWITCH16
3753
              || fix->fx_r_type == BFD_RELOC_SH_SWITCH32));
3754
}
3755
 
3756
/* See whether we need to force a relocation into the output file.
3757
   This is used to force out switch and PC relative relocations when
3758
   relaxing.  */
3759
 
3760
int
3761
sh_force_relocation (fixS *fix)
3762
{
3763
  /* These relocations can't make it into a DSO, so no use forcing
3764
     them for global symbols.  */
3765
  if (sh_local_pcrel (fix))
3766
    return 0;
3767
 
3768
  /* Make sure some relocations get emitted.  */
3769
  if (fix->fx_r_type == BFD_RELOC_SH_LOOP_START
3770
      || fix->fx_r_type == BFD_RELOC_SH_LOOP_END
3771
      || fix->fx_r_type == BFD_RELOC_SH_TLS_GD_32
3772
      || fix->fx_r_type == BFD_RELOC_SH_TLS_LD_32
3773
      || fix->fx_r_type == BFD_RELOC_SH_TLS_IE_32
3774
      || fix->fx_r_type == BFD_RELOC_SH_TLS_LDO_32
3775
      || fix->fx_r_type == BFD_RELOC_SH_TLS_LE_32
3776
      || generic_force_reloc (fix))
3777
    return 1;
3778
 
3779
  if (! sh_relax)
3780
    return 0;
3781
 
3782
  return (fix->fx_pcrel
3783
          || SWITCH_TABLE (fix)
3784
          || fix->fx_r_type == BFD_RELOC_SH_COUNT
3785
          || fix->fx_r_type == BFD_RELOC_SH_ALIGN
3786
          || fix->fx_r_type == BFD_RELOC_SH_CODE
3787
          || fix->fx_r_type == BFD_RELOC_SH_DATA
3788
#ifdef HAVE_SH64
3789
          || fix->fx_r_type == BFD_RELOC_SH_SHMEDIA_CODE
3790
#endif
3791
          || fix->fx_r_type == BFD_RELOC_SH_LABEL);
3792
}
3793
 
3794
#ifdef OBJ_ELF
3795
bfd_boolean
3796
sh_fix_adjustable (fixS *fixP)
3797
{
3798
  if (fixP->fx_r_type == BFD_RELOC_32_PLT_PCREL
3799
      || fixP->fx_r_type == BFD_RELOC_32_GOT_PCREL
3800
      || fixP->fx_r_type == BFD_RELOC_SH_GOTPC
3801
      || ((fixP->fx_r_type == BFD_RELOC_32) && dont_adjust_reloc_32)
3802
      || fixP->fx_r_type == BFD_RELOC_RVA)
3803
    return 0;
3804
 
3805
  /* We need the symbol name for the VTABLE entries */
3806
  if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
3807
      || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
3808
    return 0;
3809
 
3810
  return 1;
3811
}
3812
 
3813
void
3814
sh_elf_final_processing (void)
3815
{
3816
  int val;
3817
 
3818
  /* Set file-specific flags to indicate if this code needs
3819
     a processor with the sh-dsp / sh2e ISA to execute.  */
3820
#ifdef HAVE_SH64
3821
  /* SH5 and above don't know about the valid_arch arch_sh* bits defined
3822
     in sh-opc.h, so check SH64 mode before checking valid_arch.  */
3823
  if (sh64_isa_mode != sh64_isa_unspecified)
3824
    val = EF_SH5;
3825
  else
3826
#elif defined TARGET_SYMBIAN
3827
    if (1)
3828
      {
3829
        extern int sh_symbian_find_elf_flags (unsigned int);
3830
 
3831
        val = sh_symbian_find_elf_flags (valid_arch);
3832
      }
3833
    else
3834
#endif /* HAVE_SH64 */
3835
    val = sh_find_elf_flags (valid_arch);
3836
 
3837
  elf_elfheader (stdoutput)->e_flags &= ~EF_SH_MACH_MASK;
3838
  elf_elfheader (stdoutput)->e_flags |= val;
3839
}
3840
#endif
3841
 
3842
/* Apply fixup FIXP to SIZE-byte field BUF given that VAL is its
3843
   assembly-time value.  If we're generating a reloc for FIXP,
3844
   see whether the addend should be stored in-place or whether
3845
   it should be in an ELF r_addend field.  */
3846
 
3847
static void
3848
apply_full_field_fix (fixS *fixP, char *buf, bfd_vma val, int size)
3849
{
3850
  reloc_howto_type *howto;
3851
 
3852
  if (fixP->fx_addsy != NULL || fixP->fx_pcrel)
3853
    {
3854
      howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
3855
      if (howto && !howto->partial_inplace)
3856
        {
3857
          fixP->fx_addnumber = val;
3858
          return;
3859
        }
3860
    }
3861
  md_number_to_chars (buf, val, size);
3862
}
3863
 
3864
/* Apply a fixup to the object file.  */
3865
 
3866
void
3867
md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
3868
{
3869
  char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
3870
  int lowbyte = target_big_endian ? 1 : 0;
3871
  int highbyte = target_big_endian ? 0 : 1;
3872
  long val = (long) *valP;
3873
  long max, min;
3874
  int shift;
3875
 
3876
  /* A difference between two symbols, the second of which is in the
3877
     current section, is transformed in a PC-relative relocation to
3878
     the other symbol.  We have to adjust the relocation type here.  */
3879
  if (fixP->fx_pcrel)
3880
    {
3881
      switch (fixP->fx_r_type)
3882
        {
3883
        default:
3884
          break;
3885
 
3886
        case BFD_RELOC_32:
3887
          fixP->fx_r_type = BFD_RELOC_32_PCREL;
3888
          break;
3889
 
3890
          /* Currently, we only support 32-bit PCREL relocations.
3891
             We'd need a new reloc type to handle 16_PCREL, and
3892
             8_PCREL is already taken for R_SH_SWITCH8, which
3893
             apparently does something completely different than what
3894
             we need.  FIXME.  */
3895
        case BFD_RELOC_16:
3896
          bfd_set_error (bfd_error_bad_value);
3897
          return;
3898
 
3899
        case BFD_RELOC_8:
3900
          bfd_set_error (bfd_error_bad_value);
3901
          return;
3902
        }
3903
    }
3904
 
3905
  /* The function adjust_reloc_syms won't convert a reloc against a weak
3906
     symbol into a reloc against a section, but bfd_install_relocation
3907
     will screw up if the symbol is defined, so we have to adjust val here
3908
     to avoid the screw up later.
3909
 
3910
     For ordinary relocs, this does not happen for ELF, since for ELF,
3911
     bfd_install_relocation uses the "special function" field of the
3912
     howto, and does not execute the code that needs to be undone, as long
3913
     as the special function does not return bfd_reloc_continue.
3914
     It can happen for GOT- and PLT-type relocs the way they are
3915
     described in elf32-sh.c as they use bfd_elf_generic_reloc, but it
3916
     doesn't matter here since those relocs don't use VAL; see below.  */
3917
  if (OUTPUT_FLAVOR != bfd_target_elf_flavour
3918
      && fixP->fx_addsy != NULL
3919
      && S_IS_WEAK (fixP->fx_addsy))
3920
    val -= S_GET_VALUE  (fixP->fx_addsy);
3921
 
3922
  if (SWITCH_TABLE (fixP))
3923
    val -= S_GET_VALUE  (fixP->fx_subsy);
3924
 
3925
  max = min = 0;
3926
  shift = 0;
3927
  switch (fixP->fx_r_type)
3928
    {
3929
    case BFD_RELOC_SH_IMM3:
3930
      max = 0x7;
3931
      * buf = (* buf & 0xf8) | (val & 0x7);
3932
      break;
3933
    case BFD_RELOC_SH_IMM3U:
3934
      max = 0x7;
3935
      * buf = (* buf & 0x8f) | ((val & 0x7) << 4);
3936
      break;
3937
    case BFD_RELOC_SH_DISP12:
3938
      max = 0xfff;
3939
      buf[lowbyte] = val & 0xff;
3940
      buf[highbyte] |= (val >> 8) & 0x0f;
3941
      break;
3942
    case BFD_RELOC_SH_DISP12BY2:
3943
      max = 0xfff;
3944
      shift = 1;
3945
      buf[lowbyte] = (val >> 1) & 0xff;
3946
      buf[highbyte] |= (val >> 9) & 0x0f;
3947
      break;
3948
    case BFD_RELOC_SH_DISP12BY4:
3949
      max = 0xfff;
3950
      shift = 2;
3951
      buf[lowbyte] = (val >> 2) & 0xff;
3952
      buf[highbyte] |= (val >> 10) & 0x0f;
3953
      break;
3954
    case BFD_RELOC_SH_DISP12BY8:
3955
      max = 0xfff;
3956
      shift = 3;
3957
      buf[lowbyte] = (val >> 3) & 0xff;
3958
      buf[highbyte] |= (val >> 11) & 0x0f;
3959
      break;
3960
    case BFD_RELOC_SH_DISP20:
3961
      if (! target_big_endian)
3962
        abort();
3963
      max = 0x7ffff;
3964
      min = -0x80000;
3965
      buf[1] = (buf[1] & 0x0f) | ((val >> 12) & 0xf0);
3966
      buf[2] = (val >> 8) & 0xff;
3967
      buf[3] = val & 0xff;
3968
      break;
3969
    case BFD_RELOC_SH_DISP20BY8:
3970
      if (!target_big_endian)
3971
        abort();
3972
      max = 0x7ffff;
3973
      min = -0x80000;
3974
      shift = 8;
3975
      buf[1] = (buf[1] & 0x0f) | ((val >> 20) & 0xf0);
3976
      buf[2] = (val >> 16) & 0xff;
3977
      buf[3] = (val >> 8) & 0xff;
3978
      break;
3979
 
3980
    case BFD_RELOC_SH_IMM4:
3981
      max = 0xf;
3982
      *buf = (*buf & 0xf0) | (val & 0xf);
3983
      break;
3984
 
3985
    case BFD_RELOC_SH_IMM4BY2:
3986
      max = 0xf;
3987
      shift = 1;
3988
      *buf = (*buf & 0xf0) | ((val >> 1) & 0xf);
3989
      break;
3990
 
3991
    case BFD_RELOC_SH_IMM4BY4:
3992
      max = 0xf;
3993
      shift = 2;
3994
      *buf = (*buf & 0xf0) | ((val >> 2) & 0xf);
3995
      break;
3996
 
3997
    case BFD_RELOC_SH_IMM8BY2:
3998
      max = 0xff;
3999
      shift = 1;
4000
      *buf = val >> 1;
4001
      break;
4002
 
4003
    case BFD_RELOC_SH_IMM8BY4:
4004
      max = 0xff;
4005
      shift = 2;
4006
      *buf = val >> 2;
4007
      break;
4008
 
4009
    case BFD_RELOC_8:
4010
    case BFD_RELOC_SH_IMM8:
4011
      /* Sometimes the 8 bit value is sign extended (e.g., add) and
4012
         sometimes it is not (e.g., and).  We permit any 8 bit value.
4013
         Note that adding further restrictions may invalidate
4014
         reasonable looking assembly code, such as ``and -0x1,r0''.  */
4015
      max = 0xff;
4016
      min = -0xff;
4017
      *buf++ = val;
4018
      break;
4019
 
4020
    case BFD_RELOC_SH_PCRELIMM8BY4:
4021
      /* If we are dealing with a known destination ... */
4022
      if ((fixP->fx_addsy == NULL || S_IS_DEFINED (fixP->fx_addsy))
4023
          && (fixP->fx_subsy == NULL || S_IS_DEFINED (fixP->fx_addsy)))
4024
      {
4025
        /* Don't silently move the destination due to misalignment.
4026
           The absolute address is the fragment base plus the offset into
4027
           the fragment plus the pc relative offset to the label.  */
4028
        if ((fixP->fx_frag->fr_address + fixP->fx_where + val) & 3)
4029
          as_bad_where (fixP->fx_file, fixP->fx_line,
4030
                        _("offset to unaligned destination"));
4031
 
4032
        /* The displacement cannot be zero or backward even if aligned.
4033
           Allow -2 because val has already been adjusted somewhere.  */
4034
        if (val < -2)
4035
          as_bad_where (fixP->fx_file, fixP->fx_line, _("negative offset"));
4036
      }
4037
 
4038
      /* The lower two bits of the PC are cleared before the
4039
         displacement is added in.  We can assume that the destination
4040
         is on a 4 byte boundary.  If this instruction is also on a 4
4041
         byte boundary, then we want
4042
           (target - here) / 4
4043
         and target - here is a multiple of 4.
4044
         Otherwise, we are on a 2 byte boundary, and we want
4045
           (target - (here - 2)) / 4
4046
         and target - here is not a multiple of 4.  Computing
4047
           (target - (here - 2)) / 4 == (target - here + 2) / 4
4048
         works for both cases, since in the first case the addition of
4049
         2 will be removed by the division.  target - here is in the
4050
         variable val.  */
4051
      val = (val + 2) / 4;
4052
      if (val & ~0xff)
4053
        as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far"));
4054
      buf[lowbyte] = val;
4055
      break;
4056
 
4057
    case BFD_RELOC_SH_PCRELIMM8BY2:
4058
      val /= 2;
4059
      if (val & ~0xff)
4060
        as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far"));
4061
      buf[lowbyte] = val;
4062
      break;
4063
 
4064
    case BFD_RELOC_SH_PCDISP8BY2:
4065
      val /= 2;
4066
      if (val < -0x80 || val > 0x7f)
4067
        as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far"));
4068
      buf[lowbyte] = val;
4069
      break;
4070
 
4071
    case BFD_RELOC_SH_PCDISP12BY2:
4072
      val /= 2;
4073
      if (val < -0x800 || val > 0x7ff)
4074
        as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far"));
4075
      buf[lowbyte] = val & 0xff;
4076
      buf[highbyte] |= (val >> 8) & 0xf;
4077
      break;
4078
 
4079
    case BFD_RELOC_32:
4080
    case BFD_RELOC_32_PCREL:
4081
      apply_full_field_fix (fixP, buf, val, 4);
4082
      break;
4083
 
4084
    case BFD_RELOC_16:
4085
      apply_full_field_fix (fixP, buf, val, 2);
4086
      break;
4087
 
4088
    case BFD_RELOC_SH_USES:
4089
      /* Pass the value into sh_reloc().  */
4090
      fixP->fx_addnumber = val;
4091
      break;
4092
 
4093
    case BFD_RELOC_SH_COUNT:
4094
    case BFD_RELOC_SH_ALIGN:
4095
    case BFD_RELOC_SH_CODE:
4096
    case BFD_RELOC_SH_DATA:
4097
    case BFD_RELOC_SH_LABEL:
4098
      /* Nothing to do here.  */
4099
      break;
4100
 
4101
    case BFD_RELOC_SH_LOOP_START:
4102
    case BFD_RELOC_SH_LOOP_END:
4103
 
4104
    case BFD_RELOC_VTABLE_INHERIT:
4105
    case BFD_RELOC_VTABLE_ENTRY:
4106
      fixP->fx_done = 0;
4107
      return;
4108
 
4109
#ifdef OBJ_ELF
4110
    case BFD_RELOC_32_PLT_PCREL:
4111
      /* Make the jump instruction point to the address of the operand.  At
4112
         runtime we merely add the offset to the actual PLT entry.  */
4113
      * valP = 0xfffffffc;
4114
      val = fixP->fx_offset;
4115
      if (fixP->fx_subsy)
4116
        val -= S_GET_VALUE (fixP->fx_subsy);
4117
      apply_full_field_fix (fixP, buf, val, 4);
4118
      break;
4119
 
4120
    case BFD_RELOC_SH_GOTPC:
4121
      /* This is tough to explain.  We end up with this one if we have
4122
         operands that look like "_GLOBAL_OFFSET_TABLE_+[.-.L284]".
4123
         The goal here is to obtain the absolute address of the GOT,
4124
         and it is strongly preferable from a performance point of
4125
         view to avoid using a runtime relocation for this.  There are
4126
         cases where you have something like:
4127
 
4128
         .long  _GLOBAL_OFFSET_TABLE_+[.-.L66]
4129
 
4130
         and here no correction would be required.  Internally in the
4131
         assembler we treat operands of this form as not being pcrel
4132
         since the '.' is explicitly mentioned, and I wonder whether
4133
         it would simplify matters to do it this way.  Who knows.  In
4134
         earlier versions of the PIC patches, the pcrel_adjust field
4135
         was used to store the correction, but since the expression is
4136
         not pcrel, I felt it would be confusing to do it this way.  */
4137
      * valP -= 1;
4138
      apply_full_field_fix (fixP, buf, val, 4);
4139
      break;
4140
 
4141
    case BFD_RELOC_SH_TLS_GD_32:
4142
    case BFD_RELOC_SH_TLS_LD_32:
4143
    case BFD_RELOC_SH_TLS_IE_32:
4144
      S_SET_THREAD_LOCAL (fixP->fx_addsy);
4145
      /* Fallthrough */
4146
    case BFD_RELOC_32_GOT_PCREL:
4147
    case BFD_RELOC_SH_GOTPLT32:
4148
      * valP = 0; /* Fully resolved at runtime.  No addend.  */
4149
      apply_full_field_fix (fixP, buf, 0, 4);
4150
      break;
4151
 
4152
    case BFD_RELOC_SH_TLS_LDO_32:
4153
    case BFD_RELOC_SH_TLS_LE_32:
4154
      S_SET_THREAD_LOCAL (fixP->fx_addsy);
4155
      /* Fallthrough */
4156
    case BFD_RELOC_32_GOTOFF:
4157
      apply_full_field_fix (fixP, buf, val, 4);
4158
      break;
4159
#endif
4160
 
4161
    default:
4162
#ifdef HAVE_SH64
4163
      shmedia_md_apply_fix (fixP, valP);
4164
      return;
4165
#else
4166
      abort ();
4167
#endif
4168
    }
4169
 
4170
  if (shift != 0)
4171
    {
4172
      if ((val & ((1 << shift) - 1)) != 0)
4173
        as_bad_where (fixP->fx_file, fixP->fx_line, _("misaligned offset"));
4174
      if (val >= 0)
4175
        val >>= shift;
4176
      else
4177
        val = ((val >> shift)
4178
               | ((long) -1 & ~ ((long) -1 >> shift)));
4179
    }
4180
  if (max != 0 && (val < min || val > max))
4181
    as_bad_where (fixP->fx_file, fixP->fx_line, _("offset out of range"));
4182
  else if (max != 0)
4183
    /* Stop the generic code from trying to overlow check the value as well.
4184
       It may not have the correct value anyway, as we do not store val back
4185
       into *valP.  */
4186
    fixP->fx_no_overflow = 1;
4187
 
4188
  if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
4189
    fixP->fx_done = 1;
4190
}
4191
 
4192
/* Called just before address relaxation.  Return the length
4193
   by which a fragment must grow to reach it's destination.  */
4194
 
4195
int
4196
md_estimate_size_before_relax (fragS *fragP, segT segment_type)
4197
{
4198
  int what;
4199
 
4200
  switch (fragP->fr_subtype)
4201
    {
4202
    default:
4203
#ifdef HAVE_SH64
4204
      return shmedia_md_estimate_size_before_relax (fragP, segment_type);
4205
#else
4206
      abort ();
4207
#endif
4208
 
4209
 
4210
    case C (UNCOND_JUMP, UNDEF_DISP):
4211
      /* Used to be a branch to somewhere which was unknown.  */
4212
      if (!fragP->fr_symbol)
4213
        {
4214
          fragP->fr_subtype = C (UNCOND_JUMP, UNCOND12);
4215
        }
4216
      else if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
4217
        {
4218
          fragP->fr_subtype = C (UNCOND_JUMP, UNCOND12);
4219
        }
4220
      else
4221
        {
4222
          fragP->fr_subtype = C (UNCOND_JUMP, UNDEF_WORD_DISP);
4223
        }
4224
      break;
4225
 
4226
    case C (COND_JUMP, UNDEF_DISP):
4227
    case C (COND_JUMP_DELAY, UNDEF_DISP):
4228
      what = GET_WHAT (fragP->fr_subtype);
4229
      /* Used to be a branch to somewhere which was unknown.  */
4230
      if (fragP->fr_symbol
4231
          && S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
4232
        {
4233
          /* Got a symbol and it's defined in this segment, become byte
4234
             sized - maybe it will fix up.  */
4235
          fragP->fr_subtype = C (what, COND8);
4236
        }
4237
      else if (fragP->fr_symbol)
4238
        {
4239
          /* Its got a segment, but its not ours, so it will always be long.  */
4240
          fragP->fr_subtype = C (what, UNDEF_WORD_DISP);
4241
        }
4242
      else
4243
        {
4244
          /* We know the abs value.  */
4245
          fragP->fr_subtype = C (what, COND8);
4246
        }
4247
      break;
4248
 
4249
    case C (UNCOND_JUMP, UNCOND12):
4250
    case C (UNCOND_JUMP, UNCOND32):
4251
    case C (UNCOND_JUMP, UNDEF_WORD_DISP):
4252
    case C (COND_JUMP, COND8):
4253
    case C (COND_JUMP, COND12):
4254
    case C (COND_JUMP, COND32):
4255
    case C (COND_JUMP, UNDEF_WORD_DISP):
4256
    case C (COND_JUMP_DELAY, COND8):
4257
    case C (COND_JUMP_DELAY, COND12):
4258
    case C (COND_JUMP_DELAY, COND32):
4259
    case C (COND_JUMP_DELAY, UNDEF_WORD_DISP):
4260
      /* When relaxing a section for the second time, we don't need to
4261
         do anything besides return the current size.  */
4262
      break;
4263
    }
4264
 
4265
  fragP->fr_var = md_relax_table[fragP->fr_subtype].rlx_length;
4266
  return fragP->fr_var;
4267
}
4268
 
4269
/* Put number into target byte order.  */
4270
 
4271
void
4272
md_number_to_chars (char *ptr, valueT use, int nbytes)
4273
{
4274
#ifdef HAVE_SH64
4275
  /* We might need to set the contents type to data.  */
4276
  sh64_flag_output ();
4277
#endif
4278
 
4279
  if (! target_big_endian)
4280
    number_to_chars_littleendian (ptr, use, nbytes);
4281
  else
4282
    number_to_chars_bigendian (ptr, use, nbytes);
4283
}
4284
 
4285
/* This version is used in obj-coff.c eg. for the sh-hms target.  */
4286
 
4287
long
4288
md_pcrel_from (fixS *fixP)
4289
{
4290
  return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address + 2;
4291
}
4292
 
4293
long
4294
md_pcrel_from_section (fixS *fixP, segT sec)
4295
{
4296
  if (! sh_local_pcrel (fixP)
4297
      && fixP->fx_addsy != (symbolS *) NULL
4298
      && (generic_force_reloc (fixP)
4299
          || S_GET_SEGMENT (fixP->fx_addsy) != sec))
4300
    {
4301
      /* The symbol is undefined (or is defined but not in this section,
4302
         or we're not sure about it being the final definition).  Let the
4303
         linker figure it out.  We need to adjust the subtraction of a
4304
         symbol to the position of the relocated data, though.  */
4305
      return fixP->fx_subsy ? fixP->fx_where + fixP->fx_frag->fr_address : 0;
4306
    }
4307
 
4308
  return md_pcrel_from (fixP);
4309
}
4310
 
4311
/* Create a reloc.  */
4312
 
4313
arelent *
4314
tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
4315
{
4316
  arelent *rel;
4317
  bfd_reloc_code_real_type r_type;
4318
 
4319
  rel = (arelent *) xmalloc (sizeof (arelent));
4320
  rel->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
4321
  *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
4322
  rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
4323
 
4324
  r_type = fixp->fx_r_type;
4325
 
4326
  if (SWITCH_TABLE (fixp))
4327
    {
4328
      *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_subsy);
4329
      rel->addend = 0;
4330
      if (r_type == BFD_RELOC_16)
4331
        r_type = BFD_RELOC_SH_SWITCH16;
4332
      else if (r_type == BFD_RELOC_8)
4333
        r_type = BFD_RELOC_8_PCREL;
4334
      else if (r_type == BFD_RELOC_32)
4335
        r_type = BFD_RELOC_SH_SWITCH32;
4336
      else
4337
        abort ();
4338
    }
4339
  else if (r_type == BFD_RELOC_SH_USES)
4340
    rel->addend = fixp->fx_addnumber;
4341
  else if (r_type == BFD_RELOC_SH_COUNT)
4342
    rel->addend = fixp->fx_offset;
4343
  else if (r_type == BFD_RELOC_SH_ALIGN)
4344
    rel->addend = fixp->fx_offset;
4345
  else if (r_type == BFD_RELOC_VTABLE_INHERIT
4346
           || r_type == BFD_RELOC_VTABLE_ENTRY)
4347
    rel->addend = fixp->fx_offset;
4348
  else if (r_type == BFD_RELOC_SH_LOOP_START
4349
           || r_type == BFD_RELOC_SH_LOOP_END)
4350
    rel->addend = fixp->fx_offset;
4351
  else if (r_type == BFD_RELOC_SH_LABEL && fixp->fx_pcrel)
4352
    {
4353
      rel->addend = 0;
4354
      rel->address = rel->addend = fixp->fx_offset;
4355
    }
4356
#ifdef HAVE_SH64
4357
  else if (shmedia_init_reloc (rel, fixp))
4358
    ;
4359
#endif
4360
  else
4361
    rel->addend = fixp->fx_addnumber;
4362
 
4363
  rel->howto = bfd_reloc_type_lookup (stdoutput, r_type);
4364
 
4365
  if (rel->howto == NULL)
4366
    {
4367
      as_bad_where (fixp->fx_file, fixp->fx_line,
4368
                    _("Cannot represent relocation type %s"),
4369
                    bfd_get_reloc_code_name (r_type));
4370
      /* Set howto to a garbage value so that we can keep going.  */
4371
      rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
4372
      assert (rel->howto != NULL);
4373
    }
4374
#ifdef OBJ_ELF
4375
  else if (rel->howto->type == R_SH_IND12W)
4376
    rel->addend += fixp->fx_offset - 4;
4377
#endif
4378
 
4379
  return rel;
4380
}
4381
 
4382
#ifdef OBJ_ELF
4383
inline static char *
4384
sh_end_of_match (char *cont, char *what)
4385
{
4386
  int len = strlen (what);
4387
 
4388
  if (strncasecmp (cont, what, strlen (what)) == 0
4389
      && ! is_part_of_name (cont[len]))
4390
    return cont + len;
4391
 
4392
  return NULL;
4393
}
4394
 
4395
int
4396
sh_parse_name (char const *name,
4397
               expressionS *exprP,
4398
               enum expr_mode mode,
4399
               char *nextcharP)
4400
{
4401
  char *next = input_line_pointer;
4402
  char *next_end;
4403
  int reloc_type;
4404
  segT segment;
4405
 
4406
  exprP->X_op_symbol = NULL;
4407
 
4408
  if (strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0)
4409
    {
4410
      if (! GOT_symbol)
4411
        GOT_symbol = symbol_find_or_make (name);
4412
 
4413
      exprP->X_add_symbol = GOT_symbol;
4414
    no_suffix:
4415
      /* If we have an absolute symbol or a reg, then we know its
4416
         value now.  */
4417
      segment = S_GET_SEGMENT (exprP->X_add_symbol);
4418
      if (mode != expr_defer && segment == absolute_section)
4419
        {
4420
          exprP->X_op = O_constant;
4421
          exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol);
4422
          exprP->X_add_symbol = NULL;
4423
        }
4424
      else if (mode != expr_defer && segment == reg_section)
4425
        {
4426
          exprP->X_op = O_register;
4427
          exprP->X_add_number = S_GET_VALUE (exprP->X_add_symbol);
4428
          exprP->X_add_symbol = NULL;
4429
        }
4430
      else
4431
        {
4432
          exprP->X_op = O_symbol;
4433
          exprP->X_add_number = 0;
4434
        }
4435
 
4436
      return 1;
4437
    }
4438
 
4439
  exprP->X_add_symbol = symbol_find_or_make (name);
4440
 
4441
  if (*nextcharP != '@')
4442
    goto no_suffix;
4443
  else if ((next_end = sh_end_of_match (next + 1, "GOTOFF")))
4444
    reloc_type = BFD_RELOC_32_GOTOFF;
4445
  else if ((next_end = sh_end_of_match (next + 1, "GOTPLT")))
4446
    reloc_type = BFD_RELOC_SH_GOTPLT32;
4447
  else if ((next_end = sh_end_of_match (next + 1, "GOT")))
4448
    reloc_type = BFD_RELOC_32_GOT_PCREL;
4449
  else if ((next_end = sh_end_of_match (next + 1, "PLT")))
4450
    reloc_type = BFD_RELOC_32_PLT_PCREL;
4451
  else if ((next_end = sh_end_of_match (next + 1, "TLSGD")))
4452
    reloc_type = BFD_RELOC_SH_TLS_GD_32;
4453
  else if ((next_end = sh_end_of_match (next + 1, "TLSLDM")))
4454
    reloc_type = BFD_RELOC_SH_TLS_LD_32;
4455
  else if ((next_end = sh_end_of_match (next + 1, "GOTTPOFF")))
4456
    reloc_type = BFD_RELOC_SH_TLS_IE_32;
4457
  else if ((next_end = sh_end_of_match (next + 1, "TPOFF")))
4458
    reloc_type = BFD_RELOC_SH_TLS_LE_32;
4459
  else if ((next_end = sh_end_of_match (next + 1, "DTPOFF")))
4460
    reloc_type = BFD_RELOC_SH_TLS_LDO_32;
4461
  else
4462
    goto no_suffix;
4463
 
4464
  *input_line_pointer = *nextcharP;
4465
  input_line_pointer = next_end;
4466
  *nextcharP = *input_line_pointer;
4467
  *input_line_pointer = '\0';
4468
 
4469
  exprP->X_op = O_PIC_reloc;
4470
  exprP->X_add_number = 0;
4471
  exprP->X_md = reloc_type;
4472
 
4473
  return 1;
4474
}
4475
 
4476
void
4477
sh_cfi_frame_initial_instructions (void)
4478
{
4479
  cfi_add_CFA_def_cfa (15, 0);
4480
}
4481
 
4482
int
4483
sh_regname_to_dw2regnum (char *regname)
4484
{
4485
  unsigned int regnum = -1;
4486
  unsigned int i;
4487
  const char *p;
4488
  char *q;
4489
  static struct { char *name; int dw2regnum; } regnames[] =
4490
    {
4491
      { "pr", 17 }, { "t", 18 }, { "gbr", 19 }, { "mach", 20 },
4492
      { "macl", 21 }, { "fpul", 23 }
4493
    };
4494
 
4495
  for (i = 0; i < ARRAY_SIZE (regnames); ++i)
4496
    if (strcmp (regnames[i].name, regname) == 0)
4497
      return regnames[i].dw2regnum;
4498
 
4499
  if (regname[0] == 'r')
4500
    {
4501
      p = regname + 1;
4502
      regnum = strtoul (p, &q, 10);
4503
      if (p == q || *q || regnum >= 16)
4504
        return -1;
4505
    }
4506
  else if (regname[0] == 'f' && regname[1] == 'r')
4507
    {
4508
      p = regname + 2;
4509
      regnum = strtoul (p, &q, 10);
4510
      if (p == q || *q || regnum >= 16)
4511
        return -1;
4512
      regnum += 25;
4513
    }
4514
  else if (regname[0] == 'x' && regname[1] == 'd')
4515
    {
4516
      p = regname + 2;
4517
      regnum = strtoul (p, &q, 10);
4518
      if (p == q || *q || regnum >= 8)
4519
        return -1;
4520
      regnum += 87;
4521
    }
4522
  return regnum;
4523
}
4524
#endif /* OBJ_ELF */

powered by: WebSVN 2.1.0

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