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