Initial import from FreeBSD RELENG_4:
[dragonfly.git] / contrib / binutils / gas / config / tc-arc.c
1 /* tc-arc.c -- Assembler for the ARC
2    Copyright 1994, 1995, 1997, 1999, 2000, 2001
3    Free Software Foundation, Inc.
4    Contributed by Doug Evans (dje@cygnus.com).
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 2, 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, 59 Temple Place - Suite 330, Boston, MA
21    02111-1307, USA.  */
22
23 #include <stdio.h>
24 #include "libiberty.h"
25 #include "as.h"
26 #include "safe-ctype.h"
27 #include "subsegs.h"
28 #include "opcode/arc.h"
29 #include "../opcodes/arc-ext.h"
30 #include "elf/arc.h"
31 #include "dwarf2dbg.h"
32
33 extern int arc_get_mach PARAMS ((char *));
34 extern int arc_operand_type PARAMS ((int));
35 extern int arc_insn_not_jl PARAMS ((arc_insn));
36 extern int arc_limm_fixup_adjust PARAMS ((arc_insn));
37 extern int arc_get_noshortcut_flag PARAMS ((void));
38 extern int arc_set_ext_seg PARAMS ((void));
39 extern void arc_code_symbol PARAMS ((expressionS *));
40
41 static arc_insn arc_insert_operand PARAMS ((arc_insn,
42                                             const struct arc_operand *, int,
43                                             const struct arc_operand_value *,
44                                             offsetT, char *, unsigned int));
45 static void arc_common PARAMS ((int));
46 static void arc_extinst PARAMS ((int));
47 static void arc_extoper PARAMS ((int));
48 static void arc_option PARAMS ((int));
49 static int  get_arc_exp_reloc_type PARAMS ((int, int, expressionS *,
50                                            expressionS *));
51
52 static void init_opcode_tables PARAMS ((int));
53
54 const struct suffix_classes {
55   char *name;
56   int  len;
57 } suffixclass[] = {
58   { "SUFFIX_COND|SUFFIX_FLAG",23 },
59   { "SUFFIX_FLAG", 11 },
60   { "SUFFIX_COND", 11 },
61   { "SUFFIX_NONE", 11 }
62 };
63
64 #define MAXSUFFIXCLASS (sizeof (suffixclass) / sizeof (struct suffix_classes))
65
66 const struct syntax_classes {
67   char *name;
68   int  len;
69   int  class;
70 } syntaxclass[] = {
71   { "SYNTAX_3OP|OP1_MUST_BE_IMM", 26, SYNTAX_3OP|OP1_MUST_BE_IMM|SYNTAX_VALID },
72   { "OP1_MUST_BE_IMM|SYNTAX_3OP", 26, OP1_MUST_BE_IMM|SYNTAX_3OP|SYNTAX_VALID },
73   { "SYNTAX_2OP|OP1_IMM_IMPLIED", 26, SYNTAX_2OP|OP1_IMM_IMPLIED|SYNTAX_VALID },
74   { "OP1_IMM_IMPLIED|SYNTAX_2OP", 26, OP1_IMM_IMPLIED|SYNTAX_2OP|SYNTAX_VALID },
75   { "SYNTAX_3OP",                 10, SYNTAX_3OP|SYNTAX_VALID },
76   { "SYNTAX_2OP",                 10, SYNTAX_2OP|SYNTAX_VALID }
77 };
78
79 #define MAXSYNTAXCLASS (sizeof (syntaxclass) / sizeof (struct syntax_classes))
80
81 const pseudo_typeS md_pseudo_table[] = {
82   { "align", s_align_bytes, 0 }, /* Defaulting is invalid (0).  */
83   { "comm", arc_common, 0 },
84   { "common", arc_common, 0 },
85   { "lcomm", arc_common, 1 },
86   { "lcommon", arc_common, 1 },
87   { "2byte", cons, 2 },
88   { "half", cons, 2 },
89   { "short", cons, 2 },
90   { "3byte", cons, 3 },
91   { "4byte", cons, 4 },
92   { "word", cons, 4 },
93   { "option", arc_option, 0 },
94   { "cpu", arc_option, 0 },
95   { "block", s_space, 0 },
96   { "file", dwarf2_directive_file, 0 },
97   { "loc", dwarf2_directive_loc, 0 },
98   { "extcondcode", arc_extoper, 0 },
99   { "extcoreregister", arc_extoper, 1 },
100   { "extauxregister", arc_extoper, 2 },
101   { "extinstruction", arc_extinst, 0 },
102   { NULL, 0, 0 },
103 };
104
105 /* This array holds the chars that always start a comment.  If the
106    pre-processor is disabled, these aren't very useful.  */
107 const char comment_chars[] = "#;";
108
109 /* This array holds the chars that only start a comment at the beginning of
110    a line.  If the line seems to have the form '# 123 filename'
111    .line and .file directives will appear in the pre-processed output */
112 /* Note that input_file.c hand checks for '#' at the beginning of the
113    first line of the input file.  This is because the compiler outputs
114    #NO_APP at the beginning of its output.  */
115 /* Also note that comments started like this one will always
116    work if '/' isn't otherwise defined.  */
117 const char line_comment_chars[] = "#";
118
119 const char line_separator_chars[] = "";
120
121 /* Chars that can be used to separate mant from exp in floating point nums.  */
122 const char EXP_CHARS[] = "eE";
123
124 /* Chars that mean this number is a floating point constant
125    As in 0f12.456 or 0d1.2345e12.  */
126 const char FLT_CHARS[] = "rRsSfFdD";
127
128 /* Byte order.  */
129 extern int target_big_endian;
130 const char *arc_target_format = DEFAULT_TARGET_FORMAT;
131 static int byte_order = DEFAULT_BYTE_ORDER;
132
133 static segT arcext_section;
134
135 /* One of bfd_mach_arc_n.  */
136 static int arc_mach_type = bfd_mach_arc_6;
137
138 /* Non-zero if the cpu type has been explicitly specified.  */
139 static int mach_type_specified_p = 0;
140
141 /* Non-zero if opcode tables have been initialized.
142    A .option command must appear before any instructions.  */
143 static int cpu_tables_init_p = 0;
144
145 static struct hash_control *arc_suffix_hash = NULL;
146 \f
147 const char *md_shortopts = "";
148 struct option md_longopts[] = {
149 #define OPTION_EB (OPTION_MD_BASE + 0)
150   { "EB", no_argument, NULL, OPTION_EB },
151 #define OPTION_EL (OPTION_MD_BASE + 1)
152   { "EL", no_argument, NULL, OPTION_EL },
153 #define OPTION_ARC5 (OPTION_MD_BASE + 2)
154   { "marc5", no_argument, NULL, OPTION_ARC5 },
155   { "pre-v6", no_argument, NULL, OPTION_ARC5 },
156 #define OPTION_ARC6 (OPTION_MD_BASE + 3)
157   { "marc6", no_argument, NULL, OPTION_ARC6 },
158 #define OPTION_ARC7 (OPTION_MD_BASE + 4)
159   { "marc7", no_argument, NULL, OPTION_ARC7 },
160 #define OPTION_ARC8 (OPTION_MD_BASE + 5)
161   { "marc8", no_argument, NULL, OPTION_ARC8 },
162 #define OPTION_ARC (OPTION_MD_BASE + 6)
163   { "marc", no_argument, NULL, OPTION_ARC },
164   { NULL, no_argument, NULL, 0 }
165 };
166 size_t md_longopts_size = sizeof (md_longopts);
167
168 #define IS_SYMBOL_OPERAND(o) \
169  ((o) == 'b' || (o) == 'c' || (o) == 's' || (o) == 'o' || (o) == 'O')
170
171 struct arc_operand_value *get_ext_suffix (char *s);
172
173 /* Invocation line includes a switch not recognized by the base assembler.
174    See if it's a processor-specific option.  */
175
176 int
177 md_parse_option (c, arg)
178      int c;
179      char *arg ATTRIBUTE_UNUSED;
180 {
181   switch (c)
182     {
183     case OPTION_ARC5:
184       arc_mach_type = bfd_mach_arc_5;
185       break;
186     case OPTION_ARC:
187     case OPTION_ARC6:
188       arc_mach_type = bfd_mach_arc_6;
189       break;
190     case OPTION_ARC7:
191       arc_mach_type = bfd_mach_arc_7;
192       break;
193     case OPTION_ARC8:
194       arc_mach_type = bfd_mach_arc_8;
195       break;
196     case OPTION_EB:
197       byte_order = BIG_ENDIAN;
198       arc_target_format = "elf32-bigarc";
199       break;
200     case OPTION_EL:
201       byte_order = LITTLE_ENDIAN;
202       arc_target_format = "elf32-littlearc";
203       break;
204     default:
205       return 0;
206     }
207   return 1;
208 }
209
210 void
211 md_show_usage (stream)
212      FILE *stream;
213 {
214   fprintf (stream, "\
215 ARC Options:\n\
216   -marc[5|6|7|8]          select processor variant (default arc%d)\n\
217   -EB                     assemble code for a big endian cpu\n\
218   -EL                     assemble code for a little endian cpu\n", arc_mach_type + 5);
219 }
220
221 /* This function is called once, at assembler startup time.  It should
222    set up all the tables, etc. that the MD part of the assembler will need.
223    Opcode selection is deferred until later because we might see a .option
224    command.  */
225
226 void
227 md_begin ()
228 {
229   /* The endianness can be chosen "at the factory".  */
230   target_big_endian = byte_order == BIG_ENDIAN;
231
232   if (!bfd_set_arch_mach (stdoutput, bfd_arch_arc, arc_mach_type))
233     as_warn ("could not set architecture and machine");
234
235   /* This call is necessary because we need to initialize `arc_operand_map'
236      which may be needed before we see the first insn.  */
237   arc_opcode_init_tables (arc_get_opcode_mach (arc_mach_type,
238                                                target_big_endian));
239 }
240
241 /* Initialize the various opcode and operand tables.
242    MACH is one of bfd_mach_arc_xxx.  */
243 static void
244 init_opcode_tables (mach)
245      int mach;
246 {
247   int i;
248   char *last;
249
250   if ((arc_suffix_hash = hash_new ()) == NULL)
251     as_fatal ("virtual memory exhausted");
252
253   if (!bfd_set_arch_mach (stdoutput, bfd_arch_arc, mach))
254     as_warn ("could not set architecture and machine");
255
256   /* This initializes a few things in arc-opc.c that we need.
257      This must be called before the various arc_xxx_supported fns.  */
258   arc_opcode_init_tables (arc_get_opcode_mach (mach, target_big_endian));
259
260   /* Only put the first entry of each equivalently named suffix in the
261      table.  */
262   last = "";
263   for (i = 0; i < arc_suffixes_count; i++)
264     {
265       if (strcmp (arc_suffixes[i].name, last) != 0)
266         hash_insert (arc_suffix_hash, arc_suffixes[i].name, (PTR) (arc_suffixes + i));
267       last = arc_suffixes[i].name;
268     }
269
270   /* Since registers don't have a prefix, we put them in the symbol table so
271      they can't be used as symbols.  This also simplifies argument parsing as
272      we can let gas parse registers for us.  The recorded register number is
273      the address of the register's entry in arc_reg_names.
274
275      If the register name is already in the table, then the existing
276      definition is assumed to be from an .ExtCoreRegister pseudo-op.  */
277
278   for (i = 0; i < arc_reg_names_count; i++)
279     {
280       if (symbol_find (arc_reg_names[i].name))
281         continue;
282       /* Use symbol_create here instead of symbol_new so we don't try to
283          output registers into the object file's symbol table.  */
284       symbol_table_insert (symbol_create (arc_reg_names[i].name,
285                                           reg_section,
286                                           (int) &arc_reg_names[i],
287                                           &zero_address_frag));
288     }
289
290   /* Tell `.option' it's too late.  */
291   cpu_tables_init_p = 1;
292 }
293 \f
294 /* Insert an operand value into an instruction.
295    If REG is non-NULL, it is a register number and ignore VAL.  */
296
297 static arc_insn
298 arc_insert_operand (insn, operand, mods, reg, val, file, line)
299      arc_insn insn;
300      const struct arc_operand *operand;
301      int mods;
302      const struct arc_operand_value *reg;
303      offsetT val;
304      char *file;
305      unsigned int line;
306 {
307   if (operand->bits != 32)
308     {
309       long min, max;
310       offsetT test;
311
312       if ((operand->flags & ARC_OPERAND_SIGNED) != 0)
313         {
314           if ((operand->flags & ARC_OPERAND_SIGNOPT) != 0)
315             max = (1 << operand->bits) - 1;
316           else
317             max = (1 << (operand->bits - 1)) - 1;
318           min = - (1 << (operand->bits - 1));
319         }
320       else
321         {
322           max = (1 << operand->bits) - 1;
323           min = 0;
324         }
325
326       if ((operand->flags & ARC_OPERAND_NEGATIVE) != 0)
327         test = - val;
328       else
329         test = val;
330
331       if (test < (offsetT) min || test > (offsetT) max)
332         {
333           const char *err =
334             "operand out of range (%s not between %ld and %ld)";
335           char buf[100];
336
337           sprint_value (buf, test);
338           if (file == (char *) NULL)
339             as_warn (err, buf, min, max);
340           else
341             as_warn_where (file, line, err, buf, min, max);
342         }
343     }
344
345   if (operand->insert)
346     {
347       const char *errmsg;
348
349       errmsg = NULL;
350       insn = (*operand->insert) (insn, operand, mods, reg, (long) val, &errmsg);
351       if (errmsg != (const char *) NULL)
352         as_warn (errmsg);
353     }
354   else
355     insn |= (((long) val & ((1 << operand->bits) - 1))
356              << operand->shift);
357
358   return insn;
359 }
360
361 /* We need to keep a list of fixups.  We can't simply generate them as
362    we go, because that would require us to first create the frag, and
363    that would screw up references to ``.''.  */
364
365 struct arc_fixup {
366   /* index into `arc_operands'  */
367   int opindex;
368   expressionS exp;
369 };
370
371 #define MAX_FIXUPS 5
372
373 #define MAX_SUFFIXES 5
374
375 /* This routine is called for each instruction to be assembled.  */
376
377 void
378 md_assemble (str)
379      char *str;
380 {
381   const struct arc_opcode *opcode;
382   const struct arc_opcode *std_opcode;
383   struct arc_opcode *ext_opcode;
384   char *start;
385   const char *last_errmsg = 0;
386   arc_insn insn;
387   static int init_tables_p = 0;
388
389   /* Opcode table initialization is deferred until here because we have to
390      wait for a possible .option command.  */
391   if (!init_tables_p)
392     {
393       init_opcode_tables (arc_mach_type);
394       init_tables_p = 1;
395     }
396
397   /* Skip leading white space.  */
398   while (ISSPACE (*str))
399     str++;
400
401   /* The instructions are stored in lists hashed by the first letter (though
402      we needn't care how they're hashed).  Get the first in the list.  */
403
404   ext_opcode = arc_ext_opcodes;
405   std_opcode = arc_opcode_lookup_asm (str);
406
407   /* Keep looking until we find a match.  */
408
409   start = str;
410   for (opcode = (ext_opcode ? ext_opcode : std_opcode);
411        opcode != NULL;
412        opcode = (ARC_OPCODE_NEXT_ASM (opcode)
413                  ? ARC_OPCODE_NEXT_ASM (opcode)
414                  : (ext_opcode ? ext_opcode = NULL, std_opcode : NULL)))
415     {
416       int past_opcode_p, fc, num_suffixes;
417       int fix_up_at = 0;
418       char *syn;
419       struct arc_fixup fixups[MAX_FIXUPS];
420       /* Used as a sanity check.  If we need a limm reloc, make sure we ask
421          for an extra 4 bytes from frag_more.  */
422       int limm_reloc_p;
423       int ext_suffix_p;
424       const struct arc_operand_value *insn_suffixes[MAX_SUFFIXES];
425
426       /* Is this opcode supported by the selected cpu?  */
427       if (! arc_opcode_supported (opcode))
428         continue;
429
430       /* Scan the syntax string.  If it doesn't match, try the next one.  */
431
432       arc_opcode_init_insert ();
433       insn = opcode->value;
434       fc = 0;
435       past_opcode_p = 0;
436       num_suffixes = 0;
437       limm_reloc_p = 0;
438       ext_suffix_p = 0;
439
440       /* We don't check for (*str != '\0') here because we want to parse
441          any trailing fake arguments in the syntax string.  */
442       for (str = start, syn = opcode->syntax; *syn != '\0';)
443         {
444           int mods;
445           const struct arc_operand *operand;
446
447           /* Non operand chars must match exactly.  */
448           if (*syn != '%' || *++syn == '%')
449             {
450               /* Handle '+' specially as we want to allow "ld r0,[sp-4]".  */
451               /* ??? The syntax has changed to [sp,-4].  */
452               if (0 && *syn == '+' && *str == '-')
453                 {
454                   /* Skip over syn's +, but leave str's - alone.
455                      That makes the case identical to "ld r0,[sp+-4]".  */
456                   ++syn;
457                 }
458               else if (*str == *syn)
459                 {
460                   if (*syn == ' ')
461                     past_opcode_p = 1;
462                   ++syn;
463                   ++str;
464                 }
465               else
466                 break;
467               continue;
468             }
469
470           /* We have an operand.  Pick out any modifiers.  */
471           mods = 0;
472           while (ARC_MOD_P (arc_operands[arc_operand_map[(int) *syn]].flags))
473             {
474               mods |= arc_operands[arc_operand_map[(int) *syn]].flags & ARC_MOD_BITS;
475               ++syn;
476             }
477           operand = arc_operands + arc_operand_map[(int) *syn];
478           if (operand->fmt == 0)
479             as_fatal ("unknown syntax format character `%c'", *syn);
480
481           if (operand->flags & ARC_OPERAND_FAKE)
482             {
483               const char *errmsg = NULL;
484               if (operand->insert)
485                 {
486                   insn = (*operand->insert) (insn, operand, mods, NULL, 0, &errmsg);
487                   if (errmsg != (const char *) NULL)
488                     {
489                       last_errmsg = errmsg;
490                       if (operand->flags & ARC_OPERAND_ERROR)
491                         {
492                           as_bad (errmsg);
493                           return;
494                         }
495                       else if (operand->flags & ARC_OPERAND_WARN)
496                         as_warn (errmsg);
497                       break;
498                     }
499                   if (limm_reloc_p
500                       && (operand->flags && operand->flags & ARC_OPERAND_LIMM)
501                       && (operand->flags &
502                           (ARC_OPERAND_ABSOLUTE_BRANCH | ARC_OPERAND_ADDRESS)))
503                     {
504                       fixups[fix_up_at].opindex = arc_operand_map[operand->fmt];
505                     }
506                 }
507               ++syn;
508             }
509           /* Are we finished with suffixes?  */
510           else if (!past_opcode_p)
511             {
512               int found;
513               char c;
514               char *s, *t;
515               const struct arc_operand_value *suf, *suffix_end;
516               const struct arc_operand_value *suffix = NULL;
517
518               if (!(operand->flags & ARC_OPERAND_SUFFIX))
519                 abort ();
520
521               /* If we're at a space in the input string, we want to skip the
522                  remaining suffixes.  There may be some fake ones though, so
523                  just go on to try the next one.  */
524               if (*str == ' ')
525                 {
526                   ++syn;
527                   continue;
528                 }
529
530               s = str;
531               if (mods & ARC_MOD_DOT)
532                 {
533                   if (*s != '.')
534                     break;
535                   ++s;
536                 }
537               else
538                 {
539                   /* This can happen in "b.nd foo" and we're currently looking
540                      for "%q" (ie: a condition code suffix).  */
541                   if (*s == '.')
542                     {
543                       ++syn;
544                       continue;
545                     }
546                 }
547
548               /* Pick the suffix out and look it up via the hash table.  */
549               for (t = s; *t && ISALNUM (*t); ++t)
550                 continue;
551               c = *t;
552               *t = '\0';
553               if ((suf = get_ext_suffix (s)))
554                 ext_suffix_p = 1;
555               else
556                 suf = hash_find (arc_suffix_hash, s);
557               if (!suf)
558                 {
559                   /* This can happen in "blle foo" and we're currently using
560                      the template "b%q%.n %j".  The "bl" insn occurs later in
561                      the table so "lle" isn't an illegal suffix.  */
562                   *t = c;
563                   break;
564                 }
565
566               /* Is it the right type?  Note that the same character is used
567                  several times, so we have to examine all of them.  This is
568                  relatively efficient as equivalent entries are kept
569                  together.  If it's not the right type, don't increment `str'
570                  so we try the next one in the series.  */
571               found = 0;
572               if (ext_suffix_p && arc_operands[suf->type].fmt == *syn)
573                 {
574                   /* Insert the suffix's value into the insn.  */
575                   *t = c;
576                   if (operand->insert)
577                     insn = (*operand->insert) (insn, operand,
578                                                mods, NULL, suf->value,
579                                                NULL);
580                   else
581                     insn |= suf->value << operand->shift;
582
583                   str = t;
584                   found = 1;
585                 }
586               else
587                 {
588                   *t = c;
589                   suffix_end = arc_suffixes + arc_suffixes_count;
590                   for (suffix = suf;
591                        suffix < suffix_end && strcmp (suffix->name, suf->name) == 0;
592                        ++suffix)
593                     {
594                       if (arc_operands[suffix->type].fmt == *syn)
595                         {
596                           /* Insert the suffix's value into the insn.  */
597                           if (operand->insert)
598                             insn = (*operand->insert) (insn, operand,
599                                                        mods, NULL, suffix->value,
600                                                        NULL);
601                           else
602                             insn |= suffix->value << operand->shift;
603
604                           str = t;
605                           found = 1;
606                           break;
607                         }
608                     }
609                 }
610               ++syn;
611               if (!found)
612                 /* Wrong type.  Just go on to try next insn entry.  */
613                 ;
614               else
615                 {
616                   if (num_suffixes == MAX_SUFFIXES)
617                     as_bad ("too many suffixes");
618                   else
619                     insn_suffixes[num_suffixes++] = suffix;
620                 }
621             }
622           else
623             /* This is either a register or an expression of some kind.  */
624             {
625               char *hold;
626               const struct arc_operand_value *reg = NULL;
627               long value = 0;
628               expressionS exp;
629
630               if (operand->flags & ARC_OPERAND_SUFFIX)
631                 abort ();
632
633               /* Is there anything left to parse?
634                  We don't check for this at the top because we want to parse
635                  any trailing fake arguments in the syntax string.  */
636               if (is_end_of_line[(unsigned char) *str])
637                 break;
638
639               /* Parse the operand.  */
640               hold = input_line_pointer;
641               input_line_pointer = str;
642               expression (&exp);
643               str = input_line_pointer;
644               input_line_pointer = hold;
645
646               if (exp.X_op == O_illegal)
647                 as_bad ("illegal operand");
648               else if (exp.X_op == O_absent)
649                 as_bad ("missing operand");
650               else if (exp.X_op == O_constant)
651                 {
652                   value = exp.X_add_number;
653                 }
654               else if (exp.X_op == O_register)
655                 {
656                   reg = (struct arc_operand_value *) exp.X_add_number;
657                 }
658 #define IS_REG_DEST_OPERAND(o) ((o) == 'a')
659               else if (IS_REG_DEST_OPERAND (*syn))
660                 as_bad ("symbol as destination register");
661               else
662                 {
663                   if (!strncmp (str, "@h30", 4))
664                     {
665                       arc_code_symbol (&exp);
666                       str += 4;
667                     }
668                   /* We need to generate a fixup for this expression.  */
669                   if (fc >= MAX_FIXUPS)
670                     as_fatal ("too many fixups");
671                   fixups[fc].exp = exp;
672                   /* We don't support shimm relocs. break here to force
673                      the assembler to output a limm.  */
674 #define IS_REG_SHIMM_OFFSET(o) ((o) == 'd')
675                   if (IS_REG_SHIMM_OFFSET (*syn))
676                     break;
677                   /* If this is a register constant (IE: one whose
678                      register value gets stored as 61-63) then this
679                      must be a limm.  */
680                   /* ??? This bit could use some cleaning up.
681                      Referencing the format chars like this goes
682                      against style.  */
683                   if (IS_SYMBOL_OPERAND (*syn))
684                     {
685                       const char *junk;
686                       limm_reloc_p = 1;
687                       /* Save this, we don't yet know what reloc to use.  */
688                       fix_up_at = fc;
689                       /* Tell insert_reg we need a limm.  This is
690                          needed because the value at this point is
691                          zero, a shimm.  */
692                       /* ??? We need a cleaner interface than this.  */
693                       (*arc_operands[arc_operand_map['Q']].insert)
694                         (insn, operand, mods, reg, 0L, &junk);
695                     }
696                   else
697                     fixups[fc].opindex = arc_operand_map[(int) *syn];
698                   ++fc;
699                   value = 0;
700                 }
701
702               /* Insert the register or expression into the instruction.  */
703               if (operand->insert)
704                 {
705                   const char *errmsg = NULL;
706                   insn = (*operand->insert) (insn, operand, mods,
707                                              reg, (long) value, &errmsg);
708                   if (errmsg != (const char *) NULL)
709                     {
710                       last_errmsg = errmsg;
711                       if (operand->flags & ARC_OPERAND_ERROR)
712                         {
713                           as_bad (errmsg);
714                           return;
715                         }
716                       else if (operand->flags & ARC_OPERAND_WARN)
717                         as_warn (errmsg);
718                       break;
719                     }
720                 }
721               else
722                 insn |= (value & ((1 << operand->bits) - 1)) << operand->shift;
723
724               ++syn;
725             }
726         }
727
728       /* If we're at the end of the syntax string, we're done.  */
729       /* FIXME: try to move this to a separate function.  */
730       if (*syn == '\0')
731         {
732           int i;
733           char *f;
734           long limm, limm_p;
735
736           /* For the moment we assume a valid `str' can only contain blanks
737              now.  IE: We needn't try again with a longer version of the
738              insn and it is assumed that longer versions of insns appear
739              before shorter ones (eg: lsr r2,r3,1 vs lsr r2,r3).  */
740
741           while (ISSPACE (*str))
742             ++str;
743
744           if (!is_end_of_line[(unsigned char) *str])
745             as_bad ("junk at end of line: `%s'", str);
746
747           /* Is there a limm value?  */
748           limm_p = arc_opcode_limm_p (&limm);
749
750           /* Perform various error and warning tests.  */
751
752           {
753             static int in_delay_slot_p = 0;
754             static int prev_insn_needs_cc_nop_p = 0;
755             /* delay slot type seen */
756             int delay_slot_type = ARC_DELAY_NONE;
757             /* conditional execution flag seen */
758             int conditional = 0;
759             /* 1 if condition codes are being set */
760             int cc_set_p = 0;
761             /* 1 if conditional branch, including `b' "branch always" */
762             int cond_branch_p = opcode->flags & ARC_OPCODE_COND_BRANCH;
763
764             for (i = 0; i < num_suffixes; ++i)
765               {
766                 switch (arc_operands[insn_suffixes[i]->type].fmt)
767                   {
768                   case 'n':
769                     delay_slot_type = insn_suffixes[i]->value;
770                     break;
771                   case 'q':
772                     conditional = insn_suffixes[i]->value;
773                     break;
774                   case 'f':
775                     cc_set_p = 1;
776                     break;
777                   }
778               }
779
780             /* Putting an insn with a limm value in a delay slot is supposed to
781                be legal, but let's warn the user anyway.  Ditto for 8 byte
782                jumps with delay slots.  */
783             if (in_delay_slot_p && limm_p)
784               as_warn ("8 byte instruction in delay slot");
785             if (delay_slot_type != ARC_DELAY_NONE
786                 && limm_p && arc_insn_not_jl (insn)) /* except for jl  addr */
787               as_warn ("8 byte jump instruction with delay slot");
788             in_delay_slot_p = (delay_slot_type != ARC_DELAY_NONE) && !limm_p;
789
790             /* Warn when a conditional branch immediately follows a set of
791                the condition codes.  Note that this needn't be done if the
792                insn that sets the condition codes uses a limm.  */
793             if (cond_branch_p && conditional != 0 /* 0 = "always" */
794                 && prev_insn_needs_cc_nop_p && arc_mach_type == bfd_mach_arc_5)
795               as_warn ("conditional branch follows set of flags");
796             prev_insn_needs_cc_nop_p =
797               /* FIXME: ??? not required:
798                  (delay_slot_type != ARC_DELAY_NONE) &&  */
799               cc_set_p && !limm_p;
800           }
801
802           /* Write out the instruction.
803              It is important to fetch enough space in one call to `frag_more'.
804              We use (f - frag_now->fr_literal) to compute where we are and we
805              don't want frag_now to change between calls.  */
806           if (limm_p)
807             {
808               f = frag_more (8);
809               md_number_to_chars (f, insn, 4);
810               md_number_to_chars (f + 4, limm, 4);
811               dwarf2_emit_insn (8);
812             }
813           else if (limm_reloc_p)
814             {
815               /* We need a limm reloc, but the tables think we don't.  */
816               abort ();
817             }
818           else
819             {
820               f = frag_more (4);
821               md_number_to_chars (f, insn, 4);
822               dwarf2_emit_insn (4);
823             }
824
825           /* Create any fixups.  */
826           for (i = 0; i < fc; ++i)
827             {
828               int op_type, reloc_type;
829               expressionS exptmp;
830               const struct arc_operand *operand;
831
832               /* Create a fixup for this operand.
833                  At this point we do not use a bfd_reloc_code_real_type for
834                  operands residing in the insn, but instead just use the
835                  operand index.  This lets us easily handle fixups for any
836                  operand type, although that is admittedly not a very exciting
837                  feature.  We pick a BFD reloc type in md_apply_fix3.
838
839                  Limm values (4 byte immediate "constants") must be treated
840                  normally because they're not part of the actual insn word
841                  and thus the insertion routines don't handle them.  */
842
843               if (arc_operands[fixups[i].opindex].flags & ARC_OPERAND_LIMM)
844                 {
845                   /* Modify the fixup addend as required by the cpu.  */
846                   fixups[i].exp.X_add_number += arc_limm_fixup_adjust (insn);
847                   op_type = fixups[i].opindex;
848                   /* FIXME: can we add this data to the operand table?  */
849                   if (op_type == arc_operand_map['L']
850                       || op_type == arc_operand_map['s']
851                       || op_type == arc_operand_map['o']
852                       || op_type == arc_operand_map['O'])
853                     reloc_type = BFD_RELOC_32;
854                   else if (op_type == arc_operand_map['J'])
855                     reloc_type = BFD_RELOC_ARC_B26;
856                   else
857                     abort ();
858                   reloc_type = get_arc_exp_reloc_type (1, reloc_type,
859                                                        &fixups[i].exp,
860                                                        &exptmp);
861                 }
862               else
863                 {
864                   op_type = get_arc_exp_reloc_type (0, fixups[i].opindex,
865                                                     &fixups[i].exp, &exptmp);
866                   reloc_type = op_type + (int) BFD_RELOC_UNUSED;
867                 }
868               operand = &arc_operands[op_type];
869               fix_new_exp (frag_now,
870                            ((f - frag_now->fr_literal)
871                             + (operand->flags & ARC_OPERAND_LIMM ? 4 : 0)), 4,
872                            &exptmp,
873                            (operand->flags & ARC_OPERAND_RELATIVE_BRANCH) != 0,
874                            (bfd_reloc_code_real_type) reloc_type);
875             }
876
877           /* All done.  */
878           return;
879         }
880
881       /* Try the next entry.  */
882     }
883
884   if (NULL == last_errmsg)
885     as_bad ("bad instruction `%s'", start);
886   else
887     as_bad (last_errmsg);
888 }
889 \f
890 static void
891 arc_extoper (opertype)
892      int opertype;
893 {
894   char *name;
895   char *mode;
896   char c;
897   char *p;
898   int imode = 0;
899   int number;
900   struct arc_ext_operand_value *ext_oper;
901   symbolS *symbolP;
902
903   segT old_sec;
904   int old_subsec;
905
906   name = input_line_pointer;
907   c = get_symbol_end ();
908   name = xstrdup (name);
909   if (NULL == name)
910     {
911       ignore_rest_of_line ();
912       return;
913     }
914
915   p = name;
916   while (*p)
917     {
918       *p = TOLOWER (*p);
919       p++;
920     }
921
922   /* just after name is now '\0'  */
923   p = input_line_pointer;
924   *p = c;
925   SKIP_WHITESPACE ();
926
927   if (*input_line_pointer != ',')
928     {
929       as_bad ("expected comma after operand name");
930       ignore_rest_of_line ();
931       free (name);
932       return;
933     }
934
935   input_line_pointer++;         /* skip ','  */
936   number = get_absolute_expression ();
937
938   if (number < 0)
939     {
940       as_bad ("negative operand number %d", number);
941       ignore_rest_of_line ();
942       free (name);
943       return;
944     }
945
946   if (opertype)
947     {
948       SKIP_WHITESPACE ();
949
950       if (*input_line_pointer != ',')
951         {
952           as_bad ("expected comma after register-number");
953           ignore_rest_of_line ();
954           free (name);
955           return;
956         }
957
958       input_line_pointer++;             /* skip ','  */
959       mode = input_line_pointer;
960
961       if (!strncmp (mode, "r|w", 3))
962         {
963           imode = 0;
964           input_line_pointer += 3;
965         }
966       else
967         {
968           if (!strncmp (mode, "r", 1))
969             {
970               imode = ARC_REGISTER_READONLY;
971               input_line_pointer += 1;
972             }
973           else
974             {
975               if (strncmp (mode, "w", 1))
976                 {
977                   as_bad ("invalid mode");
978                   ignore_rest_of_line ();
979                   free (name);
980                   return;
981                 }
982               else
983                 {
984                   imode = ARC_REGISTER_WRITEONLY;
985                   input_line_pointer += 1;
986                 }
987             }
988         }
989       SKIP_WHITESPACE ();
990       if (1 == opertype)
991         {
992           if (*input_line_pointer != ',')
993             {
994               as_bad ("expected comma after register-mode");
995               ignore_rest_of_line ();
996               free (name);
997               return;
998             }
999
1000           input_line_pointer++;         /* skip ','  */
1001
1002           if (!strncmp (input_line_pointer, "cannot_shortcut", 15))
1003             {
1004               imode |= arc_get_noshortcut_flag ();
1005               input_line_pointer += 15;
1006             }
1007           else
1008             {
1009               if (strncmp (input_line_pointer, "can_shortcut", 12))
1010                 {
1011                   as_bad ("shortcut designator invalid");
1012                   ignore_rest_of_line ();
1013                   free (name);
1014                   return;
1015                 }
1016               else
1017                 {
1018                   input_line_pointer += 12;
1019                 }
1020             }
1021         }
1022     }
1023
1024   if ((opertype == 1) && number > 60)
1025     {
1026       as_bad ("core register value (%d) too large", number);
1027       ignore_rest_of_line ();
1028       free (name);
1029       return;
1030     }
1031
1032   if ((opertype == 0) && number > 31)
1033     {
1034       as_bad ("condition code value (%d) too large", number);
1035       ignore_rest_of_line ();
1036       free (name);
1037       return;
1038     }
1039
1040   ext_oper = (struct arc_ext_operand_value *) \
1041     xmalloc (sizeof (struct arc_ext_operand_value));
1042
1043   if (opertype)
1044     {
1045       /* If the symbol already exists, point it at the new definition.  */
1046       if ((symbolP = symbol_find (name)))
1047         {
1048           if (S_GET_SEGMENT (symbolP) == reg_section)
1049             S_SET_VALUE (symbolP, (int) &ext_oper->operand);
1050           else
1051             {
1052               as_bad ("attempt to override symbol: %s", name);
1053               ignore_rest_of_line ();
1054               free (name);
1055               free (ext_oper);
1056               return;
1057             }
1058         }
1059       else
1060         {
1061           /* If its not there, add it.  */
1062           symbol_table_insert (symbol_create (name, reg_section,
1063                                               (int) &ext_oper->operand, &zero_address_frag));
1064         }
1065     }
1066
1067   ext_oper->operand.name  = name;
1068   ext_oper->operand.value = number;
1069   ext_oper->operand.type  = arc_operand_type (opertype);
1070   ext_oper->operand.flags = imode;
1071
1072   ext_oper->next = arc_ext_operands;
1073   arc_ext_operands = ext_oper;
1074
1075   /* OK, now that we know what this operand is, put a description in
1076      the arc extension section of the output file.  */
1077
1078   old_sec    = now_seg;
1079   old_subsec = now_subseg;
1080
1081   arc_set_ext_seg ();
1082
1083   switch (opertype)
1084     {
1085     case 0:
1086       p = frag_more (1);
1087       *p = 3 + strlen (name) + 1;
1088       p = frag_more (1);
1089       *p = EXT_COND_CODE;
1090       p = frag_more (1);
1091       *p = number;
1092       p = frag_more (strlen (name) + 1);
1093       strcpy (p, name);
1094       break;
1095     case 1:
1096       p = frag_more (1);
1097       *p = 3 + strlen (name) + 1;
1098       p = frag_more (1);
1099       *p = EXT_CORE_REGISTER;
1100       p = frag_more (1);
1101       *p = number;
1102       p = frag_more (strlen (name) + 1);
1103       strcpy (p, name);
1104       break;
1105     case 2:
1106       p = frag_more (1);
1107       *p = 6 + strlen (name) + 1;
1108       p = frag_more (1);
1109       *p = EXT_AUX_REGISTER;
1110       p = frag_more (1);
1111       *p = number >> 24 & 0xff;
1112       p = frag_more (1);
1113       *p = number >> 16 & 0xff;
1114       p = frag_more (1);
1115       *p = number >>  8 & 0xff;
1116       p = frag_more (1);
1117       *p = number       & 0xff;
1118       p = frag_more (strlen (name) + 1);
1119       strcpy (p, name);
1120       break;
1121     default:
1122       as_bad ("invalid opertype");
1123       ignore_rest_of_line ();
1124       free (name);
1125       return;
1126       break;
1127     }
1128
1129   subseg_set (old_sec, old_subsec);
1130
1131   /* Enter all registers into the symbol table.  */
1132
1133   demand_empty_rest_of_line ();
1134 }
1135
1136 static void
1137 arc_extinst (ignore)
1138      int ignore ATTRIBUTE_UNUSED;
1139 {
1140   unsigned char syntax[129];
1141   char *name;
1142   char *p;
1143   char c;
1144   int suffixcode = -1;
1145   int opcode, subopcode;
1146   int i;
1147   int class = 0;
1148   int name_len;
1149   struct arc_opcode *ext_op;
1150
1151   segT old_sec;
1152   int old_subsec;
1153
1154   name = input_line_pointer;
1155   c = get_symbol_end ();
1156   name = xstrdup (name);
1157   if (NULL == name)
1158     {
1159       ignore_rest_of_line ();
1160       return;
1161     }
1162   strcpy (syntax, name);
1163   name_len = strlen (name);
1164
1165   /* just after name is now '\0'  */
1166   p = input_line_pointer;
1167   *p = c;
1168
1169   SKIP_WHITESPACE ();
1170
1171   if (*input_line_pointer != ',')
1172     {
1173       as_bad ("expected comma after operand name");
1174       ignore_rest_of_line ();
1175       return;
1176     }
1177
1178   input_line_pointer++;         /* skip ','  */
1179   opcode = get_absolute_expression ();
1180
1181   SKIP_WHITESPACE ();
1182
1183   if (*input_line_pointer != ',')
1184     {
1185       as_bad ("expected comma after opcode");
1186       ignore_rest_of_line ();
1187       return;
1188     }
1189
1190   input_line_pointer++;         /* skip ','  */
1191   subopcode = get_absolute_expression ();
1192
1193   if (subopcode < 0)
1194     {
1195       as_bad ("negative subopcode %d", subopcode);
1196       ignore_rest_of_line ();
1197       return;
1198     }
1199
1200   if (subopcode)
1201     {
1202       if (3 != opcode)
1203         {
1204           as_bad ("subcode value found when opcode not equal 0x03");
1205           ignore_rest_of_line ();
1206           return;
1207         }
1208       else
1209         {
1210           if (subopcode < 0x09 || subopcode == 0x3f)
1211             {
1212               as_bad ("invalid subopcode %d", subopcode);
1213               ignore_rest_of_line ();
1214               return;
1215             }
1216         }
1217     }
1218
1219   SKIP_WHITESPACE ();
1220
1221   if (*input_line_pointer != ',')
1222     {
1223       as_bad ("expected comma after subopcode");
1224       ignore_rest_of_line ();
1225       return;
1226     }
1227
1228   input_line_pointer++;         /* skip ','  */
1229
1230   for (i = 0; i < (int) MAXSUFFIXCLASS; i++)
1231     {
1232       if (!strncmp (suffixclass[i].name,input_line_pointer, suffixclass[i].len))
1233         {
1234           suffixcode = i;
1235           input_line_pointer += suffixclass[i].len;
1236           break;
1237         }
1238     }
1239
1240   if (-1 == suffixcode)
1241     {
1242       as_bad ("invalid suffix class");
1243       ignore_rest_of_line ();
1244       return;
1245     }
1246
1247   SKIP_WHITESPACE ();
1248
1249   if (*input_line_pointer != ',')
1250     {
1251       as_bad ("expected comma after suffix class");
1252       ignore_rest_of_line ();
1253       return;
1254     }
1255
1256   input_line_pointer++;         /* skip ','  */
1257
1258   for (i = 0; i < (int) MAXSYNTAXCLASS; i++)
1259     {
1260       if (!strncmp (syntaxclass[i].name,input_line_pointer, syntaxclass[i].len))
1261         {
1262           class = syntaxclass[i].class;
1263           input_line_pointer += syntaxclass[i].len;
1264           break;
1265         }
1266     }
1267
1268   if (0 == (SYNTAX_VALID & class))
1269     {
1270       as_bad ("invalid syntax class");
1271       ignore_rest_of_line ();
1272       return;
1273     }
1274
1275   if ((0x3 == opcode) & (class & SYNTAX_3OP))
1276     {
1277       as_bad ("opcode 0x3 and SYNTAX_3OP invalid");
1278       ignore_rest_of_line ();
1279       return;
1280     }
1281
1282   switch (suffixcode)
1283     {
1284     case 0:
1285       strcat (syntax, "%.q%.f ");
1286       break;
1287     case 1:
1288       strcat (syntax, "%.f ");
1289       break;
1290     case 2:
1291       strcat (syntax, "%.q ");
1292       break;
1293     case 3:
1294       strcat (syntax, " ");
1295       break;
1296     default:
1297       as_bad ("unknown suffix class");
1298       ignore_rest_of_line ();
1299       return;
1300       break;
1301     };
1302
1303   strcat (syntax, ((opcode == 0x3) ? "%a,%b" : ((class & SYNTAX_3OP) ? "%a,%b,%c" : "%b,%c")));
1304   if (suffixcode < 2)
1305     strcat (syntax, "%F");
1306   strcat (syntax, "%S%L");
1307
1308   ext_op = (struct arc_opcode *) xmalloc (sizeof (struct arc_opcode));
1309   if (NULL == ext_op)
1310     {
1311       ignore_rest_of_line ();
1312       return;
1313     }
1314
1315   ext_op->syntax = xstrdup (syntax);
1316   if (NULL == ext_op->syntax)
1317     {
1318       ignore_rest_of_line ();
1319       return;
1320     }
1321
1322   ext_op->mask  = I (-1) | ((0x3 == opcode) ? C (-1) : 0);
1323   ext_op->value = I (opcode) | ((0x3 == opcode) ? C (subopcode) : 0);
1324   ext_op->flags = class;
1325   ext_op->next_asm = arc_ext_opcodes;
1326   ext_op->next_dis = arc_ext_opcodes;
1327   arc_ext_opcodes = ext_op;
1328
1329   /* OK, now that we know what this inst is, put a description in the
1330      arc extension section of the output file.  */
1331
1332   old_sec    = now_seg;
1333   old_subsec = now_subseg;
1334
1335   arc_set_ext_seg ();
1336
1337   p = frag_more (1);
1338   *p = 5 + name_len + 1;
1339   p = frag_more (1);
1340   *p = EXT_INSTRUCTION;
1341   p = frag_more (1);
1342   *p = opcode;
1343   p = frag_more (1);
1344   *p = subopcode;
1345   p = frag_more (1);
1346   *p = (class & (OP1_MUST_BE_IMM | OP1_IMM_IMPLIED) ? IGNORE_FIRST_OPD : 0);
1347   p = frag_more (name_len);
1348   strncpy (p, syntax, name_len);
1349   p = frag_more (1);
1350   *p = '\0';
1351
1352   subseg_set (old_sec, old_subsec);
1353
1354   demand_empty_rest_of_line ();
1355 }
1356
1357 int
1358 arc_set_ext_seg ()
1359 {
1360   if (!arcext_section)
1361     {
1362       arcext_section = subseg_new (".arcextmap", 0);
1363       bfd_set_section_flags (stdoutput, arcext_section,
1364                              SEC_READONLY | SEC_HAS_CONTENTS);
1365     }
1366   else
1367     subseg_set (arcext_section, 0);
1368   return 1;
1369 }
1370
1371 static void
1372 arc_common (localScope)
1373      int localScope;
1374 {
1375   char *name;
1376   char c;
1377   char *p;
1378   int align, size;
1379   symbolS *symbolP;
1380
1381   name = input_line_pointer;
1382   c = get_symbol_end ();
1383   /* just after name is now '\0'  */
1384   p = input_line_pointer;
1385   *p = c;
1386   SKIP_WHITESPACE ();
1387
1388   if (*input_line_pointer != ',')
1389     {
1390       as_bad ("expected comma after symbol name");
1391       ignore_rest_of_line ();
1392       return;
1393     }
1394
1395   input_line_pointer++;         /* skip ','  */
1396   size = get_absolute_expression ();
1397
1398   if (size < 0)
1399     {
1400       as_bad ("negative symbol length");
1401       ignore_rest_of_line ();
1402       return;
1403     }
1404
1405   *p = 0;
1406   symbolP = symbol_find_or_make (name);
1407   *p = c;
1408
1409   if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
1410     {
1411       as_bad ("ignoring attempt to re-define symbol");
1412       ignore_rest_of_line ();
1413       return;
1414     }
1415   if (((int) S_GET_VALUE (symbolP) != 0) \
1416       && ((int) S_GET_VALUE (symbolP) != size))
1417     {
1418       as_warn ("length of symbol \"%s\" already %ld, ignoring %d",
1419                S_GET_NAME (symbolP), (long) S_GET_VALUE (symbolP), size);
1420     }
1421   assert (symbolP->sy_frag == &zero_address_frag);
1422
1423   /* Now parse the alignment field.  This field is optional for
1424      local and global symbols. Default alignment is zero.  */
1425   if (*input_line_pointer == ',')
1426     {
1427       input_line_pointer++;
1428       align = get_absolute_expression ();
1429       if (align < 0)
1430         {
1431           align = 0;
1432           as_warn ("assuming symbol alignment of zero");
1433         }
1434     }
1435   else
1436     align = 0;
1437
1438   if (localScope != 0)
1439     {
1440       segT old_sec;
1441       int old_subsec;
1442       char *pfrag;
1443
1444       old_sec    = now_seg;
1445       old_subsec = now_subseg;
1446       record_alignment (bss_section, align);
1447       subseg_set (bss_section, 0);  /* ??? subseg_set (bss_section, 1); ???  */
1448
1449       if (align)
1450         /* Do alignment.  */
1451         frag_align (align, 0, 0);
1452
1453       /* Detach from old frag.  */
1454       if (S_GET_SEGMENT (symbolP) == bss_section)
1455         symbolP->sy_frag->fr_symbol = NULL;
1456
1457       symbolP->sy_frag = frag_now;
1458       pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP,
1459                         (offsetT) size, (char *) 0);
1460       *pfrag = 0;
1461
1462       S_SET_SIZE       (symbolP, size);
1463       S_SET_SEGMENT    (symbolP, bss_section);
1464       S_CLEAR_EXTERNAL (symbolP);
1465       symbolP->local = 1;
1466       subseg_set (old_sec, old_subsec);
1467     }
1468   else
1469     {
1470       S_SET_VALUE    (symbolP, (valueT) size);
1471       S_SET_ALIGN    (symbolP, align);
1472       S_SET_EXTERNAL (symbolP);
1473       S_SET_SEGMENT  (symbolP, bfd_com_section_ptr);
1474     }
1475
1476   symbolP->bsym->flags |= BSF_OBJECT;
1477
1478   demand_empty_rest_of_line ();
1479   return;
1480 }
1481 \f
1482 /* Select the cpu we're assembling for.  */
1483
1484 static void
1485 arc_option (ignore)
1486      int ignore ATTRIBUTE_UNUSED;
1487 {
1488   int mach;
1489   char c;
1490   char *cpu;
1491
1492   cpu = input_line_pointer;
1493   c = get_symbol_end ();
1494   mach = arc_get_mach (cpu);
1495   *input_line_pointer = c;
1496
1497   /* If an instruction has already been seen, it's too late.  */
1498   if (cpu_tables_init_p)
1499     {
1500       as_bad ("\".option\" directive must appear before any instructions");
1501       ignore_rest_of_line ();
1502       return;
1503     }
1504
1505   if (mach == -1)
1506     goto bad_cpu;
1507
1508   if (mach_type_specified_p && mach != arc_mach_type)
1509     {
1510       as_bad ("\".option\" directive conflicts with initial definition");
1511       ignore_rest_of_line ();
1512       return;
1513     }
1514   else
1515     {
1516       /* The cpu may have been selected on the command line.  */
1517       if (mach != arc_mach_type)
1518         as_warn ("\".option\" directive overrides command-line (default) value");
1519       arc_mach_type = mach;
1520       if (!bfd_set_arch_mach (stdoutput, bfd_arch_arc, mach))
1521         as_fatal ("could not set architecture and machine");
1522       mach_type_specified_p = 1;
1523     }
1524   demand_empty_rest_of_line ();
1525   return;
1526
1527  bad_cpu:
1528   as_bad ("invalid identifier for \".option\"");
1529   ignore_rest_of_line ();
1530 }
1531 \f
1532 /* Turn a string in input_line_pointer into a floating point constant
1533    of type TYPE, and store the appropriate bytes in *LITP.  The number
1534    of LITTLENUMS emitted is stored in *SIZEP.  An error message is
1535    returned, or NULL on OK.  */
1536
1537 /* Equal to MAX_PRECISION in atof-ieee.c  */
1538 #define MAX_LITTLENUMS 6
1539
1540 char *
1541 md_atof (type, litP, sizeP)
1542      int type;
1543      char *litP;
1544      int *sizeP;
1545 {
1546   int prec;
1547   LITTLENUM_TYPE words[MAX_LITTLENUMS];
1548   LITTLENUM_TYPE *wordP;
1549   char *t;
1550   char * atof_ieee PARAMS ((char *, int, LITTLENUM_TYPE *));
1551
1552   switch (type)
1553     {
1554     case 'f':
1555     case 'F':
1556       prec = 2;
1557       break;
1558
1559     case 'd':
1560     case 'D':
1561       prec = 4;
1562       break;
1563
1564     default:
1565       *sizeP = 0;
1566       return "bad call to md_atof";
1567     }
1568
1569   t = atof_ieee (input_line_pointer, type, words);
1570   if (t)
1571     input_line_pointer = t;
1572   *sizeP = prec * sizeof (LITTLENUM_TYPE);
1573   for (wordP = words; prec--;)
1574     {
1575       md_number_to_chars (litP, (valueT) (*wordP++), sizeof (LITTLENUM_TYPE));
1576       litP += sizeof (LITTLENUM_TYPE);
1577     }
1578
1579   return NULL;
1580 }
1581
1582 /* Write a value out to the object file, using the appropriate
1583    endianness.  */
1584
1585 void
1586 md_number_to_chars (buf, val, n)
1587      char *buf;
1588      valueT val;
1589      int n;
1590 {
1591   if (target_big_endian)
1592     number_to_chars_bigendian (buf, val, n);
1593   else
1594     number_to_chars_littleendian (buf, val, n);
1595 }
1596
1597 /* Round up a section size to the appropriate boundary.  */
1598
1599 valueT
1600 md_section_align (segment, size)
1601      segT segment;
1602      valueT size;
1603 {
1604   int align = bfd_get_section_alignment (stdoutput, segment);
1605
1606   return ((size + (1 << align) - 1) & (-1 << align));
1607 }
1608
1609 /* We don't have any form of relaxing.  */
1610
1611 int
1612 md_estimate_size_before_relax (fragp, seg)
1613      fragS *fragp ATTRIBUTE_UNUSED;
1614      asection *seg ATTRIBUTE_UNUSED;
1615 {
1616   as_fatal (_("md_estimate_size_before_relax\n"));
1617   return 1;
1618 }
1619
1620 /* Convert a machine dependent frag.  We never generate these.  */
1621
1622 void
1623 md_convert_frag (abfd, sec, fragp)
1624      bfd *abfd ATTRIBUTE_UNUSED;
1625      asection *sec ATTRIBUTE_UNUSED;
1626      fragS *fragp ATTRIBUTE_UNUSED;
1627 {
1628   as_fatal (_("md_convert_frag\n"));
1629 }
1630
1631 void
1632 arc_code_symbol (expressionP)
1633      expressionS *expressionP;
1634 {
1635   if (expressionP->X_op == O_symbol && expressionP->X_add_number == 0)
1636     {
1637       expressionS two;
1638       expressionP->X_op = O_right_shift;
1639       expressionP->X_add_symbol->sy_value.X_op = O_constant;
1640       two.X_op = O_constant;
1641       two.X_add_symbol = two.X_op_symbol = NULL;
1642       two.X_add_number = 2;
1643       expressionP->X_op_symbol = make_expr_symbol (&two);
1644     }
1645   /* Allow %st(sym1-sym2)  */
1646   else if (expressionP->X_op == O_subtract
1647            && expressionP->X_add_symbol != NULL
1648            && expressionP->X_op_symbol != NULL
1649            && expressionP->X_add_number == 0)
1650     {
1651       expressionS two;
1652       expressionP->X_add_symbol = make_expr_symbol (expressionP);
1653       expressionP->X_op = O_right_shift;
1654       two.X_op = O_constant;
1655       two.X_add_symbol = two.X_op_symbol = NULL;
1656       two.X_add_number = 2;
1657       expressionP->X_op_symbol = make_expr_symbol (&two);
1658     }
1659   else
1660     {
1661       as_bad ("expression too complex code symbol");
1662       return;
1663     }
1664 }
1665
1666 /* Parse an operand that is machine-specific.
1667
1668    The ARC has a special %-op to adjust addresses so they're usable in
1669    branches.  The "st" is short for the STatus register.
1670    ??? Later expand this to take a flags value too.
1671
1672    ??? We can't create new expression types so we map the %-op's onto the
1673    existing syntax.  This means that the user could use the chosen syntax
1674    to achieve the same effect.  */
1675
1676 void
1677 md_operand (expressionP)
1678      expressionS *expressionP;
1679 {
1680   char *p = input_line_pointer;
1681
1682   if (*p == '%')
1683     if (strncmp (p, "%st(", 4) == 0)
1684       {
1685         input_line_pointer += 4;
1686         expression (expressionP);
1687         if (*input_line_pointer != ')')
1688           {
1689             as_bad ("missing ')' in %%-op");
1690             return;
1691           }
1692         ++input_line_pointer;
1693         arc_code_symbol (expressionP);
1694       }
1695     else
1696       {
1697         /* It could be a register.  */
1698         int i, l;
1699         struct arc_ext_operand_value *ext_oper = arc_ext_operands;
1700         p++;
1701
1702         while (ext_oper)
1703           {
1704             l = strlen (ext_oper->operand.name);
1705             if (!strncmp (p, ext_oper->operand.name, l) && !ISALNUM (*(p + l)))
1706               {
1707                 input_line_pointer += l + 1;
1708                 expressionP->X_op = O_register;
1709                 expressionP->X_add_number = (int) &ext_oper->operand;
1710                 return;
1711               }
1712             ext_oper = ext_oper->next;
1713           }
1714         for (i = 0; i < arc_reg_names_count; i++)
1715           {
1716             l = strlen (arc_reg_names[i].name);
1717             if (!strncmp (p, arc_reg_names[i].name, l) && !ISALNUM (*(p + l)))
1718               {
1719                 input_line_pointer += l + 1;
1720                 expressionP->X_op = O_register;
1721                 expressionP->X_add_number = (int) &arc_reg_names[i];
1722                 break;
1723               }
1724           }
1725       }
1726 }
1727
1728 /* We have no need to default values of symbols.
1729    We could catch register names here, but that is handled by inserting
1730    them all in the symbol table to begin with.  */
1731
1732 symbolS *
1733 md_undefined_symbol (name)
1734      char *name ATTRIBUTE_UNUSED;
1735 {
1736   return 0;
1737 }
1738 \f
1739 /* Functions concerning expressions.  */
1740
1741 /* Parse a .byte, .word, etc. expression.
1742
1743    Values for the status register are specified with %st(label).
1744    `label' will be right shifted by 2.  */
1745
1746 void
1747 arc_parse_cons_expression (exp, nbytes)
1748      expressionS *exp;
1749      unsigned int nbytes ATTRIBUTE_UNUSED;
1750 {
1751   char *p = input_line_pointer;
1752   int code_symbol_fix = 0;
1753
1754   for (; ! is_end_of_line[(unsigned char) *p]; p++)
1755     if (*p == '@' && !strncmp (p, "@h30", 4))
1756       {
1757         code_symbol_fix = 1;
1758         strcpy (p, ";   ");
1759       }
1760   expr (0, exp);
1761   if (code_symbol_fix)
1762     {
1763       arc_code_symbol (exp);
1764       input_line_pointer = p;
1765     }
1766 }
1767
1768 /* Record a fixup for a cons expression.  */
1769
1770 void
1771 arc_cons_fix_new (frag, where, nbytes, exp)
1772      fragS *frag;
1773      int where;
1774      int nbytes;
1775      expressionS *exp;
1776 {
1777   if (nbytes == 4)
1778     {
1779       int reloc_type;
1780       expressionS exptmp;
1781
1782       /* This may be a special ARC reloc (eg: %st()).  */
1783       reloc_type = get_arc_exp_reloc_type (1, BFD_RELOC_32, exp, &exptmp);
1784       fix_new_exp (frag, where, nbytes, &exptmp, 0, reloc_type);
1785     }
1786   else
1787     {
1788       fix_new_exp (frag, where, nbytes, exp, 0,
1789                    nbytes == 2 ? BFD_RELOC_16
1790                    : nbytes == 8 ? BFD_RELOC_64
1791                    : BFD_RELOC_32);
1792     }
1793 }
1794 \f
1795 /* Functions concerning relocs.  */
1796
1797 /* The location from which a PC relative jump should be calculated,
1798    given a PC relative reloc.  */
1799
1800 long
1801 md_pcrel_from (fixP)
1802      fixS *fixP;
1803 {
1804   if (fixP->fx_addsy != (symbolS *) NULL
1805       && ! S_IS_DEFINED (fixP->fx_addsy))
1806     {
1807       /* The symbol is undefined.  Let the linker figure it out.  */
1808       return 0;
1809     }
1810
1811   /* Return the address of the delay slot.  */
1812   return fixP->fx_frag->fr_address + fixP->fx_where + fixP->fx_size;
1813 }
1814
1815 /* Compute the reloc type of an expression.
1816    The possibly modified expression is stored in EXPNEW.
1817
1818    This is used to convert the expressions generated by the %-op's into
1819    the appropriate operand type.  It is called for both data in instructions
1820    (operands) and data outside instructions (variables, debugging info, etc.).
1821
1822    Currently supported %-ops:
1823
1824    %st(symbol): represented as "symbol >> 2"
1825                 "st" is short for STatus as in the status register (pc)
1826
1827    DEFAULT_TYPE is the type to use if no special processing is required.
1828
1829    DATA_P is non-zero for data or limm values, zero for insn operands.
1830    Remember that the opcode "insertion fns" cannot be used on data, they're
1831    only for inserting operands into insns.  They also can't be used for limm
1832    values as the insertion routines don't handle limm values.  When called for
1833    insns we return fudged reloc types (real_value - BFD_RELOC_UNUSED).  When
1834    called for data or limm values we use real reloc types.  */
1835
1836 static int
1837 get_arc_exp_reloc_type (data_p, default_type, exp, expnew)
1838      int data_p;
1839      int default_type;
1840      expressionS *exp;
1841      expressionS *expnew;
1842 {
1843   /* If the expression is "symbol >> 2" we must change it to just "symbol",
1844      as fix_new_exp can't handle it.  Similarily for (symbol - symbol) >> 2.
1845      That's ok though.  What's really going on here is that we're using
1846      ">> 2" as a special syntax for specifying BFD_RELOC_ARC_B26.  */
1847
1848   if (exp->X_op == O_right_shift
1849       && exp->X_op_symbol != NULL
1850       && exp->X_op_symbol->sy_value.X_op == O_constant
1851       && exp->X_op_symbol->sy_value.X_add_number == 2
1852       && exp->X_add_number == 0)
1853     {
1854       if (exp->X_add_symbol != NULL
1855           && (exp->X_add_symbol->sy_value.X_op == O_constant
1856               || exp->X_add_symbol->sy_value.X_op == O_symbol))
1857         {
1858           *expnew = *exp;
1859           expnew->X_op = O_symbol;
1860           expnew->X_op_symbol = NULL;
1861           return data_p ? BFD_RELOC_ARC_B26 : arc_operand_map['J'];
1862         }
1863       else if (exp->X_add_symbol != NULL
1864                && exp->X_add_symbol->sy_value.X_op == O_subtract)
1865         {
1866           *expnew = exp->X_add_symbol->sy_value;
1867           return data_p ? BFD_RELOC_ARC_B26 : arc_operand_map['J'];
1868         }
1869     }
1870
1871   *expnew = *exp;
1872   return default_type;
1873 }
1874
1875 /* Apply a fixup to the object code.  This is called for all the
1876    fixups we generated by the call to fix_new_exp, above.  In the call
1877    above we used a reloc code which was the largest legal reloc code
1878    plus the operand index.  Here we undo that to recover the operand
1879    index.  At this point all symbol values should be fully resolved,
1880    and we attempt to completely resolve the reloc.  If we can not do
1881    that, we determine the correct reloc code and put it back in the fixup.  */
1882
1883 void
1884 md_apply_fix3 (fixP, valP, seg)
1885      fixS *fixP;
1886      valueT * valP;
1887      segT seg;
1888 {
1889 #if 0
1890   char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
1891 #endif
1892   valueT value = * valP;
1893
1894   /* FIXME FIXME FIXME: The value we are passed in *valueP includes
1895      the symbol values.  Since we are using BFD_ASSEMBLER, if we are
1896      doing this relocation the code in write.c is going to call
1897      bfd_perform_relocation, which is also going to use the symbol
1898      value.  That means that if the reloc is fully resolved we want to
1899      use *valueP since bfd_perform_relocation is not being used.
1900      However, if the reloc is not fully resolved we do not want to use
1901      *valueP, and must use fx_offset instead.  However, if the reloc
1902      is PC relative, we do want to use *valueP since it includes the
1903      result of md_pcrel_from.  This is confusing.  */
1904
1905   if (fixP->fx_addsy == (symbolS *) NULL)
1906     fixP->fx_done = 1;
1907
1908   else if (fixP->fx_pcrel)
1909     {
1910       /* ELF relocations are against symbols.
1911          If this symbol is in a different section then we need to leave it for
1912          the linker to deal with.  Unfortunately, md_pcrel_from can't tell,
1913          so we have to undo it's effects here.  */
1914       if (S_IS_DEFINED (fixP->fx_addsy)
1915           && S_GET_SEGMENT (fixP->fx_addsy) != seg)
1916         value += md_pcrel_from (fixP);
1917     }
1918   else
1919     {
1920       value = fixP->fx_offset;
1921       if (fixP->fx_subsy != (symbolS *) NULL)
1922         {
1923           if (S_GET_SEGMENT (fixP->fx_subsy) == absolute_section)
1924             value -= S_GET_VALUE (fixP->fx_subsy);
1925           else
1926             {
1927               /* We can't actually support subtracting a symbol.  */
1928               as_bad_where (fixP->fx_file, fixP->fx_line,
1929                             "expression too complex");
1930             }
1931         }
1932     }
1933
1934   if ((int) fixP->fx_r_type >= (int) BFD_RELOC_UNUSED)
1935     {
1936       int opindex;
1937       const struct arc_operand *operand;
1938       char *where;
1939       arc_insn insn;
1940
1941       opindex = (int) fixP->fx_r_type - (int) BFD_RELOC_UNUSED;
1942
1943       operand = &arc_operands[opindex];
1944
1945       /* Fetch the instruction, insert the fully resolved operand
1946          value, and stuff the instruction back again.  */
1947       where = fixP->fx_frag->fr_literal + fixP->fx_where;
1948       if (target_big_endian)
1949         insn = bfd_getb32 ((unsigned char *) where);
1950       else
1951         insn = bfd_getl32 ((unsigned char *) where);
1952       insn = arc_insert_operand (insn, operand, -1, NULL, (offsetT) value,
1953                                  fixP->fx_file, fixP->fx_line);
1954       if (target_big_endian)
1955         bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1956       else
1957         bfd_putl32 ((bfd_vma) insn, (unsigned char *) where);
1958
1959       if (fixP->fx_done)
1960         {
1961           /* Nothing else to do here.  */
1962           return;
1963         }
1964
1965       /* Determine a BFD reloc value based on the operand information.
1966          We are only prepared to turn a few of the operands into relocs.
1967          !!! Note that we can't handle limm values here.  Since we're using
1968          implicit addends the addend must be inserted into the instruction,
1969          however, the opcode insertion routines currently do nothing with
1970          limm values.  */
1971       if (operand->fmt == 'B')
1972         {
1973           assert ((operand->flags & ARC_OPERAND_RELATIVE_BRANCH) != 0
1974                   && operand->bits == 20
1975                   && operand->shift == 7);
1976           fixP->fx_r_type = BFD_RELOC_ARC_B22_PCREL;
1977         }
1978       else if (operand->fmt == 'J')
1979         {
1980           assert ((operand->flags & ARC_OPERAND_ABSOLUTE_BRANCH) != 0
1981                   && operand->bits == 24
1982                   && operand->shift == 32);
1983           fixP->fx_r_type = BFD_RELOC_ARC_B26;
1984         }
1985       else if (operand->fmt == 'L')
1986         {
1987           assert ((operand->flags & ARC_OPERAND_LIMM) != 0
1988                   && operand->bits == 32
1989                   && operand->shift == 32);
1990           fixP->fx_r_type = BFD_RELOC_32;
1991         }
1992       else
1993         {
1994           as_bad_where (fixP->fx_file, fixP->fx_line,
1995                         "unresolved expression that must be resolved");
1996           fixP->fx_done = 1;
1997           return;
1998         }
1999     }
2000   else
2001     {
2002       switch (fixP->fx_r_type)
2003         {
2004         case BFD_RELOC_8:
2005           md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
2006                               value, 1);
2007           break;
2008         case BFD_RELOC_16:
2009           md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
2010                               value, 2);
2011           break;
2012         case BFD_RELOC_32:
2013           md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
2014                               value, 4);
2015           break;
2016 #if 0
2017         case BFD_RELOC_64:
2018           md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
2019                               value, 8);
2020           break;
2021 #endif
2022         case BFD_RELOC_ARC_B26:
2023           /* If !fixP->fx_done then `value' is an implicit addend.
2024              We must shift it right by 2 in this case as well because the
2025              linker performs the relocation and then adds this in (as opposed
2026              to adding this in and then shifting right by 2).  */
2027           value >>= 2;
2028           md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
2029                               value, 4);
2030           break;
2031         default:
2032           abort ();
2033         }
2034     }
2035
2036   fixP->fx_addnumber = value;
2037 }
2038
2039 /* Translate internal representation of relocation info to BFD target
2040    format.  */
2041
2042 arelent *
2043 tc_gen_reloc (section, fixP)
2044      asection *section ATTRIBUTE_UNUSED;
2045      fixS *fixP;
2046 {
2047   arelent *reloc;
2048
2049   reloc = (arelent *) xmalloc (sizeof (arelent));
2050
2051   reloc->sym_ptr_ptr = &fixP->fx_addsy->bsym;
2052   reloc->address = fixP->fx_frag->fr_address + fixP->fx_where;
2053   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
2054   if (reloc->howto == (reloc_howto_type *) NULL)
2055     {
2056       as_bad_where (fixP->fx_file, fixP->fx_line,
2057                     "internal error: can't export reloc type %d (`%s')",
2058                     fixP->fx_r_type,
2059                     bfd_get_reloc_code_name (fixP->fx_r_type));
2060       return NULL;
2061     }
2062
2063   assert (!fixP->fx_pcrel == !reloc->howto->pc_relative);
2064
2065   /* Set addend to account for PC being advanced one insn before the
2066      target address is computed, drop fx_addnumber as it is handled
2067      elsewhere mlm  */
2068
2069   reloc->addend = (fixP->fx_pcrel ? -4 : 0);
2070
2071   return reloc;
2072 }