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