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