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