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