xref: /netbsd-src/external/gpl3/binutils.old/dist/gas/config/tc-arc.c (revision b5c47949a45ac972130c38cf13dfd8afb1f09285)
1 /* tc-arc.c -- Assembler for the ARC
2    Copyright (C) 1994-2018 Free Software Foundation, Inc.
3 
4    Contributor: Claudiu Zissulescu <claziss@synopsys.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 "subsegs.h"
25 #include "struc-symbol.h"
26 #include "dwarf2dbg.h"
27 #include "dw2gencfi.h"
28 #include "safe-ctype.h"
29 
30 #include "opcode/arc.h"
31 #include "opcode/arc-attrs.h"
32 #include "elf/arc.h"
33 #include "../opcodes/arc-ext.h"
34 
35 /* Defines section.  */
36 
37 #define MAX_INSN_FIXUPS      2
38 #define MAX_CONSTR_STR       20
39 #define FRAG_MAX_GROWTH      8
40 
41 #ifdef DEBUG
42 # define pr_debug(fmt, args...) fprintf (stderr, fmt, ##args)
43 #else
44 # define pr_debug(fmt, args...)
45 #endif
46 
47 #define MAJOR_OPCODE(x)  (((x) & 0xF8000000) >> 27)
48 #define SUB_OPCODE(x)	 (((x) & 0x003F0000) >> 16)
49 #define LP_INSN(x)	 ((MAJOR_OPCODE (x) == 0x4) \
50 			  && (SUB_OPCODE (x) == 0x28))
51 
52 /* Equal to MAX_PRECISION in atof-ieee.c.  */
53 #define MAX_LITTLENUMS 6
54 
55 #ifndef TARGET_WITH_CPU
56 #define TARGET_WITH_CPU "arc700"
57 #endif /* TARGET_WITH_CPU */
58 
59 #define ARC_GET_FLAG(s)   	(*symbol_get_tc (s))
60 #define ARC_SET_FLAG(s,v) 	(*symbol_get_tc (s) |= (v))
61 #define streq(a, b)	      (strcmp (a, b) == 0)
62 
63 /* Enum used to enumerate the relaxable ins operands.  */
64 enum rlx_operand_type
65 {
66   EMPTY = 0,
67   REGISTER,
68   REGISTER_S,     /* Register for short instruction(s).  */
69   REGISTER_NO_GP, /* Is a register but not gp register specifically.  */
70   REGISTER_DUP,   /* Duplication of previous operand of type register.  */
71   IMMEDIATE,
72   BRACKET
73 };
74 
75 enum arc_rlx_types
76 {
77   ARC_RLX_NONE = 0,
78   ARC_RLX_BL_S,
79   ARC_RLX_BL,
80   ARC_RLX_B_S,
81   ARC_RLX_B,
82   ARC_RLX_ADD_U3,
83   ARC_RLX_ADD_U6,
84   ARC_RLX_ADD_LIMM,
85   ARC_RLX_LD_U7,
86   ARC_RLX_LD_S9,
87   ARC_RLX_LD_LIMM,
88   ARC_RLX_MOV_U8,
89   ARC_RLX_MOV_S12,
90   ARC_RLX_MOV_LIMM,
91   ARC_RLX_SUB_U3,
92   ARC_RLX_SUB_U6,
93   ARC_RLX_SUB_LIMM,
94   ARC_RLX_MPY_U6,
95   ARC_RLX_MPY_LIMM,
96   ARC_RLX_MOV_RU6,
97   ARC_RLX_MOV_RLIMM,
98   ARC_RLX_ADD_RRU6,
99   ARC_RLX_ADD_RRLIMM,
100 };
101 
102 /* Macros section.  */
103 
104 #define regno(x)		((x) & 0x3F)
105 #define is_ir_num(x)		(((x) & ~0x3F) == 0)
106 #define is_code_density_p(sc)   (((sc) == CD1 || (sc) == CD2))
107 #define is_spfp_p(op)           (((sc) == SPX))
108 #define is_dpfp_p(op)           (((sc) == DPX))
109 #define is_fpuda_p(op)          (((sc) == DPA))
110 #define is_br_jmp_insn_p(op)    (((op)->insn_class == BRANCH		\
111 				  || (op)->insn_class == JUMP		\
112 				  || (op)->insn_class == BRCC		\
113 				  || (op)->insn_class == BBIT0		\
114 				  || (op)->insn_class == BBIT1		\
115 				  || (op)->insn_class == BI		\
116 				  || (op)->insn_class == EI		\
117 				  || (op)->insn_class == ENTER		\
118 				  || (op)->insn_class == JLI		\
119 				  || (op)->insn_class == LOOP		\
120 				  || (op)->insn_class == LEAVE		\
121 				  ))
122 #define is_kernel_insn_p(op)    (((op)->insn_class == KERNEL))
123 #define is_nps400_p(op)         (((sc) == NPS400))
124 
125 /* Generic assembler global variables which must be defined by all
126    targets.  */
127 
128 /* Characters which always start a comment.  */
129 const char comment_chars[] = "#;";
130 
131 /* Characters which start a comment at the beginning of a line.  */
132 const char line_comment_chars[] = "#";
133 
134 /* Characters which may be used to separate multiple commands on a
135    single line.  */
136 const char line_separator_chars[] = "`";
137 
138 /* Characters which are used to indicate an exponent in a floating
139    point number.  */
140 const char EXP_CHARS[] = "eE";
141 
142 /* Chars that mean this number is a floating point constant
143    As in 0f12.456 or 0d1.2345e12.  */
144 const char FLT_CHARS[] = "rRsSfFdD";
145 
146 /* Byte order.  */
147 extern int target_big_endian;
148 const char *arc_target_format = DEFAULT_TARGET_FORMAT;
149 static int byte_order = DEFAULT_BYTE_ORDER;
150 
151 /* Arc extension section.  */
152 static segT arcext_section;
153 
154 /* By default relaxation is disabled.  */
155 static int relaxation_state = 0;
156 
157 extern int arc_get_mach (char *);
158 
159 /* Forward declarations.  */
160 static void arc_lcomm (int);
161 static void arc_option (int);
162 static void arc_extra_reloc (int);
163 static void arc_extinsn (int);
164 static void arc_extcorereg (int);
165 static void arc_attribute (int);
166 
167 const pseudo_typeS md_pseudo_table[] =
168 {
169   /* Make sure that .word is 32 bits.  */
170   { "word", cons, 4 },
171 
172   { "align",   s_align_bytes, 0 }, /* Defaulting is invalid (0).  */
173   { "lcomm",   arc_lcomm, 0 },
174   { "lcommon", arc_lcomm, 0 },
175   { "cpu",     arc_option, 0 },
176 
177   { "arc_attribute",   arc_attribute, 0 },
178   { "extinstruction",  arc_extinsn, 0 },
179   { "extcoreregister", arc_extcorereg, EXT_CORE_REGISTER },
180   { "extauxregister",  arc_extcorereg, EXT_AUX_REGISTER },
181   { "extcondcode",     arc_extcorereg, EXT_COND_CODE },
182 
183   { "tls_gd_ld",   arc_extra_reloc, BFD_RELOC_ARC_TLS_GD_LD },
184   { "tls_gd_call", arc_extra_reloc, BFD_RELOC_ARC_TLS_GD_CALL },
185 
186   { NULL, NULL, 0 }
187 };
188 
189 const char *md_shortopts = "";
190 
191 enum options
192 {
193   OPTION_EB = OPTION_MD_BASE,
194   OPTION_EL,
195 
196   OPTION_ARC600,
197   OPTION_ARC601,
198   OPTION_ARC700,
199   OPTION_ARCEM,
200   OPTION_ARCHS,
201 
202   OPTION_MCPU,
203   OPTION_CD,
204   OPTION_RELAX,
205   OPTION_NPS400,
206 
207   OPTION_SPFP,
208   OPTION_DPFP,
209   OPTION_FPUDA,
210 
211   /* The following options are deprecated and provided here only for
212      compatibility reasons.  */
213   OPTION_USER_MODE,
214   OPTION_LD_EXT_MASK,
215   OPTION_SWAP,
216   OPTION_NORM,
217   OPTION_BARREL_SHIFT,
218   OPTION_MIN_MAX,
219   OPTION_NO_MPY,
220   OPTION_EA,
221   OPTION_MUL64,
222   OPTION_SIMD,
223   OPTION_XMAC_D16,
224   OPTION_XMAC_24,
225   OPTION_DSP_PACKA,
226   OPTION_CRC,
227   OPTION_DVBF,
228   OPTION_TELEPHONY,
229   OPTION_XYMEMORY,
230   OPTION_LOCK,
231   OPTION_SWAPE,
232   OPTION_RTSC
233 };
234 
235 struct option md_longopts[] =
236 {
237   { "EB",		no_argument,	   NULL, OPTION_EB },
238   { "EL",		no_argument,	   NULL, OPTION_EL },
239   { "mcpu",		required_argument, NULL, OPTION_MCPU },
240   { "mA6",		no_argument,	   NULL, OPTION_ARC600 },
241   { "mARC600",		no_argument,	   NULL, OPTION_ARC600 },
242   { "mARC601",		no_argument,	   NULL, OPTION_ARC601 },
243   { "mARC700",		no_argument,	   NULL, OPTION_ARC700 },
244   { "mA7",		no_argument,	   NULL, OPTION_ARC700 },
245   { "mEM",		no_argument,	   NULL, OPTION_ARCEM },
246   { "mHS",		no_argument,	   NULL, OPTION_ARCHS },
247   { "mcode-density",	no_argument,	   NULL, OPTION_CD },
248   { "mrelax",           no_argument,       NULL, OPTION_RELAX },
249   { "mnps400",          no_argument,       NULL, OPTION_NPS400 },
250 
251   /* Floating point options */
252   { "mspfp", no_argument, NULL, OPTION_SPFP},
253   { "mspfp-compact", no_argument, NULL, OPTION_SPFP},
254   { "mspfp_compact", no_argument, NULL, OPTION_SPFP},
255   { "mspfp-fast", no_argument, NULL, OPTION_SPFP},
256   { "mspfp_fast", no_argument, NULL, OPTION_SPFP},
257   { "mdpfp", no_argument, NULL, OPTION_DPFP},
258   { "mdpfp-compact", no_argument, NULL, OPTION_DPFP},
259   { "mdpfp_compact", no_argument, NULL, OPTION_DPFP},
260   { "mdpfp-fast", no_argument, NULL, OPTION_DPFP},
261   { "mdpfp_fast", no_argument, NULL, OPTION_DPFP},
262   { "mfpuda", no_argument, NULL, OPTION_FPUDA},
263 
264   /* The following options are deprecated and provided here only for
265      compatibility reasons.  */
266   { "mav2em", no_argument, NULL, OPTION_ARCEM },
267   { "mav2hs", no_argument, NULL, OPTION_ARCHS },
268   { "muser-mode-only", no_argument, NULL, OPTION_USER_MODE },
269   { "mld-extension-reg-mask", required_argument, NULL, OPTION_LD_EXT_MASK },
270   { "mswap", no_argument, NULL, OPTION_SWAP },
271   { "mnorm", no_argument, NULL, OPTION_NORM },
272   { "mbarrel-shifter", no_argument, NULL, OPTION_BARREL_SHIFT },
273   { "mbarrel_shifter", no_argument, NULL, OPTION_BARREL_SHIFT },
274   { "mmin-max", no_argument, NULL, OPTION_MIN_MAX },
275   { "mmin_max", no_argument, NULL, OPTION_MIN_MAX },
276   { "mno-mpy", no_argument, NULL, OPTION_NO_MPY },
277   { "mea", no_argument, NULL, OPTION_EA },
278   { "mEA", no_argument, NULL, OPTION_EA },
279   { "mmul64", no_argument, NULL, OPTION_MUL64 },
280   { "msimd", no_argument, NULL, OPTION_SIMD},
281   { "mmac-d16", no_argument, NULL, OPTION_XMAC_D16},
282   { "mmac_d16", no_argument, NULL, OPTION_XMAC_D16},
283   { "mmac-24", no_argument, NULL, OPTION_XMAC_24},
284   { "mmac_24", no_argument, NULL, OPTION_XMAC_24},
285   { "mdsp-packa", no_argument, NULL, OPTION_DSP_PACKA},
286   { "mdsp_packa", no_argument, NULL, OPTION_DSP_PACKA},
287   { "mcrc", no_argument, NULL, OPTION_CRC},
288   { "mdvbf", no_argument, NULL, OPTION_DVBF},
289   { "mtelephony", no_argument, NULL, OPTION_TELEPHONY},
290   { "mxy", no_argument, NULL, OPTION_XYMEMORY},
291   { "mlock", no_argument, NULL, OPTION_LOCK},
292   { "mswape", no_argument, NULL, OPTION_SWAPE},
293   { "mrtsc", no_argument, NULL, OPTION_RTSC},
294 
295   { NULL,		no_argument, NULL, 0 }
296 };
297 
298 size_t md_longopts_size = sizeof (md_longopts);
299 
300 /* Local data and data types.  */
301 
302 /* Used since new relocation types are introduced in this
303    file (DUMMY_RELOC_LITUSE_*).  */
304 typedef int extended_bfd_reloc_code_real_type;
305 
306 struct arc_fixup
307 {
308   expressionS exp;
309 
310   extended_bfd_reloc_code_real_type reloc;
311 
312   /* index into arc_operands.  */
313   unsigned int opindex;
314 
315   /* PC-relative, used by internals fixups.  */
316   unsigned char pcrel;
317 
318   /* TRUE if this fixup is for LIMM operand.  */
319   bfd_boolean islong;
320 };
321 
322 struct arc_insn
323 {
324   unsigned long long int insn;
325   int nfixups;
326   struct arc_fixup fixups[MAX_INSN_FIXUPS];
327   long limm;
328   unsigned int len;       /* Length of instruction in bytes.  */
329   bfd_boolean has_limm;   /* Boolean value: TRUE if limm field is
330 			     valid.  */
331   bfd_boolean relax;	  /* Boolean value: TRUE if needs
332 			     relaxation.  */
333 };
334 
335 /* Structure to hold any last two instructions.  */
336 static struct arc_last_insn
337 {
338   /* Saved instruction opcode.  */
339   const struct arc_opcode *opcode;
340 
341   /* Boolean value: TRUE if current insn is short.  */
342   bfd_boolean has_limm;
343 
344   /* Boolean value: TRUE if current insn has delay slot.  */
345   bfd_boolean has_delay_slot;
346 } arc_last_insns[2];
347 
348 /* Extension instruction suffix classes.  */
349 typedef struct
350 {
351   const char *name;
352   int  len;
353   int  attr_class;
354 } attributes_t;
355 
356 static const attributes_t suffixclass[] =
357 {
358   { "SUFFIX_FLAG", 11, ARC_SUFFIX_FLAG },
359   { "SUFFIX_COND", 11, ARC_SUFFIX_COND },
360   { "SUFFIX_NONE", 11, ARC_SUFFIX_NONE }
361 };
362 
363 /* Extension instruction syntax classes.  */
364 static const attributes_t syntaxclass[] =
365 {
366   { "SYNTAX_3OP", 10, ARC_SYNTAX_3OP },
367   { "SYNTAX_2OP", 10, ARC_SYNTAX_2OP },
368   { "SYNTAX_1OP", 10, ARC_SYNTAX_1OP },
369   { "SYNTAX_NOP", 10, ARC_SYNTAX_NOP }
370 };
371 
372 /* Extension instruction syntax classes modifiers.  */
373 static const attributes_t syntaxclassmod[] =
374 {
375   { "OP1_IMM_IMPLIED" , 15, ARC_OP1_IMM_IMPLIED },
376   { "OP1_MUST_BE_IMM" , 15, ARC_OP1_MUST_BE_IMM }
377 };
378 
379 /* Extension register type.  */
380 typedef struct
381 {
382   char *name;
383   int  number;
384   int  imode;
385 } extRegister_t;
386 
387 /* A structure to hold the additional conditional codes.  */
388 static struct
389 {
390   struct arc_flag_operand *arc_ext_condcode;
391   int size;
392 } ext_condcode = { NULL, 0 };
393 
394 /* Structure to hold an entry in ARC_OPCODE_HASH.  */
395 struct arc_opcode_hash_entry
396 {
397   /* The number of pointers in the OPCODE list.  */
398   size_t count;
399 
400   /* Points to a list of opcode pointers.  */
401   const struct arc_opcode **opcode;
402 };
403 
404 /* Structure used for iterating through an arc_opcode_hash_entry.  */
405 struct arc_opcode_hash_entry_iterator
406 {
407   /* Index into the OPCODE element of the arc_opcode_hash_entry.  */
408   size_t index;
409 
410   /* The specific ARC_OPCODE from the ARC_OPCODES table that was last
411      returned by this iterator.  */
412   const struct arc_opcode *opcode;
413 };
414 
415 /* Forward declaration.  */
416 static void assemble_insn
417   (const struct arc_opcode *, const expressionS *, int,
418    const struct arc_flags *, int, struct arc_insn *);
419 
420 /* The selection of the machine type can come from different sources.  This
421    enum is used to track how the selection was made in order to perform
422    error checks.  */
423 enum mach_selection_type
424   {
425     MACH_SELECTION_NONE,
426     MACH_SELECTION_FROM_DEFAULT,
427     MACH_SELECTION_FROM_CPU_DIRECTIVE,
428     MACH_SELECTION_FROM_COMMAND_LINE
429   };
430 
431 /* How the current machine type was selected.  */
432 static enum mach_selection_type mach_selection_mode = MACH_SELECTION_NONE;
433 
434 /* The hash table of instruction opcodes.  */
435 static struct hash_control *arc_opcode_hash;
436 
437 /* The hash table of register symbols.  */
438 static struct hash_control *arc_reg_hash;
439 
440 /* The hash table of aux register symbols.  */
441 static struct hash_control *arc_aux_hash;
442 
443 /* The hash table of address types.  */
444 static struct hash_control *arc_addrtype_hash;
445 
446 #define ARC_CPU_TYPE_A6xx(NAME,EXTRA)			\
447   { #NAME, ARC_OPCODE_ARC600, bfd_mach_arc_arc600,	\
448       E_ARC_MACH_ARC600, EXTRA}
449 #define ARC_CPU_TYPE_A7xx(NAME,EXTRA)			\
450   { #NAME, ARC_OPCODE_ARC700,  bfd_mach_arc_arc700,	\
451       E_ARC_MACH_ARC700, EXTRA}
452 #define ARC_CPU_TYPE_AV2EM(NAME,EXTRA)			\
453   { #NAME,  ARC_OPCODE_ARCv2EM, bfd_mach_arc_arcv2,	\
454       EF_ARC_CPU_ARCV2EM, EXTRA}
455 #define ARC_CPU_TYPE_AV2HS(NAME,EXTRA)			\
456   { #NAME,  ARC_OPCODE_ARCv2HS, bfd_mach_arc_arcv2,	\
457       EF_ARC_CPU_ARCV2HS, EXTRA}
458 #define ARC_CPU_TYPE_NONE				\
459   { 0, 0, 0, 0, 0 }
460 
461 /* A table of CPU names and opcode sets.  */
462 static const struct cpu_type
463 {
464   const char *name;
465   unsigned flags;
466   int mach;
467   unsigned eflags;
468   unsigned features;
469 }
470   cpu_types[] =
471 {
472   #include "elf/arc-cpu.def"
473 };
474 
475 /* Information about the cpu/variant we're assembling for.  */
476 static struct cpu_type selected_cpu = { 0, 0, 0, E_ARC_OSABI_CURRENT, 0 };
477 
478 /* MPY option.  */
479 static unsigned mpy_option = 0;
480 
481 /* Use PIC. */
482 static unsigned pic_option = 0;
483 
484 /* Use small data.  */
485 static unsigned sda_option = 0;
486 
487 /* Use TLS.  */
488 static unsigned tls_option = 0;
489 
490 /* Command line given features.  */
491 static unsigned cl_features = 0;
492 
493 /* Used by the arc_reloc_op table.  Order is important.  */
494 #define O_gotoff  O_md1     /* @gotoff relocation.  */
495 #define O_gotpc   O_md2     /* @gotpc relocation.  */
496 #define O_plt     O_md3     /* @plt relocation.  */
497 #define O_sda     O_md4     /* @sda relocation.  */
498 #define O_pcl     O_md5     /* @pcl relocation.  */
499 #define O_tlsgd   O_md6     /* @tlsgd relocation.  */
500 #define O_tlsie   O_md7     /* @tlsie relocation.  */
501 #define O_tpoff9  O_md8     /* @tpoff9 relocation.  */
502 #define O_tpoff   O_md9     /* @tpoff relocation.  */
503 #define O_dtpoff9 O_md10    /* @dtpoff9 relocation.  */
504 #define O_dtpoff  O_md11    /* @dtpoff relocation.  */
505 #define O_last    O_dtpoff
506 
507 /* Used to define a bracket as operand in tokens.  */
508 #define O_bracket O_md32
509 
510 /* Used to define a colon as an operand in tokens.  */
511 #define O_colon O_md31
512 
513 /* Used to define address types in nps400.  */
514 #define O_addrtype O_md30
515 
516 /* Dummy relocation, to be sorted out.  */
517 #define DUMMY_RELOC_ARC_ENTRY     (BFD_RELOC_UNUSED + 1)
518 
519 #define USER_RELOC_P(R) ((R) >= O_gotoff && (R) <= O_last)
520 
521 /* A table to map the spelling of a relocation operand into an appropriate
522    bfd_reloc_code_real_type type.  The table is assumed to be ordered such
523    that op-O_literal indexes into it.  */
524 #define ARC_RELOC_TABLE(op)				\
525   (&arc_reloc_op[ ((!USER_RELOC_P (op))			\
526 		   ? (abort (), 0)			\
527 		   : (int) (op) - (int) O_gotoff) ])
528 
529 #define DEF(NAME, RELOC, REQ)				\
530   { #NAME, sizeof (#NAME)-1, O_##NAME, RELOC, REQ}
531 
532 static const struct arc_reloc_op_tag
533 {
534   /* String to lookup.  */
535   const char *name;
536   /* Size of the string.  */
537   size_t length;
538   /* Which operator to use.  */
539   operatorT op;
540   extended_bfd_reloc_code_real_type reloc;
541   /* Allows complex relocation expression like identifier@reloc +
542      const.  */
543   unsigned int complex_expr : 1;
544 }
545   arc_reloc_op[] =
546 {
547   DEF (gotoff,  BFD_RELOC_ARC_GOTOFF,		1),
548   DEF (gotpc,   BFD_RELOC_ARC_GOTPC32,		0),
549   DEF (plt,	BFD_RELOC_ARC_PLT32,		0),
550   DEF (sda,	DUMMY_RELOC_ARC_ENTRY,		1),
551   DEF (pcl,	BFD_RELOC_ARC_PC32,		1),
552   DEF (tlsgd,   BFD_RELOC_ARC_TLS_GD_GOT,	0),
553   DEF (tlsie,   BFD_RELOC_ARC_TLS_IE_GOT,	0),
554   DEF (tpoff9,  BFD_RELOC_ARC_TLS_LE_S9,	0),
555   DEF (tpoff,   BFD_RELOC_ARC_TLS_LE_32,	1),
556   DEF (dtpoff9, BFD_RELOC_ARC_TLS_DTPOFF_S9,	0),
557   DEF (dtpoff,  BFD_RELOC_ARC_TLS_DTPOFF,	1),
558 };
559 
560 static const int arc_num_reloc_op
561 = sizeof (arc_reloc_op) / sizeof (*arc_reloc_op);
562 
563 /* Structure for relaxable instruction that have to be swapped with a
564    smaller alternative instruction.  */
565 struct arc_relaxable_ins
566 {
567   /* Mnemonic that should be checked.  */
568   const char *mnemonic_r;
569 
570   /* Operands that should be checked.
571      Indexes of operands from operand array.  */
572   enum rlx_operand_type operands[6];
573 
574   /* Flags that should be checked.  */
575   unsigned flag_classes[5];
576 
577   /* Mnemonic (smaller) alternative to be used later for relaxation.  */
578   const char *mnemonic_alt;
579 
580   /* Index of operand that generic relaxation has to check.  */
581   unsigned opcheckidx;
582 
583   /* Base subtype index used.  */
584   enum arc_rlx_types subtype;
585 };
586 
587 #define RELAX_TABLE_ENTRY(BITS, ISSIGNED, SIZE, NEXT)			\
588   { (ISSIGNED) ? ((1 << ((BITS) - 1)) - 1) : ((1 << (BITS)) - 1),	\
589       (ISSIGNED) ? -(1 << ((BITS) - 1)) : 0,				\
590       (SIZE),								\
591       (NEXT) }								\
592 
593 #define RELAX_TABLE_ENTRY_MAX(ISSIGNED, SIZE, NEXT)	\
594   { (ISSIGNED) ? 0x7FFFFFFF : 0xFFFFFFFF,		\
595       (ISSIGNED) ? -(0x7FFFFFFF) : 0,                   \
596       (SIZE),                                           \
597       (NEXT) }                                          \
598 
599 
600 /* ARC relaxation table.  */
601 const relax_typeS md_relax_table[] =
602 {
603   /* Fake entry.  */
604   {0, 0, 0, 0},
605 
606   /* BL_S s13 ->
607      BL s25.  */
608   RELAX_TABLE_ENTRY (13, 1, 2, ARC_RLX_BL),
609   RELAX_TABLE_ENTRY (25, 1, 4, ARC_RLX_NONE),
610 
611   /* B_S s10 ->
612      B s25.  */
613   RELAX_TABLE_ENTRY (10, 1, 2, ARC_RLX_B),
614   RELAX_TABLE_ENTRY (25, 1, 4, ARC_RLX_NONE),
615 
616   /* ADD_S c,b, u3 ->
617      ADD<.f> a,b,u6 ->
618      ADD<.f> a,b,limm.  */
619   RELAX_TABLE_ENTRY (3, 0, 2, ARC_RLX_ADD_U6),
620   RELAX_TABLE_ENTRY (6, 0, 4, ARC_RLX_ADD_LIMM),
621   RELAX_TABLE_ENTRY_MAX (0, 8, ARC_RLX_NONE),
622 
623   /* LD_S a, [b, u7] ->
624      LD<zz><.x><.aa><.di> a, [b, s9] ->
625      LD<zz><.x><.aa><.di> a, [b, limm] */
626   RELAX_TABLE_ENTRY (7, 0, 2, ARC_RLX_LD_S9),
627   RELAX_TABLE_ENTRY (9, 1, 4, ARC_RLX_LD_LIMM),
628   RELAX_TABLE_ENTRY_MAX (1, 8, ARC_RLX_NONE),
629 
630   /* MOV_S b, u8 ->
631      MOV<.f> b, s12 ->
632      MOV<.f> b, limm.  */
633   RELAX_TABLE_ENTRY (8, 0, 2, ARC_RLX_MOV_S12),
634   RELAX_TABLE_ENTRY (8, 0, 4, ARC_RLX_MOV_LIMM),
635   RELAX_TABLE_ENTRY_MAX (0, 8, ARC_RLX_NONE),
636 
637   /* SUB_S c, b, u3 ->
638      SUB<.f> a, b, u6 ->
639      SUB<.f> a, b, limm.  */
640   RELAX_TABLE_ENTRY (3, 0, 2, ARC_RLX_SUB_U6),
641   RELAX_TABLE_ENTRY (6, 0, 4, ARC_RLX_SUB_LIMM),
642   RELAX_TABLE_ENTRY_MAX (0, 8, ARC_RLX_NONE),
643 
644   /* MPY<.f> a, b, u6 ->
645      MPY<.f> a, b, limm.  */
646   RELAX_TABLE_ENTRY (6, 0, 4, ARC_RLX_MPY_LIMM),
647   RELAX_TABLE_ENTRY_MAX (0, 8, ARC_RLX_NONE),
648 
649   /* MOV<.f><.cc> b, u6 ->
650      MOV<.f><.cc> b, limm.  */
651   RELAX_TABLE_ENTRY (6, 0, 4, ARC_RLX_MOV_RLIMM),
652   RELAX_TABLE_ENTRY_MAX (0, 8, ARC_RLX_NONE),
653 
654   /* ADD<.f><.cc> b, b, u6 ->
655      ADD<.f><.cc> b, b, limm.  */
656   RELAX_TABLE_ENTRY (6, 0, 4, ARC_RLX_ADD_RRLIMM),
657   RELAX_TABLE_ENTRY_MAX (0, 8, ARC_RLX_NONE),
658 };
659 
660 /* Order of this table's entries matters!  */
661 const struct arc_relaxable_ins arc_relaxable_insns[] =
662 {
663   { "bl", { IMMEDIATE }, { 0 }, "bl_s", 0, ARC_RLX_BL_S },
664   { "b", { IMMEDIATE }, { 0 }, "b_s", 0, ARC_RLX_B_S },
665   { "add", { REGISTER, REGISTER_DUP, IMMEDIATE }, { 5, 1, 0 }, "add",
666     2, ARC_RLX_ADD_RRU6},
667   { "add", { REGISTER_S, REGISTER_S, IMMEDIATE }, { 0 }, "add_s", 2,
668     ARC_RLX_ADD_U3 },
669   { "add", { REGISTER, REGISTER, IMMEDIATE }, { 5, 0 }, "add", 2,
670     ARC_RLX_ADD_U6 },
671   { "ld", { REGISTER_S, BRACKET, REGISTER_S, IMMEDIATE, BRACKET },
672     { 0 }, "ld_s", 3, ARC_RLX_LD_U7 },
673   { "ld", { REGISTER, BRACKET, REGISTER_NO_GP, IMMEDIATE, BRACKET },
674     { 11, 4, 14, 17, 0 }, "ld", 3, ARC_RLX_LD_S9 },
675   { "mov", { REGISTER_S, IMMEDIATE }, { 0 }, "mov_s", 1, ARC_RLX_MOV_U8 },
676   { "mov", { REGISTER, IMMEDIATE }, { 5, 0 }, "mov", 1, ARC_RLX_MOV_S12 },
677   { "mov", { REGISTER, IMMEDIATE }, { 5, 1, 0 },"mov", 1, ARC_RLX_MOV_RU6 },
678   { "sub", { REGISTER_S, REGISTER_S, IMMEDIATE }, { 0 }, "sub_s", 2,
679     ARC_RLX_SUB_U3 },
680   { "sub", { REGISTER, REGISTER, IMMEDIATE }, { 5, 0 }, "sub", 2,
681     ARC_RLX_SUB_U6 },
682   { "mpy", { REGISTER, REGISTER, IMMEDIATE }, { 5, 0 }, "mpy", 2,
683     ARC_RLX_MPY_U6 },
684 };
685 
686 const unsigned arc_num_relaxable_ins = ARRAY_SIZE (arc_relaxable_insns);
687 
688 /* Pre-defined "_GLOBAL_OFFSET_TABLE_".  */
689 symbolS * GOT_symbol = 0;
690 
691 /* Set to TRUE when we assemble instructions.  */
692 static bfd_boolean assembling_insn = FALSE;
693 
694 /* List with attributes set explicitly.  */
695 static bfd_boolean attributes_set_explicitly[NUM_KNOWN_OBJ_ATTRIBUTES];
696 
697 /* Functions implementation.  */
698 
699 /* Return a pointer to ARC_OPCODE_HASH_ENTRY that identifies all
700    ARC_OPCODE entries in ARC_OPCODE_HASH that match NAME, or NULL if there
701    are no matching entries in ARC_OPCODE_HASH.  */
702 
703 static const struct arc_opcode_hash_entry *
704 arc_find_opcode (const char *name)
705 {
706   const struct arc_opcode_hash_entry *entry;
707 
708   entry = hash_find (arc_opcode_hash, name);
709   return entry;
710 }
711 
712 /* Initialise the iterator ITER.  */
713 
714 static void
715 arc_opcode_hash_entry_iterator_init (struct arc_opcode_hash_entry_iterator *iter)
716 {
717   iter->index = 0;
718   iter->opcode = NULL;
719 }
720 
721 /* Return the next ARC_OPCODE from ENTRY, using ITER to hold state between
722    calls to this function.  Return NULL when all ARC_OPCODE entries have
723    been returned.  */
724 
725 static const struct arc_opcode *
726 arc_opcode_hash_entry_iterator_next (const struct arc_opcode_hash_entry *entry,
727 				     struct arc_opcode_hash_entry_iterator *iter)
728 {
729   if (iter->opcode == NULL && iter->index == 0)
730     {
731       gas_assert (entry->count > 0);
732       iter->opcode = entry->opcode[iter->index];
733     }
734   else if (iter->opcode != NULL)
735     {
736       const char *old_name = iter->opcode->name;
737 
738       iter->opcode++;
739       if (iter->opcode->name == NULL
740 	  || strcmp (old_name, iter->opcode->name) != 0)
741 	{
742 	  iter->index++;
743 	  if (iter->index == entry->count)
744 	    iter->opcode = NULL;
745 	  else
746 	    iter->opcode = entry->opcode[iter->index];
747 	}
748     }
749 
750   return iter->opcode;
751 }
752 
753 /* Insert an opcode into opcode hash structure.  */
754 
755 static void
756 arc_insert_opcode (const struct arc_opcode *opcode)
757 {
758   const char *name, *retval;
759   struct arc_opcode_hash_entry *entry;
760   name = opcode->name;
761 
762   entry = hash_find (arc_opcode_hash, name);
763   if (entry == NULL)
764     {
765       entry = XNEW (struct arc_opcode_hash_entry);
766       entry->count = 0;
767       entry->opcode = NULL;
768 
769       retval = hash_insert (arc_opcode_hash, name, (void *) entry);
770       if (retval)
771 	as_fatal (_("internal error: can't hash opcode '%s': %s"),
772 		  name, retval);
773     }
774 
775   entry->opcode = XRESIZEVEC (const struct arc_opcode *, entry->opcode,
776 			      entry->count + 1);
777 
778   if (entry->opcode == NULL)
779     as_fatal (_("Virtual memory exhausted"));
780 
781   entry->opcode[entry->count] = opcode;
782   entry->count++;
783 }
784 
785 
786 /* Like md_number_to_chars but for middle-endian values.  The 4-byte limm
787    value, is encoded as 'middle-endian' for a little-endian target.  This
788    function is used for regular 4, 6, and 8 byte instructions as well.  */
789 
790 static void
791 md_number_to_chars_midend (char *buf, unsigned long long val, int n)
792 {
793   switch (n)
794     {
795     case 2:
796       md_number_to_chars (buf, val, n);
797       break;
798     case 6:
799       md_number_to_chars (buf, (val & 0xffff00000000) >> 32, 2);
800       md_number_to_chars_midend (buf + 2, (val & 0xffffffff), 4);
801       break;
802     case 4:
803       md_number_to_chars (buf,     (val & 0xffff0000) >> 16, 2);
804       md_number_to_chars (buf + 2, (val & 0xffff), 2);
805       break;
806     case 8:
807       md_number_to_chars_midend (buf, (val & 0xffffffff00000000) >> 32, 4);
808       md_number_to_chars_midend (buf + 4, (val & 0xffffffff), 4);
809       break;
810     default:
811       abort ();
812     }
813 }
814 
815 /* Check if a feature is allowed for a specific CPU.  */
816 
817 static void
818 arc_check_feature (void)
819 {
820   unsigned i;
821 
822   if (!selected_cpu.features
823       || !selected_cpu.name)
824     return;
825 
826   for (i = 0; i < ARRAY_SIZE (feature_list); i++)
827     if ((selected_cpu.features & feature_list[i].feature)
828 	&& !(selected_cpu.flags & feature_list[i].cpus))
829       as_bad (_("invalid %s option for %s cpu"), feature_list[i].name,
830 	      selected_cpu.name);
831 
832   for (i = 0; i < ARRAY_SIZE (conflict_list); i++)
833     if ((selected_cpu.features & conflict_list[i]) == conflict_list[i])
834       as_bad(_("conflicting ISA extension attributes."));
835 }
836 
837 /* Select an appropriate entry from CPU_TYPES based on ARG and initialise
838    the relevant static global variables.  Parameter SEL describes where
839    this selection originated from.  */
840 
841 static void
842 arc_select_cpu (const char *arg, enum mach_selection_type sel)
843 {
844   int i;
845 
846   /* We should only set a default if we've not made a selection from some
847      other source.  */
848   gas_assert (sel != MACH_SELECTION_FROM_DEFAULT
849               || mach_selection_mode == MACH_SELECTION_NONE);
850 
851   if ((mach_selection_mode == MACH_SELECTION_FROM_CPU_DIRECTIVE)
852       && (sel == MACH_SELECTION_FROM_CPU_DIRECTIVE))
853     as_bad (_("Multiple .cpu directives found"));
854 
855   /* Look for a matching entry in CPU_TYPES array.  */
856   for (i = 0; cpu_types[i].name; ++i)
857     {
858       if (!strcasecmp (cpu_types[i].name, arg))
859         {
860           /* If a previous selection was made on the command line, then we
861              allow later selections on the command line to override earlier
862              ones.  However, a selection from a '.cpu NAME' directive must
863              match the command line selection, or we give a warning.  */
864           if (mach_selection_mode == MACH_SELECTION_FROM_COMMAND_LINE)
865             {
866               gas_assert (sel == MACH_SELECTION_FROM_COMMAND_LINE
867                           || sel == MACH_SELECTION_FROM_CPU_DIRECTIVE);
868               if (sel == MACH_SELECTION_FROM_CPU_DIRECTIVE
869                   && selected_cpu.mach != cpu_types[i].mach)
870                 {
871                   as_warn (_("Command-line value overrides \".cpu\" directive"));
872                 }
873 	      return;
874             }
875 
876 	  /* Initialise static global data about selected machine type.  */
877 	  selected_cpu.flags = cpu_types[i].flags;
878 	  selected_cpu.name = cpu_types[i].name;
879 	  selected_cpu.features = cpu_types[i].features | cl_features;
880 	  selected_cpu.mach = cpu_types[i].mach;
881 	  selected_cpu.eflags = ((selected_cpu.eflags & ~EF_ARC_MACH_MSK)
882 				 | cpu_types[i].eflags);
883           break;
884         }
885     }
886 
887   if (!cpu_types[i].name)
888     as_fatal (_("unknown architecture: %s\n"), arg);
889 
890   /* Check if set features are compatible with the chosen CPU.  */
891   arc_check_feature ();
892 
893   mach_selection_mode = sel;
894 }
895 
896 /* Here ends all the ARCompact extension instruction assembling
897    stuff.  */
898 
899 static void
900 arc_extra_reloc (int r_type)
901 {
902   char *sym_name, c;
903   symbolS *sym, *lab = NULL;
904 
905   if (*input_line_pointer == '@')
906     input_line_pointer++;
907   c = get_symbol_name (&sym_name);
908   sym = symbol_find_or_make (sym_name);
909   restore_line_pointer (c);
910   if (c == ',' && r_type == BFD_RELOC_ARC_TLS_GD_LD)
911     {
912       ++input_line_pointer;
913       char *lab_name;
914       c = get_symbol_name (&lab_name);
915       lab = symbol_find_or_make (lab_name);
916       restore_line_pointer (c);
917     }
918 
919   /* These relocations exist as a mechanism for the compiler to tell the
920      linker how to patch the code if the tls model is optimised.  However,
921      the relocation itself does not require any space within the assembler
922      fragment, and so we pass a size of 0.
923 
924      The lines that generate these relocations look like this:
925 
926          .tls_gd_ld @.tdata`bl __tls_get_addr@plt
927 
928      The '.tls_gd_ld @.tdata' is processed first and generates the
929      additional relocation, while the 'bl __tls_get_addr@plt' is processed
930      second and generates the additional branch.
931 
932      It is possible that the additional relocation generated by the
933      '.tls_gd_ld @.tdata' will be attached at the very end of one fragment,
934      while the 'bl __tls_get_addr@plt' will be generated as the first thing
935      in the next fragment.  This will be fine; both relocations will still
936      appear to be at the same address in the generated object file.
937      However, this only works as the additional relocation is generated
938      with size of 0 bytes.  */
939   fixS *fixP
940     = fix_new (frag_now,	/* Which frag?  */
941 	       frag_now_fix (),	/* Where in that frag?  */
942 	       0,		/* size: 1, 2, or 4 usually.  */
943 	       sym,		/* X_add_symbol.  */
944 	       0,		/* X_add_number.  */
945 	       FALSE,		/* TRUE if PC-relative relocation.  */
946 	       r_type		/* Relocation type.  */);
947   fixP->fx_subsy = lab;
948 }
949 
950 static symbolS *
951 arc_lcomm_internal (int ignore ATTRIBUTE_UNUSED,
952 		    symbolS *symbolP, addressT size)
953 {
954   addressT align = 0;
955   SKIP_WHITESPACE ();
956 
957   if (*input_line_pointer == ',')
958     {
959       align = parse_align (1);
960 
961       if (align == (addressT) -1)
962 	return NULL;
963     }
964   else
965     {
966       if (size >= 8)
967 	align = 3;
968       else if (size >= 4)
969 	align = 2;
970       else if (size >= 2)
971 	align = 1;
972       else
973 	align = 0;
974     }
975 
976   bss_alloc (symbolP, size, align);
977   S_CLEAR_EXTERNAL (symbolP);
978 
979   return symbolP;
980 }
981 
982 static void
983 arc_lcomm (int ignore)
984 {
985   symbolS *symbolP = s_comm_internal (ignore, arc_lcomm_internal);
986 
987   if (symbolP)
988     symbol_get_bfdsym (symbolP)->flags |= BSF_OBJECT;
989 }
990 
991 /* Select the cpu we're assembling for.  */
992 
993 static void
994 arc_option (int ignore ATTRIBUTE_UNUSED)
995 {
996   char c;
997   char *cpu;
998   const char *cpu_name;
999 
1000   c = get_symbol_name (&cpu);
1001 
1002   cpu_name = cpu;
1003   if ((!strcmp ("ARC600", cpu))
1004       || (!strcmp ("ARC601", cpu))
1005       || (!strcmp ("A6", cpu)))
1006     cpu_name = "arc600";
1007   else if ((!strcmp ("ARC700", cpu))
1008            || (!strcmp ("A7", cpu)))
1009     cpu_name = "arc700";
1010   else if (!strcmp ("EM", cpu))
1011     cpu_name = "arcem";
1012   else if (!strcmp ("HS", cpu))
1013     cpu_name = "archs";
1014   else if (!strcmp ("NPS400", cpu))
1015     cpu_name = "nps400";
1016 
1017   arc_select_cpu (cpu_name, MACH_SELECTION_FROM_CPU_DIRECTIVE);
1018 
1019   restore_line_pointer (c);
1020   demand_empty_rest_of_line ();
1021 }
1022 
1023 /* Smartly print an expression.  */
1024 
1025 static void
1026 debug_exp (expressionS *t)
1027 {
1028   const char *name ATTRIBUTE_UNUSED;
1029   const char *namemd ATTRIBUTE_UNUSED;
1030 
1031   pr_debug ("debug_exp: ");
1032 
1033   switch (t->X_op)
1034     {
1035     default:			name = "unknown";		break;
1036     case O_illegal:		name = "O_illegal";		break;
1037     case O_absent:		name = "O_absent";		break;
1038     case O_constant:		name = "O_constant";		break;
1039     case O_symbol:		name = "O_symbol";		break;
1040     case O_symbol_rva:		name = "O_symbol_rva";		break;
1041     case O_register:		name = "O_register";		break;
1042     case O_big:			name = "O_big";			break;
1043     case O_uminus:		name = "O_uminus";		break;
1044     case O_bit_not:		name = "O_bit_not";		break;
1045     case O_logical_not:		name = "O_logical_not";		break;
1046     case O_multiply:		name = "O_multiply";		break;
1047     case O_divide:		name = "O_divide";		break;
1048     case O_modulus:		name = "O_modulus";		break;
1049     case O_left_shift:		name = "O_left_shift";		break;
1050     case O_right_shift:		name = "O_right_shift";		break;
1051     case O_bit_inclusive_or:	name = "O_bit_inclusive_or";	break;
1052     case O_bit_or_not:		name = "O_bit_or_not";		break;
1053     case O_bit_exclusive_or:	name = "O_bit_exclusive_or";	break;
1054     case O_bit_and:		name = "O_bit_and";		break;
1055     case O_add:			name = "O_add";			break;
1056     case O_subtract:		name = "O_subtract";		break;
1057     case O_eq:			name = "O_eq";			break;
1058     case O_ne:			name = "O_ne";			break;
1059     case O_lt:			name = "O_lt";			break;
1060     case O_le:			name = "O_le";			break;
1061     case O_ge:			name = "O_ge";			break;
1062     case O_gt:			name = "O_gt";			break;
1063     case O_logical_and:		name = "O_logical_and";		break;
1064     case O_logical_or:		name = "O_logical_or";		break;
1065     case O_index:		name = "O_index";		break;
1066     case O_bracket:		name = "O_bracket";		break;
1067     case O_colon:		name = "O_colon";               break;
1068     case O_addrtype:		name = "O_addrtype";            break;
1069     }
1070 
1071   switch (t->X_md)
1072     {
1073     default:			namemd = "unknown";		break;
1074     case O_gotoff:		namemd = "O_gotoff";		break;
1075     case O_gotpc:		namemd = "O_gotpc";		break;
1076     case O_plt:			namemd = "O_plt";		break;
1077     case O_sda:			namemd = "O_sda";		break;
1078     case O_pcl:			namemd = "O_pcl";		break;
1079     case O_tlsgd:		namemd = "O_tlsgd";		break;
1080     case O_tlsie:		namemd = "O_tlsie";		break;
1081     case O_tpoff9:		namemd = "O_tpoff9";		break;
1082     case O_tpoff:		namemd = "O_tpoff";		break;
1083     case O_dtpoff9:		namemd = "O_dtpoff9";		break;
1084     case O_dtpoff:		namemd = "O_dtpoff";		break;
1085     }
1086 
1087   pr_debug ("%s (%s, %s, %d, %s)", name,
1088 	    (t->X_add_symbol) ? S_GET_NAME (t->X_add_symbol) : "--",
1089 	    (t->X_op_symbol) ? S_GET_NAME (t->X_op_symbol) : "--",
1090 	    (int) t->X_add_number,
1091 	    (t->X_md) ? namemd : "--");
1092   pr_debug ("\n");
1093   fflush (stderr);
1094 }
1095 
1096 /* Parse the arguments to an opcode.  */
1097 
1098 static int
1099 tokenize_arguments (char *str,
1100 		    expressionS *tok,
1101 		    int ntok)
1102 {
1103   char *old_input_line_pointer;
1104   bfd_boolean saw_comma = FALSE;
1105   bfd_boolean saw_arg = FALSE;
1106   int brk_lvl = 0;
1107   int num_args = 0;
1108   int i;
1109   size_t len;
1110   const struct arc_reloc_op_tag *r;
1111   expressionS tmpE;
1112   char *reloc_name, c;
1113 
1114   memset (tok, 0, sizeof (*tok) * ntok);
1115 
1116   /* Save and restore input_line_pointer around this function.  */
1117   old_input_line_pointer = input_line_pointer;
1118   input_line_pointer = str;
1119 
1120   while (*input_line_pointer)
1121     {
1122       SKIP_WHITESPACE ();
1123       switch (*input_line_pointer)
1124 	{
1125 	case '\0':
1126 	  goto fini;
1127 
1128 	case ',':
1129 	  input_line_pointer++;
1130 	  if (saw_comma || !saw_arg)
1131 	    goto err;
1132 	  saw_comma = TRUE;
1133 	  break;
1134 
1135 	case '}':
1136 	case ']':
1137 	  ++input_line_pointer;
1138 	  --brk_lvl;
1139 	  if (!saw_arg || num_args == ntok)
1140 	    goto err;
1141 	  tok->X_op = O_bracket;
1142 	  ++tok;
1143 	  ++num_args;
1144 	  break;
1145 
1146 	case '{':
1147 	case '[':
1148 	  input_line_pointer++;
1149 	  if (brk_lvl || num_args == ntok)
1150 	    goto err;
1151 	  ++brk_lvl;
1152 	  tok->X_op = O_bracket;
1153 	  ++tok;
1154 	  ++num_args;
1155 	  break;
1156 
1157         case ':':
1158           input_line_pointer++;
1159           if (!saw_arg || num_args == ntok)
1160             goto err;
1161           tok->X_op = O_colon;
1162           saw_arg = FALSE;
1163           ++tok;
1164           ++num_args;
1165           break;
1166 
1167 	case '@':
1168 	  /* We have labels, function names and relocations, all
1169 	     starting with @ symbol.  Sort them out.  */
1170 	  if ((saw_arg && !saw_comma) || num_args == ntok)
1171 	    goto err;
1172 
1173 	  /* Parse @label.  */
1174 	  tok->X_op = O_symbol;
1175 	  tok->X_md = O_absent;
1176 	  expression (tok);
1177 	  if (*input_line_pointer != '@')
1178 	    goto normalsymbol; /* This is not a relocation.  */
1179 
1180 	relocationsym:
1181 
1182 	  /* A relocation operand has the following form
1183 	     @identifier@relocation_type.  The identifier is already
1184 	     in tok!  */
1185 	  if (tok->X_op != O_symbol)
1186 	    {
1187 	      as_bad (_("No valid label relocation operand"));
1188 	      goto err;
1189 	    }
1190 
1191 	  /* Parse @relocation_type.  */
1192 	  input_line_pointer++;
1193 	  c = get_symbol_name (&reloc_name);
1194 	  len = input_line_pointer - reloc_name;
1195 	  if (len == 0)
1196 	    {
1197 	      as_bad (_("No relocation operand"));
1198 	      goto err;
1199 	    }
1200 
1201 	  /* Go through known relocation and try to find a match.  */
1202 	  r = &arc_reloc_op[0];
1203 	  for (i = arc_num_reloc_op - 1; i >= 0; i--, r++)
1204 	    if (len == r->length
1205 		&& memcmp (reloc_name, r->name, len) == 0)
1206 	      break;
1207 	  if (i < 0)
1208 	    {
1209 	      as_bad (_("Unknown relocation operand: @%s"), reloc_name);
1210 	      goto err;
1211 	    }
1212 
1213 	  *input_line_pointer = c;
1214 	  SKIP_WHITESPACE_AFTER_NAME ();
1215 	  /* Extra check for TLS: base.  */
1216 	  if (*input_line_pointer == '@')
1217 	    {
1218 	      symbolS *base;
1219 	      if (tok->X_op_symbol != NULL
1220 		  || tok->X_op != O_symbol)
1221 		{
1222 		  as_bad (_("Unable to parse TLS base: %s"),
1223 			  input_line_pointer);
1224 		  goto err;
1225 		}
1226 	      input_line_pointer++;
1227 	      char *sym_name;
1228 	      c = get_symbol_name (&sym_name);
1229 	      base = symbol_find_or_make (sym_name);
1230 	      tok->X_op = O_subtract;
1231 	      tok->X_op_symbol = base;
1232 	      restore_line_pointer (c);
1233 	      tmpE.X_add_number = 0;
1234 	    }
1235 	  if ((*input_line_pointer != '+')
1236 		   && (*input_line_pointer != '-'))
1237 	    {
1238 	      tmpE.X_add_number = 0;
1239 	    }
1240 	  else
1241 	    {
1242 	      /* Parse the constant of a complex relocation expression
1243 		 like @identifier@reloc +/- const.  */
1244 	      if (! r->complex_expr)
1245 		{
1246 		  as_bad (_("@%s is not a complex relocation."), r->name);
1247 		  goto err;
1248 		}
1249 	      expression (&tmpE);
1250 	      if (tmpE.X_op != O_constant)
1251 		{
1252 		  as_bad (_("Bad expression: @%s + %s."),
1253 			  r->name, input_line_pointer);
1254 		  goto err;
1255 		}
1256 	    }
1257 
1258 	  tok->X_md = r->op;
1259 	  tok->X_add_number = tmpE.X_add_number;
1260 
1261 	  debug_exp (tok);
1262 
1263 	  saw_comma = FALSE;
1264 	  saw_arg = TRUE;
1265 	  tok++;
1266 	  num_args++;
1267 	  break;
1268 
1269 	case '%':
1270 	  /* Can be a register.  */
1271 	  ++input_line_pointer;
1272 	  /* Fall through.  */
1273 	default:
1274 
1275 	  if ((saw_arg && !saw_comma) || num_args == ntok)
1276 	    goto err;
1277 
1278 	  tok->X_op = O_absent;
1279 	  tok->X_md = O_absent;
1280 	  expression (tok);
1281 
1282 	  /* Legacy: There are cases when we have
1283 	     identifier@relocation_type, if it is the case parse the
1284 	     relocation type as well.  */
1285 	  if (*input_line_pointer == '@')
1286 	    goto relocationsym;
1287 
1288 	normalsymbol:
1289 	  debug_exp (tok);
1290 
1291 	  if (tok->X_op == O_illegal
1292               || tok->X_op == O_absent
1293               || num_args == ntok)
1294 	    goto err;
1295 
1296 	  saw_comma = FALSE;
1297 	  saw_arg = TRUE;
1298 	  tok++;
1299 	  num_args++;
1300 	  break;
1301 	}
1302     }
1303 
1304  fini:
1305   if (saw_comma || brk_lvl)
1306     goto err;
1307   input_line_pointer = old_input_line_pointer;
1308 
1309   return num_args;
1310 
1311  err:
1312   if (brk_lvl)
1313     as_bad (_("Brackets in operand field incorrect"));
1314   else if (saw_comma)
1315     as_bad (_("extra comma"));
1316   else if (!saw_arg)
1317     as_bad (_("missing argument"));
1318   else
1319     as_bad (_("missing comma or colon"));
1320   input_line_pointer = old_input_line_pointer;
1321   return -1;
1322 }
1323 
1324 /* Parse the flags to a structure.  */
1325 
1326 static int
1327 tokenize_flags (const char *str,
1328 		struct arc_flags flags[],
1329 		int nflg)
1330 {
1331   char *old_input_line_pointer;
1332   bfd_boolean saw_flg = FALSE;
1333   bfd_boolean saw_dot = FALSE;
1334   int num_flags  = 0;
1335   size_t flgnamelen;
1336 
1337   memset (flags, 0, sizeof (*flags) * nflg);
1338 
1339   /* Save and restore input_line_pointer around this function.  */
1340   old_input_line_pointer = input_line_pointer;
1341   input_line_pointer = (char *) str;
1342 
1343   while (*input_line_pointer)
1344     {
1345       switch (*input_line_pointer)
1346 	{
1347 	case ' ':
1348 	case '\0':
1349 	  goto fini;
1350 
1351 	case '.':
1352 	  input_line_pointer++;
1353 	  if (saw_dot)
1354 	    goto err;
1355 	  saw_dot = TRUE;
1356 	  saw_flg = FALSE;
1357 	  break;
1358 
1359 	default:
1360 	  if (saw_flg && !saw_dot)
1361 	    goto err;
1362 
1363 	  if (num_flags >= nflg)
1364 	    goto err;
1365 
1366 	  flgnamelen = strspn (input_line_pointer,
1367 			       "abcdefghijklmnopqrstuvwxyz0123456789");
1368 	  if (flgnamelen > MAX_FLAG_NAME_LENGTH)
1369 	    goto err;
1370 
1371 	  memcpy (flags->name, input_line_pointer, flgnamelen);
1372 
1373 	  input_line_pointer += flgnamelen;
1374 	  flags++;
1375 	  saw_dot = FALSE;
1376 	  saw_flg = TRUE;
1377 	  num_flags++;
1378 	  break;
1379 	}
1380     }
1381 
1382  fini:
1383   input_line_pointer = old_input_line_pointer;
1384   return num_flags;
1385 
1386  err:
1387   if (saw_dot)
1388     as_bad (_("extra dot"));
1389   else if (!saw_flg)
1390     as_bad (_("unrecognized flag"));
1391   else
1392     as_bad (_("failed to parse flags"));
1393   input_line_pointer = old_input_line_pointer;
1394   return -1;
1395 }
1396 
1397 /* Apply the fixups in order.  */
1398 
1399 static void
1400 apply_fixups (struct arc_insn *insn, fragS *fragP, int fix)
1401 {
1402   int i;
1403 
1404   for (i = 0; i < insn->nfixups; i++)
1405     {
1406       struct arc_fixup *fixup = &insn->fixups[i];
1407       int size, pcrel, offset = 0;
1408 
1409       /* FIXME! the reloc size is wrong in the BFD file.
1410 	 When it is fixed please delete me.  */
1411       size = ((insn->len == 2) && !fixup->islong) ? 2 : 4;
1412 
1413       if (fixup->islong)
1414 	offset = insn->len;
1415 
1416       /* Some fixups are only used internally, thus no howto.  */
1417       if ((int) fixup->reloc == 0)
1418 	as_fatal (_("Unhandled reloc type"));
1419 
1420       if ((int) fixup->reloc < 0)
1421 	{
1422 	  /* FIXME! the reloc size is wrong in the BFD file.
1423 	     When it is fixed please enable me.
1424 	     size = ((insn->len == 2 && !fixup->islong) ? 2 : 4; */
1425 	  pcrel = fixup->pcrel;
1426 	}
1427       else
1428 	{
1429 	  reloc_howto_type *reloc_howto =
1430 	    bfd_reloc_type_lookup (stdoutput,
1431 				   (bfd_reloc_code_real_type) fixup->reloc);
1432 	  gas_assert (reloc_howto);
1433 
1434 	  /* FIXME! the reloc size is wrong in the BFD file.
1435 	     When it is fixed please enable me.
1436 	     size = bfd_get_reloc_size (reloc_howto); */
1437 	  pcrel = reloc_howto->pc_relative;
1438 	}
1439 
1440       pr_debug ("%s:%d: apply_fixups: new %s fixup (PCrel:%s) of size %d @ \
1441 offset %d + %d\n",
1442 		fragP->fr_file, fragP->fr_line,
1443 		(fixup->reloc < 0) ? "Internal" :
1444 		bfd_get_reloc_code_name (fixup->reloc),
1445 		pcrel ? "Y" : "N",
1446 		size, fix, offset);
1447       fix_new_exp (fragP, fix + offset,
1448 		   size, &fixup->exp, pcrel, fixup->reloc);
1449 
1450       /* Check for ZOLs, and update symbol info if any.  */
1451       if (LP_INSN (insn->insn))
1452 	{
1453 	  gas_assert (fixup->exp.X_add_symbol);
1454 	  ARC_SET_FLAG (fixup->exp.X_add_symbol, ARC_FLAG_ZOL);
1455 	}
1456     }
1457 }
1458 
1459 /* Actually output an instruction with its fixup.  */
1460 
1461 static void
1462 emit_insn0 (struct arc_insn *insn, char *where, bfd_boolean relax)
1463 {
1464   char *f = where;
1465   size_t total_len;
1466 
1467   pr_debug ("Emit insn : 0x%llx\n", insn->insn);
1468   pr_debug ("\tLength  : 0x%d\n", insn->len);
1469   pr_debug ("\tLong imm: 0x%lx\n", insn->limm);
1470 
1471   /* Write out the instruction.  */
1472   total_len = insn->len + (insn->has_limm ? 4 : 0);
1473   if (!relax)
1474     f = frag_more (total_len);
1475 
1476   md_number_to_chars_midend(f, insn->insn, insn->len);
1477 
1478   if (insn->has_limm)
1479     md_number_to_chars_midend (f + insn->len, insn->limm, 4);
1480   dwarf2_emit_insn (total_len);
1481 
1482   if (!relax)
1483     apply_fixups (insn, frag_now, (f - frag_now->fr_literal));
1484 }
1485 
1486 static void
1487 emit_insn1 (struct arc_insn *insn)
1488 {
1489   /* How frag_var's args are currently configured:
1490      - rs_machine_dependent, to dictate it's a relaxation frag.
1491      - FRAG_MAX_GROWTH, maximum size of instruction
1492      - 0, variable size that might grow...unused by generic relaxation.
1493      - frag_now->fr_subtype, fr_subtype starting value, set previously.
1494      - s, opand expression.
1495      - 0, offset but it's unused.
1496      - 0, opcode but it's unused.  */
1497   symbolS *s = make_expr_symbol (&insn->fixups[0].exp);
1498   frag_now->tc_frag_data.pcrel = insn->fixups[0].pcrel;
1499 
1500   if (frag_room () < FRAG_MAX_GROWTH)
1501     {
1502       /* Handle differently when frag literal memory is exhausted.
1503 	 This is used because when there's not enough memory left in
1504 	 the current frag, a new frag is created and the information
1505 	 we put into frag_now->tc_frag_data is disregarded.  */
1506 
1507       struct arc_relax_type relax_info_copy;
1508       relax_substateT subtype = frag_now->fr_subtype;
1509 
1510       memcpy (&relax_info_copy, &frag_now->tc_frag_data,
1511 	      sizeof (struct arc_relax_type));
1512 
1513       frag_wane (frag_now);
1514       frag_grow (FRAG_MAX_GROWTH);
1515 
1516       memcpy (&frag_now->tc_frag_data, &relax_info_copy,
1517 	      sizeof (struct arc_relax_type));
1518 
1519       frag_var (rs_machine_dependent, FRAG_MAX_GROWTH, 0,
1520 		subtype, s, 0, 0);
1521     }
1522   else
1523     frag_var (rs_machine_dependent, FRAG_MAX_GROWTH, 0,
1524 	      frag_now->fr_subtype, s, 0, 0);
1525 }
1526 
1527 static void
1528 emit_insn (struct arc_insn *insn)
1529 {
1530   if (insn->relax)
1531     emit_insn1 (insn);
1532   else
1533     emit_insn0 (insn, NULL, FALSE);
1534 }
1535 
1536 /* Check whether a symbol involves a register.  */
1537 
1538 static bfd_boolean
1539 contains_register (symbolS *sym)
1540 {
1541   if (sym)
1542     {
1543       expressionS *ex = symbol_get_value_expression (sym);
1544 
1545       return ((O_register == ex->X_op)
1546 	      && !contains_register (ex->X_add_symbol)
1547 	      && !contains_register (ex->X_op_symbol));
1548     }
1549 
1550   return FALSE;
1551 }
1552 
1553 /* Returns the register number within a symbol.  */
1554 
1555 static int
1556 get_register (symbolS *sym)
1557 {
1558   if (!contains_register (sym))
1559     return -1;
1560 
1561   expressionS *ex = symbol_get_value_expression (sym);
1562   return regno (ex->X_add_number);
1563 }
1564 
1565 /* Return true if a RELOC is generic.  A generic reloc is PC-rel of a
1566    simple ME relocation (e.g. RELOC_ARC_32_ME, BFD_RELOC_ARC_PC32.  */
1567 
1568 static bfd_boolean
1569 generic_reloc_p (extended_bfd_reloc_code_real_type reloc)
1570 {
1571   if (!reloc)
1572     return FALSE;
1573 
1574   switch (reloc)
1575     {
1576     case BFD_RELOC_ARC_SDA_LDST:
1577     case BFD_RELOC_ARC_SDA_LDST1:
1578     case BFD_RELOC_ARC_SDA_LDST2:
1579     case BFD_RELOC_ARC_SDA16_LD:
1580     case BFD_RELOC_ARC_SDA16_LD1:
1581     case BFD_RELOC_ARC_SDA16_LD2:
1582     case BFD_RELOC_ARC_SDA16_ST2:
1583     case BFD_RELOC_ARC_SDA32_ME:
1584       return FALSE;
1585     default:
1586       return TRUE;
1587     }
1588 }
1589 
1590 /* Allocates a tok entry.  */
1591 
1592 static int
1593 allocate_tok (expressionS *tok, int ntok, int cidx)
1594 {
1595   if (ntok > MAX_INSN_ARGS - 2)
1596     return 0; /* No space left.  */
1597 
1598   if (cidx > ntok)
1599     return 0; /* Incorrect args.  */
1600 
1601   memcpy (&tok[ntok+1], &tok[ntok], sizeof (*tok));
1602 
1603   if (cidx == ntok)
1604     return 1; /* Success.  */
1605   return allocate_tok (tok, ntok - 1, cidx);
1606 }
1607 
1608 /* Check if an particular ARC feature is enabled.  */
1609 
1610 static bfd_boolean
1611 check_cpu_feature (insn_subclass_t sc)
1612 {
1613   if (is_code_density_p (sc) && !(selected_cpu.features & CD))
1614     return FALSE;
1615 
1616   if (is_spfp_p (sc) && !(selected_cpu.features & SPX))
1617     return FALSE;
1618 
1619   if (is_dpfp_p (sc) && !(selected_cpu.features & DPX))
1620     return FALSE;
1621 
1622   if (is_fpuda_p (sc) && !(selected_cpu.features & DPA))
1623     return FALSE;
1624 
1625   if (is_nps400_p (sc) && !(selected_cpu.features & NPS400))
1626     return FALSE;
1627 
1628   return TRUE;
1629 }
1630 
1631 /* Parse the flags described by FIRST_PFLAG and NFLGS against the flag
1632    operands in OPCODE.  Stores the matching OPCODES into the FIRST_PFLAG
1633    array and returns TRUE if the flag operands all match, otherwise,
1634    returns FALSE, in which case the FIRST_PFLAG array may have been
1635    modified.  */
1636 
1637 static bfd_boolean
1638 parse_opcode_flags (const struct arc_opcode *opcode,
1639                     int nflgs,
1640                     struct arc_flags *first_pflag)
1641 {
1642   int lnflg, i;
1643   const unsigned char *flgidx;
1644 
1645   lnflg = nflgs;
1646   for (i = 0; i < nflgs; i++)
1647     first_pflag[i].flgp = NULL;
1648 
1649   /* Check the flags.  Iterate over the valid flag classes.  */
1650   for (flgidx = opcode->flags; *flgidx; ++flgidx)
1651     {
1652       /* Get a valid flag class.  */
1653       const struct arc_flag_class *cl_flags = &arc_flag_classes[*flgidx];
1654       const unsigned *flgopridx;
1655       int cl_matches = 0;
1656       struct arc_flags *pflag = NULL;
1657 
1658       /* Check if opcode has implicit flag classes.  */
1659       if (cl_flags->flag_class & F_CLASS_IMPLICIT)
1660 	continue;
1661 
1662       /* Check for extension conditional codes.  */
1663       if (ext_condcode.arc_ext_condcode
1664           && cl_flags->flag_class & F_CLASS_EXTEND)
1665         {
1666           struct arc_flag_operand *pf = ext_condcode.arc_ext_condcode;
1667           while (pf->name)
1668             {
1669               pflag = first_pflag;
1670               for (i = 0; i < nflgs; i++, pflag++)
1671                 {
1672                   if (!strcmp (pf->name, pflag->name))
1673                     {
1674                       if (pflag->flgp != NULL)
1675                         return FALSE;
1676                       /* Found it.  */
1677                       cl_matches++;
1678                       pflag->flgp = pf;
1679                       lnflg--;
1680                       break;
1681                     }
1682                 }
1683               pf++;
1684             }
1685         }
1686 
1687       for (flgopridx = cl_flags->flags; *flgopridx; ++flgopridx)
1688         {
1689           const struct arc_flag_operand *flg_operand;
1690 
1691           pflag = first_pflag;
1692           flg_operand = &arc_flag_operands[*flgopridx];
1693           for (i = 0; i < nflgs; i++, pflag++)
1694             {
1695               /* Match against the parsed flags.  */
1696               if (!strcmp (flg_operand->name, pflag->name))
1697                 {
1698                   if (pflag->flgp != NULL)
1699                     return FALSE;
1700                   cl_matches++;
1701                   pflag->flgp = flg_operand;
1702                   lnflg--;
1703                   break; /* goto next flag class and parsed flag.  */
1704                 }
1705             }
1706         }
1707 
1708       if ((cl_flags->flag_class & F_CLASS_REQUIRED) && cl_matches == 0)
1709         return FALSE;
1710       if ((cl_flags->flag_class & F_CLASS_OPTIONAL) && cl_matches > 1)
1711         return FALSE;
1712     }
1713 
1714   /* Did I check all the parsed flags?  */
1715   return lnflg ? FALSE : TRUE;
1716 }
1717 
1718 
1719 /* Search forward through all variants of an opcode looking for a
1720    syntax match.  */
1721 
1722 static const struct arc_opcode *
1723 find_opcode_match (const struct arc_opcode_hash_entry *entry,
1724 		   expressionS *tok,
1725 		   int *pntok,
1726 		   struct arc_flags *first_pflag,
1727 		   int nflgs,
1728 		   int *pcpumatch,
1729 		   const char **errmsg)
1730 {
1731   const struct arc_opcode *opcode;
1732   struct arc_opcode_hash_entry_iterator iter;
1733   int ntok = *pntok;
1734   int got_cpu_match = 0;
1735   expressionS bktok[MAX_INSN_ARGS];
1736   int bkntok;
1737   expressionS emptyE;
1738 
1739   arc_opcode_hash_entry_iterator_init (&iter);
1740   memset (&emptyE, 0, sizeof (emptyE));
1741   memcpy (bktok, tok, MAX_INSN_ARGS * sizeof (*tok));
1742   bkntok = ntok;
1743 
1744   for (opcode = arc_opcode_hash_entry_iterator_next (entry, &iter);
1745        opcode != NULL;
1746        opcode = arc_opcode_hash_entry_iterator_next (entry, &iter))
1747     {
1748       const unsigned char *opidx;
1749       int tokidx = 0;
1750       const expressionS *t = &emptyE;
1751 
1752       pr_debug ("%s:%d: find_opcode_match: trying opcode 0x%08llX ",
1753 		frag_now->fr_file, frag_now->fr_line, opcode->opcode);
1754 
1755       /* Don't match opcodes that don't exist on this
1756 	 architecture.  */
1757       if (!(opcode->cpu & selected_cpu.flags))
1758 	goto match_failed;
1759 
1760       if (!check_cpu_feature (opcode->subclass))
1761 	goto match_failed;
1762 
1763       got_cpu_match = 1;
1764       pr_debug ("cpu ");
1765 
1766       /* Check the operands.  */
1767       for (opidx = opcode->operands; *opidx; ++opidx)
1768 	{
1769 	  const struct arc_operand *operand = &arc_operands[*opidx];
1770 
1771 	  /* Only take input from real operands.  */
1772 	  if (ARC_OPERAND_IS_FAKE (operand))
1773 	    continue;
1774 
1775 	  /* When we expect input, make sure we have it.  */
1776 	  if (tokidx >= ntok)
1777 	    goto match_failed;
1778 
1779 	  /* Match operand type with expression type.  */
1780 	  switch (operand->flags & ARC_OPERAND_TYPECHECK_MASK)
1781 	    {
1782             case ARC_OPERAND_ADDRTYPE:
1783 	      {
1784 		*errmsg = NULL;
1785 
1786 		/* Check to be an address type.  */
1787 		if (tok[tokidx].X_op != O_addrtype)
1788 		  goto match_failed;
1789 
1790 		/* All address type operands need to have an insert
1791 		   method in order to check that we have the correct
1792 		   address type.  */
1793 		gas_assert (operand->insert != NULL);
1794 		(*operand->insert) (0, tok[tokidx].X_add_number,
1795 				    errmsg);
1796 		if (*errmsg != NULL)
1797 		  goto match_failed;
1798 	      }
1799               break;
1800 
1801 	    case ARC_OPERAND_IR:
1802 	      /* Check to be a register.  */
1803 	      if ((tok[tokidx].X_op != O_register
1804 		   || !is_ir_num (tok[tokidx].X_add_number))
1805 		  && !(operand->flags & ARC_OPERAND_IGNORE))
1806 		goto match_failed;
1807 
1808 	      /* If expect duplicate, make sure it is duplicate.  */
1809 	      if (operand->flags & ARC_OPERAND_DUPLICATE)
1810 		{
1811 		  /* Check for duplicate.  */
1812 		  if (t->X_op != O_register
1813 		      || !is_ir_num (t->X_add_number)
1814 		      || (regno (t->X_add_number) !=
1815 			  regno (tok[tokidx].X_add_number)))
1816 		    goto match_failed;
1817 		}
1818 
1819 	      /* Special handling?  */
1820 	      if (operand->insert)
1821 		{
1822 		  *errmsg = NULL;
1823 		  (*operand->insert)(0,
1824 				     regno (tok[tokidx].X_add_number),
1825 				     errmsg);
1826 		  if (*errmsg)
1827 		    {
1828 		      if (operand->flags & ARC_OPERAND_IGNORE)
1829 			{
1830 			  /* Missing argument, create one.  */
1831 			  if (!allocate_tok (tok, ntok - 1, tokidx))
1832 			    goto match_failed;
1833 
1834 			  tok[tokidx].X_op = O_absent;
1835 			  ++ntok;
1836 			}
1837 		      else
1838 			goto match_failed;
1839 		    }
1840 		}
1841 
1842 	      t = &tok[tokidx];
1843 	      break;
1844 
1845 	    case ARC_OPERAND_BRAKET:
1846 	      /* Check if bracket is also in opcode table as
1847 		 operand.  */
1848 	      if (tok[tokidx].X_op != O_bracket)
1849 		goto match_failed;
1850 	      break;
1851 
1852             case ARC_OPERAND_COLON:
1853               /* Check if colon is also in opcode table as operand.  */
1854               if (tok[tokidx].X_op != O_colon)
1855                 goto match_failed;
1856               break;
1857 
1858 	    case ARC_OPERAND_LIMM:
1859 	    case ARC_OPERAND_SIGNED:
1860 	    case ARC_OPERAND_UNSIGNED:
1861 	      switch (tok[tokidx].X_op)
1862 		{
1863 		case O_illegal:
1864 		case O_absent:
1865 		case O_register:
1866 		  goto match_failed;
1867 
1868 		case O_bracket:
1869 		  /* Got an (too) early bracket, check if it is an
1870 		     ignored operand.  N.B. This procedure works only
1871 		     when bracket is the last operand!  */
1872 		  if (!(operand->flags & ARC_OPERAND_IGNORE))
1873 		    goto match_failed;
1874 		  /* Insert the missing operand.  */
1875 		  if (!allocate_tok (tok, ntok - 1, tokidx))
1876 		    goto match_failed;
1877 
1878 		  tok[tokidx].X_op = O_absent;
1879 		  ++ntok;
1880 		  break;
1881 
1882 		case O_symbol:
1883 		  {
1884 		    const char *p;
1885 		    const struct arc_aux_reg *auxr;
1886 
1887 		    if (opcode->insn_class != AUXREG)
1888 		      goto de_fault;
1889 		    p = S_GET_NAME (tok[tokidx].X_add_symbol);
1890 
1891 		    auxr = hash_find (arc_aux_hash, p);
1892 		    if (auxr)
1893 		      {
1894 			/* We modify the token array here, safe in the
1895 			   knowledge, that if this was the wrong
1896 			   choice then the original contents will be
1897 			   restored from BKTOK.  */
1898 			tok[tokidx].X_op = O_constant;
1899 			tok[tokidx].X_add_number = auxr->address;
1900 			ARC_SET_FLAG (tok[tokidx].X_add_symbol, ARC_FLAG_AUX);
1901 		      }
1902 
1903 		    if (tok[tokidx].X_op != O_constant)
1904 		      goto de_fault;
1905 		  }
1906 		  /* Fall through.  */
1907 		case O_constant:
1908 		  /* Check the range.  */
1909 		  if (operand->bits != 32
1910 		      && !(operand->flags & ARC_OPERAND_NCHK))
1911 		    {
1912 		      offsetT min, max, val;
1913 		      val = tok[tokidx].X_add_number;
1914 
1915 		      if (operand->flags & ARC_OPERAND_SIGNED)
1916 			{
1917 			  max = (1 << (operand->bits - 1)) - 1;
1918 			  min = -(1 << (operand->bits - 1));
1919 			}
1920 		      else
1921 			{
1922 			  max = (1 << operand->bits) - 1;
1923 			  min = 0;
1924 			}
1925 
1926 		      if (val < min || val > max)
1927 			goto match_failed;
1928 
1929 		      /* Check alignments.  */
1930 		      if ((operand->flags & ARC_OPERAND_ALIGNED32)
1931 			  && (val & 0x03))
1932 			goto match_failed;
1933 
1934 		      if ((operand->flags & ARC_OPERAND_ALIGNED16)
1935 			  && (val & 0x01))
1936 			goto match_failed;
1937 		    }
1938 		  else if (operand->flags & ARC_OPERAND_NCHK)
1939 		    {
1940 		      if (operand->insert)
1941 			{
1942 			  *errmsg = NULL;
1943 			  (*operand->insert)(0,
1944 					     tok[tokidx].X_add_number,
1945 					     errmsg);
1946 			  if (*errmsg)
1947 			    goto match_failed;
1948 			}
1949 		      else if (!(operand->flags & ARC_OPERAND_IGNORE))
1950 			goto match_failed;
1951 		    }
1952 		  break;
1953 
1954 		case O_subtract:
1955 		  /* Check if it is register range.  */
1956 		  if ((tok[tokidx].X_add_number == 0)
1957 		      && contains_register (tok[tokidx].X_add_symbol)
1958 		      && contains_register (tok[tokidx].X_op_symbol))
1959 		    {
1960 		      int regs;
1961 
1962 		      regs = get_register (tok[tokidx].X_add_symbol);
1963 		      regs <<= 16;
1964 		      regs |= get_register (tok[tokidx].X_op_symbol);
1965 		      if (operand->insert)
1966 			{
1967 			  *errmsg = NULL;
1968 			  (*operand->insert)(0,
1969 					     regs,
1970 					     errmsg);
1971 			  if (*errmsg)
1972 			    goto match_failed;
1973 			}
1974 		      else
1975 			goto match_failed;
1976 		      break;
1977 		    }
1978 		  /* Fall through.  */
1979 		default:
1980 		de_fault:
1981 		  if (operand->default_reloc == 0)
1982 		    goto match_failed; /* The operand needs relocation.  */
1983 
1984 		  /* Relocs requiring long immediate.  FIXME! make it
1985 		     generic and move it to a function.  */
1986 		  switch (tok[tokidx].X_md)
1987 		    {
1988 		    case O_gotoff:
1989 		    case O_gotpc:
1990 		    case O_pcl:
1991 		    case O_tpoff:
1992 		    case O_dtpoff:
1993 		    case O_tlsgd:
1994 		    case O_tlsie:
1995 		      if (!(operand->flags & ARC_OPERAND_LIMM))
1996 			goto match_failed;
1997 		      /* Fall through.  */
1998 		    case O_absent:
1999 		      if (!generic_reloc_p (operand->default_reloc))
2000 			goto match_failed;
2001 		      break;
2002 		    default:
2003 		      break;
2004 		    }
2005 		  break;
2006 		}
2007 	      /* If expect duplicate, make sure it is duplicate.  */
2008 	      if (operand->flags & ARC_OPERAND_DUPLICATE)
2009 		{
2010 		  if (t->X_op == O_illegal
2011 		      || t->X_op == O_absent
2012 		      || t->X_op == O_register
2013 		      || (t->X_add_number != tok[tokidx].X_add_number))
2014 		    goto match_failed;
2015 		}
2016 	      t = &tok[tokidx];
2017 	      break;
2018 
2019 	    default:
2020 	      /* Everything else should have been fake.  */
2021 	      abort ();
2022 	    }
2023 
2024 	  ++tokidx;
2025 	}
2026       pr_debug ("opr ");
2027 
2028       /* Setup ready for flag parsing.  */
2029       if (!parse_opcode_flags (opcode, nflgs, first_pflag))
2030 	goto match_failed;
2031 
2032       pr_debug ("flg");
2033       /* Possible match -- did we use all of our input?  */
2034       if (tokidx == ntok)
2035 	{
2036 	  *pntok = ntok;
2037 	  pr_debug ("\n");
2038 	  return opcode;
2039 	}
2040 
2041     match_failed:;
2042       pr_debug ("\n");
2043       /* Restore the original parameters.  */
2044       memcpy (tok, bktok, MAX_INSN_ARGS * sizeof (*tok));
2045       ntok = bkntok;
2046     }
2047 
2048   if (*pcpumatch)
2049     *pcpumatch = got_cpu_match;
2050 
2051   return NULL;
2052 }
2053 
2054 /* Swap operand tokens.  */
2055 
2056 static void
2057 swap_operand (expressionS *operand_array,
2058 	      unsigned source,
2059 	      unsigned destination)
2060 {
2061   expressionS cpy_operand;
2062   expressionS *src_operand;
2063   expressionS *dst_operand;
2064   size_t size;
2065 
2066   if (source == destination)
2067     return;
2068 
2069   src_operand = &operand_array[source];
2070   dst_operand = &operand_array[destination];
2071   size = sizeof (expressionS);
2072 
2073   /* Make copy of operand to swap with and swap.  */
2074   memcpy (&cpy_operand, dst_operand, size);
2075   memcpy (dst_operand, src_operand, size);
2076   memcpy (src_operand, &cpy_operand, size);
2077 }
2078 
2079 /* Check if *op matches *tok type.
2080    Returns FALSE if they don't match, TRUE if they match.  */
2081 
2082 static bfd_boolean
2083 pseudo_operand_match (const expressionS *tok,
2084 		      const struct arc_operand_operation *op)
2085 {
2086   offsetT min, max, val;
2087   bfd_boolean ret;
2088   const struct arc_operand *operand_real = &arc_operands[op->operand_idx];
2089 
2090   ret = FALSE;
2091   switch (tok->X_op)
2092     {
2093     case O_constant:
2094       if (operand_real->bits == 32 && (operand_real->flags & ARC_OPERAND_LIMM))
2095 	ret = 1;
2096       else if (!(operand_real->flags & ARC_OPERAND_IR))
2097 	{
2098 	  val = tok->X_add_number + op->count;
2099 	  if (operand_real->flags & ARC_OPERAND_SIGNED)
2100 	    {
2101 	      max = (1 << (operand_real->bits - 1)) - 1;
2102 	      min = -(1 << (operand_real->bits - 1));
2103 	    }
2104 	  else
2105 	    {
2106 	      max = (1 << operand_real->bits) - 1;
2107 	      min = 0;
2108 	    }
2109 	  if (min <= val && val <= max)
2110 	    ret = TRUE;
2111 	}
2112       break;
2113 
2114     case O_symbol:
2115       /* Handle all symbols as long immediates or signed 9.  */
2116       if (operand_real->flags & ARC_OPERAND_LIMM
2117 	  || ((operand_real->flags & ARC_OPERAND_SIGNED)
2118 	      && operand_real->bits == 9))
2119 	ret = TRUE;
2120       break;
2121 
2122     case O_register:
2123       if (operand_real->flags & ARC_OPERAND_IR)
2124 	ret = TRUE;
2125       break;
2126 
2127     case O_bracket:
2128       if (operand_real->flags & ARC_OPERAND_BRAKET)
2129 	ret = TRUE;
2130       break;
2131 
2132     default:
2133       /* Unknown.  */
2134       break;
2135     }
2136   return ret;
2137 }
2138 
2139 /* Find pseudo instruction in array.  */
2140 
2141 static const struct arc_pseudo_insn *
2142 find_pseudo_insn (const char *opname,
2143 		  int ntok,
2144 		  const expressionS *tok)
2145 {
2146   const struct arc_pseudo_insn *pseudo_insn = NULL;
2147   const struct arc_operand_operation *op;
2148   unsigned int i;
2149   int j;
2150 
2151   for (i = 0; i < arc_num_pseudo_insn; ++i)
2152     {
2153       pseudo_insn = &arc_pseudo_insns[i];
2154       if (strcmp (pseudo_insn->mnemonic_p, opname) == 0)
2155 	{
2156 	  op = pseudo_insn->operand;
2157 	  for (j = 0; j < ntok; ++j)
2158 	    if (!pseudo_operand_match (&tok[j], &op[j]))
2159 	      break;
2160 
2161 	  /* Found the right instruction.  */
2162 	  if (j == ntok)
2163 	    return pseudo_insn;
2164 	}
2165     }
2166   return NULL;
2167 }
2168 
2169 /* Assumes the expressionS *tok is of sufficient size.  */
2170 
2171 static const struct arc_opcode_hash_entry *
2172 find_special_case_pseudo (const char *opname,
2173 			  int *ntok,
2174 			  expressionS *tok,
2175 			  int *nflgs,
2176 			  struct arc_flags *pflags)
2177 {
2178   const struct arc_pseudo_insn *pseudo_insn = NULL;
2179   const struct arc_operand_operation *operand_pseudo;
2180   const struct arc_operand *operand_real;
2181   unsigned i;
2182   char construct_operand[MAX_CONSTR_STR];
2183 
2184   /* Find whether opname is in pseudo instruction array.  */
2185   pseudo_insn = find_pseudo_insn (opname, *ntok, tok);
2186 
2187   if (pseudo_insn == NULL)
2188     return NULL;
2189 
2190   /* Handle flag, Limited to one flag at the moment.  */
2191   if (pseudo_insn->flag_r != NULL)
2192     *nflgs += tokenize_flags (pseudo_insn->flag_r, &pflags[*nflgs],
2193 			      MAX_INSN_FLGS - *nflgs);
2194 
2195   /* Handle operand operations.  */
2196   for (i = 0; i < pseudo_insn->operand_cnt; ++i)
2197     {
2198       operand_pseudo = &pseudo_insn->operand[i];
2199       operand_real = &arc_operands[operand_pseudo->operand_idx];
2200 
2201       if (operand_real->flags & ARC_OPERAND_BRAKET
2202 	  && !operand_pseudo->needs_insert)
2203 	continue;
2204 
2205       /* Has to be inserted (i.e. this token does not exist yet).  */
2206       if (operand_pseudo->needs_insert)
2207 	{
2208 	  if (operand_real->flags & ARC_OPERAND_BRAKET)
2209 	    {
2210 	      tok[i].X_op = O_bracket;
2211 	      ++(*ntok);
2212 	      continue;
2213 	    }
2214 
2215 	  /* Check if operand is a register or constant and handle it
2216 	     by type.  */
2217 	  if (operand_real->flags & ARC_OPERAND_IR)
2218 	    snprintf (construct_operand, MAX_CONSTR_STR, "r%d",
2219 		      operand_pseudo->count);
2220 	  else
2221 	    snprintf (construct_operand, MAX_CONSTR_STR, "%d",
2222 		      operand_pseudo->count);
2223 
2224 	  tokenize_arguments (construct_operand, &tok[i], 1);
2225 	  ++(*ntok);
2226 	}
2227 
2228       else if (operand_pseudo->count)
2229 	{
2230 	  /* Operand number has to be adjusted accordingly (by operand
2231 	     type).  */
2232 	  switch (tok[i].X_op)
2233 	    {
2234 	    case O_constant:
2235 	      tok[i].X_add_number += operand_pseudo->count;
2236 	      break;
2237 
2238 	    case O_symbol:
2239 	      break;
2240 
2241 	    default:
2242 	      /* Ignored.  */
2243 	      break;
2244 	    }
2245 	}
2246     }
2247 
2248   /* Swap operands if necessary.  Only supports one swap at the
2249      moment.  */
2250   for (i = 0; i < pseudo_insn->operand_cnt; ++i)
2251     {
2252       operand_pseudo = &pseudo_insn->operand[i];
2253 
2254       if (operand_pseudo->swap_operand_idx == i)
2255 	continue;
2256 
2257       swap_operand (tok, i, operand_pseudo->swap_operand_idx);
2258 
2259       /* Prevent a swap back later by breaking out.  */
2260       break;
2261     }
2262 
2263   return arc_find_opcode (pseudo_insn->mnemonic_r);
2264 }
2265 
2266 static const struct arc_opcode_hash_entry *
2267 find_special_case_flag (const char *opname,
2268 			int *nflgs,
2269 			struct arc_flags *pflags)
2270 {
2271   unsigned int i;
2272   const char *flagnm;
2273   unsigned flag_idx, flag_arr_idx;
2274   size_t flaglen, oplen;
2275   const struct arc_flag_special *arc_flag_special_opcode;
2276   const struct arc_opcode_hash_entry *entry;
2277 
2278   /* Search for special case instruction.  */
2279   for (i = 0; i < arc_num_flag_special; i++)
2280     {
2281       arc_flag_special_opcode = &arc_flag_special_cases[i];
2282       oplen = strlen (arc_flag_special_opcode->name);
2283 
2284       if (strncmp (opname, arc_flag_special_opcode->name, oplen) != 0)
2285 	continue;
2286 
2287       /* Found a potential special case instruction, now test for
2288 	 flags.  */
2289       for (flag_arr_idx = 0;; ++flag_arr_idx)
2290 	{
2291 	  flag_idx = arc_flag_special_opcode->flags[flag_arr_idx];
2292 	  if (flag_idx == 0)
2293 	    break;  /* End of array, nothing found.  */
2294 
2295 	  flagnm = arc_flag_operands[flag_idx].name;
2296 	  flaglen = strlen (flagnm);
2297 	  if (strcmp (opname + oplen, flagnm) == 0)
2298 	    {
2299               entry = arc_find_opcode (arc_flag_special_opcode->name);
2300 
2301 	      if (*nflgs + 1 > MAX_INSN_FLGS)
2302 		break;
2303 	      memcpy (pflags[*nflgs].name, flagnm, flaglen);
2304 	      pflags[*nflgs].name[flaglen] = '\0';
2305 	      (*nflgs)++;
2306 	      return entry;
2307 	    }
2308 	}
2309     }
2310   return NULL;
2311 }
2312 
2313 /* Used to find special case opcode.  */
2314 
2315 static const struct arc_opcode_hash_entry *
2316 find_special_case (const char *opname,
2317 		   int *nflgs,
2318 		   struct arc_flags *pflags,
2319 		   expressionS *tok,
2320 		   int *ntok)
2321 {
2322   const struct arc_opcode_hash_entry *entry;
2323 
2324   entry = find_special_case_pseudo (opname, ntok, tok, nflgs, pflags);
2325 
2326   if (entry == NULL)
2327     entry = find_special_case_flag (opname, nflgs, pflags);
2328 
2329   return entry;
2330 }
2331 
2332 /* Autodetect cpu attribute list.  */
2333 
2334 static void
2335 autodetect_attributes (const struct arc_opcode *opcode,
2336 			 const expressionS *tok,
2337 			 int ntok)
2338 {
2339   unsigned i;
2340   struct mpy_type
2341   {
2342     unsigned feature;
2343     unsigned encoding;
2344   } mpy_list[] = {{ MPY1E, 1 }, { MPY6E, 6 }, { MPY7E, 7 }, { MPY8E, 8 },
2345 		 { MPY9E, 9 }};
2346 
2347   for (i = 0; i < ARRAY_SIZE (feature_list); i++)
2348     if (opcode->subclass == feature_list[i].feature)
2349       selected_cpu.features |= feature_list[i].feature;
2350 
2351   for (i = 0; i < ARRAY_SIZE (mpy_list); i++)
2352     if (opcode->subclass == mpy_list[i].feature)
2353       mpy_option = mpy_list[i].encoding;
2354 
2355   for (i = 0; i < (unsigned) ntok; i++)
2356     {
2357       switch (tok[i].X_md)
2358 	{
2359 	case O_gotoff:
2360 	case O_gotpc:
2361 	case O_plt:
2362 	  pic_option = 2;
2363 	  break;
2364 	case O_sda:
2365 	  sda_option = 2;
2366 	  break;
2367 	case O_tlsgd:
2368 	case O_tlsie:
2369 	case O_tpoff9:
2370 	case O_tpoff:
2371 	case O_dtpoff9:
2372 	case O_dtpoff:
2373 	  tls_option = 1;
2374 	  break;
2375 	default:
2376 	  break;
2377 	}
2378     }
2379 }
2380 
2381 /* Given an opcode name, pre-tockenized set of argumenst and the
2382    opcode flags, take it all the way through emission.  */
2383 
2384 static void
2385 assemble_tokens (const char *opname,
2386 		 expressionS *tok,
2387 		 int ntok,
2388 		 struct arc_flags *pflags,
2389 		 int nflgs)
2390 {
2391   bfd_boolean found_something = FALSE;
2392   const struct arc_opcode_hash_entry *entry;
2393   int cpumatch = 1;
2394   const char *errmsg = NULL;
2395 
2396   /* Search opcodes.  */
2397   entry = arc_find_opcode (opname);
2398 
2399   /* Couldn't find opcode conventional way, try special cases.  */
2400   if (entry == NULL)
2401     entry = find_special_case (opname, &nflgs, pflags, tok, &ntok);
2402 
2403   if (entry != NULL)
2404     {
2405       const struct arc_opcode *opcode;
2406 
2407       pr_debug ("%s:%d: assemble_tokens: %s\n",
2408 		frag_now->fr_file, frag_now->fr_line, opname);
2409       found_something = TRUE;
2410       opcode = find_opcode_match (entry, tok, &ntok, pflags,
2411 				  nflgs, &cpumatch, &errmsg);
2412       if (opcode != NULL)
2413 	{
2414 	  struct arc_insn insn;
2415 
2416 	  autodetect_attributes (opcode,  tok, ntok);
2417 	  assemble_insn (opcode, tok, ntok, pflags, nflgs, &insn);
2418 	  emit_insn (&insn);
2419 	  return;
2420 	}
2421     }
2422 
2423   if (found_something)
2424     {
2425       if (cpumatch)
2426 	if (errmsg)
2427 	  as_bad (_("%s for instruction '%s'"), errmsg, opname);
2428 	else
2429 	  as_bad (_("inappropriate arguments for opcode '%s'"), opname);
2430       else
2431 	as_bad (_("opcode '%s' not supported for target %s"), opname,
2432 		selected_cpu.name);
2433     }
2434   else
2435     as_bad (_("unknown opcode '%s'"), opname);
2436 }
2437 
2438 /* The public interface to the instruction assembler.  */
2439 
2440 void
2441 md_assemble (char *str)
2442 {
2443   char *opname;
2444   expressionS tok[MAX_INSN_ARGS];
2445   int ntok, nflg;
2446   size_t opnamelen;
2447   struct arc_flags flags[MAX_INSN_FLGS];
2448 
2449   /* Split off the opcode.  */
2450   opnamelen = strspn (str, "abcdefghijklmnopqrstuvwxyz_0123468");
2451   opname = xmemdup0 (str, opnamelen);
2452 
2453   /* Signalize we are assembling the instructions.  */
2454   assembling_insn = TRUE;
2455 
2456   /* Tokenize the flags.  */
2457   if ((nflg = tokenize_flags (str + opnamelen, flags, MAX_INSN_FLGS)) == -1)
2458     {
2459       as_bad (_("syntax error"));
2460       return;
2461     }
2462 
2463   /* Scan up to the end of the mnemonic which must end in space or end
2464      of string.  */
2465   str += opnamelen;
2466   for (; *str != '\0'; str++)
2467     if (*str == ' ')
2468       break;
2469 
2470   /* Tokenize the rest of the line.  */
2471   if ((ntok = tokenize_arguments (str, tok, MAX_INSN_ARGS)) < 0)
2472     {
2473       as_bad (_("syntax error"));
2474       return;
2475     }
2476 
2477   /* Finish it off.  */
2478   assemble_tokens (opname, tok, ntok, flags, nflg);
2479   assembling_insn = FALSE;
2480 }
2481 
2482 /* Callback to insert a register into the hash table.  */
2483 
2484 static void
2485 declare_register (const char *name, int number)
2486 {
2487   const char *err;
2488   symbolS *regS = symbol_create (name, reg_section,
2489 				 number, &zero_address_frag);
2490 
2491   err = hash_insert (arc_reg_hash, S_GET_NAME (regS), (void *) regS);
2492   if (err)
2493     as_fatal (_("Inserting \"%s\" into register table failed: %s"),
2494 	      name, err);
2495 }
2496 
2497 /* Construct symbols for each of the general registers.  */
2498 
2499 static void
2500 declare_register_set (void)
2501 {
2502   int i;
2503   for (i = 0; i < 64; ++i)
2504     {
2505       char name[7];
2506 
2507       sprintf (name, "r%d", i);
2508       declare_register (name, i);
2509       if ((i & 0x01) == 0)
2510 	{
2511 	  sprintf (name, "r%dr%d", i, i+1);
2512 	  declare_register (name, i);
2513 	}
2514     }
2515 }
2516 
2517 /* Construct a symbol for an address type.  */
2518 
2519 static void
2520 declare_addrtype (const char *name, int number)
2521 {
2522   const char *err;
2523   symbolS *addrtypeS = symbol_create (name, undefined_section,
2524                                       number, &zero_address_frag);
2525 
2526   err = hash_insert (arc_addrtype_hash, S_GET_NAME (addrtypeS),
2527                      (void *) addrtypeS);
2528   if (err)
2529     as_fatal (_("Inserting \"%s\" into address type table failed: %s"),
2530               name, err);
2531 }
2532 
2533 /* Port-specific assembler initialization.  This function is called
2534    once, at assembler startup time.  */
2535 
2536 void
2537 md_begin (void)
2538 {
2539   const struct arc_opcode *opcode = arc_opcodes;
2540 
2541   if (mach_selection_mode == MACH_SELECTION_NONE)
2542     arc_select_cpu (TARGET_WITH_CPU, MACH_SELECTION_FROM_DEFAULT);
2543 
2544   /* The endianness can be chosen "at the factory".  */
2545   target_big_endian = byte_order == BIG_ENDIAN;
2546 
2547   if (!bfd_set_arch_mach (stdoutput, bfd_arch_arc, selected_cpu.mach))
2548     as_warn (_("could not set architecture and machine"));
2549 
2550   /* Set elf header flags.  */
2551   bfd_set_private_flags (stdoutput, selected_cpu.eflags);
2552 
2553   /* Set up a hash table for the instructions.  */
2554   arc_opcode_hash = hash_new ();
2555   if (arc_opcode_hash == NULL)
2556     as_fatal (_("Virtual memory exhausted"));
2557 
2558   /* Initialize the hash table with the insns.  */
2559   do
2560     {
2561       const char *name = opcode->name;
2562 
2563       arc_insert_opcode (opcode);
2564 
2565       while (++opcode && opcode->name
2566 	     && (opcode->name == name
2567 		 || !strcmp (opcode->name, name)))
2568 	continue;
2569     }while (opcode->name);
2570 
2571   /* Register declaration.  */
2572   arc_reg_hash = hash_new ();
2573   if (arc_reg_hash == NULL)
2574     as_fatal (_("Virtual memory exhausted"));
2575 
2576   declare_register_set ();
2577   declare_register ("gp", 26);
2578   declare_register ("fp", 27);
2579   declare_register ("sp", 28);
2580   declare_register ("ilink", 29);
2581   declare_register ("ilink1", 29);
2582   declare_register ("ilink2", 30);
2583   declare_register ("blink", 31);
2584 
2585   /* XY memory registers.  */
2586   declare_register ("x0_u0", 32);
2587   declare_register ("x0_u1", 33);
2588   declare_register ("x1_u0", 34);
2589   declare_register ("x1_u1", 35);
2590   declare_register ("x2_u0", 36);
2591   declare_register ("x2_u1", 37);
2592   declare_register ("x3_u0", 38);
2593   declare_register ("x3_u1", 39);
2594   declare_register ("y0_u0", 40);
2595   declare_register ("y0_u1", 41);
2596   declare_register ("y1_u0", 42);
2597   declare_register ("y1_u1", 43);
2598   declare_register ("y2_u0", 44);
2599   declare_register ("y2_u1", 45);
2600   declare_register ("y3_u0", 46);
2601   declare_register ("y3_u1", 47);
2602   declare_register ("x0_nu", 48);
2603   declare_register ("x1_nu", 49);
2604   declare_register ("x2_nu", 50);
2605   declare_register ("x3_nu", 51);
2606   declare_register ("y0_nu", 52);
2607   declare_register ("y1_nu", 53);
2608   declare_register ("y2_nu", 54);
2609   declare_register ("y3_nu", 55);
2610 
2611   declare_register ("mlo", 57);
2612   declare_register ("mmid", 58);
2613   declare_register ("mhi", 59);
2614 
2615   declare_register ("acc1", 56);
2616   declare_register ("acc2", 57);
2617 
2618   declare_register ("lp_count", 60);
2619   declare_register ("pcl", 63);
2620 
2621   /* Initialize the last instructions.  */
2622   memset (&arc_last_insns[0], 0, sizeof (arc_last_insns));
2623 
2624   /* Aux register declaration.  */
2625   arc_aux_hash = hash_new ();
2626   if (arc_aux_hash == NULL)
2627     as_fatal (_("Virtual memory exhausted"));
2628 
2629   const struct arc_aux_reg *auxr = &arc_aux_regs[0];
2630   unsigned int i;
2631   for (i = 0; i < arc_num_aux_regs; i++, auxr++)
2632     {
2633       const char *retval;
2634 
2635       if (!(auxr->cpu & selected_cpu.flags))
2636 	continue;
2637 
2638       if ((auxr->subclass != NONE)
2639 	  && !check_cpu_feature (auxr->subclass))
2640 	continue;
2641 
2642       retval = hash_insert (arc_aux_hash, auxr->name, (void *) auxr);
2643       if (retval)
2644 	as_fatal (_("internal error: can't hash aux register '%s': %s"),
2645 		  auxr->name, retval);
2646     }
2647 
2648   /* Address type declaration.  */
2649   arc_addrtype_hash = hash_new ();
2650   if (arc_addrtype_hash == NULL)
2651     as_fatal (_("Virtual memory exhausted"));
2652 
2653   declare_addrtype ("bd", ARC_NPS400_ADDRTYPE_BD);
2654   declare_addrtype ("jid", ARC_NPS400_ADDRTYPE_JID);
2655   declare_addrtype ("lbd", ARC_NPS400_ADDRTYPE_LBD);
2656   declare_addrtype ("mbd", ARC_NPS400_ADDRTYPE_MBD);
2657   declare_addrtype ("sd", ARC_NPS400_ADDRTYPE_SD);
2658   declare_addrtype ("sm", ARC_NPS400_ADDRTYPE_SM);
2659   declare_addrtype ("xa", ARC_NPS400_ADDRTYPE_XA);
2660   declare_addrtype ("xd", ARC_NPS400_ADDRTYPE_XD);
2661   declare_addrtype ("cd", ARC_NPS400_ADDRTYPE_CD);
2662   declare_addrtype ("cbd", ARC_NPS400_ADDRTYPE_CBD);
2663   declare_addrtype ("cjid", ARC_NPS400_ADDRTYPE_CJID);
2664   declare_addrtype ("clbd", ARC_NPS400_ADDRTYPE_CLBD);
2665   declare_addrtype ("cm", ARC_NPS400_ADDRTYPE_CM);
2666   declare_addrtype ("csd", ARC_NPS400_ADDRTYPE_CSD);
2667   declare_addrtype ("cxa", ARC_NPS400_ADDRTYPE_CXA);
2668   declare_addrtype ("cxd", ARC_NPS400_ADDRTYPE_CXD);
2669 }
2670 
2671 /* Write a value out to the object file, using the appropriate
2672    endianness.  */
2673 
2674 void
2675 md_number_to_chars (char *buf,
2676 		    valueT val,
2677 		    int n)
2678 {
2679   if (target_big_endian)
2680     number_to_chars_bigendian (buf, val, n);
2681   else
2682     number_to_chars_littleendian (buf, val, n);
2683 }
2684 
2685 /* Round up a section size to the appropriate boundary.  */
2686 
2687 valueT
2688 md_section_align (segT segment,
2689 		  valueT size)
2690 {
2691   int align = bfd_get_section_alignment (stdoutput, segment);
2692 
2693   return ((size + (1 << align) - 1) & (-((valueT) 1 << align)));
2694 }
2695 
2696 /* The location from which a PC relative jump should be calculated,
2697    given a PC relative reloc.  */
2698 
2699 long
2700 md_pcrel_from_section (fixS *fixP,
2701 		       segT sec)
2702 {
2703   offsetT base = fixP->fx_where + fixP->fx_frag->fr_address;
2704 
2705   pr_debug ("pcrel_from_section, fx_offset = %d\n", (int) fixP->fx_offset);
2706 
2707   if (fixP->fx_addsy != (symbolS *) NULL
2708       && (!S_IS_DEFINED (fixP->fx_addsy)
2709 	  || S_GET_SEGMENT (fixP->fx_addsy) != sec))
2710     {
2711       pr_debug ("Unknown pcrel symbol: %s\n", S_GET_NAME (fixP->fx_addsy));
2712 
2713       /* The symbol is undefined (or is defined but not in this section).
2714 	 Let the linker figure it out.  */
2715       return 0;
2716     }
2717 
2718   if ((int) fixP->fx_r_type < 0)
2719     {
2720       /* These are the "internal" relocations.  Align them to
2721 	 32 bit boundary (PCL), for the moment.  */
2722       base &= ~3;
2723     }
2724   else
2725     {
2726       switch (fixP->fx_r_type)
2727 	{
2728 	case BFD_RELOC_ARC_PC32:
2729 	  /* The hardware calculates relative to the start of the
2730 	     insn, but this relocation is relative to location of the
2731 	     LIMM, compensate.  The base always needs to be
2732 	     subtracted by 4 as we do not support this type of PCrel
2733 	     relocation for short instructions.  */
2734 	  base -= 4;
2735 	  /* Fall through.  */
2736 	case BFD_RELOC_ARC_PLT32:
2737 	case BFD_RELOC_ARC_S25H_PCREL_PLT:
2738 	case BFD_RELOC_ARC_S21H_PCREL_PLT:
2739 	case BFD_RELOC_ARC_S25W_PCREL_PLT:
2740 	case BFD_RELOC_ARC_S21W_PCREL_PLT:
2741 
2742 	case BFD_RELOC_ARC_S21H_PCREL:
2743 	case BFD_RELOC_ARC_S25H_PCREL:
2744 	case BFD_RELOC_ARC_S13_PCREL:
2745 	case BFD_RELOC_ARC_S21W_PCREL:
2746 	case BFD_RELOC_ARC_S25W_PCREL:
2747 	  base &= ~3;
2748 	  break;
2749 	default:
2750 	  as_bad_where (fixP->fx_file, fixP->fx_line,
2751 			_("unhandled reloc %s in md_pcrel_from_section"),
2752 		  bfd_get_reloc_code_name (fixP->fx_r_type));
2753 	  break;
2754 	}
2755     }
2756 
2757   pr_debug ("pcrel from %"BFD_VMA_FMT"x + %lx = %"BFD_VMA_FMT"x, "
2758 	    "symbol: %s (%"BFD_VMA_FMT"x)\n",
2759 	    fixP->fx_frag->fr_address, fixP->fx_where, base,
2760 	    fixP->fx_addsy ? S_GET_NAME (fixP->fx_addsy) : "(null)",
2761 	    fixP->fx_addsy ? S_GET_VALUE (fixP->fx_addsy) : 0);
2762 
2763   return base;
2764 }
2765 
2766 /* Given a BFD relocation find the corresponding operand.  */
2767 
2768 static const struct arc_operand *
2769 find_operand_for_reloc (extended_bfd_reloc_code_real_type reloc)
2770 {
2771   unsigned i;
2772 
2773   for (i = 0; i < arc_num_operands; i++)
2774     if (arc_operands[i].default_reloc == reloc)
2775       return  &arc_operands[i];
2776   return NULL;
2777 }
2778 
2779 /* Insert an operand value into an instruction.  */
2780 
2781 static unsigned long long
2782 insert_operand (unsigned long long insn,
2783 		const struct arc_operand *operand,
2784 		long long val,
2785 		const char *file,
2786 		unsigned line)
2787 {
2788   offsetT min = 0, max = 0;
2789 
2790   if (operand->bits != 32
2791       && !(operand->flags & ARC_OPERAND_NCHK)
2792       && !(operand->flags & ARC_OPERAND_FAKE))
2793     {
2794       if (operand->flags & ARC_OPERAND_SIGNED)
2795 	{
2796 	  max = (1 << (operand->bits - 1)) - 1;
2797 	  min = -(1 << (operand->bits - 1));
2798 	}
2799       else
2800 	{
2801 	  max = (1 << operand->bits) - 1;
2802 	  min = 0;
2803 	}
2804 
2805       if (val < min || val > max)
2806 	as_bad_value_out_of_range (_("operand"),
2807 				   val, min, max, file, line);
2808     }
2809 
2810   pr_debug ("insert field: %ld <= %lld <= %ld in 0x%08llx\n",
2811 	    min, val, max, insn);
2812 
2813   if ((operand->flags & ARC_OPERAND_ALIGNED32)
2814       && (val & 0x03))
2815     as_bad_where (file, line,
2816 		  _("Unaligned operand. Needs to be 32bit aligned"));
2817 
2818   if ((operand->flags & ARC_OPERAND_ALIGNED16)
2819       && (val & 0x01))
2820     as_bad_where (file, line,
2821 		  _("Unaligned operand. Needs to be 16bit aligned"));
2822 
2823   if (operand->insert)
2824     {
2825       const char *errmsg = NULL;
2826 
2827       insn = (*operand->insert) (insn, val, &errmsg);
2828       if (errmsg)
2829 	as_warn_where (file, line, "%s", errmsg);
2830     }
2831   else
2832     {
2833       if (operand->flags & ARC_OPERAND_TRUNCATE)
2834 	{
2835 	  if (operand->flags & ARC_OPERAND_ALIGNED32)
2836 	    val >>= 2;
2837 	  if (operand->flags & ARC_OPERAND_ALIGNED16)
2838 	    val >>= 1;
2839 	}
2840       insn |= ((val & ((1 << operand->bits) - 1)) << operand->shift);
2841     }
2842   return insn;
2843 }
2844 
2845 /* Apply a fixup to the object code.  At this point all symbol values
2846    should be fully resolved, and we attempt to completely resolve the
2847    reloc.  If we can not do that, we determine the correct reloc code
2848    and put it back in the fixup.  To indicate that a fixup has been
2849    eliminated, set fixP->fx_done.  */
2850 
2851 void
2852 md_apply_fix (fixS *fixP,
2853 	      valueT *valP,
2854 	      segT seg)
2855 {
2856   char * const fixpos = fixP->fx_frag->fr_literal + fixP->fx_where;
2857   valueT value = *valP;
2858   unsigned insn = 0;
2859   symbolS *fx_addsy, *fx_subsy;
2860   offsetT fx_offset;
2861   segT add_symbol_segment = absolute_section;
2862   segT sub_symbol_segment = absolute_section;
2863   const struct arc_operand *operand = NULL;
2864   extended_bfd_reloc_code_real_type reloc;
2865 
2866   pr_debug ("%s:%u: apply_fix: r_type=%d (%s) value=0x%lX offset=0x%lX\n",
2867 	    fixP->fx_file, fixP->fx_line, fixP->fx_r_type,
2868 	    ((int) fixP->fx_r_type < 0) ? "Internal":
2869 	    bfd_get_reloc_code_name (fixP->fx_r_type), value,
2870 	    fixP->fx_offset);
2871 
2872   fx_addsy = fixP->fx_addsy;
2873   fx_subsy = fixP->fx_subsy;
2874   fx_offset = 0;
2875 
2876   if (fx_addsy)
2877     {
2878       add_symbol_segment = S_GET_SEGMENT (fx_addsy);
2879     }
2880 
2881   if (fx_subsy
2882       && fixP->fx_r_type != BFD_RELOC_ARC_TLS_DTPOFF
2883       && fixP->fx_r_type != BFD_RELOC_ARC_TLS_DTPOFF_S9
2884       && fixP->fx_r_type != BFD_RELOC_ARC_TLS_GD_LD)
2885     {
2886       resolve_symbol_value (fx_subsy);
2887       sub_symbol_segment = S_GET_SEGMENT (fx_subsy);
2888 
2889       if (sub_symbol_segment == absolute_section)
2890 	{
2891 	  /* The symbol is really a constant.  */
2892 	  fx_offset -= S_GET_VALUE (fx_subsy);
2893 	  fx_subsy = NULL;
2894 	}
2895       else
2896 	{
2897 	  as_bad_where (fixP->fx_file, fixP->fx_line,
2898 			_("can't resolve `%s' {%s section} - `%s' {%s section}"),
2899 			fx_addsy ? S_GET_NAME (fx_addsy) : "0",
2900 			segment_name (add_symbol_segment),
2901 			S_GET_NAME (fx_subsy),
2902 			segment_name (sub_symbol_segment));
2903 	  return;
2904 	}
2905     }
2906 
2907   if (fx_addsy
2908       && !S_IS_WEAK (fx_addsy))
2909     {
2910       if (add_symbol_segment == seg
2911 	  && fixP->fx_pcrel)
2912 	{
2913 	  value += S_GET_VALUE (fx_addsy);
2914 	  value -= md_pcrel_from_section (fixP, seg);
2915 	  fx_addsy = NULL;
2916 	  fixP->fx_pcrel = FALSE;
2917 	}
2918       else if (add_symbol_segment == absolute_section)
2919 	{
2920 	  value = fixP->fx_offset;
2921 	  fx_offset += S_GET_VALUE (fixP->fx_addsy);
2922 	  fx_addsy = NULL;
2923 	  fixP->fx_pcrel = FALSE;
2924 	}
2925     }
2926 
2927   if (!fx_addsy)
2928     fixP->fx_done = TRUE;
2929 
2930   if (fixP->fx_pcrel)
2931     {
2932       if (fx_addsy
2933 	  && ((S_IS_DEFINED (fx_addsy)
2934 	       && S_GET_SEGMENT (fx_addsy) != seg)
2935 	      || S_IS_WEAK (fx_addsy)))
2936 	value += md_pcrel_from_section (fixP, seg);
2937 
2938       switch (fixP->fx_r_type)
2939 	{
2940 	case BFD_RELOC_ARC_32_ME:
2941 	  /* This is a pc-relative value in a LIMM.  Adjust it to the
2942 	     address of the instruction not to the address of the
2943 	     LIMM.  Note: it is not any longer valid this affirmation as
2944 	     the linker consider ARC_PC32 a fixup to entire 64 bit
2945 	     insn.  */
2946 	  fixP->fx_offset += fixP->fx_frag->fr_address;
2947 	  /* Fall through.  */
2948 	case BFD_RELOC_32:
2949 	  fixP->fx_r_type = BFD_RELOC_ARC_PC32;
2950 	  /* Fall through.  */
2951 	case BFD_RELOC_ARC_PC32:
2952 	  /* fixP->fx_offset += fixP->fx_where - fixP->fx_dot_value; */
2953 	  break;
2954 	default:
2955 	  if ((int) fixP->fx_r_type < 0)
2956 	    as_bad_where (fixP->fx_file, fixP->fx_line,
2957 			  _("PC relative relocation not allowed for (internal)"
2958 			    " type %d"),
2959 			  fixP->fx_r_type);
2960 	  break;
2961 	}
2962     }
2963 
2964   pr_debug ("%s:%u: apply_fix: r_type=%d (%s) value=0x%lX offset=0x%lX\n",
2965 	    fixP->fx_file, fixP->fx_line, fixP->fx_r_type,
2966 	    ((int) fixP->fx_r_type < 0) ? "Internal":
2967 	    bfd_get_reloc_code_name (fixP->fx_r_type), value,
2968 	    fixP->fx_offset);
2969 
2970 
2971   /* Now check for TLS relocations.  */
2972   reloc = fixP->fx_r_type;
2973   switch (reloc)
2974     {
2975     case BFD_RELOC_ARC_TLS_DTPOFF:
2976     case BFD_RELOC_ARC_TLS_LE_32:
2977       if (fixP->fx_done)
2978 	break;
2979       /* Fall through.  */
2980     case BFD_RELOC_ARC_TLS_GD_GOT:
2981     case BFD_RELOC_ARC_TLS_IE_GOT:
2982       S_SET_THREAD_LOCAL (fixP->fx_addsy);
2983       break;
2984 
2985     case BFD_RELOC_ARC_TLS_GD_LD:
2986       gas_assert (!fixP->fx_offset);
2987       if (fixP->fx_subsy)
2988 	fixP->fx_offset
2989 	  = (S_GET_VALUE (fixP->fx_subsy)
2990 	     - fixP->fx_frag->fr_address- fixP->fx_where);
2991       fixP->fx_subsy = NULL;
2992       /* Fall through.  */
2993     case BFD_RELOC_ARC_TLS_GD_CALL:
2994       /* These two relocs are there just to allow ld to change the tls
2995 	 model for this symbol, by patching the code.  The offset -
2996 	 and scale, if any - will be installed by the linker.  */
2997       S_SET_THREAD_LOCAL (fixP->fx_addsy);
2998       break;
2999 
3000     case BFD_RELOC_ARC_TLS_LE_S9:
3001     case BFD_RELOC_ARC_TLS_DTPOFF_S9:
3002       as_bad (_("TLS_*_S9 relocs are not supported yet"));
3003       break;
3004 
3005     default:
3006       break;
3007     }
3008 
3009   if (!fixP->fx_done)
3010     {
3011       return;
3012     }
3013 
3014   /* Adjust the value if we have a constant.  */
3015   value += fx_offset;
3016 
3017   /* For hosts with longs bigger than 32-bits make sure that the top
3018      bits of a 32-bit negative value read in by the parser are set,
3019      so that the correct comparisons are made.  */
3020   if (value & 0x80000000)
3021     value |= (-1UL << 31);
3022 
3023   reloc = fixP->fx_r_type;
3024   switch (reloc)
3025     {
3026     case BFD_RELOC_8:
3027     case BFD_RELOC_16:
3028     case BFD_RELOC_24:
3029     case BFD_RELOC_32:
3030     case BFD_RELOC_64:
3031     case BFD_RELOC_ARC_32_PCREL:
3032       md_number_to_chars (fixpos, value, fixP->fx_size);
3033       return;
3034 
3035     case BFD_RELOC_ARC_GOTPC32:
3036       /* I cannot fix an GOTPC relocation because I need to relax it
3037 	 from ld rx,[pcl,@sym@gotpc] to add rx,pcl,@sym@gotpc.  */
3038       as_bad (_("Unsupported operation on reloc"));
3039       return;
3040 
3041     case BFD_RELOC_ARC_TLS_DTPOFF:
3042     case BFD_RELOC_ARC_TLS_LE_32:
3043       gas_assert (!fixP->fx_addsy);
3044       gas_assert (!fixP->fx_subsy);
3045       /* Fall through.  */
3046 
3047     case BFD_RELOC_ARC_GOTOFF:
3048     case BFD_RELOC_ARC_32_ME:
3049     case BFD_RELOC_ARC_PC32:
3050       md_number_to_chars_midend (fixpos, value, fixP->fx_size);
3051       return;
3052 
3053     case BFD_RELOC_ARC_PLT32:
3054       md_number_to_chars_midend (fixpos, value, fixP->fx_size);
3055       return;
3056 
3057     case BFD_RELOC_ARC_S25H_PCREL_PLT:
3058       reloc = BFD_RELOC_ARC_S25W_PCREL;
3059       goto solve_plt;
3060 
3061     case BFD_RELOC_ARC_S21H_PCREL_PLT:
3062       reloc = BFD_RELOC_ARC_S21H_PCREL;
3063       goto solve_plt;
3064 
3065     case BFD_RELOC_ARC_S25W_PCREL_PLT:
3066       reloc = BFD_RELOC_ARC_S25W_PCREL;
3067       goto solve_plt;
3068 
3069     case BFD_RELOC_ARC_S21W_PCREL_PLT:
3070       reloc = BFD_RELOC_ARC_S21W_PCREL;
3071       /* Fall through.  */
3072 
3073     case BFD_RELOC_ARC_S25W_PCREL:
3074     case BFD_RELOC_ARC_S21W_PCREL:
3075     case BFD_RELOC_ARC_S21H_PCREL:
3076     case BFD_RELOC_ARC_S25H_PCREL:
3077     case BFD_RELOC_ARC_S13_PCREL:
3078     solve_plt:
3079       operand = find_operand_for_reloc (reloc);
3080       gas_assert (operand);
3081       break;
3082 
3083     default:
3084       {
3085 	if ((int) fixP->fx_r_type >= 0)
3086 	  as_fatal (_("unhandled relocation type %s"),
3087 		    bfd_get_reloc_code_name (fixP->fx_r_type));
3088 
3089 	/* The rest of these fixups needs to be completely resolved as
3090 	   constants.  */
3091 	if (fixP->fx_addsy != 0
3092 	    && S_GET_SEGMENT (fixP->fx_addsy) != absolute_section)
3093 	  as_bad_where (fixP->fx_file, fixP->fx_line,
3094 			_("non-absolute expression in constant field"));
3095 
3096 	gas_assert (-(int) fixP->fx_r_type < (int) arc_num_operands);
3097 	operand = &arc_operands[-(int) fixP->fx_r_type];
3098 	break;
3099       }
3100     }
3101 
3102   if (target_big_endian)
3103     {
3104       switch (fixP->fx_size)
3105 	{
3106 	case 4:
3107 	  insn = bfd_getb32 (fixpos);
3108 	  break;
3109 	case 2:
3110 	  insn = bfd_getb16 (fixpos);
3111 	  break;
3112 	default:
3113 	  as_bad_where (fixP->fx_file, fixP->fx_line,
3114 			_("unknown fixup size"));
3115 	}
3116     }
3117   else
3118     {
3119       insn = 0;
3120       switch (fixP->fx_size)
3121 	{
3122 	case 4:
3123 	  insn = bfd_getl16 (fixpos) << 16 | bfd_getl16 (fixpos + 2);
3124 	  break;
3125 	case 2:
3126 	  insn = bfd_getl16 (fixpos);
3127 	  break;
3128 	default:
3129 	  as_bad_where (fixP->fx_file, fixP->fx_line,
3130 			_("unknown fixup size"));
3131 	}
3132     }
3133 
3134   insn = insert_operand (insn, operand, (offsetT) value,
3135 			 fixP->fx_file, fixP->fx_line);
3136 
3137   md_number_to_chars_midend (fixpos, insn, fixP->fx_size);
3138 }
3139 
3140 /* Prepare machine-dependent frags for relaxation.
3141 
3142    Called just before relaxation starts.  Any symbol that is now undefined
3143    will not become defined.
3144 
3145    Return the correct fr_subtype in the frag.
3146 
3147    Return the initial "guess for fr_var" to caller.  The guess for fr_var
3148    is *actually* the growth beyond fr_fix.  Whatever we do to grow fr_fix
3149    or fr_var contributes to our returned value.
3150 
3151    Although it may not be explicit in the frag, pretend
3152    fr_var starts with a value.  */
3153 
3154 int
3155 md_estimate_size_before_relax (fragS *fragP,
3156 			       segT segment)
3157 {
3158   int growth;
3159 
3160   /* If the symbol is not located within the same section AND it's not
3161      an absolute section, use the maximum.  OR if the symbol is a
3162      constant AND the insn is by nature not pc-rel, use the maximum.
3163      OR if the symbol is being equated against another symbol, use the
3164      maximum.  OR if the symbol is weak use the maximum.  */
3165   if ((S_GET_SEGMENT (fragP->fr_symbol) != segment
3166        && S_GET_SEGMENT (fragP->fr_symbol) != absolute_section)
3167       || (symbol_constant_p (fragP->fr_symbol)
3168 	  && !fragP->tc_frag_data.pcrel)
3169       || symbol_equated_p (fragP->fr_symbol)
3170       || S_IS_WEAK (fragP->fr_symbol))
3171     {
3172       while (md_relax_table[fragP->fr_subtype].rlx_more != ARC_RLX_NONE)
3173 	++fragP->fr_subtype;
3174     }
3175 
3176   growth = md_relax_table[fragP->fr_subtype].rlx_length;
3177   fragP->fr_var = growth;
3178 
3179   pr_debug ("%s:%d: md_estimate_size_before_relax: %d\n",
3180 	   fragP->fr_file, fragP->fr_line, growth);
3181 
3182   return growth;
3183 }
3184 
3185 /* Translate internal representation of relocation info to BFD target
3186    format.  */
3187 
3188 arelent *
3189 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED,
3190 	      fixS *fixP)
3191 {
3192   arelent *reloc;
3193   bfd_reloc_code_real_type code;
3194 
3195   reloc = XNEW (arelent);
3196   reloc->sym_ptr_ptr = XNEW (asymbol *);
3197   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixP->fx_addsy);
3198   reloc->address = fixP->fx_frag->fr_address + fixP->fx_where;
3199 
3200   /* Make sure none of our internal relocations make it this far.
3201      They'd better have been fully resolved by this point.  */
3202   gas_assert ((int) fixP->fx_r_type > 0);
3203 
3204   code = fixP->fx_r_type;
3205 
3206   /* if we have something like add gp, pcl,
3207      _GLOBAL_OFFSET_TABLE_@gotpc.  */
3208   if (code == BFD_RELOC_ARC_GOTPC32
3209       && GOT_symbol
3210       && fixP->fx_addsy == GOT_symbol)
3211     code = BFD_RELOC_ARC_GOTPC;
3212 
3213   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
3214   if (reloc->howto == NULL)
3215     {
3216       as_bad_where (fixP->fx_file, fixP->fx_line,
3217 		    _("cannot represent `%s' relocation in object file"),
3218 		    bfd_get_reloc_code_name (code));
3219       return NULL;
3220     }
3221 
3222   if (!fixP->fx_pcrel != !reloc->howto->pc_relative)
3223     as_fatal (_("internal error? cannot generate `%s' relocation"),
3224 	      bfd_get_reloc_code_name (code));
3225 
3226   gas_assert (!fixP->fx_pcrel == !reloc->howto->pc_relative);
3227 
3228   reloc->addend = fixP->fx_offset;
3229 
3230   return reloc;
3231 }
3232 
3233 /* Perform post-processing of machine-dependent frags after relaxation.
3234    Called after relaxation is finished.
3235    In:	Address of frag.
3236    fr_type == rs_machine_dependent.
3237    fr_subtype is what the address relaxed to.
3238 
3239    Out: Any fixS:s and constants are set up.  */
3240 
3241 void
3242 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
3243 		 segT segment ATTRIBUTE_UNUSED,
3244 		 fragS *fragP)
3245 {
3246   const relax_typeS *table_entry;
3247   char *dest;
3248   const struct arc_opcode *opcode;
3249   struct arc_insn insn;
3250   int size, fix;
3251   struct arc_relax_type *relax_arg = &fragP->tc_frag_data;
3252 
3253   fix = (fragP->fr_fix < 0 ? 0 : fragP->fr_fix);
3254   dest = fragP->fr_literal + fix;
3255   table_entry = TC_GENERIC_RELAX_TABLE + fragP->fr_subtype;
3256 
3257   pr_debug ("%s:%d: md_convert_frag, subtype: %d, fix: %d, "
3258 	    "var: %"BFD_VMA_FMT"d\n",
3259 	    fragP->fr_file, fragP->fr_line,
3260 	    fragP->fr_subtype, fix, fragP->fr_var);
3261 
3262   if (fragP->fr_subtype <= 0
3263       && fragP->fr_subtype >= arc_num_relax_opcodes)
3264     as_fatal (_("no relaxation found for this instruction."));
3265 
3266   opcode = &arc_relax_opcodes[fragP->fr_subtype];
3267 
3268   assemble_insn (opcode, relax_arg->tok, relax_arg->ntok, relax_arg->pflags,
3269 	relax_arg->nflg, &insn);
3270 
3271   apply_fixups (&insn, fragP, fix);
3272 
3273   size = insn.len + (insn.has_limm ? 4 : 0);
3274   gas_assert (table_entry->rlx_length == size);
3275   emit_insn0 (&insn, dest, TRUE);
3276 
3277   fragP->fr_fix += table_entry->rlx_length;
3278   fragP->fr_var = 0;
3279 }
3280 
3281 /* We have no need to default values of symbols.  We could catch
3282    register names here, but that is handled by inserting them all in
3283    the symbol table to begin with.  */
3284 
3285 symbolS *
3286 md_undefined_symbol (char *name)
3287 {
3288   /* The arc abi demands that a GOT[0] should be referencible as
3289      [pc+_DYNAMIC@gotpc].  Hence we convert a _DYNAMIC@gotpc to a
3290      GOTPC reference to _GLOBAL_OFFSET_TABLE_.  */
3291   if (((*name == '_')
3292        && (*(name+1) == 'G')
3293        && (strcmp (name, GLOBAL_OFFSET_TABLE_NAME) == 0)))
3294     {
3295       if (!GOT_symbol)
3296 	{
3297 	  if (symbol_find (name))
3298 	    as_bad ("GOT already in symbol table");
3299 
3300 	  GOT_symbol = symbol_new (GLOBAL_OFFSET_TABLE_NAME, undefined_section,
3301 				   (valueT) 0, &zero_address_frag);
3302 	};
3303       return GOT_symbol;
3304     }
3305   return NULL;
3306 }
3307 
3308 /* Turn a string in input_line_pointer into a floating point constant
3309    of type type, and store the appropriate bytes in *litP.  The number
3310    of LITTLENUMS emitted is stored in *sizeP.  An error message is
3311    returned, or NULL on OK.  */
3312 
3313 const char *
3314 md_atof (int type, char *litP, int *sizeP)
3315 {
3316   return ieee_md_atof (type, litP, sizeP, target_big_endian);
3317 }
3318 
3319 /* Called for any expression that can not be recognized.  When the
3320    function is called, `input_line_pointer' will point to the start of
3321    the expression.  */
3322 
3323 void
3324 md_operand (expressionS *expressionP ATTRIBUTE_UNUSED)
3325 {
3326   char *p = input_line_pointer;
3327   if (*p == '@')
3328     {
3329       input_line_pointer++;
3330       expressionP->X_op = O_symbol;
3331       expression (expressionP);
3332     }
3333 }
3334 
3335 /* This function is called from the function 'expression', it attempts
3336    to parse special names (in our case register names).  It fills in
3337    the expression with the identified register.  It returns TRUE if
3338    it is a register and FALSE otherwise.  */
3339 
3340 bfd_boolean
3341 arc_parse_name (const char *name,
3342 		struct expressionS *e)
3343 {
3344   struct symbol *sym;
3345 
3346   if (!assembling_insn)
3347     return FALSE;
3348 
3349   if (e->X_op == O_symbol)
3350     return FALSE;
3351 
3352   sym = hash_find (arc_reg_hash, name);
3353   if (sym)
3354     {
3355       e->X_op = O_register;
3356       e->X_add_number = S_GET_VALUE (sym);
3357       return TRUE;
3358     }
3359 
3360   sym = hash_find (arc_addrtype_hash, name);
3361   if (sym)
3362     {
3363       e->X_op = O_addrtype;
3364       e->X_add_number = S_GET_VALUE (sym);
3365       return TRUE;
3366     }
3367 
3368   return FALSE;
3369 }
3370 
3371 /* md_parse_option
3372    Invocation line includes a switch not recognized by the base assembler.
3373    See if it's a processor-specific option.
3374 
3375    New options (supported) are:
3376 
3377    -mcpu=<cpu name>		 Assemble for selected processor
3378    -EB/-mbig-endian		 Big-endian
3379    -EL/-mlittle-endian		 Little-endian
3380    -mrelax                       Enable relaxation
3381 
3382    The following CPU names are recognized:
3383    arc600, arc700, arcem, archs, nps400.  */
3384 
3385 int
3386 md_parse_option (int c, const char *arg ATTRIBUTE_UNUSED)
3387 {
3388   switch (c)
3389     {
3390     case OPTION_ARC600:
3391     case OPTION_ARC601:
3392       return md_parse_option (OPTION_MCPU, "arc600");
3393 
3394     case OPTION_ARC700:
3395       return md_parse_option (OPTION_MCPU, "arc700");
3396 
3397     case OPTION_ARCEM:
3398       return md_parse_option (OPTION_MCPU, "arcem");
3399 
3400     case OPTION_ARCHS:
3401       return md_parse_option (OPTION_MCPU, "archs");
3402 
3403     case OPTION_MCPU:
3404       {
3405         arc_select_cpu (arg, MACH_SELECTION_FROM_COMMAND_LINE);
3406 	break;
3407       }
3408 
3409     case OPTION_EB:
3410       arc_target_format = "elf32-bigarc";
3411       byte_order = BIG_ENDIAN;
3412       break;
3413 
3414     case OPTION_EL:
3415       arc_target_format = "elf32-littlearc";
3416       byte_order = LITTLE_ENDIAN;
3417       break;
3418 
3419     case OPTION_CD:
3420       selected_cpu.features |= CD;
3421       cl_features |= CD;
3422       arc_check_feature ();
3423       break;
3424 
3425     case OPTION_RELAX:
3426       relaxation_state = 1;
3427       break;
3428 
3429     case OPTION_NPS400:
3430       selected_cpu.features |= NPS400;
3431       cl_features |= NPS400;
3432       arc_check_feature ();
3433       break;
3434 
3435     case OPTION_SPFP:
3436       selected_cpu.features |= SPX;
3437       cl_features |= SPX;
3438       arc_check_feature ();
3439       break;
3440 
3441     case OPTION_DPFP:
3442       selected_cpu.features |= DPX;
3443       cl_features |= DPX;
3444       arc_check_feature ();
3445       break;
3446 
3447     case OPTION_FPUDA:
3448       selected_cpu.features |= DPA;
3449       cl_features |= DPA;
3450       arc_check_feature ();
3451       break;
3452 
3453     /* Dummy options are accepted but have no effect.  */
3454     case OPTION_USER_MODE:
3455     case OPTION_LD_EXT_MASK:
3456     case OPTION_SWAP:
3457     case OPTION_NORM:
3458     case OPTION_BARREL_SHIFT:
3459     case OPTION_MIN_MAX:
3460     case OPTION_NO_MPY:
3461     case OPTION_EA:
3462     case OPTION_MUL64:
3463     case OPTION_SIMD:
3464     case OPTION_XMAC_D16:
3465     case OPTION_XMAC_24:
3466     case OPTION_DSP_PACKA:
3467     case OPTION_CRC:
3468     case OPTION_DVBF:
3469     case OPTION_TELEPHONY:
3470     case OPTION_XYMEMORY:
3471     case OPTION_LOCK:
3472     case OPTION_SWAPE:
3473     case OPTION_RTSC:
3474       break;
3475 
3476     default:
3477       return 0;
3478     }
3479 
3480   return 1;
3481 }
3482 
3483 /* Display the list of cpu names for use in the help text.  */
3484 
3485 static void
3486 arc_show_cpu_list (FILE *stream)
3487 {
3488   int i, offset;
3489   static const char *space_buf = "                          ";
3490 
3491   fprintf (stream, "%s", space_buf);
3492   offset = strlen (space_buf);
3493   for (i = 0; cpu_types[i].name != NULL; ++i)
3494     {
3495       bfd_boolean last = (cpu_types[i + 1].name == NULL);
3496 
3497       /* If displaying the new cpu name string, and the ', ' (for all
3498          but the last one) will take us past a target width of 80
3499          characters, then it's time for a new line.  */
3500       if (offset + strlen (cpu_types[i].name) + (last ? 0 : 2) > 80)
3501         {
3502           fprintf (stream, "\n%s", space_buf);
3503           offset = strlen (space_buf);
3504         }
3505 
3506       fprintf (stream, "%s%s", cpu_types[i].name, (last ? "\n" : ", "));
3507       offset += strlen (cpu_types [i].name) + (last ? 0 : 2);
3508     }
3509 }
3510 
3511 void
3512 md_show_usage (FILE *stream)
3513 {
3514   fprintf (stream, _("ARC-specific assembler options:\n"));
3515 
3516   fprintf (stream, "  -mcpu=<cpu name>\t  (default: %s), assemble for"
3517            " CPU <cpu name>, one of:\n", TARGET_WITH_CPU);
3518   arc_show_cpu_list (stream);
3519   fprintf (stream, "\n");
3520   fprintf (stream, "  -mA6/-mARC600/-mARC601  same as -mcpu=arc600\n");
3521   fprintf (stream, "  -mA7/-mARC700\t\t  same as -mcpu=arc700\n");
3522   fprintf (stream, "  -mEM\t\t\t  same as -mcpu=arcem\n");
3523   fprintf (stream, "  -mHS\t\t\t  same as -mcpu=archs\n");
3524 
3525   fprintf (stream, "  -mnps400\t\t  enable NPS-400 extended instructions\n");
3526   fprintf (stream, "  -mspfp\t\t  enable single-precision floating point"
3527 	   " instructions\n");
3528   fprintf (stream, "  -mdpfp\t\t  enable double-precision floating point"
3529 	   " instructions\n");
3530   fprintf (stream, "  -mfpuda\t\t  enable double-precision assist floating "
3531                    "point\n\t\t\t  instructions for ARC EM\n");
3532 
3533   fprintf (stream,
3534 	   "  -mcode-density\t  enable code density option for ARC EM\n");
3535 
3536   fprintf (stream, _("\
3537   -EB                     assemble code for a big-endian cpu\n"));
3538   fprintf (stream, _("\
3539   -EL                     assemble code for a little-endian cpu\n"));
3540   fprintf (stream, _("\
3541   -mrelax                 enable relaxation\n"));
3542 
3543   fprintf (stream, _("The following ARC-specific assembler options are "
3544                      "deprecated and are accepted\nfor compatibility only:\n"));
3545 
3546   fprintf (stream, _("  -mEA\n"
3547                      "  -mbarrel-shifter\n"
3548                      "  -mbarrel_shifter\n"
3549                      "  -mcrc\n"
3550                      "  -mdsp-packa\n"
3551                      "  -mdsp_packa\n"
3552                      "  -mdvbf\n"
3553                      "  -mld-extension-reg-mask\n"
3554                      "  -mlock\n"
3555                      "  -mmac-24\n"
3556                      "  -mmac-d16\n"
3557                      "  -mmac_24\n"
3558                      "  -mmac_d16\n"
3559                      "  -mmin-max\n"
3560                      "  -mmin_max\n"
3561                      "  -mmul64\n"
3562                      "  -mno-mpy\n"
3563                      "  -mnorm\n"
3564                      "  -mrtsc\n"
3565                      "  -msimd\n"
3566                      "  -mswap\n"
3567                      "  -mswape\n"
3568                      "  -mtelephony\n"
3569 		     "  -muser-mode-only\n"
3570                      "  -mxy\n"));
3571 }
3572 
3573 /* Find the proper relocation for the given opcode.  */
3574 
3575 static extended_bfd_reloc_code_real_type
3576 find_reloc (const char *name,
3577 	    const char *opcodename,
3578 	    const struct arc_flags *pflags,
3579 	    int nflg,
3580 	    extended_bfd_reloc_code_real_type reloc)
3581 {
3582   unsigned int i;
3583   int j;
3584   bfd_boolean found_flag, tmp;
3585   extended_bfd_reloc_code_real_type ret = BFD_RELOC_UNUSED;
3586 
3587   for (i = 0; i < arc_num_equiv_tab; i++)
3588     {
3589       const struct arc_reloc_equiv_tab *r = &arc_reloc_equiv[i];
3590 
3591       /* Find the entry.  */
3592       if (strcmp (name, r->name))
3593 	continue;
3594       if (r->mnemonic && (strcmp (r->mnemonic, opcodename)))
3595 	continue;
3596       if (r->flags[0])
3597 	{
3598 	  if (!nflg)
3599 	    continue;
3600 	  found_flag = FALSE;
3601 	  unsigned * psflg = (unsigned *)r->flags;
3602 	  do
3603 	    {
3604 	      tmp = FALSE;
3605 	      for (j = 0; j < nflg; j++)
3606 		if (!strcmp (pflags[j].name,
3607 			     arc_flag_operands[*psflg].name))
3608 		  {
3609 		    tmp = TRUE;
3610 		    break;
3611 		  }
3612 	      if (!tmp)
3613 		{
3614 		  found_flag = FALSE;
3615 		  break;
3616 		}
3617 	      else
3618 		{
3619 		  found_flag = TRUE;
3620 		}
3621 	      ++ psflg;
3622 	    } while (*psflg);
3623 
3624 	  if (!found_flag)
3625 	    continue;
3626 	}
3627 
3628       if (reloc != r->oldreloc)
3629 	continue;
3630       /* Found it.  */
3631       ret = r->newreloc;
3632       break;
3633     }
3634 
3635   if (ret == BFD_RELOC_UNUSED)
3636     as_bad (_("Unable to find %s relocation for instruction %s"),
3637 	    name, opcodename);
3638   return ret;
3639 }
3640 
3641 /* All the symbol types that are allowed to be used for
3642    relaxation.  */
3643 
3644 static bfd_boolean
3645 may_relax_expr (expressionS tok)
3646 {
3647   /* Check if we have unrelaxable relocs.  */
3648   switch (tok.X_md)
3649     {
3650     default:
3651       break;
3652     case O_plt:
3653       return FALSE;
3654     }
3655 
3656   switch (tok.X_op)
3657     {
3658     case O_symbol:
3659     case O_multiply:
3660     case O_divide:
3661     case O_modulus:
3662     case O_add:
3663     case O_subtract:
3664       break;
3665 
3666     default:
3667       return FALSE;
3668     }
3669   return TRUE;
3670 }
3671 
3672 /* Checks if flags are in line with relaxable insn.  */
3673 
3674 static bfd_boolean
3675 relaxable_flag (const struct arc_relaxable_ins *ins,
3676 		const struct arc_flags *pflags,
3677 		int nflgs)
3678 {
3679   unsigned flag_class,
3680     flag,
3681     flag_class_idx = 0,
3682     flag_idx = 0;
3683 
3684   const struct arc_flag_operand *flag_opand;
3685   int i, counttrue = 0;
3686 
3687   /* Iterate through flags classes.  */
3688   while ((flag_class = ins->flag_classes[flag_class_idx]) != 0)
3689     {
3690       /* Iterate through flags in flag class.  */
3691       while ((flag = arc_flag_classes[flag_class].flags[flag_idx])
3692 	     != 0)
3693 	{
3694 	  flag_opand = &arc_flag_operands[flag];
3695 	  /* Iterate through flags in ins to compare.  */
3696 	  for (i = 0; i < nflgs; ++i)
3697 	    {
3698 	      if (strcmp (flag_opand->name, pflags[i].name) == 0)
3699 		++counttrue;
3700 	    }
3701 
3702 	  ++flag_idx;
3703 	}
3704 
3705       ++flag_class_idx;
3706       flag_idx = 0;
3707     }
3708 
3709   /* If counttrue == nflgs, then all flags have been found.  */
3710   return (counttrue == nflgs ? TRUE : FALSE);
3711 }
3712 
3713 /* Checks if operands are in line with relaxable insn.  */
3714 
3715 static bfd_boolean
3716 relaxable_operand (const struct arc_relaxable_ins *ins,
3717 		   const expressionS *tok,
3718 		   int ntok)
3719 {
3720   const enum rlx_operand_type *operand = &ins->operands[0];
3721   int i = 0;
3722 
3723   while (*operand != EMPTY)
3724     {
3725       const expressionS *epr = &tok[i];
3726 
3727       if (i != 0 && i >= ntok)
3728 	return FALSE;
3729 
3730       switch (*operand)
3731 	{
3732 	case IMMEDIATE:
3733 	  if (!(epr->X_op == O_multiply
3734 		|| epr->X_op == O_divide
3735 		|| epr->X_op == O_modulus
3736 		|| epr->X_op == O_add
3737 		|| epr->X_op == O_subtract
3738 		|| epr->X_op == O_symbol))
3739 	    return FALSE;
3740 	  break;
3741 
3742 	case REGISTER_DUP:
3743 	  if ((i <= 0)
3744 	      || (epr->X_add_number != tok[i - 1].X_add_number))
3745 	    return FALSE;
3746 	  /* Fall through.  */
3747 	case REGISTER:
3748 	  if (epr->X_op != O_register)
3749 	    return FALSE;
3750 	  break;
3751 
3752 	case REGISTER_S:
3753 	  if (epr->X_op != O_register)
3754 	    return FALSE;
3755 
3756 	  switch (epr->X_add_number)
3757 	    {
3758 	    case 0: case 1: case 2: case 3:
3759 	    case 12: case 13: case 14: case 15:
3760 	      break;
3761 	    default:
3762 	      return FALSE;
3763 	    }
3764 	  break;
3765 
3766 	case REGISTER_NO_GP:
3767 	  if ((epr->X_op != O_register)
3768 	      || (epr->X_add_number == 26)) /* 26 is the gp register.  */
3769 	    return FALSE;
3770 	  break;
3771 
3772 	case BRACKET:
3773 	  if (epr->X_op != O_bracket)
3774 	    return FALSE;
3775 	  break;
3776 
3777 	default:
3778 	  /* Don't understand, bail out.  */
3779 	  return FALSE;
3780 	  break;
3781 	}
3782 
3783       ++i;
3784       operand = &ins->operands[i];
3785     }
3786 
3787   return (i == ntok ? TRUE : FALSE);
3788 }
3789 
3790 /* Return TRUE if this OPDCODE is a candidate for relaxation.  */
3791 
3792 static bfd_boolean
3793 relax_insn_p (const struct arc_opcode *opcode,
3794 	      const expressionS *tok,
3795 	      int ntok,
3796 	      const struct arc_flags *pflags,
3797 	      int nflg)
3798 {
3799   unsigned i;
3800   bfd_boolean rv = FALSE;
3801 
3802   /* Check the relaxation table.  */
3803   for (i = 0; i < arc_num_relaxable_ins && relaxation_state; ++i)
3804     {
3805       const struct arc_relaxable_ins *arc_rlx_ins = &arc_relaxable_insns[i];
3806 
3807       if ((strcmp (opcode->name, arc_rlx_ins->mnemonic_r) == 0)
3808 	  && may_relax_expr (tok[arc_rlx_ins->opcheckidx])
3809 	  && relaxable_operand (arc_rlx_ins, tok, ntok)
3810 	  && relaxable_flag (arc_rlx_ins, pflags, nflg))
3811 	{
3812 	  rv = TRUE;
3813 	  frag_now->fr_subtype = arc_relaxable_insns[i].subtype;
3814 	  memcpy (&frag_now->tc_frag_data.tok, tok,
3815 		sizeof (expressionS) * ntok);
3816 	  memcpy (&frag_now->tc_frag_data.pflags, pflags,
3817 		sizeof (struct arc_flags) * nflg);
3818 	  frag_now->tc_frag_data.nflg = nflg;
3819 	  frag_now->tc_frag_data.ntok = ntok;
3820 	  break;
3821 	}
3822     }
3823 
3824   return rv;
3825 }
3826 
3827 /* Turn an opcode description and a set of arguments into
3828    an instruction and a fixup.  */
3829 
3830 static void
3831 assemble_insn (const struct arc_opcode *opcode,
3832 	       const expressionS *tok,
3833 	       int ntok,
3834 	       const struct arc_flags *pflags,
3835 	       int nflg,
3836 	       struct arc_insn *insn)
3837 {
3838   const expressionS *reloc_exp = NULL;
3839   unsigned long long image;
3840   const unsigned char *argidx;
3841   int i;
3842   int tokidx = 0;
3843   unsigned char pcrel = 0;
3844   bfd_boolean needGOTSymbol;
3845   bfd_boolean has_delay_slot = FALSE;
3846   extended_bfd_reloc_code_real_type reloc = BFD_RELOC_UNUSED;
3847 
3848   memset (insn, 0, sizeof (*insn));
3849   image = opcode->opcode;
3850 
3851   pr_debug ("%s:%d: assemble_insn: %s using opcode %llx\n",
3852 	    frag_now->fr_file, frag_now->fr_line, opcode->name,
3853 	    opcode->opcode);
3854 
3855   /* Handle operands.  */
3856   for (argidx = opcode->operands; *argidx; ++argidx)
3857     {
3858       const struct arc_operand *operand = &arc_operands[*argidx];
3859       const expressionS *t = (const expressionS *) 0;
3860 
3861       if (ARC_OPERAND_IS_FAKE (operand))
3862 	continue;
3863 
3864       if (operand->flags & ARC_OPERAND_DUPLICATE)
3865 	{
3866 	  /* Duplicate operand, already inserted.  */
3867 	  tokidx ++;
3868 	  continue;
3869 	}
3870 
3871       if (tokidx >= ntok)
3872 	{
3873 	  abort ();
3874 	}
3875       else
3876 	t = &tok[tokidx++];
3877 
3878       /* Regardless if we have a reloc or not mark the instruction
3879 	 limm if it is the case.  */
3880       if (operand->flags & ARC_OPERAND_LIMM)
3881 	insn->has_limm = TRUE;
3882 
3883       switch (t->X_op)
3884 	{
3885 	case O_register:
3886 	  image = insert_operand (image, operand, regno (t->X_add_number),
3887 				  NULL, 0);
3888 	  break;
3889 
3890 	case O_constant:
3891 	  image = insert_operand (image, operand, t->X_add_number, NULL, 0);
3892 	  reloc_exp = t;
3893 	  if (operand->flags & ARC_OPERAND_LIMM)
3894 	    insn->limm = t->X_add_number;
3895 	  break;
3896 
3897 	case O_bracket:
3898         case O_colon:
3899         case O_addrtype:
3900 	  /* Ignore brackets, colons, and address types.  */
3901 	  break;
3902 
3903 	case O_absent:
3904 	  gas_assert (operand->flags & ARC_OPERAND_IGNORE);
3905 	  break;
3906 
3907 	case O_subtract:
3908 	  /* Maybe register range.  */
3909 	  if ((t->X_add_number == 0)
3910 	      && contains_register (t->X_add_symbol)
3911 	      && contains_register (t->X_op_symbol))
3912 	    {
3913 	      int regs;
3914 
3915 	      regs = get_register (t->X_add_symbol);
3916 	      regs <<= 16;
3917 	      regs |= get_register (t->X_op_symbol);
3918 	      image = insert_operand (image, operand, regs, NULL, 0);
3919 	      break;
3920 	    }
3921 	  /* Fall through.  */
3922 
3923 	default:
3924 	  /* This operand needs a relocation.  */
3925 	  needGOTSymbol = FALSE;
3926 
3927 	  switch (t->X_md)
3928 	    {
3929 	    case O_plt:
3930 	      if (opcode->insn_class == JUMP)
3931 		as_bad (_("Unable to use @plt relocation for insn %s"),
3932 			opcode->name);
3933 	      needGOTSymbol = TRUE;
3934 	      reloc = find_reloc ("plt", opcode->name,
3935 				  pflags, nflg,
3936 				  operand->default_reloc);
3937 	      break;
3938 
3939 	    case O_gotoff:
3940 	    case O_gotpc:
3941 	      needGOTSymbol = TRUE;
3942 	      reloc = ARC_RELOC_TABLE (t->X_md)->reloc;
3943 	      break;
3944 	    case O_pcl:
3945 	      if (operand->flags & ARC_OPERAND_LIMM)
3946 		{
3947 		  reloc = ARC_RELOC_TABLE (t->X_md)->reloc;
3948 		  if (arc_opcode_len (opcode) == 2
3949 		      || opcode->insn_class == JUMP)
3950 		    as_bad (_("Unable to use @pcl relocation for insn %s"),
3951 			    opcode->name);
3952 		}
3953 	      else
3954 		{
3955 		  /* This is a relaxed operand which initially was
3956 		     limm, choose whatever we have defined in the
3957 		     opcode as reloc.  */
3958 		  reloc = operand->default_reloc;
3959 		}
3960 	      break;
3961 	    case O_sda:
3962 	      reloc = find_reloc ("sda", opcode->name,
3963 				  pflags, nflg,
3964 				  operand->default_reloc);
3965 	      break;
3966 	    case O_tlsgd:
3967 	    case O_tlsie:
3968 	      needGOTSymbol = TRUE;
3969 	      /* Fall-through.  */
3970 
3971 	    case O_tpoff:
3972 	    case O_dtpoff:
3973 	      reloc = ARC_RELOC_TABLE (t->X_md)->reloc;
3974 	      break;
3975 
3976 	    case O_tpoff9: /*FIXME! Check for the conditionality of
3977 			     the insn.  */
3978 	    case O_dtpoff9: /*FIXME! Check for the conditionality of
3979 			      the insn.  */
3980 	      as_bad (_("TLS_*_S9 relocs are not supported yet"));
3981 	      break;
3982 
3983 	    default:
3984 	      /* Just consider the default relocation.  */
3985 	      reloc = operand->default_reloc;
3986 	      break;
3987 	    }
3988 
3989 	  if (needGOTSymbol && (GOT_symbol == NULL))
3990 	    GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME);
3991 
3992 	  reloc_exp = t;
3993 
3994 #if 0
3995 	  if (reloc > 0)
3996 	    {
3997 	      /* sanity checks.  */
3998 	      reloc_howto_type *reloc_howto
3999 		= bfd_reloc_type_lookup (stdoutput,
4000 					 (bfd_reloc_code_real_type) reloc);
4001 	      unsigned reloc_bitsize = reloc_howto->bitsize;
4002 	      if (reloc_howto->rightshift)
4003 		reloc_bitsize -= reloc_howto->rightshift;
4004 	      if (reloc_bitsize != operand->bits)
4005 		{
4006 		  as_bad (_("invalid relocation %s for field"),
4007 			  bfd_get_reloc_code_name (reloc));
4008 		  return;
4009 		}
4010 	    }
4011 #endif
4012 	  if (insn->nfixups >= MAX_INSN_FIXUPS)
4013 	    as_fatal (_("too many fixups"));
4014 
4015 	  struct arc_fixup *fixup;
4016 	  fixup = &insn->fixups[insn->nfixups++];
4017 	  fixup->exp = *t;
4018 	  fixup->reloc = reloc;
4019 	  if ((int) reloc < 0)
4020 	    pcrel = (operand->flags & ARC_OPERAND_PCREL) ? 1 : 0;
4021 	  else
4022 	    {
4023 	      reloc_howto_type *reloc_howto =
4024 		bfd_reloc_type_lookup (stdoutput,
4025 				       (bfd_reloc_code_real_type) fixup->reloc);
4026 	      pcrel = reloc_howto->pc_relative;
4027 	    }
4028 	  fixup->pcrel = pcrel;
4029 	  fixup->islong = (operand->flags & ARC_OPERAND_LIMM) ?
4030 	    TRUE : FALSE;
4031 	  break;
4032 	}
4033     }
4034 
4035   /* Handle flags.  */
4036   for (i = 0; i < nflg; i++)
4037     {
4038       const struct arc_flag_operand *flg_operand = pflags[i].flgp;
4039 
4040       /* Check if the instruction has a delay slot.  */
4041       if (!strcmp (flg_operand->name, "d"))
4042 	has_delay_slot = TRUE;
4043 
4044       /* There is an exceptional case when we cannot insert a flag just as
4045 	 it is.  On ARCv2 the '.t' and '.nt' flags must be handled in
4046 	 relation with the relative address.  Unfortunately, some of the
4047 	 ARC700 extensions (NPS400) also have a '.nt' flag that should be
4048 	 handled in the normal way.
4049 
4050 	 Flag operands don't have an architecture field, so we can't
4051 	 directly validate that FLAG_OPERAND is valid for the current
4052 	 architecture, what we do instead is just validate that we're
4053 	 assembling for an ARCv2 architecture.  */
4054       if ((selected_cpu.flags & ARC_OPCODE_ARCV2)
4055 	  && (!strcmp (flg_operand->name, "t")
4056 	      || !strcmp (flg_operand->name, "nt")))
4057 	{
4058 	  unsigned bitYoperand = 0;
4059 	  /* FIXME! move selection bbit/brcc in arc-opc.c.  */
4060 	  if (!strcmp (flg_operand->name, "t"))
4061 	    if (!strcmp (opcode->name, "bbit0")
4062 		|| !strcmp (opcode->name, "bbit1"))
4063 	      bitYoperand = arc_NToperand;
4064 	    else
4065 	      bitYoperand = arc_Toperand;
4066 	  else
4067 	    if (!strcmp (opcode->name, "bbit0")
4068 		|| !strcmp (opcode->name, "bbit1"))
4069 	      bitYoperand = arc_Toperand;
4070 	    else
4071 	      bitYoperand = arc_NToperand;
4072 
4073 	  gas_assert (reloc_exp != NULL);
4074 	  if (reloc_exp->X_op == O_constant)
4075 	    {
4076 	      /* Check if we have a constant and solved it
4077 		 immediately.  */
4078 	      offsetT val = reloc_exp->X_add_number;
4079 	      image |= insert_operand (image, &arc_operands[bitYoperand],
4080 				       val, NULL, 0);
4081 	    }
4082 	  else
4083 	    {
4084 	      struct arc_fixup *fixup;
4085 
4086 	      if (insn->nfixups >= MAX_INSN_FIXUPS)
4087 		as_fatal (_("too many fixups"));
4088 
4089 	      fixup = &insn->fixups[insn->nfixups++];
4090 	      fixup->exp = *reloc_exp;
4091 	      fixup->reloc = -bitYoperand;
4092 	      fixup->pcrel = pcrel;
4093 	      fixup->islong = FALSE;
4094 	    }
4095 	}
4096       else
4097 	image |= (flg_operand->code & ((1 << flg_operand->bits) - 1))
4098 	  << flg_operand->shift;
4099     }
4100 
4101   insn->relax = relax_insn_p (opcode, tok, ntok, pflags, nflg);
4102 
4103   /* Instruction length.  */
4104   insn->len = arc_opcode_len (opcode);
4105 
4106   insn->insn = image;
4107 
4108   /* Update last insn status.  */
4109   arc_last_insns[1]		   = arc_last_insns[0];
4110   arc_last_insns[0].opcode	   = opcode;
4111   arc_last_insns[0].has_limm	   = insn->has_limm;
4112   arc_last_insns[0].has_delay_slot = has_delay_slot;
4113 
4114   /* Check if the current instruction is legally used.  */
4115   if (arc_last_insns[1].has_delay_slot
4116       && is_br_jmp_insn_p (arc_last_insns[0].opcode))
4117     as_bad (_("Insn %s has a jump/branch instruction %s in its delay slot."),
4118 	    arc_last_insns[1].opcode->name,
4119 	    arc_last_insns[0].opcode->name);
4120   if (arc_last_insns[1].has_delay_slot
4121       && arc_last_insns[0].has_limm)
4122     as_bad (_("Insn %s has an instruction %s with limm in its delay slot."),
4123 	    arc_last_insns[1].opcode->name,
4124 	    arc_last_insns[0].opcode->name);
4125 }
4126 
4127 void
4128 arc_handle_align (fragS* fragP)
4129 {
4130   if ((fragP)->fr_type == rs_align_code)
4131     {
4132       char *dest = (fragP)->fr_literal + (fragP)->fr_fix;
4133       valueT count = ((fragP)->fr_next->fr_address
4134 		      - (fragP)->fr_address - (fragP)->fr_fix);
4135 
4136       (fragP)->fr_var = 2;
4137 
4138       if (count & 1)/* Padding in the gap till the next 2-byte
4139 		       boundary with 0s.  */
4140 	{
4141 	  (fragP)->fr_fix++;
4142 	  *dest++ = 0;
4143 	}
4144       /* Writing nop_s.  */
4145       md_number_to_chars (dest, NOP_OPCODE_S, 2);
4146     }
4147 }
4148 
4149 /* Here we decide which fixups can be adjusted to make them relative
4150    to the beginning of the section instead of the symbol.  Basically
4151    we need to make sure that the dynamic relocations are done
4152    correctly, so in some cases we force the original symbol to be
4153    used.  */
4154 
4155 int
4156 tc_arc_fix_adjustable (fixS *fixP)
4157 {
4158 
4159   /* Prevent all adjustments to global symbols.  */
4160   if (S_IS_EXTERNAL (fixP->fx_addsy))
4161     return 0;
4162   if (S_IS_WEAK (fixP->fx_addsy))
4163     return 0;
4164 
4165   /* Adjust_reloc_syms doesn't know about the GOT.  */
4166   switch (fixP->fx_r_type)
4167     {
4168     case BFD_RELOC_ARC_GOTPC32:
4169     case BFD_RELOC_ARC_PLT32:
4170     case BFD_RELOC_ARC_S25H_PCREL_PLT:
4171     case BFD_RELOC_ARC_S21H_PCREL_PLT:
4172     case BFD_RELOC_ARC_S25W_PCREL_PLT:
4173     case BFD_RELOC_ARC_S21W_PCREL_PLT:
4174       return 0;
4175 
4176     default:
4177       break;
4178     }
4179 
4180   return 1;
4181 }
4182 
4183 /* Compute the reloc type of an expression EXP.  */
4184 
4185 static void
4186 arc_check_reloc (expressionS *exp,
4187 		 bfd_reloc_code_real_type *r_type_p)
4188 {
4189   if (*r_type_p == BFD_RELOC_32
4190       && exp->X_op == O_subtract
4191       && exp->X_op_symbol != NULL
4192       && exp->X_op_symbol->bsym->section == now_seg)
4193     *r_type_p = BFD_RELOC_ARC_32_PCREL;
4194 }
4195 
4196 
4197 /* Add expression EXP of SIZE bytes to offset OFF of fragment FRAG.  */
4198 
4199 void
4200 arc_cons_fix_new (fragS *frag,
4201 		  int off,
4202 		  int size,
4203 		  expressionS *exp,
4204 		  bfd_reloc_code_real_type r_type)
4205 {
4206   r_type = BFD_RELOC_UNUSED;
4207 
4208   switch (size)
4209     {
4210     case 1:
4211       r_type = BFD_RELOC_8;
4212       break;
4213 
4214     case 2:
4215       r_type = BFD_RELOC_16;
4216       break;
4217 
4218     case 3:
4219       r_type = BFD_RELOC_24;
4220       break;
4221 
4222     case 4:
4223       r_type = BFD_RELOC_32;
4224       arc_check_reloc (exp, &r_type);
4225       break;
4226 
4227     case 8:
4228       r_type = BFD_RELOC_64;
4229       break;
4230 
4231     default:
4232       as_bad (_("unsupported BFD relocation size %u"), size);
4233       r_type = BFD_RELOC_UNUSED;
4234     }
4235 
4236   fix_new_exp (frag, off, size, exp, 0, r_type);
4237 }
4238 
4239 /* The actual routine that checks the ZOL conditions.  */
4240 
4241 static void
4242 check_zol (symbolS *s)
4243 {
4244   switch (selected_cpu.mach)
4245     {
4246     case bfd_mach_arc_arcv2:
4247       if (selected_cpu.flags & ARC_OPCODE_ARCv2EM)
4248 	return;
4249 
4250       if (is_br_jmp_insn_p (arc_last_insns[0].opcode)
4251 	  || arc_last_insns[1].has_delay_slot)
4252 	as_bad (_("Jump/Branch instruction detected at the end of the ZOL label @%s"),
4253 		S_GET_NAME (s));
4254 
4255       break;
4256     case bfd_mach_arc_arc600:
4257 
4258       if (is_kernel_insn_p (arc_last_insns[0].opcode))
4259 	as_bad (_("Kernel instruction detected at the end of the ZOL label @%s"),
4260 		S_GET_NAME (s));
4261 
4262       if (arc_last_insns[0].has_limm
4263 	  && is_br_jmp_insn_p (arc_last_insns[0].opcode))
4264 	as_bad (_("A jump instruction with long immediate detected at the \
4265 end of the ZOL label @%s"), S_GET_NAME (s));
4266 
4267       /* Fall through.  */
4268     case bfd_mach_arc_arc700:
4269       if (arc_last_insns[0].has_delay_slot)
4270 	as_bad (_("An illegal use of delay slot detected at the end of the ZOL label @%s"),
4271 		S_GET_NAME (s));
4272 
4273       break;
4274     default:
4275       break;
4276     }
4277 }
4278 
4279 /* If ZOL end check the last two instruction for illegals.  */
4280 void
4281 arc_frob_label (symbolS * sym)
4282 {
4283   if (ARC_GET_FLAG (sym) & ARC_FLAG_ZOL)
4284     check_zol (sym);
4285 
4286   dwarf2_emit_label (sym);
4287 }
4288 
4289 /* Used because generic relaxation assumes a pc-rel value whilst we
4290    also relax instructions that use an absolute value resolved out of
4291    relative values (if that makes any sense).  An example: 'add r1,
4292    r2, @.L2 - .'  The symbols . and @.L2 are relative to the section
4293    but if they're in the same section we can subtract the section
4294    offset relocation which ends up in a resolved value.  So if @.L2 is
4295    .text + 0x50 and . is .text + 0x10, we can say that .text + 0x50 -
4296    .text + 0x40 = 0x10.  */
4297 int
4298 arc_pcrel_adjust (fragS *fragP)
4299 {
4300   pr_debug ("arc_pcrel_adjust: address=%ld, fix=%ld, PCrel %s\n",
4301 	    fragP->fr_address, fragP->fr_fix,
4302 	    fragP->tc_frag_data.pcrel ? "Y" : "N");
4303 
4304   if (!fragP->tc_frag_data.pcrel)
4305     return fragP->fr_address + fragP->fr_fix;
4306 
4307   /* Take into account the PCL rounding.  */
4308   return (fragP->fr_address + fragP->fr_fix) & 0x03;
4309 }
4310 
4311 /* Initialize the DWARF-2 unwind information for this procedure.  */
4312 
4313 void
4314 tc_arc_frame_initial_instructions (void)
4315 {
4316   /* Stack pointer is register 28.  */
4317   cfi_add_CFA_def_cfa (28, 0);
4318 }
4319 
4320 int
4321 tc_arc_regname_to_dw2regnum (char *regname)
4322 {
4323   struct symbol *sym;
4324 
4325   sym = hash_find (arc_reg_hash, regname);
4326   if (sym)
4327     return S_GET_VALUE (sym);
4328 
4329   return -1;
4330 }
4331 
4332 /* Adjust the symbol table.  Delete found AUX register symbols.  */
4333 
4334 void
4335 arc_adjust_symtab (void)
4336 {
4337   symbolS * sym;
4338 
4339   for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
4340     {
4341       /* I've created a symbol during parsing process.  Now, remove
4342 	 the symbol as it is found to be an AUX register.  */
4343       if (ARC_GET_FLAG (sym) & ARC_FLAG_AUX)
4344 	symbol_remove (sym, &symbol_rootP, &symbol_lastP);
4345     }
4346 
4347   /* Now do generic ELF adjustments.  */
4348   elf_adjust_symtab ();
4349 }
4350 
4351 static void
4352 tokenize_extinsn (extInstruction_t *einsn)
4353 {
4354   char *p, c;
4355   char *insn_name;
4356   unsigned char major_opcode;
4357   unsigned char sub_opcode;
4358   unsigned char syntax_class = 0;
4359   unsigned char syntax_class_modifiers = 0;
4360   unsigned char suffix_class = 0;
4361   unsigned int i;
4362 
4363   SKIP_WHITESPACE ();
4364 
4365   /* 1st: get instruction name.  */
4366   p = input_line_pointer;
4367   c = get_symbol_name (&p);
4368 
4369   insn_name = xstrdup (p);
4370   restore_line_pointer (c);
4371 
4372   /* 2nd: get major opcode.  */
4373   if (*input_line_pointer != ',')
4374     {
4375       as_bad (_("expected comma after instruction name"));
4376       ignore_rest_of_line ();
4377       return;
4378     }
4379   input_line_pointer++;
4380   major_opcode = get_absolute_expression ();
4381 
4382   /* 3rd: get sub-opcode.  */
4383   SKIP_WHITESPACE ();
4384 
4385   if (*input_line_pointer != ',')
4386     {
4387       as_bad (_("expected comma after major opcode"));
4388       ignore_rest_of_line ();
4389       return;
4390     }
4391   input_line_pointer++;
4392   sub_opcode = get_absolute_expression ();
4393 
4394   /* 4th: get suffix class.  */
4395   SKIP_WHITESPACE ();
4396 
4397   if (*input_line_pointer != ',')
4398     {
4399       as_bad ("expected comma after sub opcode");
4400       ignore_rest_of_line ();
4401       return;
4402     }
4403   input_line_pointer++;
4404 
4405   while (1)
4406     {
4407       SKIP_WHITESPACE ();
4408 
4409       for (i = 0; i < ARRAY_SIZE (suffixclass); i++)
4410 	{
4411 	  if (!strncmp (suffixclass[i].name, input_line_pointer,
4412 			suffixclass[i].len))
4413 	    {
4414 	      suffix_class |= suffixclass[i].attr_class;
4415 	      input_line_pointer += suffixclass[i].len;
4416 	      break;
4417 	    }
4418 	}
4419 
4420       if (i == ARRAY_SIZE (suffixclass))
4421 	{
4422 	  as_bad ("invalid suffix class");
4423 	  ignore_rest_of_line ();
4424 	  return;
4425 	}
4426 
4427       SKIP_WHITESPACE ();
4428 
4429       if (*input_line_pointer == '|')
4430 	input_line_pointer++;
4431       else
4432 	break;
4433     }
4434 
4435   /* 5th: get syntax class and syntax class modifiers.  */
4436   if (*input_line_pointer != ',')
4437     {
4438       as_bad ("expected comma after suffix class");
4439       ignore_rest_of_line ();
4440       return;
4441     }
4442   input_line_pointer++;
4443 
4444   while (1)
4445     {
4446       SKIP_WHITESPACE ();
4447 
4448       for (i = 0; i < ARRAY_SIZE (syntaxclassmod); i++)
4449 	{
4450 	  if (!strncmp (syntaxclassmod[i].name,
4451 			input_line_pointer,
4452 			syntaxclassmod[i].len))
4453 	    {
4454 	      syntax_class_modifiers |= syntaxclassmod[i].attr_class;
4455 	      input_line_pointer += syntaxclassmod[i].len;
4456 	      break;
4457 	    }
4458 	}
4459 
4460       if (i == ARRAY_SIZE (syntaxclassmod))
4461 	{
4462 	  for (i = 0; i < ARRAY_SIZE (syntaxclass); i++)
4463 	    {
4464 	      if (!strncmp (syntaxclass[i].name,
4465 			    input_line_pointer,
4466 			    syntaxclass[i].len))
4467 		{
4468 		  syntax_class |= syntaxclass[i].attr_class;
4469 		  input_line_pointer += syntaxclass[i].len;
4470 		  break;
4471 		}
4472 	    }
4473 
4474 	  if (i == ARRAY_SIZE (syntaxclass))
4475 	    {
4476 	      as_bad ("missing syntax class");
4477 	      ignore_rest_of_line ();
4478 	      return;
4479 	    }
4480 	}
4481 
4482       SKIP_WHITESPACE ();
4483 
4484       if (*input_line_pointer == '|')
4485 	input_line_pointer++;
4486       else
4487 	break;
4488     }
4489 
4490   demand_empty_rest_of_line ();
4491 
4492   einsn->name   = insn_name;
4493   einsn->major  = major_opcode;
4494   einsn->minor  = sub_opcode;
4495   einsn->syntax = syntax_class;
4496   einsn->modsyn = syntax_class_modifiers;
4497   einsn->suffix = suffix_class;
4498   einsn->flags  = syntax_class
4499     | (syntax_class_modifiers & ARC_OP1_IMM_IMPLIED ? 0x10 : 0);
4500 }
4501 
4502 /* Generate an extension section.  */
4503 
4504 static int
4505 arc_set_ext_seg (void)
4506 {
4507   if (!arcext_section)
4508     {
4509       arcext_section = subseg_new (".arcextmap", 0);
4510       bfd_set_section_flags (stdoutput, arcext_section,
4511 			     SEC_READONLY | SEC_HAS_CONTENTS);
4512     }
4513   else
4514     subseg_set (arcext_section, 0);
4515   return 1;
4516 }
4517 
4518 /* Create an extension instruction description in the arc extension
4519    section of the output file.
4520    The structure for an instruction is like this:
4521    [0]: Length of the record.
4522    [1]: Type of the record.
4523 
4524    [2]: Major opcode.
4525    [3]: Sub-opcode.
4526    [4]: Syntax (flags).
4527    [5]+ Name instruction.
4528 
4529    The sequence is terminated by an empty entry.  */
4530 
4531 static void
4532 create_extinst_section (extInstruction_t *einsn)
4533 {
4534 
4535   segT old_sec    = now_seg;
4536   int old_subsec  = now_subseg;
4537   char *p;
4538   int name_len    = strlen (einsn->name);
4539 
4540   arc_set_ext_seg ();
4541 
4542   p = frag_more (1);
4543   *p = 5 + name_len + 1;
4544   p = frag_more (1);
4545   *p = EXT_INSTRUCTION;
4546   p = frag_more (1);
4547   *p = einsn->major;
4548   p = frag_more (1);
4549   *p = einsn->minor;
4550   p = frag_more (1);
4551   *p = einsn->flags;
4552   p = frag_more (name_len + 1);
4553   strcpy (p, einsn->name);
4554 
4555   subseg_set (old_sec, old_subsec);
4556 }
4557 
4558 /* Handler .extinstruction pseudo-op.  */
4559 
4560 static void
4561 arc_extinsn (int ignore ATTRIBUTE_UNUSED)
4562 {
4563   extInstruction_t einsn;
4564   struct arc_opcode *arc_ext_opcodes;
4565   const char *errmsg = NULL;
4566   unsigned char moplow, mophigh;
4567 
4568   memset (&einsn, 0, sizeof (einsn));
4569   tokenize_extinsn (&einsn);
4570 
4571   /* Check if the name is already used.  */
4572   if (arc_find_opcode (einsn.name))
4573     as_warn (_("Pseudocode already used %s"), einsn.name);
4574 
4575   /* Check the opcode ranges.  */
4576   moplow = 0x05;
4577   mophigh = (selected_cpu.flags & (ARC_OPCODE_ARCv2EM
4578                                    | ARC_OPCODE_ARCv2HS)) ? 0x07 : 0x0a;
4579 
4580   if ((einsn.major > mophigh) || (einsn.major < moplow))
4581     as_fatal (_("major opcode not in range [0x%02x - 0x%02x]"), moplow, mophigh);
4582 
4583   if ((einsn.minor > 0x3f) && (einsn.major != 0x0a)
4584       && (einsn.major != 5) && (einsn.major != 9))
4585     as_fatal (_("minor opcode not in range [0x00 - 0x3f]"));
4586 
4587   switch (einsn.syntax & ARC_SYNTAX_MASK)
4588     {
4589     case ARC_SYNTAX_3OP:
4590       if (einsn.modsyn & ARC_OP1_IMM_IMPLIED)
4591 	as_fatal (_("Improper use of OP1_IMM_IMPLIED"));
4592       break;
4593     case ARC_SYNTAX_2OP:
4594     case ARC_SYNTAX_1OP:
4595     case ARC_SYNTAX_NOP:
4596       if (einsn.modsyn & ARC_OP1_MUST_BE_IMM)
4597 	as_fatal (_("Improper use of OP1_MUST_BE_IMM"));
4598       break;
4599     default:
4600       break;
4601     }
4602 
4603   arc_ext_opcodes = arcExtMap_genOpcode (&einsn, selected_cpu.flags, &errmsg);
4604   if (arc_ext_opcodes == NULL)
4605     {
4606       if (errmsg)
4607 	as_fatal ("%s", errmsg);
4608       else
4609 	as_fatal (_("Couldn't generate extension instruction opcodes"));
4610     }
4611   else if (errmsg)
4612     as_warn ("%s", errmsg);
4613 
4614   /* Insert the extension instruction.  */
4615   arc_insert_opcode ((const struct arc_opcode *) arc_ext_opcodes);
4616 
4617   create_extinst_section (&einsn);
4618 }
4619 
4620 static bfd_boolean
4621 tokenize_extregister (extRegister_t *ereg, int opertype)
4622 {
4623   char *name;
4624   char *mode;
4625   char c;
4626   char *p;
4627   int number, imode = 0;
4628   bfd_boolean isCore_p = (opertype == EXT_CORE_REGISTER) ? TRUE : FALSE;
4629   bfd_boolean isReg_p  = (opertype == EXT_CORE_REGISTER
4630 			  || opertype == EXT_AUX_REGISTER) ? TRUE : FALSE;
4631 
4632   /* 1st: get register name.  */
4633   SKIP_WHITESPACE ();
4634   p = input_line_pointer;
4635   c = get_symbol_name (&p);
4636 
4637   name = xstrdup (p);
4638   restore_line_pointer (c);
4639 
4640   /* 2nd: get register number.  */
4641   SKIP_WHITESPACE ();
4642 
4643   if (*input_line_pointer != ',')
4644     {
4645       as_bad (_("expected comma after name"));
4646       ignore_rest_of_line ();
4647       free (name);
4648       return FALSE;
4649     }
4650   input_line_pointer++;
4651   number = get_absolute_expression ();
4652 
4653   if ((number < 0)
4654       && (opertype != EXT_AUX_REGISTER))
4655     {
4656       as_bad (_("%s second argument cannot be a negative number %d"),
4657 	      isCore_p ? "extCoreRegister's" : "extCondCode's",
4658 	      number);
4659       ignore_rest_of_line ();
4660       free (name);
4661       return FALSE;
4662     }
4663 
4664   if (isReg_p)
4665     {
4666       /* 3rd: get register mode.  */
4667       SKIP_WHITESPACE ();
4668 
4669       if (*input_line_pointer != ',')
4670 	{
4671 	  as_bad (_("expected comma after register number"));
4672 	  ignore_rest_of_line ();
4673 	  free (name);
4674 	  return FALSE;
4675 	}
4676 
4677       input_line_pointer++;
4678       mode = input_line_pointer;
4679 
4680       if (!strncmp (mode, "r|w", 3))
4681 	{
4682 	  imode = 0;
4683 	  input_line_pointer += 3;
4684 	}
4685       else if (!strncmp (mode, "r", 1))
4686 	{
4687 	  imode = ARC_REGISTER_READONLY;
4688 	  input_line_pointer += 1;
4689 	}
4690       else if (strncmp (mode, "w", 1))
4691 	{
4692 	  as_bad (_("invalid mode"));
4693 	  ignore_rest_of_line ();
4694 	  free (name);
4695 	  return FALSE;
4696 	}
4697       else
4698 	{
4699 	  imode = ARC_REGISTER_WRITEONLY;
4700 	  input_line_pointer += 1;
4701 	}
4702     }
4703 
4704   if (isCore_p)
4705     {
4706       /* 4th: get core register shortcut.  */
4707       SKIP_WHITESPACE ();
4708       if (*input_line_pointer != ',')
4709 	{
4710 	  as_bad (_("expected comma after register mode"));
4711 	  ignore_rest_of_line ();
4712 	  free (name);
4713 	  return FALSE;
4714 	}
4715 
4716       input_line_pointer++;
4717 
4718       if (!strncmp (input_line_pointer, "cannot_shortcut", 15))
4719 	{
4720 	  imode |= ARC_REGISTER_NOSHORT_CUT;
4721 	  input_line_pointer += 15;
4722 	}
4723       else if (strncmp (input_line_pointer, "can_shortcut", 12))
4724 	{
4725 	  as_bad (_("shortcut designator invalid"));
4726 	  ignore_rest_of_line ();
4727 	  free (name);
4728 	  return FALSE;
4729 	}
4730       else
4731 	{
4732 	  input_line_pointer += 12;
4733 	}
4734     }
4735   demand_empty_rest_of_line ();
4736 
4737   ereg->name = name;
4738   ereg->number = number;
4739   ereg->imode  = imode;
4740   return TRUE;
4741 }
4742 
4743 /* Create an extension register/condition description in the arc
4744    extension section of the output file.
4745 
4746    The structure for an instruction is like this:
4747    [0]: Length of the record.
4748    [1]: Type of the record.
4749 
4750    For core regs and condition codes:
4751    [2]: Value.
4752    [3]+ Name.
4753 
4754    For auxiliary registers:
4755    [2..5]: Value.
4756    [6]+ Name
4757 
4758    The sequence is terminated by an empty entry.  */
4759 
4760 static void
4761 create_extcore_section (extRegister_t *ereg, int opertype)
4762 {
4763   segT old_sec   = now_seg;
4764   int old_subsec = now_subseg;
4765   char *p;
4766   int name_len   = strlen (ereg->name);
4767 
4768   arc_set_ext_seg ();
4769 
4770   switch (opertype)
4771     {
4772     case EXT_COND_CODE:
4773     case EXT_CORE_REGISTER:
4774       p = frag_more (1);
4775       *p = 3 + name_len + 1;
4776       p = frag_more (1);
4777       *p = opertype;
4778       p = frag_more (1);
4779       *p = ereg->number;
4780       break;
4781     case EXT_AUX_REGISTER:
4782       p = frag_more (1);
4783       *p = 6 + name_len + 1;
4784       p = frag_more (1);
4785       *p = EXT_AUX_REGISTER;
4786       p = frag_more (1);
4787       *p = (ereg->number >> 24) & 0xff;
4788       p = frag_more (1);
4789       *p = (ereg->number >> 16) & 0xff;
4790       p = frag_more (1);
4791       *p = (ereg->number >>  8) & 0xff;
4792       p = frag_more (1);
4793       *p = (ereg->number)       & 0xff;
4794       break;
4795     default:
4796       break;
4797     }
4798 
4799   p = frag_more (name_len + 1);
4800   strcpy (p, ereg->name);
4801 
4802   subseg_set (old_sec, old_subsec);
4803 }
4804 
4805 /* Handler .extCoreRegister pseudo-op.  */
4806 
4807 static void
4808 arc_extcorereg (int opertype)
4809 {
4810   extRegister_t ereg;
4811   struct arc_aux_reg *auxr;
4812   const char *retval;
4813   struct arc_flag_operand *ccode;
4814 
4815   memset (&ereg, 0, sizeof (ereg));
4816   if (!tokenize_extregister (&ereg, opertype))
4817     return;
4818 
4819   switch (opertype)
4820     {
4821     case EXT_CORE_REGISTER:
4822       /* Core register.  */
4823       if (ereg.number > 60)
4824 	as_bad (_("core register %s value (%d) too large"), ereg.name,
4825 		ereg.number);
4826       declare_register (ereg.name, ereg.number);
4827       break;
4828     case EXT_AUX_REGISTER:
4829       /* Auxiliary register.  */
4830       auxr = XNEW (struct arc_aux_reg);
4831       auxr->name = ereg.name;
4832       auxr->cpu = selected_cpu.flags;
4833       auxr->subclass = NONE;
4834       auxr->address = ereg.number;
4835       retval = hash_insert (arc_aux_hash, auxr->name, (void *) auxr);
4836       if (retval)
4837 	as_fatal (_("internal error: can't hash aux register '%s': %s"),
4838 		  auxr->name, retval);
4839       break;
4840     case EXT_COND_CODE:
4841       /* Condition code.  */
4842       if (ereg.number > 31)
4843 	as_bad (_("condition code %s value (%d) too large"), ereg.name,
4844 		ereg.number);
4845       ext_condcode.size ++;
4846       ext_condcode.arc_ext_condcode =
4847 	XRESIZEVEC (struct arc_flag_operand, ext_condcode.arc_ext_condcode,
4848 		    ext_condcode.size + 1);
4849       if (ext_condcode.arc_ext_condcode == NULL)
4850 	as_fatal (_("Virtual memory exhausted"));
4851 
4852       ccode = ext_condcode.arc_ext_condcode + ext_condcode.size - 1;
4853       ccode->name   = ereg.name;
4854       ccode->code   = ereg.number;
4855       ccode->bits   = 5;
4856       ccode->shift  = 0;
4857       ccode->favail = 0; /* not used.  */
4858       ccode++;
4859       memset (ccode, 0, sizeof (struct arc_flag_operand));
4860       break;
4861     default:
4862       as_bad (_("Unknown extension"));
4863       break;
4864     }
4865   create_extcore_section (&ereg, opertype);
4866 }
4867 
4868 /* Parse a .arc_attribute directive.  */
4869 
4870 static void
4871 arc_attribute (int ignored ATTRIBUTE_UNUSED)
4872 {
4873   int tag = obj_elf_vendor_attribute (OBJ_ATTR_PROC);
4874 
4875   if (tag < NUM_KNOWN_OBJ_ATTRIBUTES)
4876     attributes_set_explicitly[tag] = TRUE;
4877 }
4878 
4879 /* Set an attribute if it has not already been set by the user.  */
4880 
4881 static void
4882 arc_set_attribute_int (int tag, int value)
4883 {
4884   if (tag < 1
4885       || tag >= NUM_KNOWN_OBJ_ATTRIBUTES
4886       || !attributes_set_explicitly[tag])
4887     bfd_elf_add_proc_attr_int (stdoutput, tag, value);
4888 }
4889 
4890 static void
4891 arc_set_attribute_string (int tag, const char *value)
4892 {
4893   if (tag < 1
4894       || tag >= NUM_KNOWN_OBJ_ATTRIBUTES
4895       || !attributes_set_explicitly[tag])
4896     bfd_elf_add_proc_attr_string (stdoutput, tag, value);
4897 }
4898 
4899 /* Allocate and concatenate two strings.  s1 can be NULL but not
4900    s2.  s1 pointer is freed at end of this procedure.  */
4901 
4902 static char *
4903 arc_stralloc (char * s1, const char * s2)
4904 {
4905   char * p;
4906   int len = 0;
4907 
4908   if (s1)
4909     len = strlen (s1) + 1;
4910 
4911   /* Only s1 can be null.  */
4912   gas_assert (s2);
4913   len += strlen (s2) + 1;
4914 
4915   p = (char *) xmalloc (len);
4916   if (p == NULL)
4917     as_fatal (_("Virtual memory exhausted"));
4918 
4919   if (s1)
4920     {
4921       strcpy (p, s1);
4922       strcat (p, ",");
4923       strcat (p, s2);
4924       free (s1);
4925     }
4926   else
4927     strcpy (p, s2);
4928 
4929   return p;
4930 }
4931 
4932 /* Set the public ARC object attributes.  */
4933 
4934 static void
4935 arc_set_public_attributes (void)
4936 {
4937   int base = 0;
4938   char *s = NULL;
4939   unsigned int i;
4940 
4941   /* Tag_ARC_CPU_name.  */
4942   arc_set_attribute_string (Tag_ARC_CPU_name, selected_cpu.name);
4943 
4944   /* Tag_ARC_CPU_base.  */
4945   switch (selected_cpu.eflags & EF_ARC_MACH_MSK)
4946     {
4947     case E_ARC_MACH_ARC600:
4948     case E_ARC_MACH_ARC601:
4949       base = TAG_CPU_ARC6xx;
4950       break;
4951     case E_ARC_MACH_ARC700:
4952       base = TAG_CPU_ARC7xx;
4953       break;
4954     case EF_ARC_CPU_ARCV2EM:
4955       base = TAG_CPU_ARCEM;
4956       break;
4957     case EF_ARC_CPU_ARCV2HS:
4958       base = TAG_CPU_ARCHS;
4959       break;
4960     default:
4961       base = 0;
4962       break;
4963     }
4964   if (attributes_set_explicitly[Tag_ARC_CPU_base]
4965       && (base != bfd_elf_get_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
4966 					    Tag_ARC_CPU_base)))
4967     as_warn (_("Overwrite explicitly set Tag_ARC_CPU_base"));
4968   bfd_elf_add_proc_attr_int (stdoutput, Tag_ARC_CPU_base, base);
4969 
4970   /* Tag_ARC_ABI_osver.  */
4971   if (attributes_set_explicitly[Tag_ARC_ABI_osver])
4972     {
4973       int val = bfd_elf_get_obj_attr_int (stdoutput, OBJ_ATTR_PROC,
4974 					  Tag_ARC_ABI_osver);
4975 
4976       selected_cpu.eflags = ((selected_cpu.eflags & ~EF_ARC_OSABI_MSK)
4977 			     | (val & 0x0f << 8));
4978     }
4979   else
4980     {
4981       arc_set_attribute_int (Tag_ARC_ABI_osver, E_ARC_OSABI_CURRENT >> 8);
4982     }
4983 
4984   /* Tag_ARC_ISA_config.  */
4985   arc_check_feature();
4986 
4987   for (i = 0; i < ARRAY_SIZE (feature_list); i++)
4988     if (selected_cpu.features & feature_list[i].feature)
4989       s = arc_stralloc (s, feature_list[i].attr);
4990 
4991   if (s)
4992     arc_set_attribute_string (Tag_ARC_ISA_config, s);
4993 
4994   /* Tag_ARC_ISA_mpy_option.  */
4995   arc_set_attribute_int (Tag_ARC_ISA_mpy_option, mpy_option);
4996 
4997   /* Tag_ARC_ABI_pic.  */
4998   arc_set_attribute_int (Tag_ARC_ABI_pic, pic_option);
4999 
5000   /* Tag_ARC_ABI_sda.  */
5001   arc_set_attribute_int (Tag_ARC_ABI_sda, sda_option);
5002 
5003   /* Tag_ARC_ABI_tls.  */
5004   arc_set_attribute_int (Tag_ARC_ABI_tls, tls_option);
5005 }
5006 
5007 /* Add the default contents for the .ARC.attributes section.  */
5008 
5009 void
5010 arc_md_end (void)
5011 {
5012   arc_set_public_attributes ();
5013 
5014   if (!bfd_set_arch_mach (stdoutput, bfd_arch_arc, selected_cpu.mach))
5015     as_fatal (_("could not set architecture and machine"));
5016 
5017   bfd_set_private_flags (stdoutput, selected_cpu.eflags);
5018 }
5019 
5020 void arc_copy_symbol_attributes (symbolS *dest, symbolS *src)
5021 {
5022   ARC_GET_FLAG (dest) = ARC_GET_FLAG (src);
5023 }
5024 
5025 int arc_convert_symbolic_attribute (const char *name)
5026 {
5027   static const struct
5028   {
5029     const char * name;
5030     const int    tag;
5031   }
5032   attribute_table[] =
5033     {
5034 #define T(tag) {#tag, tag}
5035   T (Tag_ARC_PCS_config),
5036   T (Tag_ARC_CPU_base),
5037   T (Tag_ARC_CPU_variation),
5038   T (Tag_ARC_CPU_name),
5039   T (Tag_ARC_ABI_rf16),
5040   T (Tag_ARC_ABI_osver),
5041   T (Tag_ARC_ABI_sda),
5042   T (Tag_ARC_ABI_pic),
5043   T (Tag_ARC_ABI_tls),
5044   T (Tag_ARC_ABI_enumsize),
5045   T (Tag_ARC_ABI_exceptions),
5046   T (Tag_ARC_ABI_double_size),
5047   T (Tag_ARC_ISA_config),
5048   T (Tag_ARC_ISA_apex),
5049   T (Tag_ARC_ISA_mpy_option)
5050 #undef T
5051     };
5052   unsigned int i;
5053 
5054   if (name == NULL)
5055     return -1;
5056 
5057   for (i = 0; i < ARRAY_SIZE (attribute_table); i++)
5058     if (streq (name, attribute_table[i].name))
5059       return attribute_table[i].tag;
5060 
5061   return -1;
5062 }
5063 
5064 /* Local variables:
5065    eval: (c-set-style "gnu")
5066    indent-tabs-mode: t
5067    End:  */
5068