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