2011-05-09 Paul Brook <paul@codesourcery.com>
[deliverable/binutils-gdb.git] / gas / config / tc-tic6x.c
1 /* TI C6X assembler.
2 Copyright 2010, 2011
3 Free Software Foundation, Inc.
4 Contributed by Joseph Myers <joseph@codesourcery.com>
5 Bernd Schmidt <bernds@codesourcery.com>
6
7 This file is part of GAS, the GNU Assembler.
8
9 GAS is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3, or (at your option)
12 any later version.
13
14 GAS is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GAS; see the file COPYING. If not, write to the Free
21 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
22 02110-1301, USA. */
23
24 #include "as.h"
25 #include "dwarf2dbg.h"
26 #include "dw2gencfi.h"
27 #include "safe-ctype.h"
28 #include "subsegs.h"
29 #include "opcode/tic6x.h"
30 #include "elf/tic6x.h"
31 #include "elf32-tic6x.h"
32
33 /* Truncate and sign-extend at 32 bits, so that building on a 64-bit
34 host gives identical results to a 32-bit host. */
35 #define TRUNC(X) ((valueT) (X) & 0xffffffffU)
36 #define SEXT(X) ((TRUNC (X) ^ 0x80000000U) - 0x80000000U)
37
38 #define streq(a, b) (strcmp (a, b) == 0)
39
40 /* Stuff for .scomm symbols. */
41 static segT sbss_section;
42 static asection scom_section;
43 static asymbol scom_symbol;
44
45 const char comment_chars[] = ";";
46 const char line_comment_chars[] = "#*;";
47 const char line_separator_chars[] = "@";
48
49 const char EXP_CHARS[] = "eE";
50 const char FLT_CHARS[] = "dDfF";
51
52 const char *md_shortopts = "";
53
54 enum
55 {
56 OPTION_MARCH = OPTION_MD_BASE,
57 OPTION_MBIG_ENDIAN,
58 OPTION_MLITTLE_ENDIAN,
59 OPTION_MDSBT,
60 OPTION_MNO_DSBT,
61 OPTION_MPID,
62 OPTION_MPIC,
63 OPTION_MNO_PIC,
64 OPTION_MGENERATE_REL
65 };
66
67 struct option md_longopts[] =
68 {
69 { "march", required_argument, NULL, OPTION_MARCH },
70 { "mbig-endian", no_argument, NULL, OPTION_MBIG_ENDIAN },
71 { "mlittle-endian", no_argument, NULL, OPTION_MLITTLE_ENDIAN },
72 { "mdsbt", no_argument, NULL, OPTION_MDSBT },
73 { "mno-dsbt", no_argument, NULL, OPTION_MNO_DSBT },
74 { "mpid", required_argument, NULL, OPTION_MPID },
75 { "mpic", no_argument, NULL, OPTION_MPIC },
76 { "mno-pic", no_argument, NULL, OPTION_MNO_PIC },
77 { "mgenerate-rel", no_argument, NULL, OPTION_MGENERATE_REL },
78 { NULL, no_argument, NULL, 0 }
79 };
80 size_t md_longopts_size = sizeof (md_longopts);
81
82 /* The instructions enabled based only on the selected architecture
83 (all instructions, if no architecture specified). */
84 static unsigned short tic6x_arch_enable = (TIC6X_INSN_C62X
85 | TIC6X_INSN_C64X
86 | TIC6X_INSN_C64XP
87 | TIC6X_INSN_C67X
88 | TIC6X_INSN_C67XP
89 | TIC6X_INSN_C674X);
90
91 /* The instructions enabled based on the current set of features
92 (architecture, as modified by other options). */
93 static unsigned short tic6x_features;
94
95 /* The architecture attribute value, or C6XABI_Tag_ISA_none if
96 not yet set. */
97 static int tic6x_arch_attribute = C6XABI_Tag_ISA_none;
98
99 /* Whether any instructions at all have been seen. Once any
100 instructions have been seen, architecture attributes merge into the
101 previous attribute value rather than replacing it. */
102 static bfd_boolean tic6x_seen_insns = FALSE;
103
104 /* The number of registers in each register file supported by the
105 current architecture. */
106 static unsigned int tic6x_num_registers;
107
108 /* Whether predication on A0 is possible. */
109 static bfd_boolean tic6x_predicate_a0;
110
111 /* Whether execute packets can cross fetch packet boundaries. */
112 static bfd_boolean tic6x_can_cross_fp_boundary;
113
114 /* Whether there are constraints on simultaneous reads and writes of
115 40-bit data. */
116 static bfd_boolean tic6x_long_data_constraints;
117
118 /* Whether compact instructions are available. */
119 static bfd_boolean tic6x_compact_insns;
120
121 /* Whether to generate RELA relocations. */
122 static bfd_boolean tic6x_generate_rela = TRUE;
123
124 /* Whether the code uses DSBT addressing. */
125 static bfd_boolean tic6x_dsbt;
126
127 /* Types of position-independent data (attribute values for
128 Tag_ABI_PID). */
129 typedef enum
130 {
131 tic6x_pid_no = 0,
132 tic6x_pid_near = 1,
133 tic6x_pid_far = 2
134 } tic6x_pid_type;
135
136 /* The type of data addressing used in this code. */
137 static tic6x_pid_type tic6x_pid;
138
139 /* Whether the code uses position-independent code. */
140 static bfd_boolean tic6x_pic;
141
142 /* Table of supported architecture variants. */
143 typedef struct
144 {
145 const char *arch;
146 int attr;
147 unsigned short features;
148 } tic6x_arch_table;
149 static const tic6x_arch_table tic6x_arches[] =
150 {
151 { "c62x", C6XABI_Tag_ISA_C62X, TIC6X_INSN_C62X },
152 { "c64x", C6XABI_Tag_ISA_C64X, TIC6X_INSN_C62X | TIC6X_INSN_C64X },
153 { "c64x+", C6XABI_Tag_ISA_C64XP, (TIC6X_INSN_C62X
154 | TIC6X_INSN_C64X
155 | TIC6X_INSN_C64XP) },
156 { "c67x", C6XABI_Tag_ISA_C67X, TIC6X_INSN_C62X | TIC6X_INSN_C67X },
157 { "c67x+", C6XABI_Tag_ISA_C67XP, (TIC6X_INSN_C62X
158 | TIC6X_INSN_C67X
159 | TIC6X_INSN_C67XP) },
160 { "c674x", C6XABI_Tag_ISA_C674X, (TIC6X_INSN_C62X
161 | TIC6X_INSN_C64X
162 | TIC6X_INSN_C64XP
163 | TIC6X_INSN_C67X
164 | TIC6X_INSN_C67XP
165 | TIC6X_INSN_C674X) }
166 };
167
168 /* Caller saved register encodings. The standard frame layout uses this
169 order, starting from the highest address. There must be
170 TIC6X_NUM_UNWIND_REGS values. */
171 enum
172 {
173 UNWIND_A15,
174 UNWIND_B15,
175 UNWIND_B14,
176 UNWIND_B13,
177 UNWIND_B12,
178 UNWIND_B11,
179 UNWIND_B10,
180 UNWIND_B3,
181 UNWIND_A14,
182 UNWIND_A13,
183 UNWIND_A12,
184 UNWIND_A11,
185 UNWIND_A10
186 };
187
188 static void tic6x_output_unwinding (bfd_boolean need_extab);
189
190 /* Return the frame unwind state for the current function, allocating
191 as necessary. */
192
193 static tic6x_unwind_info *tic6x_get_unwind (void)
194 {
195 tic6x_unwind_info *unwind;
196
197 unwind = seg_info (now_seg)->tc_segment_info_data.unwind;
198 if (unwind)
199 return unwind;
200
201 unwind = seg_info (now_seg)->tc_segment_info_data.text_unwind;
202 if (unwind)
203 return unwind;
204
205 unwind = (tic6x_unwind_info *)xmalloc (sizeof (tic6x_unwind_info));
206 seg_info (now_seg)->tc_segment_info_data.unwind = unwind;
207 memset (unwind, 0, sizeof (*unwind));
208 return unwind;
209 }
210
211 /* Update the selected architecture based on ARCH, giving an error if
212 ARCH is an invalid value. Does not call tic6x_update_features; the
213 caller must do that if necessary. */
214
215 static void
216 tic6x_use_arch (const char *arch)
217 {
218 unsigned int i;
219
220 for (i = 0; i < ARRAY_SIZE (tic6x_arches); i++)
221 if (strcmp (arch, tic6x_arches[i].arch) == 0)
222 {
223 tic6x_arch_enable = tic6x_arches[i].features;
224 if (tic6x_seen_insns)
225 tic6x_arch_attribute
226 = elf32_tic6x_merge_arch_attributes (tic6x_arch_attribute,
227 tic6x_arches[i].attr);
228 else
229 tic6x_arch_attribute = tic6x_arches[i].attr;
230 return;
231 }
232
233 as_bad (_("unknown architecture '%s'"), arch);
234 }
235
236 /* Table of supported -mpid arguments. */
237 typedef struct
238 {
239 const char *arg;
240 tic6x_pid_type attr;
241 } tic6x_pid_type_table;
242 static const tic6x_pid_type_table tic6x_pid_types[] =
243 {
244 { "no", tic6x_pid_no },
245 { "near", tic6x_pid_near },
246 { "far", tic6x_pid_far }
247 };
248
249 /* Handle -mpid=ARG. */
250
251 static void
252 tic6x_use_pid (const char *arg)
253 {
254 unsigned int i;
255
256 for (i = 0; i < ARRAY_SIZE (tic6x_pid_types); i++)
257 if (strcmp (arg, tic6x_pid_types[i].arg) == 0)
258 {
259 tic6x_pid = tic6x_pid_types[i].attr;
260 return;
261 }
262
263 as_bad (_("unknown -mpid= argument '%s'"), arg);
264 }
265
266 /* Parse a target-specific option. */
267
268 int
269 md_parse_option (int c, char *arg)
270 {
271 switch (c)
272 {
273 case OPTION_MARCH:
274 tic6x_use_arch (arg);
275 break;
276
277 case OPTION_MBIG_ENDIAN:
278 target_big_endian = 1;
279 break;
280
281 case OPTION_MLITTLE_ENDIAN:
282 target_big_endian = 0;
283 break;
284
285 case OPTION_MDSBT:
286 tic6x_dsbt = 1;
287 break;
288
289 case OPTION_MNO_DSBT:
290 tic6x_dsbt = 0;
291 break;
292
293 case OPTION_MPID:
294 tic6x_use_pid (arg);
295 break;
296
297 case OPTION_MPIC:
298 tic6x_pic = 1;
299 break;
300
301 case OPTION_MNO_PIC:
302 tic6x_pic = 0;
303 break;
304
305 case OPTION_MGENERATE_REL:
306 tic6x_generate_rela = FALSE;
307 break;
308
309 default:
310 return 0;
311 }
312 return 1;
313 }
314
315 void
316 md_show_usage (FILE *stream ATTRIBUTE_UNUSED)
317 {
318 unsigned int i;
319
320 fputc ('\n', stream);
321 fprintf (stream, _("TMS320C6000 options:\n"));
322 fprintf (stream, _(" -march=ARCH enable instructions from architecture ARCH\n"));
323 fprintf (stream, _(" -mbig-endian generate big-endian code\n"));
324 fprintf (stream, _(" -mlittle-endian generate little-endian code\n"));
325 fprintf (stream, _(" -mdsbt code uses DSBT addressing\n"));
326 fprintf (stream, _(" -mno-dsbt code does not use DSBT addressing\n"));
327 fprintf (stream, _(" -mpid=no code uses position-dependent data addressing\n"));
328 fprintf (stream, _(" -mpid=near code uses position-independent data addressing,\n"
329 " GOT accesses use near DP addressing\n"));
330 fprintf (stream, _(" -mpid=far code uses position-independent data addressing,\n"
331 " GOT accesses use far DP addressing\n"));
332 fprintf (stream, _(" -mpic code addressing is position-independent\n"));
333 fprintf (stream, _(" -mno-pic code addressing is position-dependent\n"));
334 /* -mgenerate-rel is only for testsuite use and is deliberately
335 undocumented. */
336
337 fputc ('\n', stream);
338 fprintf (stream, _("Supported ARCH values are:"));
339 for (i = 0; i < ARRAY_SIZE (tic6x_arches); i++)
340 fprintf (stream, " %s", tic6x_arches[i].arch);
341 fputc ('\n', stream);
342 }
343
344 /* Update enabled features based on the current architecture and
345 related settings. */
346 static void
347 tic6x_update_features (void)
348 {
349 tic6x_features = tic6x_arch_enable;
350
351 tic6x_num_registers
352 = (tic6x_arch_enable & (TIC6X_INSN_C64X | TIC6X_INSN_C67XP)) ? 32 : 16;
353
354 tic6x_predicate_a0 = (tic6x_arch_enable & TIC6X_INSN_C64X) ? TRUE : FALSE;
355
356 tic6x_can_cross_fp_boundary
357 = (tic6x_arch_enable
358 & (TIC6X_INSN_C64X | TIC6X_INSN_C67XP)) ? TRUE : FALSE;
359
360 tic6x_long_data_constraints
361 = (tic6x_arch_enable & TIC6X_INSN_C64X) ? FALSE : TRUE;
362
363 tic6x_compact_insns = (tic6x_arch_enable & TIC6X_INSN_C64XP) ? TRUE : FALSE;
364 }
365
366 /* Do configuration after all options have been parsed. */
367
368 void
369 tic6x_after_parse_args (void)
370 {
371 tic6x_update_features ();
372 }
373
374 /* Parse a .cantunwind directive. */
375 static void
376 s_tic6x_cantunwind (int ignored ATTRIBUTE_UNUSED)
377 {
378 tic6x_unwind_info *unwind = tic6x_get_unwind ();
379
380 /* GCC sometimes spits out superfluous .cantunwind directives, so ignore
381 them. */
382 if (unwind->data_bytes == 0)
383 return;
384
385 if (unwind->data_bytes != -1)
386 {
387 as_bad (_("unexpected .cantunwind directive"));
388 return;
389 }
390
391 demand_empty_rest_of_line ();
392
393 if (unwind->personality_routine || unwind->personality_index != -1)
394 as_bad (_("personality routine specified for cantunwind frame"));
395
396 unwind->personality_index = -2;
397 }
398
399 /* Parse a .handlerdata directive. */
400 static void
401 s_tic6x_handlerdata (int ignored ATTRIBUTE_UNUSED)
402 {
403 tic6x_unwind_info *unwind = tic6x_get_unwind ();
404
405 if (!unwind->saved_seg)
406 {
407 as_bad (_("unexpected .handlerdata directive"));
408 return;
409 }
410
411 if (unwind->table_entry || unwind->personality_index == -2)
412 {
413 as_bad (_("duplicate .handlerdata directive"));
414 return;
415 }
416
417 if (unwind->personality_index == -1 && unwind->personality_routine == NULL)
418 {
419 as_bad (_("personality routine required before .handlerdata directive"));
420 return;
421 }
422
423 tic6x_output_unwinding (TRUE);
424 }
425
426 /* Parse a .endp directive. */
427 static void
428 s_tic6x_endp (int ignored ATTRIBUTE_UNUSED)
429 {
430 tic6x_unwind_info *unwind = tic6x_get_unwind ();
431
432 if (unwind->data_bytes != 0)
433 {
434 /* Output a .exidx entry if we have not already done so.
435 Then switch back to the text section. */
436 if (!unwind->table_entry)
437 tic6x_output_unwinding (FALSE);
438
439 subseg_set (unwind->saved_seg, unwind->saved_subseg);
440 }
441
442 unwind->saved_seg = NULL;
443 unwind->table_entry = NULL;
444 unwind->data_bytes = 0;
445 }
446
447 /* Parse a .personalityindex directive. */
448 static void
449 s_tic6x_personalityindex (int ignored ATTRIBUTE_UNUSED)
450 {
451 tic6x_unwind_info *unwind = tic6x_get_unwind ();
452 expressionS exp;
453
454 if (unwind->personality_routine || unwind->personality_index != -1)
455 as_bad (_("duplicate .personalityindex directive"));
456
457 expression (&exp);
458
459 if (exp.X_op != O_constant
460 || exp.X_add_number < 0 || exp.X_add_number > 15)
461 {
462 as_bad (_("bad personality routine number"));
463 ignore_rest_of_line ();
464 return;
465 }
466
467 unwind->personality_index = exp.X_add_number;
468
469 demand_empty_rest_of_line ();
470 }
471
472 static void
473 s_tic6x_personality (int ignored ATTRIBUTE_UNUSED)
474 {
475 char *name, *p, c;
476 tic6x_unwind_info *unwind = tic6x_get_unwind ();
477
478 if (unwind->personality_routine || unwind->personality_index != -1)
479 as_bad (_("duplicate .personality directive"));
480
481 name = input_line_pointer;
482 c = get_symbol_end ();
483 p = input_line_pointer;
484 unwind->personality_routine = symbol_find_or_make (name);
485 *p = c;
486 demand_empty_rest_of_line ();
487 }
488
489 /* Parse a .arch directive. */
490 static void
491 s_tic6x_arch (int ignored ATTRIBUTE_UNUSED)
492 {
493 char c;
494 char *arch;
495
496 arch = input_line_pointer;
497 while (*input_line_pointer && !ISSPACE (*input_line_pointer))
498 input_line_pointer++;
499 c = *input_line_pointer;
500 *input_line_pointer = 0;
501
502 tic6x_use_arch (arch);
503 tic6x_update_features ();
504 *input_line_pointer = c;
505 demand_empty_rest_of_line ();
506 }
507
508 /* Parse a .ehtype directive. */
509
510 static void
511 s_tic6x_ehtype (int ignored ATTRIBUTE_UNUSED)
512 {
513 expressionS exp;
514 char *p;
515
516 #ifdef md_flush_pending_output
517 md_flush_pending_output ();
518 #endif
519
520 if (is_it_end_of_statement ())
521 {
522 demand_empty_rest_of_line ();
523 return;
524 }
525
526 #ifdef md_cons_align
527 md_cons_align (4);
528 #endif
529
530
531 expression (&exp);
532
533 if (exp.X_op != O_symbol)
534 {
535 as_bad (_("expected symbol"));
536 return;
537 }
538
539 p = frag_more (4);
540 fix_new_exp (frag_now, p - frag_now->fr_literal, 4,
541 &exp, 0, BFD_RELOC_C6000_EHTYPE);
542
543 demand_empty_rest_of_line ();
544 }
545
546 /* Parse a .nocmp directive. */
547
548 static void
549 s_tic6x_nocmp (int ignored ATTRIBUTE_UNUSED)
550 {
551 seg_info (now_seg)->tc_segment_info_data.nocmp = TRUE;
552 demand_empty_rest_of_line ();
553 }
554
555 /* .scomm pseudo-op handler.
556
557 This is a new pseudo-op to handle putting objects in .scommon.
558 By doing this the linker won't need to do any work,
559 and more importantly it removes the implicit -G arg necessary to
560 correctly link the object file. */
561
562 static void
563 s_tic6x_scomm (int ignore ATTRIBUTE_UNUSED)
564 {
565 char *name;
566 char c;
567 char *p;
568 offsetT size;
569 symbolS *symbolP;
570 offsetT align;
571 int align2;
572
573 name = input_line_pointer;
574 c = get_symbol_end ();
575
576 /* Just after name is now '\0'. */
577 p = input_line_pointer;
578 *p = c;
579 SKIP_WHITESPACE ();
580 if (*input_line_pointer != ',')
581 {
582 as_bad (_("expected comma after symbol name"));
583 ignore_rest_of_line ();
584 return;
585 }
586
587 /* Skip ','. */
588 input_line_pointer++;
589 if ((size = get_absolute_expression ()) < 0)
590 {
591 /* xgettext:c-format */
592 as_warn (_("invalid length for .scomm directive"));
593 ignore_rest_of_line ();
594 return;
595 }
596
597 /* The third argument to .scomm is the alignment. */
598 if (*input_line_pointer != ',')
599 align = 8;
600 else
601 {
602 ++input_line_pointer;
603 align = get_absolute_expression ();
604 if (align <= 0)
605 {
606 as_warn (_("alignment is not a positive number"));
607 align = 8;
608 }
609 }
610
611 /* Convert to a power of 2 alignment. */
612 if (align)
613 {
614 for (align2 = 0; (align & 1) == 0; align >>= 1, ++align2)
615 continue;
616 if (align != 1)
617 {
618 as_bad (_("alignment is not a power of 2"));
619 ignore_rest_of_line ();
620 return;
621 }
622 }
623 else
624 align2 = 0;
625
626 *p = 0;
627 symbolP = symbol_find_or_make (name);
628 *p = c;
629
630 if (S_IS_DEFINED (symbolP))
631 {
632 /* xgettext:c-format */
633 as_bad (_("attempt to re-define symbol `%s'"),
634 S_GET_NAME (symbolP));
635 ignore_rest_of_line ();
636 return;
637 }
638
639 if (S_GET_VALUE (symbolP) && S_GET_VALUE (symbolP) != (valueT) size)
640 {
641 /* xgettext:c-format */
642 as_bad (_("attempt to redefine `%s' with a different length"),
643 S_GET_NAME (symbolP));
644
645 ignore_rest_of_line ();
646 return;
647 }
648
649 if (symbol_get_obj (symbolP)->local)
650 {
651 segT old_sec = now_seg;
652 int old_subsec = now_subseg;
653 char *pfrag;
654
655 record_alignment (sbss_section, align2);
656 subseg_set (sbss_section, 0);
657
658 if (align2)
659 frag_align (align2, 0, 0);
660
661 if (S_GET_SEGMENT (symbolP) == sbss_section)
662 symbol_get_frag (symbolP)->fr_symbol = 0;
663
664 symbol_set_frag (symbolP, frag_now);
665
666 pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP, size,
667 (char *) 0);
668 *pfrag = 0;
669 S_SET_SIZE (symbolP, size);
670 S_SET_SEGMENT (symbolP, sbss_section);
671 S_CLEAR_EXTERNAL (symbolP);
672 subseg_set (old_sec, old_subsec);
673 }
674 else
675 {
676 S_SET_VALUE (symbolP, (valueT) size);
677 S_SET_ALIGN (symbolP, 1 << align2);
678 S_SET_EXTERNAL (symbolP);
679 S_SET_SEGMENT (symbolP, &scom_section);
680 }
681
682 symbol_get_bfdsym (symbolP)->flags |= BSF_OBJECT;
683
684 demand_empty_rest_of_line ();
685 }
686
687 /* Track for each attribute whether it has been set explicitly (and so
688 should not have a default value set by the assembler). */
689 static bfd_boolean tic6x_attributes_set_explicitly[NUM_KNOWN_OBJ_ATTRIBUTES];
690
691 /* Parse a .c6xabi_attribute directive. */
692
693 static void
694 s_tic6x_c6xabi_attribute (int ignored ATTRIBUTE_UNUSED)
695 {
696 int tag = s_vendor_attribute (OBJ_ATTR_PROC);
697
698 if (tag < NUM_KNOWN_OBJ_ATTRIBUTES)
699 tic6x_attributes_set_explicitly[tag] = TRUE;
700 }
701
702 typedef struct
703 {
704 const char *name;
705 int tag;
706 } tic6x_attribute_table;
707
708 static const tic6x_attribute_table tic6x_attributes[] =
709 {
710 #define TAG(tag, value) { #tag, tag },
711 #include "elf/tic6x-attrs.h"
712 #undef TAG
713 };
714
715 /* Convert an attribute name to a number. */
716
717 int
718 tic6x_convert_symbolic_attribute (const char *name)
719 {
720 unsigned int i;
721
722 for (i = 0; i < ARRAY_SIZE (tic6x_attributes); i++)
723 if (strcmp (name, tic6x_attributes[i].name) == 0)
724 return tic6x_attributes[i].tag;
725
726 return -1;
727 }
728
729 const pseudo_typeS md_pseudo_table[] =
730 {
731 { "arch", s_tic6x_arch, 0 },
732 { "c6xabi_attribute", s_tic6x_c6xabi_attribute, 0 },
733 { "nocmp", s_tic6x_nocmp, 0 },
734 { "scomm", s_tic6x_scomm, 0 },
735 { "word", cons, 4 },
736 { "ehtype", s_tic6x_ehtype, 0 },
737 { "endp", s_tic6x_endp, 0 },
738 { "handlerdata", s_tic6x_handlerdata, 0 },
739 { "personalityindex", s_tic6x_personalityindex, 0 },
740 { "personality", s_tic6x_personality, 0 },
741 { "cantunwind", s_tic6x_cantunwind, 0 },
742 { 0, 0, 0 }
743 };
744
745 /* Hash table of opcodes. For each opcode name, this stores a pointer
746 to a tic6x_opcode_list listing (in an arbitrary order) all opcode
747 table entries with that name. */
748 static struct hash_control *opcode_hash;
749
750 /* Initialize the assembler (called once at assembler startup). */
751
752 void
753 md_begin (void)
754 {
755 tic6x_opcode_id id;
756 flagword applicable;
757 segT seg;
758 subsegT subseg;
759
760 bfd_set_arch_mach (stdoutput, TARGET_ARCH, 0);
761
762 /* Insert opcodes into the hash table. */
763 opcode_hash = hash_new ();
764 for (id = 0; id < tic6x_opcode_max; id++)
765 {
766 const char *errmsg;
767 tic6x_opcode_list *opc = xmalloc (sizeof (tic6x_opcode_list));
768
769 opc->id = id;
770 opc->next = hash_find (opcode_hash, tic6x_opcode_table[id].name);
771 if ((errmsg = hash_jam (opcode_hash, tic6x_opcode_table[id].name, opc))
772 != NULL)
773 as_fatal ("%s", _(errmsg));
774 }
775
776 /* Save the current subseg so we can restore it [it's the default one and
777 we don't want the initial section to be .sbss]. */
778 seg = now_seg;
779 subseg = now_subseg;
780
781 /* The sbss section is for local .scomm symbols. */
782 sbss_section = subseg_new (".bss", 0);
783 seg_info (sbss_section)->bss = 1;
784
785 /* This is copied from perform_an_assembly_pass. */
786 applicable = bfd_applicable_section_flags (stdoutput);
787 bfd_set_section_flags (stdoutput, sbss_section, applicable & SEC_ALLOC);
788
789 subseg_set (seg, subseg);
790
791 /* We must construct a fake section similar to bfd_com_section
792 but with the name .scommon. */
793 scom_section = bfd_com_section;
794 scom_section.name = ".scommon";
795 scom_section.output_section = & scom_section;
796 scom_section.symbol = & scom_symbol;
797 scom_section.symbol_ptr_ptr = & scom_section.symbol;
798 scom_symbol = * bfd_com_section.symbol;
799 scom_symbol.name = ".scommon";
800 scom_symbol.section = & scom_section;
801 }
802
803 /* Whether the current line being parsed had the "||" parallel bars. */
804 static bfd_boolean tic6x_line_parallel;
805
806 /* Whether the current line being parsed started "||^" to indicate an
807 SPMASKed parallel instruction. */
808 static bfd_boolean tic6x_line_spmask;
809
810 /* If the current line being parsed had an instruction predicate, the
811 creg value for that predicate (which must be nonzero); otherwise
812 0. */
813 static unsigned int tic6x_line_creg;
814
815 /* If the current line being parsed had an instruction predicate, the
816 z value for that predicate; otherwise 0. */
817 static unsigned int tic6x_line_z;
818
819 /* Return 1 (updating input_line_pointer as appropriate) if the line
820 starting with C (immediately before input_line_pointer) starts with
821 pre-opcode text appropriate for this target, 0 otherwise. */
822
823 int
824 tic6x_unrecognized_line (int c)
825 {
826 char *p, *endp;
827 unsigned int z;
828 bfd_boolean areg;
829 bfd_boolean bad_predicate;
830
831 switch (c)
832 {
833 case '|':
834 if (input_line_pointer[0] == '|')
835 {
836 if (input_line_pointer[1] == '^')
837 {
838 tic6x_line_spmask = TRUE;
839 input_line_pointer += 2;
840 }
841 else
842 input_line_pointer += 1;
843 if (tic6x_line_parallel)
844 as_bad (_("multiple '||' on same line"));
845 tic6x_line_parallel = TRUE;
846 if (tic6x_line_creg)
847 as_bad (_("'||' after predicate"));
848 return 1;
849 }
850 return 0;
851
852 case '[':
853 /* If it doesn't look like a predicate at all, just return 0.
854 If it looks like one but not a valid one, give a better
855 error. */
856 p = input_line_pointer;
857 while (*p != ']' && !is_end_of_line[(unsigned char) *p])
858 p++;
859 if (*p != ']')
860 return 0;
861 endp = p + 1;
862 p = input_line_pointer;
863 z = 0;
864 bad_predicate = FALSE;
865 if (*p == '!')
866 {
867 z = 1;
868 p++;
869 }
870 if (*p == 'A' || *p == 'a')
871 areg = TRUE;
872 else if (*p == 'B' || *p == 'b')
873 areg = FALSE;
874 else
875 {
876 areg = TRUE; /* Avoid uninitialized warning. */
877 bad_predicate = TRUE;
878 }
879 if (!bad_predicate)
880 {
881 p++;
882 if (*p != '0' && *p != '1' && *p != '2')
883 bad_predicate = TRUE;
884 else if (p[1] != ']')
885 bad_predicate = TRUE;
886 else
887 input_line_pointer = p + 2;
888 }
889
890 if (tic6x_line_creg)
891 as_bad (_("multiple predicates on same line"));
892
893 if (bad_predicate)
894 {
895 char ctmp = *endp;
896 *endp = 0;
897 as_bad (_("bad predicate '%s'"), input_line_pointer - 1);
898 *endp = ctmp;
899 input_line_pointer = endp;
900 return 1;
901 }
902
903 switch (*p)
904 {
905 case '0':
906 tic6x_line_creg = (areg ? 6 : 1);
907 if (areg && !tic6x_predicate_a0)
908 as_bad (_("predication on A0 not supported on this architecture"));
909 break;
910
911 case '1':
912 tic6x_line_creg = (areg ? 4 : 2);
913 break;
914
915 case '2':
916 tic6x_line_creg = (areg ? 5 : 3);
917 break;
918
919 default:
920 abort ();
921 }
922
923 tic6x_line_z = z;
924 return 1;
925
926 default:
927 return 0;
928 }
929 }
930
931 /* Do any target-specific handling of a label required. */
932
933 void
934 tic6x_frob_label (symbolS *sym)
935 {
936 segment_info_type *si;
937 tic6x_label_list *list;
938
939 if (tic6x_line_parallel)
940 {
941 as_bad (_("label after '||'"));
942 tic6x_line_parallel = FALSE;
943 tic6x_line_spmask = FALSE;
944 }
945 if (tic6x_line_creg)
946 {
947 as_bad (_("label after predicate"));
948 tic6x_line_creg = 0;
949 tic6x_line_z = 0;
950 }
951
952 si = seg_info (now_seg);
953 list = si->tc_segment_info_data.label_list;
954 si->tc_segment_info_data.label_list = xmalloc (sizeof (tic6x_label_list));
955 si->tc_segment_info_data.label_list->next = list;
956 si->tc_segment_info_data.label_list->label = sym;
957
958 /* Defining tc_frob_label overrides the ELF definition of
959 obj_frob_label, so we need to apply its effects here. */
960 dwarf2_emit_label (sym);
961 }
962
963 /* At end-of-line, give errors for start-of-line decorations that
964 needed an instruction but were not followed by one. */
965
966 static void
967 tic6x_end_of_line (void)
968 {
969 if (tic6x_line_parallel)
970 {
971 as_bad (_("'||' not followed by instruction"));
972 tic6x_line_parallel = FALSE;
973 tic6x_line_spmask = FALSE;
974 }
975 if (tic6x_line_creg)
976 {
977 as_bad (_("predicate not followed by instruction"));
978 tic6x_line_creg = 0;
979 tic6x_line_z = 0;
980 }
981 }
982
983 /* Do any target-specific handling of the start of a logical line. */
984
985 void
986 tic6x_start_line_hook (void)
987 {
988 tic6x_end_of_line ();
989 }
990
991 /* Do target-specific handling immediately after an input file from
992 the command line, and any other inputs it includes, have been
993 read. */
994
995 void
996 tic6x_cleanup (void)
997 {
998 tic6x_end_of_line ();
999 }
1000
1001 /* Do target-specific initialization after arguments have been
1002 processed and the output file created. */
1003
1004 void
1005 tic6x_init_after_args (void)
1006 {
1007 elf32_tic6x_set_use_rela_p (stdoutput, tic6x_generate_rela);
1008 }
1009
1010 /* Free LIST of labels (possibly NULL). */
1011
1012 static void
1013 tic6x_free_label_list (tic6x_label_list *list)
1014 {
1015 while (list)
1016 {
1017 tic6x_label_list *old = list;
1018
1019 list = list->next;
1020 free (old);
1021 }
1022 }
1023
1024 /* Handle a data alignment of N bytes. */
1025
1026 void
1027 tic6x_cons_align (int n ATTRIBUTE_UNUSED)
1028 {
1029 segment_info_type *seginfo = seg_info (now_seg);
1030
1031 /* Data means there is no current execute packet, and that any label
1032 applies to that data rather than a subsequent instruction. */
1033 tic6x_free_label_list (seginfo->tc_segment_info_data.label_list);
1034 seginfo->tc_segment_info_data.label_list = NULL;
1035 seginfo->tc_segment_info_data.execute_packet_frag = NULL;
1036 seginfo->tc_segment_info_data.last_insn_lsb = NULL;
1037 seginfo->tc_segment_info_data.spmask_addr = NULL;
1038 seginfo->tc_segment_info_data.func_units_used = 0;
1039 }
1040
1041 /* Handle an alignment directive. Return TRUE if the
1042 machine-independent frag generation should be skipped. */
1043
1044 bfd_boolean
1045 tic6x_do_align (int n, char *fill, int len ATTRIBUTE_UNUSED, int max)
1046 {
1047 /* Given code alignments of 4, 8, 16 or 32 bytes, we try to handle
1048 them in the md_end pass by inserting NOPs in parallel with
1049 previous instructions. We only do this in sections containing
1050 nothing but instructions. Code alignments of 1 or 2 bytes have
1051 no effect in such sections (but we record them with
1052 machine-dependent frags anyway so they can be skipped or
1053 converted to machine-independent), while those of more than 64
1054 bytes cannot reliably be handled in this way. */
1055 if (n > 0
1056 && max >= 0
1057 && max < (1 << n)
1058 && !need_pass_2
1059 && fill == NULL
1060 && subseg_text_p (now_seg))
1061 {
1062 fragS *align_frag;
1063 char *p;
1064
1065 if (n > 5)
1066 return FALSE;
1067
1068 /* Machine-independent code would generate a frag here, but we
1069 wish to handle it in a machine-dependent way. */
1070 if (frag_now_fix () != 0)
1071 {
1072 if (frag_now->fr_type != rs_machine_dependent)
1073 frag_wane (frag_now);
1074
1075 frag_new (0);
1076 }
1077 frag_grow (32);
1078 align_frag = frag_now;
1079 p = frag_var (rs_machine_dependent, 32, 32, max, NULL, n, NULL);
1080 /* This must be the same as the frag to which a pointer was just
1081 saved. */
1082 if (p != align_frag->fr_literal)
1083 abort ();
1084 align_frag->tc_frag_data.is_insns = FALSE;
1085 return TRUE;
1086 }
1087 else
1088 return FALSE;
1089 }
1090
1091 /* Types of operand for parsing purposes. These are used as bit-masks
1092 to tell tic6x_parse_operand what forms of operand are
1093 permitted. */
1094 #define TIC6X_OP_EXP 0x0001u
1095 #define TIC6X_OP_REG 0x0002u
1096 #define TIC6X_OP_REGPAIR 0x0004u
1097 #define TIC6X_OP_IRP 0x0008u
1098 #define TIC6X_OP_NRP 0x0010u
1099 /* With TIC6X_OP_MEM_NOUNREG, the contents of a () offset are always
1100 interpreted as an expression, which may be a symbol with the same
1101 name as a register that ends up being implicitly DP-relative. With
1102 TIC6X_OP_MEM_UNREG, the contents of a () offset are interpreted as
1103 a register if they match one, and failing that as an expression,
1104 which must be constant. */
1105 #define TIC6X_OP_MEM_NOUNREG 0x0020u
1106 #define TIC6X_OP_MEM_UNREG 0x0040u
1107 #define TIC6X_OP_CTRL 0x0080u
1108 #define TIC6X_OP_FUNC_UNIT 0x0100u
1109
1110 /* A register or register pair read by the assembler. */
1111 typedef struct
1112 {
1113 /* The side the register is on (1 or 2). */
1114 unsigned int side;
1115 /* The register number (0 to 31). */
1116 unsigned int num;
1117 } tic6x_register;
1118
1119 /* Types of modification of a base address. */
1120 typedef enum
1121 {
1122 tic6x_mem_mod_none,
1123 tic6x_mem_mod_plus,
1124 tic6x_mem_mod_minus,
1125 tic6x_mem_mod_preinc,
1126 tic6x_mem_mod_predec,
1127 tic6x_mem_mod_postinc,
1128 tic6x_mem_mod_postdec
1129 } tic6x_mem_mod;
1130
1131 /* Scaled [] or unscaled () nature of an offset. */
1132 typedef enum
1133 {
1134 tic6x_offset_none,
1135 tic6x_offset_scaled,
1136 tic6x_offset_unscaled
1137 } tic6x_mem_scaling;
1138
1139 /* A memory operand read by the assembler. */
1140 typedef struct
1141 {
1142 /* The base register. */
1143 tic6x_register base_reg;
1144 /* How the base register is modified. */
1145 tic6x_mem_mod mod;
1146 /* Whether there is an offset (required with plain "+" and "-"), and
1147 whether it is scaled or unscaled if so. */
1148 tic6x_mem_scaling scaled;
1149 /* Whether the offset is a register (TRUE) or an expression
1150 (FALSE). */
1151 bfd_boolean offset_is_reg;
1152 /* The offset. */
1153 union
1154 {
1155 expressionS exp;
1156 tic6x_register reg;
1157 } offset;
1158 } tic6x_mem_ref;
1159
1160 /* A functional unit in SPMASK operands read by the assembler. */
1161 typedef struct
1162 {
1163 /* The basic unit. */
1164 tic6x_func_unit_base base;
1165 /* The side (1 or 2). */
1166 unsigned int side;
1167 } tic6x_func_unit_operand;
1168
1169 /* An operand read by the assembler. */
1170 typedef struct
1171 {
1172 /* The syntactic form of the operand, as one of the bit-masks
1173 above. */
1174 unsigned int form;
1175 /* The operand value. */
1176 union
1177 {
1178 /* An expression: TIC6X_OP_EXP. */
1179 expressionS exp;
1180 /* A register: TIC6X_OP_REG, TIC6X_OP_REGPAIR. */
1181 tic6x_register reg;
1182 /* A memory reference: TIC6X_OP_MEM_NOUNREG,
1183 TIC6X_OP_MEM_UNREG. */
1184 tic6x_mem_ref mem;
1185 /* A control register: TIC6X_OP_CTRL. */
1186 tic6x_ctrl_id ctrl;
1187 /* A functional unit: TIC6X_OP_FUNC_UNIT. */
1188 tic6x_func_unit_operand func_unit;
1189 } value;
1190 } tic6x_operand;
1191
1192 #define skip_whitespace(str) do { if (*(str) == ' ') ++(str); } while (0)
1193
1194 /* Parse a register operand, or part of an operand, starting at *P.
1195 If syntactically OK (including that the number is in the range 0 to
1196 31, but not necessarily in range for this architecture), return
1197 TRUE, putting the register side and number in *REG and update *P to
1198 point immediately after the register number; otherwise return FALSE
1199 without changing *P (but possibly changing *REG). Do not print any
1200 diagnostics. */
1201
1202 static bfd_boolean
1203 tic6x_parse_register (char **p, tic6x_register *reg)
1204 {
1205 char *r = *p;
1206
1207 switch (*r)
1208 {
1209 case 'a':
1210 case 'A':
1211 reg->side = 1;
1212 break;
1213
1214 case 'b':
1215 case 'B':
1216 reg->side = 2;
1217 break;
1218
1219 default:
1220 return FALSE;
1221 }
1222 r++;
1223
1224 if (*r >= '0' && *r <= '9')
1225 {
1226 reg->num = *r - '0';
1227 r++;
1228 }
1229 else
1230 return FALSE;
1231
1232 if (reg->num > 0 && *r >= '0' && *r <= '9')
1233 {
1234 reg->num = reg->num * 10 + (*r - '0');
1235 r++;
1236 }
1237
1238 if (*r >= '0' && *r <= '9')
1239 return FALSE;
1240
1241 if (reg->num >= 32)
1242 return FALSE;
1243 *p = r;
1244 return TRUE;
1245 }
1246
1247 /* Parse the initial two characters of a functional unit name starting
1248 at *P. If OK, set *BASE and *SIDE and return TRUE; otherwise,
1249 return FALSE. */
1250
1251 static bfd_boolean
1252 tic6x_parse_func_unit_base (char *p, tic6x_func_unit_base *base,
1253 unsigned int *side)
1254 {
1255 bfd_boolean good_func_unit = TRUE;
1256 tic6x_func_unit_base maybe_base = tic6x_func_unit_nfu;
1257 unsigned int maybe_side = 0;
1258
1259 switch (p[0])
1260 {
1261 case 'd':
1262 case 'D':
1263 maybe_base = tic6x_func_unit_d;
1264 break;
1265
1266 case 'l':
1267 case 'L':
1268 maybe_base = tic6x_func_unit_l;
1269 break;
1270
1271 case 'm':
1272 case 'M':
1273 maybe_base = tic6x_func_unit_m;
1274 break;
1275
1276 case 's':
1277 case 'S':
1278 maybe_base = tic6x_func_unit_s;
1279 break;
1280
1281 default:
1282 good_func_unit = FALSE;
1283 break;
1284 }
1285
1286 if (good_func_unit)
1287 switch (p[1])
1288 {
1289 case '1':
1290 maybe_side = 1;
1291 break;
1292
1293 case '2':
1294 maybe_side = 2;
1295 break;
1296
1297 default:
1298 good_func_unit = FALSE;
1299 break;
1300 }
1301
1302 if (good_func_unit)
1303 {
1304 *base = maybe_base;
1305 *side = maybe_side;
1306 }
1307
1308 return good_func_unit;
1309 }
1310
1311 /* Parse an operand starting at *P. If the operand parses OK, return
1312 TRUE and store the value in *OP; otherwise return FALSE (possibly
1313 changing *OP). In any case, update *P to point to the following
1314 comma or end of line. The possible operand forms are given by
1315 OP_FORMS. For diagnostics, this is operand OPNO of an opcode
1316 starting at STR, length OPC_LEN. */
1317
1318 static bfd_boolean
1319 tic6x_parse_operand (char **p, tic6x_operand *op, unsigned int op_forms,
1320 char *str, int opc_len, unsigned int opno)
1321 {
1322 bfd_boolean operand_parsed = FALSE;
1323 char *q = *p;
1324
1325 if ((op_forms & (TIC6X_OP_MEM_NOUNREG | TIC6X_OP_MEM_UNREG))
1326 == (TIC6X_OP_MEM_NOUNREG | TIC6X_OP_MEM_UNREG))
1327 abort ();
1328
1329 /* Check for functional unit names for SPMASK and SPMASKR. */
1330 if (!operand_parsed && (op_forms & TIC6X_OP_FUNC_UNIT))
1331 {
1332 tic6x_func_unit_base base = tic6x_func_unit_nfu;
1333 unsigned int side = 0;
1334
1335 if (tic6x_parse_func_unit_base (q, &base, &side))
1336 {
1337 char *rq = q + 2;
1338
1339 skip_whitespace (rq);
1340 if (is_end_of_line[(unsigned char) *rq] || *rq == ',')
1341 {
1342 op->form = TIC6X_OP_FUNC_UNIT;
1343 op->value.func_unit.base = base;
1344 op->value.func_unit.side = side;
1345 operand_parsed = TRUE;
1346 q = rq;
1347 }
1348 }
1349 }
1350
1351 /* Check for literal "irp". */
1352 if (!operand_parsed && (op_forms & TIC6X_OP_IRP))
1353 {
1354 if ((q[0] == 'i' || q[0] == 'I')
1355 && (q[1] == 'r' || q[1] == 'R')
1356 && (q[2] == 'p' || q[2] == 'P'))
1357 {
1358 char *rq = q + 3;
1359
1360 skip_whitespace (rq);
1361 if (is_end_of_line[(unsigned char) *rq] || *rq == ',')
1362 {
1363 op->form = TIC6X_OP_IRP;
1364 operand_parsed = TRUE;
1365 q = rq;
1366 }
1367 }
1368 }
1369
1370 /* Check for literal "nrp". */
1371 if (!operand_parsed && (op_forms & TIC6X_OP_NRP))
1372 {
1373 if ((q[0] == 'n' || q[0] == 'N')
1374 && (q[1] == 'r' || q[1] == 'R')
1375 && (q[2] == 'p' || q[2] == 'P'))
1376 {
1377 char *rq = q + 3;
1378
1379 skip_whitespace (rq);
1380 if (is_end_of_line[(unsigned char) *rq] || *rq == ',')
1381 {
1382 op->form = TIC6X_OP_NRP;
1383 operand_parsed = TRUE;
1384 q = rq;
1385 }
1386 }
1387 }
1388
1389 /* Check for control register names. */
1390 if (!operand_parsed && (op_forms & TIC6X_OP_CTRL))
1391 {
1392 tic6x_ctrl_id crid;
1393
1394 for (crid = 0; crid < tic6x_ctrl_max; crid++)
1395 {
1396 size_t len = strlen (tic6x_ctrl_table[crid].name);
1397
1398 if (strncasecmp (tic6x_ctrl_table[crid].name, q, len) == 0)
1399 {
1400 char *rq = q + len;
1401
1402 skip_whitespace (rq);
1403 if (is_end_of_line[(unsigned char) *rq] || *rq == ',')
1404 {
1405 op->form = TIC6X_OP_CTRL;
1406 op->value.ctrl = crid;
1407 operand_parsed = TRUE;
1408 q = rq;
1409 if (!(tic6x_ctrl_table[crid].isa_variants & tic6x_features))
1410 as_bad (_("control register '%s' not supported "
1411 "on this architecture"),
1412 tic6x_ctrl_table[crid].name);
1413 }
1414 }
1415 }
1416 }
1417
1418 /* See if this looks like a memory reference. */
1419 if (!operand_parsed
1420 && (op_forms & (TIC6X_OP_MEM_NOUNREG | TIC6X_OP_MEM_UNREG)))
1421 {
1422 bfd_boolean mem_ok = TRUE;
1423 char *mq = q;
1424 tic6x_mem_mod mem_mod = tic6x_mem_mod_none;
1425 tic6x_register base_reg;
1426 bfd_boolean require_offset, permit_offset;
1427 tic6x_mem_scaling scaled;
1428 bfd_boolean offset_is_reg;
1429 expressionS offset_exp;
1430 tic6x_register offset_reg;
1431
1432 if (*mq == '*')
1433 mq++;
1434 else
1435 mem_ok = FALSE;
1436
1437 if (mem_ok)
1438 {
1439 skip_whitespace (mq);
1440 switch (*mq)
1441 {
1442 case '+':
1443 if (mq[1] == '+')
1444 {
1445 mem_mod = tic6x_mem_mod_preinc;
1446 mq += 2;
1447 }
1448 else
1449 {
1450 mem_mod = tic6x_mem_mod_plus;
1451 mq++;
1452 }
1453 break;
1454
1455 case '-':
1456 if (mq[1] == '-')
1457 {
1458 mem_mod = tic6x_mem_mod_predec;
1459 mq += 2;
1460 }
1461 else
1462 {
1463 mem_mod = tic6x_mem_mod_minus;
1464 mq++;
1465 }
1466 break;
1467
1468 default:
1469 break;
1470 }
1471 }
1472
1473 if (mem_ok)
1474 {
1475 skip_whitespace (mq);
1476 mem_ok = tic6x_parse_register (&mq, &base_reg);
1477 }
1478
1479 if (mem_ok && mem_mod == tic6x_mem_mod_none)
1480 {
1481 skip_whitespace (mq);
1482 if (mq[0] == '+' && mq[1] == '+')
1483 {
1484 mem_mod = tic6x_mem_mod_postinc;
1485 mq += 2;
1486 }
1487 else if (mq[0] == '-' && mq[1] == '-')
1488 {
1489 mem_mod = tic6x_mem_mod_postdec;
1490 mq += 2;
1491 }
1492 }
1493
1494 if (mem_mod == tic6x_mem_mod_none)
1495 permit_offset = FALSE;
1496 else
1497 permit_offset = TRUE;
1498 if (mem_mod == tic6x_mem_mod_plus || mem_mod == tic6x_mem_mod_minus)
1499 require_offset = TRUE;
1500 else
1501 require_offset = FALSE;
1502 scaled = tic6x_offset_none;
1503 offset_is_reg = FALSE;
1504
1505 if (mem_ok && permit_offset)
1506 {
1507 char endc = 0;
1508
1509 skip_whitespace (mq);
1510 switch (*mq)
1511 {
1512 case '[':
1513 scaled = tic6x_offset_scaled;
1514 mq++;
1515 endc = ']';
1516 break;
1517
1518 case '(':
1519 scaled = tic6x_offset_unscaled;
1520 mq++;
1521 endc = ')';
1522 break;
1523
1524 default:
1525 break;
1526 }
1527 if (scaled != tic6x_offset_none)
1528 {
1529 skip_whitespace (mq);
1530 if (scaled == tic6x_offset_scaled
1531 || (op_forms & TIC6X_OP_MEM_UNREG))
1532 {
1533 bfd_boolean reg_ok;
1534 char *rq = mq;
1535
1536 reg_ok = tic6x_parse_register (&rq, &offset_reg);
1537 if (reg_ok)
1538 {
1539 skip_whitespace (rq);
1540 if (*rq == endc)
1541 {
1542 mq = rq;
1543 offset_is_reg = TRUE;
1544 }
1545 }
1546 }
1547 if (!offset_is_reg)
1548 {
1549 char *save_input_line_pointer;
1550
1551 save_input_line_pointer = input_line_pointer;
1552 input_line_pointer = mq;
1553 expression (&offset_exp);
1554 mq = input_line_pointer;
1555 input_line_pointer = save_input_line_pointer;
1556 }
1557 skip_whitespace (mq);
1558 if (*mq == endc)
1559 mq++;
1560 else
1561 mem_ok = FALSE;
1562 }
1563 }
1564
1565 if (mem_ok && require_offset && scaled == tic6x_offset_none)
1566 mem_ok = FALSE;
1567
1568 if (mem_ok)
1569 {
1570 skip_whitespace (mq);
1571 if (!is_end_of_line[(unsigned char) *mq] && *mq != ',')
1572 mem_ok = FALSE;
1573 }
1574
1575 if (mem_ok)
1576 {
1577 op->form = op_forms & (TIC6X_OP_MEM_NOUNREG | TIC6X_OP_MEM_UNREG);
1578 op->value.mem.base_reg = base_reg;
1579 op->value.mem.mod = mem_mod;
1580 op->value.mem.scaled = scaled;
1581 op->value.mem.offset_is_reg = offset_is_reg;
1582 if (offset_is_reg)
1583 op->value.mem.offset.reg = offset_reg;
1584 else
1585 op->value.mem.offset.exp = offset_exp;
1586 operand_parsed = TRUE;
1587 q = mq;
1588 if (base_reg.num >= tic6x_num_registers)
1589 as_bad (_("register number %u not supported on this architecture"),
1590 base_reg.num);
1591 if (offset_is_reg && offset_reg.num >= tic6x_num_registers)
1592 as_bad (_("register number %u not supported on this architecture"),
1593 offset_reg.num);
1594 }
1595 }
1596
1597 /* See if this looks like a register or register pair. */
1598 if (!operand_parsed && (op_forms & (TIC6X_OP_REG | TIC6X_OP_REGPAIR)))
1599 {
1600 tic6x_register first_reg, second_reg;
1601 bfd_boolean reg_ok;
1602 char *rq = q;
1603
1604 reg_ok = tic6x_parse_register (&rq, &first_reg);
1605
1606 if (reg_ok)
1607 {
1608 if (*rq == ':' && (op_forms & TIC6X_OP_REGPAIR))
1609 {
1610 rq++;
1611 reg_ok = tic6x_parse_register (&rq, &second_reg);
1612 if (reg_ok)
1613 {
1614 skip_whitespace (rq);
1615 if (is_end_of_line[(unsigned char) *rq] || *rq == ',')
1616 {
1617 if ((second_reg.num & 1)
1618 || (first_reg.num != second_reg.num + 1)
1619 || (first_reg.side != second_reg.side))
1620 as_bad (_("register pair for operand %u of '%.*s'"
1621 " not a valid even/odd pair"), opno,
1622 opc_len, str);
1623 op->form = TIC6X_OP_REGPAIR;
1624 op->value.reg = second_reg;
1625 operand_parsed = TRUE;
1626 q = rq;
1627 }
1628 }
1629 }
1630 else if (op_forms & TIC6X_OP_REG)
1631 {
1632 skip_whitespace (rq);
1633 if (is_end_of_line[(unsigned char) *rq] || *rq == ',')
1634 {
1635 op->form = TIC6X_OP_REG;
1636 op->value.reg = first_reg;
1637 operand_parsed = TRUE;
1638 q = rq;
1639 }
1640 }
1641 }
1642 if (operand_parsed)
1643 {
1644 if (first_reg.num >= tic6x_num_registers)
1645 as_bad (_("register number %u not supported on this architecture"),
1646 first_reg.num);
1647 if (op->form == TIC6X_OP_REGPAIR
1648 && second_reg.num >= tic6x_num_registers)
1649 as_bad (_("register number %u not supported on this architecture"),
1650 second_reg.num);
1651 }
1652 }
1653
1654 /* Otherwise, parse it as an expression. */
1655 if (!operand_parsed && (op_forms & TIC6X_OP_EXP))
1656 {
1657 char *save_input_line_pointer;
1658
1659 save_input_line_pointer = input_line_pointer;
1660 input_line_pointer = q;
1661 op->form = TIC6X_OP_EXP;
1662 expression (&op->value.exp);
1663 q = input_line_pointer;
1664 input_line_pointer = save_input_line_pointer;
1665 operand_parsed = TRUE;
1666 }
1667
1668 if (operand_parsed)
1669 {
1670 /* Now the operand has been parsed, there must be nothing more
1671 before the comma or end of line. */
1672 skip_whitespace (q);
1673 if (!is_end_of_line[(unsigned char) *q] && *q != ',')
1674 {
1675 operand_parsed = FALSE;
1676 as_bad (_("junk after operand %u of '%.*s'"), opno,
1677 opc_len, str);
1678 while (!is_end_of_line[(unsigned char) *q] && *q != ',')
1679 q++;
1680 }
1681 }
1682 else
1683 {
1684 /* This could not be parsed as any acceptable form of
1685 operand. */
1686 switch (op_forms)
1687 {
1688 case TIC6X_OP_REG | TIC6X_OP_REGPAIR:
1689 as_bad (_("bad register or register pair for operand %u of '%.*s'"),
1690 opno, opc_len, str);
1691 break;
1692
1693 case TIC6X_OP_REG | TIC6X_OP_CTRL:
1694 case TIC6X_OP_REG:
1695 as_bad (_("bad register for operand %u of '%.*s'"),
1696 opno, opc_len, str);
1697 break;
1698
1699 case TIC6X_OP_REGPAIR:
1700 as_bad (_("bad register pair for operand %u of '%.*s'"),
1701 opno, opc_len, str);
1702 break;
1703
1704 case TIC6X_OP_FUNC_UNIT:
1705 as_bad (_("bad functional unit for operand %u of '%.*s'"),
1706 opno, opc_len, str);
1707 break;
1708
1709 default:
1710 as_bad (_("bad operand %u of '%.*s'"),
1711 opno, opc_len, str);
1712 break;
1713
1714 }
1715 while (!is_end_of_line[(unsigned char) *q] && *q != ',')
1716 q++;
1717 }
1718 *p = q;
1719 return operand_parsed;
1720 }
1721
1722 /* Table of assembler operators and associated O_* values. */
1723 typedef struct
1724 {
1725 const char *name;
1726 operatorT op;
1727 } tic6x_operator_table;
1728 static const tic6x_operator_table tic6x_operators[] = {
1729 #define O_dsbt_index O_md1
1730 { "dsbt_index", O_dsbt_index },
1731 #define O_got O_md2
1732 { "got", O_got },
1733 #define O_dpr_got O_md3
1734 { "dpr_got", O_dpr_got },
1735 #define O_dpr_byte O_md4
1736 { "dpr_byte", O_dpr_byte },
1737 #define O_dpr_hword O_md5
1738 { "dpr_hword", O_dpr_hword },
1739 #define O_dpr_word O_md6
1740 { "dpr_word", O_dpr_word },
1741 };
1742
1743 /* Parse a name in some machine-specific way. Used on C6X to handle
1744 assembler operators. */
1745
1746 int
1747 tic6x_parse_name (const char *name, expressionS *exprP,
1748 enum expr_mode mode ATTRIBUTE_UNUSED, char *nextchar)
1749 {
1750 char *p = input_line_pointer;
1751 char c, *name_start, *name_end;
1752 const char *inner_name;
1753 unsigned int i;
1754 operatorT op = O_illegal;
1755 symbolS *sym;
1756
1757 if (*name != '$')
1758 return 0;
1759
1760 for (i = 0; i < ARRAY_SIZE (tic6x_operators); i++)
1761 if (strcasecmp (name + 1, tic6x_operators[i].name) == 0)
1762 {
1763 op = tic6x_operators[i].op;
1764 break;
1765 }
1766
1767 if (op == O_illegal)
1768 return 0;
1769
1770 *input_line_pointer = *nextchar;
1771 skip_whitespace (p);
1772
1773 if (*p != '(')
1774 {
1775 *input_line_pointer = 0;
1776 return 0;
1777 }
1778 p++;
1779 skip_whitespace (p);
1780
1781 if (!is_name_beginner (*p))
1782 {
1783 *input_line_pointer = 0;
1784 return 0;
1785 }
1786
1787 name_start = p;
1788 p++;
1789 while (is_part_of_name (*p))
1790 p++;
1791 name_end = p;
1792 skip_whitespace (p);
1793
1794 if (*p != ')')
1795 {
1796 *input_line_pointer = 0;
1797 return 0;
1798 }
1799
1800 input_line_pointer = p + 1;
1801 *nextchar = *input_line_pointer;
1802 *input_line_pointer = 0;
1803
1804 c = *name_end;
1805 *name_end = 0;
1806 inner_name = name_start;
1807 if (op == O_dsbt_index && strcmp (inner_name, "__c6xabi_DSBT_BASE") != 0)
1808 {
1809 as_bad (_("$DSBT_INDEX must be used with __c6xabi_DSBT_BASE"));
1810 inner_name = "__c6xabi_DSBT_BASE";
1811 }
1812 sym = symbol_find_or_make (inner_name);
1813 *name_end = c;
1814
1815 exprP->X_op = op;
1816 exprP->X_add_symbol = sym;
1817 exprP->X_add_number = 0;
1818 exprP->X_op_symbol = NULL;
1819 exprP->X_md = 0;
1820
1821 return 1;
1822 }
1823
1824 /* Create a fixup for an expression. Same arguments as fix_new_exp,
1825 plus FIX_ADDA which is TRUE for ADDA instructions (to indicate that
1826 fixes resolving to constants should have those constants implicitly
1827 shifted) and FALSE otherwise, but look for C6X-specific expression
1828 types and adjust the relocations or give errors accordingly. */
1829
1830 static void
1831 tic6x_fix_new_exp (fragS *frag, int where, int size, expressionS *exp,
1832 int pcrel, bfd_reloc_code_real_type r_type,
1833 bfd_boolean fix_adda)
1834 {
1835 bfd_reloc_code_real_type new_reloc = BFD_RELOC_UNUSED;
1836 fixS *fix;
1837
1838 switch (exp->X_op)
1839 {
1840 case O_dsbt_index:
1841 switch (r_type)
1842 {
1843 case BFD_RELOC_C6000_SBR_U15_W:
1844 new_reloc = BFD_RELOC_C6000_DSBT_INDEX;
1845 break;
1846
1847 default:
1848 as_bad (_("$DSBT_INDEX not supported in this context"));
1849 return;
1850 }
1851 break;
1852
1853 case O_got:
1854 switch (r_type)
1855 {
1856 case BFD_RELOC_C6000_SBR_U15_W:
1857 new_reloc = BFD_RELOC_C6000_SBR_GOT_U15_W;
1858 break;
1859
1860 default:
1861 as_bad (_("$GOT not supported in this context"));
1862 return;
1863 }
1864 break;
1865
1866 case O_dpr_got:
1867 switch (r_type)
1868 {
1869 case BFD_RELOC_C6000_ABS_L16:
1870 new_reloc = BFD_RELOC_C6000_SBR_GOT_L16_W;
1871 break;
1872
1873 case BFD_RELOC_C6000_ABS_H16:
1874 new_reloc = BFD_RELOC_C6000_SBR_GOT_H16_W;
1875 break;
1876
1877 default:
1878 as_bad (_("$DPR_GOT not supported in this context"));
1879 return;
1880 }
1881 break;
1882
1883 case O_dpr_byte:
1884 switch (r_type)
1885 {
1886 case BFD_RELOC_C6000_ABS_S16:
1887 new_reloc = BFD_RELOC_C6000_SBR_S16;
1888 break;
1889
1890 case BFD_RELOC_C6000_ABS_L16:
1891 new_reloc = BFD_RELOC_C6000_SBR_L16_B;
1892 break;
1893
1894 case BFD_RELOC_C6000_ABS_H16:
1895 new_reloc = BFD_RELOC_C6000_SBR_H16_B;
1896 break;
1897
1898 default:
1899 as_bad (_("$DPR_BYTE not supported in this context"));
1900 return;
1901 }
1902 break;
1903
1904 case O_dpr_hword:
1905 switch (r_type)
1906 {
1907 case BFD_RELOC_C6000_ABS_L16:
1908 new_reloc = BFD_RELOC_C6000_SBR_L16_H;
1909 break;
1910
1911 case BFD_RELOC_C6000_ABS_H16:
1912 new_reloc = BFD_RELOC_C6000_SBR_H16_H;
1913 break;
1914
1915 default:
1916 as_bad (_("$DPR_HWORD not supported in this context"));
1917 return;
1918 }
1919 break;
1920
1921 case O_dpr_word:
1922 switch (r_type)
1923 {
1924 case BFD_RELOC_C6000_ABS_L16:
1925 new_reloc = BFD_RELOC_C6000_SBR_L16_W;
1926 break;
1927
1928 case BFD_RELOC_C6000_ABS_H16:
1929 new_reloc = BFD_RELOC_C6000_SBR_H16_W;
1930 break;
1931
1932 default:
1933 as_bad (_("$DPR_WORD not supported in this context"));
1934 return;
1935 }
1936 break;
1937
1938 case O_symbol:
1939 break;
1940
1941 default:
1942 if (pcrel)
1943 {
1944 as_bad (_("invalid PC-relative operand"));
1945 return;
1946 }
1947 break;
1948 }
1949
1950 if (new_reloc == BFD_RELOC_UNUSED)
1951 fix = fix_new_exp (frag, where, size, exp, pcrel, r_type);
1952 else
1953 fix = fix_new (frag, where, size, exp->X_add_symbol, exp->X_add_number,
1954 pcrel, new_reloc);
1955 fix->tc_fix_data.fix_adda = fix_adda;
1956 }
1957
1958 /* Generate a fix for a constant (.word etc.). Needed to ensure these
1959 go through the error checking in tic6x_fix_new_exp. */
1960
1961 void
1962 tic6x_cons_fix_new (fragS *frag, int where, int size, expressionS *exp)
1963 {
1964 bfd_reloc_code_real_type r_type;
1965
1966 switch (size)
1967 {
1968 case 1:
1969 r_type = BFD_RELOC_8;
1970 break;
1971
1972 case 2:
1973 r_type = BFD_RELOC_16;
1974 break;
1975
1976 case 4:
1977 r_type = BFD_RELOC_32;
1978 break;
1979
1980 default:
1981 as_bad (_("no %d-byte relocations available"), size);
1982 return;
1983 }
1984
1985 tic6x_fix_new_exp (frag, where, size, exp, 0, r_type, FALSE);
1986 }
1987
1988 /* Initialize target-specific fix data. */
1989
1990 void
1991 tic6x_init_fix_data (fixS *fixP)
1992 {
1993 fixP->tc_fix_data.fix_adda = FALSE;
1994 }
1995
1996 /* Return true if the fix can be handled by GAS, false if it must
1997 be passed through to the linker. */
1998
1999 bfd_boolean
2000 tic6x_fix_adjustable (fixS *fixP)
2001 {
2002 switch (fixP->fx_r_type)
2003 {
2004 /* Adjust_reloc_syms doesn't know about the GOT. */
2005 case BFD_RELOC_C6000_SBR_GOT_U15_W:
2006 case BFD_RELOC_C6000_SBR_GOT_H16_W:
2007 case BFD_RELOC_C6000_SBR_GOT_L16_W:
2008 case BFD_RELOC_C6000_EHTYPE:
2009 return 0;
2010
2011 case BFD_RELOC_C6000_PREL31:
2012 return 0;
2013
2014 default:
2015 return 1;
2016 }
2017 }
2018
2019 /* Given the fine-grained form of an operand, return the coarse
2020 (bit-mask) form. */
2021
2022 static unsigned int
2023 tic6x_coarse_operand_form (tic6x_operand_form form)
2024 {
2025 switch (form)
2026 {
2027 case tic6x_operand_asm_const:
2028 case tic6x_operand_link_const:
2029 return TIC6X_OP_EXP;
2030
2031 case tic6x_operand_reg:
2032 case tic6x_operand_xreg:
2033 case tic6x_operand_dreg:
2034 case tic6x_operand_areg:
2035 case tic6x_operand_retreg:
2036 return TIC6X_OP_REG;
2037
2038 case tic6x_operand_regpair:
2039 case tic6x_operand_xregpair:
2040 case tic6x_operand_dregpair:
2041 return TIC6X_OP_REGPAIR;
2042
2043 case tic6x_operand_irp:
2044 return TIC6X_OP_IRP;
2045
2046 case tic6x_operand_nrp:
2047 return TIC6X_OP_NRP;
2048
2049 case tic6x_operand_ctrl:
2050 return TIC6X_OP_CTRL;
2051
2052 case tic6x_operand_mem_short:
2053 case tic6x_operand_mem_long:
2054 case tic6x_operand_mem_deref:
2055 return TIC6X_OP_MEM_NOUNREG;
2056
2057 case tic6x_operand_mem_ndw:
2058 return TIC6X_OP_MEM_UNREG;
2059
2060 case tic6x_operand_func_unit:
2061 return TIC6X_OP_FUNC_UNIT;
2062
2063 default:
2064 abort ();
2065 }
2066 }
2067
2068 /* How an operand may match or not match a desired form. If different
2069 instruction alternatives fail in different ways, the first failure
2070 in this list determines the diagnostic. */
2071 typedef enum
2072 {
2073 /* Matches. */
2074 tic6x_match_matches,
2075 /* Bad coarse form. */
2076 tic6x_match_coarse,
2077 /* Not constant. */
2078 tic6x_match_non_const,
2079 /* Register on wrong side. */
2080 tic6x_match_wrong_side,
2081 /* Not a valid address register. */
2082 tic6x_match_bad_address,
2083 /* Not a valid return address register. */
2084 tic6x_match_bad_return,
2085 /* Control register not readable. */
2086 tic6x_match_ctrl_write_only,
2087 /* Control register not writable. */
2088 tic6x_match_ctrl_read_only,
2089 /* Not a valid memory reference for this instruction. */
2090 tic6x_match_bad_mem
2091 } tic6x_operand_match;
2092
2093 /* Return whether an operand matches the given fine-grained form and
2094 read/write usage, and, if it does not match, how it fails to match.
2095 The main functional unit side is SIDE; the cross-path side is CROSS
2096 (the same as SIDE if a cross path not used); the data side is
2097 DATA_SIDE. */
2098 static tic6x_operand_match
2099 tic6x_operand_matches_form (const tic6x_operand *op, tic6x_operand_form form,
2100 tic6x_rw rw, unsigned int side, unsigned int cross,
2101 unsigned int data_side)
2102 {
2103 unsigned int coarse = tic6x_coarse_operand_form (form);
2104
2105 if (coarse != op->form)
2106 return tic6x_match_coarse;
2107
2108 switch (form)
2109 {
2110 case tic6x_operand_asm_const:
2111 if (op->value.exp.X_op == O_constant)
2112 return tic6x_match_matches;
2113 else
2114 return tic6x_match_non_const;
2115
2116 case tic6x_operand_link_const:
2117 case tic6x_operand_irp:
2118 case tic6x_operand_nrp:
2119 case tic6x_operand_func_unit:
2120 /* All expressions are link-time constants, although there may
2121 not be relocations to express them in the output file. "irp"
2122 and "nrp" are unique operand values. All parsed functional
2123 unit names are valid. */
2124 return tic6x_match_matches;
2125
2126 case tic6x_operand_reg:
2127 case tic6x_operand_regpair:
2128 if (op->value.reg.side == side)
2129 return tic6x_match_matches;
2130 else
2131 return tic6x_match_wrong_side;
2132
2133 case tic6x_operand_xreg:
2134 case tic6x_operand_xregpair:
2135 if (op->value.reg.side == cross)
2136 return tic6x_match_matches;
2137 else
2138 return tic6x_match_wrong_side;
2139
2140 case tic6x_operand_dreg:
2141 case tic6x_operand_dregpair:
2142 if (op->value.reg.side == data_side)
2143 return tic6x_match_matches;
2144 else
2145 return tic6x_match_wrong_side;
2146
2147 case tic6x_operand_areg:
2148 if (op->value.reg.side != cross)
2149 return tic6x_match_wrong_side;
2150 else if (op->value.reg.side == 2
2151 && (op->value.reg.num == 14 || op->value.reg.num == 15))
2152 return tic6x_match_matches;
2153 else
2154 return tic6x_match_bad_address;
2155
2156 case tic6x_operand_retreg:
2157 if (op->value.reg.side != side)
2158 return tic6x_match_wrong_side;
2159 else if (op->value.reg.num != 3)
2160 return tic6x_match_bad_return;
2161 else
2162 return tic6x_match_matches;
2163
2164 case tic6x_operand_ctrl:
2165 switch (rw)
2166 {
2167 case tic6x_rw_read:
2168 if (tic6x_ctrl_table[op->value.ctrl].rw == tic6x_rw_read
2169 || tic6x_ctrl_table[op->value.ctrl].rw == tic6x_rw_read_write)
2170 return tic6x_match_matches;
2171 else
2172 return tic6x_match_ctrl_write_only;
2173
2174 case tic6x_rw_write:
2175 if (tic6x_ctrl_table[op->value.ctrl].rw == tic6x_rw_write
2176 || tic6x_ctrl_table[op->value.ctrl].rw == tic6x_rw_read_write)
2177 return tic6x_match_matches;
2178 else
2179 return tic6x_match_ctrl_read_only;
2180
2181 default:
2182 abort ();
2183 }
2184
2185 case tic6x_operand_mem_deref:
2186 if (op->value.mem.mod != tic6x_mem_mod_none)
2187 return tic6x_match_bad_mem;
2188 else if (op->value.mem.scaled != tic6x_offset_none)
2189 abort ();
2190 else if (op->value.mem.base_reg.side != side)
2191 return tic6x_match_bad_mem;
2192 else
2193 return tic6x_match_matches;
2194
2195 case tic6x_operand_mem_short:
2196 case tic6x_operand_mem_ndw:
2197 if (op->value.mem.base_reg.side != side)
2198 return tic6x_match_bad_mem;
2199 if (op->value.mem.mod == tic6x_mem_mod_none)
2200 {
2201 if (op->value.mem.scaled != tic6x_offset_none)
2202 abort ();
2203 return tic6x_match_matches;
2204 }
2205 if (op->value.mem.scaled == tic6x_offset_none)
2206 {
2207 if (op->value.mem.mod == tic6x_mem_mod_plus
2208 || op->value.mem.mod == tic6x_mem_mod_minus)
2209 abort ();
2210 return tic6x_match_matches;
2211 }
2212 if (op->value.mem.offset_is_reg)
2213 {
2214 if (op->value.mem.scaled == tic6x_offset_unscaled
2215 && form != tic6x_operand_mem_ndw)
2216 abort ();
2217 if (op->value.mem.offset.reg.side == side)
2218 return tic6x_match_matches;
2219 else
2220 return tic6x_match_bad_mem;
2221 }
2222 else
2223 {
2224 if (op->value.mem.offset.exp.X_op == O_constant)
2225 return tic6x_match_matches;
2226 else
2227 return tic6x_match_bad_mem;
2228 }
2229
2230 case tic6x_operand_mem_long:
2231 if (op->value.mem.base_reg.side == 2
2232 && (op->value.mem.base_reg.num == 14
2233 || op->value.mem.base_reg.num == 15))
2234 {
2235 switch (op->value.mem.mod)
2236 {
2237 case tic6x_mem_mod_none:
2238 if (op->value.mem.scaled != tic6x_offset_none)
2239 abort ();
2240 return tic6x_match_matches;
2241
2242 case tic6x_mem_mod_plus:
2243 if (op->value.mem.scaled == tic6x_offset_none)
2244 abort ();
2245 if (op->value.mem.offset_is_reg)
2246 return tic6x_match_bad_mem;
2247 else if (op->value.mem.scaled == tic6x_offset_scaled
2248 && op->value.mem.offset.exp.X_op != O_constant)
2249 return tic6x_match_bad_mem;
2250 else
2251 return tic6x_match_matches;
2252
2253 case tic6x_mem_mod_minus:
2254 case tic6x_mem_mod_preinc:
2255 case tic6x_mem_mod_predec:
2256 case tic6x_mem_mod_postinc:
2257 case tic6x_mem_mod_postdec:
2258 return tic6x_match_bad_mem;
2259
2260 default:
2261 abort ();
2262 }
2263
2264 }
2265 else
2266 return tic6x_match_bad_mem;
2267
2268 default:
2269 abort ();
2270 }
2271 }
2272
2273 /* Return the number of bits shift used with DP-relative coding method
2274 CODING. */
2275
2276 static unsigned int
2277 tic6x_dpr_shift (tic6x_coding_method coding)
2278 {
2279 switch (coding)
2280 {
2281 case tic6x_coding_ulcst_dpr_byte:
2282 return 0;
2283
2284 case tic6x_coding_ulcst_dpr_half:
2285 return 1;
2286
2287 case tic6x_coding_ulcst_dpr_word:
2288 return 2;
2289
2290 default:
2291 abort ();
2292 }
2293 }
2294
2295 /* Return the relocation used with DP-relative coding method
2296 CODING. */
2297
2298 static bfd_reloc_code_real_type
2299 tic6x_dpr_reloc (tic6x_coding_method coding)
2300 {
2301 switch (coding)
2302 {
2303 case tic6x_coding_ulcst_dpr_byte:
2304 return BFD_RELOC_C6000_SBR_U15_B;
2305
2306 case tic6x_coding_ulcst_dpr_half:
2307 return BFD_RELOC_C6000_SBR_U15_H;
2308
2309 case tic6x_coding_ulcst_dpr_word:
2310 return BFD_RELOC_C6000_SBR_U15_W;
2311
2312 default:
2313 abort ();
2314 }
2315 }
2316
2317 /* Given a memory reference *MEM_REF as originally parsed, fill in
2318 defaults for missing offsets. */
2319
2320 static void
2321 tic6x_default_mem_ref (tic6x_mem_ref *mem_ref)
2322 {
2323 switch (mem_ref->mod)
2324 {
2325 case tic6x_mem_mod_none:
2326 if (mem_ref->scaled != tic6x_offset_none)
2327 abort ();
2328 mem_ref->mod = tic6x_mem_mod_plus;
2329 mem_ref->scaled = tic6x_offset_unscaled;
2330 mem_ref->offset_is_reg = FALSE;
2331 memset (&mem_ref->offset.exp, 0, sizeof mem_ref->offset.exp);
2332 mem_ref->offset.exp.X_op = O_constant;
2333 mem_ref->offset.exp.X_add_number = 0;
2334 mem_ref->offset.exp.X_unsigned = 0;
2335 break;
2336
2337 case tic6x_mem_mod_plus:
2338 case tic6x_mem_mod_minus:
2339 if (mem_ref->scaled == tic6x_offset_none)
2340 abort ();
2341 break;
2342
2343 case tic6x_mem_mod_preinc:
2344 case tic6x_mem_mod_predec:
2345 case tic6x_mem_mod_postinc:
2346 case tic6x_mem_mod_postdec:
2347 if (mem_ref->scaled != tic6x_offset_none)
2348 break;
2349 mem_ref->scaled = tic6x_offset_scaled;
2350 mem_ref->offset_is_reg = FALSE;
2351 memset (&mem_ref->offset.exp, 0, sizeof mem_ref->offset.exp);
2352 mem_ref->offset.exp.X_op = O_constant;
2353 mem_ref->offset.exp.X_add_number = 1;
2354 mem_ref->offset.exp.X_unsigned = 0;
2355 break;
2356
2357 default:
2358 abort ();
2359 }
2360 }
2361
2362 /* Return the encoding in the 8-bit field of an SPMASK or SPMASKR
2363 instruction of the specified UNIT, side SIDE. */
2364
2365 static unsigned int
2366 tic6x_encode_spmask (tic6x_func_unit_base unit, unsigned int side)
2367 {
2368 switch (unit)
2369 {
2370 case tic6x_func_unit_l:
2371 return 1 << (side - 1);
2372
2373 case tic6x_func_unit_s:
2374 return 1 << (side + 1);
2375
2376 case tic6x_func_unit_d:
2377 return 1 << (side + 3);
2378
2379 case tic6x_func_unit_m:
2380 return 1 << (side + 5);
2381
2382 default:
2383 abort ();
2384 }
2385 }
2386
2387 /* Try to encode the instruction with opcode number ID and operands
2388 OPERANDS (number NUM_OPERANDS), creg value THIS_LINE_CREG and z
2389 value THIS_LINE_Z; FUNC_UNIT_SIDE, FUNC_UNIT_CROSS and
2390 FUNC_UNIT_DATA_SIDE describe the functional unit specification;
2391 SPLOOP_II is the ii value from the previous SPLOOP-family
2392 instruction, or 0 if not in such a loop; the only possible problems
2393 are operands being out of range (they already match the
2394 fine-grained form), and inappropriate predication. If this
2395 succeeds, return the encoding and set *OK to TRUE; otherwise return
2396 0 and set *OK to FALSE. If a fix is needed, set *FIX_NEEDED to
2397 true and fill in *FIX_EXP, *FIX_PCREL, *FX_R_TYPE and *FIX_ADDA.
2398 Print error messages for failure if PRINT_ERRORS is TRUE; the
2399 opcode starts at STR and has length OPC_LEN. */
2400
2401 static unsigned int
2402 tic6x_try_encode (tic6x_opcode_id id, tic6x_operand *operands,
2403 unsigned int num_operands, unsigned int this_line_creg,
2404 unsigned int this_line_z, unsigned int func_unit_side,
2405 unsigned int func_unit_cross,
2406 unsigned int func_unit_data_side, int sploop_ii,
2407 expressionS **fix_exp, int *fix_pcrel,
2408 bfd_reloc_code_real_type *fx_r_type, bfd_boolean *fix_adda,
2409 bfd_boolean *fix_needed, bfd_boolean *ok,
2410 bfd_boolean print_errors, char *str, int opc_len)
2411 {
2412 const tic6x_opcode *opct;
2413 const tic6x_insn_format *fmt;
2414 unsigned int opcode_value;
2415 unsigned int fld;
2416
2417 opct = &tic6x_opcode_table[id];
2418 fmt = &tic6x_insn_format_table[opct->format];
2419 opcode_value = fmt->cst_bits;
2420
2421 for (fld = 0; fld < opct->num_fixed_fields; fld++)
2422 {
2423 if (opct->fixed_fields[fld].min_val == opct->fixed_fields[fld].max_val)
2424 {
2425 const tic6x_insn_field *fldd;
2426 fldd = tic6x_field_from_fmt (fmt, opct->fixed_fields[fld].field_id);
2427 if (fldd == NULL)
2428 abort ();
2429 opcode_value |= opct->fixed_fields[fld].min_val << fldd->low_pos;
2430 }
2431 }
2432
2433 for (fld = 0; fld < opct->num_variable_fields; fld++)
2434 {
2435 const tic6x_insn_field *fldd;
2436 unsigned int value;
2437 unsigned int opno;
2438 unsigned int ffld;
2439 offsetT sign_value;
2440 unsigned int bits;
2441 unsigned int fcyc_bits;
2442 expressionS *expp;
2443 expressionS ucexp;
2444 tic6x_mem_ref mem;
2445
2446 fldd = tic6x_field_from_fmt (fmt, opct->variable_fields[fld].field_id);
2447 if (fldd == NULL)
2448 abort ();
2449 opno = opct->variable_fields[fld].operand_num;
2450 switch (opct->variable_fields[fld].coding_method)
2451 {
2452 case tic6x_coding_ucst:
2453 if (operands[opno].form != TIC6X_OP_EXP)
2454 abort ();
2455 if (operands[opno].value.exp.X_op != O_constant)
2456 abort ();
2457 ucexp = operands[opno].value.exp;
2458 unsigned_constant:
2459 if (ucexp.X_add_number < 0
2460 || ucexp.X_add_number >= (1 << fldd->width))
2461 {
2462 if (print_errors)
2463 as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
2464 opc_len, str);
2465 *ok = FALSE;
2466 return 0;
2467 }
2468 value = ucexp.X_add_number;
2469 break;
2470
2471 case tic6x_coding_scst:
2472 if (operands[opno].form != TIC6X_OP_EXP)
2473 abort ();
2474 if (operands[opno].value.exp.X_op != O_constant)
2475 {
2476 value = 0;
2477 /* Opcode table should not permit non-constants without
2478 a known relocation for them. */
2479 if (fldd->low_pos != 7 || fldd->width != 16)
2480 abort ();
2481 *fix_needed = TRUE;
2482 *fix_exp = &operands[opno].value.exp;
2483 *fix_pcrel = 0;
2484 *fx_r_type = BFD_RELOC_C6000_ABS_S16;
2485 *fix_adda = FALSE;
2486 break;
2487 }
2488 sign_value = SEXT (operands[opno].value.exp.X_add_number);
2489 signed_constant:
2490 if (sign_value < -(1 << (fldd->width - 1))
2491 || (sign_value >= (1 << (fldd->width - 1))))
2492 {
2493 if (print_errors)
2494 as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
2495 opc_len, str);
2496 *ok = FALSE;
2497 return 0;
2498 }
2499 value = sign_value + (1 << (fldd->width - 1));
2500 value ^= (1 << (fldd->width - 1));
2501 break;
2502
2503 case tic6x_coding_ucst_minus_one:
2504 if (operands[opno].form != TIC6X_OP_EXP)
2505 abort ();
2506 if (operands[opno].value.exp.X_op != O_constant)
2507 abort ();
2508 if (operands[opno].value.exp.X_add_number <= 0
2509 || operands[opno].value.exp.X_add_number > (1 << fldd->width))
2510 {
2511 if (print_errors)
2512 as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
2513 opc_len, str);
2514 *ok = FALSE;
2515 return 0;
2516 }
2517 value = operands[opno].value.exp.X_add_number - 1;
2518 break;
2519
2520 case tic6x_coding_scst_negate:
2521 if (operands[opno].form != TIC6X_OP_EXP)
2522 abort ();
2523 if (operands[opno].value.exp.X_op != O_constant)
2524 abort ();
2525 sign_value = SEXT (-operands[opno].value.exp.X_add_number);
2526 goto signed_constant;
2527
2528 case tic6x_coding_ulcst_dpr_byte:
2529 case tic6x_coding_ulcst_dpr_half:
2530 case tic6x_coding_ulcst_dpr_word:
2531 bits = tic6x_dpr_shift (opct->variable_fields[fld].coding_method);
2532 switch (operands[opno].form)
2533 {
2534 case TIC6X_OP_EXP:
2535 if (operands[opno].value.exp.X_op == O_constant)
2536 {
2537 ucexp = operands[opno].value.exp;
2538 goto unsigned_constant;
2539 }
2540 expp = &operands[opno].value.exp;
2541 break;
2542
2543 case TIC6X_OP_MEM_NOUNREG:
2544 mem = operands[opno].value.mem;
2545 tic6x_default_mem_ref (&mem);
2546 if (mem.offset_is_reg)
2547 abort ();
2548 if (mem.offset.exp.X_op == O_constant)
2549 {
2550 ucexp = mem.offset.exp;
2551 if (mem.scaled == tic6x_offset_unscaled)
2552 {
2553 if (ucexp.X_add_number & ((1 << bits) - 1))
2554 {
2555 if (print_errors)
2556 as_bad (_("offset in operand %u of '%.*s' not "
2557 "divisible by %u"), opno + 1, opc_len,
2558 str, 1u << bits);
2559 *ok = FALSE;
2560 return 0;
2561 }
2562 ucexp.X_add_number >>= bits;
2563 }
2564 goto unsigned_constant;
2565 }
2566 if (mem.scaled != tic6x_offset_unscaled)
2567 abort ();
2568 if (operands[opno].value.mem.mod == tic6x_mem_mod_none
2569 || operands[opno].value.mem.scaled != tic6x_offset_unscaled
2570 || operands[opno].value.mem.offset_is_reg)
2571 abort ();
2572 expp = &operands[opno].value.mem.offset.exp;
2573 break;
2574
2575 default:
2576 abort ();
2577 }
2578 value = 0;
2579 /* Opcode table should not use this encoding without a known
2580 relocation. */
2581 if (fldd->low_pos != 8 || fldd->width != 15)
2582 abort ();
2583 /* We do not check for offset divisibility here; such a
2584 check is not needed at this point to encode the value,
2585 and if there is eventually a problem it will be detected
2586 either in md_apply_fix or at link time. */
2587 *fix_needed = TRUE;
2588 *fix_exp = expp;
2589 *fix_pcrel = 0;
2590 *fx_r_type
2591 = tic6x_dpr_reloc (opct->variable_fields[fld].coding_method);
2592 if (operands[opno].form == TIC6X_OP_EXP)
2593 *fix_adda = TRUE;
2594 else
2595 *fix_adda = FALSE;
2596 break;
2597
2598 case tic6x_coding_lcst_low16:
2599 if (operands[opno].form != TIC6X_OP_EXP)
2600 abort ();
2601 if (operands[opno].value.exp.X_op == O_constant)
2602 value = operands[opno].value.exp.X_add_number & 0xffff;
2603 else
2604 {
2605 value = 0;
2606 /* Opcode table should not use this encoding without a
2607 known relocation. */
2608 if (fldd->low_pos != 7 || fldd->width != 16)
2609 abort ();
2610 *fix_needed = TRUE;
2611 *fix_exp = &operands[opno].value.exp;
2612 *fix_pcrel = 0;
2613 *fx_r_type = BFD_RELOC_C6000_ABS_L16;
2614 *fix_adda = FALSE;
2615 }
2616 break;
2617
2618 case tic6x_coding_lcst_high16:
2619 if (operands[opno].form != TIC6X_OP_EXP)
2620 abort ();
2621 if (operands[opno].value.exp.X_op == O_constant)
2622 value = (operands[opno].value.exp.X_add_number >> 16) & 0xffff;
2623 else
2624 {
2625 value = 0;
2626 /* Opcode table should not use this encoding without a
2627 known relocation. */
2628 if (fldd->low_pos != 7 || fldd->width != 16)
2629 abort ();
2630 *fix_needed = TRUE;
2631 *fix_exp = &operands[opno].value.exp;
2632 *fix_pcrel = 0;
2633 *fx_r_type = BFD_RELOC_C6000_ABS_H16;
2634 *fix_adda = FALSE;
2635 }
2636 break;
2637
2638 case tic6x_coding_pcrel:
2639 case tic6x_coding_pcrel_half:
2640 if (operands[opno].form != TIC6X_OP_EXP)
2641 abort ();
2642 value = 0;
2643 *fix_needed = TRUE;
2644 *fix_exp = &operands[opno].value.exp;
2645 *fix_pcrel = 1;
2646 if (fldd->low_pos == 7 && fldd->width == 21)
2647 *fx_r_type = BFD_RELOC_C6000_PCR_S21;
2648 else if (fldd->low_pos == 16 && fldd->width == 12)
2649 *fx_r_type = BFD_RELOC_C6000_PCR_S12;
2650 else if (fldd->low_pos == 13 && fldd->width == 10)
2651 *fx_r_type = BFD_RELOC_C6000_PCR_S10;
2652 else if (fldd->low_pos == 16 && fldd->width == 7)
2653 *fx_r_type = BFD_RELOC_C6000_PCR_S7;
2654 else
2655 /* Opcode table should not use this encoding without a
2656 known relocation. */
2657 abort ();
2658 *fix_adda = FALSE;
2659 break;
2660
2661 case tic6x_coding_reg:
2662 switch (operands[opno].form)
2663 {
2664 case TIC6X_OP_REG:
2665 case TIC6X_OP_REGPAIR:
2666 value = operands[opno].value.reg.num;
2667 break;
2668
2669 case TIC6X_OP_MEM_NOUNREG:
2670 case TIC6X_OP_MEM_UNREG:
2671 value = operands[opno].value.mem.base_reg.num;
2672 break;
2673
2674 default:
2675 abort ();
2676 }
2677 break;
2678
2679 case tic6x_coding_areg:
2680 switch (operands[opno].form)
2681 {
2682 case TIC6X_OP_REG:
2683 value = (operands[opno].value.reg.num == 15 ? 1 : 0);
2684 break;
2685
2686 case TIC6X_OP_MEM_NOUNREG:
2687 value = (operands[opno].value.mem.base_reg.num == 15 ? 1 : 0);
2688 break;
2689
2690 default:
2691 abort ();
2692 }
2693 break;
2694
2695 case tic6x_coding_crlo:
2696 if (operands[opno].form != TIC6X_OP_CTRL)
2697 abort ();
2698 value = tic6x_ctrl_table[operands[opno].value.ctrl].crlo;
2699 break;
2700
2701 case tic6x_coding_crhi:
2702 if (operands[opno].form != TIC6X_OP_CTRL)
2703 abort ();
2704 value = 0;
2705 break;
2706
2707 case tic6x_coding_reg_shift:
2708 if (operands[opno].form != TIC6X_OP_REGPAIR)
2709 abort ();
2710 value = operands[opno].value.reg.num >> 1;
2711 break;
2712
2713 case tic6x_coding_mem_offset:
2714 if (operands[opno].form != TIC6X_OP_MEM_NOUNREG)
2715 abort ();
2716 mem = operands[opno].value.mem;
2717 tic6x_default_mem_ref (&mem);
2718 if (mem.offset_is_reg)
2719 {
2720 if (mem.scaled != tic6x_offset_scaled)
2721 abort ();
2722 value = mem.offset.reg.num;
2723 }
2724 else
2725 {
2726 int scale;
2727
2728 if (mem.offset.exp.X_op != O_constant)
2729 abort ();
2730 switch (mem.scaled)
2731 {
2732 case tic6x_offset_scaled:
2733 scale = 1;
2734 break;
2735
2736 case tic6x_offset_unscaled:
2737 scale = opct->operand_info[opno].size;
2738 if (scale != 1 && scale != 2 && scale != 4 && scale != 8)
2739 abort ();
2740 break;
2741
2742 default:
2743 abort ();
2744 }
2745 if (mem.offset.exp.X_add_number < 0
2746 || mem.offset.exp.X_add_number >= (1 << fldd->width) * scale)
2747 {
2748 if (print_errors)
2749 as_bad (_("offset in operand %u of '%.*s' out of range"),
2750 opno + 1, opc_len, str);
2751 *ok = FALSE;
2752 return 0;
2753 }
2754 if (mem.offset.exp.X_add_number % scale)
2755 {
2756 if (print_errors)
2757 as_bad (_("offset in operand %u of '%.*s' not "
2758 "divisible by %u"),
2759 opno + 1, opc_len, str, scale);
2760 *ok = FALSE;
2761 return 0;
2762 }
2763 value = mem.offset.exp.X_add_number / scale;
2764 }
2765 break;
2766
2767 case tic6x_coding_mem_offset_noscale:
2768 if (operands[opno].form != TIC6X_OP_MEM_UNREG)
2769 abort ();
2770 mem = operands[opno].value.mem;
2771 tic6x_default_mem_ref (&mem);
2772 if (mem.offset_is_reg)
2773 value = mem.offset.reg.num;
2774 else
2775 {
2776 if (mem.offset.exp.X_op != O_constant)
2777 abort ();
2778 if (mem.offset.exp.X_add_number < 0
2779 || mem.offset.exp.X_add_number >= (1 << fldd->width))
2780 {
2781 if (print_errors)
2782 as_bad (_("offset in operand %u of '%.*s' out of range"),
2783 opno + 1, opc_len, str);
2784 *ok = FALSE;
2785 return 0;
2786 }
2787 value = mem.offset.exp.X_add_number;
2788 }
2789 break;
2790
2791 case tic6x_coding_mem_mode:
2792 if (operands[opno].form != TIC6X_OP_MEM_NOUNREG
2793 && operands[opno].form != TIC6X_OP_MEM_UNREG)
2794 abort ();
2795 mem = operands[opno].value.mem;
2796 tic6x_default_mem_ref (&mem);
2797 switch (mem.mod)
2798 {
2799 case tic6x_mem_mod_plus:
2800 value = 1;
2801 break;
2802
2803 case tic6x_mem_mod_minus:
2804 value = 0;
2805 break;
2806
2807 case tic6x_mem_mod_preinc:
2808 value = 9;
2809 break;
2810
2811 case tic6x_mem_mod_predec:
2812 value = 8;
2813 break;
2814
2815 case tic6x_mem_mod_postinc:
2816 value = 11;
2817 break;
2818
2819 case tic6x_mem_mod_postdec:
2820 value = 10;
2821 break;
2822
2823 default:
2824 abort ();
2825 }
2826 value += (mem.offset_is_reg ? 4 : 0);
2827 break;
2828
2829 case tic6x_coding_scaled:
2830 if (operands[opno].form != TIC6X_OP_MEM_UNREG)
2831 abort ();
2832 mem = operands[opno].value.mem;
2833 tic6x_default_mem_ref (&mem);
2834 switch (mem.scaled)
2835 {
2836 case tic6x_offset_unscaled:
2837 value = 0;
2838 break;
2839
2840 case tic6x_offset_scaled:
2841 value = 1;
2842 break;
2843
2844 default:
2845 abort ();
2846 }
2847 break;
2848
2849 case tic6x_coding_spmask:
2850 /* The position of such a field is hardcoded in the handling
2851 of "||^". */
2852 if (fldd->low_pos != 18)
2853 abort ();
2854 value = 0;
2855 for (opno = 0; opno < num_operands; opno++)
2856 {
2857 unsigned int v;
2858
2859 v = tic6x_encode_spmask (operands[opno].value.func_unit.base,
2860 operands[opno].value.func_unit.side);
2861 if (value & v)
2862 {
2863 if (print_errors)
2864 as_bad (_("functional unit already masked for operand "
2865 "%u of '%.*s'"), opno + 1, opc_len, str);
2866 *ok = FALSE;
2867 return 0;
2868 }
2869 value |= v;
2870 }
2871 break;
2872
2873 case tic6x_coding_reg_unused:
2874 /* This is a placeholder; correct handling goes along with
2875 resource constraint checks. */
2876 value = 0;
2877 break;
2878
2879 case tic6x_coding_fstg:
2880 case tic6x_coding_fcyc:
2881 if (operands[opno].form != TIC6X_OP_EXP)
2882 abort ();
2883 if (operands[opno].value.exp.X_op != O_constant)
2884 abort ();
2885 if (!sploop_ii)
2886 {
2887 if (print_errors)
2888 as_bad (_("'%.*s' instruction not in a software "
2889 "pipelined loop"),
2890 opc_len, str);
2891 *ok = FALSE;
2892 return 0;
2893 }
2894
2895 if (sploop_ii <= 1)
2896 fcyc_bits = 0;
2897 else if (sploop_ii <= 2)
2898 fcyc_bits = 1;
2899 else if (sploop_ii <= 4)
2900 fcyc_bits = 2;
2901 else if (sploop_ii <= 8)
2902 fcyc_bits = 3;
2903 else if (sploop_ii <= 14)
2904 fcyc_bits = 4;
2905 else
2906 abort ();
2907 if (fcyc_bits > fldd->width)
2908 abort ();
2909
2910 if (opct->variable_fields[fld].coding_method == tic6x_coding_fstg)
2911 {
2912 int i, t;
2913 if (operands[opno].value.exp.X_add_number < 0
2914 || (operands[opno].value.exp.X_add_number
2915 >= (1 << (fldd->width - fcyc_bits))))
2916 {
2917 if (print_errors)
2918 as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
2919 opc_len, str);
2920 *ok = FALSE;
2921 return 0;
2922 }
2923 value = operands[opno].value.exp.X_add_number;
2924 for (t = 0, i = fcyc_bits; i < fldd->width; i++)
2925 {
2926 t = (t << 1) | (value & 1);
2927 value >>= 1;
2928 }
2929 value = t << fcyc_bits;
2930 }
2931 else
2932 {
2933 if (operands[opno].value.exp.X_add_number < 0
2934 || (operands[opno].value.exp.X_add_number >= sploop_ii))
2935 {
2936 if (print_errors)
2937 as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
2938 opc_len, str);
2939 *ok = FALSE;
2940 return 0;
2941 }
2942 value = operands[opno].value.exp.X_add_number;
2943 }
2944 break;
2945
2946 case tic6x_coding_fu:
2947 value = func_unit_side == 2 ? 1 : 0;
2948 break;
2949
2950 case tic6x_coding_data_fu:
2951 value = func_unit_data_side == 2 ? 1 : 0;
2952 break;
2953
2954 case tic6x_coding_xpath:
2955 value = func_unit_cross;
2956 break;
2957
2958 default:
2959 abort ();
2960 }
2961
2962 for (ffld = 0; ffld < opct->num_fixed_fields; ffld++)
2963 if ((opct->fixed_fields[ffld].field_id
2964 == opct->variable_fields[fld].field_id)
2965 && (value < opct->fixed_fields[ffld].min_val
2966 || value > opct->fixed_fields[ffld].max_val))
2967 {
2968 if (print_errors)
2969 as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
2970 opc_len, str);
2971 *ok = FALSE;
2972 return 0;
2973 }
2974
2975 opcode_value |= value << fldd->low_pos;
2976 }
2977
2978 if (this_line_creg)
2979 {
2980 const tic6x_insn_field *creg;
2981 const tic6x_insn_field *z;
2982
2983 creg = tic6x_field_from_fmt (fmt, tic6x_field_creg);
2984 if (creg == NULL)
2985 {
2986 if (print_errors)
2987 as_bad (_("instruction '%.*s' cannot be predicated"),
2988 opc_len, str);
2989 *ok = FALSE;
2990 return 0;
2991 }
2992 z = tic6x_field_from_fmt (fmt, tic6x_field_z);
2993 /* If there is a creg field, there must be a z field; otherwise
2994 there is an error in the format table. */
2995 if (z == NULL)
2996 abort ();
2997
2998 opcode_value |= this_line_creg << creg->low_pos;
2999 opcode_value |= this_line_z << z->low_pos;
3000 }
3001
3002 *ok = TRUE;
3003 return opcode_value;
3004 }
3005
3006 /* Convert the target integer stored in N bytes in BUF to a host
3007 integer, returning that value. */
3008
3009 static valueT
3010 md_chars_to_number (char *buf, int n)
3011 {
3012 valueT result = 0;
3013 unsigned char *p = (unsigned char *) buf;
3014
3015 if (target_big_endian)
3016 {
3017 while (n--)
3018 {
3019 result <<= 8;
3020 result |= (*p++ & 0xff);
3021 }
3022 }
3023 else
3024 {
3025 while (n--)
3026 {
3027 result <<= 8;
3028 result |= (p[n] & 0xff);
3029 }
3030 }
3031
3032 return result;
3033 }
3034
3035 /* Assemble the instruction starting at STR (an opcode, with the
3036 opcode name all-lowercase). */
3037
3038 void
3039 md_assemble (char *str)
3040 {
3041 char *p;
3042 int opc_len;
3043 bfd_boolean this_line_parallel;
3044 bfd_boolean this_line_spmask;
3045 unsigned int this_line_creg;
3046 unsigned int this_line_z;
3047 tic6x_label_list *this_insn_label_list;
3048 segment_info_type *seginfo;
3049 tic6x_opcode_list *opc_list, *opc;
3050 tic6x_func_unit_base func_unit_base = tic6x_func_unit_nfu;
3051 unsigned int func_unit_side = 0;
3052 unsigned int func_unit_cross = 0;
3053 unsigned int cross_side = 0;
3054 unsigned int func_unit_data_side = 0;
3055 unsigned int max_matching_opcodes, num_matching_opcodes;
3056 tic6x_opcode_id *opcm = NULL;
3057 unsigned int opc_rank[TIC6X_NUM_PREFER];
3058 const tic6x_opcode *opct = NULL;
3059 int min_rank, try_rank, max_rank;
3060 bfd_boolean num_operands_permitted[TIC6X_MAX_SOURCE_OPERANDS + 1]
3061 = { FALSE };
3062 unsigned int operand_forms[TIC6X_MAX_SOURCE_OPERANDS] = { 0 };
3063 tic6x_operand operands[TIC6X_MAX_SOURCE_OPERANDS];
3064 unsigned int max_num_operands;
3065 unsigned int num_operands_read;
3066 bfd_boolean ok_this_arch, ok_this_fu, ok_this_arch_fu;
3067 bfd_boolean bad_operands = FALSE;
3068 unsigned int opcode_value;
3069 bfd_boolean encoded_ok;
3070 bfd_boolean fix_needed = FALSE;
3071 expressionS *fix_exp = NULL;
3072 int fix_pcrel = 0;
3073 bfd_reloc_code_real_type fx_r_type = BFD_RELOC_UNUSED;
3074 bfd_boolean fix_adda = FALSE;
3075 fragS *insn_frag;
3076 char *output;
3077
3078 p = str;
3079 while (*p && !is_end_of_line[(unsigned char) *p] && *p != ' ')
3080 p++;
3081
3082 /* This function should only have been called when there is actually
3083 an instruction to assemble. */
3084 if (p == str)
3085 abort ();
3086
3087 /* Now an instruction has been seen, architecture attributes from
3088 .arch directives merge with rather than overriding the previous
3089 value. */
3090 tic6x_seen_insns = TRUE;
3091 /* If no .arch directives or -march options have been seen, we are
3092 assessing instruction validity based on the C674X default, so set
3093 the attribute accordingly. */
3094 if (tic6x_arch_attribute == C6XABI_Tag_ISA_none)
3095 tic6x_arch_attribute = C6XABI_Tag_ISA_C674X;
3096
3097 /* Reset global settings for parallel bars and predicates now to
3098 avoid extra errors if there are problems with this opcode. */
3099 this_line_parallel = tic6x_line_parallel;
3100 this_line_spmask = tic6x_line_spmask;
3101 this_line_creg = tic6x_line_creg;
3102 this_line_z = tic6x_line_z;
3103 tic6x_line_parallel = FALSE;
3104 tic6x_line_spmask = FALSE;
3105 tic6x_line_creg = 0;
3106 tic6x_line_z = 0;
3107 seginfo = seg_info (now_seg);
3108 this_insn_label_list = seginfo->tc_segment_info_data.label_list;
3109 seginfo->tc_segment_info_data.label_list = NULL;
3110
3111 opc_list = hash_find_n (opcode_hash, str, p - str);
3112 if (opc_list == NULL)
3113 {
3114 char c = *p;
3115 *p = 0;
3116 as_bad (_("unknown opcode '%s'"), str);
3117 *p = c;
3118 return;
3119 }
3120
3121 opc_len = p - str;
3122 skip_whitespace (p);
3123
3124 /* See if there is something that looks like a functional unit
3125 specifier. */
3126 if (*p == '.')
3127 {
3128 bfd_boolean good_func_unit;
3129 tic6x_func_unit_base maybe_base = tic6x_func_unit_nfu;
3130 unsigned int maybe_side = 0;
3131 unsigned int maybe_cross = 0;
3132 unsigned int maybe_data_side = 0;
3133
3134 good_func_unit = tic6x_parse_func_unit_base (p + 1, &maybe_base,
3135 &maybe_side);
3136
3137 if (good_func_unit)
3138 {
3139 if (p[3] == ' ' || is_end_of_line[(unsigned char) p[3]])
3140 p += 3;
3141 else if ((p[3] == 'x' || p[3] == 'X')
3142 && (p[4] == ' ' || is_end_of_line[(unsigned char) p[4]]))
3143 {
3144 maybe_cross = 1;
3145 p += 4;
3146 }
3147 else if (maybe_base == tic6x_func_unit_d
3148 && (p[3] == 't' || p[3] == 'T')
3149 && (p[4] == '1' || p[4] == '2')
3150 && (p[5] == ' ' || is_end_of_line[(unsigned char) p[5]]))
3151 {
3152 maybe_data_side = p[4] - '0';
3153 p += 5;
3154 }
3155 else
3156 good_func_unit = FALSE;
3157 }
3158
3159 if (good_func_unit)
3160 {
3161 func_unit_base = maybe_base;
3162 func_unit_side = maybe_side;
3163 func_unit_cross = maybe_cross;
3164 cross_side = (func_unit_cross ? 3 - func_unit_side : func_unit_side);
3165 func_unit_data_side = maybe_data_side;
3166 }
3167
3168 skip_whitespace (p);
3169 }
3170
3171 /* Determine which entries in the opcode table match, and the
3172 associated permitted forms of operands. */
3173 max_matching_opcodes = 0;
3174 for (opc = opc_list; opc; opc = opc->next)
3175 max_matching_opcodes++;
3176 num_matching_opcodes = 0;
3177 opcm = xmalloc (max_matching_opcodes * sizeof (*opcm));
3178 max_num_operands = 0;
3179 ok_this_arch = FALSE;
3180 ok_this_fu = FALSE;
3181 ok_this_arch_fu = FALSE;
3182 for (opc = opc_list; opc; opc = opc->next)
3183 {
3184 unsigned int num_operands;
3185 unsigned int i;
3186 bfd_boolean this_opc_arch_ok = TRUE;
3187 bfd_boolean this_opc_fu_ok = TRUE;
3188
3189 if (tic6x_insn_format_table[tic6x_opcode_table[opc->id].format].num_bits
3190 != 32)
3191 continue;
3192 if (!(tic6x_opcode_table[opc->id].isa_variants & tic6x_features))
3193 this_opc_arch_ok = FALSE;
3194 if (tic6x_opcode_table[opc->id].func_unit != func_unit_base)
3195 this_opc_fu_ok = FALSE;
3196 if (func_unit_side == 1
3197 && (tic6x_opcode_table[opc->id].flags & TIC6X_FLAG_SIDE_B_ONLY))
3198 this_opc_fu_ok = FALSE;
3199 if (func_unit_cross
3200 && (tic6x_opcode_table[opc->id].flags & TIC6X_FLAG_NO_CROSS))
3201 this_opc_fu_ok = FALSE;
3202 if (!func_unit_data_side
3203 && (tic6x_opcode_table[opc->id].flags
3204 & (TIC6X_FLAG_LOAD | TIC6X_FLAG_STORE)))
3205 this_opc_fu_ok = FALSE;
3206 if (func_unit_data_side
3207 && !(tic6x_opcode_table[opc->id].flags
3208 & (TIC6X_FLAG_LOAD | TIC6X_FLAG_STORE)))
3209 this_opc_fu_ok = FALSE;
3210 if (func_unit_data_side == 1
3211 && (tic6x_opcode_table[opc->id].flags & TIC6X_FLAG_SIDE_T2_ONLY))
3212 this_opc_fu_ok = FALSE;
3213 if (this_opc_arch_ok)
3214 ok_this_arch = TRUE;
3215 if (this_opc_fu_ok)
3216 ok_this_fu = TRUE;
3217 if (!this_opc_arch_ok || !this_opc_fu_ok)
3218 continue;
3219 ok_this_arch_fu = TRUE;
3220 opcm[num_matching_opcodes] = opc->id;
3221 num_matching_opcodes++;
3222 num_operands = tic6x_opcode_table[opc->id].num_operands;
3223
3224 if (tic6x_opcode_table[opc->id].flags & TIC6X_FLAG_SPMASK)
3225 {
3226 if (num_operands != 1
3227 || (tic6x_opcode_table[opc->id].operand_info[0].form
3228 != tic6x_operand_func_unit))
3229 abort ();
3230 num_operands = 8;
3231 for (i = 0; i < num_operands; i++)
3232 {
3233 operand_forms[i]
3234 |= tic6x_coarse_operand_form (tic6x_operand_func_unit);
3235 num_operands_permitted[i] = TRUE;
3236 }
3237 }
3238 else
3239 {
3240 for (i = 0; i < num_operands; i++)
3241 {
3242 tic6x_operand_form f
3243 = tic6x_opcode_table[opc->id].operand_info[i].form;
3244
3245 operand_forms[i] |= tic6x_coarse_operand_form (f);
3246 }
3247 }
3248 num_operands_permitted[num_operands] = TRUE;
3249 if (num_operands > max_num_operands)
3250 max_num_operands = num_operands;
3251 }
3252
3253 if (!ok_this_arch)
3254 {
3255 as_bad (_("'%.*s' instruction not supported on this architecture"),
3256 opc_len, str);
3257 free (opcm);
3258 return;
3259 }
3260
3261 if (!ok_this_fu)
3262 {
3263 as_bad (_("'%.*s' instruction not supported on this functional unit"),
3264 opc_len, str);
3265 free (opcm);
3266 return;
3267 }
3268
3269 if (!ok_this_arch_fu)
3270 {
3271 as_bad (_("'%.*s' instruction not supported on this functional unit"
3272 " for this architecture"),
3273 opc_len, str);
3274 free (opcm);
3275 return;
3276 }
3277
3278 /* If there were no instructions matching the above availability
3279 checks, we should now have given an error and returned. */
3280 if (num_matching_opcodes == 0)
3281 abort ();
3282
3283 num_operands_read = 0;
3284 while (TRUE)
3285 {
3286 skip_whitespace (p);
3287 if (is_end_of_line[(unsigned char) *p])
3288 {
3289 if (num_operands_read > 0)
3290 {
3291 as_bad (_("missing operand after comma"));
3292 bad_operands = TRUE;
3293 }
3294 break;
3295 }
3296
3297 if (max_num_operands == 0)
3298 {
3299 as_bad (_("too many operands to '%.*s'"), opc_len, str);
3300 bad_operands = TRUE;
3301 break;
3302 }
3303
3304 if (!tic6x_parse_operand (&p, &operands[num_operands_read],
3305 operand_forms[num_operands_read], str, opc_len,
3306 num_operands_read + 1))
3307 bad_operands = TRUE;
3308 num_operands_read++;
3309
3310 if (is_end_of_line[(unsigned char) *p])
3311 break;
3312 else if (*p == ',')
3313 {
3314 p++;
3315 if (num_operands_read == max_num_operands)
3316 {
3317 as_bad (_("too many operands to '%.*s'"), opc_len, str);
3318 bad_operands = TRUE;
3319 break;
3320 }
3321 continue;
3322 }
3323 else
3324 /* Operand parsing should consume whole operands. */
3325 abort ();
3326 }
3327
3328 if (!bad_operands && !num_operands_permitted[num_operands_read])
3329 {
3330 as_bad (_("bad number of operands to '%.*s'"), opc_len, str);
3331 bad_operands = TRUE;
3332 }
3333
3334 if (!bad_operands)
3335 {
3336 /* Each operand is of the right syntactic form for some opcode
3337 choice, and the number of operands is valid. Check that each
3338 operand is OK in detail for some opcode choice with the right
3339 number of operands. */
3340 unsigned int i;
3341
3342 for (i = 0; i < num_operands_read; i++)
3343 {
3344 bfd_boolean coarse_ok = FALSE;
3345 bfd_boolean fine_ok = FALSE;
3346 tic6x_operand_match fine_failure = tic6x_match_matches;
3347 unsigned int j;
3348
3349 for (j = 0; j < num_matching_opcodes; j++)
3350 {
3351 tic6x_operand_form f;
3352 tic6x_rw rw;
3353 unsigned int cf;
3354 tic6x_operand_match this_fine_failure;
3355
3356 if (tic6x_opcode_table[opcm[j]].flags & TIC6X_FLAG_SPMASK)
3357 {
3358 f = tic6x_operand_func_unit;
3359 rw = tic6x_rw_none;
3360 }
3361 else
3362 {
3363 if (tic6x_opcode_table[opcm[j]].num_operands
3364 != num_operands_read)
3365 continue;
3366
3367 f = tic6x_opcode_table[opcm[j]].operand_info[i].form;
3368 rw = tic6x_opcode_table[opcm[j]].operand_info[i].rw;
3369 }
3370 cf = tic6x_coarse_operand_form (f);
3371
3372 if (operands[i].form != cf)
3373 continue;
3374
3375 coarse_ok = TRUE;
3376 this_fine_failure
3377 = tic6x_operand_matches_form (&operands[i], f, rw,
3378 func_unit_side,
3379 cross_side,
3380 func_unit_data_side);
3381 if (this_fine_failure == tic6x_match_matches)
3382 {
3383 fine_ok = TRUE;
3384 break;
3385 }
3386 if (fine_failure == tic6x_match_matches
3387 || fine_failure > this_fine_failure)
3388 fine_failure = this_fine_failure;
3389 }
3390
3391 /* No instructions should have operand syntactic forms only
3392 acceptable with certain numbers of operands, so no
3393 diagnostic for this case. */
3394 if (!coarse_ok)
3395 abort ();
3396
3397 if (!fine_ok)
3398 {
3399 switch (fine_failure)
3400 {
3401 case tic6x_match_non_const:
3402 as_bad (_("operand %u of '%.*s' not constant"),
3403 i + 1, opc_len, str);
3404 break;
3405
3406 case tic6x_match_wrong_side:
3407 as_bad (_("operand %u of '%.*s' on wrong side"),
3408 i + 1, opc_len, str);
3409 break;
3410
3411 case tic6x_match_bad_return:
3412 as_bad (_("operand %u of '%.*s' not a valid return "
3413 "address register"),
3414 i + 1, opc_len, str);
3415 break;
3416
3417 case tic6x_match_ctrl_write_only:
3418 as_bad (_("operand %u of '%.*s' is write-only"),
3419 i + 1, opc_len, str);
3420 break;
3421
3422 case tic6x_match_ctrl_read_only:
3423 as_bad (_("operand %u of '%.*s' is read-only"),
3424 i + 1, opc_len, str);
3425 break;
3426
3427 case tic6x_match_bad_mem:
3428 as_bad (_("operand %u of '%.*s' not a valid memory "
3429 "reference"),
3430 i + 1, opc_len, str);
3431 break;
3432
3433 case tic6x_match_bad_address:
3434 as_bad (_("operand %u of '%.*s' not a valid base "
3435 "address register"),
3436 i + 1, opc_len, str);
3437 break;
3438
3439 default:
3440 abort ();
3441 }
3442 bad_operands = TRUE;
3443 break;
3444 }
3445 }
3446 }
3447
3448 if (!bad_operands)
3449 {
3450 /* Each operand is OK for some opcode choice, and the number of
3451 operands is valid. Check whether there is an opcode choice
3452 for which all operands are simultaneously valid. */
3453 unsigned int i;
3454 bfd_boolean found_match = FALSE;
3455
3456 for (i = 0; i < TIC6X_NUM_PREFER; i++)
3457 opc_rank[i] = (unsigned int) -1;
3458
3459 min_rank = TIC6X_NUM_PREFER - 1;
3460 max_rank = 0;
3461
3462 for (i = 0; i < num_matching_opcodes; i++)
3463 {
3464 unsigned int j;
3465 bfd_boolean this_matches = TRUE;
3466
3467 if (!(tic6x_opcode_table[opcm[i]].flags & TIC6X_FLAG_SPMASK)
3468 && tic6x_opcode_table[opcm[i]].num_operands != num_operands_read)
3469 continue;
3470
3471 for (j = 0; j < num_operands_read; j++)
3472 {
3473 tic6x_operand_form f;
3474 tic6x_rw rw;
3475
3476 if (tic6x_opcode_table[opcm[i]].flags & TIC6X_FLAG_SPMASK)
3477 {
3478 f = tic6x_operand_func_unit;
3479 rw = tic6x_rw_none;
3480 }
3481 else
3482 {
3483 f = tic6x_opcode_table[opcm[i]].operand_info[j].form;
3484 rw = tic6x_opcode_table[opcm[i]].operand_info[j].rw;
3485 }
3486 if (tic6x_operand_matches_form (&operands[j], f, rw,
3487 func_unit_side,
3488 cross_side,
3489 func_unit_data_side)
3490 != tic6x_match_matches)
3491 {
3492 this_matches = FALSE;
3493 break;
3494 }
3495 }
3496
3497 if (this_matches)
3498 {
3499 int rank = TIC6X_PREFER_VAL (tic6x_opcode_table[opcm[i]].flags);
3500
3501 if (rank < min_rank)
3502 min_rank = rank;
3503 if (rank > max_rank)
3504 max_rank = rank;
3505
3506 if (opc_rank[rank] == (unsigned int) -1)
3507 opc_rank[rank] = i;
3508 else
3509 /* The opcode table should provide a total ordering
3510 for all cases where multiple matches may get
3511 here. */
3512 abort ();
3513
3514 found_match = TRUE;
3515 }
3516 }
3517
3518 if (!found_match)
3519 {
3520 as_bad (_("bad operand combination for '%.*s'"), opc_len, str);
3521 bad_operands = TRUE;
3522 }
3523 }
3524
3525 if (bad_operands)
3526 {
3527 free (opcm);
3528 return;
3529 }
3530
3531 opcode_value = 0;
3532 encoded_ok = FALSE;
3533 for (try_rank = max_rank; try_rank >= min_rank; try_rank--)
3534 {
3535 fix_needed = FALSE;
3536
3537 if (opc_rank[try_rank] == (unsigned int) -1)
3538 continue;
3539
3540 opcode_value = tic6x_try_encode (opcm[opc_rank[try_rank]], operands,
3541 num_operands_read, this_line_creg,
3542 this_line_z, func_unit_side,
3543 func_unit_cross, func_unit_data_side,
3544 seginfo->tc_segment_info_data.sploop_ii,
3545 &fix_exp, &fix_pcrel, &fx_r_type,
3546 &fix_adda, &fix_needed, &encoded_ok,
3547 (try_rank == min_rank ? TRUE : FALSE),
3548 str, opc_len);
3549 if (encoded_ok)
3550 {
3551 opct = &tic6x_opcode_table[opcm[opc_rank[try_rank]]];
3552 break;
3553 }
3554 }
3555
3556 free (opcm);
3557
3558 if (!encoded_ok)
3559 return;
3560
3561 if (this_line_parallel)
3562 {
3563 insn_frag = seginfo->tc_segment_info_data.execute_packet_frag;
3564 if (insn_frag == NULL)
3565 {
3566 as_bad (_("parallel instruction not following another instruction"));
3567 return;
3568 }
3569
3570 if (insn_frag->fr_fix >= 32)
3571 {
3572 as_bad (_("too many instructions in execute packet"));
3573 return;
3574 }
3575
3576 if (this_insn_label_list != NULL)
3577 as_bad (_("label not at start of execute packet"));
3578
3579 if (opct->flags & TIC6X_FLAG_FIRST)
3580 as_bad (_("'%.*s' instruction not at start of execute packet"),
3581 opc_len, str);
3582
3583 *seginfo->tc_segment_info_data.last_insn_lsb |= 0x1;
3584 output = insn_frag->fr_literal + insn_frag->fr_fix;
3585 }
3586 else
3587 {
3588 tic6x_label_list *l;
3589
3590 seginfo->tc_segment_info_data.spmask_addr = NULL;
3591 seginfo->tc_segment_info_data.func_units_used = 0;
3592
3593 /* Start a new frag for this execute packet. */
3594 if (frag_now_fix () != 0)
3595 {
3596 if (frag_now->fr_type != rs_machine_dependent)
3597 frag_wane (frag_now);
3598
3599 frag_new (0);
3600 }
3601 frag_grow (32);
3602 insn_frag = seginfo->tc_segment_info_data.execute_packet_frag = frag_now;
3603 for (l = this_insn_label_list; l; l = l->next)
3604 {
3605 symbol_set_frag (l->label, frag_now);
3606 S_SET_VALUE (l->label, 0);
3607 S_SET_SEGMENT (l->label, now_seg);
3608 }
3609 tic6x_free_label_list (this_insn_label_list);
3610 dwarf2_emit_insn (0);
3611 output = frag_var (rs_machine_dependent, 32, 32, 0, NULL, 0, NULL);
3612 /* This must be the same as the frag to which a pointer was just
3613 saved. */
3614 if (output != insn_frag->fr_literal)
3615 abort ();
3616 insn_frag->tc_frag_data.is_insns = TRUE;
3617 insn_frag->tc_frag_data.can_cross_fp_boundary
3618 = tic6x_can_cross_fp_boundary;
3619 }
3620
3621 if (func_unit_base != tic6x_func_unit_nfu)
3622 {
3623 unsigned int func_unit_enc;
3624
3625 func_unit_enc = tic6x_encode_spmask (func_unit_base, func_unit_side);
3626
3627 if (seginfo->tc_segment_info_data.func_units_used & func_unit_enc)
3628 as_bad (_("functional unit already used in this execute packet"));
3629
3630 seginfo->tc_segment_info_data.func_units_used |= func_unit_enc;
3631 }
3632
3633 if (opct->flags & TIC6X_FLAG_SPLOOP)
3634 {
3635 if (seginfo->tc_segment_info_data.sploop_ii)
3636 as_bad (_("nested software pipelined loop"));
3637 if (num_operands_read != 1
3638 || operands[0].form != TIC6X_OP_EXP
3639 || operands[0].value.exp.X_op != O_constant)
3640 abort ();
3641 seginfo->tc_segment_info_data.sploop_ii
3642 = operands[0].value.exp.X_add_number;
3643 }
3644 else if (opct->flags & TIC6X_FLAG_SPKERNEL)
3645 {
3646 if (!seginfo->tc_segment_info_data.sploop_ii)
3647 as_bad (_("'%.*s' instruction not in a software pipelined loop"),
3648 opc_len, str);
3649 seginfo->tc_segment_info_data.sploop_ii = 0;
3650 }
3651
3652 if (this_line_spmask)
3653 {
3654 if (seginfo->tc_segment_info_data.spmask_addr == NULL)
3655 as_bad (_("'||^' without previous SPMASK"));
3656 else if (func_unit_base == tic6x_func_unit_nfu)
3657 as_bad (_("cannot mask instruction using no functional unit"));
3658 else
3659 {
3660 unsigned int spmask_opcode;
3661 unsigned int mask_bit;
3662
3663 spmask_opcode
3664 = md_chars_to_number (seginfo->tc_segment_info_data.spmask_addr,
3665 4);
3666 mask_bit = tic6x_encode_spmask (func_unit_base, func_unit_side);
3667 mask_bit <<= 18;
3668 if (spmask_opcode & mask_bit)
3669 as_bad (_("functional unit already masked"));
3670 spmask_opcode |= mask_bit;
3671 md_number_to_chars (seginfo->tc_segment_info_data.spmask_addr,
3672 spmask_opcode, 4);
3673 }
3674 }
3675
3676 record_alignment (now_seg, 5);
3677 md_number_to_chars (output, opcode_value, 4);
3678 if (fix_needed)
3679 tic6x_fix_new_exp (insn_frag, output - insn_frag->fr_literal, 4, fix_exp,
3680 fix_pcrel, fx_r_type, fix_adda);
3681 insn_frag->fr_fix += 4;
3682 insn_frag->fr_var -= 4;
3683 seginfo->tc_segment_info_data.last_insn_lsb
3684 = (target_big_endian ? output + 3 : output);
3685 if (opct->flags & TIC6X_FLAG_SPMASK)
3686 seginfo->tc_segment_info_data.spmask_addr = output;
3687 }
3688
3689 /* Modify NEWVAL (32-bit) by inserting VALUE, shifted right by SHIFT
3690 and the least significant BITS bits taken, at position POS. */
3691 #define MODIFY_VALUE(NEWVAL, VALUE, SHIFT, POS, BITS) \
3692 do { \
3693 (NEWVAL) &= 0xffffffffU & ~(((1U << (BITS)) - 1) << (POS)); \
3694 (NEWVAL) |= (((VALUE) >> (SHIFT)) & ((1U << (BITS)) - 1)) << (POS); \
3695 } while (0)
3696
3697 /* Apply a fixup to the object file. */
3698
3699 void
3700 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
3701 {
3702 offsetT value = *valP;
3703 char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
3704
3705 value = SEXT (value);
3706 *valP = value;
3707
3708 fixP->fx_offset = SEXT (fixP->fx_offset);
3709
3710 if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
3711 fixP->fx_done = 1;
3712
3713 /* We do our own overflow checks. */
3714 fixP->fx_no_overflow = 1;
3715
3716 switch (fixP->fx_r_type)
3717 {
3718 case BFD_RELOC_NONE:
3719 case BFD_RELOC_C6000_EHTYPE:
3720 /* Force output to the object file. */
3721 fixP->fx_done = 0;
3722 break;
3723
3724 case BFD_RELOC_32:
3725 if (fixP->fx_done || !seg->use_rela_p)
3726 md_number_to_chars (buf, value, 4);
3727 break;
3728
3729 case BFD_RELOC_16:
3730 if (fixP->fx_done || !seg->use_rela_p)
3731 {
3732 if (value < -0x8000 || value > 0xffff)
3733 as_bad_where (fixP->fx_file, fixP->fx_line,
3734 _("value too large for 2-byte field"));
3735 md_number_to_chars (buf, value, 2);
3736 }
3737 break;
3738
3739 case BFD_RELOC_8:
3740 if (fixP->fx_done || !seg->use_rela_p)
3741 {
3742 if (value < -0x80 || value > 0xff)
3743 as_bad_where (fixP->fx_file, fixP->fx_line,
3744 _("value too large for 1-byte field"));
3745 md_number_to_chars (buf, value, 1);
3746 }
3747 break;
3748
3749 case BFD_RELOC_C6000_ABS_S16:
3750 case BFD_RELOC_C6000_ABS_L16:
3751 case BFD_RELOC_C6000_SBR_S16:
3752 case BFD_RELOC_C6000_SBR_L16_B:
3753 case BFD_RELOC_C6000_SBR_L16_H:
3754 case BFD_RELOC_C6000_SBR_L16_W:
3755 case BFD_RELOC_C6000_SBR_GOT_L16_W:
3756 if (fixP->fx_done || !seg->use_rela_p)
3757 {
3758 offsetT newval = md_chars_to_number (buf, 4);
3759 int shift;
3760
3761 switch (fixP->fx_r_type)
3762 {
3763 case BFD_RELOC_C6000_SBR_L16_H:
3764 shift = 1;
3765 break;
3766
3767 case BFD_RELOC_C6000_SBR_L16_W:
3768 case BFD_RELOC_C6000_SBR_GOT_L16_W:
3769 shift = 2;
3770 break;
3771
3772 default:
3773 shift = 0;
3774 break;
3775 }
3776
3777 MODIFY_VALUE (newval, value, shift, 7, 16);
3778 if ((value < -0x8000 || value > 0x7fff)
3779 && (fixP->fx_r_type == BFD_RELOC_C6000_ABS_S16
3780 || fixP->fx_r_type == BFD_RELOC_C6000_SBR_S16))
3781 as_bad_where (fixP->fx_file, fixP->fx_line,
3782 _("immediate offset out of range"));
3783
3784 md_number_to_chars (buf, newval, 4);
3785 }
3786 if (fixP->fx_done
3787 && fixP->fx_r_type != BFD_RELOC_C6000_ABS_S16
3788 && fixP->fx_r_type != BFD_RELOC_C6000_ABS_L16)
3789 abort ();
3790 break;
3791
3792 case BFD_RELOC_C6000_ABS_H16:
3793 case BFD_RELOC_C6000_SBR_H16_B:
3794 case BFD_RELOC_C6000_SBR_H16_H:
3795 case BFD_RELOC_C6000_SBR_H16_W:
3796 case BFD_RELOC_C6000_SBR_GOT_H16_W:
3797 if (fixP->fx_done || !seg->use_rela_p)
3798 {
3799 offsetT newval = md_chars_to_number (buf, 4);
3800 int shift;
3801
3802 switch (fixP->fx_r_type)
3803 {
3804 case BFD_RELOC_C6000_SBR_H16_H:
3805 shift = 17;
3806 break;
3807
3808 case BFD_RELOC_C6000_SBR_H16_W:
3809 case BFD_RELOC_C6000_SBR_GOT_H16_W:
3810 shift = 18;
3811 break;
3812
3813 default:
3814 shift = 16;
3815 break;
3816 }
3817
3818 MODIFY_VALUE (newval, value, shift, 7, 16);
3819
3820 md_number_to_chars (buf, newval, 4);
3821 }
3822 if (fixP->fx_done && fixP->fx_r_type != BFD_RELOC_C6000_ABS_H16)
3823 abort ();
3824 break;
3825
3826 case BFD_RELOC_C6000_SBR_U15_B:
3827 if (fixP->fx_done || !seg->use_rela_p)
3828 {
3829 offsetT newval = md_chars_to_number (buf, 4);
3830
3831 MODIFY_VALUE (newval, value, 0, 8, 15);
3832 if (value < 0 || value > 0x7fff)
3833 as_bad_where (fixP->fx_file, fixP->fx_line,
3834 _("immediate offset out of range"));
3835
3836 md_number_to_chars (buf, newval, 4);
3837 }
3838 break;
3839
3840 case BFD_RELOC_C6000_SBR_U15_H:
3841 if (fixP->fx_done || !seg->use_rela_p)
3842 {
3843 offsetT newval = md_chars_to_number (buf, 4);
3844
3845 /* Constant ADDA operands, processed as constant when the
3846 instruction is parsed, are encoded as-is rather than
3847 shifted. If the operand of an ADDA instruction is now
3848 constant (for example, the difference between two labels
3849 found after the instruction), ensure it is encoded the
3850 same way it would have been if the constant value had
3851 been known when the instruction was parsed. */
3852 if (fixP->tc_fix_data.fix_adda && fixP->fx_done)
3853 value <<= 1;
3854
3855 MODIFY_VALUE (newval, value, 1, 8, 15);
3856 if (value & 1)
3857 as_bad_where (fixP->fx_file, fixP->fx_line,
3858 _("immediate offset not 2-byte-aligned"));
3859 if (value < 0 || value > 0xfffe)
3860 as_bad_where (fixP->fx_file, fixP->fx_line,
3861 _("immediate offset out of range"));
3862
3863 md_number_to_chars (buf, newval, 4);
3864 }
3865 break;
3866
3867 case BFD_RELOC_C6000_SBR_U15_W:
3868 case BFD_RELOC_C6000_SBR_GOT_U15_W:
3869 if (fixP->fx_done || !seg->use_rela_p)
3870 {
3871 offsetT newval = md_chars_to_number (buf, 4);
3872
3873 /* Constant ADDA operands, processed as constant when the
3874 instruction is parsed, are encoded as-is rather than
3875 shifted. If the operand of an ADDA instruction is now
3876 constant (for example, the difference between two labels
3877 found after the instruction), ensure it is encoded the
3878 same way it would have been if the constant value had
3879 been known when the instruction was parsed. */
3880 if (fixP->tc_fix_data.fix_adda && fixP->fx_done)
3881 value <<= 2;
3882
3883 MODIFY_VALUE (newval, value, 2, 8, 15);
3884 if (value & 3)
3885 as_bad_where (fixP->fx_file, fixP->fx_line,
3886 _("immediate offset not 4-byte-aligned"));
3887 if (value < 0 || value > 0x1fffc)
3888 as_bad_where (fixP->fx_file, fixP->fx_line,
3889 _("immediate offset out of range"));
3890
3891 md_number_to_chars (buf, newval, 4);
3892 }
3893 if (fixP->fx_done && fixP->fx_r_type != BFD_RELOC_C6000_SBR_U15_W)
3894 abort ();
3895 break;
3896
3897 case BFD_RELOC_C6000_DSBT_INDEX:
3898 if (value != 0)
3899 as_bad_where (fixP->fx_file, fixP->fx_line,
3900 _("addend used with $DSBT_INDEX"));
3901 if (fixP->fx_done)
3902 abort ();
3903 break;
3904
3905 case BFD_RELOC_C6000_PCR_S21:
3906 if (fixP->fx_done || !seg->use_rela_p)
3907 {
3908 offsetT newval = md_chars_to_number (buf, 4);
3909
3910 MODIFY_VALUE (newval, value, 2, 7, 21);
3911
3912 if (value & 3)
3913 as_bad_where (fixP->fx_file, fixP->fx_line,
3914 _("PC-relative offset not 4-byte-aligned"));
3915 if (value < -0x400000 || value > 0x3ffffc)
3916 as_bad_where (fixP->fx_file, fixP->fx_line,
3917 _("PC-relative offset out of range"));
3918
3919 md_number_to_chars (buf, newval, 4);
3920 }
3921 break;
3922
3923 case BFD_RELOC_C6000_PCR_S12:
3924 if (fixP->fx_done || !seg->use_rela_p)
3925 {
3926 offsetT newval = md_chars_to_number (buf, 4);
3927
3928 MODIFY_VALUE (newval, value, 2, 16, 12);
3929
3930 if (value & 3)
3931 as_bad_where (fixP->fx_file, fixP->fx_line,
3932 _("PC-relative offset not 4-byte-aligned"));
3933 if (value < -0x2000 || value > 0x1ffc)
3934 as_bad_where (fixP->fx_file, fixP->fx_line,
3935 _("PC-relative offset out of range"));
3936
3937 md_number_to_chars (buf, newval, 4);
3938 }
3939 break;
3940
3941 case BFD_RELOC_C6000_PCR_S10:
3942 if (fixP->fx_done || !seg->use_rela_p)
3943 {
3944 offsetT newval = md_chars_to_number (buf, 4);
3945
3946 MODIFY_VALUE (newval, value, 2, 13, 10);
3947
3948 if (value & 3)
3949 as_bad_where (fixP->fx_file, fixP->fx_line,
3950 _("PC-relative offset not 4-byte-aligned"));
3951 if (value < -0x800 || value > 0x7fc)
3952 as_bad_where (fixP->fx_file, fixP->fx_line,
3953 _("PC-relative offset out of range"));
3954
3955 md_number_to_chars (buf, newval, 4);
3956 }
3957 break;
3958
3959 case BFD_RELOC_C6000_PCR_S7:
3960 if (fixP->fx_done || !seg->use_rela_p)
3961 {
3962 offsetT newval = md_chars_to_number (buf, 4);
3963
3964 MODIFY_VALUE (newval, value, 2, 16, 7);
3965
3966 if (value & 3)
3967 as_bad_where (fixP->fx_file, fixP->fx_line,
3968 _("PC-relative offset not 4-byte-aligned"));
3969 if (value < -0x100 || value > 0xfc)
3970 as_bad_where (fixP->fx_file, fixP->fx_line,
3971 _("PC-relative offset out of range"));
3972
3973 md_number_to_chars (buf, newval, 4);
3974 }
3975 break;
3976
3977 case BFD_RELOC_C6000_PREL31:
3978 /* Force output to the object file. */
3979 fixP->fx_done = 0;
3980 break;
3981
3982 default:
3983 abort ();
3984 }
3985 }
3986
3987 /* Convert a floating-point number to target (IEEE) format. */
3988
3989 char *
3990 md_atof (int type, char *litP, int *sizeP)
3991 {
3992 return ieee_md_atof (type, litP, sizeP, target_big_endian);
3993 }
3994
3995 /* Adjust the frags in SECTION (see tic6x_end). */
3996
3997 static void
3998 tic6x_adjust_section (bfd *abfd ATTRIBUTE_UNUSED, segT section,
3999 void *dummy ATTRIBUTE_UNUSED)
4000 {
4001 segment_info_type *info;
4002 frchainS *frchp;
4003 fragS *fragp;
4004 bfd_boolean have_code = FALSE;
4005 bfd_boolean have_non_code = FALSE;
4006
4007 info = seg_info (section);
4008 if (info == NULL)
4009 return;
4010
4011 for (frchp = info->frchainP; frchp; frchp = frchp->frch_next)
4012 for (fragp = frchp->frch_root; fragp; fragp = fragp->fr_next)
4013 switch (fragp->fr_type)
4014 {
4015 case rs_machine_dependent:
4016 if (fragp->tc_frag_data.is_insns)
4017 have_code = TRUE;
4018 break;
4019
4020 case rs_dummy:
4021 case rs_fill:
4022 if (fragp->fr_fix > 0)
4023 have_non_code = TRUE;
4024 break;
4025
4026 default:
4027 have_non_code = TRUE;
4028 break;
4029 }
4030
4031 /* Process alignment requirements in a code-only section. */
4032 if (have_code && !have_non_code)
4033 {
4034 /* If we need to insert an odd number of instructions to meet an
4035 alignment requirement, there must have been an odd number of
4036 instructions since the last 8-byte-aligned execute packet
4037 boundary. So there must have been an execute packet with an
4038 odd number (and so a number fewer than 8) of instructions
4039 into which we can insert a NOP without breaking any previous
4040 alignments.
4041
4042 If then we need to insert a number 2 mod 4 of instructions,
4043 the number of instructions since the last 16-byte-aligned
4044 execute packet boundary must be 2 mod 4. So between that
4045 boundary and the following 8-byte-aligned boundary there must
4046 either be at least one execute packet with 2-mod-4
4047 instructions, or at least two with an odd number of
4048 instructions; again, greedily inserting NOPs as soon as
4049 possible suffices to meet the alignment requirement.
4050
4051 If then we need to insert 4 instructions, we look between the
4052 last 32-byte-aligned boundary and the following
4053 16-byte-aligned boundary. The sizes of the execute packets
4054 in this range total 4 instructions mod 8, so again there is
4055 room for greedy insertion of NOPs to meet the alignment
4056 requirement, and before any intermediate point with 8-byte
4057 (2-instruction) alignment requirement the sizes of execute
4058 packets (and so the room for NOPs) will total 2 instructions
4059 mod 4 so greedy insertion will not break such alignments.
4060
4061 So we can always meet these alignment requirements by
4062 inserting NOPs in parallel with existing execute packets, and
4063 by induction the approach described above inserts the minimum
4064 number of such NOPs. */
4065
4066 /* The number of NOPs we are currently looking to insert, if we
4067 have gone back to insert NOPs. */
4068 unsigned int want_insert = 0;
4069
4070 /* Out of that number, the number inserted so far in the current
4071 stage of the above algorithm. */
4072 unsigned int want_insert_done_so_far = 0;
4073
4074 /* The position mod 32 at the start of the current frag. */
4075 unsigned int pos = 0;
4076
4077 /* The locations in the frag chain of the most recent frags at
4078 the start of which there is the given alignment. */
4079 frchainS *frchp_last32, *frchp_last16, *frchp_last8;
4080 fragS *fragp_last32, *fragp_last16, *fragp_last8;
4081 unsigned int pos_last32, pos_last16, pos_last8;
4082
4083 frchp_last32 = frchp_last16 = frchp_last8 = info->frchainP;
4084 fragp_last32 = fragp_last16 = fragp_last8 = info->frchainP->frch_root;
4085 pos_last32 = pos_last16 = pos_last8 = 0;
4086
4087 for (frchp = info->frchainP; frchp; frchp = frchp->frch_next)
4088 for (fragp = frchp->frch_root; fragp; fragp = fragp->fr_next)
4089 look_at_frag:
4090 {
4091 bfd_boolean go_back = FALSE;
4092 frchainS *frchp_next;
4093 fragS *fragp_next;
4094
4095 if (fragp->fr_type != rs_machine_dependent)
4096 continue;
4097
4098 if (fragp->tc_frag_data.is_insns
4099 && pos + fragp->fr_fix > 32
4100 && !fragp->tc_frag_data.can_cross_fp_boundary)
4101 {
4102 /* As described above, we should always have met an
4103 alignment requirement by the time we come back to
4104 it. */
4105 if (want_insert)
4106 abort ();
4107
4108 if (pos & 3)
4109 abort ();
4110 want_insert = (32 - pos) >> 2;
4111 if (want_insert > 7)
4112 abort ();
4113 want_insert_done_so_far = 0;
4114 go_back = TRUE;
4115 }
4116
4117 if (!fragp->tc_frag_data.is_insns)
4118 {
4119 unsigned int would_insert_bytes;
4120
4121 if (!(pos & ((1 << fragp->fr_offset) - 1)))
4122 /* This alignment requirement is already met. */
4123 continue;
4124
4125 /* As described above, we should always have met an
4126 alignment requirement by the time we come back to
4127 it. */
4128 if (want_insert)
4129 abort ();
4130
4131 /* We may not be able to meet this requirement within
4132 the given number of characters. */
4133 would_insert_bytes
4134 = ((1 << fragp->fr_offset)
4135 - (pos & ((1 << fragp->fr_offset) - 1)));
4136
4137 if (fragp->fr_subtype != 0
4138 && would_insert_bytes > fragp->fr_subtype)
4139 continue;
4140
4141 /* An unmet alignment must be 8, 16 or 32 bytes;
4142 smaller ones must always be met within code-only
4143 sections and larger ones cause the section not to
4144 be code-only. */
4145 if (fragp->fr_offset != 3
4146 && fragp->fr_offset != 4
4147 && fragp->fr_offset != 5)
4148 abort ();
4149
4150 if (would_insert_bytes & 3)
4151 abort ();
4152 want_insert = would_insert_bytes >> 2;
4153 if (want_insert > 7)
4154 abort ();
4155 want_insert_done_so_far = 0;
4156 go_back = TRUE;
4157 }
4158 else if (want_insert && !go_back)
4159 {
4160 unsigned int num_insns = fragp->fr_fix >> 2;
4161 unsigned int max_poss_nops = 8 - num_insns;
4162
4163 if (max_poss_nops)
4164 {
4165 unsigned int cur_want_nops, max_want_nops, do_nops, i;
4166
4167 if (want_insert & 1)
4168 cur_want_nops = 1;
4169 else if (want_insert & 2)
4170 cur_want_nops = 2;
4171 else if (want_insert & 4)
4172 cur_want_nops = 4;
4173 else
4174 abort ();
4175
4176 max_want_nops = cur_want_nops - want_insert_done_so_far;
4177
4178 do_nops = (max_poss_nops < max_want_nops
4179 ? max_poss_nops
4180 : max_want_nops);
4181 for (i = 0; i < do_nops; i++)
4182 {
4183 md_number_to_chars (fragp->fr_literal + fragp->fr_fix,
4184 0, 4);
4185 if (target_big_endian)
4186 fragp->fr_literal[fragp->fr_fix - 1] |= 0x1;
4187 else
4188 fragp->fr_literal[fragp->fr_fix - 4] |= 0x1;
4189 fragp->fr_fix += 4;
4190 fragp->fr_var -= 4;
4191 }
4192 want_insert_done_so_far += do_nops;
4193 if (want_insert_done_so_far == cur_want_nops)
4194 {
4195 want_insert -= want_insert_done_so_far;
4196 want_insert_done_so_far = 0;
4197 if (want_insert)
4198 go_back = TRUE;
4199 }
4200 }
4201 }
4202 if (go_back)
4203 {
4204 if (want_insert & 1)
4205 {
4206 frchp = frchp_last8;
4207 fragp = fragp_last8;
4208 pos = pos_last8;
4209 }
4210 else if (want_insert & 2)
4211 {
4212 frchp = frchp_last8 = frchp_last16;
4213 fragp = fragp_last8 = fragp_last16;
4214 pos = pos_last8 = pos_last16;
4215 }
4216 else if (want_insert & 4)
4217 {
4218 frchp = frchp_last8 = frchp_last16 = frchp_last32;
4219 fragp = fragp_last8 = fragp_last16 = fragp_last32;
4220 pos = pos_last8 = pos_last16 = pos_last32;
4221 }
4222 else
4223 abort ();
4224
4225 goto look_at_frag;
4226 }
4227
4228 /* Update current position for moving past a code
4229 frag. */
4230 pos += fragp->fr_fix;
4231 pos &= 31;
4232 frchp_next = frchp;
4233 fragp_next = fragp->fr_next;
4234 if (fragp_next == NULL)
4235 {
4236 frchp_next = frchp->frch_next;
4237 if (frchp_next != NULL)
4238 fragp_next = frchp_next->frch_root;
4239 }
4240 if (!(pos & 7))
4241 {
4242 frchp_last8 = frchp_next;
4243 fragp_last8 = fragp_next;
4244 pos_last8 = pos;
4245 }
4246 if (!(pos & 15))
4247 {
4248 frchp_last16 = frchp_next;
4249 fragp_last16 = fragp_next;
4250 pos_last16 = pos;
4251 }
4252 if (!(pos & 31))
4253 {
4254 frchp_last32 = frchp_next;
4255 fragp_last32 = fragp_next;
4256 pos_last32 = pos;
4257 }
4258 }
4259 }
4260
4261 /* Now convert the machine-dependent frags to machine-independent
4262 ones. */
4263 for (frchp = info->frchainP; frchp; frchp = frchp->frch_next)
4264 for (fragp = frchp->frch_root; fragp; fragp = fragp->fr_next)
4265 {
4266 if (fragp->fr_type == rs_machine_dependent)
4267 {
4268 if (fragp->tc_frag_data.is_insns)
4269 frag_wane (fragp);
4270 else
4271 {
4272 fragp->fr_type = rs_align_code;
4273 fragp->fr_var = 1;
4274 *fragp->fr_literal = 0;
4275 }
4276 }
4277 }
4278 }
4279
4280 /* Initialize the machine-dependent parts of a frag. */
4281
4282 void
4283 tic6x_frag_init (fragS *fragp)
4284 {
4285 fragp->tc_frag_data.is_insns = FALSE;
4286 fragp->tc_frag_data.can_cross_fp_boundary = FALSE;
4287 }
4288
4289 /* Set an attribute if it has not already been set by the user. */
4290
4291 static void
4292 tic6x_set_attribute_int (int tag, int value)
4293 {
4294 if (tag < 1
4295 || tag >= NUM_KNOWN_OBJ_ATTRIBUTES)
4296 abort ();
4297 if (!tic6x_attributes_set_explicitly[tag])
4298 bfd_elf_add_proc_attr_int (stdoutput, tag, value);
4299 }
4300
4301 /* Set object attributes deduced from the input file and command line
4302 rather than given explicitly. */
4303 static void
4304 tic6x_set_attributes (void)
4305 {
4306 if (tic6x_arch_attribute == C6XABI_Tag_ISA_none)
4307 tic6x_arch_attribute = C6XABI_Tag_ISA_C674X;
4308
4309 tic6x_set_attribute_int (Tag_ISA, tic6x_arch_attribute);
4310 tic6x_set_attribute_int (Tag_ABI_DSBT, tic6x_dsbt);
4311 tic6x_set_attribute_int (Tag_ABI_PID, tic6x_pid);
4312 tic6x_set_attribute_int (Tag_ABI_PIC, tic6x_pic);
4313 }
4314
4315 /* Do machine-dependent manipulations of the frag chains after all
4316 input has been read and before the machine-independent sizing and
4317 relaxing. */
4318
4319 void
4320 tic6x_end (void)
4321 {
4322 /* Set object attributes at this point if not explicitly set. */
4323 tic6x_set_attributes ();
4324
4325 /* Meeting alignment requirements may require inserting NOPs in
4326 parallel in execute packets earlier in the segment. Future
4327 16-bit instruction generation involves whole-segment optimization
4328 to determine the best choice and ordering of 32-bit or 16-bit
4329 instructions. This doesn't fit will in the general relaxation
4330 framework, so handle alignment and 16-bit instruction generation
4331 here. */
4332 bfd_map_over_sections (stdoutput, tic6x_adjust_section, NULL);
4333 }
4334
4335 /* No machine-dependent frags at this stage; all converted in
4336 tic6x_end. */
4337
4338 void
4339 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec ATTRIBUTE_UNUSED,
4340 fragS *fragp ATTRIBUTE_UNUSED)
4341 {
4342 abort ();
4343 }
4344
4345 /* No machine-dependent frags at this stage; all converted in
4346 tic6x_end. */
4347
4348 int
4349 md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED,
4350 segT seg ATTRIBUTE_UNUSED)
4351 {
4352 abort ();
4353 }
4354
4355 /* Put a number into target byte order. */
4356
4357 void
4358 md_number_to_chars (char *buf, valueT val, int n)
4359 {
4360 if (target_big_endian)
4361 number_to_chars_bigendian (buf, val, n);
4362 else
4363 number_to_chars_littleendian (buf, val, n);
4364 }
4365
4366 /* Machine-dependent operand parsing not currently needed. */
4367
4368 void
4369 md_operand (expressionS *op ATTRIBUTE_UNUSED)
4370 {
4371 }
4372
4373 /* PC-relative operands are relative to the start of the fetch
4374 packet. */
4375
4376 long
4377 tic6x_pcrel_from_section (fixS *fixp, segT sec)
4378 {
4379 if (fixp->fx_addsy != NULL
4380 && (!S_IS_DEFINED (fixp->fx_addsy)
4381 || S_GET_SEGMENT (fixp->fx_addsy) != sec))
4382 return 0;
4383 return (fixp->fx_where + fixp->fx_frag->fr_address) & ~(long) 0x1f;
4384 }
4385
4386 /* Round up a section size to the appropriate boundary. */
4387
4388 valueT
4389 md_section_align (segT segment ATTRIBUTE_UNUSED,
4390 valueT size)
4391 {
4392 /* Round up section sizes to ensure that text sections consist of
4393 whole fetch packets. */
4394 int align = bfd_get_section_alignment (stdoutput, segment);
4395 return ((size + (1 << align) - 1) & ((valueT) -1 << align));
4396 }
4397
4398 /* No special undefined symbol handling needed for now. */
4399
4400 symbolS *
4401 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
4402 {
4403 return NULL;
4404 }
4405
4406 /* Translate internal representation of relocation info to BFD target
4407 format. */
4408
4409 arelent *
4410 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
4411 {
4412 arelent *reloc;
4413 asymbol *symbol;
4414 bfd_reloc_code_real_type r_type;
4415
4416 reloc = xmalloc (sizeof (arelent));
4417 reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
4418 symbol = symbol_get_bfdsym (fixp->fx_addsy);
4419 *reloc->sym_ptr_ptr = symbol;
4420 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
4421 reloc->addend = (tic6x_generate_rela ? fixp->fx_offset : 0);
4422 r_type = fixp->fx_r_type;
4423 reloc->howto = bfd_reloc_type_lookup (stdoutput, r_type);
4424
4425 if (reloc->howto == NULL)
4426 {
4427 as_bad_where (fixp->fx_file, fixp->fx_line,
4428 _("Cannot represent relocation type %s"),
4429 bfd_get_reloc_code_name (r_type));
4430 return NULL;
4431 }
4432
4433 /* Correct for adjustments bfd_install_relocation will make. */
4434 if (reloc->howto->pcrel_offset && reloc->howto->partial_inplace)
4435 {
4436 reloc->addend += reloc->address;
4437 if (!bfd_is_com_section (symbol))
4438 reloc->addend -= symbol->value;
4439 }
4440
4441 return reloc;
4442 }
4443
4444 /* Convert REGNAME to a DWARF-2 register number. */
4445
4446 int
4447 tic6x_regname_to_dw2regnum (char *regname)
4448 {
4449 bfd_boolean reg_ok;
4450 tic6x_register reg;
4451 char *rq = regname;
4452
4453 reg_ok = tic6x_parse_register (&rq, &reg);
4454
4455 if (!reg_ok)
4456 return -1;
4457
4458 switch (reg.side)
4459 {
4460 case 1: /* A regs. */
4461 if (reg.num < 16)
4462 return reg.num;
4463 else if (reg.num < 32)
4464 return (reg.num - 16) + 37;
4465 else
4466 return -1;
4467
4468 case 2: /* B regs. */
4469 if (reg.num < 16)
4470 return reg.num + 16;
4471 else if (reg.num < 32)
4472 return (reg.num - 16) + 53;
4473 else
4474 return -1;
4475
4476 default:
4477 return -1;
4478 }
4479 }
4480
4481 /* Initialize the DWARF-2 unwind information for this procedure. */
4482
4483 void
4484 tic6x_frame_initial_instructions (void)
4485 {
4486 /* CFA is initial stack pointer (B15). */
4487 cfi_add_CFA_def_cfa (31, 0);
4488 }
4489
4490 /* Start an exception table entry. If idx is nonzero this is an index table
4491 entry. */
4492
4493 static void
4494 tic6x_start_unwind_section (const segT text_seg, int idx)
4495 {
4496 tic6x_unwind_info *unwind = tic6x_get_unwind ();
4497 const char * text_name;
4498 const char * prefix;
4499 const char * prefix_once;
4500 const char * group_name;
4501 size_t prefix_len;
4502 size_t text_len;
4503 char * sec_name;
4504 size_t sec_name_len;
4505 int type;
4506 int flags;
4507 int linkonce;
4508
4509 if (idx)
4510 {
4511 prefix = ELF_STRING_C6000_unwind;
4512 prefix_once = ELF_STRING_C6000_unwind_once;
4513 type = SHT_C6000_UNWIND;
4514 }
4515 else
4516 {
4517 prefix = ELF_STRING_C6000_unwind_info;
4518 prefix_once = ELF_STRING_C6000_unwind_info_once;
4519 type = SHT_PROGBITS;
4520 }
4521
4522 text_name = segment_name (text_seg);
4523 if (streq (text_name, ".text"))
4524 text_name = "";
4525
4526 if (strncmp (text_name, ".gnu.linkonce.t.",
4527 strlen (".gnu.linkonce.t.")) == 0)
4528 {
4529 prefix = prefix_once;
4530 text_name += strlen (".gnu.linkonce.t.");
4531 }
4532
4533 prefix_len = strlen (prefix);
4534 text_len = strlen (text_name);
4535 sec_name_len = prefix_len + text_len;
4536 sec_name = (char *) xmalloc (sec_name_len + 1);
4537 memcpy (sec_name, prefix, prefix_len);
4538 memcpy (sec_name + prefix_len, text_name, text_len);
4539 sec_name[prefix_len + text_len] = '\0';
4540
4541 flags = SHF_ALLOC;
4542 linkonce = 0;
4543 group_name = 0;
4544
4545 /* Handle COMDAT group. */
4546 if (prefix != prefix_once && (text_seg->flags & SEC_LINK_ONCE) != 0)
4547 {
4548 group_name = elf_group_name (text_seg);
4549 if (group_name == NULL)
4550 {
4551 as_bad (_("group section `%s' has no group signature"),
4552 segment_name (text_seg));
4553 ignore_rest_of_line ();
4554 return;
4555 }
4556 flags |= SHF_GROUP;
4557 linkonce = 1;
4558 }
4559
4560 obj_elf_change_section (sec_name, type, flags, 0, group_name, linkonce, 0);
4561
4562 /* Set the section link for index tables. */
4563 if (idx)
4564 elf_linked_to_section (now_seg) = text_seg;
4565
4566 seg_info (now_seg)->tc_segment_info_data.text_unwind = unwind;
4567 }
4568
4569
4570 static const int
4571 tic6x_unwind_frame_regs[TIC6X_NUM_UNWIND_REGS] =
4572 /* A15 B15 B14 B13 B12 B11 B10 B3 A14 A13 A12 A11 A10. */
4573 { 15, 31, 30, 29, 28, 27, 26, 19, 14, 13, 12, 11, 10 };
4574
4575 /* Register save offsets for __c6xabi_push_rts. */
4576 static const int
4577 tic6x_pop_rts_offset_little[TIC6X_NUM_UNWIND_REGS] =
4578 /* A15 B15 B14 B13 B12 B11 B10 B3 A14 A13 A12 A11 A10. */
4579 { -1, 1, 0, -3, -4, -7, -8,-11, -2, -5, -6, -9,-10};
4580
4581 static const int
4582 tic6x_pop_rts_offset_big[TIC6X_NUM_UNWIND_REGS] =
4583 /* A15 B15 B14 B13 B12 B11 B10 B3 A14 A13 A12 A11 A10. */
4584 { -2, 1, 0, -4, -3, -8, -7,-12, -1, -6, -5,-10, -9};
4585
4586 /* Map from dwarf register number to unwind frame register number. */
4587 static int
4588 tic6x_unwind_reg_from_dwarf (int dwarf)
4589 {
4590 int reg;
4591
4592 for (reg = 0; reg < TIC6X_NUM_UNWIND_REGS; reg++)
4593 {
4594 if (tic6x_unwind_frame_regs[reg] == dwarf)
4595 return reg;
4596 }
4597
4598 return -1;
4599 }
4600
4601 /* Unwinding bytecode definitions. */
4602 #define UNWIND_OP_ADD_SP 0x00
4603 #define UNWIND_OP_ADD_SP2 0xd2
4604 #define UNWIND_OP2_POP 0x8000
4605 #define UNWIND_OP2_POP_COMPACT 0xa000
4606 #define UNWIND_OP_POP_REG 0xc0
4607 #define UNWIND_OP_MV_FP 0xd0
4608 #define UNWIND_OP_POP_RTS 0xd1
4609 #define UNWIND_OP_RET 0xe0
4610
4611 /* Maximum stack adjustment for __c6xabi_unwind_cpp_pr3/4 */
4612 #define MAX_COMPACT_SP_OFFSET (0x7f << 3)
4613
4614 static void
4615 tic6x_flush_unwind_word (valueT data)
4616 {
4617 tic6x_unwind_info *unwind = tic6x_get_unwind ();
4618 char *ptr;
4619
4620 /* Create EXTAB entry if it does not exist. */
4621 if (unwind->table_entry == NULL)
4622 {
4623 tic6x_start_unwind_section (unwind->saved_seg, 0);
4624 frag_align (2, 0, 0);
4625 record_alignment (now_seg, 2);
4626 unwind->table_entry = expr_build_dot ();
4627 ptr = frag_more (4);
4628 unwind->frag_start = ptr;
4629 }
4630 else
4631 {
4632 /* Append additional word of data. */
4633 ptr = frag_more (4);
4634 }
4635
4636 md_number_to_chars (ptr, data, 4);
4637 }
4638
4639 /* Add a single byte of unwinding data. */
4640
4641 static void
4642 tic6x_unwind_byte (int byte)
4643 {
4644 tic6x_unwind_info *unwind = tic6x_get_unwind ();
4645
4646 unwind->data_bytes++;
4647 /* Only flush the first word after we know multiple words are required. */
4648 if (unwind->data_bytes == 5)
4649 {
4650 if (unwind->personality_index == -1)
4651 {
4652 /* At this point we know we are too big for pr0. */
4653 unwind->personality_index = 1;
4654 tic6x_flush_unwind_word (0x81000000 | ((unwind->data >> 8) & 0xffff));
4655 unwind->data = ((unwind->data & 0xff) << 8) | byte;
4656 unwind->data_bytes++;
4657 }
4658 else
4659 {
4660 tic6x_flush_unwind_word (unwind->data);
4661 unwind->data = byte;
4662 }
4663 }
4664 else
4665 {
4666 unwind->data = (unwind->data << 8) | byte;
4667 if ((unwind->data_bytes & 3) == 0 && unwind->data_bytes > 4)
4668 {
4669 tic6x_flush_unwind_word (unwind->data);
4670 unwind->data = 0;
4671 }
4672 }
4673 }
4674
4675 /* Add a two-byte unwinding opcode. */
4676 static void
4677 tic6x_unwind_2byte (int bytes)
4678 {
4679 tic6x_unwind_byte (bytes >> 8);
4680 tic6x_unwind_byte (bytes & 0xff);
4681 }
4682
4683 static void
4684 tic6x_unwind_uleb (offsetT offset)
4685 {
4686 while (offset > 0x7f)
4687 {
4688 tic6x_unwind_byte ((offset & 0x7f) | 0x80);
4689 offset >>= 7;
4690 }
4691 tic6x_unwind_byte (offset);
4692 }
4693
4694 void
4695 tic6x_cfi_startproc (void)
4696 {
4697 tic6x_unwind_info *unwind = tic6x_get_unwind ();
4698
4699 unwind->personality_index = -1;
4700 unwind->personality_routine = NULL;
4701 if (unwind->table_entry)
4702 as_bad (_("missing .endp before .cfi_startproc"));
4703
4704 unwind->table_entry = NULL;
4705 unwind->data_bytes = -1;
4706 }
4707
4708 static void
4709 tic6x_output_exidx_entry (void)
4710 {
4711 char *ptr;
4712 long where;
4713 unsigned int marked_pr_dependency;
4714 segT old_seg;
4715 subsegT old_subseg;
4716 tic6x_unwind_info *unwind = tic6x_get_unwind ();
4717
4718 old_seg = now_seg;
4719 old_subseg = now_subseg;
4720
4721 /* Add index table entry. This is two words. */
4722 tic6x_start_unwind_section (unwind->saved_seg, 1);
4723 frag_align (2, 0, 0);
4724 record_alignment (now_seg, 2);
4725
4726 ptr = frag_more (8);
4727 where = frag_now_fix () - 8;
4728
4729 /* Self relative offset of the function start. */
4730 fix_new (frag_now, where, 4, unwind->function_start, 0, 1,
4731 BFD_RELOC_C6000_PREL31);
4732
4733 /* Indicate dependency on ABI-defined personality routines to the
4734 linker, if it hasn't been done already. */
4735 marked_pr_dependency
4736 = seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency;
4737 if (unwind->personality_index >= 0 && unwind->personality_index < 5
4738 && !(marked_pr_dependency & (1 << unwind->personality_index)))
4739 {
4740 static const char *const name[] =
4741 {
4742 "__c6xabi_unwind_cpp_pr0",
4743 "__c6xabi_unwind_cpp_pr1",
4744 "__c6xabi_unwind_cpp_pr2",
4745 "__c6xabi_unwind_cpp_pr3",
4746 "__c6xabi_unwind_cpp_pr4"
4747 };
4748 symbolS *pr = symbol_find_or_make (name[unwind->personality_index]);
4749 fix_new (frag_now, where, 0, pr, 0, 1, BFD_RELOC_NONE);
4750 seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency
4751 |= 1 << unwind->personality_index;
4752 }
4753
4754 if (unwind->table_entry)
4755 {
4756 /* Self relative offset of the table entry. */
4757 fix_new (frag_now, where + 4, 4, unwind->table_entry, 0, 1,
4758 BFD_RELOC_C6000_PREL31);
4759 }
4760 else
4761 {
4762 /* Inline exception table entry. */
4763 md_number_to_chars (ptr + 4, unwind->data, 4);
4764 }
4765
4766 /* Restore the original section. */
4767 subseg_set (old_seg, old_subseg);
4768 }
4769
4770 static void
4771 tic6x_output_unwinding (bfd_boolean need_extab)
4772 {
4773 tic6x_unwind_info *unwind = tic6x_get_unwind ();
4774 unsigned safe_mask = unwind->safe_mask;
4775 unsigned compact_mask = unwind->compact_mask;
4776 unsigned reg_saved_mask = unwind->reg_saved_mask;
4777 offsetT cfa_offset = unwind->cfa_offset;
4778 long where;
4779 int reg;
4780
4781 if (unwind->personality_index == -2)
4782 {
4783 /* Function can not be unwound. */
4784 unwind->data = 1;
4785 tic6x_output_exidx_entry ();
4786 return;
4787 }
4788
4789 if (unwind->personality_index == -1 && unwind->personality_routine == NULL)
4790 {
4791 /* Auto-select a personality routine if none specified. */
4792 if (reg_saved_mask || cfa_offset >= MAX_COMPACT_SP_OFFSET)
4793 unwind->personality_index = -1;
4794 else if (safe_mask)
4795 unwind->personality_index = 3;
4796 else
4797 unwind->personality_index = 4;
4798 }
4799
4800 /* Calculate unwinding opcodes, and emit to EXTAB if necessary. */
4801 unwind->table_entry = NULL;
4802 if (unwind->personality_index == 3 || unwind->personality_index == 4)
4803 {
4804 if (cfa_offset >= MAX_COMPACT_SP_OFFSET)
4805 {
4806 as_bad (_("stack pointer offset too large for personality routine"));
4807 return;
4808 }
4809 if (reg_saved_mask
4810 || (unwind->personality_index == 3 && compact_mask != 0)
4811 || (unwind->personality_index == 4 && safe_mask != 0))
4812 {
4813 as_bad (_("stack frame layout does not match personality routine"));
4814 return;
4815 }
4816
4817 unwind->data = (1u << 31) | (unwind->personality_index << 24);
4818 if (unwind->cfa_reg == 15)
4819 unwind->data |= 0x7f << 17;
4820 else
4821 unwind->data |= cfa_offset << (17 - 3);
4822
4823 if (unwind->personality_index == 3)
4824 unwind->data |= safe_mask << 4;
4825 else
4826 unwind->data |= compact_mask << 4;
4827 unwind->data |= unwind->return_reg;
4828 unwind->data_bytes = 4;
4829 }
4830 else
4831 {
4832 if (unwind->personality_routine)
4833 {
4834 unwind->data = 0;
4835 unwind->data_bytes = 5;
4836 tic6x_flush_unwind_word (0);
4837 /* First word is personality routine. */
4838 where = frag_now_fix () - 4;
4839 fix_new (frag_now, where, 4, unwind->personality_routine, 0, 1,
4840 BFD_RELOC_C6000_PREL31);
4841 }
4842 else if (unwind->personality_index > 0)
4843 {
4844 unwind->data = 0x8000 | (unwind->personality_index << 8);
4845 unwind->data_bytes = 2;
4846 }
4847 else /* pr0 or undecided */
4848 {
4849 unwind->data = 0x80;
4850 unwind->data_bytes = 1;
4851 }
4852
4853 if (unwind->return_reg != UNWIND_B3)
4854 {
4855 tic6x_unwind_byte (UNWIND_OP_RET | unwind->return_reg);
4856 }
4857
4858 if (unwind->cfa_reg == 15)
4859 {
4860 tic6x_unwind_byte (UNWIND_OP_MV_FP);
4861 }
4862 else if (cfa_offset != 0)
4863 {
4864 cfa_offset >>= 3;
4865 if (cfa_offset > 0x80)
4866 {
4867 tic6x_unwind_byte (UNWIND_OP_ADD_SP2);
4868 tic6x_unwind_uleb (cfa_offset - 0x81);
4869 }
4870 else if (cfa_offset > 0x40)
4871 {
4872 tic6x_unwind_byte (UNWIND_OP_ADD_SP | 0x3f);
4873 tic6x_unwind_byte (UNWIND_OP_ADD_SP | (cfa_offset - 0x40));
4874 }
4875 else
4876 {
4877 tic6x_unwind_byte (UNWIND_OP_ADD_SP | (cfa_offset - 1));
4878 }
4879 }
4880
4881 if (safe_mask)
4882 tic6x_unwind_2byte (UNWIND_OP2_POP | unwind->safe_mask);
4883 else if (unwind->pop_rts)
4884 tic6x_unwind_byte (UNWIND_OP_POP_RTS);
4885 else if (compact_mask)
4886 tic6x_unwind_2byte (UNWIND_OP2_POP_COMPACT | unwind->compact_mask);
4887 else if (reg_saved_mask)
4888 {
4889 offsetT cur_offset;
4890 int val;
4891 int last_val;
4892
4893 tic6x_unwind_byte (UNWIND_OP_POP_REG | unwind->saved_reg_count);
4894 last_val = 0;
4895 for (cur_offset = 0; unwind->saved_reg_count > 0; cur_offset -= 4)
4896 {
4897 val = 0xf;
4898 for (reg = 0; reg < TIC6X_NUM_UNWIND_REGS; reg++)
4899 {
4900 if (!unwind->reg_saved[reg])
4901 continue;
4902
4903 if (unwind->reg_offset[reg] == cur_offset)
4904 {
4905 unwind->saved_reg_count--;
4906 val = reg;
4907 break;
4908 }
4909 }
4910 if ((cur_offset & 4) == 4)
4911 tic6x_unwind_byte ((last_val << 4) | val);
4912 else
4913 last_val = val;
4914 }
4915 if ((cur_offset & 4) == 4)
4916 tic6x_unwind_byte ((last_val << 4) | 0xf);
4917 }
4918
4919 /* Pad with RETURN opcodes. */
4920 while ((unwind->data_bytes & 3) != 0)
4921 tic6x_unwind_byte (UNWIND_OP_RET | UNWIND_B3);
4922
4923 if (unwind->personality_index == -1 && unwind->personality_routine == NULL)
4924 unwind->personality_index = 0;
4925 }
4926
4927 /* Force creation of an EXTAB entry if an LSDA is required. */
4928 if (need_extab && !unwind->table_entry)
4929 {
4930 if (unwind->data_bytes != 4)
4931 abort ();
4932
4933 tic6x_flush_unwind_word (unwind->data);
4934 }
4935 else if (unwind->table_entry && !need_extab)
4936 {
4937 /* Add an empty descriptor if there is no user-specified data. */
4938 char *ptr = frag_more (4);
4939 md_number_to_chars (ptr, 0, 4);
4940 }
4941
4942 /* Fill in length of unwinding bytecode. */
4943 if (unwind->table_entry)
4944 {
4945 valueT tmp;
4946 if (unwind->data_bytes > 0x400)
4947 as_bad (_("too many unwinding instructions"));
4948
4949 if (unwind->personality_index == -1)
4950 {
4951 tmp = md_chars_to_number (unwind->frag_start + 4, 4);
4952 tmp |= ((unwind->data_bytes - 8) >> 2) << 24;
4953 md_number_to_chars (unwind->frag_start + 4, tmp, 4);
4954 }
4955 else if (unwind->personality_index == 1 || unwind->personality_index == 2)
4956 {
4957 tmp = md_chars_to_number (unwind->frag_start, 4);
4958 tmp |= ((unwind->data_bytes - 4) >> 2) << 16;
4959 md_number_to_chars (unwind->frag_start, tmp, 4);
4960 }
4961 }
4962 tic6x_output_exidx_entry ();
4963 }
4964
4965 /* FIXME: This will get horribly confused if cfi directives are emitted for
4966 function epilogue. */
4967 void
4968 tic6x_cfi_endproc (struct fde_entry *fde)
4969 {
4970 tic6x_unwind_info *unwind = tic6x_get_unwind ();
4971 struct cfi_insn_data *insn;
4972 int reg;
4973 unsigned safe_mask = 0;
4974 unsigned compact_mask = 0;
4975 unsigned reg_saved_mask = 0;
4976 offsetT cfa_offset = 0;
4977 offsetT save_offset = 0;
4978
4979 unwind->cfa_reg = 31;
4980 unwind->return_reg = UNWIND_B3;
4981 unwind->saved_reg_count = 0;
4982 unwind->pop_rts = FALSE;
4983
4984 unwind->saved_seg = now_seg;
4985 unwind->saved_subseg = now_subseg;
4986
4987 for (reg = 0; reg < TIC6X_NUM_UNWIND_REGS; reg++)
4988 unwind->reg_saved[reg] = FALSE;
4989
4990 /* Scan FDE instructions to build up stack frame layout. */
4991 for (insn = fde->data; insn; insn = insn->next)
4992 {
4993 switch (insn->insn)
4994 {
4995 case DW_CFA_advance_loc:
4996 break;
4997
4998 case DW_CFA_def_cfa:
4999 unwind->cfa_reg = insn->u.ri.reg;
5000 cfa_offset = insn->u.ri.offset;
5001 break;
5002
5003 case DW_CFA_def_cfa_register:
5004 unwind->cfa_reg = insn->u.r;
5005 break;
5006
5007 case DW_CFA_def_cfa_offset:
5008 cfa_offset = insn->u.i;
5009 break;
5010
5011 case DW_CFA_undefined:
5012 case DW_CFA_same_value:
5013 reg = tic6x_unwind_reg_from_dwarf (insn->u.r);
5014 if (reg >= 0)
5015 unwind->reg_saved[reg] = FALSE;
5016 break;
5017
5018 case DW_CFA_offset:
5019 reg = tic6x_unwind_reg_from_dwarf (insn->u.ri.reg);
5020 if (reg < 0)
5021 {
5022 as_bad (_("unable to generate unwinding opcode for reg %d"),
5023 insn->u.ri.reg);
5024 return;
5025 }
5026 unwind->reg_saved[reg] = TRUE;
5027 unwind->reg_offset[reg] = insn->u.ri.offset;
5028 if (insn->u.ri.reg == UNWIND_B3)
5029 unwind->return_reg = UNWIND_B3;
5030 break;
5031
5032 case DW_CFA_register:
5033 if (insn->u.rr.reg1 != 19)
5034 {
5035 as_bad (_("unable to generate unwinding opcode for reg %d"),
5036 insn->u.rr.reg1);
5037 return;
5038 }
5039
5040 reg = tic6x_unwind_reg_from_dwarf (insn->u.rr.reg2);
5041 if (reg < 0)
5042 {
5043 as_bad (_("unable to generate unwinding opcode for reg %d"),
5044 insn->u.rr.reg2);
5045 return;
5046 }
5047
5048 unwind->return_reg = reg;
5049 unwind->reg_saved[UNWIND_B3] = FALSE;
5050 if (unwind->reg_saved[reg])
5051 {
5052 as_bad (_("unable to restore return address from "
5053 "previously restored reg"));
5054 return;
5055 }
5056 break;
5057
5058 case DW_CFA_restore:
5059 case DW_CFA_remember_state:
5060 case DW_CFA_restore_state:
5061 case DW_CFA_GNU_window_save:
5062 case CFI_escape:
5063 case CFI_val_encoded_addr:
5064 as_bad (_("unhandled CFA insn for unwinding (%d)"), insn->insn);
5065 break;
5066
5067 default:
5068 abort ();
5069 }
5070 }
5071
5072 if (unwind->cfa_reg != 15 && unwind->cfa_reg != 31)
5073 {
5074 as_bad (_("unable to generate unwinding opcode for frame pointer reg %d"),
5075 unwind->cfa_reg);
5076 return;
5077 }
5078
5079 if (unwind->cfa_reg == 15)
5080 {
5081 if (cfa_offset != 0)
5082 {
5083 as_bad (_("unable to generate unwinding opcode for "
5084 "frame pointer offset"));
5085 return;
5086 }
5087 }
5088 else
5089 {
5090 if ((cfa_offset & 7) != 0)
5091 {
5092 as_bad (_("unwound stack pointer not doubleword aligned"));
5093 return;
5094 }
5095 }
5096
5097 for (reg = 0; reg < TIC6X_NUM_UNWIND_REGS; reg++)
5098 {
5099 if (unwind->reg_saved[reg])
5100 reg_saved_mask |= 1 << (TIC6X_NUM_UNWIND_REGS - (reg + 1));
5101 }
5102
5103 /* Check for standard "safe debug" frame layout */
5104 if (reg_saved_mask)
5105 {
5106 save_offset = 0;
5107 for (reg = 0; reg < TIC6X_NUM_UNWIND_REGS; reg++)
5108 {
5109 if (!unwind->reg_saved[reg])
5110 continue;
5111
5112 if (target_big_endian
5113 && reg < TIC6X_NUM_UNWIND_REGS - 1
5114 && unwind->reg_saved[reg + 1]
5115 && tic6x_unwind_frame_regs[reg]
5116 == tic6x_unwind_frame_regs[reg + 1] + 1
5117 && (tic6x_unwind_frame_regs[reg] & 1) == 1
5118 && (save_offset & 4) == 4)
5119 {
5120 /* Swapped pair */
5121 if (save_offset != unwind->reg_offset[reg + 1]
5122 || save_offset - 4 != unwind->reg_offset[reg])
5123 break;
5124 save_offset -= 8;
5125 reg++;
5126 }
5127 else
5128 {
5129 if (save_offset != unwind->reg_offset[reg])
5130 break;
5131 save_offset -= 4;
5132 }
5133 }
5134 if (reg == TIC6X_NUM_UNWIND_REGS)
5135 {
5136 safe_mask = reg_saved_mask;
5137 reg_saved_mask = 0;
5138 }
5139 }
5140
5141 /* Check for compact frame layout. */
5142 if (reg_saved_mask)
5143 {
5144 save_offset = 0;
5145 for (reg = 0; reg < TIC6X_NUM_UNWIND_REGS; reg++)
5146 {
5147 int reg2;
5148
5149 if (!unwind->reg_saved[reg])
5150 continue;
5151
5152 if (reg < TIC6X_NUM_UNWIND_REGS - 1)
5153 {
5154 reg2 = reg + 1;
5155
5156 if (!unwind->reg_saved[reg2]
5157 || tic6x_unwind_frame_regs[reg]
5158 != tic6x_unwind_frame_regs[reg2] + 1
5159 || (tic6x_unwind_frame_regs[reg2] & 1) != 0
5160 || save_offset == 0)
5161 reg2 = -1;
5162 }
5163 else
5164 reg2 = -1;
5165
5166 if (reg2 >= 0)
5167 {
5168 int high_offset;
5169 if (target_big_endian)
5170 high_offset = 4; /* lower address = positive stack offset. */
5171 else
5172 high_offset = 0;
5173
5174 if (save_offset + 4 - high_offset != unwind->reg_offset[reg]
5175 || save_offset + high_offset != unwind->reg_offset[reg2])
5176 {
5177 break;
5178 }
5179 reg++;
5180 }
5181 else
5182 {
5183 if (save_offset != unwind->reg_offset[reg])
5184 break;
5185 }
5186 save_offset -= 8;
5187 }
5188
5189 if (reg == TIC6X_NUM_UNWIND_REGS)
5190 {
5191 compact_mask = reg_saved_mask;
5192 reg_saved_mask = 0;
5193 }
5194 }
5195
5196 /* Check for __c6xabi_pop_rts format */
5197 if (reg_saved_mask == 0x17ff)
5198 {
5199 const int *pop_rts_offset = target_big_endian
5200 ? tic6x_pop_rts_offset_big
5201 : tic6x_pop_rts_offset_little;
5202
5203 save_offset = 0;
5204 for (reg = 0; reg < TIC6X_NUM_UNWIND_REGS; reg++)
5205 {
5206 if (reg == UNWIND_B15)
5207 continue;
5208
5209 if (unwind->reg_offset[reg] != pop_rts_offset[reg] * 4)
5210 break;
5211 }
5212
5213 if (reg == TIC6X_NUM_UNWIND_REGS)
5214 {
5215 unwind->pop_rts = TRUE;
5216 reg_saved_mask = 0;
5217 }
5218 }
5219 /* If all else fails then describe the frame manually. */
5220 if (reg_saved_mask)
5221 {
5222 save_offset = 0;
5223
5224 for (reg = 0; reg < TIC6X_NUM_UNWIND_REGS; reg++)
5225 {
5226 if (!unwind->reg_saved[reg])
5227 continue;
5228
5229 unwind->saved_reg_count++;
5230 /* Encoding uses 4 bits per word, so size of unwinding opcode data
5231 limits the save area size. The exact cap will be figured out
5232 later due to overflow, the 0x800 here is just a quick sanity
5233 check to weed out obviously excessive offsets. */
5234 if (unwind->reg_offset[reg] > 0 || unwind->reg_offset[reg] < -0x800
5235 || (unwind->reg_offset[reg] & 3) != 0)
5236 {
5237 as_bad (_("stack frame layout too complex for unwinder"));
5238 return;
5239 }
5240
5241 if (unwind->reg_offset[reg] < save_offset)
5242 save_offset = unwind->reg_offset[reg] - 4;
5243 }
5244 }
5245
5246 /* Align to 8-byte boundary (stack grows towards negative offsets). */
5247 save_offset &= ~7;
5248
5249 if (unwind->cfa_reg == 31 && !reg_saved_mask)
5250 {
5251 cfa_offset += save_offset;
5252 if (cfa_offset < 0)
5253 {
5254 as_bad (_("unwound frame has negative size"));
5255 return;
5256 }
5257 }
5258
5259 unwind->safe_mask = safe_mask;
5260 unwind->compact_mask = compact_mask;
5261 unwind->reg_saved_mask = reg_saved_mask;
5262 unwind->cfa_offset = cfa_offset;
5263 unwind->function_start = fde->start_address;
5264 }
This page took 0.192319 seconds and 5 git commands to generate.