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