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