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