Fuxed sanitization (again!)
[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 /* Returns non zero if the given instruction writes to a destination register.  */
385 static int
386 writes_to_dest_reg (insn)
387      const CGEN_INSN * insn;
388 {
389   unsigned char * syntax = CGEN_SYNTAX_STRING (CGEN_INSN_SYNTAX (insn));
390   unsigned char   c;
391   
392   /* Scan the syntax string looking for a destination register.  */
393   while ((c = (* syntax ++)) != 0)
394     if (c == 128 + M32R_OPERAND_DR)
395       break;
396
397   return c;
398 }
399
400 /* Returns non zero if the given instruction reads from a source register.
401    Ignores the first 'num_ignore' macthes in the syntax string.  */
402 static int
403 reads_from_src_reg (insn, num_ignore)
404      const CGEN_INSN * insn;
405      int               num_ignore;
406 {
407   unsigned char * syntax = CGEN_SYNTAX_STRING (CGEN_INSN_SYNTAX (insn));
408   unsigned char   c;
409   
410   /* Scan the syntax string looking for a source register.  */
411   while ((c = (* syntax ++)) != 0)
412     {
413       if (   c == 128 + M32R_OPERAND_SR
414           || c == 128 + M32R_OPERAND_SRC1
415           || c == 128 + M32R_OPERAND_SRC2)
416         {
417           if (num_ignore -- > 0)
418             continue;
419           else
420             break;
421         }
422     }
423
424   return c;
425 }
426
427 /* Returns the integer value of the destination register held in the fields. */
428 #define get_dest_reg(fields) (fields).f_r1
429
430 /* Returns an integer representing the source register of the given type.  */
431 static int
432 get_src_reg (syntax_field, fields)
433      unsigned char syntax_field;
434      CGEN_FIELDS * fields;
435 {
436   switch (syntax_field)
437     {
438     case 128 + M32R_OPERAND_SR:    return fields->f_r2;
439       /* Relies upon the fact that no instruction with a $src1 operand
440          also has a $dr operand.  */
441     case 128 + M32R_OPERAND_SRC1:  return fields->f_r1;
442     case 128 + M32R_OPERAND_SRC2:  return fields->f_r2;
443     default:                       abort(); return -1;
444     }
445 }
446
447 /* Returns zero iff the output register of instruction 'a'
448    is an input register to instruction 'b'.  */
449 static int
450 check_parallel_io_clash (a, b)
451      m32r_insn * a;
452      m32r_insn * b;
453 {     
454   if (writes_to_dest_reg (a->insn))
455     {
456       unsigned char syntax_field;
457       int           skip = 0;
458       
459       while (syntax_field = reads_from_src_reg (b->insn, skip ++))
460         {
461           if (get_src_reg (syntax_field, & b->fields) == get_dest_reg (a->fields))
462             return 0;
463         }
464     }
465
466   return 1;
467 }
468
469
470 /* Returns NULL if the two 16 bit insns can be executed in parallel,
471    otherwise it returns a pointer to an error message explaining why not.  */
472 static const char *
473 can_make_parallel (a, b)
474      m32r_insn * a;
475      m32r_insn * b;
476 {
477 /* start-sanitize-m32rx */
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 /* end-sanitize-m32rx */
499   if (   writes_to_dest_reg (a->insn)
500       && writes_to_dest_reg (b->insn)
501       && (get_dest_reg (a->fields) == get_dest_reg (b->fields)))
502     return "Instructions write to the same destination register.";
503
504   return NULL;
505 }
506
507 #ifdef CGEN_INT_INSN
508 static void
509 make_parallel (buffer)
510      cgen_insn_t * buffer;
511 {
512   /* Force the top bit of the second insn to be set.  */
513
514   bfd_vma value;
515       
516   if (CGEN_CURRENT_ENDIAN == CGEN_ENDIAN_BIG)
517     {
518       value = bfd_getb16 ((bfd_byte *) buffer);
519       value |= 0x8000;
520       bfd_putb16 (value, (char *) buffer);
521     }
522   else
523     {
524       value = bfd_getl16 ((bfd_byte *) buffer);
525       value |= 0x8000;
526       bfd_putl16 (value, (char *) buffer);
527     }
528 }
529 #else
530 static void
531 make_parallel (buffer)
532      char * buffer;
533 {
534   /* Force the top bit of the second insn to be set.  */
535
536   buffer [CGEN_CURRENT_ENDIAN == CGEN_ENDIAN_BIG ? 0 : 1] |= 0x80;
537 }
538 #endif
539
540
541 /* start-sanitize-m32rx */
542 static void
543 assemble_parallel_insn (str, str2)
544      char * str;
545      char * str2;
546 {
547   char *    str3;
548   m32r_insn first;
549   m32r_insn second;
550   char *    errmsg;
551   
552   * str2 = 0; /* Seperate the two instructions.  */
553
554   /* If there was a previous 16 bit insn, then fill the following 16 bit slot,
555      so that the parallel instruction will start on a 32 bit boundary.  */
556   if (prev_insn.insn)
557     fill_insn (0);
558
559   /* Parse the first instruction.  */
560   if (! (first.insn = CGEN_SYM (assemble_insn)
561          (str, & first.fields, first.buffer, & errmsg)))
562     {
563       as_bad (errmsg);
564       return;
565     }
566   
567   /* Check to see if this is an allowable parallel insn.  */
568   if (CGEN_INSN_ATTR (first.insn, CGEN_INSN_PIPE) == PIPE_NONE)
569     {
570       as_bad ("instruction '%s' cannot be executed in parallel.", str);
571       return;
572     }
573   
574   if (! enable_m32rx
575       && CGEN_INSN_ATTR (first.insn, CGEN_INSN_MACH) == (1 << MACH_M32RX))
576     {
577       as_bad ("instruction '%s' is for the M32RX only", str);
578       return;
579     }
580   
581   *str2 = '|';       /* Restore the original assembly text, just in case it is needed.  */
582   str3  = str;       /* Save the original string pointer.  */
583   str   = str2 + 2;  /* Advanced past the parsed string.  */
584   str2  = str3;      /* Remember the entire string in case it is needed for error messages.  */
585   
586   /* Preserve any fixups that have been generated and reset the list to empty.  */
587   cgen_save_fixups();
588
589   /* Parse the second instruction.  */
590   if (! (second.insn = CGEN_SYM (assemble_insn)
591          (str, & second.fields, second.buffer, & errmsg)))
592     {
593       as_bad (errmsg);
594       return;
595     }
596
597   /* Check it.  */
598   if (! enable_m32rx
599       && CGEN_INSN_ATTR (second.insn, CGEN_INSN_MACH) == (1 << MACH_M32RX))
600     {
601       as_bad ("instruction '%s' is for the M32RX only", str);
602       return;
603     }
604   
605   if (! enable_m32rx)
606     {
607       if (   strcmp (first.insn->name, "nop") != 0
608           && strcmp (second.insn->name, "nop") != 0)
609         {
610           as_bad ("'%s': only the NOP instruction can be issued in parallel on the m32r", str2);
611           return;
612         }
613     }
614
615   /* We assume that if the first instruction writes to a register that is
616      read by the second instruction it is because the programmer intended
617      this to happen, (after all they have explicitly requested that these
618      two instructions be executed in parallel).  Although if the global
619      variable warn_explicit_parallel_conflicts is true then we do generate
620      a warning message.  Similarly we assume that parallel branch and jump
621      instructions are deliberate and should not  produce errors.  */
622   
623   if (can_make_parallel (& first, & second) == NULL)
624     {
625       if (warn_explicit_parallel_conflicts
626           && (! check_parallel_io_clash (& first, & second)))
627         as_warn ("%s: output of first instruction fails to overwrite input of second instruction.", str2);
628       
629       /* Get the fixups for the first instruction.  */
630       cgen_swap_fixups ();
631
632       /* Write it out.  */
633       (void) cgen_asm_finish_insn (first.insn, first.buffer,
634                                    CGEN_FIELDS_BITSIZE (& first.fields));
635       
636       /* Force the top bit of the second insn to be set.  */
637       make_parallel (second.buffer);
638
639       /* Get its fixups.  */
640       cgen_restore_fixups ();
641
642       /* Write it out.  */
643       (void) cgen_asm_finish_insn (second.insn, second.buffer,
644                                    CGEN_FIELDS_BITSIZE (& second.fields));
645     }
646   else if ((errmsg = (char *) can_make_parallel (& second, & first,
647                                                  false, false)) == NULL)
648     {
649       if (warn_explicit_parallel_conflicts
650           && (! check_parallel_io_clash (& second, & first)))
651         as_warn ("%s: output of second instruction fails to overwrite input of first instruction.", str2);
652       
653       /* Write out the second instruction first.  */
654       (void) cgen_asm_finish_insn (second.insn, second.buffer,
655                                    CGEN_FIELDS_BITSIZE (& second.fields));
656       
657       /* Force the top bit of the first instruction to be set.  */
658       make_parallel (first.buffer);
659
660       /* Get the fixups for the first instruction.  */
661       cgen_restore_fixups ();
662
663       /* Write out the first instruction.  */
664       (void) cgen_asm_finish_insn (first.insn, first.buffer,
665                                    CGEN_FIELDS_BITSIZE (& first.fields));
666     }
667   else
668     {
669       as_bad ("'%s': %s", str2, errmsg);
670       return;
671     }
672       
673   /* Set these so m32r_fill_insn can use them.  */
674   prev_seg    = now_seg;
675   prev_subseg = now_subseg;
676
677   return;
678 }
679 /* end-sanitize-m32rx */
680
681
682 void
683 md_assemble (str)
684      char * str;
685 {
686   m32r_insn insn;
687   char *    errmsg;
688   char *    str2 = NULL;
689
690   /* Initialize GAS's cgen interface for a new instruction.  */
691   cgen_asm_init_parse ();
692
693 /* start-sanitize-m32rx */
694   /* Look for a parallel instruction seperator.  */
695   if ((str2 = strstr (str, "||")) != NULL)
696     {
697       assemble_parallel_insn (str, str2);
698       return;
699     }
700 /* end-sanitize-m32rx */
701   
702   insn.insn = CGEN_SYM (assemble_insn) (str, & insn.fields, insn.buffer, & errmsg);
703   if (!insn.insn)
704     {
705       as_bad (errmsg);
706       return;
707     }
708
709 /* start-sanitize-m32rx */
710   if (! enable_m32rx && CGEN_INSN_ATTR (insn.insn, CGEN_INSN_MACH) == (1 << MACH_M32RX))
711     {
712       as_bad ("instruction '%s' is for the M32RX only", str);
713       return;
714     }
715 /* end-sanitize-m32rx */
716   
717   if (CGEN_INSN_BITSIZE (insn.insn) == 32)
718     {
719       /* 32 bit insns must live on 32 bit boundaries.  */
720       if (prev_insn.insn || seen_relaxable_p)
721         {
722           /* FIXME: If calling fill_insn too many times turns us into a memory
723              pig, can we call assemble_nop instead of !seen_relaxable_p?  */
724           fill_insn (0);
725         }
726       
727       (void) cgen_asm_finish_insn (insn.insn, insn.buffer,
728                                    CGEN_FIELDS_BITSIZE (& insn.fields));
729     }
730   else
731     {
732 /* start-sanitize-m32rx */
733 /* start-sanitize-phase2-m32rx */
734       int swap = false;
735 /* end-sanitize-phase2-m32rx */
736 /* end-sanitize-m32rx */
737       
738       if (CGEN_INSN_BITSIZE (insn.insn) != 16)
739         abort();
740       
741       /* Keep track of whether we've seen a pair of 16 bit insns.
742          prev_insn.insn is NULL when we're on a 32 bit boundary.  */
743       if (prev_insn.insn)
744         {
745 /* start-sanitize-m32rx */
746 /* start-sanitize-phase2-m32rx */
747           /* Look to see if this instruction can be combined with the
748              previous instruction to make one, parallel, 32 bit instruction.
749              If the previous instruction (potentially) changed the flow of
750              program control, then it cannot be combined with the current
751              instruction.  Also if the output of the previous instruction
752              is used as an input to the current instruction then it cannot
753              be combined.  Otherwise call can_make_parallel() with both
754              orderings of the instructions to see if they can be combined.  */
755           if (   ! CGEN_INSN_ATTR (prev_insn.insn, CGEN_INSN_COND_CTI)
756               && ! CGEN_INSN_ATTR (prev_insn.insn, CGEN_INSN_UNCOND_CTI)
757               &&   check_parallel_io_clash (& prev_insn, &insn)
758                  )
759             {
760               if (can_make_parallel (& prev_insn, & insn) == NULL)
761                 make_parallel (insn.buffer);
762               else if (can_make_parallel (& insn, & prev_insn.insn) == NULL)
763                 swap = true;
764             }
765 /* end-sanitize-phase2-m32rx */
766 /* end-sanitize-m32rx */
767           
768           prev_insn.insn = NULL;
769         }
770       else
771         {
772           prev_insn = insn;
773         }
774
775       /* Record the frag that might be used by this insn.  */
776       insn.frag = frag_now;
777       insn.addr = cgen_asm_finish_insn (insn.insn, insn.buffer,
778                                    CGEN_FIELDS_BITSIZE (& insn.fields));
779
780 /* start-sanitize-m32rx */
781 /* start-sanitize-phase2-m32rx */
782       if (swap)
783         {
784           int     tmp;
785           
786 #define SWAP_BYTES(a,b) tmp = a; a = b; b = tmp
787
788           /* Swap the two insns */
789           SWAP_BYTES (prev_insn.addr [0], insn.addr [0]);
790           SWAP_BYTES (prev_insn.addr [1], insn.addr [1]);
791
792           make_parallel (insn.addr);
793
794           /* Swap any relaxable frags recorded for the two insns.  */
795           if (prev_insn.frag->fr_opcode == prev_insn.addr)
796             {
797               prev_insn.frag->fr_opcode = insn.addr;
798             }
799           else if (insn.frag->fr_opcode == insn.addr)
800             {
801               insn.frag->fr_opcode = prev_insn.addr;
802             }
803         }
804 /* end-sanitize-phase2-m32rx */
805
806       /* Record where this instruction was assembled.  */
807       prev_insn.addr = insn.addr;
808       prev_insn.frag = insn.frag;
809 /* end-sanitize-m32rx */
810       
811       /* If the insn needs the following one to be on a 32 bit boundary
812          (e.g. subroutine calls), fill this insn's slot.  */
813       if (prev_insn.insn
814           && CGEN_INSN_ATTR (insn.insn, CGEN_INSN_FILL_SLOT) != 0)
815         fill_insn (0);
816
817       /* If this is a relaxable insn (can be replaced with a larger version)
818          mark the fact so that we can emit an alignment directive for a
819          following 32 bit insn if we see one.   */
820       if (CGEN_INSN_ATTR (insn.insn, CGEN_INSN_RELAXABLE) != 0)
821         seen_relaxable_p = 1;
822     }
823
824   /* Set these so m32r_fill_insn can use them.  */
825   prev_seg    = now_seg;
826   prev_subseg = now_subseg;
827 }
828
829 /* The syntax in the manual says constants begin with '#'.
830    We just ignore it.  */
831
832 void 
833 md_operand (expressionP)
834      expressionS * expressionP;
835 {
836   if (* input_line_pointer == '#')
837     {
838       input_line_pointer ++;
839       expression (expressionP);
840     }
841 }
842
843 valueT
844 md_section_align (segment, size)
845      segT   segment;
846      valueT size;
847 {
848   int align = bfd_get_section_alignment (stdoutput, segment);
849   return ((size + (1 << align) - 1) & (-1 << align));
850 }
851
852 symbolS *
853 md_undefined_symbol (name)
854   char * name;
855 {
856   return 0;
857 }
858 \f
859 /* .scomm pseudo-op handler.
860
861    This is a new pseudo-op to handle putting objects in .scommon.
862    By doing this the linker won't need to do any work and more importantly
863    it removes the implicit -G arg necessary to correctly link the object file.
864 */
865
866 static void
867 m32r_scomm (ignore)
868      int ignore;
869 {
870   register char *    name;
871   register char      c;
872   register char *    p;
873   offsetT            size;
874   register symbolS * symbolP;
875   offsetT            align;
876   int                align2;
877
878   name = input_line_pointer;
879   c = get_symbol_end ();
880
881   /* just after name is now '\0' */
882   p = input_line_pointer;
883   * p = c;
884   SKIP_WHITESPACE ();
885   if (* input_line_pointer != ',')
886     {
887       as_bad ("Expected comma after symbol-name: rest of line ignored.");
888       ignore_rest_of_line ();
889       return;
890     }
891
892   input_line_pointer ++;                /* skip ',' */
893   if ((size = get_absolute_expression ()) < 0)
894     {
895       as_warn (".SCOMMon length (%ld.) <0! Ignored.", (long) size);
896       ignore_rest_of_line ();
897       return;
898     }
899
900   /* The third argument to .scomm is the alignment.  */
901   if (* input_line_pointer != ',')
902     align = 8;
903   else
904     {
905       ++ input_line_pointer;
906       align = get_absolute_expression ();
907       if (align <= 0)
908         {
909           as_warn ("ignoring bad alignment");
910           align = 8;
911         }
912     }
913   /* Convert to a power of 2 alignment.  */
914   if (align)
915     {
916       for (align2 = 0; (align & 1) == 0; align >>= 1, ++ align2)
917         continue;
918       if (align != 1)
919         {
920           as_bad ("Common alignment not a power of 2");
921           ignore_rest_of_line ();
922           return;
923         }
924     }
925   else
926     align2 = 0;
927
928   * p = 0;
929   symbolP = symbol_find_or_make (name);
930   * p = c;
931
932   if (S_IS_DEFINED (symbolP))
933     {
934       as_bad ("Ignoring attempt to re-define symbol `%s'.",
935               S_GET_NAME (symbolP));
936       ignore_rest_of_line ();
937       return;
938     }
939
940   if (S_GET_VALUE (symbolP) && S_GET_VALUE (symbolP) != (valueT) size)
941     {
942       as_bad ("Length of .scomm \"%s\" is already %ld. Not changed to %ld.",
943               S_GET_NAME (symbolP),
944               (long) S_GET_VALUE (symbolP),
945               (long) size);
946
947       ignore_rest_of_line ();
948       return;
949     }
950
951   if (symbolP->local)
952     {
953       segT   old_sec    = now_seg;
954       int    old_subsec = now_subseg;
955       char * pfrag;
956
957       record_alignment (sbss_section, align2);
958       subseg_set (sbss_section, 0);
959       
960       if (align2)
961         frag_align (align2, 0, 0);
962       
963       if (S_GET_SEGMENT (symbolP) == sbss_section)
964         symbolP->sy_frag->fr_symbol = 0;
965       
966       symbolP->sy_frag = frag_now;
967       
968       pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP, size,
969                         (char *) 0);
970       * pfrag = 0;
971       S_SET_SIZE (symbolP, size);
972       S_SET_SEGMENT (symbolP, sbss_section);
973       S_CLEAR_EXTERNAL (symbolP);
974       subseg_set (old_sec, old_subsec);
975     }
976   else
977     {
978       S_SET_VALUE (symbolP, (valueT) size);
979       S_SET_ALIGN (symbolP, align2);
980       S_SET_EXTERNAL (symbolP);
981       S_SET_SEGMENT (symbolP, & scom_section);
982     }
983
984   demand_empty_rest_of_line ();
985 }
986 \f
987 /* Interface to relax_segment.  */
988
989 /* FIXME: Build table by hand, get it working, then machine generate.  */
990
991 const relax_typeS md_relax_table[] =
992 {
993 /* The fields are:
994    1) most positive reach of this state,
995    2) most negative reach of this state,
996    3) how many bytes this mode will add to the size of the current frag
997    4) which index into the table to try if we can't fit into this one.  */
998
999   /* The first entry must be unused because an `rlx_more' value of zero ends
1000      each list.  */
1001   {1, 1, 0, 0},
1002
1003   /* The displacement used by GAS is from the end of the 2 byte insn,
1004      so we subtract 2 from the following.  */
1005   /* 16 bit insn, 8 bit disp -> 10 bit range.
1006      This doesn't handle a branch in the right slot at the border:
1007      the "& -4" isn't taken into account.  It's not important enough to
1008      complicate things over it, so we subtract an extra 2 (or + 2 in -ve
1009      case).  */
1010   {511 - 2 - 2, -512 - 2 + 2, 0, 2 },
1011   /* 32 bit insn, 24 bit disp -> 26 bit range.  */
1012   {0x2000000 - 1 - 2, -0x2000000 - 2, 2, 0 },
1013   /* Same thing, but with leading nop for alignment.  */
1014   {0x2000000 - 1 - 2, -0x2000000 - 2, 4, 0 }
1015 };
1016
1017 long
1018 m32r_relax_frag (fragP, stretch)
1019      fragS * fragP;
1020      long    stretch;
1021 {
1022   /* Address of branch insn.  */
1023   long address = fragP->fr_address + fragP->fr_fix - 2;
1024   long growth = 0;
1025
1026   /* Keep 32 bit insns aligned on 32 bit boundaries.  */
1027   if (fragP->fr_subtype == 2)
1028     {
1029       if ((address & 3) != 0)
1030         {
1031           fragP->fr_subtype = 3;
1032           growth = 2;
1033         }
1034     }
1035   else if (fragP->fr_subtype == 3)
1036     {
1037       if ((address & 3) == 0)
1038         {
1039           fragP->fr_subtype = 2;
1040           growth = -2;
1041         }
1042     }
1043   else
1044     {
1045       growth = relax_frag (fragP, stretch);
1046
1047       /* Long jump on odd halfword boundary?  */
1048       if (fragP->fr_subtype == 2 && (address & 3) != 0)
1049         {
1050           fragP->fr_subtype = 3;
1051           growth += 2;
1052         }
1053     }
1054
1055   return growth;
1056 }
1057
1058 /* Return an initial guess of the length by which a fragment must grow to
1059    hold a branch to reach its destination.
1060    Also updates fr_type/fr_subtype as necessary.
1061
1062    Called just before doing relaxation.
1063    Any symbol that is now undefined will not become defined.
1064    The guess for fr_var is ACTUALLY the growth beyond fr_fix.
1065    Whatever we do to grow fr_fix or fr_var contributes to our returned value.
1066    Although it may not be explicit in the frag, pretend fr_var starts with a
1067    0 value.  */
1068
1069 int
1070 md_estimate_size_before_relax (fragP, segment)
1071      fragS * fragP;
1072      segT    segment;
1073 {
1074   int    old_fr_fix = fragP->fr_fix;
1075   char * opcode = fragP->fr_opcode;
1076
1077   /* The only thing we have to handle here are symbols outside of the
1078      current segment.  They may be undefined or in a different segment in
1079      which case linker scripts may place them anywhere.
1080      However, we can't finish the fragment here and emit the reloc as insn
1081      alignment requirements may move the insn about.  */
1082
1083   if (S_GET_SEGMENT (fragP->fr_symbol) != segment)
1084     {
1085       /* The symbol is undefined in this segment.
1086          Change the relaxation subtype to the max allowable and leave
1087          all further handling to md_convert_frag.  */
1088       fragP->fr_subtype = 2;
1089
1090 #if 0 /* Can't use this, but leave in for illustration.  */     
1091       /* Change 16 bit insn to 32 bit insn.  */
1092       opcode[0] |= 0x80;
1093
1094       /* Increase known (fixed) size of fragment.  */
1095       fragP->fr_fix += 2;
1096
1097       /* Create a relocation for it.  */
1098       fix_new (fragP, old_fr_fix, 4,
1099                fragP->fr_symbol,
1100                fragP->fr_offset, 1 /* pcrel */,
1101                /* FIXME: Can't use a real BFD reloc here.
1102                   cgen_md_apply_fix3 can't handle it.  */
1103                BFD_RELOC_M32R_26_PCREL);
1104
1105       /* Mark this fragment as finished.  */
1106       frag_wane (fragP);
1107 #else
1108       {
1109         const CGEN_INSN * insn;
1110         int               i;
1111
1112         /* Update the recorded insn.
1113            Fortunately we don't have to look very far.
1114            FIXME: Change this to record in the instruction the next higher
1115            relaxable insn to use.  */
1116         for (i = 0, insn = fragP->fr_cgen.insn; i < 4; i++, insn++)
1117           {
1118             if ((strcmp (CGEN_INSN_MNEMONIC (insn),
1119                          CGEN_INSN_MNEMONIC (fragP->fr_cgen.insn))
1120                  == 0)
1121                 && CGEN_INSN_ATTR (insn, CGEN_INSN_RELAX))
1122               break;
1123           }
1124         if (i == 4)
1125           abort ();
1126
1127         fragP->fr_cgen.insn = insn;
1128         return 2;
1129       }
1130 #endif
1131     }
1132
1133   return (fragP->fr_var + fragP->fr_fix - old_fr_fix);
1134
1135
1136 /* *fragP has been relaxed to its final size, and now needs to have
1137    the bytes inside it modified to conform to the new size.
1138
1139    Called after relaxation is finished.
1140    fragP->fr_type == rs_machine_dependent.
1141    fragP->fr_subtype is the subtype of what the address relaxed to.  */
1142
1143 void
1144 md_convert_frag (abfd, sec, fragP)
1145   bfd *   abfd;
1146   segT    sec;
1147   fragS * fragP;
1148 {
1149   char * opcode;
1150   char * displacement;
1151   int    target_address;
1152   int    opcode_address;
1153   int    extension;
1154   int    addend;
1155
1156   opcode = fragP->fr_opcode;
1157
1158   /* Address opcode resides at in file space.  */
1159   opcode_address = fragP->fr_address + fragP->fr_fix - 2;
1160
1161   switch (fragP->fr_subtype)
1162     {
1163     case 1 :
1164       extension = 0;
1165       displacement = & opcode[1];
1166       break;
1167     case 2 :
1168       opcode[0] |= 0x80;
1169       extension = 2;
1170       displacement = & opcode[1];
1171       break;
1172     case 3 :
1173       opcode[2] = opcode[0] | 0x80;
1174       md_number_to_chars (opcode, PAR_NOP_INSN, 2);
1175       opcode_address += 2;
1176       extension = 4;
1177       displacement = & opcode[3];
1178       break;
1179     default :
1180       abort ();
1181     }
1182
1183   if (S_GET_SEGMENT (fragP->fr_symbol) != sec)
1184     {
1185       /* symbol must be resolved by linker */
1186       if (fragP->fr_offset & 3)
1187         as_warn ("Addend to unresolved symbol not on word boundary.");
1188       addend = fragP->fr_offset >> 2;
1189     }
1190   else
1191     {
1192       /* Address we want to reach in file space.  */
1193       target_address = S_GET_VALUE (fragP->fr_symbol) + fragP->fr_offset;
1194       target_address += fragP->fr_symbol->sy_frag->fr_address;
1195       addend = (target_address - (opcode_address & -4)) >> 2;
1196     }
1197
1198   /* Create a relocation for symbols that must be resolved by the linker.
1199      Otherwise output the completed insn.  */
1200
1201   if (S_GET_SEGMENT (fragP->fr_symbol) != sec)
1202     {
1203       assert (fragP->fr_subtype != 1);
1204       assert (fragP->fr_cgen.insn != 0);
1205       cgen_record_fixup (fragP,
1206                          /* Offset of branch insn in frag.  */
1207                          fragP->fr_fix + extension - 4,
1208                          fragP->fr_cgen.insn,
1209                          4 /*length*/,
1210                          /* FIXME: quick hack */
1211 #if 0
1212                          CGEN_OPERAND_ENTRY (fragP->fr_cgen.opindex),
1213 #else
1214                          CGEN_OPERAND_ENTRY (M32R_OPERAND_DISP24),
1215 #endif
1216                          fragP->fr_cgen.opinfo,
1217                          fragP->fr_symbol, fragP->fr_offset);
1218     }
1219
1220 #define SIZE_FROM_RELAX_STATE(n) ((n) == 1 ? 1 : 3)
1221
1222   md_number_to_chars (displacement, (valueT) addend,
1223                       SIZE_FROM_RELAX_STATE (fragP->fr_subtype));
1224
1225   fragP->fr_fix += extension;
1226 }
1227 \f
1228 /* Functions concerning relocs.  */
1229
1230 /* The location from which a PC relative jump should be calculated,
1231    given a PC relative reloc.  */
1232
1233 long
1234 md_pcrel_from_section (fixP, sec)
1235      fixS * fixP;
1236      segT   sec;
1237 {
1238   if (fixP->fx_addsy != (symbolS *) NULL
1239       && (! S_IS_DEFINED (fixP->fx_addsy)
1240           || S_GET_SEGMENT (fixP->fx_addsy) != sec))
1241     {
1242       /* The symbol is undefined (or is defined but not in this section).
1243          Let the linker figure it out.  */
1244       return 0;
1245     }
1246
1247   return (fixP->fx_frag->fr_address + fixP->fx_where) & -4L;
1248 }
1249
1250 /* Return the bfd reloc type for OPERAND of INSN at fixup FIXP.
1251    Returns BFD_RELOC_NONE if no reloc type can be found.
1252    *FIXP may be modified if desired.  */
1253
1254 bfd_reloc_code_real_type
1255 CGEN_SYM (lookup_reloc) (insn, operand, fixP)
1256      const CGEN_INSN *    insn;
1257      const CGEN_OPERAND * operand;
1258      fixS *               fixP;
1259 {
1260   switch (CGEN_OPERAND_TYPE (operand))
1261     {
1262     case M32R_OPERAND_DISP8 : return  BFD_RELOC_M32R_10_PCREL;
1263     case M32R_OPERAND_DISP16 : return BFD_RELOC_M32R_18_PCREL;
1264     case M32R_OPERAND_DISP24 : return BFD_RELOC_M32R_26_PCREL;
1265     case M32R_OPERAND_UIMM24 : return BFD_RELOC_M32R_24;
1266     case M32R_OPERAND_HI16 :
1267     case M32R_OPERAND_SLO16 :
1268     case M32R_OPERAND_ULO16 :
1269       /* If low/high/shigh/sda was used, it is recorded in `opinfo'.  */
1270       if (fixP->tc_fix_data.opinfo != 0)
1271         return fixP->tc_fix_data.opinfo;
1272       break;
1273     }
1274   return BFD_RELOC_NONE;
1275 }
1276
1277 /* Record a HI16 reloc for later matching with its LO16 cousin.  */
1278
1279 static void
1280 m32r_record_hi16 (reloc_type, fixP, seg)
1281      int    reloc_type;
1282      fixS * fixP;
1283      segT   seg;
1284 {
1285   struct m32r_hi_fixup * hi_fixup;
1286
1287   assert (reloc_type == BFD_RELOC_M32R_HI16_SLO
1288           || reloc_type == BFD_RELOC_M32R_HI16_ULO);
1289
1290   hi_fixup = ((struct m32r_hi_fixup *)
1291               xmalloc (sizeof (struct m32r_hi_fixup)));
1292   hi_fixup->fixp = fixP;
1293   hi_fixup->seg  = now_seg;
1294   hi_fixup->next = m32r_hi_fixup_list;
1295   
1296   m32r_hi_fixup_list = hi_fixup;
1297 }
1298
1299 /* Called while parsing an instruction to create a fixup.
1300    We need to check for HI16 relocs and queue them up for later sorting.  */
1301
1302 fixS *
1303 m32r_cgen_record_fixup_exp (frag, where, insn, length, operand, opinfo, exp)
1304      fragS *              frag;
1305      int                  where;
1306      const CGEN_INSN *    insn;
1307      int                  length;
1308      const CGEN_OPERAND * operand;
1309      int                  opinfo;
1310      expressionS *        exp;
1311 {
1312   fixS * fixP = cgen_record_fixup_exp (frag, where, insn, length,
1313                                       operand, opinfo, exp);
1314
1315   switch (CGEN_OPERAND_TYPE (operand))
1316     {
1317     case M32R_OPERAND_HI16 :
1318       /* If low/high/shigh/sda was used, it is recorded in `opinfo'.  */
1319       if (fixP->tc_fix_data.opinfo == BFD_RELOC_M32R_HI16_SLO
1320           || fixP->tc_fix_data.opinfo == BFD_RELOC_M32R_HI16_ULO)
1321         m32r_record_hi16 (fixP->tc_fix_data.opinfo, fixP, now_seg);
1322       break;
1323     }
1324
1325   return fixP;
1326 }
1327
1328 /* Return BFD reloc type from opinfo field in a fixS.
1329    It's tricky using fx_r_type in m32r_frob_file because the values
1330    are BFD_RELOC_UNUSED + operand number.  */
1331 #define FX_OPINFO_R_TYPE(f) ((f)->tc_fix_data.opinfo)
1332
1333 /* Sort any unmatched HI16 relocs so that they immediately precede
1334    the corresponding LO16 reloc.  This is called before md_apply_fix and
1335    tc_gen_reloc.  */
1336
1337 void
1338 m32r_frob_file ()
1339 {
1340   struct m32r_hi_fixup * l;
1341
1342   for (l = m32r_hi_fixup_list; l != NULL; l = l->next)
1343     {
1344       segment_info_type * seginfo;
1345       int                 pass;
1346
1347       assert (FX_OPINFO_R_TYPE (l->fixp) == BFD_RELOC_M32R_HI16_SLO
1348               || FX_OPINFO_R_TYPE (l->fixp) == BFD_RELOC_M32R_HI16_ULO);
1349
1350       /* Check quickly whether the next fixup happens to be a matching low.  */
1351       if (l->fixp->fx_next != NULL
1352           && FX_OPINFO_R_TYPE (l->fixp->fx_next) == BFD_RELOC_M32R_LO16
1353           && l->fixp->fx_addsy == l->fixp->fx_next->fx_addsy
1354           && l->fixp->fx_offset == l->fixp->fx_next->fx_offset)
1355         continue;
1356
1357       /* Look through the fixups for this segment for a matching `low'.
1358          When we find one, move the high/shigh just in front of it.  We do
1359          this in two passes.  In the first pass, we try to find a
1360          unique `low'.  In the second pass, we permit multiple high's
1361          relocs for a single `low'.  */
1362       seginfo = seg_info (l->seg);
1363       for (pass = 0; pass < 2; pass++)
1364         {
1365           fixS * f;
1366           fixS * prev;
1367
1368           prev = NULL;
1369           for (f = seginfo->fix_root; f != NULL; f = f->fx_next)
1370             {
1371               /* Check whether this is a `low' fixup which matches l->fixp.  */
1372               if (FX_OPINFO_R_TYPE (f) == BFD_RELOC_M32R_LO16
1373                   && f->fx_addsy == l->fixp->fx_addsy
1374                   && f->fx_offset == l->fixp->fx_offset
1375                   && (pass == 1
1376                       || prev == NULL
1377                       || (FX_OPINFO_R_TYPE (prev) != BFD_RELOC_M32R_HI16_SLO
1378                           && FX_OPINFO_R_TYPE (prev) != BFD_RELOC_M32R_HI16_ULO)
1379                       || prev->fx_addsy != f->fx_addsy
1380                       || prev->fx_offset !=  f->fx_offset))
1381                 {
1382                   fixS ** pf;
1383
1384                   /* Move l->fixp before f.  */
1385                   for (pf = &seginfo->fix_root;
1386                        * pf != l->fixp;
1387                        pf = & (* pf)->fx_next)
1388                     assert (* pf != NULL);
1389
1390                   * pf = l->fixp->fx_next;
1391
1392                   l->fixp->fx_next = f;
1393                   if (prev == NULL)
1394                     seginfo->fix_root = l->fixp;
1395                   else
1396                     prev->fx_next = l->fixp;
1397
1398                   break;
1399                 }
1400
1401               prev = f;
1402             }
1403
1404           if (f != NULL)
1405             break;
1406
1407           if (pass == 1)
1408             as_warn_where (l->fixp->fx_file, l->fixp->fx_line,
1409                            "Unmatched high/shigh reloc");
1410         }
1411     }
1412 }
1413
1414 /* See whether we need to force a relocation into the output file.
1415    This is used to force out switch and PC relative relocations when
1416    relaxing.  */
1417
1418 int
1419 m32r_force_relocation (fix)
1420      fixS * fix;
1421 {
1422   if (! m32r_relax)
1423     return 0;
1424
1425   return (fix->fx_pcrel
1426           || 0 /* ??? */);
1427 }
1428 \f
1429 /* Write a value out to the object file, using the appropriate endianness.  */
1430
1431 void
1432 md_number_to_chars (buf, val, n)
1433      char * buf;
1434      valueT val;
1435      int    n;
1436 {
1437   if (target_big_endian)
1438     number_to_chars_bigendian (buf, val, n);
1439   else
1440     number_to_chars_littleendian (buf, val, n);
1441 }
1442
1443 /* Turn a string in input_line_pointer into a floating point constant of type
1444    type, and store the appropriate bytes in *litP.  The number of LITTLENUMS
1445    emitted is stored in *sizeP .  An error message is returned, or NULL on OK.
1446 */
1447
1448 /* Equal to MAX_PRECISION in atof-ieee.c */
1449 #define MAX_LITTLENUMS 6
1450
1451 char *
1452 md_atof (type, litP, sizeP)
1453      char type;
1454      char *litP;
1455      int *sizeP;
1456 {
1457   int              i;
1458   int              prec;
1459   LITTLENUM_TYPE   words [MAX_LITTLENUMS];
1460   LITTLENUM_TYPE * wordP;
1461   char *           t;
1462   char *           atof_ieee ();
1463
1464   switch (type)
1465     {
1466     case 'f':
1467     case 'F':
1468     case 's':
1469     case 'S':
1470       prec = 2;
1471       break;
1472
1473     case 'd':
1474     case 'D':
1475     case 'r':
1476     case 'R':
1477       prec = 4;
1478       break;
1479
1480    /* FIXME: Some targets allow other format chars for bigger sizes here.  */
1481
1482     default:
1483       * sizeP = 0;
1484       return "Bad call to md_atof()";
1485     }
1486
1487   t = atof_ieee (input_line_pointer, type, words);
1488   if (t)
1489     input_line_pointer = t;
1490   * sizeP = prec * sizeof (LITTLENUM_TYPE);
1491
1492   if (target_big_endian)
1493     {
1494       for (i = 0; i < prec; i++)
1495         {
1496           md_number_to_chars (litP, (valueT) words[i],
1497                               sizeof (LITTLENUM_TYPE));
1498           litP += sizeof (LITTLENUM_TYPE);
1499         }
1500     }
1501   else
1502     {
1503       for (i = prec - 1; i >= 0; i--)
1504         {
1505           md_number_to_chars (litP, (valueT) words[i],
1506                               sizeof (LITTLENUM_TYPE));
1507           litP += sizeof (LITTLENUM_TYPE);
1508         }
1509     }
1510      
1511   return 0;
1512 }