2 Copyright (C) 2010-2018 Free Software Foundation, Inc.
3 Contributed by Joseph Myers <joseph@codesourcery.com>
4 Bernd Schmidt <bernds@codesourcery.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 3, or (at your option)
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, 51 Franklin Street - Fifth Floor, Boston, MA
24 #include "dwarf2dbg.h"
25 #include "dw2gencfi.h"
26 #include "safe-ctype.h"
28 #include "opcode/tic6x.h"
29 #include "elf/tic6x.h"
30 #include "elf32-tic6x.h"
32 /* Truncate and sign-extend at 32 bits, so that building on a 64-bit
33 host gives identical results to a 32-bit host. */
34 #define TRUNC(X) ((valueT) (X) & 0xffffffffU)
35 #define SEXT(X) ((TRUNC (X) ^ 0x80000000U) - 0x80000000U)
37 #define streq(a, b) (strcmp (a, b) == 0)
39 /* Stuff for .scomm symbols. */
40 static segT sbss_section;
41 static asection scom_section;
42 static asymbol scom_symbol;
44 const char comment_chars[] = ";";
45 const char line_comment_chars[] = "#*;";
46 const char line_separator_chars[] = "@";
48 const char EXP_CHARS[] = "eE";
49 const char FLT_CHARS[] = "dDfF";
51 const char *md_shortopts = "";
55 OPTION_MARCH = OPTION_MD_BASE,
57 OPTION_MLITTLE_ENDIAN,
66 struct option md_longopts[] =
68 { "march", required_argument, NULL, OPTION_MARCH },
69 { "mbig-endian", no_argument, NULL, OPTION_MBIG_ENDIAN },
70 { "mlittle-endian", no_argument, NULL, OPTION_MLITTLE_ENDIAN },
71 { "mdsbt", no_argument, NULL, OPTION_MDSBT },
72 { "mno-dsbt", no_argument, NULL, OPTION_MNO_DSBT },
73 { "mpid", required_argument, NULL, OPTION_MPID },
74 { "mpic", no_argument, NULL, OPTION_MPIC },
75 { "mno-pic", no_argument, NULL, OPTION_MNO_PIC },
76 { "mgenerate-rel", no_argument, NULL, OPTION_MGENERATE_REL },
77 { NULL, no_argument, NULL, 0 }
79 size_t md_longopts_size = sizeof (md_longopts);
81 /* The instructions enabled based only on the selected architecture
82 (all instructions, if no architecture specified). */
83 static unsigned short tic6x_arch_enable = (TIC6X_INSN_C62X
90 /* The instructions enabled based on the current set of features
91 (architecture, as modified by other options). */
92 static unsigned short tic6x_features;
94 /* The architecture attribute value, or C6XABI_Tag_ISA_none if
96 static int tic6x_arch_attribute = C6XABI_Tag_ISA_none;
98 /* Whether any instructions at all have been seen. Once any
99 instructions have been seen, architecture attributes merge into the
100 previous attribute value rather than replacing it. */
101 static bfd_boolean tic6x_seen_insns = FALSE;
103 /* The number of registers in each register file supported by the
104 current architecture. */
105 static unsigned int tic6x_num_registers;
107 /* Whether predication on A0 is possible. */
108 static bfd_boolean tic6x_predicate_a0;
110 /* Whether execute packets can cross fetch packet boundaries. */
111 static bfd_boolean tic6x_can_cross_fp_boundary;
113 /* Whether there are constraints on simultaneous reads and writes of
115 static bfd_boolean tic6x_long_data_constraints;
117 /* Whether compact instructions are available. */
118 static bfd_boolean tic6x_compact_insns;
120 /* Whether to generate RELA relocations. */
121 static bfd_boolean tic6x_generate_rela = TRUE;
123 /* Whether the code uses DSBT addressing. */
124 static bfd_boolean tic6x_dsbt;
126 /* Types of position-independent data (attribute values for
135 /* The type of data addressing used in this code. */
136 static tic6x_pid_type tic6x_pid;
138 /* Whether the code uses position-independent code. */
139 static bfd_boolean tic6x_pic;
141 /* Table of supported architecture variants. */
146 unsigned short features;
148 static const tic6x_arch_table tic6x_arches[] =
150 { "c62x", C6XABI_Tag_ISA_C62X, TIC6X_INSN_C62X },
151 { "c64x", C6XABI_Tag_ISA_C64X, TIC6X_INSN_C62X | TIC6X_INSN_C64X },
152 { "c64x+", C6XABI_Tag_ISA_C64XP, (TIC6X_INSN_C62X
154 | TIC6X_INSN_C64XP) },
155 { "c67x", C6XABI_Tag_ISA_C67X, TIC6X_INSN_C62X | TIC6X_INSN_C67X },
156 { "c67x+", C6XABI_Tag_ISA_C67XP, (TIC6X_INSN_C62X
158 | TIC6X_INSN_C67XP) },
159 { "c674x", C6XABI_Tag_ISA_C674X, (TIC6X_INSN_C62X
164 | TIC6X_INSN_C674X) }
167 /* Caller saved register encodings. The standard frame layout uses this
168 order, starting from the highest address. There must be
169 TIC6X_NUM_UNWIND_REGS values. */
187 static void tic6x_output_unwinding (bfd_boolean need_extab);
189 /* Return the frame unwind state for the current function, allocating
192 static tic6x_unwind_info *tic6x_get_unwind (void)
194 tic6x_unwind_info *unwind;
196 unwind = seg_info (now_seg)->tc_segment_info_data.unwind;
200 unwind = seg_info (now_seg)->tc_segment_info_data.text_unwind;
204 unwind =XNEW (tic6x_unwind_info);
205 seg_info (now_seg)->tc_segment_info_data.unwind = unwind;
206 memset (unwind, 0, sizeof (*unwind));
210 /* Update the selected architecture based on ARCH, giving an error if
211 ARCH is an invalid value. Does not call tic6x_update_features; the
212 caller must do that if necessary. */
215 tic6x_use_arch (const char *arch)
219 for (i = 0; i < ARRAY_SIZE (tic6x_arches); i++)
220 if (strcmp (arch, tic6x_arches[i].arch) == 0)
222 tic6x_arch_enable = tic6x_arches[i].features;
223 if (tic6x_seen_insns)
225 = elf32_tic6x_merge_arch_attributes (tic6x_arch_attribute,
226 tic6x_arches[i].attr);
228 tic6x_arch_attribute = tic6x_arches[i].attr;
232 as_bad (_("unknown architecture '%s'"), arch);
235 /* Table of supported -mpid arguments. */
240 } tic6x_pid_type_table;
241 static const tic6x_pid_type_table tic6x_pid_types[] =
243 { "no", tic6x_pid_no },
244 { "near", tic6x_pid_near },
245 { "far", tic6x_pid_far }
248 /* Handle -mpid=ARG. */
251 tic6x_use_pid (const char *arg)
255 for (i = 0; i < ARRAY_SIZE (tic6x_pid_types); i++)
256 if (strcmp (arg, tic6x_pid_types[i].arg) == 0)
258 tic6x_pid = tic6x_pid_types[i].attr;
262 as_bad (_("unknown -mpid= argument '%s'"), arg);
265 /* Parse a target-specific option. */
268 md_parse_option (int c, const char *arg)
273 tic6x_use_arch (arg);
276 case OPTION_MBIG_ENDIAN:
277 target_big_endian = 1;
280 case OPTION_MLITTLE_ENDIAN:
281 target_big_endian = 0;
288 case OPTION_MNO_DSBT:
304 case OPTION_MGENERATE_REL:
305 tic6x_generate_rela = FALSE;
315 md_show_usage (FILE *stream ATTRIBUTE_UNUSED)
319 fputc ('\n', stream);
320 fprintf (stream, _("TMS320C6000 options:\n"));
321 fprintf (stream, _(" -march=ARCH enable instructions from architecture ARCH\n"));
322 fprintf (stream, _(" -mbig-endian generate big-endian code\n"));
323 fprintf (stream, _(" -mlittle-endian generate little-endian code\n"));
324 fprintf (stream, _(" -mdsbt code uses DSBT addressing\n"));
325 fprintf (stream, _(" -mno-dsbt code does not use DSBT addressing\n"));
326 fprintf (stream, _(" -mpid=no code uses position-dependent data addressing\n"));
327 fprintf (stream, _(" -mpid=near code uses position-independent data addressing,\n"
328 " GOT accesses use near DP addressing\n"));
329 fprintf (stream, _(" -mpid=far code uses position-independent data addressing,\n"
330 " GOT accesses use far DP addressing\n"));
331 fprintf (stream, _(" -mpic code addressing is position-independent\n"));
332 fprintf (stream, _(" -mno-pic code addressing is position-dependent\n"));
333 /* -mgenerate-rel is only for testsuite use and is deliberately
336 fputc ('\n', stream);
337 fprintf (stream, _("Supported ARCH values are:"));
338 for (i = 0; i < ARRAY_SIZE (tic6x_arches); i++)
339 fprintf (stream, " %s", tic6x_arches[i].arch);
340 fputc ('\n', stream);
343 /* Update enabled features based on the current architecture and
346 tic6x_update_features (void)
348 tic6x_features = tic6x_arch_enable;
351 = (tic6x_arch_enable & (TIC6X_INSN_C64X | TIC6X_INSN_C67XP)) ? 32 : 16;
353 tic6x_predicate_a0 = (tic6x_arch_enable & TIC6X_INSN_C64X) ? TRUE : FALSE;
355 tic6x_can_cross_fp_boundary
357 & (TIC6X_INSN_C64X | TIC6X_INSN_C67XP)) ? TRUE : FALSE;
359 tic6x_long_data_constraints
360 = (tic6x_arch_enable & TIC6X_INSN_C64X) ? FALSE : TRUE;
362 tic6x_compact_insns = (tic6x_arch_enable & TIC6X_INSN_C64XP) ? TRUE : FALSE;
365 /* Do configuration after all options have been parsed. */
368 tic6x_after_parse_args (void)
370 tic6x_update_features ();
373 /* Parse a .cantunwind directive. */
375 s_tic6x_cantunwind (int ignored ATTRIBUTE_UNUSED)
377 tic6x_unwind_info *unwind = tic6x_get_unwind ();
379 /* GCC sometimes spits out superfluous .cantunwind directives, so ignore
381 if (unwind->data_bytes == 0)
384 if (unwind->data_bytes != -1)
386 as_bad (_("unexpected .cantunwind directive"));
390 demand_empty_rest_of_line ();
392 if (unwind->personality_routine || unwind->personality_index != -1)
393 as_bad (_("personality routine specified for cantunwind frame"));
395 unwind->personality_index = -2;
398 /* Parse a .handlerdata directive. */
400 s_tic6x_handlerdata (int ignored ATTRIBUTE_UNUSED)
402 tic6x_unwind_info *unwind = tic6x_get_unwind ();
404 if (!unwind->saved_seg)
406 as_bad (_("unexpected .handlerdata directive"));
410 if (unwind->table_entry || unwind->personality_index == -2)
412 as_bad (_("duplicate .handlerdata directive"));
416 if (unwind->personality_index == -1 && unwind->personality_routine == NULL)
418 as_bad (_("personality routine required before .handlerdata directive"));
422 tic6x_output_unwinding (TRUE);
425 /* Parse a .endp directive. */
427 s_tic6x_endp (int ignored ATTRIBUTE_UNUSED)
429 tic6x_unwind_info *unwind = tic6x_get_unwind ();
431 if (unwind->data_bytes != 0)
433 /* Output a .exidx entry if we have not already done so.
434 Then switch back to the text section. */
435 if (!unwind->table_entry)
436 tic6x_output_unwinding (FALSE);
438 subseg_set (unwind->saved_seg, unwind->saved_subseg);
441 unwind->saved_seg = NULL;
442 unwind->table_entry = NULL;
443 unwind->data_bytes = 0;
446 /* Parse a .personalityindex directive. */
448 s_tic6x_personalityindex (int ignored ATTRIBUTE_UNUSED)
450 tic6x_unwind_info *unwind = tic6x_get_unwind ();
453 if (unwind->personality_routine || unwind->personality_index != -1)
454 as_bad (_("duplicate .personalityindex directive"));
458 if (exp.X_op != O_constant
459 || exp.X_add_number < 0 || exp.X_add_number > 15)
461 as_bad (_("bad personality routine number"));
462 ignore_rest_of_line ();
466 unwind->personality_index = exp.X_add_number;
468 demand_empty_rest_of_line ();
472 s_tic6x_personality (int ignored ATTRIBUTE_UNUSED)
475 tic6x_unwind_info *unwind = tic6x_get_unwind ();
477 if (unwind->personality_routine || unwind->personality_index != -1)
478 as_bad (_("duplicate .personality directive"));
480 c = get_symbol_name (&name);
481 unwind->personality_routine = symbol_find_or_make (name);
482 (void) restore_line_pointer (c);
483 demand_empty_rest_of_line ();
486 /* Parse a .arch directive. */
488 s_tic6x_arch (int ignored ATTRIBUTE_UNUSED)
493 arch = input_line_pointer;
494 while (*input_line_pointer && !ISSPACE (*input_line_pointer))
495 input_line_pointer++;
496 c = *input_line_pointer;
497 *input_line_pointer = 0;
499 tic6x_use_arch (arch);
500 tic6x_update_features ();
501 *input_line_pointer = c;
502 demand_empty_rest_of_line ();
505 /* Parse a .ehtype directive. */
508 s_tic6x_ehtype (int ignored ATTRIBUTE_UNUSED)
513 #ifdef md_flush_pending_output
514 md_flush_pending_output ();
517 if (is_it_end_of_statement ())
519 demand_empty_rest_of_line ();
530 if (exp.X_op != O_symbol)
532 as_bad (_("expected symbol"));
538 fix_new_exp (frag_now, p - frag_now->fr_literal, 4,
539 &exp, 0, BFD_RELOC_C6000_EHTYPE);
541 demand_empty_rest_of_line ();
544 /* Parse a .nocmp directive. */
547 s_tic6x_nocmp (int ignored ATTRIBUTE_UNUSED)
549 seg_info (now_seg)->tc_segment_info_data.nocmp = TRUE;
550 demand_empty_rest_of_line ();
553 /* .scomm pseudo-op handler.
555 This is a new pseudo-op to handle putting objects in .scommon.
556 By doing this the linker won't need to do any work,
557 and more importantly it removes the implicit -G arg necessary to
558 correctly link the object file. */
561 s_tic6x_scomm (int ignore ATTRIBUTE_UNUSED)
571 c = get_symbol_name (&name);
573 /* Just after name is now '\0'. */
574 p = input_line_pointer;
575 (void) restore_line_pointer (c);
577 if (*input_line_pointer != ',')
579 as_bad (_("expected comma after symbol name"));
580 ignore_rest_of_line ();
585 input_line_pointer++;
586 if ((size = get_absolute_expression ()) < 0)
588 /* xgettext:c-format */
589 as_warn (_("invalid length for .scomm directive"));
590 ignore_rest_of_line ();
594 /* The third argument to .scomm is the alignment. */
595 if (*input_line_pointer != ',')
599 ++input_line_pointer;
600 align = get_absolute_expression ();
603 as_warn (_("alignment is not a positive number"));
608 /* Convert to a power of 2 alignment. */
611 for (align2 = 0; (align & 1) == 0; align >>= 1, ++align2)
615 as_bad (_("alignment is not a power of 2"));
616 ignore_rest_of_line ();
624 symbolP = symbol_find_or_make (name);
627 if (S_IS_DEFINED (symbolP))
629 /* xgettext:c-format */
630 as_bad (_("attempt to re-define symbol `%s'"),
631 S_GET_NAME (symbolP));
632 ignore_rest_of_line ();
636 if (S_GET_VALUE (symbolP) && S_GET_VALUE (symbolP) != (valueT) size)
638 /* xgettext:c-format */
639 as_bad (_("attempt to redefine `%s' with a different length"),
640 S_GET_NAME (symbolP));
642 ignore_rest_of_line ();
646 if (symbol_get_obj (symbolP)->local)
648 segT old_sec = now_seg;
649 int old_subsec = now_subseg;
652 record_alignment (sbss_section, align2);
653 subseg_set (sbss_section, 0);
656 frag_align (align2, 0, 0);
658 if (S_GET_SEGMENT (symbolP) == sbss_section)
659 symbol_get_frag (symbolP)->fr_symbol = 0;
661 symbol_set_frag (symbolP, frag_now);
663 pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP, size,
666 S_SET_SIZE (symbolP, size);
667 S_SET_SEGMENT (symbolP, sbss_section);
668 S_CLEAR_EXTERNAL (symbolP);
669 subseg_set (old_sec, old_subsec);
673 S_SET_VALUE (symbolP, (valueT) size);
674 S_SET_ALIGN (symbolP, 1 << align2);
675 S_SET_EXTERNAL (symbolP);
676 S_SET_SEGMENT (symbolP, &scom_section);
679 symbol_get_bfdsym (symbolP)->flags |= BSF_OBJECT;
681 demand_empty_rest_of_line ();
684 /* Track for each attribute whether it has been set explicitly (and so
685 should not have a default value set by the assembler). */
686 static bfd_boolean tic6x_attributes_set_explicitly[NUM_KNOWN_OBJ_ATTRIBUTES];
688 /* Parse a .c6xabi_attribute directive. */
691 s_tic6x_c6xabi_attribute (int ignored ATTRIBUTE_UNUSED)
693 int tag = obj_elf_vendor_attribute (OBJ_ATTR_PROC);
695 if (tag < NUM_KNOWN_OBJ_ATTRIBUTES)
696 tic6x_attributes_set_explicitly[tag] = TRUE;
703 } tic6x_attribute_table;
705 static const tic6x_attribute_table tic6x_attributes[] =
707 #define TAG(tag, value) { #tag, tag },
708 #include "elf/tic6x-attrs.h"
712 /* Convert an attribute name to a number. */
715 tic6x_convert_symbolic_attribute (const char *name)
719 for (i = 0; i < ARRAY_SIZE (tic6x_attributes); i++)
720 if (strcmp (name, tic6x_attributes[i].name) == 0)
721 return tic6x_attributes[i].tag;
726 const pseudo_typeS md_pseudo_table[] =
728 { "arch", s_tic6x_arch, 0 },
729 { "c6xabi_attribute", s_tic6x_c6xabi_attribute, 0 },
730 { "nocmp", s_tic6x_nocmp, 0 },
731 { "scomm", s_tic6x_scomm, 0 },
733 { "ehtype", s_tic6x_ehtype, 0 },
734 { "endp", s_tic6x_endp, 0 },
735 { "handlerdata", s_tic6x_handlerdata, 0 },
736 { "personalityindex", s_tic6x_personalityindex, 0 },
737 { "personality", s_tic6x_personality, 0 },
738 { "cantunwind", s_tic6x_cantunwind, 0 },
742 /* Hash table of opcodes. For each opcode name, this stores a pointer
743 to a tic6x_opcode_list listing (in an arbitrary order) all opcode
744 table entries with that name. */
745 static struct hash_control *opcode_hash;
747 /* Initialize the assembler (called once at assembler startup). */
757 bfd_set_arch_mach (stdoutput, TARGET_ARCH, 0);
759 /* Insert opcodes into the hash table. */
760 opcode_hash = hash_new ();
761 for (id = 0; id < tic6x_opcode_max; id++)
764 tic6x_opcode_list *opc = XNEW (tic6x_opcode_list);
767 opc->next = hash_find (opcode_hash, tic6x_opcode_table[id].name);
768 if ((errmsg = hash_jam (opcode_hash, tic6x_opcode_table[id].name, opc))
770 as_fatal ("%s", _(errmsg));
773 /* Save the current subseg so we can restore it [it's the default one and
774 we don't want the initial section to be .sbss]. */
778 /* The sbss section is for local .scomm symbols. */
779 sbss_section = subseg_new (".bss", 0);
780 seg_info (sbss_section)->bss = 1;
782 /* This is copied from perform_an_assembly_pass. */
783 applicable = bfd_applicable_section_flags (stdoutput);
784 bfd_set_section_flags (stdoutput, sbss_section, applicable & SEC_ALLOC);
786 subseg_set (seg, subseg);
788 /* We must construct a fake section similar to bfd_com_section
789 but with the name .scommon. */
790 scom_section = *bfd_com_section_ptr;
791 scom_section.name = ".scommon";
792 scom_section.output_section = & scom_section;
793 scom_section.symbol = & scom_symbol;
794 scom_section.symbol_ptr_ptr = & scom_section.symbol;
795 scom_symbol = * bfd_com_section_ptr->symbol;
796 scom_symbol.name = ".scommon";
797 scom_symbol.section = & scom_section;
800 /* Whether the current line being parsed had the "||" parallel bars. */
801 static bfd_boolean tic6x_line_parallel;
803 /* Whether the current line being parsed started "||^" to indicate an
804 SPMASKed parallel instruction. */
805 static bfd_boolean tic6x_line_spmask;
807 /* If the current line being parsed had an instruction predicate, the
808 creg value for that predicate (which must be nonzero); otherwise
810 static unsigned int tic6x_line_creg;
812 /* If the current line being parsed had an instruction predicate, the
813 z value for that predicate; otherwise 0. */
814 static unsigned int tic6x_line_z;
816 /* Return 1 (updating input_line_pointer as appropriate) if the line
817 starting with C (immediately before input_line_pointer) starts with
818 pre-opcode text appropriate for this target, 0 otherwise. */
821 tic6x_unrecognized_line (int c)
826 bfd_boolean bad_predicate;
831 if (input_line_pointer[0] == '|')
833 if (input_line_pointer[1] == '^')
835 tic6x_line_spmask = TRUE;
836 input_line_pointer += 2;
839 input_line_pointer += 1;
840 if (tic6x_line_parallel)
841 as_bad (_("multiple '||' on same line"));
842 tic6x_line_parallel = TRUE;
844 as_bad (_("'||' after predicate"));
850 /* If it doesn't look like a predicate at all, just return 0.
851 If it looks like one but not a valid one, give a better
853 p = input_line_pointer;
854 while (*p != ']' && !is_end_of_line[(unsigned char) *p])
859 p = input_line_pointer;
861 bad_predicate = FALSE;
867 if (*p == 'A' || *p == 'a')
869 else if (*p == 'B' || *p == 'b')
873 areg = TRUE; /* Avoid uninitialized warning. */
874 bad_predicate = TRUE;
879 if (*p != '0' && *p != '1' && *p != '2')
880 bad_predicate = TRUE;
881 else if (p[1] != ']')
882 bad_predicate = TRUE;
884 input_line_pointer = p + 2;
888 as_bad (_("multiple predicates on same line"));
894 as_bad (_("bad predicate '%s'"), input_line_pointer - 1);
896 input_line_pointer = endp;
903 tic6x_line_creg = (areg ? 6 : 1);
904 if (areg && !tic6x_predicate_a0)
905 as_bad (_("predication on A0 not supported on this architecture"));
909 tic6x_line_creg = (areg ? 4 : 2);
913 tic6x_line_creg = (areg ? 5 : 3);
928 /* Do any target-specific handling of a label required. */
931 tic6x_frob_label (symbolS *sym)
933 segment_info_type *si;
934 tic6x_label_list *list;
936 if (tic6x_line_parallel)
938 as_bad (_("label after '||'"));
939 tic6x_line_parallel = FALSE;
940 tic6x_line_spmask = FALSE;
944 as_bad (_("label after predicate"));
949 si = seg_info (now_seg);
950 list = si->tc_segment_info_data.label_list;
951 si->tc_segment_info_data.label_list = XNEW (tic6x_label_list);
952 si->tc_segment_info_data.label_list->next = list;
953 si->tc_segment_info_data.label_list->label = sym;
955 /* Defining tc_frob_label overrides the ELF definition of
956 obj_frob_label, so we need to apply its effects here. */
957 dwarf2_emit_label (sym);
960 /* At end-of-line, give errors for start-of-line decorations that
961 needed an instruction but were not followed by one. */
964 tic6x_end_of_line (void)
966 if (tic6x_line_parallel)
968 as_bad (_("'||' not followed by instruction"));
969 tic6x_line_parallel = FALSE;
970 tic6x_line_spmask = FALSE;
974 as_bad (_("predicate not followed by instruction"));
980 /* Do any target-specific handling of the start of a logical line. */
983 tic6x_start_line_hook (void)
985 tic6x_end_of_line ();
988 /* Do target-specific handling immediately after an input file from
989 the command line, and any other inputs it includes, have been
995 tic6x_end_of_line ();
998 /* Do target-specific initialization after arguments have been
999 processed and the output file created. */
1002 tic6x_init_after_args (void)
1004 elf32_tic6x_set_use_rela_p (stdoutput, tic6x_generate_rela);
1007 /* Free LIST of labels (possibly NULL). */
1010 tic6x_free_label_list (tic6x_label_list *list)
1014 tic6x_label_list *old = list;
1021 /* Handle a data alignment of N bytes. */
1024 tic6x_cons_align (int n ATTRIBUTE_UNUSED)
1026 segment_info_type *seginfo = seg_info (now_seg);
1028 /* Data means there is no current execute packet, and that any label
1029 applies to that data rather than a subsequent instruction. */
1030 tic6x_free_label_list (seginfo->tc_segment_info_data.label_list);
1031 seginfo->tc_segment_info_data.label_list = NULL;
1032 seginfo->tc_segment_info_data.execute_packet_frag = NULL;
1033 seginfo->tc_segment_info_data.last_insn_lsb = NULL;
1034 seginfo->tc_segment_info_data.spmask_addr = NULL;
1035 seginfo->tc_segment_info_data.func_units_used = 0;
1038 /* Handle an alignment directive. Return TRUE if the
1039 machine-independent frag generation should be skipped. */
1042 tic6x_do_align (int n, char *fill, int len ATTRIBUTE_UNUSED, int max)
1044 /* Given code alignments of 4, 8, 16 or 32 bytes, we try to handle
1045 them in the md_end pass by inserting NOPs in parallel with
1046 previous instructions. We only do this in sections containing
1047 nothing but instructions. Code alignments of 1 or 2 bytes have
1048 no effect in such sections (but we record them with
1049 machine-dependent frags anyway so they can be skipped or
1050 converted to machine-independent), while those of more than 64
1051 bytes cannot reliably be handled in this way. */
1057 && subseg_text_p (now_seg))
1065 /* Machine-independent code would generate a frag here, but we
1066 wish to handle it in a machine-dependent way. */
1067 if (frag_now_fix () != 0)
1069 if (frag_now->fr_type != rs_machine_dependent)
1070 frag_wane (frag_now);
1075 align_frag = frag_now;
1076 p = frag_var (rs_machine_dependent, 32, 32, max, NULL, n, NULL);
1077 /* This must be the same as the frag to which a pointer was just
1079 if (p != align_frag->fr_literal)
1081 align_frag->tc_frag_data.is_insns = FALSE;
1088 /* Types of operand for parsing purposes. These are used as bit-masks
1089 to tell tic6x_parse_operand what forms of operand are
1091 #define TIC6X_OP_EXP 0x0001u
1092 #define TIC6X_OP_REG 0x0002u
1093 #define TIC6X_OP_REGPAIR 0x0004u
1094 #define TIC6X_OP_IRP 0x0008u
1095 #define TIC6X_OP_NRP 0x0010u
1096 /* With TIC6X_OP_MEM_NOUNREG, the contents of a () offset are always
1097 interpreted as an expression, which may be a symbol with the same
1098 name as a register that ends up being implicitly DP-relative. With
1099 TIC6X_OP_MEM_UNREG, the contents of a () offset are interpreted as
1100 a register if they match one, and failing that as an expression,
1101 which must be constant. */
1102 #define TIC6X_OP_MEM_NOUNREG 0x0020u
1103 #define TIC6X_OP_MEM_UNREG 0x0040u
1104 #define TIC6X_OP_CTRL 0x0080u
1105 #define TIC6X_OP_FUNC_UNIT 0x0100u
1107 /* A register or register pair read by the assembler. */
1110 /* The side the register is on (1 or 2). */
1112 /* The register number (0 to 31). */
1116 /* Types of modification of a base address. */
1121 tic6x_mem_mod_minus,
1122 tic6x_mem_mod_preinc,
1123 tic6x_mem_mod_predec,
1124 tic6x_mem_mod_postinc,
1125 tic6x_mem_mod_postdec
1128 /* Scaled [] or unscaled () nature of an offset. */
1132 tic6x_offset_scaled,
1133 tic6x_offset_unscaled
1134 } tic6x_mem_scaling;
1136 /* A memory operand read by the assembler. */
1139 /* The base register. */
1140 tic6x_register base_reg;
1141 /* How the base register is modified. */
1143 /* Whether there is an offset (required with plain "+" and "-"), and
1144 whether it is scaled or unscaled if so. */
1145 tic6x_mem_scaling scaled;
1146 /* Whether the offset is a register (TRUE) or an expression
1148 bfd_boolean offset_is_reg;
1157 /* A functional unit in SPMASK operands read by the assembler. */
1160 /* The basic unit. */
1161 tic6x_func_unit_base base;
1162 /* The side (1 or 2). */
1164 } tic6x_func_unit_operand;
1166 /* An operand read by the assembler. */
1169 /* The syntactic form of the operand, as one of the bit-masks
1172 /* The operand value. */
1175 /* An expression: TIC6X_OP_EXP. */
1177 /* A register: TIC6X_OP_REG, TIC6X_OP_REGPAIR. */
1179 /* A memory reference: TIC6X_OP_MEM_NOUNREG,
1180 TIC6X_OP_MEM_UNREG. */
1182 /* A control register: TIC6X_OP_CTRL. */
1184 /* A functional unit: TIC6X_OP_FUNC_UNIT. */
1185 tic6x_func_unit_operand func_unit;
1189 #define skip_whitespace(str) do { if (*(str) == ' ') ++(str); } while (0)
1191 /* Parse a register operand, or part of an operand, starting at *P.
1192 If syntactically OK (including that the number is in the range 0 to
1193 31, but not necessarily in range for this architecture), return
1194 TRUE, putting the register side and number in *REG and update *P to
1195 point immediately after the register number; otherwise return FALSE
1196 without changing *P (but possibly changing *REG). Do not print any
1200 tic6x_parse_register (char **p, tic6x_register *reg)
1221 if (*r >= '0' && *r <= '9')
1223 reg->num = *r - '0';
1229 if (reg->num > 0 && *r >= '0' && *r <= '9')
1231 reg->num = reg->num * 10 + (*r - '0');
1235 if (*r >= '0' && *r <= '9')
1244 /* Parse the initial two characters of a functional unit name starting
1245 at *P. If OK, set *BASE and *SIDE and return TRUE; otherwise,
1249 tic6x_parse_func_unit_base (char *p, tic6x_func_unit_base *base,
1252 bfd_boolean good_func_unit = TRUE;
1253 tic6x_func_unit_base maybe_base = tic6x_func_unit_nfu;
1254 unsigned int maybe_side = 0;
1260 maybe_base = tic6x_func_unit_d;
1265 maybe_base = tic6x_func_unit_l;
1270 maybe_base = tic6x_func_unit_m;
1275 maybe_base = tic6x_func_unit_s;
1279 good_func_unit = FALSE;
1295 good_func_unit = FALSE;
1305 return good_func_unit;
1308 /* Parse an operand starting at *P. If the operand parses OK, return
1309 TRUE and store the value in *OP; otherwise return FALSE (possibly
1310 changing *OP). In any case, update *P to point to the following
1311 comma or end of line. The possible operand forms are given by
1312 OP_FORMS. For diagnostics, this is operand OPNO of an opcode
1313 starting at STR, length OPC_LEN. */
1316 tic6x_parse_operand (char **p, tic6x_operand *op, unsigned int op_forms,
1317 char *str, int opc_len, unsigned int opno)
1319 bfd_boolean operand_parsed = FALSE;
1322 if ((op_forms & (TIC6X_OP_MEM_NOUNREG | TIC6X_OP_MEM_UNREG))
1323 == (TIC6X_OP_MEM_NOUNREG | TIC6X_OP_MEM_UNREG))
1326 /* Check for functional unit names for SPMASK and SPMASKR. */
1327 if (!operand_parsed && (op_forms & TIC6X_OP_FUNC_UNIT))
1329 tic6x_func_unit_base base = tic6x_func_unit_nfu;
1330 unsigned int side = 0;
1332 if (tic6x_parse_func_unit_base (q, &base, &side))
1336 skip_whitespace (rq);
1337 if (is_end_of_line[(unsigned char) *rq] || *rq == ',')
1339 op->form = TIC6X_OP_FUNC_UNIT;
1340 op->value.func_unit.base = base;
1341 op->value.func_unit.side = side;
1342 operand_parsed = TRUE;
1348 /* Check for literal "irp". */
1349 if (!operand_parsed && (op_forms & TIC6X_OP_IRP))
1351 if ((q[0] == 'i' || q[0] == 'I')
1352 && (q[1] == 'r' || q[1] == 'R')
1353 && (q[2] == 'p' || q[2] == 'P'))
1357 skip_whitespace (rq);
1358 if (is_end_of_line[(unsigned char) *rq] || *rq == ',')
1360 op->form = TIC6X_OP_IRP;
1361 operand_parsed = TRUE;
1367 /* Check for literal "nrp". */
1368 if (!operand_parsed && (op_forms & TIC6X_OP_NRP))
1370 if ((q[0] == 'n' || q[0] == 'N')
1371 && (q[1] == 'r' || q[1] == 'R')
1372 && (q[2] == 'p' || q[2] == 'P'))
1376 skip_whitespace (rq);
1377 if (is_end_of_line[(unsigned char) *rq] || *rq == ',')
1379 op->form = TIC6X_OP_NRP;
1380 operand_parsed = TRUE;
1386 /* Check for control register names. */
1387 if (!operand_parsed && (op_forms & TIC6X_OP_CTRL))
1391 for (crid = 0; crid < tic6x_ctrl_max; crid++)
1393 size_t len = strlen (tic6x_ctrl_table[crid].name);
1395 if (strncasecmp (tic6x_ctrl_table[crid].name, q, len) == 0)
1399 skip_whitespace (rq);
1400 if (is_end_of_line[(unsigned char) *rq] || *rq == ',')
1402 op->form = TIC6X_OP_CTRL;
1403 op->value.ctrl = crid;
1404 operand_parsed = TRUE;
1406 if (!(tic6x_ctrl_table[crid].isa_variants & tic6x_features))
1407 as_bad (_("control register '%s' not supported "
1408 "on this architecture"),
1409 tic6x_ctrl_table[crid].name);
1415 /* See if this looks like a memory reference. */
1417 && (op_forms & (TIC6X_OP_MEM_NOUNREG | TIC6X_OP_MEM_UNREG)))
1419 bfd_boolean mem_ok = TRUE;
1421 tic6x_mem_mod mem_mod = tic6x_mem_mod_none;
1422 tic6x_register base_reg;
1423 bfd_boolean require_offset, permit_offset;
1424 tic6x_mem_scaling scaled;
1425 bfd_boolean offset_is_reg;
1426 expressionS offset_exp;
1427 tic6x_register offset_reg;
1436 skip_whitespace (mq);
1442 mem_mod = tic6x_mem_mod_preinc;
1447 mem_mod = tic6x_mem_mod_plus;
1455 mem_mod = tic6x_mem_mod_predec;
1460 mem_mod = tic6x_mem_mod_minus;
1472 skip_whitespace (mq);
1473 mem_ok = tic6x_parse_register (&mq, &base_reg);
1476 if (mem_ok && mem_mod == tic6x_mem_mod_none)
1478 skip_whitespace (mq);
1479 if (mq[0] == '+' && mq[1] == '+')
1481 mem_mod = tic6x_mem_mod_postinc;
1484 else if (mq[0] == '-' && mq[1] == '-')
1486 mem_mod = tic6x_mem_mod_postdec;
1491 if (mem_mod == tic6x_mem_mod_none)
1492 permit_offset = FALSE;
1494 permit_offset = TRUE;
1495 if (mem_mod == tic6x_mem_mod_plus || mem_mod == tic6x_mem_mod_minus)
1496 require_offset = TRUE;
1498 require_offset = FALSE;
1499 scaled = tic6x_offset_none;
1500 offset_is_reg = FALSE;
1502 if (mem_ok && permit_offset)
1506 skip_whitespace (mq);
1510 scaled = tic6x_offset_scaled;
1516 scaled = tic6x_offset_unscaled;
1524 if (scaled != tic6x_offset_none)
1526 skip_whitespace (mq);
1527 if (scaled == tic6x_offset_scaled
1528 || (op_forms & TIC6X_OP_MEM_UNREG))
1533 reg_ok = tic6x_parse_register (&rq, &offset_reg);
1536 skip_whitespace (rq);
1540 offset_is_reg = TRUE;
1546 char *save_input_line_pointer;
1548 save_input_line_pointer = input_line_pointer;
1549 input_line_pointer = mq;
1550 expression (&offset_exp);
1551 mq = input_line_pointer;
1552 input_line_pointer = save_input_line_pointer;
1554 skip_whitespace (mq);
1562 if (mem_ok && require_offset && scaled == tic6x_offset_none)
1567 skip_whitespace (mq);
1568 if (!is_end_of_line[(unsigned char) *mq] && *mq != ',')
1574 op->form = op_forms & (TIC6X_OP_MEM_NOUNREG | TIC6X_OP_MEM_UNREG);
1575 op->value.mem.base_reg = base_reg;
1576 op->value.mem.mod = mem_mod;
1577 op->value.mem.scaled = scaled;
1578 op->value.mem.offset_is_reg = offset_is_reg;
1580 op->value.mem.offset.reg = offset_reg;
1582 op->value.mem.offset.exp = offset_exp;
1583 operand_parsed = TRUE;
1585 if (base_reg.num >= tic6x_num_registers)
1586 as_bad (_("register number %u not supported on this architecture"),
1588 if (offset_is_reg && offset_reg.num >= tic6x_num_registers)
1589 as_bad (_("register number %u not supported on this architecture"),
1594 /* See if this looks like a register or register pair. */
1595 if (!operand_parsed && (op_forms & (TIC6X_OP_REG | TIC6X_OP_REGPAIR)))
1597 tic6x_register first_reg, second_reg;
1601 reg_ok = tic6x_parse_register (&rq, &first_reg);
1605 if (*rq == ':' && (op_forms & TIC6X_OP_REGPAIR))
1608 reg_ok = tic6x_parse_register (&rq, &second_reg);
1611 skip_whitespace (rq);
1612 if (is_end_of_line[(unsigned char) *rq] || *rq == ',')
1614 if ((second_reg.num & 1)
1615 || (first_reg.num != second_reg.num + 1)
1616 || (first_reg.side != second_reg.side))
1617 as_bad (_("register pair for operand %u of '%.*s'"
1618 " not a valid even/odd pair"), opno,
1620 op->form = TIC6X_OP_REGPAIR;
1621 op->value.reg = second_reg;
1622 operand_parsed = TRUE;
1627 else if (op_forms & TIC6X_OP_REG)
1629 skip_whitespace (rq);
1630 if (is_end_of_line[(unsigned char) *rq] || *rq == ',')
1632 op->form = TIC6X_OP_REG;
1633 op->value.reg = first_reg;
1634 operand_parsed = TRUE;
1641 if (first_reg.num >= tic6x_num_registers)
1642 as_bad (_("register number %u not supported on this architecture"),
1644 if (op->form == TIC6X_OP_REGPAIR
1645 && second_reg.num >= tic6x_num_registers)
1646 as_bad (_("register number %u not supported on this architecture"),
1651 /* Otherwise, parse it as an expression. */
1652 if (!operand_parsed && (op_forms & TIC6X_OP_EXP))
1654 char *save_input_line_pointer;
1656 save_input_line_pointer = input_line_pointer;
1657 input_line_pointer = q;
1658 op->form = TIC6X_OP_EXP;
1659 expression (&op->value.exp);
1660 q = input_line_pointer;
1661 input_line_pointer = save_input_line_pointer;
1662 operand_parsed = TRUE;
1667 /* Now the operand has been parsed, there must be nothing more
1668 before the comma or end of line. */
1669 skip_whitespace (q);
1670 if (!is_end_of_line[(unsigned char) *q] && *q != ',')
1672 operand_parsed = FALSE;
1673 as_bad (_("junk after operand %u of '%.*s'"), opno,
1675 while (!is_end_of_line[(unsigned char) *q] && *q != ',')
1681 /* This could not be parsed as any acceptable form of
1685 case TIC6X_OP_REG | TIC6X_OP_REGPAIR:
1686 as_bad (_("bad register or register pair for operand %u of '%.*s'"),
1687 opno, opc_len, str);
1690 case TIC6X_OP_REG | TIC6X_OP_CTRL:
1692 as_bad (_("bad register for operand %u of '%.*s'"),
1693 opno, opc_len, str);
1696 case TIC6X_OP_REGPAIR:
1697 as_bad (_("bad register pair for operand %u of '%.*s'"),
1698 opno, opc_len, str);
1701 case TIC6X_OP_FUNC_UNIT:
1702 as_bad (_("bad functional unit for operand %u of '%.*s'"),
1703 opno, opc_len, str);
1707 as_bad (_("bad operand %u of '%.*s'"),
1708 opno, opc_len, str);
1712 while (!is_end_of_line[(unsigned char) *q] && *q != ',')
1716 return operand_parsed;
1719 /* Table of assembler operators and associated O_* values. */
1724 } tic6x_operator_table;
1725 static const tic6x_operator_table tic6x_operators[] = {
1726 #define O_dsbt_index O_md1
1727 { "dsbt_index", O_dsbt_index },
1730 #define O_dpr_got O_md3
1731 { "dpr_got", O_dpr_got },
1732 #define O_dpr_byte O_md4
1733 { "dpr_byte", O_dpr_byte },
1734 #define O_dpr_hword O_md5
1735 { "dpr_hword", O_dpr_hword },
1736 #define O_dpr_word O_md6
1737 { "dpr_word", O_dpr_word },
1738 #define O_pcr_offset O_md7
1739 { "pcr_offset", O_pcr_offset }
1742 /* Parse a name in some machine-specific way. Used on C6X to handle
1743 assembler operators. */
1746 tic6x_parse_name (const char *name, expressionS *exprP,
1747 enum expr_mode mode ATTRIBUTE_UNUSED, char *nextchar)
1749 char *p = input_line_pointer;
1750 char c, *name_start, *name_end;
1751 const char *inner_name;
1753 operatorT op = O_illegal;
1754 symbolS *sym, *op_sym = NULL;
1759 for (i = 0; i < ARRAY_SIZE (tic6x_operators); i++)
1760 if (strcasecmp (name + 1, tic6x_operators[i].name) == 0)
1762 op = tic6x_operators[i].op;
1766 if (op == O_illegal)
1769 *input_line_pointer = *nextchar;
1770 skip_whitespace (p);
1774 *input_line_pointer = 0;
1778 skip_whitespace (p);
1780 if (!is_name_beginner (*p))
1782 *input_line_pointer = 0;
1788 while (is_part_of_name (*p))
1791 skip_whitespace (p);
1793 if (op == O_pcr_offset)
1795 char *op_name_start, *op_name_end;
1799 *input_line_pointer = 0;
1803 skip_whitespace (p);
1805 if (!is_name_beginner (*p))
1807 *input_line_pointer = 0;
1813 while (is_part_of_name (*p))
1816 skip_whitespace (p);
1820 op_sym = symbol_find_or_make (op_name_start);
1826 *input_line_pointer = 0;
1830 input_line_pointer = p + 1;
1831 *nextchar = *input_line_pointer;
1832 *input_line_pointer = 0;
1836 inner_name = name_start;
1837 if (op == O_dsbt_index && strcmp (inner_name, "__c6xabi_DSBT_BASE") != 0)
1839 as_bad (_("$DSBT_INDEX must be used with __c6xabi_DSBT_BASE"));
1840 inner_name = "__c6xabi_DSBT_BASE";
1842 sym = symbol_find_or_make (inner_name);
1846 exprP->X_add_symbol = sym;
1847 exprP->X_add_number = 0;
1848 exprP->X_op_symbol = op_sym;
1854 /* Create a fixup for an expression. Same arguments as fix_new_exp,
1855 plus FIX_ADDA which is TRUE for ADDA instructions (to indicate that
1856 fixes resolving to constants should have those constants implicitly
1857 shifted) and FALSE otherwise, but look for C6X-specific expression
1858 types and adjust the relocations or give errors accordingly. */
1861 tic6x_fix_new_exp (fragS *frag, int where, int size, expressionS *exp,
1862 int pcrel, bfd_reloc_code_real_type r_type,
1863 bfd_boolean fix_adda)
1865 bfd_reloc_code_real_type new_reloc = BFD_RELOC_UNUSED;
1866 symbolS *subsy = NULL;
1874 case BFD_RELOC_C6000_SBR_U15_W:
1875 new_reloc = BFD_RELOC_C6000_DSBT_INDEX;
1879 as_bad (_("$DSBT_INDEX not supported in this context"));
1887 case BFD_RELOC_C6000_SBR_U15_W:
1888 new_reloc = BFD_RELOC_C6000_SBR_GOT_U15_W;
1892 as_bad (_("$GOT not supported in this context"));
1900 case BFD_RELOC_C6000_ABS_L16:
1901 new_reloc = BFD_RELOC_C6000_SBR_GOT_L16_W;
1904 case BFD_RELOC_C6000_ABS_H16:
1905 new_reloc = BFD_RELOC_C6000_SBR_GOT_H16_W;
1909 as_bad (_("$DPR_GOT not supported in this context"));
1917 case BFD_RELOC_C6000_ABS_S16:
1918 new_reloc = BFD_RELOC_C6000_SBR_S16;
1921 case BFD_RELOC_C6000_ABS_L16:
1922 new_reloc = BFD_RELOC_C6000_SBR_L16_B;
1925 case BFD_RELOC_C6000_ABS_H16:
1926 new_reloc = BFD_RELOC_C6000_SBR_H16_B;
1930 as_bad (_("$DPR_BYTE not supported in this context"));
1938 case BFD_RELOC_C6000_ABS_L16:
1939 new_reloc = BFD_RELOC_C6000_SBR_L16_H;
1942 case BFD_RELOC_C6000_ABS_H16:
1943 new_reloc = BFD_RELOC_C6000_SBR_H16_H;
1947 as_bad (_("$DPR_HWORD not supported in this context"));
1955 case BFD_RELOC_C6000_ABS_L16:
1956 new_reloc = BFD_RELOC_C6000_SBR_L16_W;
1959 case BFD_RELOC_C6000_ABS_H16:
1960 new_reloc = BFD_RELOC_C6000_SBR_H16_W;
1964 as_bad (_("$DPR_WORD not supported in this context"));
1970 subsy = exp->X_op_symbol;
1973 case BFD_RELOC_C6000_ABS_S16:
1974 case BFD_RELOC_C6000_ABS_L16:
1975 new_reloc = BFD_RELOC_C6000_PCR_L16;
1978 case BFD_RELOC_C6000_ABS_H16:
1979 new_reloc = BFD_RELOC_C6000_PCR_H16;
1983 as_bad (_("$PCR_OFFSET not supported in this context"));
1994 as_bad (_("invalid PC-relative operand"));
2000 if (new_reloc == BFD_RELOC_UNUSED)
2001 fix = fix_new_exp (frag, where, size, exp, pcrel, r_type);
2003 fix = fix_new (frag, where, size, exp->X_add_symbol, exp->X_add_number,
2005 fix->tc_fix_data.fix_subsy = subsy;
2006 fix->tc_fix_data.fix_adda = fix_adda;
2009 /* Generate a fix for a constant (.word etc.). Needed to ensure these
2010 go through the error checking in tic6x_fix_new_exp. */
2013 tic6x_cons_fix_new (fragS *frag, int where, int size, expressionS *exp,
2014 bfd_reloc_code_real_type r_type)
2019 r_type = BFD_RELOC_8;
2023 r_type = BFD_RELOC_16;
2027 r_type = BFD_RELOC_32;
2031 as_bad (_("no %d-byte relocations available"), size);
2035 tic6x_fix_new_exp (frag, where, size, exp, 0, r_type, FALSE);
2038 /* Initialize target-specific fix data. */
2041 tic6x_init_fix_data (fixS *fixP)
2043 fixP->tc_fix_data.fix_adda = FALSE;
2044 fixP->tc_fix_data.fix_subsy = NULL;
2047 /* Return true if the fix can be handled by GAS, false if it must
2048 be passed through to the linker. */
2051 tic6x_fix_adjustable (fixS *fixP)
2053 switch (fixP->fx_r_type)
2055 /* Adjust_reloc_syms doesn't know about the GOT. */
2056 case BFD_RELOC_C6000_SBR_GOT_U15_W:
2057 case BFD_RELOC_C6000_SBR_GOT_H16_W:
2058 case BFD_RELOC_C6000_SBR_GOT_L16_W:
2059 case BFD_RELOC_C6000_EHTYPE:
2062 case BFD_RELOC_C6000_PREL31:
2065 case BFD_RELOC_C6000_PCR_H16:
2066 case BFD_RELOC_C6000_PCR_L16:
2074 /* Given the fine-grained form of an operand, return the coarse
2078 tic6x_coarse_operand_form (tic6x_operand_form form)
2082 case tic6x_operand_asm_const:
2083 case tic6x_operand_link_const:
2084 return TIC6X_OP_EXP;
2086 case tic6x_operand_reg:
2087 case tic6x_operand_xreg:
2088 case tic6x_operand_dreg:
2089 case tic6x_operand_areg:
2090 case tic6x_operand_retreg:
2091 return TIC6X_OP_REG;
2093 case tic6x_operand_regpair:
2094 case tic6x_operand_xregpair:
2095 case tic6x_operand_dregpair:
2096 return TIC6X_OP_REGPAIR;
2098 case tic6x_operand_irp:
2099 return TIC6X_OP_IRP;
2101 case tic6x_operand_nrp:
2102 return TIC6X_OP_NRP;
2104 case tic6x_operand_ctrl:
2105 return TIC6X_OP_CTRL;
2107 case tic6x_operand_mem_short:
2108 case tic6x_operand_mem_long:
2109 case tic6x_operand_mem_deref:
2110 return TIC6X_OP_MEM_NOUNREG;
2112 case tic6x_operand_mem_ndw:
2113 return TIC6X_OP_MEM_UNREG;
2115 case tic6x_operand_func_unit:
2116 return TIC6X_OP_FUNC_UNIT;
2123 /* How an operand may match or not match a desired form. If different
2124 instruction alternatives fail in different ways, the first failure
2125 in this list determines the diagnostic. */
2129 tic6x_match_matches,
2130 /* Bad coarse form. */
2133 tic6x_match_non_const,
2134 /* Register on wrong side. */
2135 tic6x_match_wrong_side,
2136 /* Not a valid address register. */
2137 tic6x_match_bad_address,
2138 /* Not a valid return address register. */
2139 tic6x_match_bad_return,
2140 /* Control register not readable. */
2141 tic6x_match_ctrl_write_only,
2142 /* Control register not writable. */
2143 tic6x_match_ctrl_read_only,
2144 /* Not a valid memory reference for this instruction. */
2146 } tic6x_operand_match;
2148 /* Return whether an operand matches the given fine-grained form and
2149 read/write usage, and, if it does not match, how it fails to match.
2150 The main functional unit side is SIDE; the cross-path side is CROSS
2151 (the same as SIDE if a cross path not used); the data side is
2153 static tic6x_operand_match
2154 tic6x_operand_matches_form (const tic6x_operand *op, tic6x_operand_form form,
2155 tic6x_rw rw, unsigned int side, unsigned int cross,
2156 unsigned int data_side)
2158 unsigned int coarse = tic6x_coarse_operand_form (form);
2160 if (coarse != op->form)
2161 return tic6x_match_coarse;
2165 case tic6x_operand_asm_const:
2166 if (op->value.exp.X_op == O_constant)
2167 return tic6x_match_matches;
2169 return tic6x_match_non_const;
2171 case tic6x_operand_link_const:
2172 case tic6x_operand_irp:
2173 case tic6x_operand_nrp:
2174 case tic6x_operand_func_unit:
2175 /* All expressions are link-time constants, although there may
2176 not be relocations to express them in the output file. "irp"
2177 and "nrp" are unique operand values. All parsed functional
2178 unit names are valid. */
2179 return tic6x_match_matches;
2181 case tic6x_operand_reg:
2182 case tic6x_operand_regpair:
2183 if (op->value.reg.side == side)
2184 return tic6x_match_matches;
2186 return tic6x_match_wrong_side;
2188 case tic6x_operand_xreg:
2189 case tic6x_operand_xregpair:
2190 if (op->value.reg.side == cross)
2191 return tic6x_match_matches;
2193 return tic6x_match_wrong_side;
2195 case tic6x_operand_dreg:
2196 case tic6x_operand_dregpair:
2197 if (op->value.reg.side == data_side)
2198 return tic6x_match_matches;
2200 return tic6x_match_wrong_side;
2202 case tic6x_operand_areg:
2203 if (op->value.reg.side != cross)
2204 return tic6x_match_wrong_side;
2205 else if (op->value.reg.side == 2
2206 && (op->value.reg.num == 14 || op->value.reg.num == 15))
2207 return tic6x_match_matches;
2209 return tic6x_match_bad_address;
2211 case tic6x_operand_retreg:
2212 if (op->value.reg.side != side)
2213 return tic6x_match_wrong_side;
2214 else if (op->value.reg.num != 3)
2215 return tic6x_match_bad_return;
2217 return tic6x_match_matches;
2219 case tic6x_operand_ctrl:
2223 if (tic6x_ctrl_table[op->value.ctrl].rw == tic6x_rw_read
2224 || tic6x_ctrl_table[op->value.ctrl].rw == tic6x_rw_read_write)
2225 return tic6x_match_matches;
2227 return tic6x_match_ctrl_write_only;
2229 case tic6x_rw_write:
2230 if (tic6x_ctrl_table[op->value.ctrl].rw == tic6x_rw_write
2231 || tic6x_ctrl_table[op->value.ctrl].rw == tic6x_rw_read_write)
2232 return tic6x_match_matches;
2234 return tic6x_match_ctrl_read_only;
2240 case tic6x_operand_mem_deref:
2241 if (op->value.mem.mod != tic6x_mem_mod_none)
2242 return tic6x_match_bad_mem;
2243 else if (op->value.mem.scaled != tic6x_offset_none)
2245 else if (op->value.mem.base_reg.side != side)
2246 return tic6x_match_bad_mem;
2248 return tic6x_match_matches;
2250 case tic6x_operand_mem_short:
2251 case tic6x_operand_mem_ndw:
2252 if (op->value.mem.base_reg.side != side)
2253 return tic6x_match_bad_mem;
2254 if (op->value.mem.mod == tic6x_mem_mod_none)
2256 if (op->value.mem.scaled != tic6x_offset_none)
2258 return tic6x_match_matches;
2260 if (op->value.mem.scaled == tic6x_offset_none)
2262 if (op->value.mem.mod == tic6x_mem_mod_plus
2263 || op->value.mem.mod == tic6x_mem_mod_minus)
2265 return tic6x_match_matches;
2267 if (op->value.mem.offset_is_reg)
2269 if (op->value.mem.scaled == tic6x_offset_unscaled
2270 && form != tic6x_operand_mem_ndw)
2272 if (op->value.mem.offset.reg.side == side)
2273 return tic6x_match_matches;
2275 return tic6x_match_bad_mem;
2279 if (op->value.mem.offset.exp.X_op == O_constant)
2280 return tic6x_match_matches;
2282 return tic6x_match_bad_mem;
2285 case tic6x_operand_mem_long:
2286 if (op->value.mem.base_reg.side == 2
2287 && (op->value.mem.base_reg.num == 14
2288 || op->value.mem.base_reg.num == 15))
2290 switch (op->value.mem.mod)
2292 case tic6x_mem_mod_none:
2293 if (op->value.mem.scaled != tic6x_offset_none)
2295 return tic6x_match_matches;
2297 case tic6x_mem_mod_plus:
2298 if (op->value.mem.scaled == tic6x_offset_none)
2300 if (op->value.mem.offset_is_reg)
2301 return tic6x_match_bad_mem;
2302 else if (op->value.mem.scaled == tic6x_offset_scaled
2303 && op->value.mem.offset.exp.X_op != O_constant)
2304 return tic6x_match_bad_mem;
2306 return tic6x_match_matches;
2308 case tic6x_mem_mod_minus:
2309 case tic6x_mem_mod_preinc:
2310 case tic6x_mem_mod_predec:
2311 case tic6x_mem_mod_postinc:
2312 case tic6x_mem_mod_postdec:
2313 return tic6x_match_bad_mem;
2321 return tic6x_match_bad_mem;
2328 /* Return the number of bits shift used with DP-relative coding method
2332 tic6x_dpr_shift (tic6x_coding_method coding)
2336 case tic6x_coding_ulcst_dpr_byte:
2339 case tic6x_coding_ulcst_dpr_half:
2342 case tic6x_coding_ulcst_dpr_word:
2350 /* Return the relocation used with DP-relative coding method
2353 static bfd_reloc_code_real_type
2354 tic6x_dpr_reloc (tic6x_coding_method coding)
2358 case tic6x_coding_ulcst_dpr_byte:
2359 return BFD_RELOC_C6000_SBR_U15_B;
2361 case tic6x_coding_ulcst_dpr_half:
2362 return BFD_RELOC_C6000_SBR_U15_H;
2364 case tic6x_coding_ulcst_dpr_word:
2365 return BFD_RELOC_C6000_SBR_U15_W;
2372 /* Given a memory reference *MEM_REF as originally parsed, fill in
2373 defaults for missing offsets. */
2376 tic6x_default_mem_ref (tic6x_mem_ref *mem_ref)
2378 switch (mem_ref->mod)
2380 case tic6x_mem_mod_none:
2381 if (mem_ref->scaled != tic6x_offset_none)
2383 mem_ref->mod = tic6x_mem_mod_plus;
2384 mem_ref->scaled = tic6x_offset_unscaled;
2385 mem_ref->offset_is_reg = FALSE;
2386 memset (&mem_ref->offset.exp, 0, sizeof mem_ref->offset.exp);
2387 mem_ref->offset.exp.X_op = O_constant;
2388 mem_ref->offset.exp.X_add_number = 0;
2389 mem_ref->offset.exp.X_unsigned = 0;
2392 case tic6x_mem_mod_plus:
2393 case tic6x_mem_mod_minus:
2394 if (mem_ref->scaled == tic6x_offset_none)
2398 case tic6x_mem_mod_preinc:
2399 case tic6x_mem_mod_predec:
2400 case tic6x_mem_mod_postinc:
2401 case tic6x_mem_mod_postdec:
2402 if (mem_ref->scaled != tic6x_offset_none)
2404 mem_ref->scaled = tic6x_offset_scaled;
2405 mem_ref->offset_is_reg = FALSE;
2406 memset (&mem_ref->offset.exp, 0, sizeof mem_ref->offset.exp);
2407 mem_ref->offset.exp.X_op = O_constant;
2408 mem_ref->offset.exp.X_add_number = 1;
2409 mem_ref->offset.exp.X_unsigned = 0;
2417 /* Return the encoding in the 8-bit field of an SPMASK or SPMASKR
2418 instruction of the specified UNIT, side SIDE. */
2421 tic6x_encode_spmask (tic6x_func_unit_base unit, unsigned int side)
2425 case tic6x_func_unit_l:
2426 return 1 << (side - 1);
2428 case tic6x_func_unit_s:
2429 return 1 << (side + 1);
2431 case tic6x_func_unit_d:
2432 return 1 << (side + 3);
2434 case tic6x_func_unit_m:
2435 return 1 << (side + 5);
2442 /* Try to encode the instruction with opcode number ID and operands
2443 OPERANDS (number NUM_OPERANDS), creg value THIS_LINE_CREG and z
2444 value THIS_LINE_Z; FUNC_UNIT_SIDE, FUNC_UNIT_CROSS and
2445 FUNC_UNIT_DATA_SIDE describe the functional unit specification;
2446 SPLOOP_II is the ii value from the previous SPLOOP-family
2447 instruction, or 0 if not in such a loop; the only possible problems
2448 are operands being out of range (they already match the
2449 fine-grained form), and inappropriate predication. If this
2450 succeeds, return the encoding and set *OK to TRUE; otherwise return
2451 0 and set *OK to FALSE. If a fix is needed, set *FIX_NEEDED to
2452 true and fill in *FIX_EXP, *FIX_PCREL, *FX_R_TYPE and *FIX_ADDA.
2453 Print error messages for failure if PRINT_ERRORS is TRUE; the
2454 opcode starts at STR and has length OPC_LEN. */
2457 tic6x_try_encode (tic6x_opcode_id id, tic6x_operand *operands,
2458 unsigned int num_operands, unsigned int this_line_creg,
2459 unsigned int this_line_z, unsigned int func_unit_side,
2460 unsigned int func_unit_cross,
2461 unsigned int func_unit_data_side, int sploop_ii,
2462 expressionS **fix_exp, int *fix_pcrel,
2463 bfd_reloc_code_real_type *fx_r_type, bfd_boolean *fix_adda,
2464 bfd_boolean *fix_needed, bfd_boolean *ok,
2465 bfd_boolean print_errors, char *str, int opc_len)
2467 const tic6x_opcode *opct;
2468 const tic6x_insn_format *fmt;
2469 unsigned int opcode_value;
2472 opct = &tic6x_opcode_table[id];
2473 fmt = &tic6x_insn_format_table[opct->format];
2474 opcode_value = fmt->cst_bits;
2476 for (fld = 0; fld < opct->num_fixed_fields; fld++)
2478 if (opct->fixed_fields[fld].min_val == opct->fixed_fields[fld].max_val)
2480 const tic6x_insn_field *fldd;
2481 fldd = tic6x_field_from_fmt (fmt, opct->fixed_fields[fld].field_id);
2484 opcode_value |= opct->fixed_fields[fld].min_val << fldd->bitfields[0].low_pos;
2488 for (fld = 0; fld < opct->num_variable_fields; fld++)
2490 const tic6x_insn_field *fldd;
2496 unsigned int fcyc_bits;
2501 fldd = tic6x_field_from_fmt (fmt, opct->variable_fields[fld].field_id);
2504 opno = opct->variable_fields[fld].operand_num;
2505 switch (opct->variable_fields[fld].coding_method)
2507 case tic6x_coding_ucst:
2508 if (operands[opno].form != TIC6X_OP_EXP)
2510 if (operands[opno].value.exp.X_op != O_constant)
2512 ucexp = operands[opno].value.exp;
2514 if (ucexp.X_add_number < 0
2515 || ucexp.X_add_number >= (1 << fldd->bitfields[0].width))
2518 as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
2523 value = ucexp.X_add_number;
2526 case tic6x_coding_scst:
2527 if (operands[opno].form != TIC6X_OP_EXP)
2529 if (operands[opno].value.exp.X_op != O_constant)
2532 /* Opcode table should not permit non-constants without
2533 a known relocation for them. */
2534 if (fldd->bitfields[0].low_pos != 7 || fldd->bitfields[0].width != 16)
2537 *fix_exp = &operands[opno].value.exp;
2539 *fx_r_type = BFD_RELOC_C6000_ABS_S16;
2543 sign_value = SEXT (operands[opno].value.exp.X_add_number);
2545 if (sign_value < -(1 << (fldd->bitfields[0].width - 1))
2546 || (sign_value >= (1 << (fldd->bitfields[0].width - 1))))
2549 as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
2554 value = sign_value + (1 << (fldd->bitfields[0].width - 1));
2555 value ^= (1 << (fldd->bitfields[0].width - 1));
2558 case tic6x_coding_ucst_minus_one:
2559 if (operands[opno].form != TIC6X_OP_EXP)
2561 if (operands[opno].value.exp.X_op != O_constant)
2563 if (operands[opno].value.exp.X_add_number <= 0
2564 || operands[opno].value.exp.X_add_number > (1 << fldd->bitfields[0].width))
2567 as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
2572 value = operands[opno].value.exp.X_add_number - 1;
2575 case tic6x_coding_scst_negate:
2576 if (operands[opno].form != TIC6X_OP_EXP)
2578 if (operands[opno].value.exp.X_op != O_constant)
2580 sign_value = SEXT (-operands[opno].value.exp.X_add_number);
2581 goto signed_constant;
2583 case tic6x_coding_ulcst_dpr_byte:
2584 case tic6x_coding_ulcst_dpr_half:
2585 case tic6x_coding_ulcst_dpr_word:
2586 bits = tic6x_dpr_shift (opct->variable_fields[fld].coding_method);
2587 switch (operands[opno].form)
2590 if (operands[opno].value.exp.X_op == O_constant)
2592 ucexp = operands[opno].value.exp;
2593 goto unsigned_constant;
2595 expp = &operands[opno].value.exp;
2598 case TIC6X_OP_MEM_NOUNREG:
2599 mem = operands[opno].value.mem;
2600 tic6x_default_mem_ref (&mem);
2601 if (mem.offset_is_reg)
2603 if (mem.offset.exp.X_op == O_constant)
2605 ucexp = mem.offset.exp;
2606 if (mem.scaled == tic6x_offset_unscaled)
2608 if (ucexp.X_add_number & ((1 << bits) - 1))
2611 as_bad (_("offset in operand %u of '%.*s' not "
2612 "divisible by %u"), opno + 1, opc_len,
2617 ucexp.X_add_number >>= bits;
2619 goto unsigned_constant;
2621 if (mem.scaled != tic6x_offset_unscaled)
2623 if (operands[opno].value.mem.mod == tic6x_mem_mod_none
2624 || operands[opno].value.mem.scaled != tic6x_offset_unscaled
2625 || operands[opno].value.mem.offset_is_reg)
2627 expp = &operands[opno].value.mem.offset.exp;
2634 /* Opcode table should not use this encoding without a known
2636 if (fldd->bitfields[0].low_pos != 8 || fldd->bitfields[0].width != 15)
2638 /* We do not check for offset divisibility here; such a
2639 check is not needed at this point to encode the value,
2640 and if there is eventually a problem it will be detected
2641 either in md_apply_fix or at link time. */
2646 = tic6x_dpr_reloc (opct->variable_fields[fld].coding_method);
2647 if (operands[opno].form == TIC6X_OP_EXP)
2653 case tic6x_coding_lcst_low16:
2654 if (operands[opno].form != TIC6X_OP_EXP)
2656 if (operands[opno].value.exp.X_op == O_constant)
2657 value = operands[opno].value.exp.X_add_number & 0xffff;
2661 /* Opcode table should not use this encoding without a
2662 known relocation. */
2663 if (fldd->bitfields[0].low_pos != 7 || fldd->bitfields[0].width != 16)
2666 *fix_exp = &operands[opno].value.exp;
2668 *fx_r_type = BFD_RELOC_C6000_ABS_L16;
2673 case tic6x_coding_lcst_high16:
2674 if (operands[opno].form != TIC6X_OP_EXP)
2676 if (operands[opno].value.exp.X_op == O_constant)
2677 value = (operands[opno].value.exp.X_add_number >> 16) & 0xffff;
2681 /* Opcode table should not use this encoding without a
2682 known relocation. */
2683 if (fldd->bitfields[0].low_pos != 7 || fldd->bitfields[0].width != 16)
2686 *fix_exp = &operands[opno].value.exp;
2688 *fx_r_type = BFD_RELOC_C6000_ABS_H16;
2693 case tic6x_coding_pcrel:
2694 case tic6x_coding_pcrel_half:
2695 if (operands[opno].form != TIC6X_OP_EXP)
2699 *fix_exp = &operands[opno].value.exp;
2701 if (fldd->bitfields[0].low_pos == 7 && fldd->bitfields[0].width == 21)
2702 *fx_r_type = BFD_RELOC_C6000_PCR_S21;
2703 else if (fldd->bitfields[0].low_pos == 16 && fldd->bitfields[0].width == 12)
2704 *fx_r_type = BFD_RELOC_C6000_PCR_S12;
2705 else if (fldd->bitfields[0].low_pos == 13 && fldd->bitfields[0].width == 10)
2706 *fx_r_type = BFD_RELOC_C6000_PCR_S10;
2707 else if (fldd->bitfields[0].low_pos == 16 && fldd->bitfields[0].width == 7)
2708 *fx_r_type = BFD_RELOC_C6000_PCR_S7;
2710 /* Opcode table should not use this encoding without a
2711 known relocation. */
2716 case tic6x_coding_regpair_lsb:
2717 switch (operands[opno].form)
2719 case TIC6X_OP_REGPAIR:
2720 value = operands[opno].value.reg.num;
2728 case tic6x_coding_regpair_msb:
2729 switch (operands[opno].form)
2731 case TIC6X_OP_REGPAIR:
2732 value = operands[opno].value.reg.num + 1;
2740 case tic6x_coding_reg:
2741 switch (operands[opno].form)
2744 case TIC6X_OP_REGPAIR:
2745 value = operands[opno].value.reg.num;
2748 case TIC6X_OP_MEM_NOUNREG:
2749 case TIC6X_OP_MEM_UNREG:
2750 value = operands[opno].value.mem.base_reg.num;
2758 case tic6x_coding_areg:
2759 switch (operands[opno].form)
2762 value = (operands[opno].value.reg.num == 15 ? 1 : 0);
2765 case TIC6X_OP_MEM_NOUNREG:
2766 value = (operands[opno].value.mem.base_reg.num == 15 ? 1 : 0);
2774 case tic6x_coding_crlo:
2775 if (operands[opno].form != TIC6X_OP_CTRL)
2777 value = tic6x_ctrl_table[operands[opno].value.ctrl].crlo;
2780 case tic6x_coding_crhi:
2781 if (operands[opno].form != TIC6X_OP_CTRL)
2786 case tic6x_coding_reg_shift:
2787 if (operands[opno].form != TIC6X_OP_REGPAIR)
2789 value = operands[opno].value.reg.num >> 1;
2792 case tic6x_coding_mem_offset:
2793 if (operands[opno].form != TIC6X_OP_MEM_NOUNREG)
2795 mem = operands[opno].value.mem;
2796 tic6x_default_mem_ref (&mem);
2797 if (mem.offset_is_reg)
2799 if (mem.scaled != tic6x_offset_scaled)
2801 value = mem.offset.reg.num;
2807 if (mem.offset.exp.X_op != O_constant)
2811 case tic6x_offset_scaled:
2815 case tic6x_offset_unscaled:
2816 scale = opct->operand_info[opno].size;
2817 if (scale != 1 && scale != 2 && scale != 4 && scale != 8)
2824 if (mem.offset.exp.X_add_number < 0
2825 || mem.offset.exp.X_add_number >= (1 << fldd->bitfields[0].width) * scale)
2828 as_bad (_("offset in operand %u of '%.*s' out of range"),
2829 opno + 1, opc_len, str);
2833 if (mem.offset.exp.X_add_number % scale)
2836 as_bad (_("offset in operand %u of '%.*s' not "
2838 opno + 1, opc_len, str, scale);
2842 value = mem.offset.exp.X_add_number / scale;
2846 case tic6x_coding_mem_offset_noscale:
2847 if (operands[opno].form != TIC6X_OP_MEM_UNREG)
2849 mem = operands[opno].value.mem;
2850 tic6x_default_mem_ref (&mem);
2851 if (mem.offset_is_reg)
2852 value = mem.offset.reg.num;
2855 if (mem.offset.exp.X_op != O_constant)
2857 if (mem.offset.exp.X_add_number < 0
2858 || mem.offset.exp.X_add_number >= (1 << fldd->bitfields[0].width))
2861 as_bad (_("offset in operand %u of '%.*s' out of range"),
2862 opno + 1, opc_len, str);
2866 value = mem.offset.exp.X_add_number;
2870 case tic6x_coding_mem_mode:
2871 if (operands[opno].form != TIC6X_OP_MEM_NOUNREG
2872 && operands[opno].form != TIC6X_OP_MEM_UNREG)
2874 mem = operands[opno].value.mem;
2875 tic6x_default_mem_ref (&mem);
2878 case tic6x_mem_mod_plus:
2882 case tic6x_mem_mod_minus:
2886 case tic6x_mem_mod_preinc:
2890 case tic6x_mem_mod_predec:
2894 case tic6x_mem_mod_postinc:
2898 case tic6x_mem_mod_postdec:
2905 value += (mem.offset_is_reg ? 4 : 0);
2908 case tic6x_coding_scaled:
2909 if (operands[opno].form != TIC6X_OP_MEM_UNREG)
2911 mem = operands[opno].value.mem;
2912 tic6x_default_mem_ref (&mem);
2915 case tic6x_offset_unscaled:
2919 case tic6x_offset_scaled:
2928 case tic6x_coding_spmask:
2929 /* The position of such a field is hardcoded in the handling
2931 if (fldd->bitfields[0].low_pos != 18)
2934 for (opno = 0; opno < num_operands; opno++)
2938 v = tic6x_encode_spmask (operands[opno].value.func_unit.base,
2939 operands[opno].value.func_unit.side);
2943 as_bad (_("functional unit already masked for operand "
2944 "%u of '%.*s'"), opno + 1, opc_len, str);
2952 case tic6x_coding_reg_unused:
2953 /* This is a placeholder; correct handling goes along with
2954 resource constraint checks. */
2958 case tic6x_coding_fstg:
2959 case tic6x_coding_fcyc:
2960 if (operands[opno].form != TIC6X_OP_EXP)
2962 if (operands[opno].value.exp.X_op != O_constant)
2967 as_bad (_("'%.*s' instruction not in a software "
2976 else if (sploop_ii <= 2)
2978 else if (sploop_ii <= 4)
2980 else if (sploop_ii <= 8)
2982 else if (sploop_ii <= 14)
2986 if (fcyc_bits > fldd->bitfields[0].width)
2989 if (opct->variable_fields[fld].coding_method == tic6x_coding_fstg)
2992 if (operands[opno].value.exp.X_add_number < 0
2993 || (operands[opno].value.exp.X_add_number
2994 >= (1 << (fldd->bitfields[0].width - fcyc_bits))))
2997 as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
3002 value = operands[opno].value.exp.X_add_number;
3003 for (t = 0, i = fcyc_bits; i < fldd->bitfields[0].width; i++)
3005 t = (t << 1) | (value & 1);
3008 value = t << fcyc_bits;
3012 if (operands[opno].value.exp.X_add_number < 0
3013 || (operands[opno].value.exp.X_add_number >= sploop_ii))
3016 as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
3021 value = operands[opno].value.exp.X_add_number;
3025 case tic6x_coding_fu:
3026 value = func_unit_side == 2 ? 1 : 0;
3029 case tic6x_coding_data_fu:
3030 value = func_unit_data_side == 2 ? 1 : 0;
3033 case tic6x_coding_xpath:
3034 value = func_unit_cross;
3041 for (ffld = 0; ffld < opct->num_fixed_fields; ffld++)
3042 if ((opct->fixed_fields[ffld].field_id
3043 == opct->variable_fields[fld].field_id)
3044 && (value < opct->fixed_fields[ffld].min_val
3045 || value > opct->fixed_fields[ffld].max_val))
3048 as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
3054 opcode_value |= value << fldd->bitfields[0].low_pos;
3059 const tic6x_insn_field *creg;
3060 const tic6x_insn_field *z;
3062 creg = tic6x_field_from_fmt (fmt, tic6x_field_creg);
3066 as_bad (_("instruction '%.*s' cannot be predicated"),
3071 z = tic6x_field_from_fmt (fmt, tic6x_field_z);
3072 /* If there is a creg field, there must be a z field; otherwise
3073 there is an error in the format table. */
3077 opcode_value |= this_line_creg << creg->bitfields[0].low_pos;
3078 opcode_value |= this_line_z << z->bitfields[0].low_pos;
3082 return opcode_value;
3085 /* Convert the target integer stored in N bytes in BUF to a host
3086 integer, returning that value. */
3089 md_chars_to_number (char *buf, int n)
3092 unsigned char *p = (unsigned char *) buf;
3094 if (target_big_endian)
3099 result |= (*p++ & 0xff);
3107 result |= (p[n] & 0xff);
3114 /* Assemble the instruction starting at STR (an opcode, with the
3115 opcode name all-lowercase). */
3118 md_assemble (char *str)
3122 bfd_boolean this_line_parallel;
3123 bfd_boolean this_line_spmask;
3124 unsigned int this_line_creg;
3125 unsigned int this_line_z;
3126 tic6x_label_list *this_insn_label_list;
3127 segment_info_type *seginfo;
3128 tic6x_opcode_list *opc_list, *opc;
3129 tic6x_func_unit_base func_unit_base = tic6x_func_unit_nfu;
3130 unsigned int func_unit_side = 0;
3131 unsigned int func_unit_cross = 0;
3132 unsigned int cross_side = 0;
3133 unsigned int func_unit_data_side = 0;
3134 unsigned int max_matching_opcodes, num_matching_opcodes;
3135 tic6x_opcode_id *opcm = NULL;
3136 unsigned int opc_rank[TIC6X_NUM_PREFER];
3137 const tic6x_opcode *opct = NULL;
3138 int min_rank, try_rank, max_rank;
3139 bfd_boolean num_operands_permitted[TIC6X_MAX_SOURCE_OPERANDS + 1]
3141 unsigned int operand_forms[TIC6X_MAX_SOURCE_OPERANDS] = { 0 };
3142 tic6x_operand operands[TIC6X_MAX_SOURCE_OPERANDS];
3143 unsigned int max_num_operands;
3144 unsigned int num_operands_read;
3145 bfd_boolean ok_this_arch, ok_this_fu, ok_this_arch_fu;
3146 bfd_boolean bad_operands = FALSE;
3147 unsigned int opcode_value;
3148 bfd_boolean encoded_ok;
3149 bfd_boolean fix_needed = FALSE;
3150 expressionS *fix_exp = NULL;
3152 bfd_reloc_code_real_type fx_r_type = BFD_RELOC_UNUSED;
3153 bfd_boolean fix_adda = FALSE;
3158 while (*p && !is_end_of_line[(unsigned char) *p] && *p != ' ')
3161 /* This function should only have been called when there is actually
3162 an instruction to assemble. */
3166 /* Now an instruction has been seen, architecture attributes from
3167 .arch directives merge with rather than overriding the previous
3169 tic6x_seen_insns = TRUE;
3170 /* If no .arch directives or -march options have been seen, we are
3171 assessing instruction validity based on the C674X default, so set
3172 the attribute accordingly. */
3173 if (tic6x_arch_attribute == C6XABI_Tag_ISA_none)
3174 tic6x_arch_attribute = C6XABI_Tag_ISA_C674X;
3176 /* Reset global settings for parallel bars and predicates now to
3177 avoid extra errors if there are problems with this opcode. */
3178 this_line_parallel = tic6x_line_parallel;
3179 this_line_spmask = tic6x_line_spmask;
3180 this_line_creg = tic6x_line_creg;
3181 this_line_z = tic6x_line_z;
3182 tic6x_line_parallel = FALSE;
3183 tic6x_line_spmask = FALSE;
3184 tic6x_line_creg = 0;
3186 seginfo = seg_info (now_seg);
3187 this_insn_label_list = seginfo->tc_segment_info_data.label_list;
3188 seginfo->tc_segment_info_data.label_list = NULL;
3190 opc_list = hash_find_n (opcode_hash, str, p - str);
3191 if (opc_list == NULL)
3195 as_bad (_("unknown opcode '%s'"), str);
3201 skip_whitespace (p);
3203 /* See if there is something that looks like a functional unit
3207 bfd_boolean good_func_unit;
3208 tic6x_func_unit_base maybe_base = tic6x_func_unit_nfu;
3209 unsigned int maybe_side = 0;
3210 unsigned int maybe_cross = 0;
3211 unsigned int maybe_data_side = 0;
3213 good_func_unit = tic6x_parse_func_unit_base (p + 1, &maybe_base,
3218 if (p[3] == ' ' || is_end_of_line[(unsigned char) p[3]])
3220 else if ((p[3] == 'x' || p[3] == 'X')
3221 && (p[4] == ' ' || is_end_of_line[(unsigned char) p[4]]))
3226 else if (maybe_base == tic6x_func_unit_d
3227 && (p[3] == 't' || p[3] == 'T')
3228 && (p[4] == '1' || p[4] == '2')
3229 && (p[5] == ' ' || is_end_of_line[(unsigned char) p[5]]))
3231 maybe_data_side = p[4] - '0';
3235 good_func_unit = FALSE;
3240 func_unit_base = maybe_base;
3241 func_unit_side = maybe_side;
3242 func_unit_cross = maybe_cross;
3243 cross_side = (func_unit_cross ? 3 - func_unit_side : func_unit_side);
3244 func_unit_data_side = maybe_data_side;
3247 skip_whitespace (p);
3250 /* Determine which entries in the opcode table match, and the
3251 associated permitted forms of operands. */
3252 max_matching_opcodes = 0;
3253 for (opc = opc_list; opc; opc = opc->next)
3254 max_matching_opcodes++;
3255 num_matching_opcodes = 0;
3256 opcm = XNEWVEC (tic6x_opcode_id, max_matching_opcodes);
3257 max_num_operands = 0;
3258 ok_this_arch = FALSE;
3260 ok_this_arch_fu = FALSE;
3261 for (opc = opc_list; opc; opc = opc->next)
3263 unsigned int num_operands;
3265 bfd_boolean this_opc_arch_ok = TRUE;
3266 bfd_boolean this_opc_fu_ok = TRUE;
3268 if (tic6x_insn_format_table[tic6x_opcode_table[opc->id].format].num_bits
3271 if (!(tic6x_opcode_table[opc->id].isa_variants & tic6x_features))
3272 this_opc_arch_ok = FALSE;
3273 if (tic6x_opcode_table[opc->id].func_unit != func_unit_base)
3274 this_opc_fu_ok = FALSE;
3275 if (func_unit_side == 1
3276 && (tic6x_opcode_table[opc->id].flags & TIC6X_FLAG_SIDE_B_ONLY))
3277 this_opc_fu_ok = FALSE;
3279 && (tic6x_opcode_table[opc->id].flags & TIC6X_FLAG_NO_CROSS))
3280 this_opc_fu_ok = FALSE;
3281 if (!func_unit_data_side
3282 && (tic6x_opcode_table[opc->id].flags
3283 & (TIC6X_FLAG_LOAD | TIC6X_FLAG_STORE)))
3284 this_opc_fu_ok = FALSE;
3285 if (func_unit_data_side
3286 && !(tic6x_opcode_table[opc->id].flags
3287 & (TIC6X_FLAG_LOAD | TIC6X_FLAG_STORE)))
3288 this_opc_fu_ok = FALSE;
3289 if (func_unit_data_side == 1
3290 && (tic6x_opcode_table[opc->id].flags & TIC6X_FLAG_SIDE_T2_ONLY))
3291 this_opc_fu_ok = FALSE;
3292 if (this_opc_arch_ok)
3293 ok_this_arch = TRUE;
3296 if (!this_opc_arch_ok || !this_opc_fu_ok)
3298 ok_this_arch_fu = TRUE;
3299 opcm[num_matching_opcodes] = opc->id;
3300 num_matching_opcodes++;
3301 num_operands = tic6x_opcode_table[opc->id].num_operands;
3303 if (tic6x_opcode_table[opc->id].flags & TIC6X_FLAG_SPMASK)
3305 if (num_operands != 1
3306 || (tic6x_opcode_table[opc->id].operand_info[0].form
3307 != tic6x_operand_func_unit))
3310 for (i = 0; i < num_operands; i++)
3313 |= tic6x_coarse_operand_form (tic6x_operand_func_unit);
3314 num_operands_permitted[i] = TRUE;
3319 for (i = 0; i < num_operands; i++)
3321 tic6x_operand_form f
3322 = tic6x_opcode_table[opc->id].operand_info[i].form;
3324 operand_forms[i] |= tic6x_coarse_operand_form (f);
3327 num_operands_permitted[num_operands] = TRUE;
3328 if (num_operands > max_num_operands)
3329 max_num_operands = num_operands;
3334 as_bad (_("'%.*s' instruction not supported on this architecture"),
3342 as_bad (_("'%.*s' instruction not supported on this functional unit"),
3348 if (!ok_this_arch_fu)
3350 as_bad (_("'%.*s' instruction not supported on this functional unit"
3351 " for this architecture"),
3357 /* If there were no instructions matching the above availability
3358 checks, we should now have given an error and returned. */
3359 if (num_matching_opcodes == 0)
3362 num_operands_read = 0;
3365 skip_whitespace (p);
3366 if (is_end_of_line[(unsigned char) *p])
3368 if (num_operands_read > 0)
3370 as_bad (_("missing operand after comma"));
3371 bad_operands = TRUE;
3376 if (max_num_operands == 0)
3378 as_bad (_("too many operands to '%.*s'"), opc_len, str);
3379 bad_operands = TRUE;
3383 if (!tic6x_parse_operand (&p, &operands[num_operands_read],
3384 operand_forms[num_operands_read], str, opc_len,
3385 num_operands_read + 1))
3386 bad_operands = TRUE;
3387 num_operands_read++;
3389 if (is_end_of_line[(unsigned char) *p])
3394 if (num_operands_read == max_num_operands)
3396 as_bad (_("too many operands to '%.*s'"), opc_len, str);
3397 bad_operands = TRUE;
3403 /* Operand parsing should consume whole operands. */
3407 if (!bad_operands && !num_operands_permitted[num_operands_read])
3409 as_bad (_("bad number of operands to '%.*s'"), opc_len, str);
3410 bad_operands = TRUE;
3415 /* Each operand is of the right syntactic form for some opcode
3416 choice, and the number of operands is valid. Check that each
3417 operand is OK in detail for some opcode choice with the right
3418 number of operands. */
3421 for (i = 0; i < num_operands_read; i++)
3423 bfd_boolean coarse_ok = FALSE;
3424 bfd_boolean fine_ok = FALSE;
3425 tic6x_operand_match fine_failure = tic6x_match_matches;
3428 for (j = 0; j < num_matching_opcodes; j++)
3430 tic6x_operand_form f;
3433 tic6x_operand_match this_fine_failure;
3435 if (tic6x_opcode_table[opcm[j]].flags & TIC6X_FLAG_SPMASK)
3437 f = tic6x_operand_func_unit;
3442 if (tic6x_opcode_table[opcm[j]].num_operands
3443 != num_operands_read)
3446 f = tic6x_opcode_table[opcm[j]].operand_info[i].form;
3447 rw = tic6x_opcode_table[opcm[j]].operand_info[i].rw;
3449 cf = tic6x_coarse_operand_form (f);
3451 if (operands[i].form != cf)
3456 = tic6x_operand_matches_form (&operands[i], f, rw,
3459 func_unit_data_side);
3460 if (this_fine_failure == tic6x_match_matches)
3465 if (fine_failure == tic6x_match_matches
3466 || fine_failure > this_fine_failure)
3467 fine_failure = this_fine_failure;
3470 /* No instructions should have operand syntactic forms only
3471 acceptable with certain numbers of operands, so no
3472 diagnostic for this case. */
3478 switch (fine_failure)
3480 case tic6x_match_non_const:
3481 as_bad (_("operand %u of '%.*s' not constant"),
3482 i + 1, opc_len, str);
3485 case tic6x_match_wrong_side:
3486 as_bad (_("operand %u of '%.*s' on wrong side"),
3487 i + 1, opc_len, str);
3490 case tic6x_match_bad_return:
3491 as_bad (_("operand %u of '%.*s' not a valid return "
3492 "address register"),
3493 i + 1, opc_len, str);
3496 case tic6x_match_ctrl_write_only:
3497 as_bad (_("operand %u of '%.*s' is write-only"),
3498 i + 1, opc_len, str);
3501 case tic6x_match_ctrl_read_only:
3502 as_bad (_("operand %u of '%.*s' is read-only"),
3503 i + 1, opc_len, str);
3506 case tic6x_match_bad_mem:
3507 as_bad (_("operand %u of '%.*s' not a valid memory "
3509 i + 1, opc_len, str);
3512 case tic6x_match_bad_address:
3513 as_bad (_("operand %u of '%.*s' not a valid base "
3514 "address register"),
3515 i + 1, opc_len, str);
3521 bad_operands = TRUE;
3529 /* Each operand is OK for some opcode choice, and the number of
3530 operands is valid. Check whether there is an opcode choice
3531 for which all operands are simultaneously valid. */
3533 bfd_boolean found_match = FALSE;
3535 for (i = 0; i < TIC6X_NUM_PREFER; i++)
3536 opc_rank[i] = (unsigned int) -1;
3538 min_rank = TIC6X_NUM_PREFER - 1;
3541 for (i = 0; i < num_matching_opcodes; i++)
3544 bfd_boolean this_matches = TRUE;
3546 if (!(tic6x_opcode_table[opcm[i]].flags & TIC6X_FLAG_SPMASK)
3547 && tic6x_opcode_table[opcm[i]].num_operands != num_operands_read)
3550 for (j = 0; j < num_operands_read; j++)
3552 tic6x_operand_form f;
3555 if (tic6x_opcode_table[opcm[i]].flags & TIC6X_FLAG_SPMASK)
3557 f = tic6x_operand_func_unit;
3562 f = tic6x_opcode_table[opcm[i]].operand_info[j].form;
3563 rw = tic6x_opcode_table[opcm[i]].operand_info[j].rw;
3565 if (tic6x_operand_matches_form (&operands[j], f, rw,
3568 func_unit_data_side)
3569 != tic6x_match_matches)
3571 this_matches = FALSE;
3578 int rank = TIC6X_PREFER_VAL (tic6x_opcode_table[opcm[i]].flags);
3580 if (rank < min_rank)
3582 if (rank > max_rank)
3585 if (opc_rank[rank] == (unsigned int) -1)
3588 /* The opcode table should provide a total ordering
3589 for all cases where multiple matches may get
3599 as_bad (_("bad operand combination for '%.*s'"), opc_len, str);
3600 bad_operands = TRUE;
3612 for (try_rank = max_rank; try_rank >= min_rank; try_rank--)
3616 if (opc_rank[try_rank] == (unsigned int) -1)
3619 opcode_value = tic6x_try_encode (opcm[opc_rank[try_rank]], operands,
3620 num_operands_read, this_line_creg,
3621 this_line_z, func_unit_side,
3622 func_unit_cross, func_unit_data_side,
3623 seginfo->tc_segment_info_data.sploop_ii,
3624 &fix_exp, &fix_pcrel, &fx_r_type,
3625 &fix_adda, &fix_needed, &encoded_ok,
3626 (try_rank == min_rank ? TRUE : FALSE),
3630 opct = &tic6x_opcode_table[opcm[opc_rank[try_rank]]];
3640 if (this_line_parallel)
3642 insn_frag = seginfo->tc_segment_info_data.execute_packet_frag;
3643 if (insn_frag == NULL)
3645 as_bad (_("parallel instruction not following another instruction"));
3649 if (insn_frag->fr_fix >= 32)
3651 as_bad (_("too many instructions in execute packet"));
3655 if (this_insn_label_list != NULL)
3656 as_bad (_("label not at start of execute packet"));
3658 if (opct->flags & TIC6X_FLAG_FIRST)
3659 as_bad (_("'%.*s' instruction not at start of execute packet"),
3662 *seginfo->tc_segment_info_data.last_insn_lsb |= 0x1;
3663 output = insn_frag->fr_literal + insn_frag->fr_fix;
3667 tic6x_label_list *l;
3669 seginfo->tc_segment_info_data.spmask_addr = NULL;
3670 seginfo->tc_segment_info_data.func_units_used = 0;
3672 /* Start a new frag for this execute packet. */
3673 if (frag_now_fix () != 0)
3675 if (frag_now->fr_type != rs_machine_dependent)
3676 frag_wane (frag_now);
3681 insn_frag = seginfo->tc_segment_info_data.execute_packet_frag = frag_now;
3682 for (l = this_insn_label_list; l; l = l->next)
3684 symbol_set_frag (l->label, frag_now);
3685 S_SET_VALUE (l->label, 0);
3686 S_SET_SEGMENT (l->label, now_seg);
3688 tic6x_free_label_list (this_insn_label_list);
3689 dwarf2_emit_insn (0);
3690 output = frag_var (rs_machine_dependent, 32, 32, 0, NULL, 0, NULL);
3691 /* This must be the same as the frag to which a pointer was just
3693 if (output != insn_frag->fr_literal)
3695 insn_frag->tc_frag_data.is_insns = TRUE;
3696 insn_frag->tc_frag_data.can_cross_fp_boundary
3697 = tic6x_can_cross_fp_boundary;
3700 if (func_unit_base != tic6x_func_unit_nfu)
3702 unsigned int func_unit_enc;
3704 func_unit_enc = tic6x_encode_spmask (func_unit_base, func_unit_side);
3706 if (seginfo->tc_segment_info_data.func_units_used & func_unit_enc)
3707 as_bad (_("functional unit already used in this execute packet"));
3709 seginfo->tc_segment_info_data.func_units_used |= func_unit_enc;
3712 if (opct->flags & TIC6X_FLAG_SPLOOP)
3714 if (seginfo->tc_segment_info_data.sploop_ii)
3715 as_bad (_("nested software pipelined loop"));
3716 if (num_operands_read != 1
3717 || operands[0].form != TIC6X_OP_EXP
3718 || operands[0].value.exp.X_op != O_constant)
3720 seginfo->tc_segment_info_data.sploop_ii
3721 = operands[0].value.exp.X_add_number;
3723 else if (opct->flags & TIC6X_FLAG_SPKERNEL)
3725 if (!seginfo->tc_segment_info_data.sploop_ii)
3726 as_bad (_("'%.*s' instruction not in a software pipelined loop"),
3728 seginfo->tc_segment_info_data.sploop_ii = 0;
3731 if (this_line_spmask)
3733 if (seginfo->tc_segment_info_data.spmask_addr == NULL)
3734 as_bad (_("'||^' without previous SPMASK"));
3735 else if (func_unit_base == tic6x_func_unit_nfu)
3736 as_bad (_("cannot mask instruction using no functional unit"));
3739 unsigned int spmask_opcode;
3740 unsigned int mask_bit;
3743 = md_chars_to_number (seginfo->tc_segment_info_data.spmask_addr,
3745 mask_bit = tic6x_encode_spmask (func_unit_base, func_unit_side);
3747 if (spmask_opcode & mask_bit)
3748 as_bad (_("functional unit already masked"));
3749 spmask_opcode |= mask_bit;
3750 md_number_to_chars (seginfo->tc_segment_info_data.spmask_addr,
3755 record_alignment (now_seg, 5);
3756 md_number_to_chars (output, opcode_value, 4);
3758 tic6x_fix_new_exp (insn_frag, output - insn_frag->fr_literal, 4, fix_exp,
3759 fix_pcrel, fx_r_type, fix_adda);
3760 insn_frag->fr_fix += 4;
3761 insn_frag->fr_var -= 4;
3762 seginfo->tc_segment_info_data.last_insn_lsb
3763 = (target_big_endian ? output + 3 : output);
3764 if (opct->flags & TIC6X_FLAG_SPMASK)
3765 seginfo->tc_segment_info_data.spmask_addr = output;
3768 /* Modify NEWVAL (32-bit) by inserting VALUE, shifted right by SHIFT
3769 and the least significant BITS bits taken, at position POS. */
3770 #define MODIFY_VALUE(NEWVAL, VALUE, SHIFT, POS, BITS) \
3772 (NEWVAL) &= 0xffffffffU & ~(((1U << (BITS)) - 1) << (POS)); \
3773 (NEWVAL) |= (((VALUE) >> (SHIFT)) & ((1U << (BITS)) - 1)) << (POS); \
3776 /* Apply a fixup to the object file. */
3779 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
3781 offsetT value = *valP;
3782 char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
3784 value = SEXT (value);
3787 fixP->fx_offset = SEXT (fixP->fx_offset);
3789 if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
3792 /* We do our own overflow checks. */
3793 fixP->fx_no_overflow = 1;
3795 switch (fixP->fx_r_type)
3797 case BFD_RELOC_NONE:
3798 case BFD_RELOC_C6000_EHTYPE:
3799 /* Force output to the object file. */
3804 if (fixP->fx_done || !seg->use_rela_p)
3805 md_number_to_chars (buf, value, 4);
3809 if (fixP->fx_done || !seg->use_rela_p)
3811 if (value < -0x8000 || value > 0xffff)
3812 as_bad_where (fixP->fx_file, fixP->fx_line,
3813 _("value too large for 2-byte field"));
3814 md_number_to_chars (buf, value, 2);
3819 if (fixP->fx_done || !seg->use_rela_p)
3821 if (value < -0x80 || value > 0xff)
3822 as_bad_where (fixP->fx_file, fixP->fx_line,
3823 _("value too large for 1-byte field"));
3828 case BFD_RELOC_C6000_ABS_S16:
3829 case BFD_RELOC_C6000_ABS_L16:
3830 case BFD_RELOC_C6000_SBR_S16:
3831 case BFD_RELOC_C6000_SBR_L16_B:
3832 case BFD_RELOC_C6000_SBR_L16_H:
3833 case BFD_RELOC_C6000_SBR_L16_W:
3834 case BFD_RELOC_C6000_SBR_GOT_L16_W:
3835 if (fixP->fx_done || !seg->use_rela_p)
3837 offsetT newval = md_chars_to_number (buf, 4);
3840 switch (fixP->fx_r_type)
3842 case BFD_RELOC_C6000_SBR_L16_H:
3846 case BFD_RELOC_C6000_SBR_L16_W:
3847 case BFD_RELOC_C6000_SBR_GOT_L16_W:
3856 MODIFY_VALUE (newval, value, shift, 7, 16);
3857 if ((value < -0x8000 || value > 0x7fff)
3858 && (fixP->fx_r_type == BFD_RELOC_C6000_ABS_S16
3859 || fixP->fx_r_type == BFD_RELOC_C6000_SBR_S16))
3860 as_bad_where (fixP->fx_file, fixP->fx_line,
3861 _("immediate offset out of range"));
3863 md_number_to_chars (buf, newval, 4);
3866 && fixP->fx_r_type != BFD_RELOC_C6000_ABS_S16
3867 && fixP->fx_r_type != BFD_RELOC_C6000_ABS_L16)
3871 case BFD_RELOC_C6000_ABS_H16:
3872 case BFD_RELOC_C6000_SBR_H16_B:
3873 case BFD_RELOC_C6000_SBR_H16_H:
3874 case BFD_RELOC_C6000_SBR_H16_W:
3875 case BFD_RELOC_C6000_SBR_GOT_H16_W:
3876 if (fixP->fx_done || !seg->use_rela_p)
3878 offsetT newval = md_chars_to_number (buf, 4);
3881 switch (fixP->fx_r_type)
3883 case BFD_RELOC_C6000_SBR_H16_H:
3887 case BFD_RELOC_C6000_SBR_H16_W:
3888 case BFD_RELOC_C6000_SBR_GOT_H16_W:
3897 MODIFY_VALUE (newval, value, shift, 7, 16);
3899 md_number_to_chars (buf, newval, 4);
3901 if (fixP->fx_done && fixP->fx_r_type != BFD_RELOC_C6000_ABS_H16)
3905 case BFD_RELOC_C6000_PCR_H16:
3906 case BFD_RELOC_C6000_PCR_L16:
3907 if (fixP->fx_done || !seg->use_rela_p)
3909 offsetT newval = md_chars_to_number (buf, 4);
3910 int shift = fixP->fx_r_type == BFD_RELOC_C6000_PCR_H16 ? 16 : 0;
3912 MODIFY_VALUE (newval, value, shift, 7, 16);
3914 md_number_to_chars (buf, newval, 4);
3918 case BFD_RELOC_C6000_SBR_U15_B:
3919 if (fixP->fx_done || !seg->use_rela_p)
3921 offsetT newval = md_chars_to_number (buf, 4);
3923 MODIFY_VALUE (newval, value, 0, 8, 15);
3924 if (value < 0 || value > 0x7fff)
3925 as_bad_where (fixP->fx_file, fixP->fx_line,
3926 _("immediate offset out of range"));
3928 md_number_to_chars (buf, newval, 4);
3932 case BFD_RELOC_C6000_SBR_U15_H:
3933 if (fixP->fx_done || !seg->use_rela_p)
3935 offsetT newval = md_chars_to_number (buf, 4);
3937 /* Constant ADDA operands, processed as constant when the
3938 instruction is parsed, are encoded as-is rather than
3939 shifted. If the operand of an ADDA instruction is now
3940 constant (for example, the difference between two labels
3941 found after the instruction), ensure it is encoded the
3942 same way it would have been if the constant value had
3943 been known when the instruction was parsed. */
3944 if (fixP->tc_fix_data.fix_adda && fixP->fx_done)
3947 MODIFY_VALUE (newval, value, 1, 8, 15);
3949 as_bad_where (fixP->fx_file, fixP->fx_line,
3950 _("immediate offset not 2-byte-aligned"));
3951 if (value < 0 || value > 0xfffe)
3952 as_bad_where (fixP->fx_file, fixP->fx_line,
3953 _("immediate offset out of range"));
3955 md_number_to_chars (buf, newval, 4);
3959 case BFD_RELOC_C6000_SBR_U15_W:
3960 case BFD_RELOC_C6000_SBR_GOT_U15_W:
3961 if (fixP->fx_done || !seg->use_rela_p)
3963 offsetT newval = md_chars_to_number (buf, 4);
3965 /* Constant ADDA operands, processed as constant when the
3966 instruction is parsed, are encoded as-is rather than
3967 shifted. If the operand of an ADDA instruction is now
3968 constant (for example, the difference between two labels
3969 found after the instruction), ensure it is encoded the
3970 same way it would have been if the constant value had
3971 been known when the instruction was parsed. */
3972 if (fixP->tc_fix_data.fix_adda && fixP->fx_done)
3975 MODIFY_VALUE (newval, value, 2, 8, 15);
3977 as_bad_where (fixP->fx_file, fixP->fx_line,
3978 _("immediate offset not 4-byte-aligned"));
3979 if (value < 0 || value > 0x1fffc)
3980 as_bad_where (fixP->fx_file, fixP->fx_line,
3981 _("immediate offset out of range"));
3983 md_number_to_chars (buf, newval, 4);
3985 if (fixP->fx_done && fixP->fx_r_type != BFD_RELOC_C6000_SBR_U15_W)
3989 case BFD_RELOC_C6000_DSBT_INDEX:
3991 as_bad_where (fixP->fx_file, fixP->fx_line,
3992 _("addend used with $DSBT_INDEX"));
3997 case BFD_RELOC_C6000_PCR_S21:
3998 if (fixP->fx_done || !seg->use_rela_p)
4000 offsetT newval = md_chars_to_number (buf, 4);
4002 MODIFY_VALUE (newval, value, 2, 7, 21);
4005 as_bad_where (fixP->fx_file, fixP->fx_line,
4006 _("PC-relative offset not 4-byte-aligned"));
4007 if (value < -0x400000 || value > 0x3ffffc)
4008 as_bad_where (fixP->fx_file, fixP->fx_line,
4009 _("PC-relative offset out of range"));
4011 md_number_to_chars (buf, newval, 4);
4015 case BFD_RELOC_C6000_PCR_S12:
4016 if (fixP->fx_done || !seg->use_rela_p)
4018 offsetT newval = md_chars_to_number (buf, 4);
4020 MODIFY_VALUE (newval, value, 2, 16, 12);
4023 as_bad_where (fixP->fx_file, fixP->fx_line,
4024 _("PC-relative offset not 4-byte-aligned"));
4025 if (value < -0x2000 || value > 0x1ffc)
4026 as_bad_where (fixP->fx_file, fixP->fx_line,
4027 _("PC-relative offset out of range"));
4029 md_number_to_chars (buf, newval, 4);
4033 case BFD_RELOC_C6000_PCR_S10:
4034 if (fixP->fx_done || !seg->use_rela_p)
4036 offsetT newval = md_chars_to_number (buf, 4);
4038 MODIFY_VALUE (newval, value, 2, 13, 10);
4041 as_bad_where (fixP->fx_file, fixP->fx_line,
4042 _("PC-relative offset not 4-byte-aligned"));
4043 if (value < -0x800 || value > 0x7fc)
4044 as_bad_where (fixP->fx_file, fixP->fx_line,
4045 _("PC-relative offset out of range"));
4047 md_number_to_chars (buf, newval, 4);
4051 case BFD_RELOC_C6000_PCR_S7:
4052 if (fixP->fx_done || !seg->use_rela_p)
4054 offsetT newval = md_chars_to_number (buf, 4);
4056 MODIFY_VALUE (newval, value, 2, 16, 7);
4059 as_bad_where (fixP->fx_file, fixP->fx_line,
4060 _("PC-relative offset not 4-byte-aligned"));
4061 if (value < -0x100 || value > 0xfc)
4062 as_bad_where (fixP->fx_file, fixP->fx_line,
4063 _("PC-relative offset out of range"));
4065 md_number_to_chars (buf, newval, 4);
4069 case BFD_RELOC_C6000_PREL31:
4070 /* Force output to the object file. */
4079 /* Convert a floating-point number to target (IEEE) format. */
4082 md_atof (int type, char *litP, int *sizeP)
4084 return ieee_md_atof (type, litP, sizeP, target_big_endian);
4087 /* Adjust the frags in SECTION (see tic6x_end). */
4090 tic6x_adjust_section (bfd *abfd ATTRIBUTE_UNUSED, segT section,
4091 void *dummy ATTRIBUTE_UNUSED)
4093 segment_info_type *info;
4096 bfd_boolean have_code = FALSE;
4097 bfd_boolean have_non_code = FALSE;
4099 info = seg_info (section);
4103 for (frchp = info->frchainP; frchp; frchp = frchp->frch_next)
4104 for (fragp = frchp->frch_root; fragp; fragp = fragp->fr_next)
4105 switch (fragp->fr_type)
4107 case rs_machine_dependent:
4108 if (fragp->tc_frag_data.is_insns)
4114 if (fragp->fr_fix > 0)
4115 have_non_code = TRUE;
4119 have_non_code = TRUE;
4123 /* Process alignment requirements in a code-only section. */
4124 if (have_code && !have_non_code)
4126 /* If we need to insert an odd number of instructions to meet an
4127 alignment requirement, there must have been an odd number of
4128 instructions since the last 8-byte-aligned execute packet
4129 boundary. So there must have been an execute packet with an
4130 odd number (and so a number fewer than 8) of instructions
4131 into which we can insert a NOP without breaking any previous
4134 If then we need to insert a number 2 mod 4 of instructions,
4135 the number of instructions since the last 16-byte-aligned
4136 execute packet boundary must be 2 mod 4. So between that
4137 boundary and the following 8-byte-aligned boundary there must
4138 either be at least one execute packet with 2-mod-4
4139 instructions, or at least two with an odd number of
4140 instructions; again, greedily inserting NOPs as soon as
4141 possible suffices to meet the alignment requirement.
4143 If then we need to insert 4 instructions, we look between the
4144 last 32-byte-aligned boundary and the following
4145 16-byte-aligned boundary. The sizes of the execute packets
4146 in this range total 4 instructions mod 8, so again there is
4147 room for greedy insertion of NOPs to meet the alignment
4148 requirement, and before any intermediate point with 8-byte
4149 (2-instruction) alignment requirement the sizes of execute
4150 packets (and so the room for NOPs) will total 2 instructions
4151 mod 4 so greedy insertion will not break such alignments.
4153 So we can always meet these alignment requirements by
4154 inserting NOPs in parallel with existing execute packets, and
4155 by induction the approach described above inserts the minimum
4156 number of such NOPs. */
4158 /* The number of NOPs we are currently looking to insert, if we
4159 have gone back to insert NOPs. */
4160 unsigned int want_insert = 0;
4162 /* Out of that number, the number inserted so far in the current
4163 stage of the above algorithm. */
4164 unsigned int want_insert_done_so_far = 0;
4166 /* The position mod 32 at the start of the current frag. */
4167 unsigned int pos = 0;
4169 /* The locations in the frag chain of the most recent frags at
4170 the start of which there is the given alignment. */
4171 frchainS *frchp_last32, *frchp_last16, *frchp_last8;
4172 fragS *fragp_last32, *fragp_last16, *fragp_last8;
4173 unsigned int pos_last32, pos_last16, pos_last8;
4175 frchp_last32 = frchp_last16 = frchp_last8 = info->frchainP;
4176 fragp_last32 = fragp_last16 = fragp_last8 = info->frchainP->frch_root;
4177 pos_last32 = pos_last16 = pos_last8 = 0;
4179 for (frchp = info->frchainP; frchp; frchp = frchp->frch_next)
4180 for (fragp = frchp->frch_root; fragp; fragp = fragp->fr_next)
4183 bfd_boolean go_back = FALSE;
4184 frchainS *frchp_next;
4187 if (fragp->fr_type != rs_machine_dependent)
4190 if (fragp->tc_frag_data.is_insns
4191 && pos + fragp->fr_fix > 32
4192 && !fragp->tc_frag_data.can_cross_fp_boundary)
4194 /* As described above, we should always have met an
4195 alignment requirement by the time we come back to
4202 want_insert = (32 - pos) >> 2;
4203 if (want_insert > 7)
4205 want_insert_done_so_far = 0;
4209 if (!fragp->tc_frag_data.is_insns)
4211 unsigned int would_insert_bytes;
4213 if (!(pos & ((1 << fragp->fr_offset) - 1)))
4214 /* This alignment requirement is already met. */
4217 /* As described above, we should always have met an
4218 alignment requirement by the time we come back to
4223 /* We may not be able to meet this requirement within
4224 the given number of characters. */
4226 = ((1 << fragp->fr_offset)
4227 - (pos & ((1 << fragp->fr_offset) - 1)));
4229 if (fragp->fr_subtype != 0
4230 && would_insert_bytes > fragp->fr_subtype)
4233 /* An unmet alignment must be 8, 16 or 32 bytes;
4234 smaller ones must always be met within code-only
4235 sections and larger ones cause the section not to
4237 if (fragp->fr_offset != 3
4238 && fragp->fr_offset != 4
4239 && fragp->fr_offset != 5)
4242 if (would_insert_bytes & 3)
4244 want_insert = would_insert_bytes >> 2;
4245 if (want_insert > 7)
4247 want_insert_done_so_far = 0;
4250 else if (want_insert && !go_back)
4252 unsigned int num_insns = fragp->fr_fix >> 2;
4253 unsigned int max_poss_nops = 8 - num_insns;
4257 unsigned int cur_want_nops, max_want_nops, do_nops, i;
4259 if (want_insert & 1)
4261 else if (want_insert & 2)
4263 else if (want_insert & 4)
4268 max_want_nops = cur_want_nops - want_insert_done_so_far;
4270 do_nops = (max_poss_nops < max_want_nops
4273 for (i = 0; i < do_nops; i++)
4275 md_number_to_chars (fragp->fr_literal + fragp->fr_fix,
4277 if (target_big_endian)
4278 fragp->fr_literal[fragp->fr_fix - 1] |= 0x1;
4280 fragp->fr_literal[fragp->fr_fix - 4] |= 0x1;
4284 want_insert_done_so_far += do_nops;
4285 if (want_insert_done_so_far == cur_want_nops)
4287 want_insert -= want_insert_done_so_far;
4288 want_insert_done_so_far = 0;
4296 if (want_insert & 1)
4298 frchp = frchp_last8;
4299 fragp = fragp_last8;
4302 else if (want_insert & 2)
4304 frchp = frchp_last8 = frchp_last16;
4305 fragp = fragp_last8 = fragp_last16;
4306 pos = pos_last8 = pos_last16;
4308 else if (want_insert & 4)
4310 frchp = frchp_last8 = frchp_last16 = frchp_last32;
4311 fragp = fragp_last8 = fragp_last16 = fragp_last32;
4312 pos = pos_last8 = pos_last16 = pos_last32;
4320 /* Update current position for moving past a code
4322 pos += fragp->fr_fix;
4325 fragp_next = fragp->fr_next;
4326 if (fragp_next == NULL)
4328 frchp_next = frchp->frch_next;
4329 if (frchp_next != NULL)
4330 fragp_next = frchp_next->frch_root;
4334 frchp_last8 = frchp_next;
4335 fragp_last8 = fragp_next;
4340 frchp_last16 = frchp_next;
4341 fragp_last16 = fragp_next;
4346 frchp_last32 = frchp_next;
4347 fragp_last32 = fragp_next;
4353 /* Now convert the machine-dependent frags to machine-independent
4355 for (frchp = info->frchainP; frchp; frchp = frchp->frch_next)
4356 for (fragp = frchp->frch_root; fragp; fragp = fragp->fr_next)
4358 if (fragp->fr_type == rs_machine_dependent)
4360 if (fragp->tc_frag_data.is_insns)
4364 fragp->fr_type = rs_align_code;
4366 *fragp->fr_literal = 0;
4372 /* Initialize the machine-dependent parts of a frag. */
4375 tic6x_frag_init (fragS *fragp)
4377 fragp->tc_frag_data.is_insns = FALSE;
4378 fragp->tc_frag_data.can_cross_fp_boundary = FALSE;
4381 /* Set an attribute if it has not already been set by the user. */
4384 tic6x_set_attribute_int (int tag, int value)
4387 || tag >= NUM_KNOWN_OBJ_ATTRIBUTES)
4389 if (!tic6x_attributes_set_explicitly[tag])
4390 bfd_elf_add_proc_attr_int (stdoutput, tag, value);
4393 /* Set object attributes deduced from the input file and command line
4394 rather than given explicitly. */
4396 tic6x_set_attributes (void)
4398 if (tic6x_arch_attribute == C6XABI_Tag_ISA_none)
4399 tic6x_arch_attribute = C6XABI_Tag_ISA_C674X;
4401 tic6x_set_attribute_int (Tag_ISA, tic6x_arch_attribute);
4402 tic6x_set_attribute_int (Tag_ABI_DSBT, tic6x_dsbt);
4403 tic6x_set_attribute_int (Tag_ABI_PID, tic6x_pid);
4404 tic6x_set_attribute_int (Tag_ABI_PIC, tic6x_pic);
4407 /* Do machine-dependent manipulations of the frag chains after all
4408 input has been read and before the machine-independent sizing and
4414 /* Set object attributes at this point if not explicitly set. */
4415 tic6x_set_attributes ();
4417 /* Meeting alignment requirements may require inserting NOPs in
4418 parallel in execute packets earlier in the segment. Future
4419 16-bit instruction generation involves whole-segment optimization
4420 to determine the best choice and ordering of 32-bit or 16-bit
4421 instructions. This doesn't fit will in the general relaxation
4422 framework, so handle alignment and 16-bit instruction generation
4424 bfd_map_over_sections (stdoutput, tic6x_adjust_section, NULL);
4427 /* No machine-dependent frags at this stage; all converted in
4431 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec ATTRIBUTE_UNUSED,
4432 fragS *fragp ATTRIBUTE_UNUSED)
4437 /* No machine-dependent frags at this stage; all converted in
4441 md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED,
4442 segT seg ATTRIBUTE_UNUSED)
4447 /* Put a number into target byte order. */
4450 md_number_to_chars (char *buf, valueT val, int n)
4452 if (target_big_endian)
4453 number_to_chars_bigendian (buf, val, n);
4455 number_to_chars_littleendian (buf, val, n);
4458 /* Machine-dependent operand parsing not currently needed. */
4461 md_operand (expressionS *op ATTRIBUTE_UNUSED)
4465 /* PC-relative operands are relative to the start of the fetch
4469 tic6x_pcrel_from_section (fixS *fixp, segT sec)
4471 if (fixp->fx_addsy != NULL
4472 && (!S_IS_DEFINED (fixp->fx_addsy)
4473 || S_GET_SEGMENT (fixp->fx_addsy) != sec))
4475 return (fixp->fx_where + fixp->fx_frag->fr_address) & ~(long) 0x1f;
4478 /* Round up a section size to the appropriate boundary. */
4481 md_section_align (segT segment ATTRIBUTE_UNUSED,
4484 /* Round up section sizes to ensure that text sections consist of
4485 whole fetch packets. */
4486 int align = bfd_get_section_alignment (stdoutput, segment);
4487 return ((size + (1 << align) - 1) & (-((valueT) 1 << align)));
4490 /* No special undefined symbol handling needed for now. */
4493 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
4498 /* Translate internal representation of relocation info to BFD target
4502 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
4506 bfd_reloc_code_real_type r_type;
4508 reloc = XNEW (arelent);
4509 reloc->sym_ptr_ptr = XNEW (asymbol *);
4510 symbol = symbol_get_bfdsym (fixp->fx_addsy);
4511 *reloc->sym_ptr_ptr = symbol;
4512 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
4513 reloc->addend = (tic6x_generate_rela ? fixp->fx_offset : 0);
4514 r_type = fixp->fx_r_type;
4515 reloc->howto = bfd_reloc_type_lookup (stdoutput, r_type);
4517 if (reloc->howto == NULL)
4519 as_bad_where (fixp->fx_file, fixp->fx_line,
4520 _("Cannot represent relocation type %s"),
4521 bfd_get_reloc_code_name (r_type));
4525 /* Correct for adjustments bfd_install_relocation will make. */
4526 if (reloc->howto->pcrel_offset && reloc->howto->partial_inplace)
4528 reloc->addend += reloc->address;
4529 if (!bfd_is_com_section (symbol))
4530 reloc->addend -= symbol->value;
4532 if (r_type == BFD_RELOC_C6000_PCR_H16
4533 || r_type == BFD_RELOC_C6000_PCR_L16)
4535 symbolS *t = fixp->tc_fix_data.fix_subsy;
4536 segT sub_symbol_segment;
4538 resolve_symbol_value (t);
4539 sub_symbol_segment = S_GET_SEGMENT (t);
4540 if (sub_symbol_segment == undefined_section)
4541 as_bad_where (fixp->fx_file, fixp->fx_line,
4542 _("undefined symbol %s in PCR relocation"),
4546 reloc->addend = reloc->address & ~0x1F;
4547 reloc->addend -= S_GET_VALUE (t);
4553 /* Convert REGNAME to a DWARF-2 register number. */
4556 tic6x_regname_to_dw2regnum (char *regname)
4562 reg_ok = tic6x_parse_register (&rq, ®);
4569 case 1: /* A regs. */
4572 else if (reg.num < 32)
4573 return (reg.num - 16) + 37;
4577 case 2: /* B regs. */
4579 return reg.num + 16;
4580 else if (reg.num < 32)
4581 return (reg.num - 16) + 53;
4590 /* Initialize the DWARF-2 unwind information for this procedure. */
4593 tic6x_frame_initial_instructions (void)
4595 /* CFA is initial stack pointer (B15). */
4596 cfi_add_CFA_def_cfa (31, 0);
4599 /* Start an exception table entry. If idx is nonzero this is an index table
4603 tic6x_start_unwind_section (const segT text_seg, int idx)
4605 tic6x_unwind_info *unwind = tic6x_get_unwind ();
4606 const char * text_name;
4607 const char * prefix;
4608 const char * prefix_once;
4609 const char * group_name;
4613 size_t sec_name_len;
4620 prefix = ELF_STRING_C6000_unwind;
4621 prefix_once = ELF_STRING_C6000_unwind_once;
4622 type = SHT_C6000_UNWIND;
4626 prefix = ELF_STRING_C6000_unwind_info;
4627 prefix_once = ELF_STRING_C6000_unwind_info_once;
4628 type = SHT_PROGBITS;
4631 text_name = segment_name (text_seg);
4632 if (streq (text_name, ".text"))
4635 if (strncmp (text_name, ".gnu.linkonce.t.",
4636 strlen (".gnu.linkonce.t.")) == 0)
4638 prefix = prefix_once;
4639 text_name += strlen (".gnu.linkonce.t.");
4642 prefix_len = strlen (prefix);
4643 text_len = strlen (text_name);
4644 sec_name_len = prefix_len + text_len;
4645 sec_name = XNEWVEC (char, sec_name_len + 1);
4646 memcpy (sec_name, prefix, prefix_len);
4647 memcpy (sec_name + prefix_len, text_name, text_len);
4648 sec_name[prefix_len + text_len] = '\0';
4654 /* Handle COMDAT group. */
4655 if (prefix != prefix_once && (text_seg->flags & SEC_LINK_ONCE) != 0)
4657 group_name = elf_group_name (text_seg);
4658 if (group_name == NULL)
4660 as_bad (_("group section `%s' has no group signature"),
4661 segment_name (text_seg));
4662 ignore_rest_of_line ();
4669 obj_elf_change_section (sec_name, type, 0, flags, 0, group_name,
4672 /* Set the section link for index tables. */
4674 elf_linked_to_section (now_seg) = text_seg;
4676 seg_info (now_seg)->tc_segment_info_data.text_unwind = unwind;
4681 tic6x_unwind_frame_regs[TIC6X_NUM_UNWIND_REGS] =
4682 /* A15 B15 B14 B13 B12 B11 B10 B3 A14 A13 A12 A11 A10. */
4683 { 15, 31, 30, 29, 28, 27, 26, 19, 14, 13, 12, 11, 10 };
4685 /* Register save offsets for __c6xabi_push_rts. */
4687 tic6x_pop_rts_offset_little[TIC6X_NUM_UNWIND_REGS] =
4688 /* A15 B15 B14 B13 B12 B11 B10 B3 A14 A13 A12 A11 A10. */
4689 { -1, 1, 0, -3, -4, -7, -8,-11, -2, -5, -6, -9,-10};
4692 tic6x_pop_rts_offset_big[TIC6X_NUM_UNWIND_REGS] =
4693 /* A15 B15 B14 B13 B12 B11 B10 B3 A14 A13 A12 A11 A10. */
4694 { -2, 1, 0, -4, -3, -8, -7,-12, -1, -6, -5,-10, -9};
4696 /* Map from dwarf register number to unwind frame register number. */
4698 tic6x_unwind_reg_from_dwarf (int dwarf)
4702 for (reg = 0; reg < TIC6X_NUM_UNWIND_REGS; reg++)
4704 if (tic6x_unwind_frame_regs[reg] == dwarf)
4711 /* Unwinding bytecode definitions. */
4712 #define UNWIND_OP_ADD_SP 0x00
4713 #define UNWIND_OP_ADD_SP2 0xd2
4714 #define UNWIND_OP2_POP 0x8000
4715 #define UNWIND_OP2_POP_COMPACT 0xa000
4716 #define UNWIND_OP_POP_REG 0xc0
4717 #define UNWIND_OP_MV_FP 0xd0
4718 #define UNWIND_OP_POP_RTS 0xd1
4719 #define UNWIND_OP_RET 0xe0
4721 /* Maximum stack adjustment for __c6xabi_unwind_cpp_pr3/4 */
4722 #define MAX_COMPACT_SP_OFFSET (0x7f << 3)
4725 tic6x_flush_unwind_word (valueT data)
4727 tic6x_unwind_info *unwind = tic6x_get_unwind ();
4730 /* Create EXTAB entry if it does not exist. */
4731 if (unwind->table_entry == NULL)
4733 tic6x_start_unwind_section (unwind->saved_seg, 0);
4734 frag_align (2, 0, 0);
4735 record_alignment (now_seg, 2);
4736 unwind->table_entry = expr_build_dot ();
4737 ptr = frag_more (4);
4738 unwind->frag_start = ptr;
4742 /* Append additional word of data. */
4743 ptr = frag_more (4);
4746 md_number_to_chars (ptr, data, 4);
4749 /* Add a single byte of unwinding data. */
4752 tic6x_unwind_byte (int byte)
4754 tic6x_unwind_info *unwind = tic6x_get_unwind ();
4756 unwind->data_bytes++;
4757 /* Only flush the first word after we know multiple words are required. */
4758 if (unwind->data_bytes == 5)
4760 if (unwind->personality_index == -1)
4762 /* At this point we know we are too big for pr0. */
4763 unwind->personality_index = 1;
4764 tic6x_flush_unwind_word (0x81000000 | ((unwind->data >> 8) & 0xffff));
4765 unwind->data = ((unwind->data & 0xff) << 8) | byte;
4766 unwind->data_bytes++;
4770 tic6x_flush_unwind_word (unwind->data);
4771 unwind->data = byte;
4776 unwind->data = (unwind->data << 8) | byte;
4777 if ((unwind->data_bytes & 3) == 0 && unwind->data_bytes > 4)
4779 tic6x_flush_unwind_word (unwind->data);
4785 /* Add a two-byte unwinding opcode. */
4787 tic6x_unwind_2byte (int bytes)
4789 tic6x_unwind_byte (bytes >> 8);
4790 tic6x_unwind_byte (bytes & 0xff);
4794 tic6x_unwind_uleb (offsetT offset)
4796 while (offset > 0x7f)
4798 tic6x_unwind_byte ((offset & 0x7f) | 0x80);
4801 tic6x_unwind_byte (offset);
4805 tic6x_cfi_startproc (void)
4807 tic6x_unwind_info *unwind = tic6x_get_unwind ();
4809 unwind->personality_index = -1;
4810 unwind->personality_routine = NULL;
4811 if (unwind->table_entry)
4812 as_bad (_("missing .endp before .cfi_startproc"));
4814 unwind->table_entry = NULL;
4815 unwind->data_bytes = -1;
4819 tic6x_output_exidx_entry (void)
4823 unsigned int marked_pr_dependency;
4826 tic6x_unwind_info *unwind = tic6x_get_unwind ();
4829 old_subseg = now_subseg;
4831 /* Add index table entry. This is two words. */
4832 tic6x_start_unwind_section (unwind->saved_seg, 1);
4833 frag_align (2, 0, 0);
4834 record_alignment (now_seg, 2);
4836 ptr = frag_more (8);
4838 where = frag_now_fix () - 8;
4840 /* Self relative offset of the function start. */
4841 fix_new (frag_now, where, 4, unwind->function_start, 0, 1,
4842 BFD_RELOC_C6000_PREL31);
4844 /* Indicate dependency on ABI-defined personality routines to the
4845 linker, if it hasn't been done already. */
4846 marked_pr_dependency
4847 = seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency;
4848 if (unwind->personality_index >= 0 && unwind->personality_index < 5
4849 && !(marked_pr_dependency & (1 << unwind->personality_index)))
4851 static const char *const name[] =
4853 "__c6xabi_unwind_cpp_pr0",
4854 "__c6xabi_unwind_cpp_pr1",
4855 "__c6xabi_unwind_cpp_pr2",
4856 "__c6xabi_unwind_cpp_pr3",
4857 "__c6xabi_unwind_cpp_pr4"
4859 symbolS *pr = symbol_find_or_make (name[unwind->personality_index]);
4860 fix_new (frag_now, where, 0, pr, 0, 1, BFD_RELOC_NONE);
4861 seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency
4862 |= 1 << unwind->personality_index;
4865 if (unwind->table_entry)
4867 /* Self relative offset of the table entry. */
4868 fix_new (frag_now, where + 4, 4, unwind->table_entry, 0, 1,
4869 BFD_RELOC_C6000_PREL31);
4873 /* Inline exception table entry. */
4874 md_number_to_chars (ptr + 4, unwind->data, 4);
4877 /* Restore the original section. */
4878 subseg_set (old_seg, old_subseg);
4882 tic6x_output_unwinding (bfd_boolean need_extab)
4884 tic6x_unwind_info *unwind = tic6x_get_unwind ();
4885 unsigned safe_mask = unwind->safe_mask;
4886 unsigned compact_mask = unwind->compact_mask;
4887 unsigned reg_saved_mask = unwind->reg_saved_mask;
4888 offsetT cfa_offset = unwind->cfa_offset;
4892 if (unwind->personality_index == -2)
4894 /* Function can not be unwound. */
4896 tic6x_output_exidx_entry ();
4900 if (unwind->personality_index == -1 && unwind->personality_routine == NULL)
4902 /* Auto-select a personality routine if none specified. */
4903 if (reg_saved_mask || cfa_offset >= MAX_COMPACT_SP_OFFSET)
4904 unwind->personality_index = -1;
4906 unwind->personality_index = 3;
4908 unwind->personality_index = 4;
4911 /* Calculate unwinding opcodes, and emit to EXTAB if necessary. */
4912 unwind->table_entry = NULL;
4913 if (unwind->personality_index == 3 || unwind->personality_index == 4)
4915 if (cfa_offset >= MAX_COMPACT_SP_OFFSET)
4917 as_bad (_("stack pointer offset too large for personality routine"));
4921 || (unwind->personality_index == 3 && compact_mask != 0)
4922 || (unwind->personality_index == 4 && safe_mask != 0))
4924 as_bad (_("stack frame layout does not match personality routine"));
4928 unwind->data = (1u << 31) | (unwind->personality_index << 24);
4929 if (unwind->cfa_reg == 15)
4930 unwind->data |= 0x7f << 17;
4932 unwind->data |= cfa_offset << (17 - 3);
4934 if (unwind->personality_index == 3)
4935 unwind->data |= safe_mask << 4;
4937 unwind->data |= compact_mask << 4;
4938 unwind->data |= unwind->return_reg;
4939 unwind->data_bytes = 4;
4943 if (unwind->personality_routine)
4946 unwind->data_bytes = 5;
4947 tic6x_flush_unwind_word (0);
4948 /* First word is personality routine. */
4949 where = frag_now_fix () - 4;
4950 fix_new (frag_now, where, 4, unwind->personality_routine, 0, 1,
4951 BFD_RELOC_C6000_PREL31);
4953 else if (unwind->personality_index > 0)
4955 unwind->data = 0x8000 | (unwind->personality_index << 8);
4956 unwind->data_bytes = 2;
4958 else /* pr0 or undecided */
4960 unwind->data = 0x80;
4961 unwind->data_bytes = 1;
4964 if (unwind->return_reg != UNWIND_B3)
4966 tic6x_unwind_byte (UNWIND_OP_RET | unwind->return_reg);
4969 if (unwind->cfa_reg == 15)
4971 tic6x_unwind_byte (UNWIND_OP_MV_FP);
4973 else if (cfa_offset != 0)
4976 if (cfa_offset > 0x80)
4978 tic6x_unwind_byte (UNWIND_OP_ADD_SP2);
4979 tic6x_unwind_uleb (cfa_offset - 0x81);
4981 else if (cfa_offset > 0x40)
4983 tic6x_unwind_byte (UNWIND_OP_ADD_SP | 0x3f);
4984 tic6x_unwind_byte (UNWIND_OP_ADD_SP | (cfa_offset - 0x40));
4988 tic6x_unwind_byte (UNWIND_OP_ADD_SP | (cfa_offset - 1));
4993 tic6x_unwind_2byte (UNWIND_OP2_POP | unwind->safe_mask);
4994 else if (unwind->pop_rts)
4995 tic6x_unwind_byte (UNWIND_OP_POP_RTS);
4996 else if (compact_mask)
4997 tic6x_unwind_2byte (UNWIND_OP2_POP_COMPACT | unwind->compact_mask);
4998 else if (reg_saved_mask)
5004 tic6x_unwind_byte (UNWIND_OP_POP_REG | unwind->saved_reg_count);
5006 for (cur_offset = 0; unwind->saved_reg_count > 0; cur_offset -= 4)
5009 for (reg = 0; reg < TIC6X_NUM_UNWIND_REGS; reg++)
5011 if (!unwind->reg_saved[reg])
5014 if (unwind->reg_offset[reg] == cur_offset)
5016 unwind->saved_reg_count--;
5021 if ((cur_offset & 4) == 4)
5022 tic6x_unwind_byte ((last_val << 4) | val);
5026 if ((cur_offset & 4) == 4)
5027 tic6x_unwind_byte ((last_val << 4) | 0xf);
5030 /* Pad with RETURN opcodes. */
5031 while ((unwind->data_bytes & 3) != 0)
5032 tic6x_unwind_byte (UNWIND_OP_RET | UNWIND_B3);
5034 if (unwind->personality_index == -1 && unwind->personality_routine == NULL)
5035 unwind->personality_index = 0;
5038 /* Force creation of an EXTAB entry if an LSDA is required. */
5039 if (need_extab && !unwind->table_entry)
5041 if (unwind->data_bytes != 4)
5044 tic6x_flush_unwind_word (unwind->data);
5046 else if (unwind->table_entry && !need_extab)
5048 /* Add an empty descriptor if there is no user-specified data. */
5049 char *ptr = frag_more (4);
5050 md_number_to_chars (ptr, 0, 4);
5053 /* Fill in length of unwinding bytecode. */
5054 if (unwind->table_entry)
5057 if (unwind->data_bytes > 0x400)
5058 as_bad (_("too many unwinding instructions"));
5060 if (unwind->personality_index == -1)
5062 tmp = md_chars_to_number (unwind->frag_start + 4, 4);
5063 tmp |= ((unwind->data_bytes - 8) >> 2) << 24;
5064 md_number_to_chars (unwind->frag_start + 4, tmp, 4);
5066 else if (unwind->personality_index == 1 || unwind->personality_index == 2)
5068 tmp = md_chars_to_number (unwind->frag_start, 4);
5069 tmp |= ((unwind->data_bytes - 4) >> 2) << 16;
5070 md_number_to_chars (unwind->frag_start, tmp, 4);
5073 tic6x_output_exidx_entry ();
5076 /* FIXME: This will get horribly confused if cfi directives are emitted for
5077 function epilogue. */
5079 tic6x_cfi_endproc (struct fde_entry *fde)
5081 tic6x_unwind_info *unwind = tic6x_get_unwind ();
5082 struct cfi_insn_data *insn;
5084 unsigned safe_mask = 0;
5085 unsigned compact_mask = 0;
5086 unsigned reg_saved_mask = 0;
5087 offsetT cfa_offset = 0;
5088 offsetT save_offset = 0;
5090 unwind->cfa_reg = 31;
5091 unwind->return_reg = UNWIND_B3;
5092 unwind->saved_reg_count = 0;
5093 unwind->pop_rts = FALSE;
5095 unwind->saved_seg = now_seg;
5096 unwind->saved_subseg = now_subseg;
5098 for (reg = 0; reg < TIC6X_NUM_UNWIND_REGS; reg++)
5099 unwind->reg_saved[reg] = FALSE;
5101 /* Scan FDE instructions to build up stack frame layout. */
5102 for (insn = fde->data; insn; insn = insn->next)
5106 case DW_CFA_advance_loc:
5109 case DW_CFA_def_cfa:
5110 unwind->cfa_reg = insn->u.ri.reg;
5111 cfa_offset = insn->u.ri.offset;
5114 case DW_CFA_def_cfa_register:
5115 unwind->cfa_reg = insn->u.r;
5118 case DW_CFA_def_cfa_offset:
5119 cfa_offset = insn->u.i;
5122 case DW_CFA_undefined:
5123 case DW_CFA_same_value:
5124 reg = tic6x_unwind_reg_from_dwarf (insn->u.r);
5126 unwind->reg_saved[reg] = FALSE;
5130 reg = tic6x_unwind_reg_from_dwarf (insn->u.ri.reg);
5133 as_bad (_("unable to generate unwinding opcode for reg %d"),
5137 unwind->reg_saved[reg] = TRUE;
5138 unwind->reg_offset[reg] = insn->u.ri.offset;
5139 if (insn->u.ri.reg == UNWIND_B3)
5140 unwind->return_reg = UNWIND_B3;
5143 case DW_CFA_register:
5144 if (insn->u.rr.reg1 != 19)
5146 as_bad (_("unable to generate unwinding opcode for reg %d"),
5151 reg = tic6x_unwind_reg_from_dwarf (insn->u.rr.reg2);
5154 as_bad (_("unable to generate unwinding opcode for reg %d"),
5159 unwind->return_reg = reg;
5160 unwind->reg_saved[UNWIND_B3] = FALSE;
5161 if (unwind->reg_saved[reg])
5163 as_bad (_("unable to restore return address from "
5164 "previously restored reg"));
5169 case DW_CFA_restore:
5170 case DW_CFA_remember_state:
5171 case DW_CFA_restore_state:
5172 case DW_CFA_GNU_window_save:
5174 case CFI_val_encoded_addr:
5175 as_bad (_("unhandled CFA insn for unwinding (%d)"), insn->insn);
5183 if (unwind->cfa_reg != 15 && unwind->cfa_reg != 31)
5185 as_bad (_("unable to generate unwinding opcode for frame pointer reg %d"),
5190 if (unwind->cfa_reg == 15)
5192 if (cfa_offset != 0)
5194 as_bad (_("unable to generate unwinding opcode for "
5195 "frame pointer offset"));
5201 if ((cfa_offset & 7) != 0)
5203 as_bad (_("unwound stack pointer not doubleword aligned"));
5208 for (reg = 0; reg < TIC6X_NUM_UNWIND_REGS; reg++)
5210 if (unwind->reg_saved[reg])
5211 reg_saved_mask |= 1 << (TIC6X_NUM_UNWIND_REGS - (reg + 1));
5214 /* Check for standard "safe debug" frame layout */
5218 for (reg = 0; reg < TIC6X_NUM_UNWIND_REGS; reg++)
5220 if (!unwind->reg_saved[reg])
5223 if (target_big_endian
5224 && reg < TIC6X_NUM_UNWIND_REGS - 1
5225 && unwind->reg_saved[reg + 1]
5226 && tic6x_unwind_frame_regs[reg]
5227 == tic6x_unwind_frame_regs[reg + 1] + 1
5228 && (tic6x_unwind_frame_regs[reg] & 1) == 1
5229 && (save_offset & 4) == 4)
5232 if (save_offset != unwind->reg_offset[reg + 1]
5233 || save_offset - 4 != unwind->reg_offset[reg])
5240 if (save_offset != unwind->reg_offset[reg])
5245 if (reg == TIC6X_NUM_UNWIND_REGS)
5247 safe_mask = reg_saved_mask;
5252 /* Check for compact frame layout. */
5256 for (reg = 0; reg < TIC6X_NUM_UNWIND_REGS; reg++)
5260 if (!unwind->reg_saved[reg])
5263 if (reg < TIC6X_NUM_UNWIND_REGS - 1)
5267 if (!unwind->reg_saved[reg2]
5268 || tic6x_unwind_frame_regs[reg]
5269 != tic6x_unwind_frame_regs[reg2] + 1
5270 || (tic6x_unwind_frame_regs[reg2] & 1) != 0
5271 || save_offset == 0)
5280 if (target_big_endian)
5281 high_offset = 4; /* lower address = positive stack offset. */
5285 if (save_offset + 4 - high_offset != unwind->reg_offset[reg]
5286 || save_offset + high_offset != unwind->reg_offset[reg2])
5294 if (save_offset != unwind->reg_offset[reg])
5300 if (reg == TIC6X_NUM_UNWIND_REGS)
5302 compact_mask = reg_saved_mask;
5307 /* Check for __c6xabi_pop_rts format */
5308 if (reg_saved_mask == 0x17ff)
5310 const int *pop_rts_offset = target_big_endian
5311 ? tic6x_pop_rts_offset_big
5312 : tic6x_pop_rts_offset_little;
5315 for (reg = 0; reg < TIC6X_NUM_UNWIND_REGS; reg++)
5317 if (reg == UNWIND_B15)
5320 if (unwind->reg_offset[reg] != pop_rts_offset[reg] * 4)
5324 if (reg == TIC6X_NUM_UNWIND_REGS)
5326 unwind->pop_rts = TRUE;
5330 /* If all else fails then describe the frame manually. */
5335 for (reg = 0; reg < TIC6X_NUM_UNWIND_REGS; reg++)
5337 if (!unwind->reg_saved[reg])
5340 unwind->saved_reg_count++;
5341 /* Encoding uses 4 bits per word, so size of unwinding opcode data
5342 limits the save area size. The exact cap will be figured out
5343 later due to overflow, the 0x800 here is just a quick sanity
5344 check to weed out obviously excessive offsets. */
5345 if (unwind->reg_offset[reg] > 0 || unwind->reg_offset[reg] < -0x800
5346 || (unwind->reg_offset[reg] & 3) != 0)
5348 as_bad (_("stack frame layout too complex for unwinder"));
5352 if (unwind->reg_offset[reg] < save_offset)
5353 save_offset = unwind->reg_offset[reg] - 4;
5357 /* Align to 8-byte boundary (stack grows towards negative offsets). */
5360 if (unwind->cfa_reg == 31 && !reg_saved_mask)
5362 cfa_offset += save_offset;
5365 as_bad (_("unwound frame has negative size"));
5370 unwind->safe_mask = safe_mask;
5371 unwind->compact_mask = compact_mask;
5372 unwind->reg_saved_mask = reg_saved_mask;
5373 unwind->cfa_offset = cfa_offset;
5374 unwind->function_start = fde->start_address;