* config/tc-alpha.h: Fix formatting.
[external/binutils.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 }