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