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