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