Fix determination of when two instructions can be combined in parallel.
[external/binutils.git] / gas / config / tc-m32r.c
1 /* tc-m32r.c -- Assembler for the Mitsubishi M32R/X.
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 "cgen-opc.h"
26
27 typedef struct
28 {
29   const CGEN_INSN *     insn;
30   CGEN_FIELDS           fields;
31 #ifdef CGEN_INT_INSN
32   cgen_insn_t           buffer [CGEN_MAX_INSN_SIZE / sizeof (cgen_insn_t)];
33 #else
34   char                  buffer [CGEN_MAX_INSN_SIZE];
35 #endif
36   char *                addr;
37   fragS *               frag;
38 }
39 m32r_insn;
40
41 /* prev_insn.insn is non-null if last insn was a 16 bit insn on a 32 bit
42    boundary (i.e. was the first of two 16 bit insns).  */
43 static m32r_insn        prev_insn;
44
45 /* Non-zero if we've seen a relaxable insn since the last 32 bit
46    alignment request.  */
47 static int seen_relaxable_p = 0;
48
49 /* Non-zero if -relax specified, in which case sufficient relocs are output
50    for the linker to do relaxing.
51    We do simple forms of relaxing internally, but they are always done.
52    This flag does not apply to them.  */
53 static int m32r_relax;
54
55 /* If non-NULL, pointer to cpu description file to read.
56    This allows runtime additions to the assembler.  */
57 static char * m32r_cpu_desc;
58
59 /* start-sanitize-m32rx */
60 /* Non-zero if -m32rx has been specified, in which case support for the
61    extended M32RX instruction set should be enabled.  */
62 static int enable_m32rx = 0;
63
64 /* Non-zero if the programmer should be warned when an explicit parallel
65    instruction might have constraint violations.  */
66 static int warn_explicit_parallel_conflicts = 1;
67 /* end-sanitize-m32rx */
68
69 /* stuff for .scomm symbols.  */
70 static segT     sbss_section;
71 static asection scom_section;
72 static asymbol  scom_symbol;
73
74 const char comment_chars[]        = ";";
75 const char line_comment_chars[]   = "#";
76 const char line_separator_chars[] = "";
77 const char EXP_CHARS[]            = "eE";
78 const char FLT_CHARS[]            = "dD";
79
80 /* Relocations against symbols are done in two
81    parts, with a HI relocation and a LO relocation.  Each relocation
82    has only 16 bits of space to store an addend.  This means that in
83    order for the linker to handle carries correctly, it must be able
84    to locate both the HI and the LO relocation.  This means that the
85    relocations must appear in order in the relocation table.
86
87    In order to implement this, we keep track of each unmatched HI
88    relocation.  We then sort them so that they immediately precede the
89    corresponding LO relocation. */
90
91 struct m32r_hi_fixup
92 {
93   struct m32r_hi_fixup * next;  /* Next HI fixup.  */
94   fixS *                 fixp;  /* This fixup.  */
95   segT                   seg;   /* The section this fixup is in.  */
96
97 };
98
99 /* The list of unmatched HI relocs.  */
100
101 static struct m32r_hi_fixup * m32r_hi_fixup_list;
102
103 \f
104 /* start-sanitize-m32rx */
105 static void
106 allow_m32rx (int on)
107 {
108   enable_m32rx = on;
109
110   if (stdoutput != NULL)
111     bfd_set_arch_mach (stdoutput, TARGET_ARCH,
112                        enable_m32rx ? bfd_mach_m32rx : bfd_mach_m32r);
113 }
114 /* end-sanitize-m32rx */
115 \f
116 const char * md_shortopts = "";
117
118 struct option md_longopts[] =
119 {
120 /* start-sanitize-m32rx */
121 #define OPTION_M32RX    (OPTION_MD_BASE)
122   {"m32rx", no_argument, NULL, OPTION_M32RX},
123 #define OPTION_WARN     (OPTION_MD_BASE + 1)
124   {"warn-explicit-parallel-conflicts", no_argument, NULL, OPTION_WARN},
125 #define OPTION_NO_WARN  (OPTION_MD_BASE + 2)
126   {"no-warn-explicit-parallel-conflicts", no_argument, NULL, OPTION_NO_WARN},
127 /* end-sanitize-m32rx */
128
129 #if 0 /* not supported yet */
130 #define OPTION_RELAX  (OPTION_MD_BASE + 3)
131   {"relax", no_argument, NULL, OPTION_RELAX},
132 #define OPTION_CPU_DESC (OPTION_MD_BASE + 4)
133   {"cpu-desc", required_argument, NULL, OPTION_CPU_DESC},
134 #endif
135
136   {NULL, no_argument, NULL, 0}
137 };
138 size_t md_longopts_size = sizeof (md_longopts);
139
140 int
141 md_parse_option (c, arg)
142      int    c;
143      char * arg;
144 {
145   switch (c)
146     {
147 /* start-sanitize-m32rx */
148     case OPTION_M32RX:
149       allow_m32rx (1);
150       break;
151       
152     case OPTION_WARN:
153       warn_explicit_parallel_conflicts = 1;
154       break;
155       
156     case OPTION_NO_WARN:
157       warn_explicit_parallel_conflicts = 0;
158       break;
159 /* end-sanitize-m32rx */
160       
161 #if 0 /* not supported yet */
162     case OPTION_RELAX:
163       m32r_relax = 1;
164       break;
165     case OPTION_CPU_DESC:
166       m32r_cpu_desc = arg;
167       break;
168 #endif
169     default:
170       return 0;
171     }
172   return 1;
173 }
174
175 void
176 md_show_usage (stream)
177   FILE * stream;
178 {
179   fprintf (stream, "M32R/X options:\n");
180 /* start-sanitize-m32rx */
181   fprintf (stream, "\
182 --m32rx                 support the extended m32rx instruction set\n");
183   
184   fprintf (stream, "\
185 --warn-explicit-parallel-conflicts      Warn when parallel instrucitons violate contraints\
186 --no-warn-explicit-parallel-conflicts   Do not warn when parallel instrucitons violate contraints\n");
187 /* end-sanitize-m32rx */
188
189 #if 0
190   fprintf (stream, "\
191 --relax                 create linker relaxable code\n");
192   fprintf (stream, "\
193 --cpu-desc              provide runtime cpu description file\n");
194 #endif
195
196
197 static void fill_insn PARAMS ((int));
198 static void m32r_scomm PARAMS ((int));
199
200 /* Set by md_assemble for use by m32r_fill_insn.  */
201 static subsegT prev_subseg;
202 static segT prev_seg;
203
204 /* The target specific pseudo-ops which we support.  */
205 const pseudo_typeS md_pseudo_table[] =
206 {
207   { "word", cons, 4 },
208   { "fillinsn", fill_insn, 0 },
209   { "scomm", m32r_scomm, 0 },
210 /* start-sanitize-m32rx */
211   { "m32r",  allow_m32rx, 0},
212   { "m32rx", allow_m32rx, 1},
213 /* end-sanitize-m32rx */
214   { NULL, NULL, 0 }
215 };
216
217 /* FIXME: Should be machine generated.  */
218 #define NOP_INSN 0x7000
219 #define PAR_NOP_INSN 0xf000 /* can only be used in 2nd slot */
220
221 /* When we align the .text section, insert the correct NOP pattern.
222    N is the power of 2 alignment.  LEN is the length of pattern FILL.
223    MAX is the maximum number of characters to skip when doing the alignment,
224    or 0 if there is no maximum.  */
225
226 int
227 m32r_do_align (n, fill, len, max)
228      int          n;
229      const char * fill;
230      int          len;
231      int          max;
232 {
233   if ((fill == NULL || (* fill == 0 && len == 1))
234       && (now_seg->flags & SEC_CODE) != 0
235       /* Only do this special handling if aligning to at least a
236          4 byte boundary.  */
237       && n > 1
238      /* Only do this special handling if we're allowed to emit at
239          least two bytes.  */
240       && (max == 0 || max > 1))
241     {
242       static const unsigned char nop_pattern[] = { 0xf0, 0x00 };
243
244 #if 0
245       /* First align to a 2 byte boundary, in case there is an odd .byte.  */
246       /* FIXME: How much memory will cause gas to use when assembling a big
247          program?  Perhaps we can avoid the frag_align call?  */
248       frag_align (1, 0, 0);
249 #endif
250       /* Next align to a 4 byte boundary (we know n >= 2) using a parallel
251          nop.  */
252       frag_align_pattern (2, nop_pattern, sizeof nop_pattern, 0);
253       /* If doing larger alignments use a repeating sequence of appropriate
254          nops.  */
255       if (n > 2)
256         {
257           static const unsigned char multi_nop_pattern[] =
258           { 0x70, 0x00, 0xf0, 0x00 };
259           frag_align_pattern (n, multi_nop_pattern, sizeof multi_nop_pattern,
260                               max ? max - 2 : 0);
261         }
262       return 1;
263     }
264
265   return 0;
266 }
267
268 static void
269 assemble_nop (opcode)
270      int opcode;
271 {
272   char * f = frag_more (2);
273   md_number_to_chars (f, opcode, 2);
274 }
275
276 /* If the last instruction was the first of 2 16 bit insns,
277    output a nop to move the PC to a 32 bit boundary.
278
279    This is done via an alignment specification since branch relaxing
280    may make it unnecessary.
281
282    Internally, we need to output one of these each time a 32 bit insn is
283    seen after an insn that is relaxable.  */
284
285 static void
286 fill_insn (ignore)
287      int ignore;
288 {
289   (void) m32r_do_align (2, NULL, 0, 0);
290   prev_insn.insn = NULL;
291   seen_relaxable_p = 0;
292 }
293
294 /* Cover function to fill_insn called after a label and at end of assembly.
295
296    The result is always 1: we're called in a conditional to see if the
297    current line is a label.  */
298
299 int
300 m32r_fill_insn (done)
301      int done;
302 {
303   segT    seg;
304   subsegT subseg;
305
306   if (prev_seg != NULL)
307     {
308       seg    = now_seg;
309       subseg = now_subseg;
310       
311       subseg_set (prev_seg, prev_subseg);
312       
313       fill_insn (0);
314       
315       subseg_set (seg, subseg);
316     }
317   
318   return 1;
319 }
320 \f
321 void
322 md_begin ()
323 {
324   flagword applicable;
325   segT     seg;
326   subsegT  subseg;
327
328   /* Initialize the `cgen' interface.  */
329
330   /* This is a callback from cgen to gas to parse operands.  */
331   cgen_parse_operand_fn = cgen_parse_operand;
332   
333   /* Set the machine number and endian.  */
334   CGEN_SYM (init_asm) (0 /* mach number */,
335                        target_big_endian ?
336                        CGEN_ENDIAN_BIG : CGEN_ENDIAN_LITTLE);
337
338 #if 0 /* not supported yet */
339   /* If a runtime cpu description file was provided, parse it.  */
340   if (m32r_cpu_desc != NULL)
341     {
342       const char * errmsg;
343
344       errmsg = cgen_read_cpu_file (m32r_cpu_desc);
345       if (errmsg != NULL)
346         as_bad ("%s: %s", m32r_cpu_desc, errmsg);
347     }
348 #endif
349
350   /* Save the current subseg so we can restore it [it's the default one and
351      we don't want the initial section to be .sbss].  */
352   seg    = now_seg;
353   subseg = now_subseg;
354
355   /* The sbss section is for local .scomm symbols.  */
356   sbss_section = subseg_new (".sbss", 0);
357   
358   /* This is copied from perform_an_assembly_pass.  */
359   applicable = bfd_applicable_section_flags (stdoutput);
360   bfd_set_section_flags (stdoutput, sbss_section, applicable & SEC_ALLOC);
361   
362 #if 0 /* What does this do? [see perform_an_assembly_pass]  */
363   seg_info (bss_section)->bss = 1;
364 #endif
365
366   subseg_set (seg, subseg);
367
368   /* We must construct a fake section similar to bfd_com_section
369      but with the name .scommon.  */
370   scom_section                = bfd_com_section;
371   scom_section.name           = ".scommon";
372   scom_section.output_section = & scom_section;
373   scom_section.symbol         = & scom_symbol;
374   scom_section.symbol_ptr_ptr = & scom_section.symbol;
375   scom_symbol                 = * bfd_com_section.symbol;
376   scom_symbol.name            = ".scommon";
377   scom_symbol.section         = & scom_section;
378
379 /* start-sanitize-m32rx */
380   allow_m32rx (enable_m32rx);
381 /* end-sanitize-m32rx */
382 }
383
384 /* start-sanitize-m32rx */
385 /* Returns non zero if the given instruction writes to a destination register.  */
386 static int
387 writes_to_dest_reg (insn)
388      const CGEN_INSN * insn;
389 {
390   unsigned char * syntax = CGEN_SYNTAX_STRING (CGEN_INSN_SYNTAX (insn));
391   unsigned char   c;
392   
393   /* Scan the syntax string looking for a destination register.  */
394   while ((c = (* syntax ++)) != 0)
395     if (c == 128 + M32R_OPERAND_DR)
396       break;
397
398   return c;
399 }
400
401 /* Returns non zero if the given instruction reads from a source register.
402    Ignores the first 'num_ignore' macthes in the syntax string.  */
403 static int
404 reads_from_src_reg (insn, num_ignore)
405      const CGEN_INSN * insn;
406      int               num_ignore;
407 {
408   unsigned char * syntax = CGEN_SYNTAX_STRING (CGEN_INSN_SYNTAX (insn));
409   unsigned char   c;
410   
411   /* Scan the syntax string looking for a source register.  */
412   while ((c = (* syntax ++)) != 0)
413     {
414       if (   c == 128 + M32R_OPERAND_SR
415           || c == 128 + M32R_OPERAND_SRC1
416           || c == 128 + M32R_OPERAND_SRC2)
417         {
418           if (num_ignore -- > 0)
419             continue;
420           else
421             break;
422         }
423     }
424
425   return c;
426 }
427
428 /* Returns the integer value of the destination register held in the fields. */
429 #define get_dest_reg(fields) (fields).f_r1
430
431 /* Returns an integer representing the source register of the given type.  */
432 static int
433 get_src_reg (syntax_field, fields)
434      unsigned char syntax_field;
435      CGEN_FIELDS * fields;
436 {
437   switch (syntax_field)
438     {
439     case 128 + M32R_OPERAND_SR:    return fields->f_r2;
440       /* Relies upon the fact that no instruction with a $src1 operand
441          also has a $dr operand.  */
442     case 128 + M32R_OPERAND_SRC1:  return fields->f_r1;
443     case 128 + M32R_OPERAND_SRC2:  return fields->f_r2;
444     default:                       abort(); return -1;
445     }
446 }
447
448 /* Returns zero iff the output register of instruction 'a'
449    is an input register to instruction 'b'.  */
450 static int
451 check_parallel_io_clash (a, b)
452      m32r_insn * a;
453      m32r_insn * b;
454 {     
455   if (writes_to_dest_reg (a->insn))
456     {
457       unsigned char syntax_field;
458       int           skip = 0;
459       
460       while (syntax_field = reads_from_src_reg (b->insn, skip ++))
461         {
462           if (get_src_reg (syntax_field, & b->fields) == get_dest_reg (a->fields))
463             return 0;
464         }
465     }
466
467   return 1;
468 }
469
470
471 /* Returns NULL if the two 16 bit insns can be executed in parallel,
472    otherwise it returns a pointer to an error message explaining why not.  */
473 static const char *
474 can_make_parallel (a, b)
475      m32r_insn * a;
476      m32r_insn * b;
477 {
478   PIPE_ATTR a_pipe;
479   PIPE_ATTR b_pipe;
480
481   /* Make sure the instructions are the right length.  */
482   if (   CGEN_FIELDS_BITSIZE (& a->fields) != 16
483       || CGEN_FIELDS_BITSIZE (& b->fields) != 16)
484     abort();
485   
486   a_pipe = CGEN_INSN_ATTR (a->insn, CGEN_INSN_PIPE);
487   b_pipe = CGEN_INSN_ATTR (b->insn, CGEN_INSN_PIPE);
488
489   /* Make sure that the instructions use the correct execution pipelines.  */
490   if (   a_pipe == PIPE_NONE
491       || b_pipe == PIPE_NONE)
492     return "Instructions do not use parallel execution pipelines.";
493   
494   if (   a_pipe == PIPE_S
495       || b_pipe == PIPE_O)
496     return "Instructions share the same execution pipeline";
497
498   if (   writes_to_dest_reg (a->insn)
499       && writes_to_dest_reg (b->insn)
500       && (get_dest_reg (a->fields) == get_dest_reg (b->fields)))
501     return "Instructions write to the same destination register.";
502
503   return NULL;
504 }
505
506 #ifdef CGEN_INT_INSN
507 static void
508 make_parallel (buffer)
509      cgen_insn_t * buffer;
510 {
511   /* Force the top bit of the second insn to be set.  */
512
513   bfd_vma value;
514       
515   if (CGEN_CURRENT_ENDIAN == CGEN_ENDIAN_BIG)
516     {
517       value = bfd_getb16 ((bfd_byte *) buffer);
518       value |= 0x8000;
519       bfd_putb16 (value, (char *) buffer);
520     }
521   else
522     {
523       value = bfd_getl16 ((bfd_byte *) buffer);
524       value |= 0x8000;
525       bfd_putl16 (value, (char *) buffer);
526     }
527 }
528 #else
529 static void
530 make_parallel (buffer)
531      char * buffer;
532 {
533   /* Force the top bit of the second insn to be set.  */
534
535   buffer [CGEN_CURRENT_ENDIAN == CGEN_ENDIAN_BIG ? 0 : 1] |= 0x80;
536 }
537 #endif
538
539
540 static void
541 assemble_parallel_insn (str, str2)
542      char * str;
543      char * str2;
544 {
545   char *    str3;
546   m32r_insn first;
547   m32r_insn second;
548   char *    errmsg;
549   
550   * str2 = 0; /* Seperate the two instructions.  */
551
552   /* If there was a previous 16 bit insn, then fill the following 16 bit slot,
553      so that the parallel instruction will start on a 32 bit boundary.  */
554   if (prev_insn.insn)
555     fill_insn (0);
556
557   /* Parse the first instruction.  */
558   if (! (first.insn = CGEN_SYM (assemble_insn)
559          (str, & first.fields, first.buffer, & errmsg)))
560     {
561       as_bad (errmsg);
562       return;
563     }
564
565   /* Check to see if this is an allowable parallel insn.  */
566   if (CGEN_INSN_ATTR (first.insn, CGEN_INSN_PIPE) == PIPE_NONE)
567     {
568       as_bad ("instruction '%s' cannot be executed in parallel.", str);
569       return;
570     }
571   
572   if (! enable_m32rx
573       && CGEN_INSN_ATTR (first.insn, CGEN_INSN_MACH) == (1 << MACH_M32RX))
574     {
575       as_bad ("instruction '%s' is for the M32RX only", str);
576       return;
577     }
578   
579   *str2 = '|';       /* Restore the original assembly text, just in case it is needed.  */
580   str3  = str;       /* Save the original string pointer.  */
581   str   = str2 + 2;  /* Advanced past the parsed string.  */
582   str2  = str3;      /* Remember the entire string in case it is needed for error messages.  */
583   
584   /* Preserve any fixups that have been generated and reset the list to empty.  */
585   cgen_save_fixups();
586
587   /* Parse the second instruction.  */
588   if (! (second.insn = CGEN_SYM (assemble_insn)
589          (str, & second.fields, second.buffer, & errmsg)))
590     {
591       as_bad (errmsg);
592       return;
593     }
594
595   /* Check it.  */
596   if (! enable_m32rx
597       && CGEN_INSN_ATTR (second.insn, CGEN_INSN_MACH) == (1 << MACH_M32RX))
598     {
599       as_bad ("instruction '%s' is for the M32RX only", str);
600       return;
601     }
602   
603   if (! enable_m32rx)
604     {
605       if (   strcmp (first.insn->name, "nop") != 0
606           && strcmp (second.insn->name, "nop") != 0)
607         {
608           as_bad ("'%s': only the NOP instruction can be issued in parallel on the m32r", str2);
609           return;
610         }
611     }
612
613   /* We assume that if the first instruction writes to a register that is
614      read by the second instruction it is because the programmer intended
615      this to happen, (after all they have explicitly requested that these
616      two instructions be executed in parallel).  Although if the global
617      variable warn_explicit_parallel_conflicts is true then we do generate
618      a warning message.  Similarly we assume that parallel branch and jump
619      instructions are deliberate and should not  produce errors.  */
620   
621   if (can_make_parallel (& first, & second) == NULL)
622     {
623       if (warn_explicit_parallel_conflicts
624           && (! check_parallel_io_clash (& first, & second)))
625         as_warn ("%s: output of first instruction fails to overwrite input of second instruction.", str2);
626       
627       /* Get the fixups for the first instruction.  */
628       cgen_swap_fixups ();
629
630       /* Write it out.  */
631       (void) cgen_asm_finish_insn (first.insn, first.buffer,
632                                    CGEN_FIELDS_BITSIZE (& first.fields));
633       
634       /* Force the top bit of the second insn to be set.  */
635       make_parallel (second.buffer);
636
637       /* Get its fixups.  */
638       cgen_restore_fixups ();
639
640       /* Write it out.  */
641       (void) cgen_asm_finish_insn (second.insn, second.buffer,
642                                    CGEN_FIELDS_BITSIZE (& second.fields));
643     }
644   else if ((errmsg = (char *) can_make_parallel (& second, & first,
645                                                  false, false)) == NULL)
646     {
647       if (warn_explicit_parallel_conflicts
648           && (! check_parallel_io_clash (& second, & first)))
649         as_warn ("%s: output of second instruction fails to overwrite input of first instruction.", str2);
650       
651       /* Write out the second instruction first.  */
652       (void) cgen_asm_finish_insn (second.insn, second.buffer,
653                                    CGEN_FIELDS_BITSIZE (& second.fields));
654       
655       /* Force the top bit of the first instruction to be set.  */
656       make_parallel (first.buffer);
657
658       /* Get the fixups for the first instruction.  */
659       cgen_restore_fixups ();
660
661       /* Write out the first instruction.  */
662       (void) cgen_asm_finish_insn (first.insn, first.buffer,
663                                    CGEN_FIELDS_BITSIZE (& first.fields));
664     }
665   else
666     {
667       as_bad ("'%s': %s", str2, errmsg);
668       return;
669     }
670       
671   /* Set these so m32r_fill_insn can use them.  */
672   prev_seg    = now_seg;
673   prev_subseg = now_subseg;
674
675   return;
676 }
677 /* end-sanitize-m32rx */
678
679
680 void
681 md_assemble (str)
682      char * str;
683 {
684   m32r_insn insn;
685   char *    errmsg;
686   char *    str2 = NULL;
687
688   /* Initialize GAS's cgen interface for a new instruction.  */
689   cgen_asm_init_parse ();
690
691 /* start-sanitize-m32rx */
692   /* Look for a parallel instruction seperator.  */
693   if ((str2 = strstr (str, "||")) != NULL)
694     {
695       assemble_parallel_insn (str, str2);
696       return;
697     }
698 /* end-sanitize-m32rx */
699   
700   insn.insn = CGEN_SYM (assemble_insn) (str, & insn.fields, insn.buffer, & errmsg);
701   if (!insn.insn)
702     {
703       as_bad (errmsg);
704       return;
705     }
706
707 /* start-sanitize-m32rx */
708   if (! enable_m32rx && CGEN_INSN_ATTR (insn.insn, CGEN_INSN_MACH) == (1 << MACH_M32RX))
709     {
710       as_bad ("instruction '%s' is for the M32RX only", str);
711       return;
712     }
713 /* end-sanitize-m32rx */
714   
715   if (CGEN_INSN_BITSIZE (insn.insn) == 32)
716     {
717       /* 32 bit insns must live on 32 bit boundaries.  */
718       if (prev_insn.insn || seen_relaxable_p)
719         {
720           /* FIXME: If calling fill_insn too many times turns us into a memory
721              pig, can we call assemble_nop instead of !seen_relaxable_p?  */
722           fill_insn (0);
723         }
724       
725       (void) cgen_asm_finish_insn (insn.insn, insn.buffer,
726                                    CGEN_FIELDS_BITSIZE (& insn.fields));
727     }
728   else
729     {
730 /* start-sanitize-m32rx */
731 /* start-sanitize-phase2-m32rx */
732       int swap = false;
733 /* end-sanitize-phase2-m32rx */
734 /* end-sanitize-m32rx */
735       
736       if (CGEN_INSN_BITSIZE (insn.insn) != 16)
737         abort();
738       
739       /* Keep track of whether we've seen a pair of 16 bit insns.
740          prev_insn.insn is NULL when we're on a 32 bit boundary.  */
741       if (prev_insn.insn)
742         {
743 /* start-sanitize-m32rx */
744 /* start-sanitize-phase2-m32rx */
745           /* Look to see if this instruction can be combined with the
746              previous instruction to make one, parallel, 32 bit instruction.
747              If the previous instruction (potentially) changed the flow of
748              program control, then it cannot be combined with the current
749              instruction.  Also if the output of the previous instruction
750              is used as an input to the current instruction then it cannot
751              be combined.  Otherwise call can_make_parallel() with both
752              orderings of the instructions to see if they can be combined.  */
753           if (   ! CGEN_INSN_ATTR (prev_insn.insn, CGEN_INSN_COND_CTI)
754               && ! CGEN_INSN_ATTR (prev_insn.insn, CGEN_INSN_UNCOND_CTI)
755               &&   check_parallel_io_clash (& prev_insn, &insn)
756                  )
757             {
758               if (can_make_parallel (& prev_insn, & insn) == NULL)
759                 make_parallel (insn.buffer);
760               else if (can_make_parallel (& insn, & prev_insn.insn) == NULL)
761                 swap = true;
762             }
763 /* end-sanitize-phase2-m32rx */
764 /* end-sanitize-m32rx */
765           
766           prev_insn.insn = NULL;
767         }
768       else
769         {
770           prev_insn = insn;
771         }
772
773       /* Record the frag that might be used by this insn.  */
774       insn.frag = frag_now;
775       insn.addr = cgen_asm_finish_insn (insn.insn, insn.buffer,
776                                    CGEN_FIELDS_BITSIZE (& insn.fields));
777
778 /* start-sanitize-m32rx */
779 /* start-sanitize-phase2-m32rx */
780       if (swap)
781         {
782           int     tmp;
783           
784 #define SWAP_BYTES(a,b) tmp = a; a = b; b = tmp
785
786           /* Swap the two insns */
787           SWAP_BYTES (prev_insn.addr [0], insn.addr [0]);
788           SWAP_BYTES (prev_insn.addr [1], insn.addr [1]);
789
790           make_parallel (insn.addr);
791
792           /* Swap any relaxable frags recorded for the two insns.  */
793           if (prev_insn.frag->fr_opcode == prev_insn.addr)
794             {
795               prev_insn.frag->fr_opcode = insn.addr;
796             }
797           else if (insn.frag->fr_opcode == insn.addr)
798             {
799               insn.frag->fr_opcode = prev_insn.addr;
800             }
801         }
802 /* end-sanitize-phase2-m32rx */
803
804       /* Record where this instruction was assembled.  */
805       prev_insn.addr = insn.addr;
806       prev_insn.frag = insn.frag;
807 /* end-sanitize-m32rx */
808       
809       /* If the insn needs the following one to be on a 32 bit boundary
810          (e.g. subroutine calls), fill this insn's slot.  */
811       if (prev_insn.insn
812           && CGEN_INSN_ATTR (insn.insn, CGEN_INSN_FILL_SLOT) != 0)
813         fill_insn (0);
814
815       /* If this is a relaxable insn (can be replaced with a larger version)
816          mark the fact so that we can emit an alignment directive for a
817          following 32 bit insn if we see one.   */
818       if (CGEN_INSN_ATTR (insn.insn, CGEN_INSN_RELAXABLE) != 0)
819         seen_relaxable_p = 1;
820     }
821
822   /* Set these so m32r_fill_insn can use them.  */
823   prev_seg    = now_seg;
824   prev_subseg = now_subseg;
825 }
826
827 /* The syntax in the manual says constants begin with '#'.
828    We just ignore it.  */
829
830 void 
831 md_operand (expressionP)
832      expressionS * expressionP;
833 {
834   if (* input_line_pointer == '#')
835     {
836       input_line_pointer ++;
837       expression (expressionP);
838     }
839 }
840
841 valueT
842 md_section_align (segment, size)
843      segT   segment;
844      valueT size;
845 {
846   int align = bfd_get_section_alignment (stdoutput, segment);
847   return ((size + (1 << align) - 1) & (-1 << align));
848 }
849
850 symbolS *
851 md_undefined_symbol (name)
852   char * name;
853 {
854   return 0;
855 }
856 \f
857 /* .scomm pseudo-op handler.
858
859    This is a new pseudo-op to handle putting objects in .scommon.
860    By doing this the linker won't need to do any work and more importantly
861    it removes the implicit -G arg necessary to correctly link the object file.
862 */
863
864 static void
865 m32r_scomm (ignore)
866      int ignore;
867 {
868   register char *    name;
869   register char      c;
870   register char *    p;
871   offsetT            size;
872   register symbolS * symbolP;
873   offsetT            align;
874   int                align2;
875
876   name = input_line_pointer;
877   c = get_symbol_end ();
878
879   /* just after name is now '\0' */
880   p = input_line_pointer;
881   * p = c;
882   SKIP_WHITESPACE ();
883   if (* input_line_pointer != ',')
884     {
885       as_bad ("Expected comma after symbol-name: rest of line ignored.");
886       ignore_rest_of_line ();
887       return;
888     }
889
890   input_line_pointer ++;                /* skip ',' */
891   if ((size = get_absolute_expression ()) < 0)
892     {
893       as_warn (".SCOMMon length (%ld.) <0! Ignored.", (long) size);
894       ignore_rest_of_line ();
895       return;
896     }
897
898   /* The third argument to .scomm is the alignment.  */
899   if (* input_line_pointer != ',')
900     align = 8;
901   else
902     {
903       ++ input_line_pointer;
904       align = get_absolute_expression ();
905       if (align <= 0)
906         {
907           as_warn ("ignoring bad alignment");
908           align = 8;
909         }
910     }
911   /* Convert to a power of 2 alignment.  */
912   if (align)
913     {
914       for (align2 = 0; (align & 1) == 0; align >>= 1, ++ align2)
915         continue;
916       if (align != 1)
917         {
918           as_bad ("Common alignment not a power of 2");
919           ignore_rest_of_line ();
920           return;
921         }
922     }
923   else
924     align2 = 0;
925
926   * p = 0;
927   symbolP = symbol_find_or_make (name);
928   * p = c;
929
930   if (S_IS_DEFINED (symbolP))
931     {
932       as_bad ("Ignoring attempt to re-define symbol `%s'.",
933               S_GET_NAME (symbolP));
934       ignore_rest_of_line ();
935       return;
936     }
937
938   if (S_GET_VALUE (symbolP) && S_GET_VALUE (symbolP) != (valueT) size)
939     {
940       as_bad ("Length of .scomm \"%s\" is already %ld. Not changed to %ld.",
941               S_GET_NAME (symbolP),
942               (long) S_GET_VALUE (symbolP),
943               (long) size);
944
945       ignore_rest_of_line ();
946       return;
947     }
948
949   if (symbolP->local)
950     {
951       segT   old_sec    = now_seg;
952       int    old_subsec = now_subseg;
953       char * pfrag;
954
955       record_alignment (sbss_section, align2);
956       subseg_set (sbss_section, 0);
957       
958       if (align2)
959         frag_align (align2, 0, 0);
960       
961       if (S_GET_SEGMENT (symbolP) == sbss_section)
962         symbolP->sy_frag->fr_symbol = 0;
963       
964       symbolP->sy_frag = frag_now;
965       
966       pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP, size,
967                         (char *) 0);
968       * pfrag = 0;
969       S_SET_SIZE (symbolP, size);
970       S_SET_SEGMENT (symbolP, sbss_section);
971       S_CLEAR_EXTERNAL (symbolP);
972       subseg_set (old_sec, old_subsec);
973     }
974   else
975     {
976       S_SET_VALUE (symbolP, (valueT) size);
977       S_SET_ALIGN (symbolP, align2);
978       S_SET_EXTERNAL (symbolP);
979       S_SET_SEGMENT (symbolP, & scom_section);
980     }
981
982   demand_empty_rest_of_line ();
983 }
984 \f
985 /* Interface to relax_segment.  */
986
987 /* FIXME: Build table by hand, get it working, then machine generate.  */
988
989 const relax_typeS md_relax_table[] =
990 {
991 /* The fields are:
992    1) most positive reach of this state,
993    2) most negative reach of this state,
994    3) how many bytes this mode will add to the size of the current frag
995    4) which index into the table to try if we can't fit into this one.  */
996
997   /* The first entry must be unused because an `rlx_more' value of zero ends
998      each list.  */
999   {1, 1, 0, 0},
1000
1001   /* The displacement used by GAS is from the end of the 2 byte insn,
1002      so we subtract 2 from the following.  */
1003   /* 16 bit insn, 8 bit disp -> 10 bit range.
1004      This doesn't handle a branch in the right slot at the border:
1005      the "& -4" isn't taken into account.  It's not important enough to
1006      complicate things over it, so we subtract an extra 2 (or + 2 in -ve
1007      case).  */
1008   {511 - 2 - 2, -512 - 2 + 2, 0, 2 },
1009   /* 32 bit insn, 24 bit disp -> 26 bit range.  */
1010   {0x2000000 - 1 - 2, -0x2000000 - 2, 2, 0 },
1011   /* Same thing, but with leading nop for alignment.  */
1012   {0x2000000 - 1 - 2, -0x2000000 - 2, 4, 0 }
1013 };
1014
1015 long
1016 m32r_relax_frag (fragP, stretch)
1017      fragS * fragP;
1018      long    stretch;
1019 {
1020   /* Address of branch insn.  */
1021   long address = fragP->fr_address + fragP->fr_fix - 2;
1022   long growth = 0;
1023
1024   /* Keep 32 bit insns aligned on 32 bit boundaries.  */
1025   if (fragP->fr_subtype == 2)
1026     {
1027       if ((address & 3) != 0)
1028         {
1029           fragP->fr_subtype = 3;
1030           growth = 2;
1031         }
1032     }
1033   else if (fragP->fr_subtype == 3)
1034     {
1035       if ((address & 3) == 0)
1036         {
1037           fragP->fr_subtype = 2;
1038           growth = -2;
1039         }
1040     }
1041   else
1042     {
1043       growth = relax_frag (fragP, stretch);
1044
1045       /* Long jump on odd halfword boundary?  */
1046       if (fragP->fr_subtype == 2 && (address & 3) != 0)
1047         {
1048           fragP->fr_subtype = 3;
1049           growth += 2;
1050         }
1051     }
1052
1053   return growth;
1054 }
1055
1056 /* Return an initial guess of the length by which a fragment must grow to
1057    hold a branch to reach its destination.
1058    Also updates fr_type/fr_subtype as necessary.
1059
1060    Called just before doing relaxation.
1061    Any symbol that is now undefined will not become defined.
1062    The guess for fr_var is ACTUALLY the growth beyond fr_fix.
1063    Whatever we do to grow fr_fix or fr_var contributes to our returned value.
1064    Although it may not be explicit in the frag, pretend fr_var starts with a
1065    0 value.  */
1066
1067 int
1068 md_estimate_size_before_relax (fragP, segment)
1069      fragS * fragP;
1070      segT    segment;
1071 {
1072   int    old_fr_fix = fragP->fr_fix;
1073   char * opcode = fragP->fr_opcode;
1074
1075   /* The only thing we have to handle here are symbols outside of the
1076      current segment.  They may be undefined or in a different segment in
1077      which case linker scripts may place them anywhere.
1078      However, we can't finish the fragment here and emit the reloc as insn
1079      alignment requirements may move the insn about.  */
1080
1081   if (S_GET_SEGMENT (fragP->fr_symbol) != segment)
1082     {
1083       /* The symbol is undefined in this segment.
1084          Change the relaxation subtype to the max allowable and leave
1085          all further handling to md_convert_frag.  */
1086       fragP->fr_subtype = 2;
1087
1088 #if 0 /* Can't use this, but leave in for illustration.  */     
1089       /* Change 16 bit insn to 32 bit insn.  */
1090       opcode[0] |= 0x80;
1091
1092       /* Increase known (fixed) size of fragment.  */
1093       fragP->fr_fix += 2;
1094
1095       /* Create a relocation for it.  */
1096       fix_new (fragP, old_fr_fix, 4,
1097                fragP->fr_symbol,
1098                fragP->fr_offset, 1 /* pcrel */,
1099                /* FIXME: Can't use a real BFD reloc here.
1100                   cgen_md_apply_fix3 can't handle it.  */
1101                BFD_RELOC_M32R_26_PCREL);
1102
1103       /* Mark this fragment as finished.  */
1104       frag_wane (fragP);
1105 #else
1106       {
1107         const CGEN_INSN * insn;
1108         int               i;
1109
1110         /* Update the recorded insn.
1111            Fortunately we don't have to look very far.
1112            FIXME: Change this to record in the instruction the next higher
1113            relaxable insn to use.  */
1114         for (i = 0, insn = fragP->fr_cgen.insn; i < 4; i++, insn++)
1115           {
1116             if ((strcmp (CGEN_INSN_MNEMONIC (insn),
1117                          CGEN_INSN_MNEMONIC (fragP->fr_cgen.insn))
1118                  == 0)
1119                 && CGEN_INSN_ATTR (insn, CGEN_INSN_RELAX))
1120               break;
1121           }
1122         if (i == 4)
1123           abort ();
1124
1125         fragP->fr_cgen.insn = insn;
1126         return 2;
1127       }
1128 #endif
1129     }
1130
1131   return (fragP->fr_var + fragP->fr_fix - old_fr_fix);
1132
1133
1134 /* *fragP has been relaxed to its final size, and now needs to have
1135    the bytes inside it modified to conform to the new size.
1136
1137    Called after relaxation is finished.
1138    fragP->fr_type == rs_machine_dependent.
1139    fragP->fr_subtype is the subtype of what the address relaxed to.  */
1140
1141 void
1142 md_convert_frag (abfd, sec, fragP)
1143   bfd *   abfd;
1144   segT    sec;
1145   fragS * fragP;
1146 {
1147   char * opcode;
1148   char * displacement;
1149   int    target_address;
1150   int    opcode_address;
1151   int    extension;
1152   int    addend;
1153
1154   opcode = fragP->fr_opcode;
1155
1156   /* Address opcode resides at in file space.  */
1157   opcode_address = fragP->fr_address + fragP->fr_fix - 2;
1158
1159   switch (fragP->fr_subtype)
1160     {
1161     case 1 :
1162       extension = 0;
1163       displacement = & opcode[1];
1164       break;
1165     case 2 :
1166       opcode[0] |= 0x80;
1167       extension = 2;
1168       displacement = & opcode[1];
1169       break;
1170     case 3 :
1171       opcode[2] = opcode[0] | 0x80;
1172       md_number_to_chars (opcode, PAR_NOP_INSN, 2);
1173       opcode_address += 2;
1174       extension = 4;
1175       displacement = & opcode[3];
1176       break;
1177     default :
1178       abort ();
1179     }
1180
1181   if (S_GET_SEGMENT (fragP->fr_symbol) != sec)
1182     {
1183       /* symbol must be resolved by linker */
1184       if (fragP->fr_offset & 3)
1185         as_warn ("Addend to unresolved symbol not on word boundary.");
1186       addend = fragP->fr_offset >> 2;
1187     }
1188   else
1189     {
1190       /* Address we want to reach in file space.  */
1191       target_address = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset;
1192       target_address += fragP->fr_symbol->sy_frag->fr_address;
1193       addend = (target_address - (opcode_address & -4)) >> 2;
1194     }
1195
1196   /* Create a relocation for symbols that must be resolved by the linker.
1197      Otherwise output the completed insn.  */
1198
1199   if (S_GET_SEGMENT (fragP->fr_symbol) != sec)
1200     {
1201       assert (fragP->fr_subtype != 1);
1202       assert (fragP->fr_cgen.insn != 0);
1203       cgen_record_fixup (fragP,
1204                          /* Offset of branch insn in frag.  */
1205                          fragP->fr_fix + extension - 4,
1206                          fragP->fr_cgen.insn,
1207                          4 /*length*/,
1208                          /* FIXME: quick hack */
1209 #if 0
1210                          CGEN_OPERAND_ENTRY (fragP->fr_cgen.opindex),
1211 #else
1212                          CGEN_OPERAND_ENTRY (M32R_OPERAND_DISP24),
1213 #endif
1214                          fragP->fr_cgen.opinfo,
1215                          fragP->fr_symbol, fragP->fr_offset);
1216     }
1217
1218 #define SIZE_FROM_RELAX_STATE(n) ((n) == 1 ? 1 : 3)
1219
1220   md_number_to_chars (displacement, (valueT) addend,
1221                       SIZE_FROM_RELAX_STATE (fragP->fr_subtype));
1222
1223   fragP->fr_fix += extension;
1224 }
1225 \f
1226 /* Functions concerning relocs.  */
1227
1228 /* The location from which a PC relative jump should be calculated,
1229    given a PC relative reloc.  */
1230
1231 long
1232 md_pcrel_from_section (fixP, sec)
1233      fixS * fixP;
1234      segT   sec;
1235 {
1236   if (fixP->fx_addsy != (symbolS *) NULL
1237       && (! S_IS_DEFINED (fixP->fx_addsy)
1238           || S_GET_SEGMENT (fixP->fx_addsy) != sec))
1239     {
1240       /* The symbol is undefined (or is defined but not in this section).
1241          Let the linker figure it out.  */
1242       return 0;
1243     }
1244
1245   return (fixP->fx_frag->fr_address + fixP->fx_where) & -4L;
1246 }
1247
1248 /* Return the bfd reloc type for OPERAND of INSN at fixup FIXP.
1249    Returns BFD_RELOC_NONE if no reloc type can be found.
1250    *FIXP may be modified if desired.  */
1251
1252 bfd_reloc_code_real_type
1253 CGEN_SYM (lookup_reloc) (insn, operand, fixP)
1254      const CGEN_INSN *    insn;
1255      const CGEN_OPERAND * operand;
1256      fixS *               fixP;
1257 {
1258   switch (CGEN_OPERAND_TYPE (operand))
1259     {
1260     case M32R_OPERAND_DISP8 : return  BFD_RELOC_M32R_10_PCREL;
1261     case M32R_OPERAND_DISP16 : return BFD_RELOC_M32R_18_PCREL;
1262     case M32R_OPERAND_DISP24 : return BFD_RELOC_M32R_26_PCREL;
1263     case M32R_OPERAND_UIMM24 : return BFD_RELOC_M32R_24;
1264     case M32R_OPERAND_HI16 :
1265     case M32R_OPERAND_SLO16 :
1266     case M32R_OPERAND_ULO16 :
1267       /* If low/high/shigh/sda was used, it is recorded in `opinfo'.  */
1268       if (fixP->tc_fix_data.opinfo != 0)
1269         return fixP->tc_fix_data.opinfo;
1270       break;
1271     }
1272   return BFD_RELOC_NONE;
1273 }
1274
1275 /* Record a HI16 reloc for later matching with its LO16 cousin.  */
1276
1277 static void
1278 m32r_record_hi16 (reloc_type, fixP, seg)
1279      int    reloc_type;
1280      fixS * fixP;
1281      segT   seg;
1282 {
1283   struct m32r_hi_fixup * hi_fixup;
1284
1285   assert (reloc_type == BFD_RELOC_M32R_HI16_SLO
1286           || reloc_type == BFD_RELOC_M32R_HI16_ULO);
1287
1288   hi_fixup = ((struct m32r_hi_fixup *)
1289               xmalloc (sizeof (struct m32r_hi_fixup)));
1290   hi_fixup->fixp = fixP;
1291   hi_fixup->seg  = now_seg;
1292   hi_fixup->next = m32r_hi_fixup_list;
1293   
1294   m32r_hi_fixup_list = hi_fixup;
1295 }
1296
1297 /* Called while parsing an instruction to create a fixup.
1298    We need to check for HI16 relocs and queue them up for later sorting.  */
1299
1300 fixS *
1301 m32r_cgen_record_fixup_exp (frag, where, insn, length, operand, opinfo, exp)
1302      fragS *              frag;
1303      int                  where;
1304      const CGEN_INSN *    insn;
1305      int                  length;
1306      const CGEN_OPERAND * operand;
1307      int                  opinfo;
1308      expressionS *        exp;
1309 {
1310   fixS * fixP = cgen_record_fixup_exp (frag, where, insn, length,
1311                                       operand, opinfo, exp);
1312
1313   switch (CGEN_OPERAND_TYPE (operand))
1314     {
1315     case M32R_OPERAND_HI16 :
1316       /* If low/high/shigh/sda was used, it is recorded in `opinfo'.  */
1317       if (fixP->tc_fix_data.opinfo == BFD_RELOC_M32R_HI16_SLO
1318           || fixP->tc_fix_data.opinfo == BFD_RELOC_M32R_HI16_ULO)
1319         m32r_record_hi16 (fixP->tc_fix_data.opinfo, fixP, now_seg);
1320       break;
1321     }
1322
1323   return fixP;
1324 }
1325
1326 /* Return BFD reloc type from opinfo field in a fixS.
1327    It's tricky using fx_r_type in m32r_frob_file because the values
1328    are BFD_RELOC_UNUSED + operand number.  */
1329 #define FX_OPINFO_R_TYPE(f) ((f)->tc_fix_data.opinfo)
1330
1331 /* Sort any unmatched HI16 relocs so that they immediately precede
1332    the corresponding LO16 reloc.  This is called before md_apply_fix and
1333    tc_gen_reloc.  */
1334
1335 void
1336 m32r_frob_file ()
1337 {
1338   struct m32r_hi_fixup * l;
1339
1340   for (l = m32r_hi_fixup_list; l != NULL; l = l->next)
1341     {
1342       segment_info_type * seginfo;
1343       int                 pass;
1344
1345       assert (FX_OPINFO_R_TYPE (l->fixp) == BFD_RELOC_M32R_HI16_SLO
1346               || FX_OPINFO_R_TYPE (l->fixp) == BFD_RELOC_M32R_HI16_ULO);
1347
1348       /* Check quickly whether the next fixup happens to be a matching low.  */
1349       if (l->fixp->fx_next != NULL
1350           && FX_OPINFO_R_TYPE (l->fixp->fx_next) == BFD_RELOC_M32R_LO16
1351           && l->fixp->fx_addsy == l->fixp->fx_next->fx_addsy
1352           && l->fixp->fx_offset == l->fixp->fx_next->fx_offset)
1353         continue;
1354
1355       /* Look through the fixups for this segment for a matching `low'.
1356          When we find one, move the high/shigh just in front of it.  We do
1357          this in two passes.  In the first pass, we try to find a
1358          unique `low'.  In the second pass, we permit multiple high's
1359          relocs for a single `low'.  */
1360       seginfo = seg_info (l->seg);
1361       for (pass = 0; pass < 2; pass++)
1362         {
1363           fixS * f;
1364           fixS * prev;
1365
1366           prev = NULL;
1367           for (f = seginfo->fix_root; f != NULL; f = f->fx_next)
1368             {
1369               /* Check whether this is a `low' fixup which matches l->fixp.  */
1370               if (FX_OPINFO_R_TYPE (f) == BFD_RELOC_M32R_LO16
1371                   && f->fx_addsy == l->fixp->fx_addsy
1372                   && f->fx_offset == l->fixp->fx_offset
1373                   && (pass == 1
1374                       || prev == NULL
1375                       || (FX_OPINFO_R_TYPE (prev) != BFD_RELOC_M32R_HI16_SLO
1376                           && FX_OPINFO_R_TYPE (prev) != BFD_RELOC_M32R_HI16_ULO)
1377                       || prev->fx_addsy != f->fx_addsy
1378                       || prev->fx_offset !=  f->fx_offset))
1379                 {
1380                   fixS ** pf;
1381
1382                   /* Move l->fixp before f.  */
1383                   for (pf = &seginfo->fix_root;
1384                        * pf != l->fixp;
1385                        pf = & (* pf)->fx_next)
1386                     assert (* pf != NULL);
1387
1388                   * pf = l->fixp->fx_next;
1389
1390                   l->fixp->fx_next = f;
1391                   if (prev == NULL)
1392                     seginfo->fix_root = l->fixp;
1393                   else
1394                     prev->fx_next = l->fixp;
1395
1396                   break;
1397                 }
1398
1399               prev = f;
1400             }
1401
1402           if (f != NULL)
1403             break;
1404
1405           if (pass == 1)
1406             as_warn_where (l->fixp->fx_file, l->fixp->fx_line,
1407                            "Unmatched high/shigh reloc");
1408         }
1409     }
1410 }
1411
1412 /* See whether we need to force a relocation into the output file.
1413    This is used to force out switch and PC relative relocations when
1414    relaxing.  */
1415
1416 int
1417 m32r_force_relocation (fix)
1418      fixS * fix;
1419 {
1420   if (! m32r_relax)
1421     return 0;
1422
1423   return (fix->fx_pcrel
1424           || 0 /* ??? */);
1425 }
1426 \f
1427 /* Write a value out to the object file, using the appropriate endianness.  */
1428
1429 void
1430 md_number_to_chars (buf, val, n)
1431      char * buf;
1432      valueT val;
1433      int    n;
1434 {
1435   if (target_big_endian)
1436     number_to_chars_bigendian (buf, val, n);
1437   else
1438     number_to_chars_littleendian (buf, val, n);
1439 }
1440
1441 /* Turn a string in input_line_pointer into a floating point constant of type
1442    type, and store the appropriate bytes in *litP.  The number of LITTLENUMS
1443    emitted is stored in *sizeP .  An error message is returned, or NULL on OK.
1444 */
1445
1446 /* Equal to MAX_PRECISION in atof-ieee.c */
1447 #define MAX_LITTLENUMS 6
1448
1449 char *
1450 md_atof (type, litP, sizeP)
1451      char type;
1452      char *litP;
1453      int *sizeP;
1454 {
1455   int              i;
1456   int              prec;
1457   LITTLENUM_TYPE   words [MAX_LITTLENUMS];
1458   LITTLENUM_TYPE * wordP;
1459   char *           t;
1460   char *           atof_ieee ();
1461
1462   switch (type)
1463     {
1464     case 'f':
1465     case 'F':
1466     case 's':
1467     case 'S':
1468       prec = 2;
1469       break;
1470
1471     case 'd':
1472     case 'D':
1473     case 'r':
1474     case 'R':
1475       prec = 4;
1476       break;
1477
1478    /* FIXME: Some targets allow other format chars for bigger sizes here.  */
1479
1480     default:
1481       * sizeP = 0;
1482       return "Bad call to md_atof()";
1483     }
1484
1485   t = atof_ieee (input_line_pointer, type, words);
1486   if (t)
1487     input_line_pointer = t;
1488   * sizeP = prec * sizeof (LITTLENUM_TYPE);
1489
1490   if (target_big_endian)
1491     {
1492       for (i = 0; i < prec; i++)
1493         {
1494           md_number_to_chars (litP, (valueT) words[i],
1495                               sizeof (LITTLENUM_TYPE));
1496           litP += sizeof (LITTLENUM_TYPE);
1497         }
1498     }
1499   else
1500     {
1501       for (i = prec - 1; i >= 0; i--)
1502         {
1503           md_number_to_chars (litP, (valueT) words[i],
1504                               sizeof (LITTLENUM_TYPE));
1505           litP += sizeof (LITTLENUM_TYPE);
1506         }
1507     }
1508      
1509   return 0;
1510 }