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