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