make a few variables static
[external/binutils.git] / gas / config / tc-nios2.c
1 /* Altera Nios II assembler.
2    Copyright (C) 2012-2016 Free Software Foundation, Inc.
3    Contributed by Nigel Gray (ngray@altera.com).
4    Contributed by Mentor Graphics, Inc.
5
6    This file is part of GAS, the GNU Assembler.
7
8    GAS is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3, or (at your option)
11    any later version.
12
13    GAS is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with GAS; see the file COPYING.  If not, write to the Free
20    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
21    02110-1301, USA.  */
22
23 #include "as.h"
24 #include "opcode/nios2.h"
25 #include "elf/nios2.h"
26 #include "tc-nios2.h"
27 #include "bfd.h"
28 #include "libbfd.h"
29 #include "dwarf2dbg.h"
30 #include "subsegs.h"
31 #include "safe-ctype.h"
32 #include "dw2gencfi.h"
33
34 #ifndef OBJ_ELF
35 /* We are not supporting any other target so we throw a compile time error.  */
36 OBJ_ELF not defined
37 #endif
38
39 /* We can choose our endianness at run-time, regardless of configuration.  */
40 extern int target_big_endian;
41
42 /* This array holds the chars that always start a comment.  If the
43    pre-processor is disabled, these aren't very useful.  */
44 const char comment_chars[] = "#";
45
46 /* This array holds the chars that only start a comment at the beginning of
47    a line.  If the line seems to have the form '# 123 filename'
48    .line and .file directives will appear in the pre-processed output.  */
49 /* Note that input_file.c hand checks for '#' at the beginning of the
50    first line of the input file.  This is because the compiler outputs
51    #NO_APP at the beginning of its output.  */
52 /* Also note that C style comments are always supported.  */
53 const char line_comment_chars[] = "#";
54
55 /* This array holds machine specific line separator characters.  */
56 const char line_separator_chars[] = ";";
57
58 /* Chars that can be used to separate mant from exp in floating point nums.  */
59 const char EXP_CHARS[] = "eE";
60
61 /* Chars that mean this number is a floating point constant.  */
62 /* As in 0f12.456 */
63 /* or    0d1.2345e12 */
64 const char FLT_CHARS[] = "rRsSfFdDxXpP";
65
66 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
67    changed in read.c.  Ideally it shouldn't have to know about it at all,
68    but nothing is ideal around here.  */
69
70 /* Machine-dependent command-line options.  */
71
72 const char *md_shortopts = "r";
73
74 struct option md_longopts[] = {
75 #define OPTION_RELAX_ALL (OPTION_MD_BASE + 0)
76   {"relax-all", no_argument, NULL, OPTION_RELAX_ALL},
77 #define OPTION_NORELAX (OPTION_MD_BASE + 1)
78   {"no-relax", no_argument, NULL, OPTION_NORELAX},
79 #define OPTION_RELAX_SECTION (OPTION_MD_BASE + 2)
80   {"relax-section", no_argument, NULL, OPTION_RELAX_SECTION},
81 #define OPTION_EB (OPTION_MD_BASE + 3)
82   {"EB", no_argument, NULL, OPTION_EB},
83 #define OPTION_EL (OPTION_MD_BASE + 4)
84   {"EL", no_argument, NULL, OPTION_EL},
85 #define OPTION_MARCH (OPTION_MD_BASE + 5)
86   {"march", required_argument, NULL, OPTION_MARCH}
87 };
88
89 size_t md_longopts_size = sizeof (md_longopts);
90
91 /* The assembler supports three different relaxation modes, controlled by
92    command-line options.  */
93 typedef enum
94 {
95   relax_section = 0,
96   relax_none,
97   relax_all
98 } relax_optionT;
99
100 /* Struct contains all assembler options set with .set.  */
101 static struct
102 {
103   /* .set noat -> noat = 1 allows assembly code to use at without warning
104      and macro expansions generate a warning.
105      .set at -> noat = 0, assembly code using at warn but macro expansions
106      do not generate warnings.  */
107   bfd_boolean noat;
108
109   /* .set nobreak -> nobreak = 1 allows assembly code to use ba,bt without
110                                  warning.
111      .set break -> nobreak = 0, assembly code using ba,bt warns.  */
112   bfd_boolean nobreak;
113
114   /* .cmd line option -relax-all allows all branches and calls to be replaced
115      with longer versions.
116      -no-relax inhibits branch/call conversion.
117      The default value is relax_section, which relaxes branches within
118      a section.  */
119   relax_optionT relax;
120
121 } nios2_as_options = {FALSE, FALSE, relax_section};
122
123
124 typedef struct nios2_insn_reloc
125 {
126   /* Any expression in the instruction is parsed into this field,
127      which is passed to fix_new_exp() to generate a fixup.  */
128   expressionS reloc_expression;
129
130   /* The type of the relocation to be applied.  */
131   bfd_reloc_code_real_type reloc_type;
132
133   /* PC-relative.  */
134   unsigned int reloc_pcrel;
135
136   /* The next relocation to be applied to the instruction.  */
137   struct nios2_insn_reloc *reloc_next;
138 } nios2_insn_relocS;
139
140 /* This struct is used to hold state when assembling instructions.  */
141 typedef struct nios2_insn_info
142 {
143   /* Assembled instruction.  */
144   unsigned long insn_code;
145
146   /* Constant bits masked into insn_code for self-check mode.  */
147   unsigned long constant_bits;
148
149   /* Pointer to the relevant bit of the opcode table.  */
150   const struct nios2_opcode *insn_nios2_opcode;
151   /* After parsing ptrs to the tokens in the instruction fill this array
152      it is terminated with a null pointer (hence the first +1).
153      The second +1 is because in some parts of the code the opcode
154      is not counted as a token, but still placed in this array.  */
155   const char *insn_tokens[NIOS2_MAX_INSN_TOKENS + 1 + 1];
156
157   /* This holds information used to generate fixups
158      and eventually relocations if it is not null.  */
159   nios2_insn_relocS *insn_reloc;
160 } nios2_insn_infoS;
161
162
163 /* This struct is used to convert Nios II pseudo-ops into the
164    corresponding real op.  */
165 typedef struct nios2_ps_insn_info
166 {
167   /* Map this pseudo_op... */
168   const char *pseudo_insn;
169
170   /* ...to this real instruction.  */
171   const char *insn;
172
173   /* Call this function to modify the operands....  */
174   void (*arg_modifer_func) (char ** parsed_args, const char *arg, int num,
175                             int start);
176
177   /* ...with these arguments.  */
178   const char *arg_modifier;
179   int num;
180   int index;
181
182   /* If arg_modifier_func allocates new memory, provide this function
183      to free it afterwards.  */
184   void (*arg_cleanup_func) (char **parsed_args, int num, int start);
185 } nios2_ps_insn_infoS;
186
187 /* Opcode hash table.  */
188 static struct hash_control *nios2_opcode_hash = NULL;
189 #define nios2_opcode_lookup(NAME) \
190   ((struct nios2_opcode *) hash_find (nios2_opcode_hash, (NAME)))
191
192 /* Register hash table.  */
193 static struct hash_control *nios2_reg_hash = NULL;
194 #define nios2_reg_lookup(NAME) \
195   ((struct nios2_reg *) hash_find (nios2_reg_hash, (NAME)))
196
197
198 /* Pseudo-op hash table.  */
199 static struct hash_control *nios2_ps_hash = NULL;
200 #define nios2_ps_lookup(NAME) \
201   ((nios2_ps_insn_infoS *) hash_find (nios2_ps_hash, (NAME)))
202
203 /* The known current alignment of the current section.  */
204 static int nios2_current_align;
205 static segT nios2_current_align_seg;
206
207 static int nios2_auto_align_on = 1;
208
209 /* The last seen label in the current section.  This is used to auto-align
210    labels preceeding instructions.  */
211 static symbolS *nios2_last_label;
212
213 /* If we saw a 16-bit CDX instruction, we can align on 2-byte boundaries
214    instead of 4-bytes.  Use this to keep track of the minimum power-of-2
215    alignment.  */
216 static int nios2_min_align = 2;
217
218 #ifdef OBJ_ELF
219 /* Pre-defined "_GLOBAL_OFFSET_TABLE_"  */
220 symbolS *GOT_symbol;
221 #endif
222
223 /* The processor architecture value, EF_NIOS2_ARCH_R1 by default.  */
224 static int nios2_architecture = EF_NIOS2_ARCH_R1;
225
226 \f
227 /** Utility routines.  */
228 /* Function md_chars_to_number takes the sequence of
229    bytes in buf and returns the corresponding value
230    in an int. n must be 1, 2 or 4.  */
231 static valueT
232 md_chars_to_number (char *buf, int n)
233 {
234   int i;
235   valueT val;
236
237   gas_assert (n == 1 || n == 2 || n == 4);
238
239   val = 0;
240   if (target_big_endian)
241     for (i = 0; i < n; ++i)
242       val = val | ((buf[i] & 0xff) << 8 * (n - (i + 1)));
243   else
244     for (i = 0; i < n; ++i)
245       val = val | ((buf[i] & 0xff) << 8 * i);
246   return val;
247 }
248
249
250 /* This function turns a C long int, short int or char
251    into the series of bytes that represent the number
252    on the target machine.  */
253 void
254 md_number_to_chars (char *buf, valueT val, int n)
255 {
256   gas_assert (n == 1 || n == 2 || n == 4 || n == 8);
257   if (target_big_endian)
258     number_to_chars_bigendian (buf, val, n);
259   else
260     number_to_chars_littleendian (buf, val, n);
261 }
262
263 /* Turn a string in input_line_pointer into a floating point constant
264    of type TYPE, and store the appropriate bytes in *LITP.  The number
265    of LITTLENUMS emitted is stored in *SIZEP.  An error message is
266    returned, or NULL on OK.  */
267 const char *
268 md_atof (int type, char *litP, int *sizeP)
269 {
270   int prec;
271   LITTLENUM_TYPE words[4];
272   char *t;
273   int i;
274
275   switch (type)
276     {
277     case 'f':
278       prec = 2;
279       break;
280     case 'd':
281       prec = 4;
282       break;
283     default:
284       *sizeP = 0;
285       return _("bad call to md_atof");
286     }
287
288   t = atof_ieee (input_line_pointer, type, words);
289   if (t)
290     input_line_pointer = t;
291
292   *sizeP = prec * 2;
293
294   if (! target_big_endian)
295     for (i = prec - 1; i >= 0; i--, litP += 2)
296       md_number_to_chars (litP, (valueT) words[i], 2);
297   else
298     for (i = 0; i < prec; i++, litP += 2)
299       md_number_to_chars (litP, (valueT) words[i], 2);
300
301   return NULL;
302 }
303
304 /* Return true if STR starts with PREFIX, which should be a string literal.  */
305 #define strprefix(STR, PREFIX) \
306   (strncmp ((STR), PREFIX, strlen (PREFIX)) == 0)
307
308
309 /* Return true if STR is prefixed with a special relocation operator.  */
310 static int
311 nios2_special_relocation_p (const char *str)
312 {
313   return (strprefix (str, "%lo")
314           || strprefix (str, "%hi")
315           || strprefix (str, "%hiadj")
316           || strprefix (str, "%gprel")
317           || strprefix (str, "%got")
318           || strprefix (str, "%call")
319           || strprefix (str, "%gotoff_lo")
320           || strprefix (str, "%gotoff_hiadj")
321           || strprefix (str, "%tls_gd")
322           || strprefix (str, "%tls_ldm")
323           || strprefix (str, "%tls_ldo")
324           || strprefix (str, "%tls_ie")
325           || strprefix (str, "%tls_le")
326           || strprefix (str, "%gotoff"));
327 }
328
329
330 /* nop fill patterns for text section.  */
331 static char const nop_r1[4] = { 0x3a, 0x88, 0x01, 0x00 };
332 static char const nop_r2[4] = { 0x20, 0x00, 0x00, 0xc4 };
333 static char const nop_r2_cdx[2] = { 0x3b, 0x00 };
334 static char const *nop32 = nop_r1;
335 static char const *nop16 = NULL;
336
337 /* Handles all machine-dependent alignment needs.  */
338 static void
339 nios2_align (int log_size, const char *pfill, symbolS *label)
340 {
341   int align;
342   long max_alignment = 15;
343
344   /* The front end is prone to changing segments out from under us
345      temporarily when -g is in effect.  */
346   int switched_seg_p = (nios2_current_align_seg != now_seg);
347
348   align = log_size;
349   if (align > max_alignment)
350     {
351       align = max_alignment;
352       as_bad (_("Alignment too large: %d. assumed"), align);
353     }
354   else if (align < 0)
355     {
356       as_warn (_("Alignment negative: 0 assumed"));
357       align = 0;
358     }
359
360   if (align != 0)
361     {
362       if (subseg_text_p (now_seg) && align >= nios2_min_align)
363         {
364           /* First, make sure we're on the minimum boundary, in case
365              someone has been putting .byte values the text section.  */
366           if (nios2_current_align < nios2_min_align || switched_seg_p)
367             frag_align (nios2_min_align, 0, 0);
368
369           /* If we might be on a 2-byte boundary, first align to a
370              4-byte boundary using the 2-byte nop as fill.  */
371           if (nios2_min_align == 1
372               && align > nios2_min_align
373               && pfill == nop32 )
374             {
375               gas_assert (nop16);
376               frag_align_pattern (2, nop16, 2, 0);
377             }
378
379           /* Now fill in the alignment pattern.  */
380           if (pfill != NULL)
381             frag_align_pattern (align, pfill, 4, 0);
382           else
383             frag_align (align, 0, 0);
384         }
385       else
386         frag_align (align, 0, 0);
387
388       if (!switched_seg_p)
389         nios2_current_align = align;
390
391       /* If the last label was in a different section we can't align it.  */
392       if (label != NULL && !switched_seg_p)
393         {
394           symbolS *sym;
395           int label_seen = FALSE;
396           struct frag *old_frag;
397           valueT old_value;
398           valueT new_value;
399
400           gas_assert (S_GET_SEGMENT (label) == now_seg);
401
402           old_frag = symbol_get_frag (label);
403           old_value = S_GET_VALUE (label);
404           new_value = (valueT) frag_now_fix ();
405
406           /* It is possible to have more than one label at a particular
407              address, especially if debugging is enabled, so we must
408              take care to adjust all the labels at this address in this
409              fragment.  To save time we search from the end of the symbol
410              list, backwards, since the symbols we are interested in are
411              almost certainly the ones that were most recently added.
412              Also to save time we stop searching once we have seen at least
413              one matching label, and we encounter a label that is no longer
414              in the target fragment.  Note, this search is guaranteed to
415              find at least one match when sym == label, so no special case
416              code is necessary.  */
417           for (sym = symbol_lastP; sym != NULL; sym = symbol_previous (sym))
418             if (symbol_get_frag (sym) == old_frag
419                 && S_GET_VALUE (sym) == old_value)
420               {
421                 label_seen = TRUE;
422                 symbol_set_frag (sym, frag_now);
423                 S_SET_VALUE (sym, new_value);
424               }
425             else if (label_seen && symbol_get_frag (sym) != old_frag)
426               break;
427         }
428       record_alignment (now_seg, align);
429     }
430 }
431
432 \f
433 /** Support for self-check mode.  */
434
435 /* Mode of the assembler.  */
436 typedef enum
437 {
438   NIOS2_MODE_ASSEMBLE,          /* Ordinary operation.  */
439   NIOS2_MODE_TEST               /* Hidden mode used for self testing.  */
440 } NIOS2_MODE;
441
442 static NIOS2_MODE nios2_mode = NIOS2_MODE_ASSEMBLE;
443
444 /* This function is used to in self-checking mode
445    to check the assembled instruction
446    opcode should be the assembled opcode, and exp_opcode
447    the parsed string representing the expected opcode.  */
448 static void
449 nios2_check_assembly (unsigned int opcode, const char *exp_opcode)
450 {
451   if (nios2_mode == NIOS2_MODE_TEST)
452     {
453       if (exp_opcode == NULL)
454         as_bad (_("expecting opcode string in self test mode"));
455       else if (opcode != strtoul (exp_opcode, NULL, 16))
456         as_bad (_("assembly 0x%08x, expected %s"), opcode, exp_opcode);
457     }
458 }
459
460 \f
461 /** Support for machine-dependent assembler directives.  */
462 /* Handle the .align pseudo-op.  This aligns to a power of two.  It
463    also adjusts any current instruction label.  We treat this the same
464    way the MIPS port does: .align 0 turns off auto alignment.  */
465 static void
466 s_nios2_align (int ignore ATTRIBUTE_UNUSED)
467 {
468   int align;
469   char fill;
470   const char *pfill = NULL;
471   long max_alignment = 15;
472
473   align = get_absolute_expression ();
474   if (align > max_alignment)
475     {
476       align = max_alignment;
477       as_bad (_("Alignment too large: %d. assumed"), align);
478     }
479   else if (align < 0)
480     {
481       as_warn (_("Alignment negative: 0 assumed"));
482       align = 0;
483     }
484
485   if (*input_line_pointer == ',')
486     {
487       input_line_pointer++;
488       fill = get_absolute_expression ();
489       pfill = (const char *) &fill;
490     }
491   else if (subseg_text_p (now_seg))
492     pfill = (const char *) nop32;
493   else
494     {
495       pfill = NULL;
496       nios2_last_label = NULL;
497     }
498
499   if (align != 0)
500     {
501       nios2_auto_align_on = 1;
502       nios2_align (align, pfill, nios2_last_label);
503       nios2_last_label = NULL;
504     }
505   else
506     nios2_auto_align_on = 0;
507
508   demand_empty_rest_of_line ();
509 }
510
511 /* Handle the .text pseudo-op.  This is like the usual one, but it
512    clears the saved last label and resets known alignment.  */
513 static void
514 s_nios2_text (int i)
515 {
516   s_text (i);
517   nios2_last_label = NULL;
518   nios2_current_align = 0;
519   nios2_current_align_seg = now_seg;
520 }
521
522 /* Handle the .data pseudo-op.  This is like the usual one, but it
523    clears the saved last label and resets known alignment.  */
524 static void
525 s_nios2_data (int i)
526 {
527   s_data (i);
528   nios2_last_label = NULL;
529   nios2_current_align = 0;
530   nios2_current_align_seg = now_seg;
531 }
532
533 /* Handle the .section pseudo-op.  This is like the usual one, but it
534    clears the saved last label and resets known alignment.  */
535 static void
536 s_nios2_section (int ignore)
537 {
538   obj_elf_section (ignore);
539   nios2_last_label = NULL;
540   nios2_current_align = 0;
541   nios2_current_align_seg = now_seg;
542 }
543
544 /* Explicitly unaligned cons.  */
545 static void
546 s_nios2_ucons (int nbytes)
547 {
548   int hold;
549   hold = nios2_auto_align_on;
550   nios2_auto_align_on = 0;
551   cons (nbytes);
552   nios2_auto_align_on = hold;
553 }
554
555 /* Handle the .sdata directive.  */
556 static void
557 s_nios2_sdata (int ignore ATTRIBUTE_UNUSED)
558 {
559   get_absolute_expression ();  /* Ignored.  */
560   subseg_new (".sdata", 0);
561   demand_empty_rest_of_line ();
562 }
563
564 /* .set sets assembler options eg noat/at and is also used
565    to set symbol values (.equ, .equiv ).  */
566 static void
567 s_nios2_set (int equiv)
568 {
569   char *save = input_line_pointer;
570   char *directive;
571   char delim = get_symbol_name (&directive);
572   char *endline = input_line_pointer;
573
574   (void) restore_line_pointer (delim);
575
576   /* We only want to handle ".set XXX" if the
577      user has tried ".set XXX, YYY" they are not
578      trying a directive.  This prevents
579      us from polluting the name space.  */
580   SKIP_WHITESPACE ();
581   if (is_end_of_line[(unsigned char) *input_line_pointer])
582     {
583       bfd_boolean done = TRUE;
584       *endline = 0;
585
586       if (!strcmp (directive, "noat"))
587           nios2_as_options.noat = TRUE;
588       else if (!strcmp (directive, "at"))
589           nios2_as_options.noat = FALSE;
590       else if (!strcmp (directive, "nobreak"))
591           nios2_as_options.nobreak = TRUE;
592       else if (!strcmp (directive, "break"))
593           nios2_as_options.nobreak = FALSE;
594       else if (!strcmp (directive, "norelax"))
595           nios2_as_options.relax = relax_none;
596       else if (!strcmp (directive, "relaxsection"))
597           nios2_as_options.relax = relax_section;
598       else if (!strcmp (directive, "relaxall"))
599           nios2_as_options.relax = relax_all;
600       else
601         done = FALSE;
602
603       if (done)
604         {
605           *endline = delim;
606           demand_empty_rest_of_line ();
607           return;
608         }
609     }
610
611   /* If we fall through to here, either we have ".set XXX, YYY"
612      or we have ".set XXX" where XXX is unknown or we have
613      a syntax error.  */
614   input_line_pointer = save;
615   s_set (equiv);
616 }
617
618 /* Machine-dependent assembler directives.
619    Format of each entry is:
620    { "directive", handler_func, param }  */
621 const pseudo_typeS md_pseudo_table[] = {
622   {"align", s_nios2_align, 0},
623   {"text", s_nios2_text, 0},
624   {"data", s_nios2_data, 0},
625   {"section", s_nios2_section, 0},
626   {"section.s", s_nios2_section, 0},
627   {"sect", s_nios2_section, 0},
628   {"sect.s", s_nios2_section, 0},
629   /* .dword and .half are included for compatibility with MIPS.  */
630   {"dword", cons, 8},
631   {"half", cons, 2},
632   /* NIOS2 native word size is 4 bytes, so we override
633      the GAS default of 2.  */
634   {"word", cons, 4},
635   /* Explicitly unaligned directives.  */
636   {"2byte", s_nios2_ucons, 2},
637   {"4byte", s_nios2_ucons, 4},
638   {"8byte", s_nios2_ucons, 8},
639   {"16byte", s_nios2_ucons, 16},
640 #ifdef OBJ_ELF
641   {"sdata", s_nios2_sdata, 0},
642 #endif
643   {"set", s_nios2_set, 0},
644   {NULL, NULL, 0}
645 };
646
647 \f
648 /** Relaxation support. */
649
650 /* We support two relaxation modes:  a limited PC-relative mode with
651    -relax-section (the default), and an absolute jump mode with -relax-all.
652
653    Nios II PC-relative branch instructions only support 16-bit offsets.
654    And, there's no good way to add a 32-bit constant to the PC without
655    using two registers.
656
657    To deal with this, for the pc-relative relaxation mode we convert
658      br label
659    into a series of 16-bit adds, like:
660      nextpc at
661      addi at, at, 32767
662      ...
663      addi at, at, remainder
664      jmp at
665
666    Similarly, conditional branches are converted from
667      b(condition) r, s, label
668    into a series like:
669      b(opposite condition) r, s, skip
670      nextpc at
671      addi at, at, 32767
672      ...
673      addi at, at, remainder
674      jmp at
675      skip:
676
677    The compiler can do a better job, either by converting the branch
678    directly into a JMP (going through the GOT for PIC) or by allocating
679    a second register for the 32-bit displacement.
680
681    For the -relax-all relaxation mode, the conversions are
682      movhi at, %hi(symbol+offset)
683      ori at, %lo(symbol+offset)
684      jmp at
685    and
686      b(opposite condition), r, s, skip
687      movhi at, %hi(symbol+offset)
688      ori at, %lo(symbol+offset)
689      jmp at
690      skip:
691    respectively.
692
693    16-bit CDX branch instructions are relaxed first into equivalent
694    32-bit branches and then the above transformations are applied
695    if necessary.
696
697 */
698
699 /* Arbitrarily limit the number of addis we can insert; we need to be able
700    to specify the maximum growth size for each frag that contains a
701    relaxable branch.  There's no point in specifying a huge number here
702    since that means the assembler needs to allocate that much extra
703    memory for every branch, and almost no real code will ever need it.
704    Plus, as already noted a better solution is to just use a jmp, or
705    allocate a second register to hold a 32-bit displacement.
706    FIXME:  Rather than making this a constant, it could be controlled by
707    a command-line argument.  */
708 #define RELAX_MAX_ADDI 32
709
710 /* The fr_subtype field represents the target-specific relocation state.
711    It has type relax_substateT (unsigned int).  We use it to track the
712    number of addis necessary, plus a bit to track whether this is a
713    conditional branch and a bit for 16-bit CDX instructions.
714    Regardless of the smaller RELAX_MAX_ADDI limit, we reserve 16 bits
715    in the fr_subtype to encode the number of addis so that the whole
716    theoretically-valid range is representable.
717    For the -relax-all mode, N = 0 represents an in-range branch and N = 1
718    represents a branch that needs to be relaxed.  */
719 #define UBRANCH (0 << 16)
720 #define CBRANCH (1 << 16)
721 #define CDXBRANCH (1 << 17)
722 #define IS_CBRANCH(SUBTYPE) ((SUBTYPE) & CBRANCH)
723 #define IS_UBRANCH(SUBTYPE) (!IS_CBRANCH (SUBTYPE))
724 #define IS_CDXBRANCH(SUBTYPE) ((SUBTYPE) & CDXBRANCH)
725 #define UBRANCH_SUBTYPE(N) (UBRANCH | (N))
726 #define CBRANCH_SUBTYPE(N) (CBRANCH | (N))
727 #define CDX_UBRANCH_SUBTYPE(N) (CDXBRANCH | UBRANCH | (N))
728 #define CDX_CBRANCH_SUBTYPE(N) (CDXBRANCH | CBRANCH | (N))
729 #define SUBTYPE_ADDIS(SUBTYPE) ((SUBTYPE) & 0xffff)
730
731 /* For the -relax-section mode, unconditional branches require 2 extra i
732    nstructions besides the addis, conditional branches require 3.  */
733 #define UBRANCH_ADDIS_TO_SIZE(N) (((N) + 2) * 4)
734 #define CBRANCH_ADDIS_TO_SIZE(N) (((N) + 3) * 4)
735
736 /* For the -relax-all mode, unconditional branches require 3 instructions
737    and conditional branches require 4.  */
738 #define UBRANCH_JUMP_SIZE 12
739 #define CBRANCH_JUMP_SIZE 16
740
741 /* Maximum sizes of relaxation sequences.  */
742 #define UBRANCH_MAX_SIZE \
743   (nios2_as_options.relax == relax_all          \
744    ? UBRANCH_JUMP_SIZE                          \
745    : UBRANCH_ADDIS_TO_SIZE (RELAX_MAX_ADDI))
746 #define CBRANCH_MAX_SIZE \
747   (nios2_as_options.relax == relax_all          \
748    ? CBRANCH_JUMP_SIZE                          \
749    : CBRANCH_ADDIS_TO_SIZE (RELAX_MAX_ADDI))
750
751 /* Register number of AT, the assembler temporary.  */
752 #define AT_REGNUM 1
753
754 /* Determine how many bytes are required to represent the sequence
755    indicated by SUBTYPE.  */
756 static int
757 nios2_relax_subtype_size (relax_substateT subtype)
758 {
759   int n = SUBTYPE_ADDIS (subtype);
760   if (n == 0)
761     /* Regular conditional/unconditional branch instruction.  */
762     return (IS_CDXBRANCH (subtype) ? 2 : 4);
763   else if (nios2_as_options.relax == relax_all)
764     return (IS_CBRANCH (subtype) ? CBRANCH_JUMP_SIZE : UBRANCH_JUMP_SIZE);
765   else if (IS_CBRANCH (subtype))
766     return CBRANCH_ADDIS_TO_SIZE (n);
767   else
768     return UBRANCH_ADDIS_TO_SIZE (n);
769 }
770
771 /* Estimate size of fragp before relaxation.
772    This could also examine the offset in fragp and adjust
773    fragp->fr_subtype, but we will do that in nios2_relax_frag anyway.  */
774 int
775 md_estimate_size_before_relax (fragS *fragp, segT segment ATTRIBUTE_UNUSED)
776 {
777   return nios2_relax_subtype_size (fragp->fr_subtype);
778 }
779
780 /* Implement md_relax_frag, returning the change in size of the frag.  */
781 long
782 nios2_relax_frag (segT segment, fragS *fragp, long stretch)
783 {
784   addressT target = fragp->fr_offset;
785   relax_substateT subtype = fragp->fr_subtype;
786   symbolS *symbolp = fragp->fr_symbol;
787
788   if (symbolp)
789     {
790       fragS *sym_frag = symbol_get_frag (symbolp);
791       offsetT offset;
792       int n;
793       bfd_boolean is_cdx = FALSE;
794
795       target += S_GET_VALUE (symbolp);
796
797       /* See comments in write.c:relax_frag about handling of stretch.  */
798       if (stretch != 0
799           && sym_frag->relax_marker != fragp->relax_marker)
800         {
801           if (stretch < 0 || sym_frag->region == fragp->region)
802             target += stretch;
803           else if (target < fragp->fr_address)
804             target = fragp->fr_next->fr_address + stretch;
805         }
806
807       /* We subtract fr_var (4 for 32-bit insns) because all pc relative
808          branches are from the next instruction.  */
809       offset = target - fragp->fr_address - fragp->fr_fix - fragp->fr_var;
810       if (IS_CDXBRANCH (subtype) && IS_UBRANCH (subtype)
811           && offset >= -1024 && offset < 1024)
812         /* PC-relative CDX branch with 11-bit offset.  */
813         is_cdx = TRUE;
814       else if (IS_CDXBRANCH (subtype) && IS_CBRANCH (subtype)
815                && offset >= -128 && offset < 128)
816         /* PC-relative CDX branch with 8-bit offset.  */
817         is_cdx = TRUE;
818       else if (offset >= -32768 && offset < 32768)
819         /* Fits in PC-relative branch.  */
820         n = 0;
821       else if (nios2_as_options.relax == relax_all)
822         /* Convert to jump.  */
823         n = 1;
824       else if (nios2_as_options.relax == relax_section
825                && S_GET_SEGMENT (symbolp) == segment
826                && S_IS_DEFINED (symbolp))
827         /* Attempt a PC-relative relaxation on a branch to a defined
828            symbol in the same segment.  */
829         {
830           /* The relaxation for conditional branches is offset by 4
831              bytes because we insert the inverted branch around the
832              sequence.  */
833           if (IS_CBRANCH (subtype))
834             offset = offset - 4;
835           if (offset > 0)
836             n = offset / 32767 + 1;
837           else
838             n = offset / -32768 + 1;
839
840           /* Bail out immediately if relaxation has failed.  If we try to
841              defer the diagnostic to md_convert_frag, some pathological test
842              cases (e.g. gcc/testsuite/gcc.c-torture/compile/20001226-1.c)
843              apparently never converge.  By returning 0 here we could pretend
844              to the caller that nothing has changed, but that leaves things
845              in an inconsistent state when we get to md_convert_frag.  */
846           if (n > RELAX_MAX_ADDI)
847             {
848               as_bad_where (fragp->fr_file, fragp->fr_line,
849                             _("branch offset out of range\n"));
850               as_fatal (_("branch relaxation failed\n"));
851             }
852         }
853       else
854         /* We cannot handle this case, diagnose overflow later.  */
855         return 0;
856
857       if (is_cdx)
858         fragp->fr_subtype = subtype;
859       else if (IS_CBRANCH (subtype))
860         fragp->fr_subtype = CBRANCH_SUBTYPE (n);
861       else
862         fragp->fr_subtype = UBRANCH_SUBTYPE (n);
863
864       return (nios2_relax_subtype_size (fragp->fr_subtype)
865               - nios2_relax_subtype_size (subtype));
866     }
867
868   /* If we got here, it's probably an error.  */
869   return 0;
870 }
871
872
873 /* Complete fragp using the data from the relaxation pass. */
874 void
875 md_convert_frag (bfd *headers ATTRIBUTE_UNUSED, segT segment ATTRIBUTE_UNUSED,
876                  fragS *fragp)
877 {
878   char *buffer = fragp->fr_literal + fragp->fr_fix;
879   relax_substateT subtype = fragp->fr_subtype;
880   int n = SUBTYPE_ADDIS (subtype);
881   addressT target = fragp->fr_offset;
882   symbolS *symbolp = fragp->fr_symbol;
883   offsetT offset;
884   unsigned int addend_mask, addi_mask, op;
885   offsetT addend, remainder;
886   int i;
887   bfd_boolean is_r2 = (bfd_get_mach (stdoutput) == bfd_mach_nios2r2);
888
889   /* If this is a CDX branch we're not relaxing, just generate the fixup.  */
890   if (IS_CDXBRANCH (subtype))
891     {
892       gas_assert (is_r2);
893       fix_new (fragp, fragp->fr_fix, 2, fragp->fr_symbol,
894                fragp->fr_offset, 1,
895                (IS_UBRANCH (subtype)
896                 ? BFD_RELOC_NIOS2_R2_I10_1_PCREL
897                 : BFD_RELOC_NIOS2_R2_T1I7_1_PCREL));
898       fragp->fr_fix += 2;
899       return;
900     }
901
902   /* If this is a CDX branch we are relaxing, turn it into an equivalent
903      32-bit branch and then fall through to the normal non-CDX cases.  */
904   if (fragp->fr_var == 2)
905     {
906       unsigned int opcode = md_chars_to_number (buffer, 2);
907       gas_assert (is_r2);
908       if (IS_CBRANCH (subtype))
909         {
910           unsigned int reg = nios2_r2_reg3_mappings[GET_IW_T1I7_A3 (opcode)];
911           if (GET_IW_R2_OP (opcode) == R2_OP_BNEZ_N)
912             opcode = MATCH_R2_BNE | SET_IW_F2I16_A (reg);
913           else
914             opcode = MATCH_R2_BEQ | SET_IW_F2I16_A (reg);
915         }
916       else
917         opcode = MATCH_R2_BR;
918       md_number_to_chars (buffer, opcode, 4);
919       fragp->fr_var = 4;
920     }
921
922   /* If we didn't or can't relax, this is a regular branch instruction.
923      We just need to generate the fixup for the symbol and offset.  */
924   if (n == 0)
925     {
926       fix_new (fragp, fragp->fr_fix, 4, fragp->fr_symbol,
927                fragp->fr_offset, 1, BFD_RELOC_16_PCREL);
928       fragp->fr_fix += 4;
929       return;
930     }
931
932   /* Replace the cbranch at fr_fix with one that has the opposite condition
933      in order to jump around the block of instructions we'll be adding.  */
934   if (IS_CBRANCH (subtype))
935     {
936       unsigned int br_opcode;
937       unsigned int old_op, new_op;
938       int nbytes;
939
940       /* Account for the nextpc and jmp in the pc-relative case, or the two
941          load instructions and jump in the absolute case.  */
942       if (nios2_as_options.relax == relax_section)
943         nbytes = (n + 2) * 4;
944       else
945         nbytes = 12;
946
947       br_opcode = md_chars_to_number (buffer, 4);
948       if (is_r2)
949         {
950           old_op = GET_IW_R2_OP (br_opcode);
951           switch (old_op)
952             {
953             case R2_OP_BEQ:
954               new_op = R2_OP_BNE;
955               break;
956             case R2_OP_BNE:
957               new_op = R2_OP_BEQ;
958               break;
959             case R2_OP_BGE:
960               new_op = R2_OP_BLT;
961               break;
962             case R2_OP_BGEU:
963               new_op = R2_OP_BLTU;
964               break;
965             case R2_OP_BLT:
966               new_op = R2_OP_BGE;
967               break;
968             case R2_OP_BLTU:
969               new_op = R2_OP_BGEU;
970               break;
971             default:
972               abort ();
973             }
974           br_opcode = ((br_opcode & ~IW_R2_OP_SHIFTED_MASK)
975                        | SET_IW_R2_OP (new_op));
976           br_opcode = br_opcode | SET_IW_F2I16_IMM16 (nbytes);
977         }
978       else
979         {
980           old_op = GET_IW_R1_OP (br_opcode);
981           switch (old_op)
982             {
983             case R1_OP_BEQ:
984               new_op = R1_OP_BNE;
985               break;
986             case R1_OP_BNE:
987               new_op = R1_OP_BEQ;
988               break;
989             case R1_OP_BGE:
990               new_op = R1_OP_BLT;
991               break;
992             case R1_OP_BGEU:
993               new_op = R1_OP_BLTU;
994               break;
995             case R1_OP_BLT:
996               new_op = R1_OP_BGE;
997               break;
998             case R1_OP_BLTU:
999               new_op = R1_OP_BGEU;
1000               break;
1001             default:
1002               abort ();
1003             }
1004           br_opcode = ((br_opcode & ~IW_R1_OP_SHIFTED_MASK)
1005                        | SET_IW_R1_OP (new_op));
1006           br_opcode = br_opcode | SET_IW_I_IMM16 (nbytes);
1007         }
1008       md_number_to_chars (buffer, br_opcode, 4);
1009       fragp->fr_fix += 4;
1010       buffer += 4;
1011     }
1012
1013   /* Load at for the PC-relative case.  */
1014   if (nios2_as_options.relax == relax_section)
1015     {
1016       /* Insert the nextpc instruction.  */
1017       if (is_r2)
1018         op = MATCH_R2_NEXTPC | SET_IW_F3X6L5_C (AT_REGNUM);
1019       else
1020         op = MATCH_R1_NEXTPC | SET_IW_R_C (AT_REGNUM);
1021       md_number_to_chars (buffer, op, 4);
1022       fragp->fr_fix += 4;
1023       buffer += 4;
1024
1025       /* We need to know whether the offset is positive or negative.  */
1026       target += S_GET_VALUE (symbolp);
1027       offset = target - fragp->fr_address - fragp->fr_fix;
1028       if (offset > 0)
1029         addend = 32767;
1030       else
1031         addend = -32768;
1032       if (is_r2)
1033         addend_mask = SET_IW_F2I16_IMM16 ((unsigned int)addend);
1034       else
1035         addend_mask = SET_IW_I_IMM16 ((unsigned int)addend);
1036
1037       /* Insert n-1 addi instructions.  */
1038       if (is_r2)
1039         addi_mask = (MATCH_R2_ADDI
1040                      | SET_IW_F2I16_B (AT_REGNUM)
1041                      | SET_IW_F2I16_A (AT_REGNUM));
1042       else
1043         addi_mask = (MATCH_R1_ADDI
1044                      | SET_IW_I_B (AT_REGNUM)
1045                      | SET_IW_I_A (AT_REGNUM));
1046       for (i = 0; i < n - 1; i ++)
1047         {
1048           md_number_to_chars (buffer, addi_mask | addend_mask, 4);
1049           fragp->fr_fix += 4;
1050           buffer += 4;
1051         }
1052
1053       /* Insert the last addi instruction to hold the remainder.  */
1054       remainder = offset - addend * (n - 1);
1055       gas_assert (remainder >= -32768 && remainder <= 32767);
1056       if (is_r2)
1057         addend_mask = SET_IW_F2I16_IMM16 ((unsigned int)remainder);
1058       else
1059         addend_mask = SET_IW_I_IMM16 ((unsigned int)remainder);
1060       md_number_to_chars (buffer, addi_mask | addend_mask, 4);
1061       fragp->fr_fix += 4;
1062       buffer += 4;
1063     }
1064
1065   /* Load at for the absolute case.  */
1066   else
1067     {
1068       if (is_r2)
1069         op = MATCH_R2_ORHI | SET_IW_F2I16_B (AT_REGNUM) | SET_IW_F2I16_A (0);
1070       else
1071         op = MATCH_R1_ORHI | SET_IW_I_B (AT_REGNUM) | SET_IW_I_A (0);
1072       md_number_to_chars (buffer, op, 4);
1073       fix_new (fragp, fragp->fr_fix, 4, fragp->fr_symbol, fragp->fr_offset,
1074                0, BFD_RELOC_NIOS2_HI16);
1075       fragp->fr_fix += 4;
1076       buffer += 4;
1077       if (is_r2)
1078         op = (MATCH_R2_ORI | SET_IW_F2I16_B (AT_REGNUM)
1079               | SET_IW_F2I16_A (AT_REGNUM));
1080       else
1081         op = (MATCH_R1_ORI | SET_IW_I_B (AT_REGNUM)
1082               | SET_IW_I_A (AT_REGNUM));
1083       md_number_to_chars (buffer, op, 4);
1084       fix_new (fragp, fragp->fr_fix, 4, fragp->fr_symbol, fragp->fr_offset,
1085                0, BFD_RELOC_NIOS2_LO16);
1086       fragp->fr_fix += 4;
1087       buffer += 4;
1088     }
1089
1090   /* Insert the jmp instruction.  */
1091   if (is_r2)
1092     op = MATCH_R2_JMP | SET_IW_F3X6L5_A (AT_REGNUM);
1093   else
1094     op = MATCH_R1_JMP | SET_IW_R_A (AT_REGNUM);
1095   md_number_to_chars (buffer, op, 4);
1096   fragp->fr_fix += 4;
1097   buffer += 4;
1098 }
1099
1100 \f
1101 /** Fixups and overflow checking.  */
1102
1103 /* Check a fixup for overflow. */
1104 static bfd_boolean
1105 nios2_check_overflow (valueT fixup, reloc_howto_type *howto)
1106 {
1107   /* If there is a rightshift, check that the low-order bits are
1108      zero before applying it.  */
1109   if (howto->rightshift)
1110     {
1111       if ((~(~((valueT) 0) << howto->rightshift) & fixup)
1112           && howto->complain_on_overflow != complain_overflow_dont)
1113         return TRUE;
1114       fixup = ((signed)fixup) >> howto->rightshift;
1115     }
1116
1117   /* Check for overflow - return TRUE if overflow, FALSE if not.  */
1118   switch (howto->complain_on_overflow)
1119     {
1120     case complain_overflow_dont:
1121       break;
1122     case complain_overflow_bitfield:
1123       if ((fixup >> howto->bitsize) != 0
1124           && ((signed) fixup >> howto->bitsize) != -1)
1125         return TRUE;
1126       break;
1127     case complain_overflow_signed:
1128       if ((fixup & 0x80000000) > 0)
1129         {
1130           /* Check for negative overflow.  */
1131           if ((signed) fixup < ((signed) ~0 << (howto->bitsize-1)))
1132             return TRUE;
1133         }
1134       else
1135         {
1136           /* Check for positive overflow.  */
1137           if (fixup >= ((unsigned) 1 << (howto->bitsize - 1)))
1138             return TRUE;
1139         }
1140       break;
1141     case complain_overflow_unsigned:
1142       if ((fixup >> howto->bitsize) != 0)
1143         return TRUE;
1144       break;
1145     default:
1146       as_bad (_("error checking for overflow - broken assembler"));
1147       break;
1148     }
1149   return FALSE;
1150 }
1151
1152 /* Emit diagnostic for fixup overflow.  */
1153 static void
1154 nios2_diagnose_overflow (valueT fixup, reloc_howto_type *howto,
1155                          fixS *fixP, valueT value)
1156 {
1157   if (fixP->fx_r_type == BFD_RELOC_8
1158       || fixP->fx_r_type == BFD_RELOC_16
1159       || fixP->fx_r_type == BFD_RELOC_32)
1160     /* These relocs are against data, not instructions.  */
1161     as_bad_where (fixP->fx_file, fixP->fx_line,
1162                   _("immediate value 0x%x truncated to 0x%x"),
1163                   (unsigned int) fixup,
1164                   (unsigned int) (~(~(valueT) 0 << howto->bitsize) & fixup));
1165   else
1166     {
1167       /* What opcode is the instruction?  This will determine
1168          whether we check for overflow in immediate values
1169          and what error message we get.  */
1170       const struct nios2_opcode *opcode;
1171       enum overflow_type overflow_msg_type;
1172       unsigned int range_min;
1173       unsigned int range_max;
1174       unsigned int address;
1175
1176       opcode = nios2_find_opcode_hash (value, bfd_get_mach (stdoutput));
1177       gas_assert (opcode);
1178       gas_assert (fixP->fx_size == opcode->size);
1179       overflow_msg_type = opcode->overflow_msg;
1180       switch (overflow_msg_type)
1181         {
1182         case call_target_overflow:
1183           range_min
1184             = ((fixP->fx_frag->fr_address + fixP->fx_where) & 0xf0000000);
1185           range_max = range_min + 0x0fffffff;
1186           address = fixup | range_min;
1187
1188           as_bad_where (fixP->fx_file, fixP->fx_line,
1189                         _("call target address 0x%08x out of range 0x%08x to 0x%08x"),
1190                         address, range_min, range_max);
1191           break;
1192         case branch_target_overflow:
1193           if (opcode->format == iw_i_type || opcode->format == iw_F2I16_type)
1194             as_bad_where (fixP->fx_file, fixP->fx_line,
1195                           _("branch offset %d out of range %d to %d"),
1196                           (int)fixup, -32768, 32767);
1197           else
1198             as_bad_where (fixP->fx_file, fixP->fx_line,
1199                           _("branch offset %d out of range"),
1200                           (int)fixup);
1201           break;
1202         case address_offset_overflow:
1203           if (opcode->format == iw_i_type || opcode->format == iw_F2I16_type)
1204             as_bad_where (fixP->fx_file, fixP->fx_line,
1205                           _("%s offset %d out of range %d to %d"),
1206                           opcode->name, (int)fixup, -32768, 32767);
1207           else
1208             as_bad_where (fixP->fx_file, fixP->fx_line,
1209                           _("%s offset %d out of range"),
1210                           opcode->name, (int)fixup);
1211           break;
1212         case signed_immed16_overflow:
1213           as_bad_where (fixP->fx_file, fixP->fx_line,
1214                         _("immediate value %d out of range %d to %d"),
1215                         (int)fixup, -32768, 32767);
1216           break;
1217         case unsigned_immed16_overflow:
1218           as_bad_where (fixP->fx_file, fixP->fx_line,
1219                         _("immediate value %u out of range %u to %u"),
1220                         (unsigned int)fixup, 0, 65535);
1221           break;
1222         case unsigned_immed5_overflow:
1223           as_bad_where (fixP->fx_file, fixP->fx_line,
1224                         _("immediate value %u out of range %u to %u"),
1225                         (unsigned int)fixup, 0, 31);
1226           break;
1227         case signed_immed12_overflow:
1228           as_bad_where (fixP->fx_file, fixP->fx_line,
1229                         _("immediate value %d out of range %d to %d"),
1230                         (int)fixup, -2048, 2047);
1231           break;
1232         case custom_opcode_overflow:
1233           as_bad_where (fixP->fx_file, fixP->fx_line,
1234                         _("custom instruction opcode %u out of range %u to %u"),
1235                         (unsigned int)fixup, 0, 255);
1236           break;
1237         default:
1238           as_bad_where (fixP->fx_file, fixP->fx_line,
1239                         _("overflow in immediate argument"));
1240           break;
1241         }
1242     }
1243 }
1244
1245 /* Apply a fixup to the object file.  */
1246 void
1247 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
1248 {
1249   /* Assert that the fixup is one we can handle.  */
1250   gas_assert (fixP != NULL && valP != NULL
1251               && (fixP->fx_r_type == BFD_RELOC_8
1252                   || fixP->fx_r_type == BFD_RELOC_16
1253                   || fixP->fx_r_type == BFD_RELOC_32
1254                   || fixP->fx_r_type == BFD_RELOC_64
1255                   || fixP->fx_r_type == BFD_RELOC_NIOS2_S16
1256                   || fixP->fx_r_type == BFD_RELOC_NIOS2_U16
1257                   || fixP->fx_r_type == BFD_RELOC_16_PCREL
1258                   || fixP->fx_r_type == BFD_RELOC_NIOS2_CALL26
1259                   || fixP->fx_r_type == BFD_RELOC_NIOS2_IMM5
1260                   || fixP->fx_r_type == BFD_RELOC_NIOS2_CACHE_OPX
1261                   || fixP->fx_r_type == BFD_RELOC_NIOS2_IMM6
1262                   || fixP->fx_r_type == BFD_RELOC_NIOS2_IMM8
1263                   || fixP->fx_r_type == BFD_RELOC_NIOS2_HI16
1264                   || fixP->fx_r_type == BFD_RELOC_NIOS2_LO16
1265                   || fixP->fx_r_type == BFD_RELOC_NIOS2_HIADJ16
1266                   || fixP->fx_r_type == BFD_RELOC_NIOS2_GPREL
1267                   || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
1268                   || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
1269                   || fixP->fx_r_type == BFD_RELOC_NIOS2_UJMP
1270                   || fixP->fx_r_type == BFD_RELOC_NIOS2_CJMP
1271                   || fixP->fx_r_type == BFD_RELOC_NIOS2_CALLR
1272                   || fixP->fx_r_type == BFD_RELOC_NIOS2_ALIGN
1273                   || fixP->fx_r_type == BFD_RELOC_NIOS2_GOT16
1274                   || fixP->fx_r_type == BFD_RELOC_NIOS2_CALL16
1275                   || fixP->fx_r_type == BFD_RELOC_NIOS2_GOTOFF_LO
1276                   || fixP->fx_r_type == BFD_RELOC_NIOS2_GOTOFF_HA
1277                   || fixP->fx_r_type == BFD_RELOC_NIOS2_TLS_GD16
1278                   || fixP->fx_r_type == BFD_RELOC_NIOS2_TLS_LDM16
1279                   || fixP->fx_r_type == BFD_RELOC_NIOS2_TLS_LDO16
1280                   || fixP->fx_r_type == BFD_RELOC_NIOS2_TLS_IE16
1281                   || fixP->fx_r_type == BFD_RELOC_NIOS2_TLS_LE16
1282                   || fixP->fx_r_type == BFD_RELOC_NIOS2_GOTOFF
1283                   || fixP->fx_r_type == BFD_RELOC_NIOS2_TLS_DTPREL
1284                   || fixP->fx_r_type == BFD_RELOC_NIOS2_CALL26_NOAT
1285                   || fixP->fx_r_type == BFD_RELOC_NIOS2_GOT_LO
1286                   || fixP->fx_r_type == BFD_RELOC_NIOS2_GOT_HA
1287                   || fixP->fx_r_type == BFD_RELOC_NIOS2_CALL_LO
1288                   || fixP->fx_r_type == BFD_RELOC_NIOS2_CALL_HA
1289                   || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_S12
1290                   || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_I10_1_PCREL
1291                   || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_T1I7_1_PCREL
1292                   || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_T1I7_2
1293                   || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_T2I4
1294                   || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_T2I4_1
1295                   || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_T2I4_2
1296                   || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_X1I7_2
1297                   || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_X2L5
1298                   || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_F1I5_2
1299                   || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_L5I4X1
1300                   || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_T1X1I6
1301                   || fixP->fx_r_type == BFD_RELOC_NIOS2_R2_T1X1I6_2
1302                   /* Add other relocs here as we generate them.  */
1303                   ));
1304
1305   if (fixP->fx_r_type == BFD_RELOC_64)
1306     {
1307       /* We may reach here due to .8byte directives, but we never output
1308          BFD_RELOC_64; it must be resolved.  */
1309       if (fixP->fx_addsy != NULL)
1310         as_bad_where (fixP->fx_file, fixP->fx_line,
1311                       _("cannot create 64-bit relocation"));
1312       else
1313         {
1314           md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
1315                               *valP, 8);
1316           fixP->fx_done = 1;
1317         }
1318       return;
1319     }
1320
1321   /* The value passed in valP can be the value of a fully
1322      resolved expression, or it can be the value of a partially
1323      resolved expression.  In the former case, both fixP->fx_addsy
1324      and fixP->fx_subsy are NULL, and fixP->fx_offset == *valP, and
1325      we can fix up the instruction that fixP relates to.
1326      In the latter case, one or both of fixP->fx_addsy and
1327      fixP->fx_subsy are not NULL, and fixP->fx_offset may or may not
1328      equal *valP.  We don't need to check for fixP->fx_subsy being null
1329      because the generic part of the assembler generates an error if
1330      it is not an absolute symbol.  */
1331   if (fixP->fx_addsy != NULL)
1332     /* Partially resolved expression.  */
1333     {
1334       fixP->fx_addnumber = fixP->fx_offset;
1335       fixP->fx_done = 0;
1336
1337       switch (fixP->fx_r_type)
1338         {
1339         case BFD_RELOC_NIOS2_TLS_GD16:
1340         case BFD_RELOC_NIOS2_TLS_LDM16:
1341         case BFD_RELOC_NIOS2_TLS_LDO16:
1342         case BFD_RELOC_NIOS2_TLS_IE16:
1343         case BFD_RELOC_NIOS2_TLS_LE16:
1344         case BFD_RELOC_NIOS2_TLS_DTPMOD:
1345         case BFD_RELOC_NIOS2_TLS_DTPREL:
1346         case BFD_RELOC_NIOS2_TLS_TPREL:
1347           S_SET_THREAD_LOCAL (fixP->fx_addsy);
1348           break;
1349         default:
1350           break;
1351         }
1352     }
1353   else
1354     /* Fully resolved fixup.  */
1355     {
1356       reloc_howto_type *howto
1357         = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
1358
1359       if (howto == NULL)
1360         as_bad_where (fixP->fx_file, fixP->fx_line,
1361                       _("relocation is not supported"));
1362       else
1363         {
1364           valueT fixup = *valP;
1365           valueT value;
1366           char *buf;
1367
1368           /* If this is a pc-relative relocation, we need to
1369              subtract the current offset within the object file
1370              FIXME : for some reason fixP->fx_pcrel isn't 1 when it should be
1371              so I'm using the howto structure instead to determine this.  */
1372           if (howto->pc_relative == 1)
1373             {
1374               fixup = (fixup - (fixP->fx_frag->fr_address + fixP->fx_where
1375                                 + fixP->fx_size));
1376               *valP = fixup;
1377             }
1378
1379           /* Get the instruction or data to be fixed up.  */
1380           buf = fixP->fx_frag->fr_literal + fixP->fx_where;
1381           value = md_chars_to_number (buf, fixP->fx_size);
1382
1383           /* Check for overflow, emitting a diagnostic if necessary.  */
1384           if (nios2_check_overflow (fixup, howto))
1385             nios2_diagnose_overflow (fixup, howto, fixP, value);
1386
1387           /* Apply the right shift.  */
1388           fixup = ((signed)fixup) >> howto->rightshift;
1389
1390           /* Truncate the fixup to right size.  */
1391           switch (fixP->fx_r_type)
1392             {
1393             case BFD_RELOC_NIOS2_HI16:
1394               fixup = (fixup >> 16) & 0xFFFF;
1395               break;
1396             case BFD_RELOC_NIOS2_LO16:
1397               fixup = fixup & 0xFFFF;
1398               break;
1399             case BFD_RELOC_NIOS2_HIADJ16:
1400               fixup = ((((fixup >> 16) & 0xFFFF) + ((fixup >> 15) & 0x01))
1401                        & 0xFFFF);
1402               break;
1403             default:
1404               {
1405                 int n = sizeof (fixup) * 8 - howto->bitsize;
1406                 fixup = (fixup << n) >> n;
1407                 break;
1408               }
1409             }
1410
1411           /* Fix up the instruction.  */
1412           value = (value & ~howto->dst_mask) | (fixup << howto->bitpos);
1413           md_number_to_chars (buf, value, fixP->fx_size);
1414         }
1415
1416       fixP->fx_done = 1;
1417     }
1418
1419   if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT)
1420     {
1421       fixP->fx_done = 0;
1422       if (fixP->fx_addsy
1423           && !S_IS_DEFINED (fixP->fx_addsy) && !S_IS_WEAK (fixP->fx_addsy))
1424         S_SET_WEAK (fixP->fx_addsy);
1425     }
1426   else if (fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1427     fixP->fx_done = 0;
1428 }
1429
1430
1431 \f
1432 /** Instruction parsing support. */
1433
1434 /* General internal error routine.  */
1435
1436 static void
1437 bad_opcode (const struct nios2_opcode *op)
1438 {
1439   fprintf (stderr, _("internal error: broken opcode descriptor for `%s %s'\n"),
1440            op->name, op->args);
1441   as_fatal (_("Broken assembler.  No assembly attempted."));
1442 }
1443
1444 /* Special relocation directive strings.  */
1445
1446 struct nios2_special_relocS
1447 {
1448   const char *string;
1449   bfd_reloc_code_real_type reloc_type;
1450 };
1451
1452 /* This table is sorted so that prefix strings are listed after the longer
1453    strings that include them -- e.g., %got after %got_hiadj, etc.  */
1454
1455 struct nios2_special_relocS nios2_special_reloc[] = {
1456   {"%hiadj", BFD_RELOC_NIOS2_HIADJ16},
1457   {"%hi", BFD_RELOC_NIOS2_HI16},
1458   {"%lo", BFD_RELOC_NIOS2_LO16},
1459   {"%gprel", BFD_RELOC_NIOS2_GPREL},
1460   {"%call_lo", BFD_RELOC_NIOS2_CALL_LO},
1461   {"%call_hiadj", BFD_RELOC_NIOS2_CALL_HA},
1462   {"%call", BFD_RELOC_NIOS2_CALL16},
1463   {"%gotoff_lo", BFD_RELOC_NIOS2_GOTOFF_LO},
1464   {"%gotoff_hiadj", BFD_RELOC_NIOS2_GOTOFF_HA},
1465   {"%gotoff", BFD_RELOC_NIOS2_GOTOFF},
1466   {"%got_hiadj", BFD_RELOC_NIOS2_GOT_HA},
1467   {"%got_lo", BFD_RELOC_NIOS2_GOT_LO},
1468   {"%got", BFD_RELOC_NIOS2_GOT16},
1469   {"%tls_gd", BFD_RELOC_NIOS2_TLS_GD16},
1470   {"%tls_ldm", BFD_RELOC_NIOS2_TLS_LDM16},
1471   {"%tls_ldo", BFD_RELOC_NIOS2_TLS_LDO16},
1472   {"%tls_ie", BFD_RELOC_NIOS2_TLS_IE16},
1473   {"%tls_le", BFD_RELOC_NIOS2_TLS_LE16},
1474 };
1475
1476 #define NIOS2_NUM_SPECIAL_RELOCS \
1477         (sizeof(nios2_special_reloc)/sizeof(nios2_special_reloc[0]))
1478 const int nios2_num_special_relocs = NIOS2_NUM_SPECIAL_RELOCS;
1479
1480 /* Creates a new nios2_insn_relocS and returns a pointer to it.  */
1481 static nios2_insn_relocS *
1482 nios2_insn_reloc_new (bfd_reloc_code_real_type reloc_type, unsigned int pcrel)
1483 {
1484   nios2_insn_relocS *retval;
1485   retval = (nios2_insn_relocS *) malloc (sizeof (nios2_insn_relocS));
1486   if (retval == NULL)
1487     {
1488       as_bad (_("can't create relocation"));
1489       abort ();
1490     }
1491
1492   /* Fill out the fields with default values.  */
1493   retval->reloc_next = NULL;
1494   retval->reloc_type = reloc_type;
1495   retval->reloc_pcrel = pcrel;
1496   return retval;
1497 }
1498
1499 /* Frees up memory previously allocated by nios2_insn_reloc_new().  */
1500 /* FIXME:  this is never called; memory leak?  */
1501 #if 0
1502 static void
1503 nios2_insn_reloc_destroy (nios2_insn_relocS *reloc)
1504 {
1505   gas_assert (reloc != NULL);
1506   free (reloc);
1507 }
1508 #endif
1509
1510 /* Look up a register name and validate it for the given regtype.
1511    Return the register mapping or NULL on failure.  */
1512 static struct nios2_reg *
1513 nios2_parse_reg (const char *token, unsigned long regtype)
1514 {
1515   struct nios2_reg *reg = nios2_reg_lookup (token);
1516
1517   if (reg == NULL)
1518     {
1519       as_bad (_("unknown register %s"), token);
1520       return NULL;
1521     }
1522
1523   /* Matched a register, but is it the wrong type?  */
1524   if (!(regtype & reg->regtype))
1525     {
1526       if (regtype & REG_CONTROL)
1527         as_bad (_("expecting control register"));
1528       else if (reg->regtype & REG_CONTROL)
1529         as_bad (_("illegal use of control register"));
1530       else if (reg->regtype & REG_COPROCESSOR)
1531         as_bad (_("illegal use of coprocessor register"));
1532       else
1533         as_bad (_("invalid register %s"), token);
1534       return NULL;
1535     }
1536
1537   /* Warn for explicit use of special registers.  */
1538   if (reg->regtype & REG_NORMAL)
1539     {
1540       if (!nios2_as_options.noat && reg->index == 1)
1541         as_warn (_("Register at (r1) can sometimes be corrupted by "
1542                    "assembler optimizations.\n"
1543                    "Use .set noat to turn off those optimizations "
1544                    "(and this warning)."));
1545       if (!nios2_as_options.nobreak && reg->index == 25)
1546         as_warn (_("The debugger will corrupt bt (r25).\n"
1547                    "If you don't need to debug this "
1548                    "code use .set nobreak to turn off this warning."));
1549       if (!nios2_as_options.nobreak && reg->index == 30)
1550         as_warn (_("The debugger will corrupt sstatus/ba (r30).\n"
1551                    "If you don't need to debug this "
1552                    "code use .set nobreak to turn off this warning."));
1553     }
1554
1555   return reg;
1556 }
1557
1558 /* This function parses a reglist for ldwm/stwm and push.n/pop.n
1559    instructions, given as a brace-enclosed register list.  The tokenizer
1560    has replaced commas in the token with spaces.
1561    The return value is a bitmask of registers in the set.  It also
1562    sets nios2_reglist_mask and nios2_reglist_dir to allow error checking
1563    when parsing the base register.  */
1564
1565 static unsigned long nios2_reglist_mask;
1566 static int nios2_reglist_dir;
1567
1568 static unsigned long
1569 nios2_parse_reglist (char *token, const struct nios2_opcode *op)
1570 {
1571   unsigned long mask = 0;
1572   int dir = 0;
1573   unsigned long regtype = 0;
1574   int last = -1;
1575   const char *regname;
1576
1577   nios2_reglist_mask = 0;
1578   nios2_reglist_dir = 0;
1579
1580   if (op->match == MATCH_R2_LDWM || op->match == MATCH_R2_STWM)
1581     {
1582       regtype = REG_LDWM;
1583       dir = 0;
1584     }
1585   else if (op->match == MATCH_R2_PUSH_N)
1586     {
1587       regtype = REG_POP;
1588       dir = -1;
1589     }
1590   else if (op->match == MATCH_R2_POP_N)
1591     {
1592       regtype = REG_POP;
1593       dir = 1;
1594     }
1595   else
1596     bad_opcode (op);
1597
1598   for (regname = strtok (token, "{ }");
1599        regname;
1600        regname = strtok (NULL, "{ }"))
1601     {
1602       int regno;
1603       struct nios2_reg *reg = nios2_parse_reg (regname, regtype);
1604
1605       if (!reg)
1606         break;
1607       regno = reg->index;
1608
1609       /* Make sure registers are listed in proper sequence.  */
1610       if (last >= 0)
1611         {
1612           if (regno == last)
1613             {
1614               as_bad ("duplicate register %s\n", reg->name);
1615               return 0;
1616             }
1617           else if (dir == 0)
1618             dir = (regno < last ? -1 : 1);
1619           else if ((dir > 0 && regno < last)
1620                    || (dir < 0 && regno > last)
1621                    || (op->match == MATCH_R2_PUSH_N
1622                        && ! ((last == 31 && regno == 28)
1623                              || (last == 31 && regno <= 23)
1624                              || (last == 28 && regno <= 23)
1625                              || (regno < 23 && regno == last - 1)))
1626                    || (op->match == MATCH_R2_POP_N
1627                        && ! ((regno == 31 && last == 28)
1628                              || (regno == 31 && last <= 23)
1629                              || (regno == 28 && last <= 23)
1630                              || (last < 23 && last == regno - 1))))
1631             {
1632               as_bad ("invalid register order");
1633               return 0;
1634             }
1635         }
1636
1637       mask |= 1 << regno;
1638       last = regno;
1639     }
1640
1641   /* Check that all ldwm/stwm regs belong to the same set.  */
1642   if ((op->match == MATCH_R2_LDWM || op->match == MATCH_R2_STWM)
1643       && (mask & 0x00003ffc) && (mask & 0x90ffc000))
1644     {
1645       as_bad ("invalid register set in reglist");
1646       return 0;
1647     }
1648
1649   /* Check that push.n/pop.n regs include RA.  */
1650   if ((op->match == MATCH_R2_PUSH_N || op->match == MATCH_R2_POP_N)
1651       && ((mask & 0x80000000) == 0))
1652     {
1653       as_bad ("reglist must include ra (r31)");
1654       return 0;
1655     }
1656
1657   /* Check that there is at least one register in the set.  */
1658   if (!mask)
1659     {
1660       as_bad ("reglist must include at least one register");
1661       return 0;
1662     }
1663
1664   /* OK, reglist passed validation.  */
1665   nios2_reglist_mask = mask;
1666   nios2_reglist_dir = dir;
1667   return mask;
1668 }
1669
1670 /* This function parses the base register and options used by the ldwm/stwm
1671    instructions.  Returns the base register and sets the option arguments
1672    accordingly.  On failure, returns NULL.  */
1673 static struct nios2_reg *
1674 nios2_parse_base_register (char *str, int *direction, int *writeback, int *ret)
1675 {
1676   char *regname;
1677   struct nios2_reg *reg;
1678
1679   *direction = 0;
1680   *writeback = 0;
1681   *ret = 0;
1682
1683   /* Check for --.  */
1684   if (strncmp (str, "--", 2) == 0)
1685     {
1686       str += 2;
1687       *direction -= 1;
1688     }
1689
1690   /* Extract the base register.  */
1691   if (*str != '(')
1692     {
1693       as_bad ("expected '(' before base register");
1694       return NULL;
1695     }
1696   str++;
1697   regname = str;
1698   str = strchr (str, ')');
1699   if (!str)
1700     {
1701       as_bad ("expected ')' after base register");
1702       return NULL;
1703     }
1704   *str = '\0';
1705   str++;
1706   reg = nios2_parse_reg (regname, REG_NORMAL);
1707   if (reg == NULL)
1708     return NULL;
1709
1710   /* Check for ++.  */
1711   if (strncmp (str, "++", 2) == 0)
1712     {
1713       str += 2;
1714       *direction += 1;
1715     }
1716
1717   /* Ensure that either -- or ++ is specified, but not both.  */
1718   if (*direction == 0)
1719     {
1720       as_bad ("invalid base register syntax");
1721       return NULL;;
1722     }
1723
1724   /* Check for options.  The tokenizer has replaced commas with spaces.  */
1725   while (*str)
1726     {
1727       while (*str == ' ')
1728         str++;
1729       if (strncmp (str, "writeback", 9) == 0)
1730         {
1731           *writeback = 1;
1732           str += 9;
1733         }
1734       else if (strncmp (str, "ret", 3) == 0)
1735         {
1736           *ret = 1;
1737           str += 3;
1738         }
1739       else if (*str)
1740         {
1741           as_bad ("invalid option syntax");
1742           return NULL;
1743         }
1744     }
1745
1746   return reg;
1747 }
1748
1749
1750 /* The various nios2_assemble_* functions call this
1751    function to generate an expression from a string representing an expression.
1752    It then tries to evaluate the expression, and if it can, returns its value.
1753    If not, it creates a new nios2_insn_relocS and stores the expression and
1754    reloc_type for future use.  */
1755 static unsigned long
1756 nios2_assemble_expression (const char *exprstr,
1757                            nios2_insn_infoS *insn,
1758                            bfd_reloc_code_real_type orig_reloc_type,
1759                            unsigned int pcrel)
1760 {
1761   nios2_insn_relocS *reloc;
1762   char *saved_line_ptr;
1763   unsigned long value = 0;
1764   int i;
1765   bfd_reloc_code_real_type reloc_type = orig_reloc_type;
1766
1767   gas_assert (exprstr != NULL);
1768   gas_assert (insn != NULL);
1769
1770   /* Check for relocation operators.
1771      Change the relocation type and advance the ptr to the start of
1772      the expression proper. */
1773   for (i = 0; i < nios2_num_special_relocs; i++)
1774     if (strstr (exprstr, nios2_special_reloc[i].string) != NULL)
1775       {
1776         reloc_type = nios2_special_reloc[i].reloc_type;
1777         exprstr += strlen (nios2_special_reloc[i].string) + 1;
1778
1779         /* %lo and %hiadj have different meanings for PC-relative
1780            expressions.  */
1781         if (pcrel)
1782           {
1783             if (reloc_type == BFD_RELOC_NIOS2_LO16)
1784               reloc_type = BFD_RELOC_NIOS2_PCREL_LO;
1785             if (reloc_type == BFD_RELOC_NIOS2_HIADJ16)
1786               reloc_type = BFD_RELOC_NIOS2_PCREL_HA;
1787           }
1788
1789         break;
1790       }
1791
1792   /* No relocation allowed; we must have a constant expression.  */
1793   if (orig_reloc_type == BFD_RELOC_NONE)
1794     {
1795       expressionS exp;
1796
1797       /* Parse the expression string.  */
1798       saved_line_ptr = input_line_pointer;
1799       input_line_pointer = (char *) exprstr;
1800       expression (&exp);
1801       input_line_pointer = saved_line_ptr;
1802
1803       /* If we don't have a constant, give an error.  */
1804       if (reloc_type != orig_reloc_type || exp.X_op != O_constant)
1805         as_bad (_("expression must be constant"));
1806       else
1807         value = exp.X_add_number;
1808       return (unsigned long) value;
1809     }
1810
1811   /* We potentially have a relocation.  */
1812   reloc = nios2_insn_reloc_new (reloc_type, pcrel);
1813   reloc->reloc_next = insn->insn_reloc;
1814   insn->insn_reloc = reloc;
1815
1816   /* Parse the expression string.  */
1817   saved_line_ptr = input_line_pointer;
1818   input_line_pointer = (char *) exprstr;
1819   expression (&reloc->reloc_expression);
1820   input_line_pointer = saved_line_ptr;
1821
1822   /* This is redundant as the fixup will put this into
1823      the instruction, but it is included here so that
1824      self-test mode (-r) works.  */
1825   if (nios2_mode == NIOS2_MODE_TEST
1826       && reloc->reloc_expression.X_op == O_constant)
1827     value = reloc->reloc_expression.X_add_number;
1828
1829   return (unsigned long) value;
1830 }
1831
1832 /* Encode a 3-bit register number, giving an error if this is not possible.  */
1833 static unsigned int
1834 nios2_assemble_reg3 (const char *token)
1835 {
1836   struct nios2_reg *reg = nios2_parse_reg (token, REG_3BIT);
1837   int j;
1838
1839   if (reg == NULL)
1840     return 0;
1841
1842   for (j = 0; j < nios2_num_r2_reg3_mappings; j++)
1843     if (nios2_r2_reg3_mappings[j] == reg->index)
1844       return j;
1845
1846   /* Should never get here if we passed validation.  */
1847   as_bad (_("invalid register %s"), token);
1848   return 0;
1849 }
1850
1851 /* Argument assemble functions.  */
1852
1853
1854 /* Control register index.  */
1855 static void
1856 nios2_assemble_arg_c (const char *token, nios2_insn_infoS *insn)
1857 {
1858   struct nios2_reg *reg = nios2_parse_reg (token, REG_CONTROL);
1859   const struct nios2_opcode *op = insn->insn_nios2_opcode;
1860
1861   if (reg == NULL)
1862     return;
1863
1864   switch (op->format)
1865     {
1866     case iw_r_type:
1867       insn->insn_code |= SET_IW_R_IMM5 (reg->index);
1868       break;
1869     case iw_F3X6L5_type:
1870       insn->insn_code |= SET_IW_F3X6L5_IMM5 (reg->index);
1871       break;
1872     default:
1873       bad_opcode (op);
1874     }
1875 }
1876
1877 /* Destination register.  */
1878 static void
1879 nios2_assemble_arg_d (const char *token, nios2_insn_infoS *insn)
1880 {
1881   const struct nios2_opcode *op = insn->insn_nios2_opcode;
1882   unsigned long regtype = REG_NORMAL;
1883   struct nios2_reg *reg;
1884
1885   if (op->format == iw_custom_type || op->format == iw_F3X8_type)
1886     regtype |= REG_COPROCESSOR;
1887   reg = nios2_parse_reg (token, regtype);
1888   if (reg == NULL)
1889     return;
1890
1891   switch (op->format)
1892     {
1893     case iw_r_type:
1894       insn->insn_code |= SET_IW_R_C (reg->index);
1895       break;
1896     case iw_custom_type:
1897       insn->insn_code |= SET_IW_CUSTOM_C (reg->index);
1898       if (reg->regtype & REG_COPROCESSOR)
1899         insn->insn_code |= SET_IW_CUSTOM_READC (0);
1900       else
1901         insn->insn_code |= SET_IW_CUSTOM_READC (1);
1902       break;
1903     case iw_F3X6L5_type:
1904     case iw_F3X6_type:
1905       insn->insn_code |= SET_IW_F3X6L5_C (reg->index);
1906       break;
1907     case iw_F3X8_type:
1908       insn->insn_code |= SET_IW_F3X8_C (reg->index);
1909       if (reg->regtype & REG_COPROCESSOR)
1910         insn->insn_code |= SET_IW_F3X8_READC (0);
1911       else
1912         insn->insn_code |= SET_IW_F3X8_READC (1);
1913       break;
1914     case iw_F2_type:
1915       insn->insn_code |= SET_IW_F2_B (reg->index);
1916       break;
1917     default:
1918       bad_opcode (op);
1919     }
1920 }
1921
1922 /* Source register 1.  */
1923 static void
1924 nios2_assemble_arg_s (const char *token, nios2_insn_infoS *insn)
1925 {
1926   const struct nios2_opcode *op = insn->insn_nios2_opcode;
1927   unsigned long regtype = REG_NORMAL;
1928   struct nios2_reg *reg;
1929
1930   if (op->format == iw_custom_type || op->format == iw_F3X8_type)
1931     regtype |= REG_COPROCESSOR;
1932   reg = nios2_parse_reg (token, regtype);
1933   if (reg == NULL)
1934     return;
1935
1936   switch (op->format)
1937     {
1938     case iw_r_type:
1939       if (op->match == MATCH_R1_JMP && reg->index == 31)
1940         as_bad (_("r31 cannot be used with jmp; use ret instead"));
1941       insn->insn_code |= SET_IW_R_A (reg->index);
1942       break;
1943     case iw_i_type:
1944       insn->insn_code |= SET_IW_I_A (reg->index);
1945       break;
1946     case iw_custom_type:
1947       insn->insn_code |= SET_IW_CUSTOM_A (reg->index);
1948       if (reg->regtype & REG_COPROCESSOR)
1949         insn->insn_code |= SET_IW_CUSTOM_READA (0);
1950       else
1951         insn->insn_code |= SET_IW_CUSTOM_READA (1);
1952       break;
1953     case iw_F2I16_type:
1954       insn->insn_code |= SET_IW_F2I16_A (reg->index);
1955       break;
1956     case iw_F2X4I12_type:
1957       insn->insn_code |= SET_IW_F2X4I12_A (reg->index);
1958       break;
1959     case iw_F1X4I12_type:
1960       insn->insn_code |= SET_IW_F1X4I12_A (reg->index);
1961       break;
1962     case iw_F1X4L17_type:
1963       insn->insn_code |= SET_IW_F1X4L17_A (reg->index);
1964       break;
1965     case iw_F3X6L5_type:
1966     case iw_F3X6_type:
1967       if (op->match == MATCH_R2_JMP && reg->index == 31)
1968         as_bad (_("r31 cannot be used with jmp; use ret instead"));
1969       insn->insn_code |= SET_IW_F3X6L5_A (reg->index);
1970       break;
1971     case iw_F2X6L10_type:
1972       insn->insn_code |= SET_IW_F2X6L10_A (reg->index);
1973       break;
1974     case iw_F3X8_type:
1975       insn->insn_code |= SET_IW_F3X8_A (reg->index);
1976       if (reg->regtype & REG_COPROCESSOR)
1977         insn->insn_code |= SET_IW_F3X8_READA (0);
1978       else
1979         insn->insn_code |= SET_IW_F3X8_READA (1);
1980       break;
1981     case iw_F1X1_type:
1982       if (op->match == MATCH_R2_JMPR_N && reg->index == 31)
1983         as_bad (_("r31 cannot be used with jmpr.n; use ret.n instead"));
1984       insn->insn_code |= SET_IW_F1X1_A (reg->index);
1985       break;
1986     case iw_F1I5_type:
1987       /* Implicit stack pointer reference.  */
1988       if (reg->index != 27)
1989         as_bad (_("invalid register %s"), token);
1990       break;
1991     case iw_F2_type:
1992       insn->insn_code |= SET_IW_F2_A (reg->index);
1993       break;
1994     default:
1995       bad_opcode (op);
1996     }
1997 }
1998
1999 /* Source register 2.  */
2000 static void
2001 nios2_assemble_arg_t (const char *token, nios2_insn_infoS *insn)
2002 {
2003   const struct nios2_opcode *op = insn->insn_nios2_opcode;
2004   unsigned long regtype = REG_NORMAL;
2005   struct nios2_reg *reg;
2006
2007   if (op->format == iw_custom_type || op->format == iw_F3X8_type)
2008     regtype |= REG_COPROCESSOR;
2009   reg = nios2_parse_reg (token, regtype);
2010   if (reg == NULL)
2011     return;
2012
2013   switch (op->format)
2014     {
2015     case iw_r_type:
2016       insn->insn_code |= SET_IW_R_B (reg->index);
2017       break;
2018     case iw_i_type:
2019       insn->insn_code |= SET_IW_I_B (reg->index);
2020       break;
2021     case iw_custom_type:
2022       insn->insn_code |= SET_IW_CUSTOM_B (reg->index);
2023       if (reg->regtype & REG_COPROCESSOR)
2024         insn->insn_code |= SET_IW_CUSTOM_READB (0);
2025       else
2026         insn->insn_code |= SET_IW_CUSTOM_READB (1);
2027       break;
2028     case iw_F2I16_type:
2029       insn->insn_code |= SET_IW_F2I16_B (reg->index);
2030       break;
2031     case iw_F2X4I12_type:
2032       insn->insn_code |= SET_IW_F2X4I12_B (reg->index);
2033       break;
2034     case iw_F3X6L5_type:
2035     case iw_F3X6_type:
2036       insn->insn_code |= SET_IW_F3X6L5_B (reg->index);
2037       break;
2038     case iw_F2X6L10_type:
2039       insn->insn_code |= SET_IW_F2X6L10_B (reg->index);
2040       break;
2041     case iw_F3X8_type:
2042       insn->insn_code |= SET_IW_F3X8_B (reg->index);
2043       if (reg->regtype & REG_COPROCESSOR)
2044         insn->insn_code |= SET_IW_F3X8_READB (0);
2045       else
2046         insn->insn_code |= SET_IW_F3X8_READB (1);
2047       break;
2048     case iw_F1I5_type:
2049       insn->insn_code |= SET_IW_F1I5_B (reg->index);
2050       break;
2051     case iw_F2_type:
2052       insn->insn_code |= SET_IW_F2_B (reg->index);
2053       break;
2054     case iw_T1X1I6_type:
2055       /* Implicit zero register reference.  */
2056       if (reg->index != 0)
2057         as_bad (_("invalid register %s"), token);
2058       break;
2059
2060     default:
2061       bad_opcode (op);
2062     }
2063 }
2064
2065 /* Destination register w/3-bit encoding.  */
2066 static void
2067 nios2_assemble_arg_D (const char *token, nios2_insn_infoS *insn)
2068 {
2069   const struct nios2_opcode *op = insn->insn_nios2_opcode;
2070   int reg = nios2_assemble_reg3 (token);
2071
2072   switch (op->format)
2073     {
2074     case iw_T1I7_type:
2075       insn->insn_code |= SET_IW_T1I7_A3 (reg);
2076       break;
2077     case iw_T2X1L3_type:
2078       insn->insn_code |= SET_IW_T2X1L3_B3 (reg);
2079       break;
2080     case iw_T2X1I3_type:
2081       insn->insn_code |= SET_IW_T2X1I3_B3 (reg);
2082       break;
2083     case iw_T3X1_type:
2084       insn->insn_code |= SET_IW_T3X1_C3 (reg);
2085       break;
2086     case iw_T2X3_type:
2087       /* Some instructions using this encoding take 3 register arguments,
2088          requiring the destination register to be the same as the first
2089          source register.  */
2090       if (op->num_args == 3)
2091         insn->insn_code |= SET_IW_T2X3_A3 (reg);
2092       else
2093         insn->insn_code |= SET_IW_T2X3_B3 (reg);
2094       break;
2095     default:
2096       bad_opcode (op);
2097     }
2098 }
2099
2100 /* Source register w/3-bit encoding.  */
2101 static void
2102 nios2_assemble_arg_S (const char *token, nios2_insn_infoS *insn)
2103 {
2104   const struct nios2_opcode *op = insn->insn_nios2_opcode;
2105   int reg = nios2_assemble_reg3 (token);
2106
2107   switch (op->format)
2108     {
2109     case iw_T1I7_type:
2110       insn->insn_code |= SET_IW_T1I7_A3 (reg);
2111       break;
2112     case iw_T2I4_type:
2113       insn->insn_code |= SET_IW_T2I4_A3 (reg);
2114       break;
2115     case iw_T2X1L3_type:
2116       insn->insn_code |= SET_IW_T2X1L3_A3 (reg);
2117       break;
2118     case iw_T2X1I3_type:
2119       insn->insn_code |= SET_IW_T2X1I3_A3 (reg);
2120       break;
2121     case iw_T3X1_type:
2122       insn->insn_code |= SET_IW_T3X1_A3 (reg);
2123       break;
2124     case iw_T2X3_type:
2125       /* Some instructions using this encoding take 3 register arguments,
2126          requiring the destination register to be the same as the first
2127          source register.  */
2128       if (op->num_args == 3)
2129         {
2130           int dreg = GET_IW_T2X3_A3 (insn->insn_code);
2131           if (dreg != reg)
2132             as_bad ("source and destination registers must be the same");
2133         }
2134       else
2135         insn->insn_code |= SET_IW_T2X3_A3 (reg);
2136       break;
2137     case iw_T1X1I6_type:
2138       insn->insn_code |= SET_IW_T1X1I6_A3 (reg);
2139       break;
2140     default:
2141       bad_opcode (op);
2142     }
2143 }
2144
2145 /* Source register 2 w/3-bit encoding.  */
2146 static void
2147 nios2_assemble_arg_T (const char *token, nios2_insn_infoS *insn)
2148 {
2149   const struct nios2_opcode *op = insn->insn_nios2_opcode;
2150   int reg = nios2_assemble_reg3 (token);
2151
2152   switch (op->format)
2153     {
2154     case iw_T2I4_type:
2155       insn->insn_code |= SET_IW_T2I4_B3 (reg);
2156       break;
2157     case iw_T3X1_type:
2158       insn->insn_code |= SET_IW_T3X1_B3 (reg);
2159       break;
2160     case iw_T2X3_type:
2161       insn->insn_code |= SET_IW_T2X3_B3 (reg);
2162       break;
2163     default:
2164       bad_opcode (op);
2165     }
2166 }
2167
2168 /* 16-bit signed immediate.  */
2169 static void
2170 nios2_assemble_arg_i (const char *token, nios2_insn_infoS *insn)
2171 {
2172   const struct nios2_opcode *op = insn->insn_nios2_opcode;
2173   unsigned int val;
2174
2175   switch (op->format)
2176     {
2177     case iw_i_type:
2178       val = nios2_assemble_expression (token, insn,
2179                                        BFD_RELOC_NIOS2_S16, 0);
2180       insn->constant_bits |= SET_IW_I_IMM16 (val);
2181       break;
2182     case iw_F2I16_type:
2183       val = nios2_assemble_expression (token, insn,
2184                                        BFD_RELOC_NIOS2_S16, 0);
2185       insn->constant_bits |= SET_IW_F2I16_IMM16 (val);
2186       break;
2187     default:
2188       bad_opcode (op);
2189     }
2190 }
2191
2192 /* 12-bit signed immediate.  */
2193 static void
2194 nios2_assemble_arg_I (const char *token, nios2_insn_infoS *insn)
2195 {
2196   const struct nios2_opcode *op = insn->insn_nios2_opcode;
2197   unsigned int val;
2198
2199   switch (op->format)
2200     {
2201     case iw_F2X4I12_type:
2202       val = nios2_assemble_expression (token, insn,
2203                                        BFD_RELOC_NIOS2_R2_S12, 0);
2204       insn->constant_bits |= SET_IW_F2X4I12_IMM12 (val);
2205       break;
2206     case iw_F1X4I12_type:
2207       val = nios2_assemble_expression (token, insn,
2208                                        BFD_RELOC_NIOS2_R2_S12, 0);
2209       insn->constant_bits |= SET_IW_F2X4I12_IMM12 (val);
2210       break;
2211     default:
2212       bad_opcode (op);
2213     }
2214 }
2215
2216 /* 16-bit unsigned immediate.  */
2217 static void
2218 nios2_assemble_arg_u (const char *token, nios2_insn_infoS *insn)
2219 {
2220   const struct nios2_opcode *op = insn->insn_nios2_opcode;
2221   unsigned int val;
2222
2223   switch (op->format)
2224     {
2225     case iw_i_type:
2226       val = nios2_assemble_expression (token, insn,
2227                                        BFD_RELOC_NIOS2_U16, 0);
2228       insn->constant_bits |= SET_IW_I_IMM16 (val);
2229       break;
2230     case iw_F2I16_type:
2231       val = nios2_assemble_expression (token, insn,
2232                                        BFD_RELOC_NIOS2_U16, 0);
2233       insn->constant_bits |= SET_IW_F2I16_IMM16 (val);
2234       break;
2235     default:
2236       bad_opcode (op);
2237     }
2238 }
2239
2240 /* 7-bit unsigned immediate with 2-bit shift.  */
2241 static void
2242 nios2_assemble_arg_U (const char *token, nios2_insn_infoS *insn)
2243 {
2244   const struct nios2_opcode *op = insn->insn_nios2_opcode;
2245   unsigned int val;
2246
2247   switch (op->format)
2248     {
2249     case iw_T1I7_type:
2250       val = nios2_assemble_expression (token, insn,
2251                                        BFD_RELOC_NIOS2_R2_T1I7_2, 0);
2252       insn->constant_bits |= SET_IW_T1I7_IMM7 (val >> 2);
2253       break;
2254     case iw_X1I7_type:
2255       val = nios2_assemble_expression (token, insn,
2256                                        BFD_RELOC_NIOS2_R2_X1I7_2, 0);
2257       insn->constant_bits |= SET_IW_X1I7_IMM7 (val >> 2);
2258       break;
2259     default:
2260       bad_opcode (op);
2261     }
2262 }
2263
2264 /* 5-bit unsigned immediate with 2-bit shift.  */
2265 static void
2266 nios2_assemble_arg_V (const char *token, nios2_insn_infoS *insn)
2267 {
2268   const struct nios2_opcode *op = insn->insn_nios2_opcode;
2269   unsigned int val;
2270
2271   switch (op->format)
2272     {
2273     case iw_F1I5_type:
2274       val = nios2_assemble_expression (token, insn,
2275                                        BFD_RELOC_NIOS2_R2_F1I5_2, 0);
2276       insn->constant_bits |= SET_IW_F1I5_IMM5 (val >> 2);
2277       break;
2278     default:
2279       bad_opcode (op);
2280     }
2281 }
2282
2283 /* 4-bit unsigned immediate with 2-bit shift.  */
2284 static void
2285 nios2_assemble_arg_W (const char *token, nios2_insn_infoS *insn)
2286 {
2287   const struct nios2_opcode *op = insn->insn_nios2_opcode;
2288   unsigned int val;
2289
2290   switch (op->format)
2291     {
2292     case iw_T2I4_type:
2293       val = nios2_assemble_expression (token, insn,
2294                                        BFD_RELOC_NIOS2_R2_T2I4_2, 0);
2295       insn->constant_bits |= SET_IW_T2I4_IMM4 (val >> 2);
2296       break;
2297     case iw_L5I4X1_type:
2298       /* This argument is optional for push.n/pop.n, and defaults to
2299          zero if unspecified.  */
2300       if (token == NULL)
2301         return;
2302
2303       val = nios2_assemble_expression (token, insn,
2304                                        BFD_RELOC_NIOS2_R2_L5I4X1, 0);
2305       insn->constant_bits |= SET_IW_L5I4X1_IMM4 (val >> 2);
2306       break;
2307     default:
2308       bad_opcode (op);
2309     }
2310 }
2311
2312 /* 4-bit unsigned immediate with 1-bit shift.  */
2313 static void
2314 nios2_assemble_arg_X (const char *token, nios2_insn_infoS *insn)
2315 {
2316   const struct nios2_opcode *op = insn->insn_nios2_opcode;
2317   unsigned int val;
2318
2319   switch (op->format)
2320     {
2321     case iw_T2I4_type:
2322       val = nios2_assemble_expression (token, insn,
2323                                        BFD_RELOC_NIOS2_R2_T2I4_1, 0);
2324       insn->constant_bits |= SET_IW_T2I4_IMM4 (val >> 1);
2325       break;
2326     default:
2327       bad_opcode (op);
2328     }
2329 }
2330
2331 /* 4-bit unsigned immediate without shift.  */
2332 static void
2333 nios2_assemble_arg_Y (const char *token, nios2_insn_infoS *insn)
2334 {
2335   const struct nios2_opcode *op = insn->insn_nios2_opcode;
2336   unsigned int val;
2337
2338   switch (op->format)
2339     {
2340     case iw_T2I4_type:
2341       val = nios2_assemble_expression (token, insn,
2342                                        BFD_RELOC_NIOS2_R2_T2I4, 0);
2343       insn->constant_bits |= SET_IW_T2I4_IMM4 (val);
2344       break;
2345     default:
2346       bad_opcode (op);
2347     }
2348 }
2349
2350
2351 /* 16-bit signed immediate address offset.  */
2352 static void
2353 nios2_assemble_arg_o (const char *token, nios2_insn_infoS *insn)
2354 {
2355   const struct nios2_opcode *op = insn->insn_nios2_opcode;
2356   unsigned int val;
2357
2358   switch (op->format)
2359     {
2360     case iw_i_type:
2361       val = nios2_assemble_expression (token, insn,
2362                                        BFD_RELOC_16_PCREL, 1);
2363       insn->constant_bits |= SET_IW_I_IMM16 (val);
2364       break;
2365     case iw_F2I16_type:
2366       val = nios2_assemble_expression (token, insn,
2367                                        BFD_RELOC_16_PCREL, 1);
2368       insn->constant_bits |= SET_IW_F2I16_IMM16 (val);
2369       break;
2370     default:
2371       bad_opcode (op);
2372     }
2373 }
2374
2375 /* 10-bit signed address offset with 1-bit shift.  */
2376 static void
2377 nios2_assemble_arg_O (const char *token, nios2_insn_infoS *insn)
2378 {
2379   const struct nios2_opcode *op = insn->insn_nios2_opcode;
2380   unsigned int val;
2381
2382   switch (op->format)
2383     {
2384     case iw_I10_type:
2385       val = nios2_assemble_expression (token, insn,
2386                                        BFD_RELOC_NIOS2_R2_I10_1_PCREL, 1);
2387       insn->constant_bits |= SET_IW_I10_IMM10 (val >> 1);
2388       break;
2389     default:
2390       bad_opcode (op);
2391     }
2392 }
2393
2394 /* 7-bit signed address offset with 1-bit shift.  */
2395 static void
2396 nios2_assemble_arg_P (const char *token, nios2_insn_infoS *insn)
2397 {
2398   const struct nios2_opcode *op = insn->insn_nios2_opcode;
2399   unsigned int val;
2400
2401   switch (op->format)
2402     {
2403     case iw_T1I7_type:
2404       val = nios2_assemble_expression (token, insn,
2405                                        BFD_RELOC_NIOS2_R2_T1I7_1_PCREL, 1);
2406       insn->constant_bits |= SET_IW_T1I7_IMM7 (val >> 1);
2407       break;
2408     default:
2409       bad_opcode (op);
2410     }
2411 }
2412
2413 /* 5-bit unsigned immediate.  */
2414 static void
2415 nios2_assemble_arg_j (const char *token, nios2_insn_infoS *insn)
2416 {
2417   const struct nios2_opcode *op = insn->insn_nios2_opcode;
2418   unsigned int val;
2419
2420   switch (op->format)
2421     {
2422     case iw_r_type:
2423       val = nios2_assemble_expression (token, insn,
2424                                        BFD_RELOC_NIOS2_IMM5, 0);
2425       insn->constant_bits |= SET_IW_R_IMM5 (val);
2426       break;
2427     case iw_F3X6L5_type:
2428       if (op->match == MATCH_R2_ENI)
2429         /* Value must be constant 0 or 1.  */
2430         {
2431           val = nios2_assemble_expression (token, insn, BFD_RELOC_NONE, 0);
2432           if (val != 0 && val != 1)
2433             as_bad ("invalid eni argument %u", val);
2434           insn->insn_code |= SET_IW_F3X6L5_IMM5 (val);
2435         }
2436       else
2437         {
2438           val = nios2_assemble_expression (token, insn,
2439                                            BFD_RELOC_NIOS2_IMM5, 0);
2440           insn->constant_bits |= SET_IW_F3X6L5_IMM5 (val);
2441         }
2442       break;
2443     case iw_F2X6L10_type:
2444       /* Only constant expression without relocation permitted for
2445          bit position.  */
2446       val = nios2_assemble_expression (token, insn, BFD_RELOC_NONE, 0);
2447       if (val > 31)
2448         as_bad ("invalid bit position %u", val);
2449       insn->insn_code |= SET_IW_F2X6L10_MSB (val);
2450       break;
2451     case iw_X2L5_type:
2452       val = nios2_assemble_expression (token, insn,
2453                                        BFD_RELOC_NIOS2_R2_X2L5, 0);
2454       insn->constant_bits |= SET_IW_X2L5_IMM5 (val);
2455       break;
2456     default:
2457       bad_opcode (op);
2458     }
2459 }
2460
2461 /* Second 5-bit unsigned immediate field.  */
2462 static void
2463 nios2_assemble_arg_k (const char *token, nios2_insn_infoS *insn)
2464 {
2465   const struct nios2_opcode *op = insn->insn_nios2_opcode;
2466   unsigned int val;
2467
2468   switch (op->format)
2469     {
2470     case iw_F2X6L10_type:
2471       /* Only constant expression without relocation permitted for
2472          bit position.  */
2473       val = nios2_assemble_expression (token, insn,
2474                                        BFD_RELOC_NONE, 0);
2475       if (val > 31)
2476         as_bad ("invalid bit position %u", val);
2477       else if (GET_IW_F2X6L10_MSB (insn->insn_code) < val)
2478         as_bad ("MSB must be greater than or equal to LSB");
2479       insn->insn_code |= SET_IW_F2X6L10_LSB (val);
2480       break;
2481     default:
2482       bad_opcode (op);
2483     }
2484 }
2485
2486 /* 8-bit unsigned immediate.  */
2487 static void
2488 nios2_assemble_arg_l (const char *token, nios2_insn_infoS *insn)
2489 {
2490   const struct nios2_opcode *op = insn->insn_nios2_opcode;
2491   unsigned int val;
2492
2493   switch (op->format)
2494     {
2495     case iw_custom_type:
2496       val = nios2_assemble_expression (token, insn,
2497                                        BFD_RELOC_NIOS2_IMM8, 0);
2498       insn->constant_bits |= SET_IW_CUSTOM_N (val);
2499       break;
2500     case iw_F3X8_type:
2501       val = nios2_assemble_expression (token, insn,
2502                                        BFD_RELOC_NIOS2_IMM8, 0);
2503       insn->constant_bits |= SET_IW_F3X8_N (val);
2504       break;
2505     default:
2506       bad_opcode (op);
2507     }
2508 }
2509
2510 /* 26-bit unsigned immediate.  */
2511 static void
2512 nios2_assemble_arg_m (const char *token, nios2_insn_infoS *insn)
2513 {
2514   const struct nios2_opcode *op = insn->insn_nios2_opcode;
2515   unsigned int val;
2516
2517   switch (op->format)
2518     {
2519     case iw_j_type:
2520       val = nios2_assemble_expression (token, insn,
2521                                        (nios2_as_options.noat
2522                                         ? BFD_RELOC_NIOS2_CALL26_NOAT
2523                                         : BFD_RELOC_NIOS2_CALL26),
2524                                        0);
2525       insn->constant_bits |= SET_IW_J_IMM26 (val);
2526       break;
2527     case iw_L26_type:
2528       val = nios2_assemble_expression (token, insn,
2529                                        (nios2_as_options.noat
2530                                         ? BFD_RELOC_NIOS2_CALL26_NOAT
2531                                         : BFD_RELOC_NIOS2_CALL26),
2532                                        0);
2533       insn->constant_bits |= SET_IW_L26_IMM26 (val);
2534       break;
2535     default:
2536       bad_opcode (op);
2537     }
2538 }
2539
2540 /* 6-bit unsigned immediate with no shifting.  */
2541 static void
2542 nios2_assemble_arg_M (const char *token, nios2_insn_infoS *insn)
2543 {
2544   const struct nios2_opcode *op = insn->insn_nios2_opcode;
2545   unsigned int val;
2546
2547   switch (op->format)
2548     {
2549     case iw_T1X1I6_type:
2550       val = nios2_assemble_expression (token, insn,
2551                                        BFD_RELOC_NIOS2_R2_T1X1I6, 0);
2552       insn->constant_bits |= SET_IW_T1X1I6_IMM6 (val);
2553       break;
2554     default:
2555       bad_opcode (op);
2556     }
2557 }
2558
2559 /* 6-bit unsigned immediate with 2-bit shift.  */
2560 static void
2561 nios2_assemble_arg_N (const char *token, nios2_insn_infoS *insn)
2562 {
2563   const struct nios2_opcode *op = insn->insn_nios2_opcode;
2564   unsigned int val;
2565
2566   switch (op->format)
2567     {
2568     case iw_T1X1I6_type:
2569       val = nios2_assemble_expression (token, insn,
2570                                        BFD_RELOC_NIOS2_R2_T1X1I6_2, 0);
2571       insn->constant_bits |= SET_IW_T1X1I6_IMM6 (val >> 2);
2572       break;
2573     default:
2574       bad_opcode (op);
2575     }
2576 }
2577
2578
2579 /* Encoded enumeration for addi.n/subi.n.  */
2580 static void
2581 nios2_assemble_arg_e (const char *token, nios2_insn_infoS *insn)
2582 {
2583   const struct nios2_opcode *op = insn->insn_nios2_opcode;
2584   unsigned int val;
2585   int i;
2586
2587   switch (op->format)
2588     {
2589     case iw_T2X1I3_type:
2590       val = nios2_assemble_expression (token, insn, BFD_RELOC_NONE, 0);
2591       for (i = 0; i < nios2_num_r2_asi_n_mappings; i++)
2592         if (val == nios2_r2_asi_n_mappings[i])
2593           break;
2594       if (i == nios2_num_r2_asi_n_mappings)
2595         {
2596           as_bad (_("Invalid constant operand %s"), token);
2597           return;
2598         }
2599       insn->insn_code |= SET_IW_T2X1I3_IMM3 ((unsigned)i);
2600       break;
2601     default:
2602       bad_opcode (op);
2603     }
2604 }
2605
2606 /* Encoded enumeration for slli.n/srli.n.  */
2607 static void
2608 nios2_assemble_arg_f (const char *token, nios2_insn_infoS *insn)
2609 {
2610   const struct nios2_opcode *op = insn->insn_nios2_opcode;
2611   unsigned int val;
2612   int i;
2613
2614   switch (op->format)
2615     {
2616     case iw_T2X1L3_type:
2617       val = nios2_assemble_expression (token, insn, BFD_RELOC_NONE, 0);
2618       for (i = 0; i < nios2_num_r2_shi_n_mappings; i++)
2619         if (val == nios2_r2_shi_n_mappings[i])
2620           break;
2621       if (i == nios2_num_r2_shi_n_mappings)
2622         {
2623           as_bad (_("Invalid constant operand %s"), token);
2624           return;
2625         }
2626       insn->insn_code |= SET_IW_T2X1L3_SHAMT ((unsigned)i);
2627       break;
2628     default:
2629       bad_opcode (op);
2630     }
2631 }
2632
2633 /* Encoded enumeration for andi.n.  */
2634 static void
2635 nios2_assemble_arg_g (const char *token, nios2_insn_infoS *insn)
2636 {
2637   const struct nios2_opcode *op = insn->insn_nios2_opcode;
2638   unsigned int val;
2639   int i;
2640
2641   switch (op->format)
2642     {
2643     case iw_T2I4_type:
2644       val = nios2_assemble_expression (token, insn, BFD_RELOC_NONE, 0);
2645       for (i = 0; i < nios2_num_r2_andi_n_mappings; i++)
2646         if (val == nios2_r2_andi_n_mappings[i])
2647           break;
2648       if (i == nios2_num_r2_andi_n_mappings)
2649         {
2650           as_bad (_("Invalid constant operand %s"), token);
2651           return;
2652         }
2653       insn->insn_code |= SET_IW_T2I4_IMM4 ((unsigned)i);
2654       break;
2655     default:
2656       bad_opcode (op);
2657     }
2658 }
2659
2660 /* Encoded enumeration for movi.n.  */
2661 static void
2662 nios2_assemble_arg_h (const char *token, nios2_insn_infoS *insn)
2663 {
2664   const struct nios2_opcode *op = insn->insn_nios2_opcode;
2665   unsigned int val;
2666   int i;
2667
2668   switch (op->format)
2669     {
2670     case iw_T1I7_type:
2671       val = nios2_assemble_expression (token, insn, BFD_RELOC_NONE, 0);
2672       i = (signed) val;
2673       if ((signed) i == -1)
2674         val = 127;
2675       else if (i == -2)
2676         val = 126;
2677       else if (i == 0xff)
2678         val = 125;
2679       else if (i < 0 || i > 125)
2680         {
2681           as_bad (_("Invalid constant operand %s"), token);
2682           return;
2683         }
2684       insn->insn_code |= SET_IW_T1I7_IMM7 (val);
2685       break;
2686     default:
2687       bad_opcode (op);
2688     }
2689 }
2690
2691 /* Encoded REGMASK for ldwm/stwm or push.n/pop.n.  */
2692 static void
2693 nios2_assemble_arg_R (const char *token, nios2_insn_infoS *insn)
2694 {
2695   const struct nios2_opcode *op = insn->insn_nios2_opcode;
2696   unsigned long mask;
2697   char *buf = strdup (token);
2698   unsigned long reglist = nios2_parse_reglist (buf, op);
2699   free (buf);
2700
2701   if (reglist == 0)
2702     return;
2703
2704   switch (op->format)
2705     {
2706     case iw_F1X4L17_type:
2707       /* Encoding for ldwm/stwm.  */
2708       if (reglist & 0x00003ffc)
2709         mask = reglist >> 2;
2710       else
2711         {
2712           insn->insn_code |= SET_IW_F1X4L17_RS (1);
2713           mask = (reglist & 0x00ffc000) >> 14;
2714           if (reglist & (1 << 28))
2715             mask |= 1 << 10;
2716           if (reglist & (1 << 31))
2717             mask |= 1 << 11;
2718         }
2719       insn->insn_code |= SET_IW_F1X4L17_REGMASK (mask);
2720       break;
2721
2722     case iw_L5I4X1_type:
2723       /* Encoding for push.n/pop.n.  */
2724       if (reglist & (1 << 28))
2725         insn->insn_code |= SET_IW_L5I4X1_FP (1);
2726       mask = reglist & 0x00ff0000;
2727       if (mask)
2728         {
2729           int i;
2730
2731           for (i = 0; i < nios2_num_r2_reg_range_mappings; i++)
2732             if (nios2_r2_reg_range_mappings[i] == mask)
2733               break;
2734           if (i == nios2_num_r2_reg_range_mappings)
2735             {
2736               as_bad ("invalid reglist");
2737               return;
2738             }
2739           insn->insn_code |= SET_IW_L5I4X1_REGRANGE (i);
2740           insn->insn_code |= SET_IW_L5I4X1_CS (1);
2741         }
2742       break;
2743
2744     default:
2745       bad_opcode (op);
2746     }
2747 }
2748
2749 /* Base register for ldwm/stwm.  */
2750 static void
2751 nios2_assemble_arg_B (const char *token, nios2_insn_infoS *insn)
2752 {
2753   const struct nios2_opcode *op = insn->insn_nios2_opcode;
2754   int direction, writeback, ret;
2755   char *str = strdup (token);
2756   struct nios2_reg *reg
2757     = nios2_parse_base_register (str, &direction, &writeback, &ret);
2758
2759   free (str);
2760   if (!reg)
2761     return;
2762
2763   switch (op->format)
2764     {
2765     case iw_F1X4L17_type:
2766       /* For ldwm, check to see if the base register is already inside the
2767          register list.  */
2768       if (op->match == MATCH_R2_LDWM
2769           && (nios2_reglist_mask & (1 << reg->index)))
2770         {
2771           as_bad ("invalid base register; %s is inside the reglist", reg->name);
2772           return;
2773         }
2774
2775       /* For stwm, ret option is not allowed.  */
2776       if (op->match == MATCH_R2_STWM && ret)
2777         {
2778           as_bad ("invalid option syntax");
2779           return;
2780         }
2781
2782       /* Check that the direction matches the ordering of the reglist.  */
2783       if (nios2_reglist_dir && direction != nios2_reglist_dir)
2784         {
2785           as_bad ("reglist order does not match increment/decrement mode");
2786           return;
2787         }
2788
2789       insn->insn_code |= SET_IW_F1X4L17_A (reg->index);
2790       if (direction > 0)
2791         insn->insn_code |= SET_IW_F1X4L17_ID (1);
2792       if (writeback)
2793         insn->insn_code |= SET_IW_F1X4L17_WB (1);
2794       if (ret)
2795         insn->insn_code |= SET_IW_F1X4L17_PC (1);
2796       break;
2797
2798     default:
2799       bad_opcode (op);
2800     }
2801 }
2802
2803 static void
2804 nios2_assemble_args (nios2_insn_infoS *insn)
2805 {
2806   const struct nios2_opcode *op = insn->insn_nios2_opcode;
2807   const char *argptr;
2808   unsigned int tokidx, ntok;
2809
2810   /* Make sure there are enough arguments.  */
2811   ntok = (op->pinfo & NIOS2_INSN_OPTARG) ? op->num_args - 1 : op->num_args;
2812   for (tokidx = 1; tokidx <= ntok; tokidx++)
2813     if (insn->insn_tokens[tokidx] == NULL)
2814       {
2815         as_bad ("missing argument");
2816         return;
2817       }
2818
2819   for (argptr = op->args, tokidx = 1;
2820        *argptr && insn->insn_tokens[tokidx];
2821        argptr++)
2822     switch (*argptr)
2823       {
2824       case ',':
2825       case '(':
2826       case ')':
2827         break;
2828
2829       case 'c':
2830         nios2_assemble_arg_c (insn->insn_tokens[tokidx++], insn);
2831         break;
2832
2833       case 'd':
2834         nios2_assemble_arg_d (insn->insn_tokens[tokidx++], insn);
2835         break;
2836
2837       case 's':
2838         nios2_assemble_arg_s (insn->insn_tokens[tokidx++], insn);
2839         break;
2840
2841       case 't':
2842         nios2_assemble_arg_t (insn->insn_tokens[tokidx++], insn);
2843         break;
2844
2845       case 'D':
2846         nios2_assemble_arg_D (insn->insn_tokens[tokidx++], insn);
2847         break;
2848
2849       case 'S':
2850         nios2_assemble_arg_S (insn->insn_tokens[tokidx++], insn);
2851         break;
2852
2853       case 'T':
2854         nios2_assemble_arg_T (insn->insn_tokens[tokidx++], insn);
2855         break;
2856
2857       case 'i':
2858         nios2_assemble_arg_i (insn->insn_tokens[tokidx++], insn);
2859         break;
2860
2861       case 'I':
2862         nios2_assemble_arg_I (insn->insn_tokens[tokidx++], insn);
2863         break;
2864
2865       case 'u':
2866         nios2_assemble_arg_u (insn->insn_tokens[tokidx++], insn);
2867         break;
2868
2869       case 'U':
2870         nios2_assemble_arg_U (insn->insn_tokens[tokidx++], insn);
2871         break;
2872
2873       case 'V':
2874         nios2_assemble_arg_V (insn->insn_tokens[tokidx++], insn);
2875         break;
2876
2877       case 'W':
2878         nios2_assemble_arg_W (insn->insn_tokens[tokidx++], insn);
2879         break;
2880
2881       case 'X':
2882         nios2_assemble_arg_X (insn->insn_tokens[tokidx++], insn);
2883         break;
2884
2885       case 'Y':
2886         nios2_assemble_arg_Y (insn->insn_tokens[tokidx++], insn);
2887         break;
2888
2889       case 'o':
2890         nios2_assemble_arg_o (insn->insn_tokens[tokidx++], insn);
2891         break;
2892
2893       case 'O':
2894         nios2_assemble_arg_O (insn->insn_tokens[tokidx++], insn);
2895         break;
2896
2897       case 'P':
2898         nios2_assemble_arg_P (insn->insn_tokens[tokidx++], insn);
2899         break;
2900
2901       case 'j':
2902         nios2_assemble_arg_j (insn->insn_tokens[tokidx++], insn);
2903         break;
2904
2905       case 'k':
2906         nios2_assemble_arg_k (insn->insn_tokens[tokidx++], insn);
2907         break;
2908
2909       case 'l':
2910         nios2_assemble_arg_l (insn->insn_tokens[tokidx++], insn);
2911         break;
2912
2913       case 'm':
2914         nios2_assemble_arg_m (insn->insn_tokens[tokidx++], insn);
2915         break;
2916
2917       case 'M':
2918         nios2_assemble_arg_M (insn->insn_tokens[tokidx++], insn);
2919         break;
2920
2921       case 'N':
2922         nios2_assemble_arg_N (insn->insn_tokens[tokidx++], insn);
2923         break;
2924
2925       case 'e':
2926         nios2_assemble_arg_e (insn->insn_tokens[tokidx++], insn);
2927         break;
2928
2929       case 'f':
2930         nios2_assemble_arg_f (insn->insn_tokens[tokidx++], insn);
2931         break;
2932
2933       case 'g':
2934         nios2_assemble_arg_g (insn->insn_tokens[tokidx++], insn);
2935         break;
2936
2937       case 'h':
2938         nios2_assemble_arg_h (insn->insn_tokens[tokidx++], insn);
2939         break;
2940
2941       case 'R':
2942         nios2_assemble_arg_R (insn->insn_tokens[tokidx++], insn);
2943         break;
2944
2945       case 'B':
2946         nios2_assemble_arg_B (insn->insn_tokens[tokidx++], insn);
2947         break;
2948
2949       default:
2950         bad_opcode (op);
2951         break;
2952       }
2953
2954   /* Perform argument checking.  */
2955   nios2_check_assembly (insn->insn_code | insn->constant_bits,
2956                         insn->insn_tokens[tokidx]);
2957 }
2958
2959
2960 /* The function consume_arg takes a pointer into a string
2961    of instruction tokens (args) and a pointer into a string
2962    representing the expected sequence of tokens and separators.
2963    It checks whether the first argument in argstr is of the
2964    expected type, throwing an error if it is not, and returns
2965    the pointer argstr.  */
2966 static char *
2967 nios2_consume_arg (char *argstr, const char *parsestr)
2968 {
2969   char *temp;
2970
2971   switch (*parsestr)
2972     {
2973     case 'c':
2974     case 'd':
2975     case 's':
2976     case 't':
2977     case 'D':
2978     case 'S':
2979     case 'T':
2980       break;
2981
2982     case 'i':
2983     case 'u':
2984       if (*argstr == '%')
2985         {
2986           if (nios2_special_relocation_p (argstr))
2987             {
2988               /* We zap the parentheses because we don't want them confused
2989                  with separators.  */
2990               temp = strchr (argstr, '(');
2991               if (temp != NULL)
2992                 *temp = ' ';
2993               temp = strchr (argstr, ')');
2994               if (temp != NULL)
2995                 *temp = ' ';
2996             }
2997           else
2998             as_bad (_("badly formed expression near %s"), argstr);
2999         }
3000       break;
3001     case 'm':
3002     case 'j':
3003     case 'k':
3004     case 'l':
3005     case 'I':
3006     case 'U':
3007     case 'V':
3008     case 'W':
3009     case 'X':
3010     case 'Y':
3011     case 'O':
3012     case 'P':
3013     case 'e':
3014     case 'f':
3015     case 'g':
3016     case 'h':
3017     case 'M':
3018     case 'N':
3019
3020       /* We can't have %hi, %lo or %hiadj here.  */
3021       if (*argstr == '%')
3022         as_bad (_("badly formed expression near %s"), argstr);
3023       break;
3024
3025     case 'R':
3026       /* Register list for ldwm/stwm or push.n/pop.n.  Replace the commas
3027          in the list with spaces so we don't confuse them with separators.  */
3028       if (*argstr != '{')
3029         {
3030           as_bad ("missing '{' in register list");
3031           break;
3032         }
3033       for (temp = argstr + 1; *temp; temp++)
3034         {
3035           if (*temp == '}')
3036             break;
3037           else if (*temp == ',')
3038             *temp = ' ';
3039         }
3040       if (!*temp)
3041         {
3042           as_bad ("missing '}' in register list");
3043           break;
3044         }
3045       break;
3046
3047     case 'B':
3048       /* Base register and options for ldwm/stwm.  This is the final argument
3049          and consumes the rest of the argument string; replace commas
3050          with spaces so that the token splitter doesn't think they are
3051          separate arguments.  */
3052       for (temp = argstr; *temp; temp++)
3053         if (*temp == ',')
3054           *temp = ' ';
3055       break;
3056
3057     case 'o':
3058     case 'E':
3059       break;
3060     default:
3061       BAD_CASE (*parsestr);
3062       break;
3063     }
3064
3065   return argstr;
3066 }
3067
3068 /* The function consume_separator takes a pointer into a string
3069    of instruction tokens (args) and a pointer into a string representing
3070    the expected sequence of tokens and separators.  It finds the first
3071    instance of the character pointed to by separator in argstr, and
3072    returns a pointer to the next element of argstr, which is the
3073    following token in the sequence.  */
3074 static char *
3075 nios2_consume_separator (char *argstr, const char *separator)
3076 {
3077   char *p;
3078
3079   /* If we have a opcode reg, expr(reg) type instruction, and
3080    * we are separating the expr from the (reg), we find the last
3081    * (, just in case the expression has parentheses.  */
3082
3083   if (*separator == '(')
3084     p = strrchr (argstr, *separator);
3085   else
3086     p = strchr (argstr, *separator);
3087
3088   if (p != NULL)
3089     *p++ = 0;
3090   return p;
3091 }
3092
3093 /* The principal argument parsing function which takes a string argstr
3094    representing the instruction arguments for insn, and extracts the argument
3095    tokens matching parsestr into parsed_args.  */
3096 static void
3097 nios2_parse_args (nios2_insn_infoS *insn, char *argstr,
3098                   const char *parsestr, char **parsed_args)
3099 {
3100   char *p;
3101   char *end = NULL;
3102   int i;
3103   p = argstr;
3104   i = 0;
3105   bfd_boolean terminate = FALSE;
3106
3107   /* This rest of this function is it too fragile and it mostly works,
3108      therefore special case this one.  */
3109   if (*parsestr == 0 && argstr != 0)
3110     {
3111       as_bad (_("too many arguments"));
3112       parsed_args[0] = NULL;
3113       return;
3114     }
3115
3116   while (p != NULL && !terminate && i < NIOS2_MAX_INSN_TOKENS)
3117     {
3118       parsed_args[i] = nios2_consume_arg (p, parsestr);
3119       ++parsestr;
3120       while (*parsestr == '(' || *parsestr == ')' || *parsestr == ',')
3121         {
3122           char *context = p;
3123           p = nios2_consume_separator (p, parsestr);
3124           /* Check for missing separators.  */
3125           if (!p && !(insn->insn_nios2_opcode->pinfo & NIOS2_INSN_OPTARG))
3126             {
3127               as_bad (_("expecting %c near %s"), *parsestr, context);
3128               break;
3129             }
3130           ++parsestr;
3131         }
3132
3133       if (*parsestr == '\0')
3134         {
3135           /* Check that the argument string has no trailing arguments.  */
3136           end = strpbrk (p, ",");
3137           if (end != NULL)
3138             as_bad (_("too many arguments"));
3139         }
3140
3141       if (*parsestr == '\0' || (p != NULL && *p == '\0'))
3142         terminate = TRUE;
3143       ++i;
3144     }
3145
3146   parsed_args[i] = NULL;
3147 }
3148
3149
3150 \f
3151 /** Support for pseudo-op parsing.  These are macro-like opcodes that
3152     expand into real insns by suitable fiddling with the operands.  */
3153
3154 /* Append the string modifier to the string contained in the argument at
3155    parsed_args[ndx].  */
3156 static void
3157 nios2_modify_arg (char **parsed_args, const char *modifier,
3158                   int unused ATTRIBUTE_UNUSED, int ndx)
3159 {
3160   char *tmp = parsed_args[ndx];
3161
3162   parsed_args[ndx]
3163     = (char *) malloc (strlen (parsed_args[ndx]) + strlen (modifier) + 1);
3164   strcpy (parsed_args[ndx], tmp);
3165   strcat (parsed_args[ndx], modifier);
3166 }
3167
3168 /* Modify parsed_args[ndx] by negating that argument.  */
3169 static void
3170 nios2_negate_arg (char **parsed_args, const char *modifier ATTRIBUTE_UNUSED,
3171                   int unused ATTRIBUTE_UNUSED, int ndx)
3172 {
3173   char *tmp = parsed_args[ndx];
3174
3175   parsed_args[ndx]
3176     = (char *) malloc (strlen ("~(") + strlen (parsed_args[ndx]) +
3177                        strlen (")+1") + 1);
3178
3179   strcpy (parsed_args[ndx], "~(");
3180   strcat (parsed_args[ndx], tmp);
3181   strcat (parsed_args[ndx], ")+1");
3182 }
3183
3184 /* The function nios2_swap_args swaps the pointers at indices index_1 and
3185    index_2 in the array parsed_args[] - this is used for operand swapping
3186    for comparison operations.  */
3187 static void
3188 nios2_swap_args (char **parsed_args, const char *unused ATTRIBUTE_UNUSED,
3189                  int index_1, int index_2)
3190 {
3191   char *tmp;
3192   gas_assert (index_1 < NIOS2_MAX_INSN_TOKENS
3193               && index_2 < NIOS2_MAX_INSN_TOKENS);
3194   tmp = parsed_args[index_1];
3195   parsed_args[index_1] = parsed_args[index_2];
3196   parsed_args[index_2] = tmp;
3197 }
3198
3199 /* This function appends the string appnd to the array of strings in
3200    parsed_args num times starting at index start in the array.  */
3201 static void
3202 nios2_append_arg (char **parsed_args, const char *appnd, int num,
3203                   int start)
3204 {
3205   int i, count;
3206   char *tmp;
3207
3208   gas_assert ((start + num) < NIOS2_MAX_INSN_TOKENS);
3209
3210   if (nios2_mode == NIOS2_MODE_TEST)
3211     tmp = parsed_args[start];
3212   else
3213     tmp = NULL;
3214
3215   for (i = start, count = num; count > 0; ++i, --count)
3216     parsed_args[i] = (char *) appnd;
3217
3218   gas_assert (i == (start + num));
3219   parsed_args[i] = tmp;
3220   parsed_args[i + 1] = NULL;
3221 }
3222
3223 /* This function inserts the string insert num times in the array
3224    parsed_args, starting at the index start.  */
3225 static void
3226 nios2_insert_arg (char **parsed_args, const char *insert, int num,
3227                   int start)
3228 {
3229   int i, count;
3230
3231   gas_assert ((start + num) < NIOS2_MAX_INSN_TOKENS);
3232
3233   /* Move the existing arguments up to create space.  */
3234   for (i = NIOS2_MAX_INSN_TOKENS; i - num >= start; --i)
3235     parsed_args[i] = parsed_args[i - num];
3236
3237   for (i = start, count = num; count > 0; ++i, --count)
3238     parsed_args[i] = (char *) insert;
3239 }
3240
3241 /* Cleanup function to free malloc'ed arg strings.  */
3242 static void
3243 nios2_free_arg (char **parsed_args, int num ATTRIBUTE_UNUSED, int start)
3244 {
3245   if (parsed_args[start])
3246     {
3247       free (parsed_args[start]);
3248       parsed_args[start] = NULL;
3249     }
3250 }
3251
3252 /* This function swaps the pseudo-op for a real op.  */
3253 static nios2_ps_insn_infoS*
3254 nios2_translate_pseudo_insn (nios2_insn_infoS *insn)
3255 {
3256
3257   nios2_ps_insn_infoS *ps_insn;
3258
3259   /* Find which real insn the pseudo-op transates to and
3260      switch the insn_info ptr to point to it.  */
3261   ps_insn = nios2_ps_lookup (insn->insn_nios2_opcode->name);
3262
3263   if (ps_insn != NULL)
3264     {
3265       insn->insn_nios2_opcode = nios2_opcode_lookup (ps_insn->insn);
3266       insn->insn_tokens[0] = insn->insn_nios2_opcode->name;
3267       /* Modify the args so they work with the real insn.  */
3268       ps_insn->arg_modifer_func ((char **) insn->insn_tokens,
3269                                  ps_insn->arg_modifier, ps_insn->num,
3270                                  ps_insn->index);
3271     }
3272   else
3273     /* we cannot recover from this.  */
3274     as_fatal (_("unrecognized pseudo-instruction %s"),
3275               insn->insn_nios2_opcode->name);
3276   return ps_insn;
3277 }
3278
3279 /* Invoke the cleanup handler for pseudo-insn ps_insn on insn.  */
3280 static void
3281 nios2_cleanup_pseudo_insn (nios2_insn_infoS *insn,
3282                            nios2_ps_insn_infoS *ps_insn)
3283 {
3284   if (ps_insn->arg_cleanup_func)
3285     (ps_insn->arg_cleanup_func) ((char **) insn->insn_tokens,
3286                                  ps_insn->num, ps_insn->index);
3287 }
3288
3289 const nios2_ps_insn_infoS nios2_ps_insn_info_structs[] = {
3290   /* pseudo-op, real-op, arg, arg_modifier_func, num, index, arg_cleanup_func */
3291   {"mov", "add", nios2_append_arg, "zero", 1, 3, NULL},
3292   {"movi", "addi", nios2_insert_arg, "zero", 1, 2, NULL},
3293   {"movhi", "orhi", nios2_insert_arg, "zero", 1, 2, NULL},
3294   {"movui", "ori", nios2_insert_arg, "zero", 1, 2, NULL},
3295   {"movia", "orhi", nios2_insert_arg, "zero", 1, 2, NULL},
3296   {"nop", "add", nios2_append_arg, "zero", 3, 1, NULL},
3297   {"bgt", "blt", nios2_swap_args, "", 1, 2, NULL},
3298   {"bgtu", "bltu", nios2_swap_args, "", 1, 2, NULL},
3299   {"ble", "bge", nios2_swap_args, "", 1, 2, NULL},
3300   {"bleu", "bgeu", nios2_swap_args, "", 1, 2, NULL},
3301   {"cmpgt", "cmplt", nios2_swap_args, "", 2, 3, NULL},
3302   {"cmpgtu", "cmpltu", nios2_swap_args, "", 2, 3, NULL},
3303   {"cmple", "cmpge", nios2_swap_args, "", 2, 3, NULL},
3304   {"cmpleu", "cmpgeu", nios2_swap_args, "", 2, 3, NULL},
3305   {"cmpgti", "cmpgei", nios2_modify_arg, "+1", 0, 3, nios2_free_arg},
3306   {"cmpgtui", "cmpgeui", nios2_modify_arg, "+1", 0, 3, nios2_free_arg},
3307   {"cmplei", "cmplti", nios2_modify_arg, "+1", 0, 3, nios2_free_arg},
3308   {"cmpleui", "cmpltui", nios2_modify_arg, "+1", 0, 3, nios2_free_arg},
3309   {"subi", "addi", nios2_negate_arg, "", 0, 3, nios2_free_arg},
3310   {"nop.n", "mov.n", nios2_append_arg, "zero", 2, 1, NULL}
3311   /* Add further pseudo-ops here.  */
3312 };
3313
3314 #define NIOS2_NUM_PSEUDO_INSNS \
3315         ((sizeof(nios2_ps_insn_info_structs)/ \
3316           sizeof(nios2_ps_insn_info_structs[0])))
3317 const int nios2_num_ps_insn_info_structs = NIOS2_NUM_PSEUDO_INSNS;
3318
3319 \f
3320 /** Assembler output support.  */
3321
3322 /* Output a normal instruction.  */
3323 static void
3324 output_insn (nios2_insn_infoS *insn)
3325 {
3326   char *f;
3327   nios2_insn_relocS *reloc;
3328   f = frag_more (insn->insn_nios2_opcode->size);
3329   /* This allocates enough space for the instruction
3330      and puts it in the current frag.  */
3331   md_number_to_chars (f, insn->insn_code, insn->insn_nios2_opcode->size);
3332   /* Emit debug info.  */
3333   dwarf2_emit_insn (insn->insn_nios2_opcode->size);
3334   /* Create any fixups to be acted on later.  */
3335
3336   for (reloc = insn->insn_reloc; reloc != NULL; reloc = reloc->reloc_next)
3337     fix_new_exp (frag_now, f - frag_now->fr_literal,
3338                  insn->insn_nios2_opcode->size,
3339                  &reloc->reloc_expression, reloc->reloc_pcrel,
3340                  reloc->reloc_type);
3341 }
3342
3343 /* Output an unconditional branch.  */
3344 static void
3345 output_ubranch (nios2_insn_infoS *insn)
3346 {
3347   nios2_insn_relocS *reloc = insn->insn_reloc;
3348
3349   /* If the reloc is NULL, there was an error assembling the branch.  */
3350   if (reloc != NULL)
3351     {
3352       symbolS *symp = reloc->reloc_expression.X_add_symbol;
3353       offsetT offset = reloc->reloc_expression.X_add_number;
3354       char *f;
3355       bfd_boolean is_cdx = (insn->insn_nios2_opcode->size == 2);
3356
3357       /* Tag dwarf2 debug info to the address at the start of the insn.
3358          We must do it before frag_var() below closes off the frag.  */
3359       dwarf2_emit_insn (0);
3360
3361       /* We create a machine dependent frag which can grow
3362          to accommodate the largest possible instruction sequence
3363          this may generate.  */
3364       f = frag_var (rs_machine_dependent,
3365                     UBRANCH_MAX_SIZE, insn->insn_nios2_opcode->size,
3366                     (is_cdx ? CDX_UBRANCH_SUBTYPE (0) : UBRANCH_SUBTYPE (0)),
3367                     symp, offset, NULL);
3368
3369       md_number_to_chars (f, insn->insn_code, insn->insn_nios2_opcode->size);
3370
3371       /* We leave fixup generation to md_convert_frag.  */
3372     }
3373 }
3374
3375 /* Output a conditional branch.  */
3376 static void
3377 output_cbranch (nios2_insn_infoS *insn)
3378 {
3379   nios2_insn_relocS *reloc = insn->insn_reloc;
3380
3381   /* If the reloc is NULL, there was an error assembling the branch.  */
3382   if (reloc != NULL)
3383     {
3384       symbolS *symp = reloc->reloc_expression.X_add_symbol;
3385       offsetT offset = reloc->reloc_expression.X_add_number;
3386       char *f;
3387       bfd_boolean is_cdx = (insn->insn_nios2_opcode->size == 2);
3388
3389       /* Tag dwarf2 debug info to the address at the start of the insn.
3390          We must do it before frag_var() below closes off the frag.  */
3391       dwarf2_emit_insn (0);
3392
3393       /* We create a machine dependent frag which can grow
3394          to accommodate the largest possible instruction sequence
3395          this may generate.  */
3396       f = frag_var (rs_machine_dependent,
3397                     CBRANCH_MAX_SIZE, insn->insn_nios2_opcode->size,
3398                     (is_cdx ? CDX_CBRANCH_SUBTYPE (0) : CBRANCH_SUBTYPE (0)),
3399                     symp, offset, NULL);
3400
3401       md_number_to_chars (f, insn->insn_code, insn->insn_nios2_opcode->size);
3402
3403       /* We leave fixup generation to md_convert_frag.  */
3404     }
3405 }
3406
3407 /* Output a call sequence.  Since calls are not pc-relative for NIOS2,
3408    but are page-relative, we cannot tell at any stage in assembly
3409    whether a call will be out of range since a section may be linked
3410    at any address.  So if we are relaxing, we convert all call instructions
3411    to long call sequences, and rely on the linker to relax them back to
3412    short calls.  */
3413 static void
3414 output_call (nios2_insn_infoS *insn)
3415 {
3416   /* This allocates enough space for the instruction
3417      and puts it in the current frag.  */
3418   char *f = frag_more (12);
3419   nios2_insn_relocS *reloc = insn->insn_reloc;
3420   const struct nios2_opcode *op = insn->insn_nios2_opcode;
3421
3422   switch (op->format)
3423     {
3424     case iw_j_type:
3425       md_number_to_chars (f,
3426                           (MATCH_R1_ORHI | SET_IW_I_B (AT_REGNUM)
3427                            | SET_IW_I_A (0)),
3428                           4);
3429       dwarf2_emit_insn (4);
3430       fix_new_exp (frag_now, f - frag_now->fr_literal, 4,
3431                    &reloc->reloc_expression, 0, BFD_RELOC_NIOS2_HI16);
3432       md_number_to_chars (f + 4,
3433                           (MATCH_R1_ORI | SET_IW_I_B (AT_REGNUM)
3434                            | SET_IW_I_A (AT_REGNUM)),
3435                           4);
3436       dwarf2_emit_insn (4);
3437       fix_new_exp (frag_now, f - frag_now->fr_literal + 4, 4,
3438                    &reloc->reloc_expression, 0, BFD_RELOC_NIOS2_LO16);
3439       md_number_to_chars (f + 8, MATCH_R1_CALLR | SET_IW_R_A (AT_REGNUM), 4);
3440       dwarf2_emit_insn (4);
3441       break;
3442     case iw_L26_type:
3443       md_number_to_chars (f,
3444                           (MATCH_R2_ORHI | SET_IW_F2I16_B (AT_REGNUM)
3445                            | SET_IW_F2I16_A (0)),
3446                           4);
3447       dwarf2_emit_insn (4);
3448       fix_new_exp (frag_now, f - frag_now->fr_literal, 4,
3449                    &reloc->reloc_expression, 0, BFD_RELOC_NIOS2_HI16);
3450       md_number_to_chars (f + 4,
3451                           (MATCH_R2_ORI | SET_IW_F2I16_B (AT_REGNUM)
3452                            | SET_IW_F2I16_A (AT_REGNUM)),
3453                           4);
3454       dwarf2_emit_insn (4);
3455       fix_new_exp (frag_now, f - frag_now->fr_literal + 4, 4,
3456                    &reloc->reloc_expression, 0, BFD_RELOC_NIOS2_LO16);
3457       md_number_to_chars (f + 8, MATCH_R2_CALLR | SET_IW_F3X6L5_A (AT_REGNUM),
3458                           4);
3459       dwarf2_emit_insn (4);
3460       break;
3461     default:
3462       bad_opcode (op);
3463     }
3464 }
3465
3466 /* Output a movhi/addi pair for the movia pseudo-op.  */
3467 static void
3468 output_movia (nios2_insn_infoS *insn)
3469 {
3470   /* This allocates enough space for the instruction
3471      and puts it in the current frag.  */
3472   char *f = frag_more (8);
3473   nios2_insn_relocS *reloc = insn->insn_reloc;
3474   unsigned long reg, code = 0;
3475   const struct nios2_opcode *op = insn->insn_nios2_opcode;
3476
3477   /* If the reloc is NULL, there was an error assembling the movia.  */
3478   if (reloc != NULL)
3479     {
3480       switch (op->format)
3481         {
3482         case iw_i_type:
3483           reg = GET_IW_I_B (insn->insn_code);
3484           code = MATCH_R1_ADDI | SET_IW_I_A (reg) | SET_IW_I_B (reg);
3485           break;
3486         case iw_F2I16_type:
3487           reg = GET_IW_F2I16_B (insn->insn_code);
3488           code = MATCH_R2_ADDI | SET_IW_F2I16_A (reg) | SET_IW_F2I16_B (reg);
3489           break;
3490         default:
3491           bad_opcode (op);
3492         }
3493
3494       md_number_to_chars (f, insn->insn_code, 4);
3495       dwarf2_emit_insn (4);
3496       fix_new (frag_now, f - frag_now->fr_literal, 4,
3497                reloc->reloc_expression.X_add_symbol,
3498                reloc->reloc_expression.X_add_number, 0,
3499                BFD_RELOC_NIOS2_HIADJ16);
3500       md_number_to_chars (f + 4, code, 4);
3501       dwarf2_emit_insn (4);
3502       fix_new (frag_now, f + 4 - frag_now->fr_literal, 4,
3503                reloc->reloc_expression.X_add_symbol,
3504                reloc->reloc_expression.X_add_number, 0, BFD_RELOC_NIOS2_LO16);
3505     }
3506 }
3507
3508
3509 \f
3510 /** External interfaces.  */
3511
3512 /* Update the selected architecture based on ARCH, giving an error if
3513    ARCH is an invalid value.  */
3514
3515 static void
3516 nios2_use_arch (const char *arch)
3517 {
3518   if (strcmp (arch, "nios2") == 0 || strcmp (arch, "r1") == 0)
3519     {
3520       nios2_architecture |= EF_NIOS2_ARCH_R1;
3521       nios2_opcodes = (struct nios2_opcode *) nios2_r1_opcodes;
3522       nios2_num_opcodes = nios2_num_r1_opcodes;
3523       nop32 = nop_r1;
3524       nop16 = NULL;
3525       return;
3526     }
3527   else if (strcmp (arch, "r2") == 0)
3528     {
3529       nios2_architecture |= EF_NIOS2_ARCH_R2;
3530       nios2_opcodes = (struct nios2_opcode *) nios2_r2_opcodes;
3531       nios2_num_opcodes = nios2_num_r2_opcodes;
3532       nop32 = nop_r2;
3533       nop16 = nop_r2_cdx;
3534       return;
3535     }
3536
3537   as_bad (_("unknown architecture '%s'"), arch);
3538 }
3539
3540 /* The following functions are called by machine-independent parts of
3541    the assembler. */
3542 int
3543 md_parse_option (int c, const char *arg ATTRIBUTE_UNUSED)
3544 {
3545   switch (c)
3546     {
3547     case 'r':
3548       /* Hidden option for self-test mode.  */
3549       nios2_mode = NIOS2_MODE_TEST;
3550       break;
3551     case OPTION_RELAX_ALL:
3552       nios2_as_options.relax = relax_all;
3553       break;
3554     case OPTION_NORELAX:
3555       nios2_as_options.relax = relax_none;
3556       break;
3557     case OPTION_RELAX_SECTION:
3558       nios2_as_options.relax = relax_section;
3559       break;
3560     case OPTION_EB:
3561       target_big_endian = 1;
3562       break;
3563     case OPTION_EL:
3564       target_big_endian = 0;
3565       break;
3566     case OPTION_MARCH:
3567       nios2_use_arch (arg);
3568       break;
3569     default:
3570       return 0;
3571       break;
3572     }
3573
3574   return 1;
3575 }
3576
3577 /* Implement TARGET_FORMAT.  We can choose to be big-endian or
3578    little-endian at runtime based on a switch.  */
3579 const char *
3580 nios2_target_format (void)
3581 {
3582   return target_big_endian ? "elf32-bignios2" : "elf32-littlenios2";
3583 }
3584
3585 /* Machine-dependent usage message. */
3586 void
3587 md_show_usage (FILE *stream)
3588 {
3589   fprintf (stream, "        NIOS2 options:\n"
3590            "  -relax-all            replace all branch and call "
3591            "instructions with jmp and callr sequences\n"
3592            "  -relax-section        replace identified out of range "
3593            "branches with jmp sequences (default)\n"
3594            "  -no-relax             do not replace any branches or calls\n"
3595            "  -EB                   force big-endian byte ordering\n"
3596            "  -EL                   force little-endian byte ordering\n"
3597            "  -march=ARCH           enable instructions from architecture ARCH\n");
3598 }
3599
3600
3601 /* This function is called once, at assembler startup time.
3602    It should set up all the tables, etc. that the MD part of the
3603    assembler will need. */
3604 void
3605 md_begin (void)
3606 {
3607   int i;
3608   const char *inserted;
3609
3610   switch (nios2_architecture)
3611     {
3612     default:
3613     case EF_NIOS2_ARCH_R1:
3614       bfd_default_set_arch_mach (stdoutput, bfd_arch_nios2, bfd_mach_nios2r1);
3615       break;
3616     case EF_NIOS2_ARCH_R2:
3617       if (target_big_endian)
3618         as_fatal (_("Big-endian R2 is not supported."));
3619       bfd_default_set_arch_mach (stdoutput, bfd_arch_nios2, bfd_mach_nios2r2);
3620       break;
3621     }
3622
3623   /* Create and fill a hashtable for the Nios II opcodes, registers and
3624      arguments.  */
3625   nios2_opcode_hash = hash_new ();
3626   nios2_reg_hash = hash_new ();
3627   nios2_ps_hash = hash_new ();
3628
3629   for (i = 0; i < nios2_num_opcodes; ++i)
3630     {
3631       inserted
3632         = hash_insert (nios2_opcode_hash, nios2_opcodes[i].name,
3633                        (PTR) & nios2_opcodes[i]);
3634       if (inserted != NULL)
3635         {
3636           fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
3637                    nios2_opcodes[i].name, inserted);
3638           /* Probably a memory allocation problem?  Give up now.  */
3639           as_fatal (_("Broken assembler.  No assembly attempted."));
3640         }
3641     }
3642
3643   for (i = 0; i < nios2_num_regs; ++i)
3644     {
3645       inserted
3646         = hash_insert (nios2_reg_hash, nios2_regs[i].name,
3647                        (PTR) & nios2_regs[i]);
3648       if (inserted != NULL)
3649         {
3650           fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
3651                    nios2_regs[i].name, inserted);
3652           /* Probably a memory allocation problem?  Give up now.  */
3653           as_fatal (_("Broken assembler.  No assembly attempted."));
3654         }
3655
3656     }
3657
3658   for (i = 0; i < nios2_num_ps_insn_info_structs; ++i)
3659     {
3660       inserted
3661         = hash_insert (nios2_ps_hash, nios2_ps_insn_info_structs[i].pseudo_insn,
3662                        (PTR) & nios2_ps_insn_info_structs[i]);
3663       if (inserted != NULL)
3664         {
3665           fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
3666                    nios2_ps_insn_info_structs[i].pseudo_insn, inserted);
3667           /* Probably a memory allocation problem?  Give up now.  */
3668           as_fatal (_("Broken assembler.  No assembly attempted."));
3669         }
3670     }
3671
3672   /* Assembler option defaults.  */
3673   nios2_as_options.noat = FALSE;
3674   nios2_as_options.nobreak = FALSE;
3675
3676   /* Debug information is incompatible with relaxation.  */
3677   if (debug_type != DEBUG_UNSPECIFIED)
3678     nios2_as_options.relax = relax_none;
3679
3680   /* Initialize the alignment data.  */
3681   nios2_current_align_seg = now_seg;
3682   nios2_last_label = NULL;
3683   nios2_current_align = 0;
3684   nios2_min_align = 2;
3685 }
3686
3687
3688 /* Assembles a single line of Nios II assembly language.  */
3689 void
3690 md_assemble (char *op_str)
3691 {
3692   char *argstr;
3693   char *op_strdup = NULL;
3694   unsigned long saved_pinfo = 0;
3695   nios2_insn_infoS thisinsn;
3696   nios2_insn_infoS *insn = &thisinsn;
3697
3698   /* Make sure we are aligned on an appropriate boundary.  */
3699   if (nios2_current_align < nios2_min_align)
3700     nios2_align (nios2_min_align, NULL, nios2_last_label);
3701   else if (nios2_current_align > nios2_min_align)
3702     nios2_current_align = nios2_min_align;
3703   nios2_last_label = NULL;
3704
3705   /* We don't want to clobber to op_str
3706      because we want to be able to use it in messages.  */
3707   op_strdup = strdup (op_str);
3708   insn->insn_tokens[0] = strtok (op_strdup, " ");
3709   argstr = strtok (NULL, "");
3710
3711   /* Assemble the opcode.  */
3712   insn->insn_nios2_opcode = nios2_opcode_lookup (insn->insn_tokens[0]);
3713   insn->insn_reloc = NULL;
3714
3715   if (insn->insn_nios2_opcode != NULL)
3716     {
3717       nios2_ps_insn_infoS *ps_insn = NULL;
3718
3719       /* Note if we've seen a 16-bit instruction.  */
3720       if (insn->insn_nios2_opcode->size == 2)
3721         nios2_min_align = 1;
3722
3723       /* Set the opcode for the instruction.  */
3724       insn->insn_code = insn->insn_nios2_opcode->match;
3725       insn->constant_bits = 0;
3726
3727       /* Parse the arguments pointed to by argstr.  */
3728       if (nios2_mode == NIOS2_MODE_ASSEMBLE)
3729         nios2_parse_args (insn, argstr, insn->insn_nios2_opcode->args,
3730                           (char **) &insn->insn_tokens[1]);
3731       else
3732         nios2_parse_args (insn, argstr, insn->insn_nios2_opcode->args_test,
3733                           (char **) &insn->insn_tokens[1]);
3734
3735       /* We need to preserve the MOVIA macro as this is clobbered by
3736          translate_pseudo_insn.  */
3737       if (insn->insn_nios2_opcode->pinfo == NIOS2_INSN_MACRO_MOVIA)
3738         saved_pinfo = NIOS2_INSN_MACRO_MOVIA;
3739       /* If the instruction is an pseudo-instruction, we want to replace it
3740          with its real equivalent, and then continue.  */
3741       if ((insn->insn_nios2_opcode->pinfo & NIOS2_INSN_MACRO)
3742           == NIOS2_INSN_MACRO)
3743         ps_insn = nios2_translate_pseudo_insn (insn);
3744
3745       /* Assemble the parsed arguments into the instruction word.  */
3746       nios2_assemble_args (insn);
3747
3748       /* Handle relaxation and other transformations.  */
3749       if (nios2_as_options.relax != relax_none
3750           && !nios2_as_options.noat
3751           && insn->insn_nios2_opcode->pinfo & NIOS2_INSN_UBRANCH)
3752         output_ubranch (insn);
3753       else if (nios2_as_options.relax != relax_none
3754                && !nios2_as_options.noat
3755                && insn->insn_nios2_opcode->pinfo & NIOS2_INSN_CBRANCH)
3756         output_cbranch (insn);
3757       else if (nios2_as_options.relax == relax_all
3758                && !nios2_as_options.noat
3759                && insn->insn_nios2_opcode->pinfo & NIOS2_INSN_CALL
3760                && insn->insn_reloc
3761                && ((insn->insn_reloc->reloc_type
3762                     == BFD_RELOC_NIOS2_CALL26)
3763                    || (insn->insn_reloc->reloc_type
3764                        == BFD_RELOC_NIOS2_CALL26_NOAT)))
3765         output_call (insn);
3766       else if (saved_pinfo == NIOS2_INSN_MACRO_MOVIA)
3767         output_movia (insn);
3768       else
3769         output_insn (insn);
3770       if (ps_insn)
3771         nios2_cleanup_pseudo_insn (insn, ps_insn);
3772     }
3773   else
3774     /* Unrecognised instruction - error.  */
3775     as_bad (_("unrecognised instruction %s"), insn->insn_tokens[0]);
3776
3777   /* Don't leak memory.  */
3778   free (op_strdup);
3779 }
3780
3781 /* Round up section size.  */
3782 valueT
3783 md_section_align (asection *seg ATTRIBUTE_UNUSED, valueT size)
3784 {
3785   /* I think byte alignment is fine here.  */
3786   return size;
3787 }
3788
3789 /* Implement TC_FORCE_RELOCATION.  */
3790 int
3791 nios2_force_relocation (fixS *fixp)
3792 {
3793   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
3794       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY
3795       || fixp->fx_r_type == BFD_RELOC_NIOS2_ALIGN)
3796     return 1;
3797
3798   return generic_force_reloc (fixp);
3799 }
3800
3801 /* Implement tc_fix_adjustable.  */
3802 int
3803 nios2_fix_adjustable (fixS *fixp)
3804 {
3805   if (fixp->fx_addsy == NULL)
3806     return 1;
3807
3808 #ifdef OBJ_ELF
3809   /* Prevent all adjustments to global symbols.  */
3810   if (OUTPUT_FLAVOR == bfd_target_elf_flavour
3811       && (S_IS_EXTERNAL (fixp->fx_addsy) || S_IS_WEAK (fixp->fx_addsy)))
3812     return 0;
3813 #endif
3814   if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
3815       || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
3816     return 0;
3817
3818   /* Preserve relocations against symbols with function type.  */
3819   if (symbol_get_bfdsym (fixp->fx_addsy)->flags & BSF_FUNCTION)
3820     return 0;
3821
3822   /* Don't allow symbols to be discarded on GOT related relocs.  */
3823   if (fixp->fx_r_type == BFD_RELOC_NIOS2_GOT16
3824       || fixp->fx_r_type == BFD_RELOC_NIOS2_CALL16
3825       || fixp->fx_r_type == BFD_RELOC_NIOS2_GOTOFF_LO
3826       || fixp->fx_r_type == BFD_RELOC_NIOS2_GOTOFF_HA
3827       || fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_GD16
3828       || fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_LDM16
3829       || fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_LDO16
3830       || fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_IE16
3831       || fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_LE16
3832       || fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_DTPMOD
3833       || fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_DTPREL
3834       || fixp->fx_r_type == BFD_RELOC_NIOS2_TLS_TPREL
3835       || fixp->fx_r_type == BFD_RELOC_NIOS2_GOTOFF
3836       || fixp->fx_r_type == BFD_RELOC_NIOS2_GOT_LO
3837       || fixp->fx_r_type == BFD_RELOC_NIOS2_GOT_HA
3838       || fixp->fx_r_type == BFD_RELOC_NIOS2_CALL_LO
3839       || fixp->fx_r_type == BFD_RELOC_NIOS2_CALL_HA
3840       )
3841     return 0;
3842
3843   return 1;
3844 }
3845
3846 /* Implement tc_frob_symbol.  This is called in adjust_reloc_syms;
3847    it is used to remove *ABS* references from the symbol table.  */
3848 int
3849 nios2_frob_symbol (symbolS *symp)
3850 {
3851   if ((OUTPUT_FLAVOR == bfd_target_elf_flavour
3852        && symp == section_symbol (absolute_section))
3853       || !S_IS_DEFINED (symp))
3854     return 1;
3855   else
3856     return 0;
3857 }
3858
3859 /* The function tc_gen_reloc creates a relocation structure for the
3860    fixup fixp, and returns a pointer to it.  This structure is passed
3861    to bfd_install_relocation so that it can be written to the object
3862    file for linking.  */
3863 arelent *
3864 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
3865 {
3866   arelent *reloc = (arelent *) xmalloc (sizeof (arelent));
3867   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
3868   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
3869
3870   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
3871   reloc->addend = fixp->fx_offset;  /* fixp->fx_addnumber; */
3872
3873   if (fixp->fx_pcrel)
3874     {
3875       switch (fixp->fx_r_type)
3876         {
3877         case BFD_RELOC_16:
3878           fixp->fx_r_type = BFD_RELOC_16_PCREL;
3879           break;
3880         case BFD_RELOC_NIOS2_LO16:
3881           fixp->fx_r_type = BFD_RELOC_NIOS2_PCREL_LO;
3882           break;
3883         case BFD_RELOC_NIOS2_HIADJ16:
3884           fixp->fx_r_type = BFD_RELOC_NIOS2_PCREL_HA;
3885           break;
3886         default:
3887           break;
3888         }
3889     }
3890
3891   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
3892   if (reloc->howto == NULL)
3893     {
3894       as_bad_where (fixp->fx_file, fixp->fx_line,
3895                     _("can't represent relocation type %s"),
3896                     bfd_get_reloc_code_name (fixp->fx_r_type));
3897
3898       /* Set howto to a garbage value so that we can keep going.  */
3899       reloc->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
3900       gas_assert (reloc->howto != NULL);
3901     }
3902   return reloc;
3903 }
3904
3905 long
3906 md_pcrel_from (fixS *fixP ATTRIBUTE_UNUSED)
3907 {
3908   return 0;
3909 }
3910
3911 /* Called just before the assembler exits.  */
3912 void
3913 md_end ()
3914 {
3915   /* FIXME - not yet implemented */
3916 }
3917
3918 /* Under ELF we need to default _GLOBAL_OFFSET_TABLE.
3919    Otherwise we have no need to default values of symbols.  */
3920 symbolS *
3921 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
3922 {
3923 #ifdef OBJ_ELF
3924   if (name[0] == '_' && name[1] == 'G'
3925       && strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0)
3926     {
3927       if (!GOT_symbol)
3928         {
3929           if (symbol_find (name))
3930             as_bad ("GOT already in the symbol table");
3931
3932           GOT_symbol = symbol_new (name, undefined_section,
3933                                    (valueT) 0, &zero_address_frag);
3934         }
3935
3936       return GOT_symbol;
3937     }
3938 #endif
3939
3940   return 0;
3941 }
3942
3943 /* Implement tc_frob_label.  */
3944 void
3945 nios2_frob_label (symbolS *lab)
3946 {
3947   /* Emit dwarf information.  */
3948   dwarf2_emit_label (lab);
3949
3950   /* Update the label's address with the current output pointer.  */
3951   symbol_set_frag (lab, frag_now);
3952   S_SET_VALUE (lab, (valueT) frag_now_fix ());
3953
3954   /* Record this label for future adjustment after we find out what
3955      kind of data it references, and the required alignment therewith.  */
3956   nios2_last_label = lab;
3957 }
3958
3959 /* Implement md_cons_align.  */
3960 void
3961 nios2_cons_align (int size)
3962 {
3963   int log_size = 0;
3964   const char *pfill = NULL;
3965
3966   while ((size >>= 1) != 0)
3967     ++log_size;
3968
3969   if (subseg_text_p (now_seg))
3970     pfill = (const char *) nop32;
3971   else
3972     pfill = NULL;
3973
3974   if (nios2_auto_align_on)
3975     nios2_align (log_size, pfill, NULL);
3976
3977   nios2_last_label = NULL;
3978 }
3979
3980 /* Map 's' to SHF_NIOS2_GPREL.  */
3981 /* This is from the Alpha code tc-alpha.c.  */
3982 int
3983 nios2_elf_section_letter (int letter, const char **ptr_msg)
3984 {
3985   if (letter == 's')
3986     return SHF_NIOS2_GPREL;
3987
3988   *ptr_msg = _("Bad .section directive: want a,s,w,x,M,S,G,T in string");
3989   return -1;
3990 }
3991
3992 /* Map SHF_ALPHA_GPREL to SEC_SMALL_DATA.  */
3993 /* This is from the Alpha code tc-alpha.c.  */
3994 flagword
3995 nios2_elf_section_flags (flagword flags, int attr, int type ATTRIBUTE_UNUSED)
3996 {
3997   if (attr & SHF_NIOS2_GPREL)
3998     flags |= SEC_SMALL_DATA;
3999   return flags;
4000 }
4001
4002 /* Implement TC_PARSE_CONS_EXPRESSION to handle %tls_ldo(...) */
4003 bfd_reloc_code_real_type
4004 nios2_cons (expressionS *exp, int size)
4005 {
4006   bfd_reloc_code_real_type nios2_tls_ldo_reloc = BFD_RELOC_NONE;
4007
4008   SKIP_WHITESPACE ();
4009   if (input_line_pointer[0] == '%')
4010     {
4011       if (strprefix (input_line_pointer + 1, "tls_ldo"))
4012         {
4013           if (size != 4)
4014             as_bad (_("Illegal operands: %%tls_ldo in %d-byte data field"),
4015                     size);
4016           else
4017             {
4018               input_line_pointer += 8;
4019               nios2_tls_ldo_reloc = BFD_RELOC_NIOS2_TLS_DTPREL;
4020             }
4021         }
4022       if (nios2_tls_ldo_reloc != BFD_RELOC_NONE)
4023         {
4024           SKIP_WHITESPACE ();
4025           if (input_line_pointer[0] != '(')
4026             as_bad (_("Illegal operands: %%tls_ldo requires arguments in ()"));
4027           else
4028             {
4029               int c;
4030               char *end = ++input_line_pointer;
4031               int npar = 0;
4032
4033               for (c = *end; !is_end_of_line[c]; end++, c = *end)
4034                 if (c == '(')
4035                   npar++;
4036                 else if (c == ')')
4037                   {
4038                     if (!npar)
4039                       break;
4040                     npar--;
4041                   }
4042
4043               if (c != ')')
4044                 as_bad (_("Illegal operands: %%tls_ldo requires arguments in ()"));
4045               else
4046                 {
4047                   *end = '\0';
4048                   expression (exp);
4049                   *end = c;
4050                   if (input_line_pointer != end)
4051                     as_bad (_("Illegal operands: %%tls_ldo requires arguments in ()"));
4052                   else
4053                     {
4054                       input_line_pointer++;
4055                       SKIP_WHITESPACE ();
4056                       c = *input_line_pointer;
4057                       if (! is_end_of_line[c] && c != ',')
4058                         as_bad (_("Illegal operands: garbage after %%tls_ldo()"));
4059                     }
4060                 }
4061             }
4062         }
4063     }
4064   if (nios2_tls_ldo_reloc == BFD_RELOC_NONE)
4065     expression (exp);
4066   return nios2_tls_ldo_reloc;
4067 }
4068
4069 /* Implement HANDLE_ALIGN.  */
4070 void
4071 nios2_handle_align (fragS *fragp)
4072 {
4073   /* If we are expecting to relax in the linker, then we must output a
4074      relocation to tell the linker we are aligning code.  */
4075   if (nios2_as_options.relax == relax_all
4076       && (fragp->fr_type == rs_align || fragp->fr_type == rs_align_code)
4077       && fragp->fr_address + fragp->fr_fix > 0
4078       && fragp->fr_offset > 1
4079       && now_seg != bss_section)
4080     fix_new (fragp, fragp->fr_fix, 0, &abs_symbol, fragp->fr_offset, 0,
4081              BFD_RELOC_NIOS2_ALIGN);
4082 }
4083
4084 /* Implement tc_regname_to_dw2regnum, to convert REGNAME to a DWARF-2
4085    register number.  */
4086 int
4087 nios2_regname_to_dw2regnum (char *regname)
4088 {
4089   struct nios2_reg *r = nios2_reg_lookup (regname);
4090   if (r == NULL)
4091     return -1;
4092   return r->index;
4093 }
4094
4095 /* Implement tc_cfi_frame_initial_instructions, to initialize the DWARF-2
4096    unwind information for this procedure.  */
4097 void
4098 nios2_frame_initial_instructions (void)
4099 {
4100   cfi_add_CFA_def_cfa (27, 0);
4101 }
4102
4103 #ifdef OBJ_ELF
4104 /* Some special processing for a Nios II ELF file.  */
4105
4106 void
4107 nios2_elf_final_processing (void)
4108 {
4109   elf_elfheader (stdoutput)->e_flags = nios2_architecture;
4110 }
4111 #endif