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