fixed another comment formatting problem.
[external/binutils.git] / gas / config / tc-sh.c
1 /* tc-sh.c -- Assemble code for the Hitachi Super-H
2    Copyright (C) 1993, 94, 95, 96, 97, 98, 99, 2000 Free Software Foundation.
3
4    This file is part of GAS, the GNU Assembler.
5
6    GAS is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2, or (at your option)
9    any later version.
10
11    GAS is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with GAS; see the file COPYING.  If not, write to
18    the Free Software Foundation, 59 Temple Place - Suite 330,
19    Boston, MA 02111-1307, USA.  */
20
21 /* Written By Steve Chamberlain <sac@cygnus.com>  */
22
23 #include <stdio.h>
24 #include "as.h"
25 #include "bfd.h"
26 #include "subsegs.h"
27 #define DEFINE_TABLE
28 #include "opcodes/sh-opc.h"
29 #include <ctype.h>
30 #include "struc-symbol.h"
31
32 #ifdef OBJ_ELF
33 #include "elf/sh.h"
34 #endif
35
36 const char comment_chars[] = "!";
37 const char line_separator_chars[] = ";";
38 const char line_comment_chars[] = "!#";
39
40 static void s_uses PARAMS ((int));
41
42 static void sh_count_relocs PARAMS ((bfd *, segT, PTR));
43 static void sh_frob_section PARAMS ((bfd *, segT, PTR));
44
45 void cons ();
46 void s_align_bytes ();
47 static void s_uacons PARAMS ((int));
48 static sh_opcode_info *find_cooked_opcode PARAMS ((char **));
49 static void assemble_ppi PARAMS ((char *, sh_opcode_info *));
50
51 int shl = 0;
52
53 static void
54 little (ignore)
55      int ignore ATTRIBUTE_UNUSED;
56 {
57   shl = 1;
58   target_big_endian = 0;
59 }
60
61 /* This table describes all the machine specific pseudo-ops the assembler
62    has to support.  The fields are:
63    pseudo-op name without dot
64    function to call to execute this pseudo-op
65    Integer arg to pass to the function.  */
66
67 const pseudo_typeS md_pseudo_table[] =
68 {
69   {"int", cons, 4},
70   {"word", cons, 2},
71   {"form", listing_psize, 0},
72   {"little", little, 0},
73   {"heading", listing_title, 0},
74   {"import", s_ignore, 0},
75   {"page", listing_eject, 0},
76   {"program", s_ignore, 0},
77   {"uses", s_uses, 0},
78   {"uaword", s_uacons, 2},
79   {"ualong", s_uacons, 4},
80   {0, 0, 0}
81 };
82
83 /*int md_reloc_size; */
84
85 int sh_relax;           /* set if -relax seen */
86
87 /* Whether -small was seen.  */
88
89 int sh_small;
90
91 /* Whether -dsp was seen.  */
92
93 static int sh_dsp;
94
95 /* The bit mask of architectures that could
96    accomodate the insns seen so far.  */
97 static int valid_arch;
98
99 const char EXP_CHARS[] = "eE";
100
101 /* Chars that mean this number is a floating point constant.  */
102 /* As in 0f12.456 */
103 /* or    0d1.2345e12 */
104 const char FLT_CHARS[] = "rRsSfFdDxXpP";
105
106 #define C(a,b) ENCODE_RELAX(a,b)
107
108 #define JREG 14                 /* Register used as a temp when relaxing */
109 #define ENCODE_RELAX(what,length) (((what) << 4) + (length))
110 #define GET_WHAT(x) ((x>>4))
111
112 /* These are the three types of relaxable instrction.  */
113 #define COND_JUMP 1
114 #define COND_JUMP_DELAY 2
115 #define UNCOND_JUMP  3
116 #define END 4
117
118 #define UNDEF_DISP 0
119 #define COND8  1
120 #define COND12 2
121 #define COND32 3
122 #define UNCOND12 1
123 #define UNCOND32 2
124 #define UNDEF_WORD_DISP 4
125
126 #define UNCOND12 1
127 #define UNCOND32 2
128
129 /* Branch displacements are from the address of the branch plus
130    four, thus all minimum and maximum values have 4 added to them.  */
131 #define COND8_F 258
132 #define COND8_M -252
133 #define COND8_LENGTH 2
134
135 /* There is one extra instruction before the branch, so we must add
136    two more bytes to account for it.  */
137 #define COND12_F 4100
138 #define COND12_M -4090
139 #define COND12_LENGTH 6
140
141 #define COND12_DELAY_LENGTH 4
142
143 /* ??? The minimum and maximum values are wrong, but this does not matter
144    since this relocation type is not supported yet.  */
145 #define COND32_F (1<<30)
146 #define COND32_M -(1<<30)
147 #define COND32_LENGTH 14
148
149 #define UNCOND12_F 4098
150 #define UNCOND12_M -4092
151 #define UNCOND12_LENGTH 2
152
153 /* ??? The minimum and maximum values are wrong, but this does not matter
154    since this relocation type is not supported yet.  */
155 #define UNCOND32_F (1<<30)
156 #define UNCOND32_M -(1<<30)
157 #define UNCOND32_LENGTH 14
158
159 #define EMPTY { 0, 0, 0, 0 }
160
161 const relax_typeS md_relax_table[C (END, 0)] = {
162   EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
163   EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
164
165   EMPTY,
166   /* C (COND_JUMP, COND8) */
167   { COND8_F, COND8_M, COND8_LENGTH, C (COND_JUMP, COND12) },
168   /* C (COND_JUMP, COND12) */
169   { COND12_F, COND12_M, COND12_LENGTH, C (COND_JUMP, COND32), },
170   /* C (COND_JUMP, COND32) */
171   { COND32_F, COND32_M, COND32_LENGTH, 0, },
172   EMPTY, EMPTY, EMPTY, EMPTY,
173   EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
174
175   EMPTY,
176   /* C (COND_JUMP_DELAY, COND8) */
177   { COND8_F, COND8_M, COND8_LENGTH, C (COND_JUMP_DELAY, COND12) },
178   /* C (COND_JUMP_DELAY, COND12) */
179   { COND12_F, COND12_M, COND12_DELAY_LENGTH, C (COND_JUMP_DELAY, COND32), },
180   /* C (COND_JUMP_DELAY, COND32) */
181   { COND32_F, COND32_M, COND32_LENGTH, 0, },
182   EMPTY, EMPTY, EMPTY, EMPTY,
183   EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
184
185   EMPTY,
186   /* C (UNCOND_JUMP, UNCOND12) */
187   { UNCOND12_F, UNCOND12_M, UNCOND12_LENGTH, C (UNCOND_JUMP, UNCOND32), },
188   /* C (UNCOND_JUMP, UNCOND32) */
189   { UNCOND32_F, UNCOND32_M, UNCOND32_LENGTH, 0, },
190   EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
191   EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
192 };
193
194 #undef EMPTY
195
196 static struct hash_control *opcode_hash_control;        /* Opcode mnemonics */
197
198 /* This function is called once, at assembler startup time.  This should
199    set up all the tables, etc that the MD part of the assembler needs.  */
200
201 void
202 md_begin ()
203 {
204   sh_opcode_info *opcode;
205   char *prev_name = "";
206   int target_arch;
207
208 #ifdef TE_PE
209   /* The WinCE OS only supports little endian executables.  */
210   target_big_endian = 0;
211 #else
212   if (! shl)
213     target_big_endian = 1;
214 #endif
215
216   target_arch = arch_sh1_up & ~(sh_dsp ? arch_sh3e_up : arch_sh_dsp_up);
217   valid_arch = target_arch;
218
219   opcode_hash_control = hash_new ();
220
221   /* Insert unique names into hash table.  */
222   for (opcode = sh_table; opcode->name; opcode++)
223     {
224       if (strcmp (prev_name, opcode->name))
225         {
226           if (! (opcode->arch & target_arch))
227             continue;
228           prev_name = opcode->name;
229           hash_insert (opcode_hash_control, opcode->name, (char *) opcode);
230         }
231       else
232         {
233           /* Make all the opcodes with the same name point to the same
234              string.  */
235           opcode->name = prev_name;
236         }
237     }
238 }
239
240 static int reg_m;
241 static int reg_n;
242 static int reg_x, reg_y;
243 static int reg_efg;
244 static int reg_b;
245
246 typedef struct
247   {
248     sh_arg_type type;
249     int reg;
250     expressionS immediate;
251   }
252 sh_operand_info;
253
254 #define IDENT_CHAR(c) (isalnum (c) || (c) == '_')
255
256 /* Try to parse a reg name.  Return the number of chars consumed.  */
257
258 static int
259 parse_reg (src, mode, reg)
260      char *src;
261      int *mode;
262      int *reg;
263 {
264   /* We use ! IDENT_CHAR for the next character after the register name, to
265      make sure that we won't accidentally recognize a symbol name such as
266      'sram' or sr_ram as being a reference to the register 'sr'.  */
267
268   if (src[0] == 'r')
269     {
270       if (src[1] == '1')
271         {
272           if (src[2] >= '0' && src[2] <= '5'
273               && ! IDENT_CHAR ((unsigned char) src[3]))
274             {
275               *mode = A_REG_N;
276               *reg = 10 + src[2] - '0';
277               return 3;
278             }
279         }
280       if (src[1] >= '0' && src[1] <= '9'
281           && ! IDENT_CHAR ((unsigned char) src[2]))
282         {
283           *mode = A_REG_N;
284           *reg = (src[1] - '0');
285           return 2;
286         }
287       if (src[1] >= '0' && src[1] <= '7' && strncmp (&src[2], "_bank", 5) == 0
288           && ! IDENT_CHAR ((unsigned char) src[7]))
289         {
290           *mode = A_REG_B;
291           *reg  = (src[1] - '0');
292           return 7;
293         }
294
295       if (src[1] == 'e' && ! IDENT_CHAR ((unsigned char) src[2]))
296         {
297           *mode = A_RE;
298           return 2;
299         }
300       if (src[1] == 's' && ! IDENT_CHAR ((unsigned char) src[2]))
301         {
302           *mode = A_RS;
303           return 2;
304         }
305     }
306
307   if (src[0] == 'a')
308     {
309       if (src[1] == '0')
310         {
311           if (! IDENT_CHAR ((unsigned char) src[2]))
312             {
313               *mode = DSP_REG_N;
314               *reg = A_A0_NUM;
315               return 2;
316             }
317           if (src[2] == 'g' && ! IDENT_CHAR ((unsigned char) src[3]))
318             {
319               *mode = DSP_REG_N;
320               *reg = A_A0G_NUM;
321               return 3;
322             }
323         }
324       if (src[1] == '1')
325         {
326           if (! IDENT_CHAR ((unsigned char) src[2]))
327             {
328               *mode = DSP_REG_N;
329               *reg = A_A1_NUM;
330               return 2;
331             }
332           if (src[2] == 'g' && ! IDENT_CHAR ((unsigned char) src[3]))
333             {
334               *mode = DSP_REG_N;
335               *reg = A_A1G_NUM;
336               return 3;
337             }
338         }
339
340       if (src[1] == 'x' && src[2] >= '0' && src[2] <= '1'
341           && ! IDENT_CHAR ((unsigned char) src[3]))
342         {
343           *mode = A_REG_N;
344           *reg = 4 + (src[1] - '0');
345           return 3;
346         }
347       if (src[1] == 'y' && src[2] >= '0' && src[2] <= '1'
348           && ! IDENT_CHAR ((unsigned char) src[3]))
349         {
350           *mode = A_REG_N;
351           *reg = 6 + (src[1] - '0');
352           return 3;
353         }
354       if (src[1] == 's' && src[2] >= '0' && src[2] <= '3'
355           && ! IDENT_CHAR ((unsigned char) src[3]))
356         {
357           int n = src[1] - '0';
358
359           *mode = A_REG_N;
360           *reg = n | ((~n & 2) << 1);
361           return 3;
362         }
363     }
364
365   if (src[0] == 'i' && src[1] && ! IDENT_CHAR ((unsigned char) src[3]))
366     {
367       if (src[1] == 's')
368         {
369           *mode = A_REG_N;
370           *reg = 8;
371           return 2;
372         }
373       if (src[1] == 'x')
374         {
375           *mode = A_REG_N;
376           *reg = 8;
377           return 2;
378         }
379       if (src[1] == 'y')
380         {
381           *mode = A_REG_N;
382           *reg = 9;
383           return 2;
384         }
385     }
386
387   if (src[0] == 'x' && src[1] >= '0' && src[1] <= '1'
388       && ! IDENT_CHAR ((unsigned char) src[2]))
389     {
390       *mode = DSP_REG_N;
391       *reg = A_X0_NUM + src[1] - '0';
392       return 2;
393     }
394
395   if (src[0] == 'y' && src[1] >= '0' && src[1] <= '1'
396       && ! IDENT_CHAR ((unsigned char) src[2]))
397     {
398       *mode = DSP_REG_N;
399       *reg = A_Y0_NUM + src[1] - '0';
400       return 2;
401     }
402
403   if (src[0] == 'm' && src[1] >= '0' && src[1] <= '1'
404       && ! IDENT_CHAR ((unsigned char) src[2]))
405     {
406       *mode = DSP_REG_N;
407       *reg = src[1] == '0' ? A_M0_NUM : A_M1_NUM;
408       return 2;
409     }
410
411   if (src[0] == 's'
412       && src[1] == 's'
413       && src[2] == 'r' && ! IDENT_CHAR ((unsigned char) src[3]))
414     {
415       *mode = A_SSR;
416       return 3;
417     }
418
419   if (src[0] == 's' && src[1] == 'p' && src[2] == 'c'
420       && ! IDENT_CHAR ((unsigned char) src[3]))
421     {
422       *mode = A_SPC;
423       return 3;
424     }
425
426   if (src[0] == 's' && src[1] == 'g' && src[2] == 'r'
427       && ! IDENT_CHAR ((unsigned char) src[3]))
428     {
429       *mode = A_SGR;
430       return 3;
431     }
432
433   if (src[0] == 'd' && src[1] == 's' && src[2] == 'r'
434       && ! IDENT_CHAR ((unsigned char) src[3]))
435     {
436       *mode = A_DSR;
437       return 3;
438     }
439
440   if (src[0] == 'd' && src[1] == 'b' && src[2] == 'r'
441       && ! IDENT_CHAR ((unsigned char) src[3]))
442     {
443       *mode = A_DBR;
444       return 3;
445     }
446
447   if (src[0] == 's' && src[1] == 'r' && ! IDENT_CHAR ((unsigned char) src[2]))
448     {
449       *mode = A_SR;
450       return 2;
451     }
452
453   if (src[0] == 's' && src[1] == 'p' && ! IDENT_CHAR ((unsigned char) src[2]))
454     {
455       *mode = A_REG_N;
456       *reg = 15;
457       return 2;
458     }
459
460   if (src[0] == 'p' && src[1] == 'r' && ! IDENT_CHAR ((unsigned char) src[2]))
461     {
462       *mode = A_PR;
463       return 2;
464     }
465   if (src[0] == 'p' && src[1] == 'c' && ! IDENT_CHAR ((unsigned char) src[2]))
466     {
467       /* Don't use A_DISP_PC here - that would accept stuff like 'mova pc,r0'
468          and use an uninitialized immediate.  */
469       *mode = A_PC;
470       return 2;
471     }
472   if (src[0] == 'g' && src[1] == 'b' && src[2] == 'r'
473       && ! IDENT_CHAR ((unsigned char) src[3]))
474     {
475       *mode = A_GBR;
476       return 3;
477     }
478   if (src[0] == 'v' && src[1] == 'b' && src[2] == 'r'
479       && ! IDENT_CHAR ((unsigned char) src[3]))
480     {
481       *mode = A_VBR;
482       return 3;
483     }
484
485   if (src[0] == 'm' && src[1] == 'a' && src[2] == 'c'
486       && ! IDENT_CHAR ((unsigned char) src[4]))
487     {
488       if (src[3] == 'l')
489         {
490           *mode = A_MACL;
491           return 4;
492         }
493       if (src[3] == 'h')
494         {
495           *mode = A_MACH;
496           return 4;
497         }
498     }
499   if (src[0] == 'm' && src[1] == 'o' && src[2] == 'd'
500       && ! IDENT_CHAR ((unsigned char) src[4]))
501     {
502       *mode = A_MOD;
503       return 3;
504     }
505   if (src[0] == 'f' && src[1] == 'r')
506     {
507       if (src[2] == '1')
508         {
509           if (src[3] >= '0' && src[3] <= '5'
510               && ! IDENT_CHAR ((unsigned char) src[4]))
511             {
512               *mode = F_REG_N;
513               *reg = 10 + src[3] - '0';
514               return 4;
515             }
516         }
517       if (src[2] >= '0' && src[2] <= '9'
518           && ! IDENT_CHAR ((unsigned char) src[3]))
519         {
520           *mode = F_REG_N;
521           *reg = (src[2] - '0');
522           return 3;
523         }
524     }
525   if (src[0] == 'd' && src[1] == 'r')
526     {
527       if (src[2] == '1')
528         {
529           if (src[3] >= '0' && src[3] <= '4' && ! ((src[3] - '0') & 1)
530               && ! IDENT_CHAR ((unsigned char) src[4]))
531             {
532               *mode = D_REG_N;
533               *reg = 10 + src[3] - '0';
534               return 4;
535             }
536         }
537       if (src[2] >= '0' && src[2] <= '8' && ! ((src[2] - '0') & 1)
538           && ! IDENT_CHAR ((unsigned char) src[3]))
539         {
540           *mode = D_REG_N;
541           *reg = (src[2] - '0');
542           return 3;
543         }
544     }
545   if (src[0] == 'x' && src[1] == 'd')
546     {
547       if (src[2] == '1')
548         {
549           if (src[3] >= '0' && src[3] <= '4' && ! ((src[3] - '0') & 1)
550               && ! IDENT_CHAR ((unsigned char) src[4]))
551             {
552               *mode = X_REG_N;
553               *reg = 11 + src[3] - '0';
554               return 4;
555             }
556         }
557       if (src[2] >= '0' && src[2] <= '8' && ! ((src[2] - '0') & 1)
558           && ! IDENT_CHAR ((unsigned char) src[3]))
559         {
560           *mode = X_REG_N;
561           *reg = (src[2] - '0') + 1;
562           return 3;
563         }
564     }
565   if (src[0] == 'f' && src[1] == 'v')
566     {
567       if (src[2] == '1'&& src[3] == '2' && ! IDENT_CHAR ((unsigned char) src[4]))
568         {
569           *mode = V_REG_N;
570           *reg = 12;
571           return 4;
572         }
573       if ((src[2] == '0' || src[2] == '4' || src[2] == '8')
574           && ! IDENT_CHAR ((unsigned char) src[3]))
575         {
576           *mode = V_REG_N;
577           *reg = (src[2] - '0');
578           return 3;
579         }
580     }
581   if (src[0] == 'f' && src[1] == 'p' && src[2] == 'u' && src[3] == 'l'
582       && ! IDENT_CHAR ((unsigned char) src[4]))
583     {
584       *mode = FPUL_N;
585       return 4;
586     }
587
588   if (src[0] == 'f' && src[1] == 'p' && src[2] == 's' && src[3] == 'c'
589       && src[4] == 'r' && ! IDENT_CHAR ((unsigned char) src[5]))
590     {
591       *mode = FPSCR_N;
592       return 5;
593     }
594
595   if (src[0] == 'x' && src[1] == 'm' && src[2] == 't' && src[3] == 'r'
596       && src[4] == 'x' && ! IDENT_CHAR ((unsigned char) src[5]))
597     {
598       *mode = XMTRX_M4;
599       return 5;
600     }
601
602   return 0;
603 }
604
605 static symbolS *dot()
606 {
607   const char *fake;
608
609   /* JF: '.' is pseudo symbol with value of current location
610      in current segment.  */
611   fake = FAKE_LABEL_NAME;
612   return  symbol_new (fake,
613                       now_seg,
614                       (valueT) frag_now_fix (),
615                       frag_now);
616
617 }
618
619
620 static
621 char *
622 parse_exp (s, op)
623      char *s;
624      sh_operand_info *op;
625 {
626   char *save;
627   char *new;
628
629   save = input_line_pointer;
630   input_line_pointer = s;
631   expression (&op->immediate);
632   if (op->immediate.X_op == O_absent)
633     as_bad (_("missing operand"));
634   new = input_line_pointer;
635   input_line_pointer = save;
636   return new;
637 }
638
639
640 /* The many forms of operand:
641
642    Rn                   Register direct
643    @Rn                  Register indirect
644    @Rn+                 Autoincrement
645    @-Rn                 Autodecrement
646    @(disp:4,Rn)
647    @(disp:8,GBR)
648    @(disp:8,PC)
649
650    @(R0,Rn)
651    @(R0,GBR)
652
653    disp:8
654    disp:12
655    #imm8
656    pr, gbr, vbr, macl, mach
657
658  */
659
660 static
661 char *
662 parse_at (src, op)
663      char *src;
664      sh_operand_info *op;
665 {
666   int len;
667   int mode;
668   src++;
669   if (src[0] == '-')
670     {
671       /* Must be predecrement.  */
672       src++;
673
674       len = parse_reg (src, &mode, &(op->reg));
675       if (mode != A_REG_N)
676         as_bad (_("illegal register after @-"));
677
678       op->type = A_DEC_N;
679       src += len;
680     }
681   else if (src[0] == '(')
682     {
683       /* Could be @(disp, rn), @(disp, gbr), @(disp, pc),  @(r0, gbr) or
684          @(r0, rn) */
685       src++;
686       len = parse_reg (src, &mode, &(op->reg));
687       if (len && mode == A_REG_N)
688         {
689           src += len;
690           if (op->reg != 0)
691             {
692               as_bad (_("must be @(r0,...)"));
693             }
694           if (src[0] == ',')
695             src++;
696           /* Now can be rn or gbr */
697           len = parse_reg (src, &mode, &(op->reg));
698           if (mode == A_GBR)
699             {
700               op->type = A_R0_GBR;
701             }
702           else if (mode == A_REG_N)
703             {
704               op->type = A_IND_R0_REG_N;
705             }
706           else
707             {
708               as_bad (_("syntax error in @(r0,...)"));
709             }
710         }
711       else
712         {
713           /* Must be an @(disp,.. thing) */
714           src = parse_exp (src, op);
715           if (src[0] == ',')
716             src++;
717           /* Now can be rn, gbr or pc */
718           len = parse_reg (src, &mode, &op->reg);
719           if (len)
720             {
721               if (mode == A_REG_N)
722                 {
723                   op->type = A_DISP_REG_N;
724                 }
725               else if (mode == A_GBR)
726                 {
727                   op->type = A_DISP_GBR;
728                 }
729               else if (mode == A_PC)
730                 {
731                   /* Turn a plain @(4,pc) into @(.+4,pc) */
732                   if (op->immediate.X_op == O_constant) { 
733                     op->immediate.X_add_symbol = dot();
734                     op->immediate.X_op = O_symbol;
735                   }
736                   op->type = A_DISP_PC;
737                 }
738               else
739                 {
740                   as_bad (_("syntax error in @(disp,[Rn, gbr, pc])"));
741                 }
742             }
743           else
744             {
745               as_bad (_("syntax error in @(disp,[Rn, gbr, pc])"));
746             }
747         }
748       src += len;
749       if (src[0] != ')')
750         as_bad (_("expecting )"));
751       else
752         src++;
753     }
754   else
755     {
756       src += parse_reg (src, &mode, &(op->reg));
757       if (mode != A_REG_N)
758         {
759           as_bad (_("illegal register after @"));
760         }
761       if (src[0] == '+')
762         {
763           src++;
764           if ((src[0] == 'r' && src[1] == '8')
765               || (src[0] == 'i' && (src[1] == 'x' || src[1] == 's')))
766             {
767               src += 2;
768               op->type = A_PMOD_N;
769             }
770           if ((src[0] == 'r' && src[1] == '9')
771               || (src[0] == 'i' && src[1] == 'y'))
772             {
773               src += 2;
774               op->type = A_PMODY_N;
775             }
776           else
777             op->type = A_INC_N;
778         }
779       else
780         {
781           op->type = A_IND_N;
782         }
783     }
784   return src;
785 }
786
787 static void
788 get_operand (ptr, op)
789      char **ptr;
790      sh_operand_info *op;
791 {
792   char *src = *ptr;
793   int mode = -1;
794   unsigned int len;
795
796   if (src[0] == '#')
797     {
798       src++;
799       *ptr = parse_exp (src, op);
800       op->type = A_IMM;
801       return;
802     }
803
804   else if (src[0] == '@')
805     {
806       *ptr = parse_at (src, op);
807       return;
808     }
809   len = parse_reg (src, &mode, &(op->reg));
810   if (len)
811     {
812       *ptr = src + len;
813       op->type = mode;
814       return;
815     }
816   else
817     {
818       /* Not a reg, the only thing left is a displacement.  */
819       *ptr = parse_exp (src, op);
820       op->type = A_DISP_PC;
821       return;
822     }
823 }
824
825 static
826 char *
827 get_operands (info, args, operand)
828      sh_opcode_info *info;
829      char *args;
830      sh_operand_info *operand;
831 {
832   char *ptr = args;
833   if (info->arg[0])
834     {
835       /* The pre-processor will eliminate whitespace in front of '@'
836          after the first argument; we may be called multiple times
837          from assemble_ppi, so don't insist on finding whitespace here.  */
838       if (*ptr == ' ')
839         ptr++;
840
841       get_operand (&ptr, operand + 0);
842       if (info->arg[1])
843         {
844           if (*ptr == ',')
845             {
846               ptr++;
847             }
848           get_operand (&ptr, operand + 1);
849           /* ??? Hack: psha/pshl have a varying operand number depending on
850              the type of the first operand.  We handle this by having the
851              three-operand version first and reducing the number of operands
852              parsed to two if we see that the first operand is an immediate.
853              This works because no insn with three operands has an immediate
854              as first operand.  */
855           if (info->arg[2] && operand[0].type != A_IMM)
856             {
857               if (*ptr == ',')
858                 {
859                   ptr++;
860                 }
861               get_operand (&ptr, operand + 2);
862             }
863           else
864             {
865               operand[2].type = 0;
866             }
867         }
868       else
869         {
870           operand[1].type = 0;
871           operand[2].type = 0;
872         }
873     }
874   else
875     {
876       operand[0].type = 0;
877       operand[1].type = 0;
878       operand[2].type = 0;
879     }
880   return ptr;
881 }
882
883 /* Passed a pointer to a list of opcodes which use different
884    addressing modes, return the opcode which matches the opcodes
885    provided.  */
886
887 static
888 sh_opcode_info *
889 get_specific (opcode, operands)
890      sh_opcode_info *opcode;
891      sh_operand_info *operands;
892 {
893   sh_opcode_info *this_try = opcode;
894   char *name = opcode->name;
895   int n = 0;
896   while (opcode->name)
897     {
898       this_try = opcode++;
899       if (this_try->name != name)
900         {
901           /* We've looked so far down the table that we've run out of
902              opcodes with the same name.  */
903           return 0;
904         }
905       
906       /* Look at both operands needed by the opcodes and provided by
907          the user - since an arg test will often fail on the same arg
908          again and again, we'll try and test the last failing arg the
909          first on each opcode try.  */
910       for (n = 0; this_try->arg[n]; n++)
911         {
912           sh_operand_info *user = operands + n;
913           sh_arg_type arg = this_try->arg[n];
914           
915           switch (arg)
916             {
917             case A_IMM:
918             case A_BDISP12:
919             case A_BDISP8:
920             case A_DISP_GBR:
921             case A_DISP_PC:
922             case A_MACH:
923             case A_PR:
924             case A_MACL:
925               if (user->type != arg)
926                 goto fail;
927               break;
928             case A_R0:
929               /* opcode needs r0 */
930               if (user->type != A_REG_N || user->reg != 0)
931                 goto fail;
932               break;
933             case A_R0_GBR:
934               if (user->type != A_R0_GBR || user->reg != 0)
935                 goto fail;
936               break;
937             case F_FR0:
938               if (user->type != F_REG_N || user->reg != 0)
939                 goto fail;
940               break;
941
942             case A_REG_N:
943             case A_INC_N:
944             case A_DEC_N:
945             case A_IND_N:
946             case A_IND_R0_REG_N:
947             case A_DISP_REG_N:
948             case F_REG_N:
949             case D_REG_N:
950             case X_REG_N:
951             case V_REG_N:
952             case FPUL_N:
953             case FPSCR_N:
954             case A_PMOD_N:
955             case A_PMODY_N:
956             case DSP_REG_N:
957               /* Opcode needs rn */
958               if (user->type != arg)
959                 goto fail;
960               reg_n = user->reg;
961               break;
962             case DX_REG_N:
963               if (user->type != D_REG_N && user->type != X_REG_N)
964                 goto fail;
965               reg_n = user->reg;
966               break;
967             case A_GBR:
968             case A_SR:
969             case A_VBR:
970             case A_DSR:
971             case A_MOD:
972             case A_RE:
973             case A_RS:
974             case A_SSR:
975             case A_SPC:
976             case A_SGR:
977             case A_DBR:
978               if (user->type != arg)
979                 goto fail;
980               break;
981
982             case A_REG_B:
983               if (user->type != arg)
984                 goto fail;
985               reg_b = user->reg;
986               break;
987
988             case A_REG_M:
989             case A_INC_M:
990             case A_DEC_M:
991             case A_IND_M:
992             case A_IND_R0_REG_M:
993             case A_DISP_REG_M:
994             case DSP_REG_M:
995               /* Opcode needs rn */
996               if (user->type != arg - A_REG_M + A_REG_N)
997                 goto fail;
998               reg_m = user->reg;
999               break;
1000
1001             case DSP_REG_X:
1002               if (user->type != DSP_REG_N)
1003                 goto fail;
1004               switch (user->reg)
1005                 {
1006                 case A_X0_NUM:
1007                   reg_x = 0;
1008                   break;
1009                 case A_X1_NUM:
1010                   reg_x = 1;
1011                   break;
1012                 case A_A0_NUM:
1013                   reg_x = 2;
1014                   break;
1015                 case A_A1_NUM:
1016                   reg_x = 3;
1017                   break;
1018                 default:
1019                   goto fail;
1020                 }
1021               break;
1022
1023             case DSP_REG_Y:
1024               if (user->type != DSP_REG_N)
1025                 goto fail;
1026               switch (user->reg)
1027                 {
1028                 case A_Y0_NUM:
1029                   reg_y = 0;
1030                   break;
1031                 case A_Y1_NUM:
1032                   reg_y = 1;
1033                   break;
1034                 case A_M0_NUM:
1035                   reg_y = 2;
1036                   break;
1037                 case A_M1_NUM:
1038                   reg_y = 3;
1039                   break;
1040                 default:
1041                   goto fail;
1042                 }
1043               break;
1044
1045             case DSP_REG_E:
1046               if (user->type != DSP_REG_N)
1047                 goto fail;
1048               switch (user->reg)
1049                 {
1050                 case A_X0_NUM:
1051                   reg_efg = 0 << 10;
1052                   break;
1053                 case A_X1_NUM:
1054                   reg_efg = 1 << 10;
1055                   break;
1056                 case A_Y0_NUM:
1057                   reg_efg = 2 << 10;
1058                   break;
1059                 case A_A1_NUM:
1060                   reg_efg = 3 << 10;
1061                   break;
1062                 default:
1063                   goto fail;
1064                 }
1065               break;
1066
1067             case DSP_REG_F:
1068               if (user->type != DSP_REG_N)
1069                 goto fail;
1070               switch (user->reg)
1071                 {
1072                 case A_Y0_NUM:
1073                   reg_efg |= 0 << 8;
1074                   break;
1075                 case A_Y1_NUM:
1076                   reg_efg |= 1 << 8;
1077                   break;
1078                 case A_X0_NUM:
1079                   reg_efg |= 2 << 8;
1080                   break;
1081                 case A_A1_NUM:
1082                   reg_efg |= 3 << 8;
1083                   break;
1084                 default:
1085                   goto fail;
1086                 }
1087               break;
1088
1089             case DSP_REG_G:
1090               if (user->type != DSP_REG_N)
1091                 goto fail;
1092               switch (user->reg)
1093                 {
1094                 case A_M0_NUM:
1095                   reg_efg |= 0 << 2;
1096                   break;
1097                 case A_M1_NUM:
1098                   reg_efg |= 1 << 2;
1099                   break;
1100                 case A_A0_NUM:
1101                   reg_efg |= 2 << 2;
1102                   break;
1103                 case A_A1_NUM:
1104                   reg_efg |= 3 << 2;
1105                   break;
1106                 default:
1107                   goto fail;
1108                 }
1109               break;
1110
1111             case A_A0:
1112               if (user->type != DSP_REG_N || user->reg != A_A0_NUM)
1113                 goto fail;
1114               break;
1115             case A_X0:
1116               if (user->type != DSP_REG_N || user->reg != A_X0_NUM)
1117                 goto fail;
1118               break;
1119             case A_X1:
1120               if (user->type != DSP_REG_N || user->reg != A_X1_NUM)
1121                 goto fail;
1122               break;
1123             case A_Y0:
1124               if (user->type != DSP_REG_N || user->reg != A_Y0_NUM)
1125                 goto fail;
1126               break;
1127             case A_Y1:
1128               if (user->type != DSP_REG_N || user->reg != A_Y1_NUM)
1129                 goto fail;
1130               break;
1131
1132             case F_REG_M:
1133             case D_REG_M:
1134             case X_REG_M:
1135             case V_REG_M:
1136             case FPUL_M:
1137             case FPSCR_M:
1138               /* Opcode needs rn */
1139               if (user->type != arg - F_REG_M + F_REG_N)
1140                 goto fail;
1141               reg_m = user->reg;
1142               break;
1143             case DX_REG_M:
1144               if (user->type != D_REG_N && user->type != X_REG_N)
1145                 goto fail;
1146               reg_m = user->reg;
1147               break;
1148             case XMTRX_M4:
1149               if (user->type != XMTRX_M4)
1150                 goto fail;
1151               reg_m = 4;
1152               break;
1153         
1154             default:
1155               printf (_("unhandled %d\n"), arg);
1156               goto fail;
1157             }
1158         }
1159       if ( !(valid_arch & this_try->arch))
1160         goto fail;
1161       valid_arch &= this_try->arch;
1162       return this_try;
1163     fail:;
1164     }
1165
1166   return 0;
1167 }
1168
1169 int
1170 check (operand, low, high)
1171      expressionS *operand;
1172      int low;
1173      int high;
1174 {
1175   if (operand->X_op != O_constant
1176       || operand->X_add_number < low
1177       || operand->X_add_number > high)
1178     {
1179       as_bad (_("operand must be absolute in range %d..%d"), low, high);
1180     }
1181   return operand->X_add_number;
1182 }
1183
1184
1185 static void
1186 insert (where, how, pcrel, op)
1187      char *where;
1188      int how;
1189      int pcrel;
1190      sh_operand_info *op;
1191 {
1192   fix_new_exp (frag_now,
1193                where - frag_now->fr_literal,
1194                2,
1195                &op->immediate,
1196                pcrel,
1197                how);
1198 }
1199
1200 static void
1201 build_relax (opcode, op)
1202      sh_opcode_info *opcode;
1203      sh_operand_info *op;
1204 {
1205   int high_byte = target_big_endian ? 0 : 1;
1206   char *p;
1207
1208   if (opcode->arg[0] == A_BDISP8)
1209     {
1210       int what = (opcode->nibbles[1] & 4) ? COND_JUMP_DELAY : COND_JUMP;
1211       p = frag_var (rs_machine_dependent,
1212                     md_relax_table[C (what, COND32)].rlx_length,
1213                     md_relax_table[C (what, COND8)].rlx_length,
1214                     C (what, 0),
1215                     op->immediate.X_add_symbol,
1216                     op->immediate.X_add_number,
1217                     0);
1218       p[high_byte] = (opcode->nibbles[0] << 4) | (opcode->nibbles[1]);
1219     }
1220   else if (opcode->arg[0] == A_BDISP12)
1221     {
1222       p = frag_var (rs_machine_dependent,
1223                     md_relax_table[C (UNCOND_JUMP, UNCOND32)].rlx_length,
1224                     md_relax_table[C (UNCOND_JUMP, UNCOND12)].rlx_length,
1225                     C (UNCOND_JUMP, 0),
1226                     op->immediate.X_add_symbol,
1227                     op->immediate.X_add_number,
1228                     0);
1229       p[high_byte] = (opcode->nibbles[0] << 4);
1230     }
1231
1232 }
1233
1234 /* Insert ldrs & ldre with fancy relocations that relaxation can recognize.  */
1235
1236 static char *
1237 insert_loop_bounds (output, operand)
1238      char *output;
1239      sh_operand_info *operand;
1240 {
1241   char *name;
1242   symbolS *end_sym;
1243
1244   /* Since the low byte of the opcode will be overwritten by the reloc, we
1245      can just stash the high byte into both bytes and ignore endianness.  */
1246   output[0] = 0x8c;
1247   output[1] = 0x8c;
1248   insert (output, BFD_RELOC_SH_LOOP_START, 1, operand);
1249   insert (output, BFD_RELOC_SH_LOOP_END, 1, operand + 1);
1250
1251   if (sh_relax)
1252     {
1253       static int count = 0;
1254
1255       /* If the last loop insn is a two-byte-insn, it is in danger of being
1256          swapped with the insn after it.  To prevent this, create a new
1257          symbol - complete with SH_LABEL reloc - after the last loop insn.
1258          If the last loop insn is four bytes long, the symbol will be
1259          right in the middle, but four byte insns are not swapped anyways.  */
1260       /* A REPEAT takes 6 bytes.  The SH has a 32 bit address space.
1261          Hence a 9 digit number should be enough to count all REPEATs.  */
1262       name = alloca (11);
1263       sprintf (name, "_R%x", count++ & 0x3fffffff);
1264       end_sym =  symbol_new (name, undefined_section, 0, &zero_address_frag);
1265       /* Make this a local symbol.  */
1266 #ifdef OBJ_COFF
1267       SF_SET_LOCAL (end_sym);
1268 #endif /* OBJ_COFF */
1269       symbol_table_insert (end_sym);
1270       end_sym->sy_value = operand[1].immediate;
1271       end_sym->sy_value.X_add_number += 2;
1272       fix_new (frag_now, frag_now_fix (), 2, end_sym, 0, 1, BFD_RELOC_SH_LABEL);
1273     }
1274
1275   output = frag_more (2);
1276   output[0] = 0x8e;
1277   output[1] = 0x8e;
1278   insert (output, BFD_RELOC_SH_LOOP_START, 1, operand);
1279   insert (output, BFD_RELOC_SH_LOOP_END, 1, operand + 1);
1280
1281   return frag_more (2);
1282 }
1283
1284 /* Now we know what sort of opcodes it is, let's build the bytes.  */
1285
1286 static void
1287 build_Mytes (opcode, operand)
1288      sh_opcode_info *opcode;
1289      sh_operand_info *operand;
1290
1291 {
1292   int index;
1293   char nbuf[4];
1294   char *output = frag_more (2);
1295   int low_byte = target_big_endian ? 1 : 0;
1296   nbuf[0] = 0;
1297   nbuf[1] = 0;
1298   nbuf[2] = 0;
1299   nbuf[3] = 0;
1300
1301   for (index = 0; index < 4; index++)
1302     {
1303       sh_nibble_type i = opcode->nibbles[index];
1304       if (i < 16)
1305         {
1306           nbuf[index] = i;
1307         }
1308       else
1309         {
1310           switch (i)
1311             {
1312             case REG_N:
1313               nbuf[index] = reg_n;
1314               break;
1315             case REG_M:
1316               nbuf[index] = reg_m;
1317               break;
1318             case SDT_REG_N:
1319               if (reg_n < 2 || reg_n > 5)
1320                 as_bad (_("Invalid register: 'r%d'"), reg_n);
1321               nbuf[index] = (reg_n & 3) | 4;
1322               break;
1323             case REG_NM:
1324               nbuf[index] = reg_n | (reg_m >> 2);
1325               break;
1326             case REG_B:
1327               nbuf[index] = reg_b | 0x08;
1328               break;
1329             case IMM0_4BY4:
1330               insert (output + low_byte, BFD_RELOC_SH_IMM4BY4, 0, operand);
1331               break;
1332             case IMM0_4BY2:
1333               insert (output + low_byte, BFD_RELOC_SH_IMM4BY2, 0, operand);
1334               break;
1335             case IMM0_4:
1336               insert (output + low_byte, BFD_RELOC_SH_IMM4, 0, operand);
1337               break;
1338             case IMM1_4BY4:
1339               insert (output + low_byte, BFD_RELOC_SH_IMM4BY4, 0, operand + 1);
1340               break;
1341             case IMM1_4BY2:
1342               insert (output + low_byte, BFD_RELOC_SH_IMM4BY2, 0, operand + 1);
1343               break;
1344             case IMM1_4:
1345               insert (output + low_byte, BFD_RELOC_SH_IMM4, 0, operand + 1);
1346               break;
1347             case IMM0_8BY4:
1348               insert (output + low_byte, BFD_RELOC_SH_IMM8BY4, 0, operand);
1349               break;
1350             case IMM0_8BY2:
1351               insert (output + low_byte, BFD_RELOC_SH_IMM8BY2, 0, operand);
1352               break;
1353             case IMM0_8:
1354               insert (output + low_byte, BFD_RELOC_SH_IMM8, 0, operand);
1355               break;
1356             case IMM1_8BY4:
1357               insert (output + low_byte, BFD_RELOC_SH_IMM8BY4, 0, operand + 1);
1358               break;
1359             case IMM1_8BY2:
1360               insert (output + low_byte, BFD_RELOC_SH_IMM8BY2, 0, operand + 1);
1361               break;
1362             case IMM1_8:
1363               insert (output + low_byte, BFD_RELOC_SH_IMM8, 0, operand + 1);
1364               break;
1365             case PCRELIMM_8BY4:
1366               insert (output, BFD_RELOC_SH_PCRELIMM8BY4, 1, operand);
1367               break;
1368             case PCRELIMM_8BY2:
1369               insert (output, BFD_RELOC_SH_PCRELIMM8BY2, 1, operand);
1370               break;
1371             case REPEAT:
1372               output = insert_loop_bounds (output, operand);
1373               nbuf[index] = opcode->nibbles[3];
1374               operand += 2;
1375               break;
1376             default:
1377               printf (_("failed for %d\n"), i);
1378             }
1379         }
1380     }
1381   if (! target_big_endian) {
1382     output[1] = (nbuf[0] << 4) | (nbuf[1]);
1383     output[0] = (nbuf[2] << 4) | (nbuf[3]);
1384   }
1385   else {
1386     output[0] = (nbuf[0] << 4) | (nbuf[1]);
1387     output[1] = (nbuf[2] << 4) | (nbuf[3]);
1388   }
1389 }
1390
1391 /* Find an opcode at the start of *STR_P in the hash table, and set
1392    *STR_P to the first character after the last one read.  */
1393
1394 static sh_opcode_info *
1395 find_cooked_opcode (str_p)
1396      char **str_p;
1397 {
1398   char *str = *str_p;
1399   unsigned char *op_start;
1400   unsigned char *op_end;
1401   char name[20];
1402   int nlen = 0;
1403   
1404   /* Drop leading whitespace.  */
1405   while (*str == ' ')
1406     str++;
1407
1408   /* Find the op code end.
1409      The pre-processor will eliminate whitespace in front of
1410      any '@' after the first argument; we may be called from
1411      assemble_ppi, so the opcode might be terminated by an '@'.  */
1412   for (op_start = op_end = (unsigned char *) (str);
1413        *op_end
1414        && nlen < 20
1415        && !is_end_of_line[*op_end] && *op_end != ' ' && *op_end != '@';
1416        op_end++)
1417     {
1418       unsigned char c = op_start[nlen];
1419
1420       /* The machine independent code will convert CMP/EQ into cmp/EQ
1421          because it thinks the '/' is the end of the symbol.  Moreover,
1422          all but the first sub-insn is a parallel processing insn won't
1423          be capitailzed.  Instead of hacking up the machine independent
1424          code, we just deal with it here.  */
1425       c = isupper (c) ? tolower (c) : c;
1426       name[nlen] = c;
1427       nlen++;
1428     }
1429   
1430   name[nlen] = 0;
1431   *str_p = op_end;
1432
1433   if (nlen == 0)
1434     as_bad (_("can't find opcode "));
1435
1436   return (sh_opcode_info *) hash_find (opcode_hash_control, name);
1437 }
1438
1439 /* Assemble a parallel processing insn.  */
1440 #define DDT_BASE 0xf000 /* Base value for double data transfer insns */
1441
1442 static void
1443 assemble_ppi (op_end, opcode)
1444      char *op_end;
1445      sh_opcode_info *opcode;
1446 {
1447   int movx = 0;
1448   int movy = 0;
1449   int cond = 0;
1450   int field_b = 0;
1451   char *output;
1452   int move_code;
1453
1454   /* Some insn ignore one or more register fields, e.g. psts machl,a0.
1455      Make sure we encode a defined insn pattern.  */
1456   reg_x = 0;
1457   reg_y = 0;
1458
1459   for (;;)
1460     {
1461       sh_operand_info operand[3];
1462
1463       if (opcode->arg[0] != A_END)
1464         op_end = get_operands (opcode, op_end, operand);
1465       opcode = get_specific (opcode, operand);
1466       if (opcode == 0)
1467         {
1468           /* Couldn't find an opcode which matched the operands.  */
1469           char *where = frag_more (2);
1470
1471           where[0] = 0x0;
1472           where[1] = 0x0;
1473           as_bad (_("invalid operands for opcode"));
1474           return;
1475         }
1476       
1477       if (opcode->nibbles[0] != PPI)
1478         as_bad (_("insn can't be combined with parallel processing insn"));
1479
1480       switch (opcode->nibbles[1])
1481         {
1482
1483         case NOPX:
1484           if (movx)
1485             as_bad (_("multiple movx specifications"));
1486           movx = DDT_BASE;
1487           break;
1488         case NOPY:
1489           if (movy)
1490             as_bad (_("multiple movy specifications"));
1491           movy = DDT_BASE;
1492           break;
1493
1494         case MOVX:
1495           if (movx)
1496             as_bad (_("multiple movx specifications"));
1497           if (reg_n < 4 || reg_n > 5)
1498             as_bad (_("invalid movx address register"));
1499           if (opcode->nibbles[2] & 8)
1500             {
1501               if (reg_m == A_A1_NUM)
1502                 movx = 1 << 7;
1503               else if (reg_m != A_A0_NUM)
1504                 as_bad (_("invalid movx dsp register"));
1505             }
1506           else
1507             {
1508               if (reg_x > 1)
1509                 as_bad (_("invalid movx dsp register"));
1510               movx = reg_x << 7;
1511             }
1512           movx += ((reg_n - 4) << 9) + (opcode->nibbles[2] << 2) + DDT_BASE;
1513           break;
1514
1515         case MOVY:
1516           if (movy)
1517             as_bad (_("multiple movy specifications"));
1518           if (opcode->nibbles[2] & 8)
1519             {
1520               /* Bit 3 in nibbles[2] is intended for bit 4 of the opcode,
1521                  so add 8 more.  */
1522               movy = 8;
1523               if (reg_m == A_A1_NUM)
1524                 movy += 1 << 6;
1525               else if (reg_m != A_A0_NUM)
1526                 as_bad (_("invalid movy dsp register"));
1527             }
1528           else
1529             {
1530               if (reg_y > 1)
1531                 as_bad (_("invalid movy dsp register"));
1532               movy = reg_y << 6;
1533             }
1534           if (reg_n < 6 || reg_n > 7)
1535             as_bad (_("invalid movy address register"));
1536           movy += ((reg_n - 6) << 8) + opcode->nibbles[2] + DDT_BASE;
1537           break;
1538
1539         case PSH:
1540           if (operand[0].immediate.X_op != O_constant)
1541             as_bad (_("dsp immediate shift value not constant"));
1542           field_b = ((opcode->nibbles[2] << 12)
1543                      | (operand[0].immediate.X_add_number & 127) << 4
1544                      | reg_n);
1545           break;
1546         case PPI3:
1547           if (field_b)
1548             as_bad (_("multiple parallel processing specifications"));
1549           field_b = ((opcode->nibbles[2] << 12) + (opcode->nibbles[3] << 8)
1550                      + (reg_x << 6) + (reg_y << 4) + reg_n);
1551           break;
1552         case PDC:
1553           if (cond)
1554             as_bad (_("multiple condition specifications"));
1555           cond = opcode->nibbles[2] << 8;
1556           if (*op_end)
1557             goto skip_cond_check;
1558           break;
1559         case PPIC:
1560           if (field_b)
1561             as_bad (_("multiple parallel processing specifications"));
1562           field_b = ((opcode->nibbles[2] << 12) + (opcode->nibbles[3] << 8)
1563                      + cond + (reg_x << 6) + (reg_y << 4) + reg_n);
1564           cond = 0;
1565           break;
1566         case PMUL:
1567           if (field_b)
1568             {
1569               if ((field_b & 0xef00) != 0xa100)
1570                 as_bad (_("insn cannot be combined with pmuls"));
1571               field_b -= 0x8100;
1572               switch (field_b & 0xf)
1573                 {
1574                 case A_X0_NUM:
1575                   field_b += 0 - A_X0_NUM;
1576                   break;
1577                 case A_Y0_NUM:
1578                   field_b += 1 - A_Y0_NUM;
1579                   break;
1580                 case A_A0_NUM:
1581                   field_b += 2 - A_A0_NUM;
1582                   break;
1583                 case A_A1_NUM:
1584                   field_b += 3 - A_A1_NUM;
1585                   break;
1586                 default:
1587                   as_bad (_("bad padd / psub pmuls output operand"));
1588                 }
1589             }
1590           field_b += 0x4000 + reg_efg;
1591           break;
1592         default:
1593           abort ();
1594         }
1595       if (cond)
1596         {
1597           as_bad (_("condition not followed by conditionalizable insn"));
1598           cond = 0;
1599         }
1600       if (! *op_end)
1601         break;
1602     skip_cond_check:
1603       opcode = find_cooked_opcode (&op_end);
1604       if (opcode == NULL)
1605         {
1606           (as_bad
1607            (_("unrecognized characters at end of parallel processing insn")));
1608           break;
1609         }
1610     }
1611
1612   move_code = movx | movy;
1613   if (field_b)
1614     {
1615       /* Parallel processing insn.  */
1616       unsigned long ppi_code = (movx | movy | 0xf800) << 16 | field_b;
1617
1618       output = frag_more (4);
1619       if (! target_big_endian)
1620         {
1621           output[3] = ppi_code >> 8;
1622           output[2] = ppi_code;
1623         }
1624       else
1625         {
1626           output[2] = ppi_code >> 8;
1627           output[3] = ppi_code;
1628         }
1629       move_code |= 0xf800;
1630     }
1631   else
1632     /* Just a double data transfer.  */
1633     output = frag_more (2);
1634   if (! target_big_endian)
1635     {
1636       output[1] = move_code >> 8;
1637       output[0] = move_code;
1638     }
1639   else
1640     {
1641       output[0] = move_code >> 8;
1642       output[1] = move_code;
1643     }
1644 }
1645
1646 /* This is the guts of the machine-dependent assembler.  STR points to a
1647    machine dependent instruction.  This function is supposed to emit
1648    the frags/bytes it assembles to.  */
1649
1650 void
1651 md_assemble (str)
1652      char *str;
1653 {
1654   unsigned char *op_end;
1655   sh_operand_info operand[3];
1656   sh_opcode_info *opcode;
1657
1658   opcode = find_cooked_opcode (&str);
1659   op_end = str;
1660
1661   if (opcode == NULL)
1662     {
1663       as_bad (_("unknown opcode"));
1664       return;
1665     }
1666
1667   if (sh_relax
1668       && ! seg_info (now_seg)->tc_segment_info_data.in_code)
1669     {
1670       /* Output a CODE reloc to tell the linker that the following
1671          bytes are instructions, not data.  */
1672       fix_new (frag_now, frag_now_fix (), 2, &abs_symbol, 0, 0,
1673                BFD_RELOC_SH_CODE);
1674       seg_info (now_seg)->tc_segment_info_data.in_code = 1;
1675     }
1676
1677   if (opcode->nibbles[0] == PPI)
1678     {
1679       assemble_ppi (op_end, opcode);
1680       return;
1681     }
1682
1683   if (opcode->arg[0] == A_BDISP12
1684       || opcode->arg[0] == A_BDISP8)
1685     {
1686       parse_exp (op_end + 1, &operand[0]);
1687       build_relax (opcode, &operand[0]);
1688     }
1689   else
1690     {
1691       if (opcode->arg[0] == A_END)
1692         {
1693           /* Ignore trailing whitespace.  If there is any, it has already
1694              been compressed to a single space.  */
1695           if (*op_end == ' ')
1696             op_end++;
1697         }
1698       else
1699         {
1700           op_end = get_operands (opcode, op_end, operand);
1701         }
1702       opcode = get_specific (opcode, operand);
1703
1704       if (opcode == 0)
1705         {
1706           /* Couldn't find an opcode which matched the operands.  */
1707           char *where = frag_more (2);
1708
1709           where[0] = 0x0;
1710           where[1] = 0x0;
1711           as_bad (_("invalid operands for opcode"));
1712           return;
1713         }
1714
1715       if (*op_end)
1716         as_bad (_("excess operands: '%s'"), op_end);
1717
1718       build_Mytes (opcode, operand);
1719     }
1720
1721 }
1722
1723 /* This routine is called each time a label definition is seen.  It
1724    emits a BFD_RELOC_SH_LABEL reloc if necessary.  */
1725
1726 void
1727 sh_frob_label ()
1728 {
1729   static fragS *last_label_frag;
1730   static int last_label_offset;
1731
1732   if (sh_relax
1733       && seg_info (now_seg)->tc_segment_info_data.in_code)
1734     {
1735       int offset;
1736
1737       offset = frag_now_fix ();
1738       if (frag_now != last_label_frag
1739           || offset != last_label_offset)
1740         {       
1741           fix_new (frag_now, offset, 2, &abs_symbol, 0, 0, BFD_RELOC_SH_LABEL);
1742           last_label_frag = frag_now;
1743           last_label_offset = offset;
1744         }
1745     }
1746 }
1747
1748 /* This routine is called when the assembler is about to output some
1749    data.  It emits a BFD_RELOC_SH_DATA reloc if necessary.  */
1750
1751 void
1752 sh_flush_pending_output ()
1753 {
1754   if (sh_relax
1755       && seg_info (now_seg)->tc_segment_info_data.in_code)
1756     {
1757       fix_new (frag_now, frag_now_fix (), 2, &abs_symbol, 0, 0,
1758                BFD_RELOC_SH_DATA);
1759       seg_info (now_seg)->tc_segment_info_data.in_code = 0;
1760     }
1761 }
1762
1763 symbolS *
1764 md_undefined_symbol (name)
1765      char *name;
1766 {
1767   return 0;
1768 }
1769
1770 #ifdef OBJ_COFF
1771 #ifndef BFD_ASSEMBLER
1772
1773 void
1774 tc_crawl_symbol_chain (headers)
1775      object_headers *headers;
1776 {
1777   printf (_("call to tc_crawl_symbol_chain \n"));
1778 }
1779
1780 void
1781 tc_headers_hook (headers)
1782      object_headers *headers;
1783 {
1784   printf (_("call to tc_headers_hook \n"));
1785 }
1786
1787 #endif
1788 #endif
1789
1790 /* Various routines to kill one day.  */
1791 /* Equal to MAX_PRECISION in atof-ieee.c.  */
1792 #define MAX_LITTLENUMS 6
1793
1794 /* Turn a string in input_line_pointer into a floating point constant
1795    of type TYPE, and store the appropriate bytes in *LITP.  The number
1796    of LITTLENUMS emitted is stored in *SIZEP .  An error message is
1797    returned, or NULL on OK.  */
1798
1799 char *
1800 md_atof (type, litP, sizeP)
1801      int type;
1802      char *litP;
1803      int *sizeP;
1804 {
1805   int prec;
1806   LITTLENUM_TYPE words[4];
1807   char *t;
1808   int i;
1809
1810   switch (type)
1811     {
1812     case 'f':
1813       prec = 2;
1814       break;
1815
1816     case 'd':
1817       prec = 4;
1818       break;
1819
1820     default:
1821       *sizeP = 0;
1822       return _("bad call to md_atof");
1823     }
1824
1825   t = atof_ieee (input_line_pointer, type, words);
1826   if (t)
1827     input_line_pointer = t;
1828
1829   *sizeP = prec * 2;
1830
1831   if (! target_big_endian)
1832     {
1833       for (i = prec - 1; i >= 0; i--)
1834         {
1835           md_number_to_chars (litP, (valueT) words[i], 2);
1836           litP += 2;
1837         }
1838     }
1839   else
1840     {
1841       for (i = 0; i < prec; i++)
1842         {
1843           md_number_to_chars (litP, (valueT) words[i], 2);
1844           litP += 2;
1845         }
1846     }
1847      
1848   return NULL;
1849 }
1850
1851 /* Handle the .uses pseudo-op.  This pseudo-op is used just before a
1852    call instruction.  It refers to a label of the instruction which
1853    loads the register which the call uses.  We use it to generate a
1854    special reloc for the linker.  */
1855
1856 static void
1857 s_uses (ignore)
1858      int ignore ATTRIBUTE_UNUSED;
1859 {
1860   expressionS ex;
1861
1862   if (! sh_relax)
1863     as_warn (_(".uses pseudo-op seen when not relaxing"));
1864
1865   expression (&ex);
1866
1867   if (ex.X_op != O_symbol || ex.X_add_number != 0)
1868     {
1869       as_bad (_("bad .uses format"));
1870       ignore_rest_of_line ();
1871       return;
1872     }
1873
1874   fix_new_exp (frag_now, frag_now_fix (), 2, &ex, 1, BFD_RELOC_SH_USES);
1875
1876   demand_empty_rest_of_line ();
1877 }
1878 \f
1879 CONST char *md_shortopts = "";
1880 struct option md_longopts[] =
1881 {
1882 #define OPTION_RELAX  (OPTION_MD_BASE)
1883 #define OPTION_LITTLE (OPTION_MD_BASE + 1)
1884 #define OPTION_SMALL (OPTION_LITTLE + 1)
1885 #define OPTION_DSP (OPTION_SMALL + 1)
1886
1887   {"relax", no_argument, NULL, OPTION_RELAX},
1888   {"little", no_argument, NULL, OPTION_LITTLE},
1889   {"small", no_argument, NULL, OPTION_SMALL},
1890   {"dsp", no_argument, NULL, OPTION_DSP},
1891   {NULL, no_argument, NULL, 0}
1892 };
1893 size_t md_longopts_size = sizeof(md_longopts);
1894
1895 int
1896 md_parse_option (c, arg)
1897      int c;
1898      char *arg ATTRIBUTE_UNUSED;
1899 {
1900   switch (c)
1901     {
1902     case OPTION_RELAX:
1903       sh_relax = 1;
1904       break;
1905
1906     case OPTION_LITTLE:
1907       shl = 1;
1908       target_big_endian = 0;
1909       break;
1910
1911     case OPTION_SMALL:
1912       sh_small = 1;
1913       break;
1914
1915     case OPTION_DSP:
1916       sh_dsp = 1;
1917       break;
1918
1919     default:
1920       return 0;
1921     }
1922
1923   return 1;
1924 }
1925
1926 void
1927 md_show_usage (stream)
1928      FILE *stream;
1929 {
1930   fprintf(stream, _("\
1931 SH options:\n\
1932 -little                 generate little endian code\n\
1933 -relax                  alter jump instructions for long displacements\n\
1934 -small                  align sections to 4 byte boundaries, not 16\n\
1935 -dsp                    enable sh-dsp insns, and disable sh3e / sh4 insns.\n"));
1936 }
1937 \f
1938 void
1939 tc_Nout_fix_to_chars ()
1940 {
1941   printf (_("call to tc_Nout_fix_to_chars \n"));
1942   abort ();
1943 }
1944
1945 /* This struct is used to pass arguments to sh_count_relocs through
1946    bfd_map_over_sections.  */
1947
1948 struct sh_count_relocs
1949 {
1950   /* Symbol we are looking for.  */
1951   symbolS *sym;
1952   /* Count of relocs found.  */
1953   int count;
1954 };
1955
1956 /* Count the number of fixups in a section which refer to a particular
1957    symbol.  When using BFD_ASSEMBLER, this is called via
1958    bfd_map_over_sections.  */
1959
1960 /*ARGSUSED*/
1961 static void
1962 sh_count_relocs (abfd, sec, data)
1963      bfd *abfd ATTRIBUTE_UNUSED;
1964      segT sec;
1965      PTR data;
1966 {
1967   struct sh_count_relocs *info = (struct sh_count_relocs *) data;
1968   segment_info_type *seginfo;
1969   symbolS *sym;
1970   fixS *fix;
1971
1972   seginfo = seg_info (sec);
1973   if (seginfo == NULL)
1974     return;
1975
1976   sym = info->sym;
1977   for (fix = seginfo->fix_root; fix != NULL; fix = fix->fx_next)
1978     {
1979       if (fix->fx_addsy == sym)
1980         {
1981           ++info->count;
1982           fix->fx_tcbit = 1;
1983         }
1984     }
1985 }
1986
1987 /* Handle the count relocs for a particular section.  When using
1988    BFD_ASSEMBLER, this is called via bfd_map_over_sections.  */
1989
1990 /*ARGSUSED*/
1991 static void
1992 sh_frob_section (abfd, sec, ignore)
1993      bfd *abfd ATTRIBUTE_UNUSED;
1994      segT sec;
1995      PTR ignore ATTRIBUTE_UNUSED;
1996 {
1997   segment_info_type *seginfo;
1998   fixS *fix;
1999
2000   seginfo = seg_info (sec);
2001   if (seginfo == NULL)
2002     return;
2003
2004   for (fix = seginfo->fix_root; fix != NULL; fix = fix->fx_next)
2005     {
2006       symbolS *sym;
2007       bfd_vma val;
2008       fixS *fscan;
2009       struct sh_count_relocs info;
2010
2011       if (fix->fx_r_type != BFD_RELOC_SH_USES)
2012         continue;
2013
2014       /* The BFD_RELOC_SH_USES reloc should refer to a defined local
2015          symbol in the same section.  */
2016       sym = fix->fx_addsy;
2017       if (sym == NULL
2018           || fix->fx_subsy != NULL
2019           || fix->fx_addnumber != 0
2020           || S_GET_SEGMENT (sym) != sec
2021 #if ! defined (BFD_ASSEMBLER) && defined (OBJ_COFF)
2022           || S_GET_STORAGE_CLASS (sym) == C_EXT
2023 #endif
2024           || S_IS_EXTERNAL (sym))
2025         {
2026           as_warn_where (fix->fx_file, fix->fx_line,
2027                          _(".uses does not refer to a local symbol in the same section"));
2028           continue;
2029         }
2030
2031       /* Look through the fixups again, this time looking for one
2032          at the same location as sym.  */
2033       val = S_GET_VALUE (sym);
2034       for (fscan = seginfo->fix_root;
2035            fscan != NULL;
2036            fscan = fscan->fx_next)
2037         if (val == fscan->fx_frag->fr_address + fscan->fx_where
2038             && fscan->fx_r_type != BFD_RELOC_SH_ALIGN
2039             && fscan->fx_r_type != BFD_RELOC_SH_CODE
2040             && fscan->fx_r_type != BFD_RELOC_SH_DATA
2041             && fscan->fx_r_type != BFD_RELOC_SH_LABEL)
2042           break;
2043       if (fscan == NULL)
2044         {
2045           as_warn_where (fix->fx_file, fix->fx_line,
2046                          _("can't find fixup pointed to by .uses"));
2047           continue;
2048         }
2049
2050       if (fscan->fx_tcbit)
2051         {
2052           /* We've already done this one.  */
2053           continue;
2054         }
2055
2056       /* The variable fscan should also be a fixup to a local symbol
2057          in the same section.  */
2058       sym = fscan->fx_addsy;
2059       if (sym == NULL
2060           || fscan->fx_subsy != NULL
2061           || fscan->fx_addnumber != 0
2062           || S_GET_SEGMENT (sym) != sec
2063 #if ! defined (BFD_ASSEMBLER) && defined (OBJ_COFF)
2064           || S_GET_STORAGE_CLASS (sym) == C_EXT
2065 #endif
2066           || S_IS_EXTERNAL (sym))
2067         {
2068           as_warn_where (fix->fx_file, fix->fx_line,
2069                          _(".uses target does not refer to a local symbol in the same section"));
2070           continue;
2071         }
2072
2073       /* Now we look through all the fixups of all the sections,
2074          counting the number of times we find a reference to sym.  */
2075       info.sym = sym;
2076       info.count = 0;
2077 #ifdef BFD_ASSEMBLER
2078       bfd_map_over_sections (stdoutput, sh_count_relocs, (PTR) &info);
2079 #else
2080       {
2081         int iscan;
2082
2083         for (iscan = SEG_E0; iscan < SEG_UNKNOWN; iscan++)
2084           sh_count_relocs ((bfd *) NULL, iscan, (PTR) &info);
2085       }
2086 #endif
2087
2088       if (info.count < 1)
2089         abort ();
2090
2091       /* Generate a BFD_RELOC_SH_COUNT fixup at the location of sym.
2092          We have already adjusted the value of sym to include the
2093          fragment address, so we undo that adjustment here.  */
2094       subseg_change (sec, 0);
2095       fix_new (symbol_get_frag (sym),
2096                S_GET_VALUE (sym) - symbol_get_frag (sym)->fr_address,
2097                4, &abs_symbol, info.count, 0, BFD_RELOC_SH_COUNT);
2098     }
2099 }
2100
2101 /* This function is called after the symbol table has been completed,
2102    but before the relocs or section contents have been written out.
2103    If we have seen any .uses pseudo-ops, they point to an instruction
2104    which loads a register with the address of a function.  We look
2105    through the fixups to find where the function address is being
2106    loaded from.  We then generate a COUNT reloc giving the number of
2107    times that function address is referred to.  The linker uses this
2108    information when doing relaxing, to decide when it can eliminate
2109    the stored function address entirely.  */
2110
2111 void
2112 sh_frob_file ()
2113 {
2114   if (! sh_relax)
2115     return;
2116
2117 #ifdef BFD_ASSEMBLER
2118   bfd_map_over_sections (stdoutput, sh_frob_section, (PTR) NULL);
2119 #else
2120   {
2121     int iseg;
2122
2123     for (iseg = SEG_E0; iseg < SEG_UNKNOWN; iseg++)
2124       sh_frob_section ((bfd *) NULL, iseg, (PTR) NULL);
2125   }
2126 #endif
2127 }
2128
2129 /* Called after relaxing.  Set the correct sizes of the fragments, and
2130    create relocs so that md_apply_fix will fill in the correct values.  */
2131
2132 void
2133 md_convert_frag (headers, seg, fragP)
2134 #ifdef BFD_ASSEMBLER
2135      bfd *headers ATTRIBUTE_UNUSED;
2136 #else
2137      object_headers *headers;
2138 #endif
2139      segT seg;
2140      fragS *fragP;
2141 {
2142   int donerelax = 0;
2143
2144   switch (fragP->fr_subtype)
2145     {
2146     case C (COND_JUMP, COND8):
2147     case C (COND_JUMP_DELAY, COND8):
2148       subseg_change (seg, 0);
2149       fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol, fragP->fr_offset,
2150                1, BFD_RELOC_SH_PCDISP8BY2);
2151       fragP->fr_fix += 2;
2152       fragP->fr_var = 0;
2153       break;
2154
2155     case C (UNCOND_JUMP, UNCOND12):
2156       subseg_change (seg, 0);
2157       fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol, fragP->fr_offset,
2158                1, BFD_RELOC_SH_PCDISP12BY2);
2159       fragP->fr_fix += 2;
2160       fragP->fr_var = 0;
2161       break;
2162
2163     case C (UNCOND_JUMP, UNCOND32):
2164     case C (UNCOND_JUMP, UNDEF_WORD_DISP):
2165       if (fragP->fr_symbol == NULL)
2166         as_bad (_("at 0x%lx, displacement overflows 12-bit field"),
2167                 (unsigned long) fragP->fr_address);
2168       else if (S_IS_DEFINED (fragP->fr_symbol))
2169         as_bad (_("at 0x%lx, displacement to defined symbol %s overflows 12-bit field"),
2170                 (unsigned long) fragP->fr_address,              
2171                 S_GET_NAME (fragP->fr_symbol));
2172       else
2173         as_bad (_("at 0x%lx, displacement to undefined symbol %s overflows 12-bit field"),
2174                 (unsigned long) fragP->fr_address,              
2175                 S_GET_NAME (fragP->fr_symbol));
2176
2177 #if 0           /* This code works, but generates poor code and the compiler
2178                    should never produce a sequence that requires it to be used.  */
2179
2180       /* A jump wont fit in 12 bits, make code which looks like
2181          bra foo
2182          mov.w @(0, PC), r14
2183          .long disp
2184          foo: bra @r14
2185          */
2186       int t = buffer[0] & 0x10;
2187
2188       buffer[highbyte] = 0xa0;  /* branch over move and disp */
2189       buffer[lowbyte] = 3;
2190       buffer[highbyte+2] = 0xd0 | JREG; /* Build mov insn */
2191       buffer[lowbyte+2] = 0x00;
2192
2193       buffer[highbyte+4] = 0;   /* space for 32 bit jump disp */
2194       buffer[lowbyte+4] = 0;
2195       buffer[highbyte+6] = 0;
2196       buffer[lowbyte+6] = 0;
2197
2198       buffer[highbyte+8] = 0x40 | JREG; /* Build jmp @JREG */
2199       buffer[lowbyte+8] = t ? 0xb : 0x2b;
2200
2201       buffer[highbyte+10] = 0x20; /* build nop */
2202       buffer[lowbyte+10] = 0x0b;
2203
2204       /* Make reloc for the long disp.  */
2205       fix_new (fragP,
2206                fragP->fr_fix + 4,
2207                4,
2208                fragP->fr_symbol,
2209                fragP->fr_offset,
2210                0,
2211                BFD_RELOC_32);
2212       fragP->fr_fix += UNCOND32_LENGTH;
2213       fragP->fr_var = 0;
2214       donerelax = 1;
2215 #endif
2216
2217       break;
2218
2219     case C (COND_JUMP, COND12):
2220     case C (COND_JUMP_DELAY, COND12):
2221       /* A bcond won't fit, so turn it into a b!cond; bra disp; nop.  */
2222       /* I found that a relax failure for gcc.c-torture/execute/930628-1.c
2223          was due to gas incorrectly relaxing an out-of-range conditional
2224          branch with delay slot.  It turned:
2225                      bf.s    L6              (slot mov.l   r12,@(44,r0))
2226          into:
2227    
2228 2c:  8f 01 a0 8b     bf.s    32 <_main+32>   (slot bra       L6)
2229 30:  00 09           nop
2230 32:  10 cb           mov.l   r12,@(44,r0)
2231          Therefore, branches with delay slots have to be handled
2232          differently from ones without delay slots.  */
2233       {
2234         unsigned char *buffer =
2235           (unsigned char *) (fragP->fr_fix + fragP->fr_literal);
2236         int highbyte = target_big_endian ? 0 : 1;
2237         int lowbyte = target_big_endian ? 1 : 0;
2238         int delay = fragP->fr_subtype == C (COND_JUMP_DELAY, COND12);
2239
2240         /* Toggle the true/false bit of the bcond.  */
2241         buffer[highbyte] ^= 0x2;
2242
2243         /* If this is a dalayed branch, we may not put the the bra in the
2244            slot.  So we change it to a non-delayed branch, like that:
2245            b! cond slot_label; bra disp; slot_label: slot_insn
2246            ??? We should try if swapping the conditional branch and
2247            its delay-slot insn already makes the branch reach.  */
2248
2249         /* Build a relocation to six / four bytes farther on.  */
2250         subseg_change (seg, 0);
2251         fix_new (fragP, fragP->fr_fix, 2,
2252 #ifdef BFD_ASSEMBLER
2253                  section_symbol (seg),
2254 #else
2255                  seg_info (seg)->dot,
2256 #endif
2257                  fragP->fr_address + fragP->fr_fix + (delay ? 4 : 6),
2258                  1, BFD_RELOC_SH_PCDISP8BY2);
2259
2260         /* Set up a jump instruction.  */
2261         buffer[highbyte + 2] = 0xa0;
2262         buffer[lowbyte + 2] = 0;
2263         fix_new (fragP, fragP->fr_fix + 2, 2, fragP->fr_symbol,
2264                  fragP->fr_offset, 1, BFD_RELOC_SH_PCDISP12BY2);
2265
2266         if (delay)
2267           {
2268             buffer[highbyte] &= ~0x4; /* Removes delay slot from branch.  */
2269             fragP->fr_fix += 4;
2270           }
2271         else
2272           {
2273             /* Fill in a NOP instruction.  */
2274             buffer[highbyte + 4] = 0x0;
2275             buffer[lowbyte + 4] = 0x9;
2276
2277             fragP->fr_fix += 6;
2278           }
2279         fragP->fr_var = 0;
2280         donerelax = 1;
2281       }
2282       break;
2283
2284     case C (COND_JUMP, COND32):
2285     case C (COND_JUMP_DELAY, COND32):
2286     case C (COND_JUMP, UNDEF_WORD_DISP):
2287     case C (COND_JUMP_DELAY, UNDEF_WORD_DISP):
2288       if (fragP->fr_symbol == NULL)
2289         as_bad (_("at 0x%lx, displacement overflows 8-bit field"), 
2290                 (unsigned long) fragP->fr_address);
2291       else if (S_IS_DEFINED (fragP->fr_symbol))
2292         as_bad (_("at 0x%lx, displacement to defined symbol %s overflows 8-bit field "),
2293                 (unsigned long) fragP->fr_address,              
2294                 S_GET_NAME (fragP->fr_symbol));
2295       else
2296         as_bad (_("at 0x%lx, displacement to undefined symbol %s overflows 8-bit field "),
2297                 (unsigned long) fragP->fr_address,              
2298                 S_GET_NAME (fragP->fr_symbol));
2299
2300 #if 0           /* This code works, but generates poor code, and the compiler
2301                    should never produce a sequence that requires it to be used.  */
2302
2303       /* A bcond won't fit and it won't go into a 12 bit
2304          displacement either, the code sequence looks like:
2305          b!cond foop
2306          mov.w @(n, PC), r14
2307          jmp  @r14
2308          nop
2309          .long where
2310          foop:
2311          */
2312
2313       buffer[0] ^= 0x2;         /* Toggle T/F bit */
2314 #define JREG 14
2315       buffer[1] = 5;            /* branch over mov, jump, nop and ptr */
2316       buffer[2] = 0xd0 | JREG;  /* Build mov insn */
2317       buffer[3] = 0x2;
2318       buffer[4] = 0x40 | JREG;  /* Build jmp @JREG */
2319       buffer[5] = 0x0b;
2320       buffer[6] = 0x20;         /* build nop */
2321       buffer[7] = 0x0b;
2322       buffer[8] = 0;            /* space for 32 bit jump disp */
2323       buffer[9] = 0;
2324       buffer[10] = 0;
2325       buffer[11] = 0;
2326       buffer[12] = 0;
2327       buffer[13] = 0;
2328       /* Make reloc for the long disp */
2329       fix_new (fragP,
2330                fragP->fr_fix + 8,
2331                4,
2332                fragP->fr_symbol,
2333                fragP->fr_offset,
2334                0,
2335                BFD_RELOC_32);
2336       fragP->fr_fix += COND32_LENGTH;
2337       fragP->fr_var = 0;
2338       donerelax = 1;
2339 #endif
2340
2341       break;
2342
2343     default:
2344       abort ();
2345     }
2346
2347   if (donerelax && !sh_relax)
2348     as_warn_where (fragP->fr_file, fragP->fr_line,
2349                    _("overflow in branch to %s; converted into longer instruction sequence"),
2350                    (fragP->fr_symbol != NULL
2351                     ? S_GET_NAME (fragP->fr_symbol)
2352                     : ""));
2353 }
2354
2355 valueT
2356 md_section_align (seg, size)
2357      segT seg;
2358      valueT size;
2359 {
2360 #ifdef BFD_ASSEMBLER
2361 #ifdef OBJ_ELF
2362   return size;
2363 #else /* ! OBJ_ELF */
2364   return ((size + (1 << bfd_get_section_alignment (stdoutput, seg)) - 1)
2365           & (-1 << bfd_get_section_alignment (stdoutput, seg)));
2366 #endif /* ! OBJ_ELF */
2367 #else /* ! BFD_ASSEMBLER */
2368   return ((size + (1 << section_alignment[(int) seg]) - 1)
2369           & (-1 << section_alignment[(int) seg]));
2370 #endif /* ! BFD_ASSEMBLER */
2371 }
2372
2373 /* This static variable is set by s_uacons to tell sh_cons_align that
2374    the expession does not need to be aligned.  */
2375
2376 static int sh_no_align_cons = 0;
2377
2378 /* This handles the unaligned space allocation pseudo-ops, such as
2379    .uaword.  .uaword is just like .word, but the value does not need
2380    to be aligned.  */
2381
2382 static void
2383 s_uacons (bytes)
2384      int bytes;
2385 {
2386   /* Tell sh_cons_align not to align this value.  */
2387   sh_no_align_cons = 1;
2388   cons (bytes);
2389 }
2390
2391 /* If a .word, et. al., pseud-op is seen, warn if the value is not
2392    aligned correctly.  Note that this can cause warnings to be issued
2393    when assembling initialized structured which were declared with the
2394    packed attribute.  FIXME: Perhaps we should require an option to
2395    enable this warning?  */
2396
2397 void
2398 sh_cons_align (nbytes)
2399      int nbytes;
2400 {
2401   int nalign;
2402   char *p;
2403
2404   if (sh_no_align_cons)
2405     {
2406       /* This is an unaligned pseudo-op.  */
2407       sh_no_align_cons = 0;
2408       return;
2409     }
2410
2411   nalign = 0;
2412   while ((nbytes & 1) == 0)
2413     {
2414       ++nalign;
2415       nbytes >>= 1;
2416     }
2417
2418   if (nalign == 0)
2419     return;
2420
2421   if (now_seg == absolute_section)
2422     {
2423       if ((abs_section_offset & ((1 << nalign) - 1)) != 0)
2424         as_warn (_("misaligned data"));
2425       return;
2426     }
2427
2428   p = frag_var (rs_align_code, 1, 1, (relax_substateT) 0,
2429                 (symbolS *) NULL, (offsetT) nalign, (char *) NULL);
2430
2431   record_alignment (now_seg, nalign);
2432 }
2433
2434 /* When relaxing, we need to output a reloc for any .align directive
2435    that requests alignment to a four byte boundary or larger.  This is
2436    also where we check for misaligned data.  */
2437
2438 void
2439 sh_handle_align (frag)
2440      fragS *frag;
2441 {
2442   if (sh_relax
2443       && frag->fr_type == rs_align
2444       && frag->fr_address + frag->fr_fix > 0
2445       && frag->fr_offset > 1
2446       && now_seg != bss_section)
2447     fix_new (frag, frag->fr_fix, 2, &abs_symbol, frag->fr_offset, 0,
2448              BFD_RELOC_SH_ALIGN);
2449
2450   if (frag->fr_type == rs_align_code
2451       && frag->fr_next->fr_address - frag->fr_address - frag->fr_fix != 0)
2452     as_warn_where (frag->fr_file, frag->fr_line, _("misaligned data"));
2453 }
2454
2455 /* This macro decides whether a particular reloc is an entry in a
2456    switch table.  It is used when relaxing, because the linker needs
2457    to know about all such entries so that it can adjust them if
2458    necessary.  */
2459
2460 #ifdef BFD_ASSEMBLER
2461 #define SWITCH_TABLE_CONS(fix) (0)
2462 #else
2463 #define SWITCH_TABLE_CONS(fix)                          \
2464   ((fix)->fx_r_type == 0                                \
2465    && ((fix)->fx_size == 2                              \
2466        || (fix)->fx_size == 1                           \
2467        || (fix)->fx_size == 4))
2468 #endif
2469
2470 #define SWITCH_TABLE(fix)                               \
2471   ((fix)->fx_addsy != NULL                              \
2472    && (fix)->fx_subsy != NULL                           \
2473    && S_GET_SEGMENT ((fix)->fx_addsy) == text_section   \
2474    && S_GET_SEGMENT ((fix)->fx_subsy) == text_section   \
2475    && ((fix)->fx_r_type == BFD_RELOC_32                 \
2476        || (fix)->fx_r_type == BFD_RELOC_16              \
2477        || (fix)->fx_r_type == BFD_RELOC_8               \
2478        || SWITCH_TABLE_CONS (fix)))
2479
2480 /* See whether we need to force a relocation into the output file.
2481    This is used to force out switch and PC relative relocations when
2482    relaxing.  */
2483
2484 int
2485 sh_force_relocation (fix)
2486      fixS *fix;
2487 {
2488
2489   if (fix->fx_r_type == BFD_RELOC_VTABLE_INHERIT
2490       || fix->fx_r_type == BFD_RELOC_VTABLE_ENTRY
2491       || fix->fx_r_type == BFD_RELOC_SH_LOOP_START
2492       || fix->fx_r_type == BFD_RELOC_SH_LOOP_END)
2493     return 1;
2494
2495   if (! sh_relax)
2496     return 0;
2497
2498   return (fix->fx_pcrel
2499           || SWITCH_TABLE (fix)
2500           || fix->fx_r_type == BFD_RELOC_SH_COUNT
2501           || fix->fx_r_type == BFD_RELOC_SH_ALIGN
2502           || fix->fx_r_type == BFD_RELOC_SH_CODE
2503           || fix->fx_r_type == BFD_RELOC_SH_DATA
2504           || fix->fx_r_type == BFD_RELOC_SH_LABEL);
2505 }
2506
2507 #ifdef OBJ_ELF
2508 boolean
2509 sh_fix_adjustable (fixP)
2510    fixS *fixP;
2511 {
2512
2513   if (fixP->fx_addsy == NULL)
2514     return 1;
2515   
2516   /* We need the symbol name for the VTABLE entries */
2517   if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
2518       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
2519     return 0;
2520
2521   return 1;
2522 }
2523
2524 void
2525 sh_elf_final_processing ()
2526 {
2527   int val;
2528
2529   /* Set file-specific flags to indicate if this code needs
2530      a processor with the sh-dsp / sh3e ISA to execute.  */
2531   if (valid_arch & arch_sh1)
2532     val = EF_SH1;
2533   else if (valid_arch & arch_sh2)
2534     val = EF_SH2;
2535   else if (valid_arch & arch_sh_dsp)
2536     val = EF_SH_DSP;
2537   else if (valid_arch & arch_sh3)
2538     val = EF_SH3;
2539   else if (valid_arch & arch_sh3_dsp)
2540     val = EF_SH_DSP;
2541   else if (valid_arch & arch_sh3e)
2542     val = EF_SH3E;
2543   else if (valid_arch & arch_sh4)
2544     val = EF_SH4;
2545   else
2546     abort ();
2547
2548   elf_elfheader (stdoutput)->e_flags &= ~EF_SH_MACH_MASK;
2549   elf_elfheader (stdoutput)->e_flags |= val;
2550 }
2551 #endif
2552
2553 /* Apply a fixup to the object file.  */
2554
2555 #ifdef BFD_ASSEMBLER
2556 int
2557 md_apply_fix (fixP, valp)
2558      fixS *fixP;
2559      valueT *valp;
2560 #else
2561 void
2562 md_apply_fix (fixP, val)
2563      fixS *fixP;
2564      long val;
2565 #endif
2566 {
2567   char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
2568   int lowbyte = target_big_endian ? 1 : 0;
2569   int highbyte = target_big_endian ? 0 : 1;
2570 #ifdef BFD_ASSEMBLER
2571   long val = *valp;
2572 #endif
2573   long max, min;
2574   int shift;
2575
2576 #ifdef BFD_ASSEMBLER
2577   /* The function adjust_reloc_syms won't convert a reloc against a weak
2578      symbol into a reloc against a section, but bfd_install_relocation
2579      will screw up if the symbol is defined, so we have to adjust val here
2580      to avoid the screw up later.  */
2581   if (fixP->fx_addsy != NULL
2582       && S_IS_WEAK (fixP->fx_addsy))
2583     val -= S_GET_VALUE  (fixP->fx_addsy);
2584 #endif
2585
2586 #ifndef BFD_ASSEMBLER
2587   if (fixP->fx_r_type == 0)
2588     {
2589       if (fixP->fx_size == 2)
2590         fixP->fx_r_type = BFD_RELOC_16;
2591       else if (fixP->fx_size == 4)
2592         fixP->fx_r_type = BFD_RELOC_32;
2593       else if (fixP->fx_size == 1)
2594         fixP->fx_r_type = BFD_RELOC_8;
2595       else
2596         abort ();
2597     }
2598 #endif
2599
2600   max = min = 0;
2601   shift = 0;
2602   switch (fixP->fx_r_type)
2603     {
2604     case BFD_RELOC_SH_IMM4:
2605       max = 0xf;
2606       *buf = (*buf & 0xf0) | (val & 0xf);
2607       break;
2608
2609     case BFD_RELOC_SH_IMM4BY2:
2610       max = 0xf;
2611       shift = 1;
2612       *buf = (*buf & 0xf0) | ((val >> 1) & 0xf);
2613       break;
2614
2615     case BFD_RELOC_SH_IMM4BY4:
2616       max = 0xf;
2617       shift = 2;
2618       *buf = (*buf & 0xf0) | ((val >> 2) & 0xf);
2619       break;
2620
2621     case BFD_RELOC_SH_IMM8BY2:
2622       max = 0xff;
2623       shift = 1;
2624       *buf = val >> 1;
2625       break;
2626
2627     case BFD_RELOC_SH_IMM8BY4:
2628       max = 0xff;
2629       shift = 2;
2630       *buf = val >> 2;
2631       break;
2632
2633     case BFD_RELOC_8:
2634     case BFD_RELOC_SH_IMM8:
2635       /* Sometimes the 8 bit value is sign extended (e.g., add) and
2636          sometimes it is not (e.g., and).  We permit any 8 bit value.
2637          Note that adding further restrictions may invalidate
2638          reasonable looking assembly code, such as ``and -0x1,r0''.  */
2639       max = 0xff;
2640       min = - 0xff;
2641       *buf++ = val;
2642       break;
2643
2644     case BFD_RELOC_SH_PCRELIMM8BY4:
2645       /* The lower two bits of the PC are cleared before the
2646          displacement is added in.  We can assume that the destination
2647          is on a 4 byte bounday.  If this instruction is also on a 4
2648          byte boundary, then we want
2649            (target - here) / 4
2650          and target - here is a multiple of 4.
2651          Otherwise, we are on a 2 byte boundary, and we want
2652            (target - (here - 2)) / 4
2653          and target - here is not a multiple of 4.  Computing
2654            (target - (here - 2)) / 4 == (target - here + 2) / 4
2655          works for both cases, since in the first case the addition of
2656          2 will be removed by the division.  target - here is in the
2657          variable val.  */
2658       val = (val + 2) / 4;
2659       if (val & ~0xff)
2660         as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far"));
2661       buf[lowbyte] = val;
2662       break;
2663
2664     case BFD_RELOC_SH_PCRELIMM8BY2:
2665       val /= 2;
2666       if (val & ~0xff)
2667         as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far"));
2668       buf[lowbyte] = val;
2669       break;
2670
2671     case BFD_RELOC_SH_PCDISP8BY2:
2672       val /= 2;
2673       if (val < -0x80 || val > 0x7f)
2674         as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far"));
2675       buf[lowbyte] = val;
2676       break;
2677
2678     case BFD_RELOC_SH_PCDISP12BY2:
2679       val /= 2;
2680       if (val < -0x800 || val >= 0x7ff)
2681         as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far"));
2682       buf[lowbyte] = val & 0xff;
2683       buf[highbyte] |= (val >> 8) & 0xf;
2684       break;
2685
2686     case BFD_RELOC_32:
2687       if (! target_big_endian) 
2688         {
2689           *buf++ = val >> 0;
2690           *buf++ = val >> 8;
2691           *buf++ = val >> 16;
2692           *buf++ = val >> 24;
2693         }
2694       else 
2695         {
2696           *buf++ = val >> 24;
2697           *buf++ = val >> 16;
2698           *buf++ = val >> 8;
2699           *buf++ = val >> 0;
2700         }
2701       break;
2702
2703     case BFD_RELOC_16:
2704       if (! target_big_endian)
2705         {
2706           *buf++ = val >> 0;
2707           *buf++ = val >> 8;
2708         } 
2709       else 
2710         {
2711           *buf++ = val >> 8;
2712           *buf++ = val >> 0;
2713         }
2714       break;
2715
2716     case BFD_RELOC_SH_USES:
2717       /* Pass the value into sh_coff_reloc_mangle.  */
2718       fixP->fx_addnumber = val;
2719       break;
2720
2721     case BFD_RELOC_SH_COUNT:
2722     case BFD_RELOC_SH_ALIGN:
2723     case BFD_RELOC_SH_CODE:
2724     case BFD_RELOC_SH_DATA:
2725     case BFD_RELOC_SH_LABEL:
2726       /* Nothing to do here.  */
2727       break;
2728
2729     case BFD_RELOC_SH_LOOP_START:
2730     case BFD_RELOC_SH_LOOP_END:
2731
2732     case BFD_RELOC_VTABLE_INHERIT:
2733     case BFD_RELOC_VTABLE_ENTRY:
2734       fixP->fx_done = 0;
2735 #ifdef BFD_ASSEMBLER
2736       return 0;
2737 #else
2738       return;
2739 #endif
2740
2741     default:
2742       abort ();
2743     }
2744
2745   if (shift != 0)
2746     {
2747       if ((val & ((1 << shift) - 1)) != 0)
2748         as_bad_where (fixP->fx_file, fixP->fx_line, _("misaligned offset"));
2749       if (val >= 0)
2750         val >>= shift;
2751       else
2752         val = ((val >> shift)
2753                | ((long) -1 & ~ ((long) -1 >> shift)));
2754     }
2755   if (max != 0 && (val < min || val > max))
2756     as_bad_where (fixP->fx_file, fixP->fx_line, _("offset out of range"));
2757
2758 #ifdef BFD_ASSEMBLER
2759   return 0;
2760 #endif
2761 }
2762
2763 /* Called just before address relaxation.  Return the length
2764    by which a fragment must grow to reach it's destination.  */
2765
2766 int
2767 md_estimate_size_before_relax (fragP, segment_type)
2768      register fragS *fragP;
2769      register segT segment_type;
2770 {
2771   switch (fragP->fr_subtype)
2772     {
2773     case C (UNCOND_JUMP, UNDEF_DISP):
2774       /* Used to be a branch to somewhere which was unknown.  */
2775       if (!fragP->fr_symbol)
2776         {
2777           fragP->fr_subtype = C (UNCOND_JUMP, UNCOND12);
2778           fragP->fr_var = md_relax_table[C (UNCOND_JUMP, UNCOND12)].rlx_length;
2779         }
2780       else if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
2781         {
2782           fragP->fr_subtype = C (UNCOND_JUMP, UNCOND12);
2783           fragP->fr_var = md_relax_table[C (UNCOND_JUMP, UNCOND12)].rlx_length;
2784         }
2785       else
2786         {
2787           fragP->fr_subtype = C (UNCOND_JUMP, UNDEF_WORD_DISP);
2788           fragP->fr_var = md_relax_table[C (UNCOND_JUMP, UNCOND32)].rlx_length;
2789           return md_relax_table[C (UNCOND_JUMP, UNCOND32)].rlx_length;
2790         }
2791       break;
2792
2793     default:
2794       abort ();
2795     case C (COND_JUMP, UNDEF_DISP):
2796     case C (COND_JUMP_DELAY, UNDEF_DISP):
2797       /* Used to be a branch to somewhere which was unknown.  */
2798       if (fragP->fr_symbol
2799           && S_GET_SEGMENT (fragP->fr_symbol) == segment_type)
2800         {
2801           int what = GET_WHAT (fragP->fr_subtype);
2802           /* Got a symbol and it's defined in this segment, become byte
2803              sized - maybe it will fix up.  */
2804           fragP->fr_subtype = C (what, COND8);
2805           fragP->fr_var = md_relax_table[C (what, COND8)].rlx_length;
2806         }
2807       else if (fragP->fr_symbol)
2808         {
2809           int what = GET_WHAT (fragP->fr_subtype);
2810           /* Its got a segment, but its not ours, so it will always be long.  */
2811           fragP->fr_subtype = C (what, UNDEF_WORD_DISP);
2812           fragP->fr_var = md_relax_table[C (what, COND32)].rlx_length;
2813           return md_relax_table[C (what, COND32)].rlx_length;
2814         }
2815       else
2816         {
2817           int what = GET_WHAT (fragP->fr_subtype);
2818           /* We know the abs value.  */
2819           fragP->fr_subtype = C (what, COND8);
2820           fragP->fr_var = md_relax_table[C (what, COND8)].rlx_length;
2821         }
2822
2823       break;
2824     }
2825   return fragP->fr_var;
2826 }
2827
2828 /* Put number into target byte order.  */
2829
2830 void
2831 md_number_to_chars (ptr, use, nbytes)
2832      char *ptr;
2833      valueT use;
2834      int nbytes;
2835 {
2836   if (! target_big_endian)
2837     number_to_chars_littleendian (ptr, use, nbytes);
2838   else
2839     number_to_chars_bigendian (ptr, use, nbytes);
2840 }
2841
2842 long
2843 md_pcrel_from (fixP)
2844      fixS *fixP;
2845 {
2846   return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address + 2;
2847 }
2848
2849 #ifdef OBJ_COFF
2850
2851 int
2852 tc_coff_sizemachdep (frag)
2853      fragS *frag;
2854 {
2855   return md_relax_table[frag->fr_subtype].rlx_length;
2856 }
2857
2858 #endif /* OBJ_COFF */
2859
2860 /* When we align the .text section, insert the correct NOP pattern.  */
2861
2862 int
2863 sh_do_align (n, fill, len, max)
2864      int n;
2865      const char *fill;
2866      int len ATTRIBUTE_UNUSED;
2867      int max;
2868 {
2869   if (fill == NULL
2870       && subseg_text_p (now_seg)
2871       && n > 1)
2872     {
2873       static const unsigned char big_nop_pattern[] = { 0x00, 0x09 };
2874       static const unsigned char little_nop_pattern[] = { 0x09, 0x00 };
2875
2876       /* First align to a 2 byte boundary, in case there is an odd
2877          .byte.  */
2878       frag_align (1, 0, 0);
2879       if (target_big_endian)
2880         frag_align_pattern (n, big_nop_pattern, sizeof big_nop_pattern, max);
2881       else
2882         frag_align_pattern (n, little_nop_pattern, sizeof little_nop_pattern,
2883                             max);
2884       return 1;
2885     }
2886
2887   return 0;
2888 }
2889
2890 #ifndef BFD_ASSEMBLER
2891 #ifdef OBJ_COFF
2892
2893 /* Map BFD relocs to SH COFF relocs.  */
2894
2895 struct reloc_map
2896 {
2897   bfd_reloc_code_real_type bfd_reloc;
2898   int sh_reloc;
2899 };
2900
2901 static const struct reloc_map coff_reloc_map[] =
2902 {
2903   { BFD_RELOC_32, R_SH_IMM32 },
2904   { BFD_RELOC_16, R_SH_IMM16 },
2905   { BFD_RELOC_8, R_SH_IMM8 },
2906   { BFD_RELOC_SH_PCDISP8BY2, R_SH_PCDISP8BY2 },
2907   { BFD_RELOC_SH_PCDISP12BY2, R_SH_PCDISP },
2908   { BFD_RELOC_SH_IMM4, R_SH_IMM4 },
2909   { BFD_RELOC_SH_IMM4BY2, R_SH_IMM4BY2 },
2910   { BFD_RELOC_SH_IMM4BY4, R_SH_IMM4BY4 },
2911   { BFD_RELOC_SH_IMM8, R_SH_IMM8 },
2912   { BFD_RELOC_SH_IMM8BY2, R_SH_IMM8BY2 },
2913   { BFD_RELOC_SH_IMM8BY4, R_SH_IMM8BY4 },
2914   { BFD_RELOC_SH_PCRELIMM8BY2, R_SH_PCRELIMM8BY2 },
2915   { BFD_RELOC_SH_PCRELIMM8BY4, R_SH_PCRELIMM8BY4 },
2916   { BFD_RELOC_8_PCREL, R_SH_SWITCH8 },
2917   { BFD_RELOC_SH_SWITCH16, R_SH_SWITCH16 },
2918   { BFD_RELOC_SH_SWITCH32, R_SH_SWITCH32 },
2919   { BFD_RELOC_SH_USES, R_SH_USES },
2920   { BFD_RELOC_SH_COUNT, R_SH_COUNT },
2921   { BFD_RELOC_SH_ALIGN, R_SH_ALIGN },
2922   { BFD_RELOC_SH_CODE, R_SH_CODE },
2923   { BFD_RELOC_SH_DATA, R_SH_DATA },
2924   { BFD_RELOC_SH_LABEL, R_SH_LABEL },
2925   { BFD_RELOC_UNUSED, 0 }
2926 };
2927
2928 /* Adjust a reloc for the SH.  This is similar to the generic code,
2929    but does some minor tweaking.  */
2930
2931 void
2932 sh_coff_reloc_mangle (seg, fix, intr, paddr)
2933      segment_info_type *seg;
2934      fixS *fix;
2935      struct internal_reloc *intr;
2936      unsigned int paddr;
2937 {
2938   symbolS *symbol_ptr = fix->fx_addsy;
2939   symbolS *dot;
2940
2941   intr->r_vaddr = paddr + fix->fx_frag->fr_address + fix->fx_where;
2942
2943   if (! SWITCH_TABLE (fix))
2944     {
2945       const struct reloc_map *rm;
2946
2947       for (rm = coff_reloc_map; rm->bfd_reloc != BFD_RELOC_UNUSED; rm++)
2948         if (rm->bfd_reloc == (bfd_reloc_code_real_type) fix->fx_r_type)
2949           break;
2950       if (rm->bfd_reloc == BFD_RELOC_UNUSED)
2951         as_bad_where (fix->fx_file, fix->fx_line,
2952                       _("Can not represent %s relocation in this object file format"),
2953                       bfd_get_reloc_code_name (fix->fx_r_type));
2954       intr->r_type = rm->sh_reloc;
2955       intr->r_offset = 0;
2956     }
2957   else
2958     {
2959       know (sh_relax);
2960
2961       if (fix->fx_r_type == BFD_RELOC_16)
2962         intr->r_type = R_SH_SWITCH16;
2963       else if (fix->fx_r_type == BFD_RELOC_8)
2964         intr->r_type = R_SH_SWITCH8;
2965       else if (fix->fx_r_type == BFD_RELOC_32)
2966         intr->r_type = R_SH_SWITCH32;
2967       else
2968         abort ();
2969
2970       /* For a switch reloc, we set r_offset to the difference between
2971          the reloc address and the subtrahend.  When the linker is
2972          doing relaxing, it can use the determine the starting and
2973          ending points of the switch difference expression.  */
2974       intr->r_offset = intr->r_vaddr - S_GET_VALUE (fix->fx_subsy);
2975     }
2976
2977   /* PC relative relocs are always against the current section.  */
2978   if (symbol_ptr == NULL)
2979     {
2980       switch (fix->fx_r_type)
2981         {
2982         case BFD_RELOC_SH_PCRELIMM8BY2:
2983         case BFD_RELOC_SH_PCRELIMM8BY4:
2984         case BFD_RELOC_SH_PCDISP8BY2:
2985         case BFD_RELOC_SH_PCDISP12BY2:
2986         case BFD_RELOC_SH_USES:
2987           symbol_ptr = seg->dot;
2988           break;
2989         default:
2990           break;
2991         }
2992     }
2993
2994   if (fix->fx_r_type == BFD_RELOC_SH_USES)
2995     {
2996       /* We can't store the offset in the object file, since this
2997          reloc does not take up any space, so we store it in r_offset.
2998          The fx_addnumber field was set in md_apply_fix.  */
2999       intr->r_offset = fix->fx_addnumber;
3000     }
3001   else if (fix->fx_r_type == BFD_RELOC_SH_COUNT)
3002     {
3003       /* We can't store the count in the object file, since this reloc
3004          does not take up any space, so we store it in r_offset.  The
3005          fx_offset field was set when the fixup was created in
3006          sh_coff_frob_file.  */
3007       intr->r_offset = fix->fx_offset;
3008       /* This reloc is always absolute.  */
3009       symbol_ptr = NULL;
3010     }
3011   else if (fix->fx_r_type == BFD_RELOC_SH_ALIGN)
3012     {
3013       /* Store the alignment in the r_offset field.  */
3014       intr->r_offset = fix->fx_offset;
3015       /* This reloc is always absolute.  */
3016       symbol_ptr = NULL;
3017     }
3018   else if (fix->fx_r_type == BFD_RELOC_SH_CODE
3019            || fix->fx_r_type == BFD_RELOC_SH_DATA
3020            || fix->fx_r_type == BFD_RELOC_SH_LABEL)
3021     {
3022       /* These relocs are always absolute.  */
3023       symbol_ptr = NULL;
3024     }
3025
3026   /* Turn the segment of the symbol into an offset.  */
3027   if (symbol_ptr != NULL)
3028     {
3029       dot = segment_info[S_GET_SEGMENT (symbol_ptr)].dot;
3030       if (dot != NULL)
3031         intr->r_symndx = dot->sy_number;
3032       else
3033         intr->r_symndx = symbol_ptr->sy_number;
3034     }
3035   else
3036     intr->r_symndx = -1;
3037 }
3038
3039 #endif /* OBJ_COFF */
3040 #endif /* ! BFD_ASSEMBLER */
3041
3042 #ifdef BFD_ASSEMBLER
3043
3044 /* Create a reloc.  */
3045
3046 arelent *
3047 tc_gen_reloc (section, fixp)
3048      asection *section ATTRIBUTE_UNUSED;
3049      fixS *fixp;
3050 {
3051   arelent *rel;
3052   bfd_reloc_code_real_type r_type;
3053
3054   rel = (arelent *) xmalloc (sizeof (arelent));
3055   rel->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
3056   *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
3057   rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
3058
3059   r_type = fixp->fx_r_type;
3060
3061   if (SWITCH_TABLE (fixp))
3062     {
3063       rel->addend = rel->address - S_GET_VALUE (fixp->fx_subsy);
3064       if (r_type == BFD_RELOC_16)
3065         r_type = BFD_RELOC_SH_SWITCH16;
3066       else if (r_type == BFD_RELOC_8)
3067         r_type = BFD_RELOC_8_PCREL;
3068       else if (r_type == BFD_RELOC_32)
3069         r_type = BFD_RELOC_SH_SWITCH32;
3070       else
3071         abort ();
3072     }
3073   else if (r_type == BFD_RELOC_SH_USES)
3074     rel->addend = fixp->fx_addnumber;
3075   else if (r_type == BFD_RELOC_SH_COUNT)
3076     rel->addend = fixp->fx_offset;
3077   else if (r_type == BFD_RELOC_SH_ALIGN)
3078     rel->addend = fixp->fx_offset;
3079   else if (r_type == BFD_RELOC_VTABLE_INHERIT
3080            || r_type == BFD_RELOC_VTABLE_ENTRY)
3081     rel->addend = fixp->fx_offset;
3082   else if (r_type == BFD_RELOC_SH_LOOP_START
3083            || r_type == BFD_RELOC_SH_LOOP_END)
3084     rel->addend = fixp->fx_offset;
3085   else if (r_type == BFD_RELOC_SH_LABEL && fixp->fx_pcrel)
3086     {
3087       rel->addend = 0;
3088       rel->address = rel->addend = fixp->fx_offset;
3089     }
3090   else if (fixp->fx_pcrel)
3091     rel->addend = fixp->fx_addnumber;
3092   else
3093     rel->addend = 0;
3094
3095   rel->howto = bfd_reloc_type_lookup (stdoutput, r_type);
3096   if (rel->howto == NULL)
3097     {
3098       as_bad_where (fixp->fx_file, fixp->fx_line,
3099                     _("Cannot represent relocation type %s"),
3100                     bfd_get_reloc_code_name (r_type));
3101       /* Set howto to a garbage value so that we can keep going.  */
3102       rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
3103       assert (rel->howto != NULL);
3104     }
3105
3106   return rel;
3107 }
3108
3109 #endif /* BFD_ASSEMBLER */