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