Add support for the M32R2 processor.
[deliverable/binutils-gdb.git] / gas / config / tc-m32r.c
... / ...
CommitLineData
1/* tc-m32r.c -- Assembler for the Renesas M32R.
2 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
3 Free Software Foundation, Inc.
4
5 This file is part of GAS, the GNU Assembler.
6
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GAS is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
21
22#include <stdio.h>
23#include "as.h"
24#include "safe-ctype.h"
25#include "subsegs.h"
26#include "symcat.h"
27#include "opcodes/m32r-desc.h"
28#include "opcodes/m32r-opc.h"
29#include "cgen.h"
30#include "elf/m32r.h"
31
32/* Linked list of symbols that are debugging symbols to be defined as the
33 beginning of the current instruction. */
34typedef struct sym_link
35{
36 struct sym_link *next;
37 symbolS *symbol;
38} sym_linkS;
39
40static sym_linkS *debug_sym_link = (sym_linkS *) 0;
41
42/* Structure to hold all of the different components describing
43 an individual instruction. */
44typedef struct
45{
46 const CGEN_INSN *insn;
47 const CGEN_INSN *orig_insn;
48 CGEN_FIELDS fields;
49#if CGEN_INT_INSN_P
50 CGEN_INSN_INT buffer[1];
51#define INSN_VALUE(buf) (*(buf))
52#else
53 unsigned char buffer[CGEN_MAX_INSN_SIZE];
54#define INSN_VALUE(buf) (buf)
55#endif
56 char *addr;
57 fragS *frag;
58 int num_fixups;
59 fixS *fixups[GAS_CGEN_MAX_FIXUPS];
60 int indices[MAX_OPERAND_INSTANCES];
61 sym_linkS *debug_sym_link;
62}
63m32r_insn;
64
65/* prev_insn.insn is non-null if last insn was a 16 bit insn on a 32 bit
66 boundary (i.e. was the first of two 16 bit insns). */
67static m32r_insn prev_insn;
68
69/* Non-zero if we've seen a relaxable insn since the last 32 bit
70 alignment request. */
71static int seen_relaxable_p = 0;
72
73/* Non-zero if -relax specified, in which case sufficient relocs are output
74 for the linker to do relaxing.
75 We do simple forms of relaxing internally, but they are always done.
76 This flag does not apply to them. */
77static int m32r_relax;
78
79#if 0
80/* Not supported yet. */
81/* If non-NULL, pointer to cpu description file to read.
82 This allows runtime additions to the assembler. */
83static const char *m32r_cpu_desc;
84#endif
85
86/* Non-zero if warn when a high/shigh reloc has no matching low reloc.
87 Each high/shigh reloc must be paired with it's low cousin in order to
88 properly calculate the addend in a relocatable link (since there is a
89 potential carry from the low to the high/shigh).
90 This option is off by default though for user-written assembler code it
91 might make sense to make the default be on (i.e. have gcc pass a flag
92 to turn it off). This warning must not be on for GCC created code as
93 optimization may delete the low but not the high/shigh (at least we
94 shouldn't assume or require it to). */
95static int warn_unmatched_high = 0;
96
97/* 1 if -m32rx has been specified, in which case support for
98 the extended M32RX instruction set should be enabled.
99 2 if -m32r2 has been specified, in which case support for
100 the extended M32R2 instruction set should be enabled. */
101static int enable_m32rx = 0; /* Default to M32R. */
102
103/* Non-zero if -m32rx -hidden has been specified, in which case support for
104 the special M32RX instruction set should be enabled. */
105static int enable_special = 0;
106
107/* Non-zero if -bitinst has been specified, in which case support
108 for extended M32R bit-field instruction set should be enabled. */
109static int enable_special_m32r = 0;
110
111/* Non-zero if -float has been specified, in which case support for
112 extended M32R floating point instruction set should be enabled. */
113static int enable_special_float = 0;
114
115/* Non-zero if the programmer should be warned when an explicit parallel
116 instruction might have constraint violations. */
117static int warn_explicit_parallel_conflicts = 1;
118
119/* Non-zero if the programmer should receive an error message when an
120 explicit parallel instruction might have constraint violations. */
121static int error_explicit_parallel_conflicts = 1;
122
123/* Non-zero if insns can be made parallel. */
124static int use_parallel = 1;
125
126/* Non-zero if optimizations should be performed. */
127static int optimize;
128
129/* m32r er_flags. */
130static int m32r_flags = 0;
131
132/* Stuff for .scomm symbols. */
133static segT sbss_section;
134static asection scom_section;
135static asymbol scom_symbol;
136
137const char comment_chars[] = ";";
138const char line_comment_chars[] = "#";
139const char line_separator_chars[] = "!";
140const char EXP_CHARS[] = "eE";
141const char FLT_CHARS[] = "dD";
142
143/* Relocations against symbols are done in two
144 parts, with a HI relocation and a LO relocation. Each relocation
145 has only 16 bits of space to store an addend. This means that in
146 order for the linker to handle carries correctly, it must be able
147 to locate both the HI and the LO relocation. This means that the
148 relocations must appear in order in the relocation table.
149
150 In order to implement this, we keep track of each unmatched HI
151 relocation. We then sort them so that they immediately precede the
152 corresponding LO relocation. */
153
154struct m32r_hi_fixup
155{
156 /* Next HI fixup. */
157 struct m32r_hi_fixup *next;
158
159 /* This fixup. */
160 fixS *fixp;
161
162 /* The section this fixup is in. */
163 segT seg;
164};
165
166/* The list of unmatched HI relocs. */
167
168static struct m32r_hi_fixup *m32r_hi_fixup_list;
169\f
170struct {
171 enum bfd_architecture bfd_mach;
172 int mach_flags;
173} mach_table[] =
174{
175 { bfd_mach_m32r, (1<<MACH_M32R) },
176 { bfd_mach_m32rx, (1<<MACH_M32RX) },
177 { bfd_mach_m32r2, (1<<MACH_M32R2) }
178};
179
180static void allow_m32rx (int);
181
182static void
183allow_m32rx (int on)
184{
185 enable_m32rx = on;
186
187 if (stdoutput != NULL)
188 bfd_set_arch_mach (stdoutput, TARGET_ARCH, mach_table[on].bfd_mach);
189
190 if (gas_cgen_cpu_desc != NULL)
191 gas_cgen_cpu_desc->machs = mach_table[on].mach_flags;
192}
193\f
194#define M32R_SHORTOPTS "O"
195
196const char *md_shortopts = M32R_SHORTOPTS;
197
198struct option md_longopts[] =
199{
200#define OPTION_M32R (OPTION_MD_BASE)
201#define OPTION_M32RX (OPTION_M32R + 1)
202#define OPTION_M32R2 (OPTION_M32RX + 1)
203#define OPTION_BIG (OPTION_M32R2 + 1)
204#define OPTION_LITTLE (OPTION_BIG + 1)
205#define OPTION_PARALLEL (OPTION_LITTLE + 1)
206#define OPTION_NO_PARALLEL (OPTION_PARALLEL + 1)
207#define OPTION_WARN_PARALLEL (OPTION_NO_PARALLEL + 1)
208#define OPTION_NO_WARN_PARALLEL (OPTION_WARN_PARALLEL + 1)
209#define OPTION_ERROR_PARALLEL (OPTION_NO_WARN_PARALLEL + 1)
210#define OPTION_NO_ERROR_PARALLEL (OPTION_ERROR_PARALLEL + 1)
211#define OPTION_SPECIAL (OPTION_NO_ERROR_PARALLEL + 1)
212#define OPTION_SPECIAL_M32R (OPTION_SPECIAL + 1)
213#define OPTION_SPECIAL_FLOAT (OPTION_SPECIAL_M32R + 1)
214#define OPTION_WARN_UNMATCHED (OPTION_SPECIAL_FLOAT + 1)
215#define OPTION_NO_WARN_UNMATCHED (OPTION_WARN_UNMATCHED + 1)
216 {"m32r", no_argument, NULL, OPTION_M32R},
217 {"m32rx", no_argument, NULL, OPTION_M32RX},
218 {"m32r2", no_argument, NULL, OPTION_M32R2},
219 {"big", no_argument, NULL, OPTION_BIG},
220 {"little", no_argument, NULL, OPTION_LITTLE},
221 {"EB", no_argument, NULL, OPTION_BIG},
222 {"EL", no_argument, NULL, OPTION_LITTLE},
223 {"parallel", no_argument, NULL, OPTION_PARALLEL},
224 {"no-parallel", no_argument, NULL, OPTION_NO_PARALLEL},
225 {"warn-explicit-parallel-conflicts", no_argument, NULL, OPTION_WARN_PARALLEL},
226 {"Wp", no_argument, NULL, OPTION_WARN_PARALLEL},
227 {"no-warn-explicit-parallel-conflicts", no_argument, NULL, OPTION_NO_WARN_PARALLEL},
228 {"Wnp", no_argument, NULL, OPTION_NO_WARN_PARALLEL},
229 {"error-explicit-parallel-conflicts", no_argument, NULL, OPTION_ERROR_PARALLEL},
230 {"Ep", no_argument, NULL, OPTION_ERROR_PARALLEL},
231 {"no-error-explicit-parallel-conflicts", no_argument, NULL, OPTION_NO_ERROR_PARALLEL},
232 {"Enp", no_argument, NULL, OPTION_NO_ERROR_PARALLEL},
233 {"hidden", no_argument, NULL, OPTION_SPECIAL},
234 {"bitinst", no_argument, NULL, OPTION_SPECIAL_M32R},
235 {"float", no_argument, NULL, OPTION_SPECIAL_FLOAT},
236 /* Sigh. I guess all warnings must now have both variants. */
237 {"warn-unmatched-high", no_argument, NULL, OPTION_WARN_UNMATCHED},
238 {"Wuh", no_argument, NULL, OPTION_WARN_UNMATCHED},
239 {"no-warn-unmatched-high", no_argument, NULL, OPTION_NO_WARN_UNMATCHED},
240 {"Wnuh", no_argument, NULL, OPTION_NO_WARN_UNMATCHED},
241
242#if 0
243 /* Not supported yet. */
244#define OPTION_RELAX (OPTION_NO_WARN_UNMATCHED + 1)
245#define OPTION_CPU_DESC (OPTION_RELAX + 1)
246 {"relax", no_argument, NULL, OPTION_RELAX},
247 {"cpu-desc", required_argument, NULL, OPTION_CPU_DESC},
248#endif
249 {NULL, no_argument, NULL, 0}
250};
251
252size_t md_longopts_size = sizeof (md_longopts);
253
254static void little (int);
255static int parallel (void);
256
257static void
258little (int on)
259{
260 target_big_endian = ! on;
261}
262
263/* Use parallel execution. */
264
265static int
266parallel (void)
267{
268 if (! enable_m32rx)
269 return 0;
270
271 if (use_parallel == 1)
272 return 1;
273
274 return 0;
275}
276
277int
278md_parse_option (c, arg)
279 int c;
280 char *arg ATTRIBUTE_UNUSED;
281{
282 switch (c)
283 {
284 case 'O':
285 optimize = 1;
286 use_parallel = 1;
287 break;
288
289 case OPTION_M32R:
290 allow_m32rx (0);
291 break;
292
293 case OPTION_M32RX:
294 allow_m32rx (1);
295 break;
296
297 case OPTION_M32R2:
298 allow_m32rx (2);
299 enable_special = 1;
300 enable_special_m32r = 1;
301 break;
302
303 case OPTION_BIG:
304 target_big_endian = 1;
305 break;
306
307 case OPTION_LITTLE:
308 target_big_endian = 0;
309 break;
310
311 case OPTION_PARALLEL:
312 use_parallel = 1;
313 break;
314
315 case OPTION_NO_PARALLEL:
316 use_parallel = 0;
317 break;
318
319 case OPTION_WARN_PARALLEL:
320 warn_explicit_parallel_conflicts = 1;
321 error_explicit_parallel_conflicts = 0;
322 break;
323
324 case OPTION_NO_WARN_PARALLEL:
325 warn_explicit_parallel_conflicts = 0;
326 error_explicit_parallel_conflicts = 0;
327 break;
328
329 case OPTION_ERROR_PARALLEL:
330 warn_explicit_parallel_conflicts = 1;
331 error_explicit_parallel_conflicts = 1;
332 break;
333
334 case OPTION_NO_ERROR_PARALLEL:
335 error_explicit_parallel_conflicts = 0;
336 warn_explicit_parallel_conflicts = 0;
337 break;
338
339 case OPTION_SPECIAL:
340 if (enable_m32rx)
341 enable_special = 1;
342 else
343 {
344 /* Pretend that we do not recognise this option. */
345 as_bad (_("Unrecognised option: -hidden"));
346 return 0;
347 }
348 break;
349
350 case OPTION_SPECIAL_M32R:
351 enable_special_m32r = 1;
352 break;
353
354 case OPTION_SPECIAL_FLOAT:
355 enable_special_float = 1;
356 break;
357
358 case OPTION_WARN_UNMATCHED:
359 warn_unmatched_high = 1;
360 break;
361
362 case OPTION_NO_WARN_UNMATCHED:
363 warn_unmatched_high = 0;
364 break;
365
366#if 0
367 /* Not supported yet. */
368 case OPTION_RELAX:
369 m32r_relax = 1;
370 break;
371 case OPTION_CPU_DESC:
372 m32r_cpu_desc = arg;
373 break;
374#endif
375
376 default:
377 return 0;
378 }
379
380 return 1;
381}
382
383void
384md_show_usage (stream)
385 FILE *stream;
386{
387 fprintf (stream, _(" M32R specific command line options:\n"));
388
389 fprintf (stream, _("\
390 -m32r disable support for the m32rx instruction set\n"));
391 fprintf (stream, _("\
392 -m32rx support the extended m32rx instruction set\n"));
393 fprintf (stream, _("\
394 -m32r2 support the extended m32r2 instruction set\n"));
395 fprintf (stream, _("\
396 -EL,-little produce little endian code and data\n"));
397 fprintf (stream, _("\
398 -EB,-big produce big endian code and data\n"));
399 fprintf (stream, _("\
400 -parallel try to combine instructions in parallel\n"));
401 fprintf (stream, _("\
402 -no-parallel disable -parallel\n"));
403 fprintf (stream, _("\
404 -O try to optimize code. Implies -parallel\n"));
405
406 fprintf (stream, _("\
407 -warn-explicit-parallel-conflicts warn when parallel instructions\n"));
408 fprintf (stream, _("\
409 violate contraints\n"));
410 fprintf (stream, _("\
411 -no-warn-explicit-parallel-conflicts do not warn when parallel\n"));
412 fprintf (stream, _("\
413 instructions violate contraints\n"));
414 fprintf (stream, _("\
415 -Wp synonym for -warn-explicit-parallel-conflicts\n"));
416 fprintf (stream, _("\
417 -Wnp synonym for -no-warn-explicit-parallel-conflicts\n"));
418 fprintf (stream, _("\
419 -error-explicit-parallel-conflicts error when parallel instructions\n"));
420 fprintf (stream, _("\
421 violate contraints\n"));
422 fprintf (stream, _("\
423 -no-error-explicit-parallel-conflicts do not error when parallel\n"));
424 fprintf (stream, _("\
425 instructions violate contraints\n"));
426 fprintf (stream, _("\
427 -Ep synonym for -error-explicit-parallel-conflicts\n"));
428 fprintf (stream, _("\
429 -Enp synonym for -no-error-explicit-parallel-conflicts\n"));
430
431 fprintf (stream, _("\
432 -warn-unmatched-high warn when an (s)high reloc has no matching low reloc\n"));
433 fprintf (stream, _("\
434 -no-warn-unmatched-high do not warn about missing low relocs\n"));
435 fprintf (stream, _("\
436 -Wuh synonym for -warn-unmatched-high\n"));
437 fprintf (stream, _("\
438 -Wnuh synonym for -no-warn-unmatched-high\n"));
439
440#if 0
441 fprintf (stream, _("\
442 -relax create linker relaxable code\n"));
443 fprintf (stream, _("\
444 -cpu-desc provide runtime cpu description file\n"));
445#endif
446}
447
448static void fill_insn PARAMS ((int));
449static void m32r_scomm PARAMS ((int));
450static void debug_sym PARAMS ((int));
451static void expand_debug_syms PARAMS ((sym_linkS *, int));
452
453/* Set by md_assemble for use by m32r_fill_insn. */
454static subsegT prev_subseg;
455static segT prev_seg;
456
457/* The target specific pseudo-ops which we support. */
458const pseudo_typeS md_pseudo_table[] =
459{
460 { "word", cons, 4 },
461 { "fillinsn", fill_insn, 0 },
462 { "scomm", m32r_scomm, 0 },
463 { "debugsym", debug_sym, 0 },
464 { "m32r", allow_m32rx, 0 },
465 { "m32rx", allow_m32rx, 1 },
466 { "m32r2", allow_m32rx, 2 },
467 { "little", little, 1 },
468 { "big", little, 0 },
469 { NULL, NULL, 0 }
470};
471
472/* FIXME: Should be machine generated. */
473#define NOP_INSN 0x7000
474#define PAR_NOP_INSN 0xf000 /* Can only be used in 2nd slot. */
475
476/* This is called from HANDLE_ALIGN in write.c. Fill in the contents
477 of an rs_align_code fragment. */
478
479void
480m32r_handle_align (fragp)
481 fragS *fragp;
482{
483 static const unsigned char nop_pattern[] = { 0xf0, 0x00 };
484 static const unsigned char multi_nop_pattern[] = { 0x70, 0x00, 0xf0, 0x00 };
485
486 int bytes, fix;
487 char *p;
488
489 if (fragp->fr_type != rs_align_code)
490 return;
491
492 bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
493 p = fragp->fr_literal + fragp->fr_fix;
494 fix = 0;
495
496 if (bytes & 1)
497 {
498 fix = 1;
499 *p++ = 0;
500 bytes--;
501 }
502
503 if (bytes & 2)
504 {
505 memcpy (p, nop_pattern, 2);
506 p += 2;
507 bytes -= 2;
508 fix += 2;
509 }
510
511 memcpy (p, multi_nop_pattern, 4);
512
513 fragp->fr_fix += fix;
514 fragp->fr_var = 4;
515}
516
517/* If the last instruction was the first of 2 16 bit insns,
518 output a nop to move the PC to a 32 bit boundary.
519
520 This is done via an alignment specification since branch relaxing
521 may make it unnecessary.
522
523 Internally, we need to output one of these each time a 32 bit insn is
524 seen after an insn that is relaxable. */
525
526static void
527fill_insn (ignore)
528 int ignore ATTRIBUTE_UNUSED;
529{
530 frag_align_code (2, 0);
531 prev_insn.insn = NULL;
532 seen_relaxable_p = 0;
533}
534
535/* Record the symbol so that when we output the insn, we can create
536 a symbol that is at the start of the instruction. This is used
537 to emit the label for the start of a breakpoint without causing
538 the assembler to emit a NOP if the previous instruction was a
539 16 bit instruction. */
540
541static void
542debug_sym (ignore)
543 int ignore ATTRIBUTE_UNUSED;
544{
545 register char *name;
546 register char delim;
547 register char *end_name;
548 register symbolS *symbolP;
549 register sym_linkS *link;
550
551 name = input_line_pointer;
552 delim = get_symbol_end ();
553 end_name = input_line_pointer;
554
555 if ((symbolP = symbol_find (name)) == NULL
556 && (symbolP = md_undefined_symbol (name)) == NULL)
557 {
558 symbolP = symbol_new (name, undefined_section, 0, &zero_address_frag);
559 }
560
561 symbol_table_insert (symbolP);
562 if (S_IS_DEFINED (symbolP) && S_GET_SEGMENT (symbolP) != reg_section)
563 /* xgettext:c-format */
564 as_bad (_("symbol `%s' already defined"), S_GET_NAME (symbolP));
565
566 else
567 {
568 link = (sym_linkS *) xmalloc (sizeof (sym_linkS));
569 link->symbol = symbolP;
570 link->next = debug_sym_link;
571 debug_sym_link = link;
572 symbol_get_obj (symbolP)->local = 1;
573 }
574
575 *end_name = delim;
576 demand_empty_rest_of_line ();
577}
578
579/* Second pass to expanding the debug symbols, go through linked
580 list of symbols and reassign the address. */
581
582static void
583expand_debug_syms (syms, align)
584 sym_linkS *syms;
585 int align;
586{
587 char *save_input_line = input_line_pointer;
588 sym_linkS *next_syms;
589
590 if (!syms)
591 return;
592
593 (void) frag_align_code (align, 0);
594 for (; syms != (sym_linkS *) 0; syms = next_syms)
595 {
596 symbolS *symbolP = syms->symbol;
597 next_syms = syms->next;
598 input_line_pointer = ".\n";
599 pseudo_set (symbolP);
600 free ((char *) syms);
601 }
602
603 input_line_pointer = save_input_line;
604}
605
606void
607m32r_flush_pending_output()
608{
609 if (debug_sym_link)
610 {
611 expand_debug_syms (debug_sym_link, 1);
612 debug_sym_link = (sym_linkS *) 0;
613 }
614}
615
616/* Cover function to fill_insn called after a label and at end of assembly.
617 The result is always 1: we're called in a conditional to see if the
618 current line is a label. */
619
620int
621m32r_fill_insn (done)
622 int done;
623{
624 if (prev_seg != NULL)
625 {
626 segT seg = now_seg;
627 subsegT subseg = now_subseg;
628
629 subseg_set (prev_seg, prev_subseg);
630
631 fill_insn (0);
632
633 subseg_set (seg, subseg);
634 }
635
636 if (done && debug_sym_link)
637 {
638 expand_debug_syms (debug_sym_link, 1);
639 debug_sym_link = (sym_linkS *) 0;
640 }
641
642 return 1;
643}
644\f
645/* The default target format to use. */
646
647const char *
648m32r_target_format ()
649{
650#ifdef TE_LINUX
651 if (target_big_endian)
652 return "elf32-m32r-linux";
653 else
654 return "elf32-m32rle-linux";
655#else
656 if (target_big_endian)
657 return "elf32-m32r";
658 else
659 return "elf32-m32rle";
660#endif
661}
662
663void
664md_begin ()
665{
666 flagword applicable;
667 segT seg;
668 subsegT subseg;
669
670 /* Initialize the `cgen' interface. */
671
672 /* Set the machine number and endian. */
673 gas_cgen_cpu_desc = m32r_cgen_cpu_open (CGEN_CPU_OPEN_MACHS, 0,
674 CGEN_CPU_OPEN_ENDIAN,
675 (target_big_endian ?
676 CGEN_ENDIAN_BIG : CGEN_ENDIAN_LITTLE),
677 CGEN_CPU_OPEN_END);
678 m32r_cgen_init_asm (gas_cgen_cpu_desc);
679
680 /* The operand instance table is used during optimization to determine
681 which insns can be executed in parallel. It is also used to give
682 warnings regarding operand interference in parallel insns. */
683 m32r_cgen_init_opinst_table (gas_cgen_cpu_desc);
684
685 /* This is a callback from cgen to gas to parse operands. */
686 cgen_set_parse_operand_fn (gas_cgen_cpu_desc, gas_cgen_parse_operand);
687
688#if 0
689 /* Not supported yet. */
690 /* If a runtime cpu description file was provided, parse it. */
691 if (m32r_cpu_desc != NULL)
692 {
693 const char *errmsg;
694
695 errmsg = cgen_read_cpu_file (gas_cgen_cpu_desc, m32r_cpu_desc);
696 if (errmsg != NULL)
697 as_bad ("%s: %s", m32r_cpu_desc, errmsg);
698 }
699#endif
700
701 /* Save the current subseg so we can restore it [it's the default one and
702 we don't want the initial section to be .sbss]. */
703 seg = now_seg;
704 subseg = now_subseg;
705
706 /* The sbss section is for local .scomm symbols. */
707 sbss_section = subseg_new (".sbss", 0);
708
709 /* This is copied from perform_an_assembly_pass. */
710 applicable = bfd_applicable_section_flags (stdoutput);
711 bfd_set_section_flags (stdoutput, sbss_section, applicable & SEC_ALLOC);
712
713#if 0
714 /* What does this do? [see perform_an_assembly_pass] */
715 seg_info (bss_section)->bss = 1;
716#endif
717
718 subseg_set (seg, subseg);
719
720 /* We must construct a fake section similar to bfd_com_section
721 but with the name .scommon. */
722 scom_section = bfd_com_section;
723 scom_section.name = ".scommon";
724 scom_section.output_section = &scom_section;
725 scom_section.symbol = &scom_symbol;
726 scom_section.symbol_ptr_ptr = &scom_section.symbol;
727 scom_symbol = *bfd_com_section.symbol;
728 scom_symbol.name = ".scommon";
729 scom_symbol.section = &scom_section;
730
731 allow_m32rx (enable_m32rx);
732
733 gas_cgen_initialize_saved_fixups_array ();
734}
735
736#define OPERAND_IS_COND_BIT(operand, indices, index) \
737 ((operand)->hw_type == HW_H_COND \
738 || ((operand)->hw_type == HW_H_PSW) \
739 || ((operand)->hw_type == HW_H_CR \
740 && (indices [index] == 0 || indices [index] == 1)))
741
742/* Returns true if an output of instruction 'a' is referenced by an operand
743 of instruction 'b'. If 'check_outputs' is true then b's outputs are
744 checked, otherwise its inputs are examined. */
745
746static int first_writes_to_seconds_operands
747 PARAMS ((m32r_insn *, m32r_insn *, const int));
748
749static int
750first_writes_to_seconds_operands (a, b, check_outputs)
751 m32r_insn *a;
752 m32r_insn *b;
753 const int check_outputs;
754{
755 const CGEN_OPINST *a_operands = CGEN_INSN_OPERANDS (a->insn);
756 const CGEN_OPINST *b_ops = CGEN_INSN_OPERANDS (b->insn);
757 int a_index;
758
759 /* If at least one of the instructions takes no operands, then there is
760 nothing to check. There really are instructions without operands,
761 eg 'nop'. */
762 if (a_operands == NULL || b_ops == NULL)
763 return 0;
764
765 /* Scan the operand list of 'a' looking for an output operand. */
766 for (a_index = 0;
767 a_operands->type != CGEN_OPINST_END;
768 a_index ++, a_operands ++)
769 {
770 if (a_operands->type == CGEN_OPINST_OUTPUT)
771 {
772 int b_index;
773 const CGEN_OPINST *b_operands = b_ops;
774
775 /* Special Case:
776 The Condition bit 'C' is a shadow of the CBR register (control
777 register 1) and also a shadow of bit 31 of the program status
778 word (control register 0). For now this is handled here, rather
779 than by cgen.... */
780
781 if (OPERAND_IS_COND_BIT (a_operands, a->indices, a_index))
782 {
783 /* Scan operand list of 'b' looking for another reference to the
784 condition bit, which goes in the right direction. */
785 for (b_index = 0;
786 b_operands->type != CGEN_OPINST_END;
787 b_index++, b_operands++)
788 {
789 if ((b_operands->type
790 == (check_outputs
791 ? CGEN_OPINST_OUTPUT
792 : CGEN_OPINST_INPUT))
793 && OPERAND_IS_COND_BIT (b_operands, b->indices, b_index))
794 return 1;
795 }
796 }
797 else
798 {
799 /* Scan operand list of 'b' looking for an operand that
800 references the same hardware element, and which goes in the
801 right direction. */
802 for (b_index = 0;
803 b_operands->type != CGEN_OPINST_END;
804 b_index++, b_operands++)
805 {
806 if ((b_operands->type
807 == (check_outputs
808 ? CGEN_OPINST_OUTPUT
809 : CGEN_OPINST_INPUT))
810 && (b_operands->hw_type == a_operands->hw_type)
811 && (a->indices[a_index] == b->indices[b_index]))
812 return 1;
813 }
814 }
815 }
816 }
817
818 return 0;
819}
820
821/* Returns true if the insn can (potentially) alter the program counter. */
822
823static int writes_to_pc PARAMS ((m32r_insn *));
824
825static int
826writes_to_pc (a)
827 m32r_insn *a;
828{
829#if 0
830 /* Once PC operands are working.... */
831 const CGEN_OPINST *a_operands == CGEN_INSN_OPERANDS (gas_cgen_cpu_desc,
832 a->insn);
833
834 if (a_operands == NULL)
835 return 0;
836
837 while (a_operands->type != CGEN_OPINST_END)
838 {
839 if (a_operands->operand != NULL
840 && CGEN_OPERAND_INDEX (gas_cgen_cpu_desc,
841 a_operands->operand) == M32R_OPERAND_PC)
842 return 1;
843
844 a_operands++;
845 }
846#else
847 if (CGEN_INSN_ATTR_VALUE (a->insn, CGEN_INSN_UNCOND_CTI)
848 || CGEN_INSN_ATTR_VALUE (a->insn, CGEN_INSN_COND_CTI))
849 return 1;
850#endif
851 return 0;
852}
853
854/* Return NULL if the two 16 bit insns can be executed in parallel.
855 Otherwise return a pointer to an error message explaining why not. */
856
857static const char *can_make_parallel PARAMS ((m32r_insn *, m32r_insn *));
858
859static const char *
860can_make_parallel (a, b)
861 m32r_insn *a;
862 m32r_insn *b;
863{
864 PIPE_ATTR a_pipe;
865 PIPE_ATTR b_pipe;
866
867 /* Make sure the instructions are the right length. */
868 if (CGEN_FIELDS_BITSIZE (&a->fields) != 16
869 || CGEN_FIELDS_BITSIZE (&b->fields) != 16)
870 abort ();
871
872 if (first_writes_to_seconds_operands (a, b, TRUE))
873 return _("Instructions write to the same destination register.");
874
875 a_pipe = CGEN_INSN_ATTR_VALUE (a->insn, CGEN_INSN_PIPE);
876 b_pipe = CGEN_INSN_ATTR_VALUE (b->insn, CGEN_INSN_PIPE);
877
878 /* Make sure that the instructions use the correct execution pipelines. */
879 if (a_pipe == PIPE_NONE
880 || b_pipe == PIPE_NONE)
881 return _("Instructions do not use parallel execution pipelines.");
882
883 /* Leave this test for last, since it is the only test that can
884 go away if the instructions are swapped, and we want to make
885 sure that any other errors are detected before this happens. */
886 if (a_pipe == PIPE_S
887 || b_pipe == PIPE_O
888 || (b_pipe == PIPE_O_OS && (enable_m32rx != 2)))
889 return _("Instructions share the same execution pipeline");
890
891 return NULL;
892}
893
894/* Force the top bit of the second 16-bit insn to be set. */
895
896static void make_parallel PARAMS ((CGEN_INSN_BYTES_PTR));
897
898static void
899make_parallel (buffer)
900 CGEN_INSN_BYTES_PTR buffer;
901{
902#if CGEN_INT_INSN_P
903 *buffer |= 0x8000;
904#else
905 buffer[CGEN_CPU_ENDIAN (gas_cgen_cpu_desc) == CGEN_ENDIAN_BIG ? 0 : 1]
906 |= 0x80;
907#endif
908}
909
910/* Same as make_parallel except buffer contains the bytes in target order. */
911
912static void target_make_parallel PARAMS ((char *));
913
914static void
915target_make_parallel (buffer)
916 char *buffer;
917{
918 buffer[CGEN_CPU_ENDIAN (gas_cgen_cpu_desc) == CGEN_ENDIAN_BIG ? 0 : 1]
919 |= 0x80;
920}
921
922/* Assemble two instructions with an explicit parallel operation (||) or
923 sequential operation (->). */
924
925static void assemble_two_insns PARAMS ((char *, char *, int));
926
927static void
928assemble_two_insns (str, str2, parallel_p)
929 char *str;
930 char *str2;
931 int parallel_p;
932{
933 char *str3;
934 m32r_insn first;
935 m32r_insn second;
936 char *errmsg;
937 char save_str2 = *str2;
938
939 /* Separate the two instructions. */
940 *str2 = 0;
941
942 /* Make sure the two insns begin on a 32 bit boundary.
943 This is also done for the serial case (foo -> bar), relaxing doesn't
944 affect insns written like this.
945 Note that we must always do this as we can't assume anything about
946 whether we're currently on a 32 bit boundary or not. Relaxing may
947 change this. */
948 fill_insn (0);
949
950 first.debug_sym_link = debug_sym_link;
951 debug_sym_link = (sym_linkS *) 0;
952
953 /* Parse the first instruction. */
954 if (! (first.insn = m32r_cgen_assemble_insn
955 (gas_cgen_cpu_desc, str, & first.fields, first.buffer, & errmsg)))
956 {
957 as_bad (errmsg);
958 return;
959 }
960
961 /* Check it. */
962 if (CGEN_FIELDS_BITSIZE (&first.fields) != 16)
963 {
964 /* xgettext:c-format */
965 as_bad (_("not a 16 bit instruction '%s'"), str);
966 return;
967 }
968#ifdef E_M32R2_ARCH
969 else if ((enable_m32rx == 1)
970 /* FIXME: Need standard macro to perform this test. */
971 && ((CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_MACH)
972 & (1 << MACH_M32R2))
973 && !((CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_MACH)
974 & (1 << MACH_M32RX)))))
975 {
976 /* xgettext:c-format */
977 as_bad (_("instruction '%s' is for the M32R2 only"), str);
978 return;
979 }
980 else if ((! enable_special
981 && CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_SPECIAL))
982 || (! enable_special_m32r
983 && CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_SPECIAL_M32R)))
984#else
985 else if (! enable_special
986 && CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_SPECIAL))
987#endif
988 {
989 /* xgettext:c-format */
990 as_bad (_("unknown instruction '%s'"), str);
991 return;
992 }
993 else if (! enable_m32rx
994 /* FIXME: Need standard macro to perform this test. */
995 && (CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_MACH)
996 == (1 << MACH_M32RX)))
997 {
998 /* xgettext:c-format */
999 as_bad (_("instruction '%s' is for the M32RX only"), str);
1000 return;
1001 }
1002
1003 /* Check to see if this is an allowable parallel insn. */
1004 if (parallel_p
1005 && CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_PIPE) == PIPE_NONE)
1006 {
1007 /* xgettext:c-format */
1008 as_bad (_("instruction '%s' cannot be executed in parallel."), str);
1009 return;
1010 }
1011
1012 /* Restore the original assembly text, just in case it is needed. */
1013 *str2 = save_str2;
1014
1015 /* Save the original string pointer. */
1016 str3 = str;
1017
1018 /* Advanced past the parsed string. */
1019 str = str2 + 2;
1020
1021 /* Remember the entire string in case it is needed for error
1022 messages. */
1023 str2 = str3;
1024
1025 /* Convert the opcode to lower case. */
1026 {
1027 char *s2 = str;
1028
1029 while (ISSPACE (*s2++))
1030 continue;
1031
1032 --s2;
1033
1034 while (ISALNUM (*s2))
1035 {
1036 *s2 = TOLOWER (*s2);
1037 s2++;
1038 }
1039 }
1040
1041 /* Preserve any fixups that have been generated and reset the list
1042 to empty. */
1043 gas_cgen_save_fixups (0);
1044
1045 /* Get the indices of the operands of the instruction. */
1046 /* FIXME: CGEN_FIELDS is already recorded, but relying on that fact
1047 doesn't seem right. Perhaps allow passing fields like we do insn. */
1048 /* FIXME: ALIAS insns do not have operands, so we use this function
1049 to find the equivalent insn and overwrite the value stored in our
1050 structure. We still need the original insn, however, since this
1051 may have certain attributes that are not present in the unaliased
1052 version (eg relaxability). When aliases behave differently this
1053 may have to change. */
1054 first.orig_insn = first.insn;
1055 {
1056 CGEN_FIELDS tmp_fields;
1057 first.insn = cgen_lookup_get_insn_operands
1058 (gas_cgen_cpu_desc, NULL, INSN_VALUE (first.buffer), NULL, 16,
1059 first.indices, &tmp_fields);
1060 }
1061
1062 if (first.insn == NULL)
1063 as_fatal (_("internal error: lookup/get operands failed"));
1064
1065 second.debug_sym_link = NULL;
1066
1067 /* Parse the second instruction. */
1068 if (! (second.insn = m32r_cgen_assemble_insn
1069 (gas_cgen_cpu_desc, str, & second.fields, second.buffer, & errmsg)))
1070 {
1071 as_bad (errmsg);
1072 return;
1073 }
1074
1075 /* Check it. */
1076 if (CGEN_FIELDS_BITSIZE (&second.fields) != 16)
1077 {
1078 /* xgettext:c-format */
1079 as_bad (_("not a 16 bit instruction '%s'"), str);
1080 return;
1081 }
1082#ifdef E_M32R2_ARCH
1083 else if ((enable_m32rx == 1)
1084 /* FIXME: Need standard macro to perform this test. */
1085 && ((CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_MACH)
1086 & (1 << MACH_M32R2))
1087 && !((CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_MACH)
1088 & (1 << MACH_M32RX)))))
1089 {
1090 /* xgettext:c-format */
1091 as_bad (_("instruction '%s' is for the M32R2 only"), str);
1092 return;
1093 }
1094 else if ((! enable_special
1095 && CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_SPECIAL))
1096 || (! enable_special_m32r
1097 && CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_SPECIAL_M32R)))
1098#else
1099 else if (! enable_special
1100 && CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_SPECIAL))
1101#endif
1102 {
1103 /* xgettext:c-format */
1104 as_bad (_("unknown instruction '%s'"), str);
1105 return;
1106 }
1107 else if (! enable_m32rx
1108 && CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_MACH) == (1 << MACH_M32RX))
1109 {
1110 /* xgettext:c-format */
1111 as_bad (_("instruction '%s' is for the M32RX only"), str);
1112 return;
1113 }
1114
1115 /* Check to see if this is an allowable parallel insn. */
1116 if (parallel_p
1117 && CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_PIPE) == PIPE_NONE)
1118 {
1119 /* xgettext:c-format */
1120 as_bad (_("instruction '%s' cannot be executed in parallel."), str);
1121 return;
1122 }
1123
1124 if (parallel_p && ! enable_m32rx)
1125 {
1126 if (CGEN_INSN_NUM (first.insn) != M32R_INSN_NOP
1127 && CGEN_INSN_NUM (second.insn) != M32R_INSN_NOP)
1128 {
1129 /* xgettext:c-format */
1130 as_bad (_("'%s': only the NOP instruction can be issued in parallel on the m32r"), str2);
1131 return;
1132 }
1133 }
1134
1135 /* Get the indices of the operands of the instruction. */
1136 second.orig_insn = second.insn;
1137 {
1138 CGEN_FIELDS tmp_fields;
1139 second.insn = cgen_lookup_get_insn_operands
1140 (gas_cgen_cpu_desc, NULL, INSN_VALUE (second.buffer), NULL, 16,
1141 second.indices, &tmp_fields);
1142 }
1143
1144 if (second.insn == NULL)
1145 as_fatal (_("internal error: lookup/get operands failed"));
1146
1147 /* We assume that if the first instruction writes to a register that is
1148 read by the second instruction it is because the programmer intended
1149 this to happen, (after all they have explicitly requested that these
1150 two instructions be executed in parallel). Although if the global
1151 variable warn_explicit_parallel_conflicts is true then we do generate
1152 a warning message. Similarly we assume that parallel branch and jump
1153 instructions are deliberate and should not produce errors. */
1154
1155 if (parallel_p && warn_explicit_parallel_conflicts)
1156 {
1157 void (* func)(const char *, ...);
1158
1159 func = error_explicit_parallel_conflicts ? as_bad : as_warn;
1160
1161 if (first_writes_to_seconds_operands (&first, &second, FALSE))
1162 /* xgettext:c-format */
1163 func (_("%s: output of 1st instruction is the same as an input to 2nd instruction - is this intentional ?"), str2);
1164
1165 if (first_writes_to_seconds_operands (&second, &first, FALSE))
1166 /* xgettext:c-format */
1167 func (_("%s: output of 2nd instruction is the same as an input to 1st instruction - is this intentional ?"), str2);
1168 }
1169
1170 if (!parallel_p
1171 || (errmsg = (char *) can_make_parallel (&first, &second)) == NULL)
1172 {
1173 /* Get the fixups for the first instruction. */
1174 gas_cgen_swap_fixups (0);
1175
1176 /* Write it out. */
1177 expand_debug_syms (first.debug_sym_link, 1);
1178 gas_cgen_finish_insn (first.orig_insn, first.buffer,
1179 CGEN_FIELDS_BITSIZE (&first.fields), 0, NULL);
1180
1181 /* Force the top bit of the second insn to be set. */
1182 if (parallel_p)
1183 make_parallel (second.buffer);
1184
1185 /* Get its fixups. */
1186 gas_cgen_restore_fixups (0);
1187
1188 /* Write it out. */
1189 expand_debug_syms (second.debug_sym_link, 1);
1190 gas_cgen_finish_insn (second.orig_insn, second.buffer,
1191 CGEN_FIELDS_BITSIZE (&second.fields), 0, NULL);
1192 }
1193 /* Try swapping the instructions to see if they work that way. */
1194 else if (can_make_parallel (&second, &first) == NULL)
1195 {
1196 /* Write out the second instruction first. */
1197 expand_debug_syms (second.debug_sym_link, 1);
1198 gas_cgen_finish_insn (second.orig_insn, second.buffer,
1199 CGEN_FIELDS_BITSIZE (&second.fields), 0, NULL);
1200
1201 /* Force the top bit of the first instruction to be set. */
1202 make_parallel (first.buffer);
1203
1204 /* Get the fixups for the first instruction. */
1205 gas_cgen_restore_fixups (0);
1206
1207 /* Write out the first instruction. */
1208 expand_debug_syms (first.debug_sym_link, 1);
1209 gas_cgen_finish_insn (first.orig_insn, first.buffer,
1210 CGEN_FIELDS_BITSIZE (&first.fields), 0, NULL);
1211 }
1212 else
1213 {
1214 as_bad ("'%s': %s", str2, errmsg);
1215 return;
1216 }
1217
1218 if (CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_SPECIAL)
1219 || CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_SPECIAL))
1220 m32r_flags |= E_M32R_HAS_HIDDEN_INST;
1221 if (CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_SPECIAL_M32R)
1222 || CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_SPECIAL_M32R))
1223 m32r_flags |= E_M32R_HAS_BIT_INST;
1224 if (CGEN_INSN_ATTR_VALUE (first.insn, CGEN_INSN_SPECIAL_FLOAT)
1225 || CGEN_INSN_ATTR_VALUE (second.insn, CGEN_INSN_SPECIAL_FLOAT))
1226 m32r_flags |= E_M32R_HAS_FLOAT_INST;
1227
1228 /* Set these so m32r_fill_insn can use them. */
1229 prev_seg = now_seg;
1230 prev_subseg = now_subseg;
1231}
1232
1233void
1234md_assemble (str)
1235 char *str;
1236{
1237 m32r_insn insn;
1238 char *errmsg;
1239 char *str2 = NULL;
1240
1241 /* Initialize GAS's cgen interface for a new instruction. */
1242 gas_cgen_init_parse ();
1243
1244 /* Look for a parallel instruction separator. */
1245 if ((str2 = strstr (str, "||")) != NULL)
1246 {
1247 assemble_two_insns (str, str2, 1);
1248 m32r_flags |= E_M32R_HAS_PARALLEL;
1249 return;
1250 }
1251
1252 /* Also look for a sequential instruction separator. */
1253 if ((str2 = strstr (str, "->")) != NULL)
1254 {
1255 assemble_two_insns (str, str2, 0);
1256 return;
1257 }
1258
1259 insn.debug_sym_link = debug_sym_link;
1260 debug_sym_link = (sym_linkS *) 0;
1261
1262 insn.insn = m32r_cgen_assemble_insn
1263 (gas_cgen_cpu_desc, str, &insn.fields, insn.buffer, & errmsg);
1264
1265 if (!insn.insn)
1266 {
1267 as_bad (errmsg);
1268 return;
1269 }
1270
1271#ifdef E_M32R2_ARCH
1272 if ((enable_m32rx == 1)
1273 /* FIXME: Need standard macro to perform this test. */
1274 && ((CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_MACH)
1275 & (1 << MACH_M32R2))
1276 && !((CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_MACH)
1277 & (1 << MACH_M32RX)))))
1278 {
1279 /* xgettext:c-format */
1280 as_bad (_("instruction '%s' is for the M32R2 only"), str);
1281 return;
1282 }
1283 else if ((! enable_special
1284 && CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_SPECIAL))
1285 || (! enable_special_m32r
1286 && CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_SPECIAL_M32R)))
1287#else
1288 if (! enable_special
1289 && CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_SPECIAL))
1290#endif
1291 {
1292 /* xgettext:c-format */
1293 as_bad (_("unknown instruction '%s'"), str);
1294 return;
1295 }
1296 else if (! enable_m32rx
1297 && CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_MACH) == (1 << MACH_M32RX))
1298 {
1299 /* xgettext:c-format */
1300 as_bad (_("instruction '%s' is for the M32RX only"), str);
1301 return;
1302 }
1303
1304 if (CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_SPECIAL))
1305 m32r_flags |= E_M32R_HAS_HIDDEN_INST;
1306 if (CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_SPECIAL_M32R))
1307 m32r_flags |= E_M32R_HAS_BIT_INST;
1308 if (CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_SPECIAL_FLOAT))
1309 m32r_flags |= E_M32R_HAS_FLOAT_INST;
1310
1311 if (CGEN_INSN_BITSIZE (insn.insn) == 32)
1312 {
1313 /* 32 bit insns must live on 32 bit boundaries. */
1314 if (prev_insn.insn || seen_relaxable_p)
1315 {
1316 /* ??? If calling fill_insn too many times turns us into a memory
1317 pig, can we call a fn to assemble a nop instead of
1318 !seen_relaxable_p? */
1319 fill_insn (0);
1320 }
1321
1322 expand_debug_syms (insn.debug_sym_link, 2);
1323
1324 /* Doesn't really matter what we pass for RELAX_P here. */
1325 gas_cgen_finish_insn (insn.insn, insn.buffer,
1326 CGEN_FIELDS_BITSIZE (&insn.fields), 1, NULL);
1327 }
1328 else
1329 {
1330 int on_32bit_boundary_p;
1331 int swap = FALSE;
1332
1333 if (CGEN_INSN_BITSIZE (insn.insn) != 16)
1334 abort ();
1335
1336 insn.orig_insn = insn.insn;
1337
1338 /* If the previous insn was relaxable, then it may be expanded
1339 to fill the current 16 bit slot. Emit a NOP here to occupy
1340 this slot, so that we can start at optimizing at a 32 bit
1341 boundary. */
1342 if (prev_insn.insn && seen_relaxable_p && optimize)
1343 fill_insn (0);
1344
1345 if (enable_m32rx)
1346 {
1347 /* Get the indices of the operands of the instruction.
1348 FIXME: See assemble_parallel for notes on orig_insn. */
1349 {
1350 CGEN_FIELDS tmp_fields;
1351 insn.insn = cgen_lookup_get_insn_operands
1352 (gas_cgen_cpu_desc, NULL, INSN_VALUE (insn.buffer), NULL,
1353 16, insn.indices, &tmp_fields);
1354 }
1355
1356 if (insn.insn == NULL)
1357 as_fatal (_("internal error: lookup/get operands failed"));
1358 }
1359
1360 /* Compute whether we're on a 32 bit boundary or not.
1361 prev_insn.insn is NULL when we're on a 32 bit boundary. */
1362 on_32bit_boundary_p = prev_insn.insn == NULL;
1363
1364 /* Look to see if this instruction can be combined with the
1365 previous instruction to make one, parallel, 32 bit instruction.
1366 If the previous instruction (potentially) changed the flow of
1367 program control, then it cannot be combined with the current
1368 instruction. If the current instruction is relaxable, then it
1369 might be replaced with a longer version, so we cannot combine it.
1370 Also if the output of the previous instruction is used as an
1371 input to the current instruction then it cannot be combined.
1372 Otherwise call can_make_parallel() with both orderings of the
1373 instructions to see if they can be combined. */
1374 if (! on_32bit_boundary_p
1375 && parallel ()
1376 && CGEN_INSN_ATTR_VALUE (insn.orig_insn, CGEN_INSN_RELAXABLE) == 0
1377 && ! writes_to_pc (&prev_insn)
1378 && ! first_writes_to_seconds_operands (&prev_insn, &insn, FALSE))
1379 {
1380 if (can_make_parallel (&prev_insn, &insn) == NULL)
1381 make_parallel (insn.buffer);
1382 else if (can_make_parallel (&insn, &prev_insn) == NULL)
1383 swap = TRUE;
1384 }
1385
1386 expand_debug_syms (insn.debug_sym_link, 1);
1387
1388 {
1389 int i;
1390 finished_insnS fi;
1391
1392 /* Ensure each pair of 16 bit insns is in the same frag. */
1393 frag_grow (4);
1394
1395 gas_cgen_finish_insn (insn.orig_insn, insn.buffer,
1396 CGEN_FIELDS_BITSIZE (&insn.fields),
1397 1 /* relax_p */, &fi);
1398 insn.addr = fi.addr;
1399 insn.frag = fi.frag;
1400 insn.num_fixups = fi.num_fixups;
1401 for (i = 0; i < fi.num_fixups; ++i)
1402 insn.fixups[i] = fi.fixups[i];
1403 }
1404
1405 if (swap)
1406 {
1407 int i, tmp;
1408
1409#define SWAP_BYTES(a,b) tmp = a; a = b; b = tmp
1410
1411 /* Swap the two insns */
1412 SWAP_BYTES (prev_insn.addr[0], insn.addr[0]);
1413 SWAP_BYTES (prev_insn.addr[1], insn.addr[1]);
1414
1415 target_make_parallel (insn.addr);
1416
1417 /* Swap any relaxable frags recorded for the two insns. */
1418 /* FIXME: Clarify. relaxation precludes parallel insns */
1419 if (prev_insn.frag->fr_opcode == prev_insn.addr)
1420 prev_insn.frag->fr_opcode = insn.addr;
1421 else if (insn.frag->fr_opcode == insn.addr)
1422 insn.frag->fr_opcode = prev_insn.addr;
1423
1424 /* Update the addresses in any fixups.
1425 Note that we don't have to handle the case where each insn is in
1426 a different frag as we ensure they're in the same frag above. */
1427 for (i = 0; i < prev_insn.num_fixups; ++i)
1428 prev_insn.fixups[i]->fx_where += 2;
1429 for (i = 0; i < insn.num_fixups; ++i)
1430 insn.fixups[i]->fx_where -= 2;
1431 }
1432
1433 /* Keep track of whether we've seen a pair of 16 bit insns.
1434 prev_insn.insn is NULL when we're on a 32 bit boundary. */
1435 if (on_32bit_boundary_p)
1436 prev_insn = insn;
1437 else
1438 prev_insn.insn = NULL;
1439
1440 /* If the insn needs the following one to be on a 32 bit boundary
1441 (e.g. subroutine calls), fill this insn's slot. */
1442 if (on_32bit_boundary_p
1443 && CGEN_INSN_ATTR_VALUE (insn.orig_insn, CGEN_INSN_FILL_SLOT) != 0)
1444 fill_insn (0);
1445
1446 /* If this is a relaxable insn (can be replaced with a larger version)
1447 mark the fact so that we can emit an alignment directive for a
1448 following 32 bit insn if we see one. */
1449 if (CGEN_INSN_ATTR_VALUE (insn.orig_insn, CGEN_INSN_RELAXABLE) != 0)
1450 seen_relaxable_p = 1;
1451 }
1452
1453 /* Set these so m32r_fill_insn can use them. */
1454 prev_seg = now_seg;
1455 prev_subseg = now_subseg;
1456}
1457
1458/* The syntax in the manual says constants begin with '#'.
1459 We just ignore it. */
1460
1461void
1462md_operand (expressionP)
1463 expressionS *expressionP;
1464{
1465 if (*input_line_pointer == '#')
1466 {
1467 input_line_pointer++;
1468 expression (expressionP);
1469 }
1470}
1471
1472valueT
1473md_section_align (segment, size)
1474 segT segment;
1475 valueT size;
1476{
1477 int align = bfd_get_section_alignment (stdoutput, segment);
1478 return ((size + (1 << align) - 1) & (-1 << align));
1479}
1480
1481symbolS *
1482md_undefined_symbol (name)
1483 char *name ATTRIBUTE_UNUSED;
1484{
1485 return 0;
1486}
1487\f
1488/* .scomm pseudo-op handler.
1489
1490 This is a new pseudo-op to handle putting objects in .scommon.
1491 By doing this the linker won't need to do any work,
1492 and more importantly it removes the implicit -G arg necessary to
1493 correctly link the object file. */
1494
1495static void
1496m32r_scomm (ignore)
1497 int ignore ATTRIBUTE_UNUSED;
1498{
1499 register char *name;
1500 register char c;
1501 register char *p;
1502 offsetT size;
1503 register symbolS *symbolP;
1504 offsetT align;
1505 int align2;
1506
1507 name = input_line_pointer;
1508 c = get_symbol_end ();
1509
1510 /* Just after name is now '\0'. */
1511 p = input_line_pointer;
1512 *p = c;
1513 SKIP_WHITESPACE ();
1514 if (*input_line_pointer != ',')
1515 {
1516 as_bad (_("Expected comma after symbol-name: rest of line ignored."));
1517 ignore_rest_of_line ();
1518 return;
1519 }
1520
1521 /* Skip ','. */
1522 input_line_pointer++;
1523 if ((size = get_absolute_expression ()) < 0)
1524 {
1525 /* xgettext:c-format */
1526 as_warn (_(".SCOMMon length (%ld.) <0! Ignored."), (long) size);
1527 ignore_rest_of_line ();
1528 return;
1529 }
1530
1531 /* The third argument to .scomm is the alignment. */
1532 if (*input_line_pointer != ',')
1533 align = 8;
1534 else
1535 {
1536 ++input_line_pointer;
1537 align = get_absolute_expression ();
1538 if (align <= 0)
1539 {
1540 as_warn (_("ignoring bad alignment"));
1541 align = 8;
1542 }
1543 }
1544
1545 /* Convert to a power of 2 alignment. */
1546 if (align)
1547 {
1548 for (align2 = 0; (align & 1) == 0; align >>= 1, ++align2)
1549 continue;
1550 if (align != 1)
1551 {
1552 as_bad (_("Common alignment not a power of 2"));
1553 ignore_rest_of_line ();
1554 return;
1555 }
1556 }
1557 else
1558 align2 = 0;
1559
1560 *p = 0;
1561 symbolP = symbol_find_or_make (name);
1562 *p = c;
1563
1564 if (S_IS_DEFINED (symbolP))
1565 {
1566 /* xgettext:c-format */
1567 as_bad (_("Ignoring attempt to re-define symbol `%s'."),
1568 S_GET_NAME (symbolP));
1569 ignore_rest_of_line ();
1570 return;
1571 }
1572
1573 if (S_GET_VALUE (symbolP) && S_GET_VALUE (symbolP) != (valueT) size)
1574 {
1575 /* xgettext:c-format */
1576 as_bad (_("Length of .scomm \"%s\" is already %ld. Not changed to %ld."),
1577 S_GET_NAME (symbolP),
1578 (long) S_GET_VALUE (symbolP),
1579 (long) size);
1580
1581 ignore_rest_of_line ();
1582 return;
1583 }
1584
1585 if (symbol_get_obj (symbolP)->local)
1586 {
1587 segT old_sec = now_seg;
1588 int old_subsec = now_subseg;
1589 char *pfrag;
1590
1591 record_alignment (sbss_section, align2);
1592 subseg_set (sbss_section, 0);
1593
1594 if (align2)
1595 frag_align (align2, 0, 0);
1596
1597 if (S_GET_SEGMENT (symbolP) == sbss_section)
1598 symbol_get_frag (symbolP)->fr_symbol = 0;
1599
1600 symbol_set_frag (symbolP, frag_now);
1601
1602 pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP, size,
1603 (char *) 0);
1604 *pfrag = 0;
1605 S_SET_SIZE (symbolP, size);
1606 S_SET_SEGMENT (symbolP, sbss_section);
1607 S_CLEAR_EXTERNAL (symbolP);
1608 subseg_set (old_sec, old_subsec);
1609 }
1610 else
1611 {
1612 S_SET_VALUE (symbolP, (valueT) size);
1613 S_SET_ALIGN (symbolP, align2);
1614 S_SET_EXTERNAL (symbolP);
1615 S_SET_SEGMENT (symbolP, &scom_section);
1616 }
1617
1618 demand_empty_rest_of_line ();
1619}
1620\f
1621/* Interface to relax_segment. */
1622
1623/* FIXME: Build table by hand, get it working, then machine generate. */
1624
1625const relax_typeS md_relax_table[] =
1626{
1627/* The fields are:
1628 1) most positive reach of this state,
1629 2) most negative reach of this state,
1630 3) how many bytes this mode will add to the size of the current frag
1631 4) which index into the table to try if we can't fit into this one. */
1632
1633 /* The first entry must be unused because an `rlx_more' value of zero ends
1634 each list. */
1635 {1, 1, 0, 0},
1636
1637 /* The displacement used by GAS is from the end of the 2 byte insn,
1638 so we subtract 2 from the following. */
1639 /* 16 bit insn, 8 bit disp -> 10 bit range.
1640 This doesn't handle a branch in the right slot at the border:
1641 the "& -4" isn't taken into account. It's not important enough to
1642 complicate things over it, so we subtract an extra 2 (or + 2 in -ve
1643 case). */
1644 {511 - 2 - 2, -512 - 2 + 2, 0, 2 },
1645 /* 32 bit insn, 24 bit disp -> 26 bit range. */
1646 {0x2000000 - 1 - 2, -0x2000000 - 2, 2, 0 },
1647 /* Same thing, but with leading nop for alignment. */
1648 {0x2000000 - 1 - 2, -0x2000000 - 2, 4, 0 }
1649};
1650
1651long
1652m32r_relax_frag (segment, fragP, stretch)
1653 segT segment;
1654 fragS *fragP;
1655 long stretch;
1656{
1657 /* Address of branch insn. */
1658 long address = fragP->fr_address + fragP->fr_fix - 2;
1659 long growth = 0;
1660
1661 /* Keep 32 bit insns aligned on 32 bit boundaries. */
1662 if (fragP->fr_subtype == 2)
1663 {
1664 if ((address & 3) != 0)
1665 {
1666 fragP->fr_subtype = 3;
1667 growth = 2;
1668 }
1669 }
1670 else if (fragP->fr_subtype == 3)
1671 {
1672 if ((address & 3) == 0)
1673 {
1674 fragP->fr_subtype = 2;
1675 growth = -2;
1676 }
1677 }
1678 else
1679 {
1680 growth = relax_frag (segment, fragP, stretch);
1681
1682 /* Long jump on odd halfword boundary? */
1683 if (fragP->fr_subtype == 2 && (address & 3) != 0)
1684 {
1685 fragP->fr_subtype = 3;
1686 growth += 2;
1687 }
1688 }
1689
1690 return growth;
1691}
1692
1693/* Return an initial guess of the length by which a fragment must grow to
1694 hold a branch to reach its destination.
1695 Also updates fr_type/fr_subtype as necessary.
1696
1697 Called just before doing relaxation.
1698 Any symbol that is now undefined will not become defined.
1699 The guess for fr_var is ACTUALLY the growth beyond fr_fix.
1700 Whatever we do to grow fr_fix or fr_var contributes to our returned value.
1701 Although it may not be explicit in the frag, pretend fr_var starts
1702 with a 0 value. */
1703
1704int
1705md_estimate_size_before_relax (fragP, segment)
1706 fragS *fragP;
1707 segT segment;
1708{
1709 /* The only thing we have to handle here are symbols outside of the
1710 current segment. They may be undefined or in a different segment in
1711 which case linker scripts may place them anywhere.
1712 However, we can't finish the fragment here and emit the reloc as insn
1713 alignment requirements may move the insn about. */
1714
1715 if (S_GET_SEGMENT (fragP->fr_symbol) != segment)
1716 {
1717#if 0
1718 int old_fr_fix = fragP->fr_fix;
1719#endif
1720
1721 /* The symbol is undefined in this segment.
1722 Change the relaxation subtype to the max allowable and leave
1723 all further handling to md_convert_frag. */
1724 fragP->fr_subtype = 2;
1725
1726#if 0
1727 /* Can't use this, but leave in for illustration. */
1728 /* Change 16 bit insn to 32 bit insn. */
1729 fragP->fr_opcode[0] |= 0x80;
1730
1731 /* Increase known (fixed) size of fragment. */
1732 fragP->fr_fix += 2;
1733
1734 /* Create a relocation for it. */
1735 fix_new (fragP, old_fr_fix, 4,
1736 fragP->fr_symbol,
1737 fragP->fr_offset, 1 /* pcrel */,
1738 /* FIXME: Can't use a real BFD reloc here.
1739 gas_cgen_md_apply_fix3 can't handle it. */
1740 BFD_RELOC_M32R_26_PCREL);
1741
1742 /* Mark this fragment as finished. */
1743 frag_wane (fragP);
1744 return fragP->fr_fix - old_fr_fix;
1745#else
1746 {
1747 const CGEN_INSN *insn;
1748 int i;
1749
1750 /* Update the recorded insn.
1751 Fortunately we don't have to look very far.
1752 FIXME: Change this to record in the instruction the next higher
1753 relaxable insn to use. */
1754 for (i = 0, insn = fragP->fr_cgen.insn; i < 4; i++, insn++)
1755 {
1756 if ((strcmp (CGEN_INSN_MNEMONIC (insn),
1757 CGEN_INSN_MNEMONIC (fragP->fr_cgen.insn))
1758 == 0)
1759 && CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_RELAXED))
1760 break;
1761 }
1762 if (i == 4)
1763 abort ();
1764
1765 fragP->fr_cgen.insn = insn;
1766 return 2;
1767 }
1768#endif
1769 }
1770
1771 return md_relax_table[fragP->fr_subtype].rlx_length;
1772}
1773
1774/* *FRAGP has been relaxed to its final size, and now needs to have
1775 the bytes inside it modified to conform to the new size.
1776
1777 Called after relaxation is finished.
1778 fragP->fr_type == rs_machine_dependent.
1779 fragP->fr_subtype is the subtype of what the address relaxed to. */
1780
1781void
1782md_convert_frag (abfd, sec, fragP)
1783 bfd *abfd ATTRIBUTE_UNUSED;
1784 segT sec;
1785 fragS *fragP;
1786{
1787 char *opcode;
1788 char *displacement;
1789 int target_address;
1790 int opcode_address;
1791 int extension;
1792 int addend;
1793
1794 opcode = fragP->fr_opcode;
1795
1796 /* Address opcode resides at in file space. */
1797 opcode_address = fragP->fr_address + fragP->fr_fix - 2;
1798
1799 switch (fragP->fr_subtype)
1800 {
1801 case 1:
1802 extension = 0;
1803 displacement = &opcode[1];
1804 break;
1805 case 2:
1806 opcode[0] |= 0x80;
1807 extension = 2;
1808 displacement = &opcode[1];
1809 break;
1810 case 3:
1811 opcode[2] = opcode[0] | 0x80;
1812 md_number_to_chars (opcode, PAR_NOP_INSN, 2);
1813 opcode_address += 2;
1814 extension = 4;
1815 displacement = &opcode[3];
1816 break;
1817 default:
1818 abort ();
1819 }
1820
1821 if (S_GET_SEGMENT (fragP->fr_symbol) != sec)
1822 {
1823 /* Symbol must be resolved by linker. */
1824 if (fragP->fr_offset & 3)
1825 as_warn (_("Addend to unresolved symbol not on word boundary."));
1826 addend = fragP->fr_offset >> 2;
1827 }
1828 else
1829 {
1830 /* Address we want to reach in file space. */
1831 target_address = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset;
1832 addend = (target_address - (opcode_address & -4)) >> 2;
1833 }
1834
1835 /* Create a relocation for symbols that must be resolved by the linker.
1836 Otherwise output the completed insn. */
1837
1838 if (S_GET_SEGMENT (fragP->fr_symbol) != sec)
1839 {
1840 assert (fragP->fr_subtype != 1);
1841 assert (fragP->fr_cgen.insn != 0);
1842 gas_cgen_record_fixup (fragP,
1843 /* Offset of branch insn in frag. */
1844 fragP->fr_fix + extension - 4,
1845 fragP->fr_cgen.insn,
1846 4 /* Length. */,
1847 /* FIXME: quick hack. */
1848#if 0
1849 cgen_operand_lookup_by_num (gas_cgen_cpu_desc,
1850 fragP->fr_cgen.opindex),
1851#else
1852 cgen_operand_lookup_by_num (gas_cgen_cpu_desc,
1853 M32R_OPERAND_DISP24),
1854#endif
1855 fragP->fr_cgen.opinfo,
1856 fragP->fr_symbol, fragP->fr_offset);
1857 }
1858
1859#define SIZE_FROM_RELAX_STATE(n) ((n) == 1 ? 1 : 3)
1860
1861 md_number_to_chars (displacement, (valueT) addend,
1862 SIZE_FROM_RELAX_STATE (fragP->fr_subtype));
1863
1864 fragP->fr_fix += extension;
1865}
1866\f
1867/* Functions concerning relocs. */
1868
1869/* The location from which a PC relative jump should be calculated,
1870 given a PC relative reloc. */
1871
1872long
1873md_pcrel_from_section (fixP, sec)
1874 fixS *fixP;
1875 segT sec;
1876{
1877 if (fixP->fx_addsy != (symbolS *) NULL
1878 && (! S_IS_DEFINED (fixP->fx_addsy)
1879 || S_GET_SEGMENT (fixP->fx_addsy) != sec))
1880 {
1881 /* The symbol is undefined (or is defined but not in this section).
1882 Let the linker figure it out. */
1883 return 0;
1884 }
1885
1886 return (fixP->fx_frag->fr_address + fixP->fx_where) & -4L;
1887}
1888
1889/* Return the bfd reloc type for OPERAND of INSN at fixup FIXP.
1890 Returns BFD_RELOC_NONE if no reloc type can be found.
1891 *FIXP may be modified if desired. */
1892
1893bfd_reloc_code_real_type
1894md_cgen_lookup_reloc (insn, operand, fixP)
1895 const CGEN_INSN *insn ATTRIBUTE_UNUSED;
1896 const CGEN_OPERAND *operand;
1897 fixS *fixP;
1898{
1899 switch (operand->type)
1900 {
1901 case M32R_OPERAND_DISP8: return BFD_RELOC_M32R_10_PCREL;
1902 case M32R_OPERAND_DISP16: return BFD_RELOC_M32R_18_PCREL;
1903 case M32R_OPERAND_DISP24: return BFD_RELOC_M32R_26_PCREL;
1904 case M32R_OPERAND_UIMM24: return BFD_RELOC_M32R_24;
1905 case M32R_OPERAND_HI16:
1906 case M32R_OPERAND_SLO16:
1907 case M32R_OPERAND_ULO16:
1908 /* If low/high/shigh/sda was used, it is recorded in `opinfo'. */
1909 if (fixP->fx_cgen.opinfo != 0)
1910 return fixP->fx_cgen.opinfo;
1911 break;
1912 default:
1913 /* Avoid -Wall warning. */
1914 break;
1915 }
1916 return BFD_RELOC_NONE;
1917}
1918
1919/* Record a HI16 reloc for later matching with its LO16 cousin. */
1920
1921static void m32r_record_hi16 PARAMS ((int, fixS *, segT));
1922
1923static void
1924m32r_record_hi16 (reloc_type, fixP, seg)
1925 int reloc_type;
1926 fixS *fixP;
1927 segT seg ATTRIBUTE_UNUSED;
1928{
1929 struct m32r_hi_fixup *hi_fixup;
1930
1931 assert (reloc_type == BFD_RELOC_M32R_HI16_SLO
1932 || reloc_type == BFD_RELOC_M32R_HI16_ULO);
1933
1934 hi_fixup = ((struct m32r_hi_fixup *)
1935 xmalloc (sizeof (struct m32r_hi_fixup)));
1936 hi_fixup->fixp = fixP;
1937 hi_fixup->seg = now_seg;
1938 hi_fixup->next = m32r_hi_fixup_list;
1939
1940 m32r_hi_fixup_list = hi_fixup;
1941}
1942
1943/* Called while parsing an instruction to create a fixup.
1944 We need to check for HI16 relocs and queue them up for later sorting. */
1945
1946fixS *
1947m32r_cgen_record_fixup_exp (frag, where, insn, length, operand, opinfo, exp)
1948 fragS *frag;
1949 int where;
1950 const CGEN_INSN *insn;
1951 int length;
1952 const CGEN_OPERAND *operand;
1953 int opinfo;
1954 expressionS *exp;
1955{
1956 fixS *fixP = gas_cgen_record_fixup_exp (frag, where, insn, length,
1957 operand, opinfo, exp);
1958
1959 switch (operand->type)
1960 {
1961 case M32R_OPERAND_HI16:
1962 /* If low/high/shigh/sda was used, it is recorded in `opinfo'. */
1963 if (fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_SLO
1964 || fixP->fx_cgen.opinfo == BFD_RELOC_M32R_HI16_ULO)
1965 m32r_record_hi16 (fixP->fx_cgen.opinfo, fixP, now_seg);
1966 break;
1967 default:
1968 /* Avoid -Wall warning */
1969 break;
1970 }
1971
1972 return fixP;
1973}
1974
1975/* Return BFD reloc type from opinfo field in a fixS.
1976 It's tricky using fx_r_type in m32r_frob_file because the values
1977 are BFD_RELOC_UNUSED + operand number. */
1978#define FX_OPINFO_R_TYPE(f) ((f)->fx_cgen.opinfo)
1979
1980/* Sort any unmatched HI16 relocs so that they immediately precede
1981 the corresponding LO16 reloc. This is called before md_apply_fix3 and
1982 tc_gen_reloc. */
1983
1984void
1985m32r_frob_file ()
1986{
1987 struct m32r_hi_fixup *l;
1988
1989 for (l = m32r_hi_fixup_list; l != NULL; l = l->next)
1990 {
1991 segment_info_type *seginfo;
1992 int pass;
1993
1994 assert (FX_OPINFO_R_TYPE (l->fixp) == BFD_RELOC_M32R_HI16_SLO
1995 || FX_OPINFO_R_TYPE (l->fixp) == BFD_RELOC_M32R_HI16_ULO);
1996
1997 /* Check quickly whether the next fixup happens to be a matching low. */
1998 if (l->fixp->fx_next != NULL
1999 && FX_OPINFO_R_TYPE (l->fixp->fx_next) == BFD_RELOC_M32R_LO16
2000 && l->fixp->fx_addsy == l->fixp->fx_next->fx_addsy
2001 && l->fixp->fx_offset == l->fixp->fx_next->fx_offset)
2002 continue;
2003
2004 /* Look through the fixups for this segment for a matching `low'.
2005 When we find one, move the high/shigh just in front of it. We do
2006 this in two passes. In the first pass, we try to find a
2007 unique `low'. In the second pass, we permit multiple high's
2008 relocs for a single `low'. */
2009 seginfo = seg_info (l->seg);
2010 for (pass = 0; pass < 2; pass++)
2011 {
2012 fixS *f;
2013 fixS *prev;
2014
2015 prev = NULL;
2016 for (f = seginfo->fix_root; f != NULL; f = f->fx_next)
2017 {
2018 /* Check whether this is a `low' fixup which matches l->fixp. */
2019 if (FX_OPINFO_R_TYPE (f) == BFD_RELOC_M32R_LO16
2020 && f->fx_addsy == l->fixp->fx_addsy
2021 && f->fx_offset == l->fixp->fx_offset
2022 && (pass == 1
2023 || prev == NULL
2024 || (FX_OPINFO_R_TYPE (prev) != BFD_RELOC_M32R_HI16_SLO
2025 && FX_OPINFO_R_TYPE (prev) != BFD_RELOC_M32R_HI16_ULO)
2026 || prev->fx_addsy != f->fx_addsy
2027 || prev->fx_offset != f->fx_offset))
2028 {
2029 fixS **pf;
2030
2031 /* Move l->fixp before f. */
2032 for (pf = &seginfo->fix_root;
2033 *pf != l->fixp;
2034 pf = & (*pf)->fx_next)
2035 assert (*pf != NULL);
2036
2037 *pf = l->fixp->fx_next;
2038
2039 l->fixp->fx_next = f;
2040 if (prev == NULL)
2041 seginfo->fix_root = l->fixp;
2042 else
2043 prev->fx_next = l->fixp;
2044
2045 break;
2046 }
2047
2048 prev = f;
2049 }
2050
2051 if (f != NULL)
2052 break;
2053
2054 if (pass == 1
2055 && warn_unmatched_high)
2056 as_warn_where (l->fixp->fx_file, l->fixp->fx_line,
2057 _("Unmatched high/shigh reloc"));
2058 }
2059 }
2060}
2061
2062/* See whether we need to force a relocation into the output file.
2063 This is used to force out switch and PC relative relocations when
2064 relaxing. */
2065
2066int
2067m32r_force_relocation (fix)
2068 fixS *fix;
2069{
2070 if (generic_force_reloc (fix))
2071 return 1;
2072
2073 if (! m32r_relax)
2074 return 0;
2075
2076 return fix->fx_pcrel;
2077}
2078\f
2079/* Write a value out to the object file, using the appropriate endianness. */
2080
2081void
2082md_number_to_chars (buf, val, n)
2083 char *buf;
2084 valueT val;
2085 int n;
2086{
2087 if (target_big_endian)
2088 number_to_chars_bigendian (buf, val, n);
2089 else
2090 number_to_chars_littleendian (buf, val, n);
2091}
2092
2093/* Turn a string in input_line_pointer into a floating point constant
2094 of type TYPE, and store the appropriate bytes in *LITP. The number
2095 of LITTLENUMS emitted is stored in *SIZEP. An error message is
2096 returned, or NULL on OK. */
2097
2098/* Equal to MAX_PRECISION in atof-ieee.c. */
2099#define MAX_LITTLENUMS 6
2100
2101char *
2102md_atof (type, litP, sizeP)
2103 char type;
2104 char *litP;
2105 int *sizeP;
2106{
2107 int i;
2108 int prec;
2109 LITTLENUM_TYPE words[MAX_LITTLENUMS];
2110 char *t;
2111
2112 switch (type)
2113 {
2114 case 'f':
2115 case 'F':
2116 case 's':
2117 case 'S':
2118 prec = 2;
2119 break;
2120
2121 case 'd':
2122 case 'D':
2123 case 'r':
2124 case 'R':
2125 prec = 4;
2126 break;
2127
2128 /* FIXME: Some targets allow other format chars for bigger sizes
2129 here. */
2130
2131 default:
2132 *sizeP = 0;
2133 return _("Bad call to md_atof()");
2134 }
2135
2136 t = atof_ieee (input_line_pointer, type, words);
2137 if (t)
2138 input_line_pointer = t;
2139 *sizeP = prec * sizeof (LITTLENUM_TYPE);
2140
2141 if (target_big_endian)
2142 {
2143 for (i = 0; i < prec; i++)
2144 {
2145 md_number_to_chars (litP, (valueT) words[i],
2146 sizeof (LITTLENUM_TYPE));
2147 litP += sizeof (LITTLENUM_TYPE);
2148 }
2149 }
2150 else
2151 {
2152 for (i = prec - 1; i >= 0; i--)
2153 {
2154 md_number_to_chars (litP, (valueT) words[i],
2155 sizeof (LITTLENUM_TYPE));
2156 litP += sizeof (LITTLENUM_TYPE);
2157 }
2158 }
2159
2160 return 0;
2161}
2162
2163void
2164m32r_elf_section_change_hook ()
2165{
2166 /* If we have reached the end of a section and we have just emitted a
2167 16 bit insn, then emit a nop to make sure that the section ends on
2168 a 32 bit boundary. */
2169
2170 if (prev_insn.insn || seen_relaxable_p)
2171 (void) m32r_fill_insn (0);
2172}
2173
2174/* Return true if can adjust the reloc to be relative to its section
2175 (such as .data) instead of relative to some symbol. */
2176
2177bfd_boolean
2178m32r_fix_adjustable (fixP)
2179 fixS *fixP;
2180{
2181 bfd_reloc_code_real_type reloc_type;
2182
2183 if ((int) fixP->fx_r_type >= (int) BFD_RELOC_UNUSED)
2184 {
2185 const CGEN_INSN *insn = NULL;
2186 int opindex = (int) fixP->fx_r_type - (int) BFD_RELOC_UNUSED;
2187 const CGEN_OPERAND *operand =
2188 cgen_operand_lookup_by_num(gas_cgen_cpu_desc, opindex);
2189 reloc_type = md_cgen_lookup_reloc (insn, operand, fixP);
2190 }
2191 else
2192 reloc_type = fixP->fx_r_type;
2193
2194 /* We need the symbol name for the VTABLE entries. */
2195 if (reloc_type == BFD_RELOC_VTABLE_INHERIT
2196 || reloc_type == BFD_RELOC_VTABLE_ENTRY)
2197 return 0;
2198
2199 return 1;
2200}
2201
2202void
2203m32r_elf_final_processing ()
2204{
2205 if (use_parallel)
2206 m32r_flags |= E_M32R_HAS_PARALLEL;
2207 elf_elfheader (stdoutput)->e_flags |= m32r_flags;
2208}
This page took 0.029209 seconds and 4 git commands to generate.