* read.h (s_vendor_attribute): Move to...
[deliverable/binutils-gdb.git] / gas / config / tc-tic6x.c
1 /* TI C6X assembler.
2 Copyright 2010, 2011, 2012
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 = obj_elf_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_ptr;
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_ptr->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 #define O_pcr_offset O_md7
1742 { "pcr_offset", O_pcr_offset }
1743 };
1744
1745 /* Parse a name in some machine-specific way. Used on C6X to handle
1746 assembler operators. */
1747
1748 int
1749 tic6x_parse_name (const char *name, expressionS *exprP,
1750 enum expr_mode mode ATTRIBUTE_UNUSED, char *nextchar)
1751 {
1752 char *p = input_line_pointer;
1753 char c, *name_start, *name_end;
1754 const char *inner_name;
1755 unsigned int i;
1756 operatorT op = O_illegal;
1757 symbolS *sym, *op_sym = NULL;
1758
1759 if (*name != '$')
1760 return 0;
1761
1762 for (i = 0; i < ARRAY_SIZE (tic6x_operators); i++)
1763 if (strcasecmp (name + 1, tic6x_operators[i].name) == 0)
1764 {
1765 op = tic6x_operators[i].op;
1766 break;
1767 }
1768
1769 if (op == O_illegal)
1770 return 0;
1771
1772 *input_line_pointer = *nextchar;
1773 skip_whitespace (p);
1774
1775 if (*p != '(')
1776 {
1777 *input_line_pointer = 0;
1778 return 0;
1779 }
1780 p++;
1781 skip_whitespace (p);
1782
1783 if (!is_name_beginner (*p))
1784 {
1785 *input_line_pointer = 0;
1786 return 0;
1787 }
1788
1789 name_start = p;
1790 p++;
1791 while (is_part_of_name (*p))
1792 p++;
1793 name_end = p;
1794 skip_whitespace (p);
1795
1796 if (op == O_pcr_offset)
1797 {
1798 char *op_name_start, *op_name_end;
1799
1800 if (*p != ',')
1801 {
1802 *input_line_pointer = 0;
1803 return 0;
1804 }
1805 p++;
1806 skip_whitespace (p);
1807
1808 if (!is_name_beginner (*p))
1809 {
1810 *input_line_pointer = 0;
1811 return 0;
1812 }
1813
1814 op_name_start = p;
1815 p++;
1816 while (is_part_of_name (*p))
1817 p++;
1818 op_name_end = p;
1819 skip_whitespace (p);
1820
1821 c = *op_name_end;
1822 *op_name_end = 0;
1823 op_sym = symbol_find_or_make (op_name_start);
1824 *op_name_end = c;
1825 }
1826
1827 if (*p != ')')
1828 {
1829 *input_line_pointer = 0;
1830 return 0;
1831 }
1832
1833 input_line_pointer = p + 1;
1834 *nextchar = *input_line_pointer;
1835 *input_line_pointer = 0;
1836
1837 c = *name_end;
1838 *name_end = 0;
1839 inner_name = name_start;
1840 if (op == O_dsbt_index && strcmp (inner_name, "__c6xabi_DSBT_BASE") != 0)
1841 {
1842 as_bad (_("$DSBT_INDEX must be used with __c6xabi_DSBT_BASE"));
1843 inner_name = "__c6xabi_DSBT_BASE";
1844 }
1845 sym = symbol_find_or_make (inner_name);
1846 *name_end = c;
1847
1848 exprP->X_op = op;
1849 exprP->X_add_symbol = sym;
1850 exprP->X_add_number = 0;
1851 exprP->X_op_symbol = op_sym;
1852 exprP->X_md = 0;
1853
1854 return 1;
1855 }
1856
1857 /* Create a fixup for an expression. Same arguments as fix_new_exp,
1858 plus FIX_ADDA which is TRUE for ADDA instructions (to indicate that
1859 fixes resolving to constants should have those constants implicitly
1860 shifted) and FALSE otherwise, but look for C6X-specific expression
1861 types and adjust the relocations or give errors accordingly. */
1862
1863 static void
1864 tic6x_fix_new_exp (fragS *frag, int where, int size, expressionS *exp,
1865 int pcrel, bfd_reloc_code_real_type r_type,
1866 bfd_boolean fix_adda)
1867 {
1868 bfd_reloc_code_real_type new_reloc = BFD_RELOC_UNUSED;
1869 symbolS *subsy = NULL;
1870 fixS *fix;
1871
1872 switch (exp->X_op)
1873 {
1874 case O_dsbt_index:
1875 switch (r_type)
1876 {
1877 case BFD_RELOC_C6000_SBR_U15_W:
1878 new_reloc = BFD_RELOC_C6000_DSBT_INDEX;
1879 break;
1880
1881 default:
1882 as_bad (_("$DSBT_INDEX not supported in this context"));
1883 return;
1884 }
1885 break;
1886
1887 case O_got:
1888 switch (r_type)
1889 {
1890 case BFD_RELOC_C6000_SBR_U15_W:
1891 new_reloc = BFD_RELOC_C6000_SBR_GOT_U15_W;
1892 break;
1893
1894 default:
1895 as_bad (_("$GOT not supported in this context"));
1896 return;
1897 }
1898 break;
1899
1900 case O_dpr_got:
1901 switch (r_type)
1902 {
1903 case BFD_RELOC_C6000_ABS_L16:
1904 new_reloc = BFD_RELOC_C6000_SBR_GOT_L16_W;
1905 break;
1906
1907 case BFD_RELOC_C6000_ABS_H16:
1908 new_reloc = BFD_RELOC_C6000_SBR_GOT_H16_W;
1909 break;
1910
1911 default:
1912 as_bad (_("$DPR_GOT not supported in this context"));
1913 return;
1914 }
1915 break;
1916
1917 case O_dpr_byte:
1918 switch (r_type)
1919 {
1920 case BFD_RELOC_C6000_ABS_S16:
1921 new_reloc = BFD_RELOC_C6000_SBR_S16;
1922 break;
1923
1924 case BFD_RELOC_C6000_ABS_L16:
1925 new_reloc = BFD_RELOC_C6000_SBR_L16_B;
1926 break;
1927
1928 case BFD_RELOC_C6000_ABS_H16:
1929 new_reloc = BFD_RELOC_C6000_SBR_H16_B;
1930 break;
1931
1932 default:
1933 as_bad (_("$DPR_BYTE not supported in this context"));
1934 return;
1935 }
1936 break;
1937
1938 case O_dpr_hword:
1939 switch (r_type)
1940 {
1941 case BFD_RELOC_C6000_ABS_L16:
1942 new_reloc = BFD_RELOC_C6000_SBR_L16_H;
1943 break;
1944
1945 case BFD_RELOC_C6000_ABS_H16:
1946 new_reloc = BFD_RELOC_C6000_SBR_H16_H;
1947 break;
1948
1949 default:
1950 as_bad (_("$DPR_HWORD not supported in this context"));
1951 return;
1952 }
1953 break;
1954
1955 case O_dpr_word:
1956 switch (r_type)
1957 {
1958 case BFD_RELOC_C6000_ABS_L16:
1959 new_reloc = BFD_RELOC_C6000_SBR_L16_W;
1960 break;
1961
1962 case BFD_RELOC_C6000_ABS_H16:
1963 new_reloc = BFD_RELOC_C6000_SBR_H16_W;
1964 break;
1965
1966 default:
1967 as_bad (_("$DPR_WORD not supported in this context"));
1968 return;
1969 }
1970 break;
1971
1972 case O_pcr_offset:
1973 subsy = exp->X_op_symbol;
1974 switch (r_type)
1975 {
1976 case BFD_RELOC_C6000_ABS_S16:
1977 case BFD_RELOC_C6000_ABS_L16:
1978 new_reloc = BFD_RELOC_C6000_PCR_L16;
1979 break;
1980
1981 case BFD_RELOC_C6000_ABS_H16:
1982 new_reloc = BFD_RELOC_C6000_PCR_H16;
1983 break;
1984
1985 default:
1986 as_bad (_("$PCR_OFFSET not supported in this context"));
1987 return;
1988 }
1989 break;
1990
1991 case O_symbol:
1992 break;
1993
1994 default:
1995 if (pcrel)
1996 {
1997 as_bad (_("invalid PC-relative operand"));
1998 return;
1999 }
2000 break;
2001 }
2002
2003 if (new_reloc == BFD_RELOC_UNUSED)
2004 fix = fix_new_exp (frag, where, size, exp, pcrel, r_type);
2005 else
2006 fix = fix_new (frag, where, size, exp->X_add_symbol, exp->X_add_number,
2007 pcrel, new_reloc);
2008 fix->tc_fix_data.fix_subsy = subsy;
2009 fix->tc_fix_data.fix_adda = fix_adda;
2010 }
2011
2012 /* Generate a fix for a constant (.word etc.). Needed to ensure these
2013 go through the error checking in tic6x_fix_new_exp. */
2014
2015 void
2016 tic6x_cons_fix_new (fragS *frag, int where, int size, expressionS *exp)
2017 {
2018 bfd_reloc_code_real_type r_type;
2019
2020 switch (size)
2021 {
2022 case 1:
2023 r_type = BFD_RELOC_8;
2024 break;
2025
2026 case 2:
2027 r_type = BFD_RELOC_16;
2028 break;
2029
2030 case 4:
2031 r_type = BFD_RELOC_32;
2032 break;
2033
2034 default:
2035 as_bad (_("no %d-byte relocations available"), size);
2036 return;
2037 }
2038
2039 tic6x_fix_new_exp (frag, where, size, exp, 0, r_type, FALSE);
2040 }
2041
2042 /* Initialize target-specific fix data. */
2043
2044 void
2045 tic6x_init_fix_data (fixS *fixP)
2046 {
2047 fixP->tc_fix_data.fix_adda = FALSE;
2048 fixP->tc_fix_data.fix_subsy = NULL;
2049 }
2050
2051 /* Return true if the fix can be handled by GAS, false if it must
2052 be passed through to the linker. */
2053
2054 bfd_boolean
2055 tic6x_fix_adjustable (fixS *fixP)
2056 {
2057 switch (fixP->fx_r_type)
2058 {
2059 /* Adjust_reloc_syms doesn't know about the GOT. */
2060 case BFD_RELOC_C6000_SBR_GOT_U15_W:
2061 case BFD_RELOC_C6000_SBR_GOT_H16_W:
2062 case BFD_RELOC_C6000_SBR_GOT_L16_W:
2063 case BFD_RELOC_C6000_EHTYPE:
2064 return 0;
2065
2066 case BFD_RELOC_C6000_PREL31:
2067 return 0;
2068
2069 case BFD_RELOC_C6000_PCR_H16:
2070 case BFD_RELOC_C6000_PCR_L16:
2071 return 0;
2072
2073 default:
2074 return 1;
2075 }
2076 }
2077
2078 /* Given the fine-grained form of an operand, return the coarse
2079 (bit-mask) form. */
2080
2081 static unsigned int
2082 tic6x_coarse_operand_form (tic6x_operand_form form)
2083 {
2084 switch (form)
2085 {
2086 case tic6x_operand_asm_const:
2087 case tic6x_operand_link_const:
2088 return TIC6X_OP_EXP;
2089
2090 case tic6x_operand_reg:
2091 case tic6x_operand_xreg:
2092 case tic6x_operand_dreg:
2093 case tic6x_operand_areg:
2094 case tic6x_operand_retreg:
2095 return TIC6X_OP_REG;
2096
2097 case tic6x_operand_regpair:
2098 case tic6x_operand_xregpair:
2099 case tic6x_operand_dregpair:
2100 return TIC6X_OP_REGPAIR;
2101
2102 case tic6x_operand_irp:
2103 return TIC6X_OP_IRP;
2104
2105 case tic6x_operand_nrp:
2106 return TIC6X_OP_NRP;
2107
2108 case tic6x_operand_ctrl:
2109 return TIC6X_OP_CTRL;
2110
2111 case tic6x_operand_mem_short:
2112 case tic6x_operand_mem_long:
2113 case tic6x_operand_mem_deref:
2114 return TIC6X_OP_MEM_NOUNREG;
2115
2116 case tic6x_operand_mem_ndw:
2117 return TIC6X_OP_MEM_UNREG;
2118
2119 case tic6x_operand_func_unit:
2120 return TIC6X_OP_FUNC_UNIT;
2121
2122 default:
2123 abort ();
2124 }
2125 }
2126
2127 /* How an operand may match or not match a desired form. If different
2128 instruction alternatives fail in different ways, the first failure
2129 in this list determines the diagnostic. */
2130 typedef enum
2131 {
2132 /* Matches. */
2133 tic6x_match_matches,
2134 /* Bad coarse form. */
2135 tic6x_match_coarse,
2136 /* Not constant. */
2137 tic6x_match_non_const,
2138 /* Register on wrong side. */
2139 tic6x_match_wrong_side,
2140 /* Not a valid address register. */
2141 tic6x_match_bad_address,
2142 /* Not a valid return address register. */
2143 tic6x_match_bad_return,
2144 /* Control register not readable. */
2145 tic6x_match_ctrl_write_only,
2146 /* Control register not writable. */
2147 tic6x_match_ctrl_read_only,
2148 /* Not a valid memory reference for this instruction. */
2149 tic6x_match_bad_mem
2150 } tic6x_operand_match;
2151
2152 /* Return whether an operand matches the given fine-grained form and
2153 read/write usage, and, if it does not match, how it fails to match.
2154 The main functional unit side is SIDE; the cross-path side is CROSS
2155 (the same as SIDE if a cross path not used); the data side is
2156 DATA_SIDE. */
2157 static tic6x_operand_match
2158 tic6x_operand_matches_form (const tic6x_operand *op, tic6x_operand_form form,
2159 tic6x_rw rw, unsigned int side, unsigned int cross,
2160 unsigned int data_side)
2161 {
2162 unsigned int coarse = tic6x_coarse_operand_form (form);
2163
2164 if (coarse != op->form)
2165 return tic6x_match_coarse;
2166
2167 switch (form)
2168 {
2169 case tic6x_operand_asm_const:
2170 if (op->value.exp.X_op == O_constant)
2171 return tic6x_match_matches;
2172 else
2173 return tic6x_match_non_const;
2174
2175 case tic6x_operand_link_const:
2176 case tic6x_operand_irp:
2177 case tic6x_operand_nrp:
2178 case tic6x_operand_func_unit:
2179 /* All expressions are link-time constants, although there may
2180 not be relocations to express them in the output file. "irp"
2181 and "nrp" are unique operand values. All parsed functional
2182 unit names are valid. */
2183 return tic6x_match_matches;
2184
2185 case tic6x_operand_reg:
2186 case tic6x_operand_regpair:
2187 if (op->value.reg.side == side)
2188 return tic6x_match_matches;
2189 else
2190 return tic6x_match_wrong_side;
2191
2192 case tic6x_operand_xreg:
2193 case tic6x_operand_xregpair:
2194 if (op->value.reg.side == cross)
2195 return tic6x_match_matches;
2196 else
2197 return tic6x_match_wrong_side;
2198
2199 case tic6x_operand_dreg:
2200 case tic6x_operand_dregpair:
2201 if (op->value.reg.side == data_side)
2202 return tic6x_match_matches;
2203 else
2204 return tic6x_match_wrong_side;
2205
2206 case tic6x_operand_areg:
2207 if (op->value.reg.side != cross)
2208 return tic6x_match_wrong_side;
2209 else if (op->value.reg.side == 2
2210 && (op->value.reg.num == 14 || op->value.reg.num == 15))
2211 return tic6x_match_matches;
2212 else
2213 return tic6x_match_bad_address;
2214
2215 case tic6x_operand_retreg:
2216 if (op->value.reg.side != side)
2217 return tic6x_match_wrong_side;
2218 else if (op->value.reg.num != 3)
2219 return tic6x_match_bad_return;
2220 else
2221 return tic6x_match_matches;
2222
2223 case tic6x_operand_ctrl:
2224 switch (rw)
2225 {
2226 case tic6x_rw_read:
2227 if (tic6x_ctrl_table[op->value.ctrl].rw == tic6x_rw_read
2228 || tic6x_ctrl_table[op->value.ctrl].rw == tic6x_rw_read_write)
2229 return tic6x_match_matches;
2230 else
2231 return tic6x_match_ctrl_write_only;
2232
2233 case tic6x_rw_write:
2234 if (tic6x_ctrl_table[op->value.ctrl].rw == tic6x_rw_write
2235 || tic6x_ctrl_table[op->value.ctrl].rw == tic6x_rw_read_write)
2236 return tic6x_match_matches;
2237 else
2238 return tic6x_match_ctrl_read_only;
2239
2240 default:
2241 abort ();
2242 }
2243
2244 case tic6x_operand_mem_deref:
2245 if (op->value.mem.mod != tic6x_mem_mod_none)
2246 return tic6x_match_bad_mem;
2247 else if (op->value.mem.scaled != tic6x_offset_none)
2248 abort ();
2249 else if (op->value.mem.base_reg.side != side)
2250 return tic6x_match_bad_mem;
2251 else
2252 return tic6x_match_matches;
2253
2254 case tic6x_operand_mem_short:
2255 case tic6x_operand_mem_ndw:
2256 if (op->value.mem.base_reg.side != side)
2257 return tic6x_match_bad_mem;
2258 if (op->value.mem.mod == tic6x_mem_mod_none)
2259 {
2260 if (op->value.mem.scaled != tic6x_offset_none)
2261 abort ();
2262 return tic6x_match_matches;
2263 }
2264 if (op->value.mem.scaled == tic6x_offset_none)
2265 {
2266 if (op->value.mem.mod == tic6x_mem_mod_plus
2267 || op->value.mem.mod == tic6x_mem_mod_minus)
2268 abort ();
2269 return tic6x_match_matches;
2270 }
2271 if (op->value.mem.offset_is_reg)
2272 {
2273 if (op->value.mem.scaled == tic6x_offset_unscaled
2274 && form != tic6x_operand_mem_ndw)
2275 abort ();
2276 if (op->value.mem.offset.reg.side == side)
2277 return tic6x_match_matches;
2278 else
2279 return tic6x_match_bad_mem;
2280 }
2281 else
2282 {
2283 if (op->value.mem.offset.exp.X_op == O_constant)
2284 return tic6x_match_matches;
2285 else
2286 return tic6x_match_bad_mem;
2287 }
2288
2289 case tic6x_operand_mem_long:
2290 if (op->value.mem.base_reg.side == 2
2291 && (op->value.mem.base_reg.num == 14
2292 || op->value.mem.base_reg.num == 15))
2293 {
2294 switch (op->value.mem.mod)
2295 {
2296 case tic6x_mem_mod_none:
2297 if (op->value.mem.scaled != tic6x_offset_none)
2298 abort ();
2299 return tic6x_match_matches;
2300
2301 case tic6x_mem_mod_plus:
2302 if (op->value.mem.scaled == tic6x_offset_none)
2303 abort ();
2304 if (op->value.mem.offset_is_reg)
2305 return tic6x_match_bad_mem;
2306 else if (op->value.mem.scaled == tic6x_offset_scaled
2307 && op->value.mem.offset.exp.X_op != O_constant)
2308 return tic6x_match_bad_mem;
2309 else
2310 return tic6x_match_matches;
2311
2312 case tic6x_mem_mod_minus:
2313 case tic6x_mem_mod_preinc:
2314 case tic6x_mem_mod_predec:
2315 case tic6x_mem_mod_postinc:
2316 case tic6x_mem_mod_postdec:
2317 return tic6x_match_bad_mem;
2318
2319 default:
2320 abort ();
2321 }
2322
2323 }
2324 else
2325 return tic6x_match_bad_mem;
2326
2327 default:
2328 abort ();
2329 }
2330 }
2331
2332 /* Return the number of bits shift used with DP-relative coding method
2333 CODING. */
2334
2335 static unsigned int
2336 tic6x_dpr_shift (tic6x_coding_method coding)
2337 {
2338 switch (coding)
2339 {
2340 case tic6x_coding_ulcst_dpr_byte:
2341 return 0;
2342
2343 case tic6x_coding_ulcst_dpr_half:
2344 return 1;
2345
2346 case tic6x_coding_ulcst_dpr_word:
2347 return 2;
2348
2349 default:
2350 abort ();
2351 }
2352 }
2353
2354 /* Return the relocation used with DP-relative coding method
2355 CODING. */
2356
2357 static bfd_reloc_code_real_type
2358 tic6x_dpr_reloc (tic6x_coding_method coding)
2359 {
2360 switch (coding)
2361 {
2362 case tic6x_coding_ulcst_dpr_byte:
2363 return BFD_RELOC_C6000_SBR_U15_B;
2364
2365 case tic6x_coding_ulcst_dpr_half:
2366 return BFD_RELOC_C6000_SBR_U15_H;
2367
2368 case tic6x_coding_ulcst_dpr_word:
2369 return BFD_RELOC_C6000_SBR_U15_W;
2370
2371 default:
2372 abort ();
2373 }
2374 }
2375
2376 /* Given a memory reference *MEM_REF as originally parsed, fill in
2377 defaults for missing offsets. */
2378
2379 static void
2380 tic6x_default_mem_ref (tic6x_mem_ref *mem_ref)
2381 {
2382 switch (mem_ref->mod)
2383 {
2384 case tic6x_mem_mod_none:
2385 if (mem_ref->scaled != tic6x_offset_none)
2386 abort ();
2387 mem_ref->mod = tic6x_mem_mod_plus;
2388 mem_ref->scaled = tic6x_offset_unscaled;
2389 mem_ref->offset_is_reg = FALSE;
2390 memset (&mem_ref->offset.exp, 0, sizeof mem_ref->offset.exp);
2391 mem_ref->offset.exp.X_op = O_constant;
2392 mem_ref->offset.exp.X_add_number = 0;
2393 mem_ref->offset.exp.X_unsigned = 0;
2394 break;
2395
2396 case tic6x_mem_mod_plus:
2397 case tic6x_mem_mod_minus:
2398 if (mem_ref->scaled == tic6x_offset_none)
2399 abort ();
2400 break;
2401
2402 case tic6x_mem_mod_preinc:
2403 case tic6x_mem_mod_predec:
2404 case tic6x_mem_mod_postinc:
2405 case tic6x_mem_mod_postdec:
2406 if (mem_ref->scaled != tic6x_offset_none)
2407 break;
2408 mem_ref->scaled = tic6x_offset_scaled;
2409 mem_ref->offset_is_reg = FALSE;
2410 memset (&mem_ref->offset.exp, 0, sizeof mem_ref->offset.exp);
2411 mem_ref->offset.exp.X_op = O_constant;
2412 mem_ref->offset.exp.X_add_number = 1;
2413 mem_ref->offset.exp.X_unsigned = 0;
2414 break;
2415
2416 default:
2417 abort ();
2418 }
2419 }
2420
2421 /* Return the encoding in the 8-bit field of an SPMASK or SPMASKR
2422 instruction of the specified UNIT, side SIDE. */
2423
2424 static unsigned int
2425 tic6x_encode_spmask (tic6x_func_unit_base unit, unsigned int side)
2426 {
2427 switch (unit)
2428 {
2429 case tic6x_func_unit_l:
2430 return 1 << (side - 1);
2431
2432 case tic6x_func_unit_s:
2433 return 1 << (side + 1);
2434
2435 case tic6x_func_unit_d:
2436 return 1 << (side + 3);
2437
2438 case tic6x_func_unit_m:
2439 return 1 << (side + 5);
2440
2441 default:
2442 abort ();
2443 }
2444 }
2445
2446 /* Try to encode the instruction with opcode number ID and operands
2447 OPERANDS (number NUM_OPERANDS), creg value THIS_LINE_CREG and z
2448 value THIS_LINE_Z; FUNC_UNIT_SIDE, FUNC_UNIT_CROSS and
2449 FUNC_UNIT_DATA_SIDE describe the functional unit specification;
2450 SPLOOP_II is the ii value from the previous SPLOOP-family
2451 instruction, or 0 if not in such a loop; the only possible problems
2452 are operands being out of range (they already match the
2453 fine-grained form), and inappropriate predication. If this
2454 succeeds, return the encoding and set *OK to TRUE; otherwise return
2455 0 and set *OK to FALSE. If a fix is needed, set *FIX_NEEDED to
2456 true and fill in *FIX_EXP, *FIX_PCREL, *FX_R_TYPE and *FIX_ADDA.
2457 Print error messages for failure if PRINT_ERRORS is TRUE; the
2458 opcode starts at STR and has length OPC_LEN. */
2459
2460 static unsigned int
2461 tic6x_try_encode (tic6x_opcode_id id, tic6x_operand *operands,
2462 unsigned int num_operands, unsigned int this_line_creg,
2463 unsigned int this_line_z, unsigned int func_unit_side,
2464 unsigned int func_unit_cross,
2465 unsigned int func_unit_data_side, int sploop_ii,
2466 expressionS **fix_exp, int *fix_pcrel,
2467 bfd_reloc_code_real_type *fx_r_type, bfd_boolean *fix_adda,
2468 bfd_boolean *fix_needed, bfd_boolean *ok,
2469 bfd_boolean print_errors, char *str, int opc_len)
2470 {
2471 const tic6x_opcode *opct;
2472 const tic6x_insn_format *fmt;
2473 unsigned int opcode_value;
2474 unsigned int fld;
2475
2476 opct = &tic6x_opcode_table[id];
2477 fmt = &tic6x_insn_format_table[opct->format];
2478 opcode_value = fmt->cst_bits;
2479
2480 for (fld = 0; fld < opct->num_fixed_fields; fld++)
2481 {
2482 if (opct->fixed_fields[fld].min_val == opct->fixed_fields[fld].max_val)
2483 {
2484 const tic6x_insn_field *fldd;
2485 fldd = tic6x_field_from_fmt (fmt, opct->fixed_fields[fld].field_id);
2486 if (fldd == NULL)
2487 abort ();
2488 opcode_value |= opct->fixed_fields[fld].min_val << fldd->low_pos;
2489 }
2490 }
2491
2492 for (fld = 0; fld < opct->num_variable_fields; fld++)
2493 {
2494 const tic6x_insn_field *fldd;
2495 unsigned int value;
2496 unsigned int opno;
2497 unsigned int ffld;
2498 offsetT sign_value;
2499 unsigned int bits;
2500 unsigned int fcyc_bits;
2501 expressionS *expp;
2502 expressionS ucexp;
2503 tic6x_mem_ref mem;
2504
2505 fldd = tic6x_field_from_fmt (fmt, opct->variable_fields[fld].field_id);
2506 if (fldd == NULL)
2507 abort ();
2508 opno = opct->variable_fields[fld].operand_num;
2509 switch (opct->variable_fields[fld].coding_method)
2510 {
2511 case tic6x_coding_ucst:
2512 if (operands[opno].form != TIC6X_OP_EXP)
2513 abort ();
2514 if (operands[opno].value.exp.X_op != O_constant)
2515 abort ();
2516 ucexp = operands[opno].value.exp;
2517 unsigned_constant:
2518 if (ucexp.X_add_number < 0
2519 || ucexp.X_add_number >= (1 << fldd->width))
2520 {
2521 if (print_errors)
2522 as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
2523 opc_len, str);
2524 *ok = FALSE;
2525 return 0;
2526 }
2527 value = ucexp.X_add_number;
2528 break;
2529
2530 case tic6x_coding_scst:
2531 if (operands[opno].form != TIC6X_OP_EXP)
2532 abort ();
2533 if (operands[opno].value.exp.X_op != O_constant)
2534 {
2535 value = 0;
2536 /* Opcode table should not permit non-constants without
2537 a known relocation for them. */
2538 if (fldd->low_pos != 7 || fldd->width != 16)
2539 abort ();
2540 *fix_needed = TRUE;
2541 *fix_exp = &operands[opno].value.exp;
2542 *fix_pcrel = 0;
2543 *fx_r_type = BFD_RELOC_C6000_ABS_S16;
2544 *fix_adda = FALSE;
2545 break;
2546 }
2547 sign_value = SEXT (operands[opno].value.exp.X_add_number);
2548 signed_constant:
2549 if (sign_value < -(1 << (fldd->width - 1))
2550 || (sign_value >= (1 << (fldd->width - 1))))
2551 {
2552 if (print_errors)
2553 as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
2554 opc_len, str);
2555 *ok = FALSE;
2556 return 0;
2557 }
2558 value = sign_value + (1 << (fldd->width - 1));
2559 value ^= (1 << (fldd->width - 1));
2560 break;
2561
2562 case tic6x_coding_ucst_minus_one:
2563 if (operands[opno].form != TIC6X_OP_EXP)
2564 abort ();
2565 if (operands[opno].value.exp.X_op != O_constant)
2566 abort ();
2567 if (operands[opno].value.exp.X_add_number <= 0
2568 || operands[opno].value.exp.X_add_number > (1 << fldd->width))
2569 {
2570 if (print_errors)
2571 as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
2572 opc_len, str);
2573 *ok = FALSE;
2574 return 0;
2575 }
2576 value = operands[opno].value.exp.X_add_number - 1;
2577 break;
2578
2579 case tic6x_coding_scst_negate:
2580 if (operands[opno].form != TIC6X_OP_EXP)
2581 abort ();
2582 if (operands[opno].value.exp.X_op != O_constant)
2583 abort ();
2584 sign_value = SEXT (-operands[opno].value.exp.X_add_number);
2585 goto signed_constant;
2586
2587 case tic6x_coding_ulcst_dpr_byte:
2588 case tic6x_coding_ulcst_dpr_half:
2589 case tic6x_coding_ulcst_dpr_word:
2590 bits = tic6x_dpr_shift (opct->variable_fields[fld].coding_method);
2591 switch (operands[opno].form)
2592 {
2593 case TIC6X_OP_EXP:
2594 if (operands[opno].value.exp.X_op == O_constant)
2595 {
2596 ucexp = operands[opno].value.exp;
2597 goto unsigned_constant;
2598 }
2599 expp = &operands[opno].value.exp;
2600 break;
2601
2602 case TIC6X_OP_MEM_NOUNREG:
2603 mem = operands[opno].value.mem;
2604 tic6x_default_mem_ref (&mem);
2605 if (mem.offset_is_reg)
2606 abort ();
2607 if (mem.offset.exp.X_op == O_constant)
2608 {
2609 ucexp = mem.offset.exp;
2610 if (mem.scaled == tic6x_offset_unscaled)
2611 {
2612 if (ucexp.X_add_number & ((1 << bits) - 1))
2613 {
2614 if (print_errors)
2615 as_bad (_("offset in operand %u of '%.*s' not "
2616 "divisible by %u"), opno + 1, opc_len,
2617 str, 1u << bits);
2618 *ok = FALSE;
2619 return 0;
2620 }
2621 ucexp.X_add_number >>= bits;
2622 }
2623 goto unsigned_constant;
2624 }
2625 if (mem.scaled != tic6x_offset_unscaled)
2626 abort ();
2627 if (operands[opno].value.mem.mod == tic6x_mem_mod_none
2628 || operands[opno].value.mem.scaled != tic6x_offset_unscaled
2629 || operands[opno].value.mem.offset_is_reg)
2630 abort ();
2631 expp = &operands[opno].value.mem.offset.exp;
2632 break;
2633
2634 default:
2635 abort ();
2636 }
2637 value = 0;
2638 /* Opcode table should not use this encoding without a known
2639 relocation. */
2640 if (fldd->low_pos != 8 || fldd->width != 15)
2641 abort ();
2642 /* We do not check for offset divisibility here; such a
2643 check is not needed at this point to encode the value,
2644 and if there is eventually a problem it will be detected
2645 either in md_apply_fix or at link time. */
2646 *fix_needed = TRUE;
2647 *fix_exp = expp;
2648 *fix_pcrel = 0;
2649 *fx_r_type
2650 = tic6x_dpr_reloc (opct->variable_fields[fld].coding_method);
2651 if (operands[opno].form == TIC6X_OP_EXP)
2652 *fix_adda = TRUE;
2653 else
2654 *fix_adda = FALSE;
2655 break;
2656
2657 case tic6x_coding_lcst_low16:
2658 if (operands[opno].form != TIC6X_OP_EXP)
2659 abort ();
2660 if (operands[opno].value.exp.X_op == O_constant)
2661 value = operands[opno].value.exp.X_add_number & 0xffff;
2662 else
2663 {
2664 value = 0;
2665 /* Opcode table should not use this encoding without a
2666 known relocation. */
2667 if (fldd->low_pos != 7 || fldd->width != 16)
2668 abort ();
2669 *fix_needed = TRUE;
2670 *fix_exp = &operands[opno].value.exp;
2671 *fix_pcrel = 0;
2672 *fx_r_type = BFD_RELOC_C6000_ABS_L16;
2673 *fix_adda = FALSE;
2674 }
2675 break;
2676
2677 case tic6x_coding_lcst_high16:
2678 if (operands[opno].form != TIC6X_OP_EXP)
2679 abort ();
2680 if (operands[opno].value.exp.X_op == O_constant)
2681 value = (operands[opno].value.exp.X_add_number >> 16) & 0xffff;
2682 else
2683 {
2684 value = 0;
2685 /* Opcode table should not use this encoding without a
2686 known relocation. */
2687 if (fldd->low_pos != 7 || fldd->width != 16)
2688 abort ();
2689 *fix_needed = TRUE;
2690 *fix_exp = &operands[opno].value.exp;
2691 *fix_pcrel = 0;
2692 *fx_r_type = BFD_RELOC_C6000_ABS_H16;
2693 *fix_adda = FALSE;
2694 }
2695 break;
2696
2697 case tic6x_coding_pcrel:
2698 case tic6x_coding_pcrel_half:
2699 if (operands[opno].form != TIC6X_OP_EXP)
2700 abort ();
2701 value = 0;
2702 *fix_needed = TRUE;
2703 *fix_exp = &operands[opno].value.exp;
2704 *fix_pcrel = 1;
2705 if (fldd->low_pos == 7 && fldd->width == 21)
2706 *fx_r_type = BFD_RELOC_C6000_PCR_S21;
2707 else if (fldd->low_pos == 16 && fldd->width == 12)
2708 *fx_r_type = BFD_RELOC_C6000_PCR_S12;
2709 else if (fldd->low_pos == 13 && fldd->width == 10)
2710 *fx_r_type = BFD_RELOC_C6000_PCR_S10;
2711 else if (fldd->low_pos == 16 && fldd->width == 7)
2712 *fx_r_type = BFD_RELOC_C6000_PCR_S7;
2713 else
2714 /* Opcode table should not use this encoding without a
2715 known relocation. */
2716 abort ();
2717 *fix_adda = FALSE;
2718 break;
2719
2720 case tic6x_coding_reg:
2721 switch (operands[opno].form)
2722 {
2723 case TIC6X_OP_REG:
2724 case TIC6X_OP_REGPAIR:
2725 value = operands[opno].value.reg.num;
2726 break;
2727
2728 case TIC6X_OP_MEM_NOUNREG:
2729 case TIC6X_OP_MEM_UNREG:
2730 value = operands[opno].value.mem.base_reg.num;
2731 break;
2732
2733 default:
2734 abort ();
2735 }
2736 break;
2737
2738 case tic6x_coding_areg:
2739 switch (operands[opno].form)
2740 {
2741 case TIC6X_OP_REG:
2742 value = (operands[opno].value.reg.num == 15 ? 1 : 0);
2743 break;
2744
2745 case TIC6X_OP_MEM_NOUNREG:
2746 value = (operands[opno].value.mem.base_reg.num == 15 ? 1 : 0);
2747 break;
2748
2749 default:
2750 abort ();
2751 }
2752 break;
2753
2754 case tic6x_coding_crlo:
2755 if (operands[opno].form != TIC6X_OP_CTRL)
2756 abort ();
2757 value = tic6x_ctrl_table[operands[opno].value.ctrl].crlo;
2758 break;
2759
2760 case tic6x_coding_crhi:
2761 if (operands[opno].form != TIC6X_OP_CTRL)
2762 abort ();
2763 value = 0;
2764 break;
2765
2766 case tic6x_coding_reg_shift:
2767 if (operands[opno].form != TIC6X_OP_REGPAIR)
2768 abort ();
2769 value = operands[opno].value.reg.num >> 1;
2770 break;
2771
2772 case tic6x_coding_mem_offset:
2773 if (operands[opno].form != TIC6X_OP_MEM_NOUNREG)
2774 abort ();
2775 mem = operands[opno].value.mem;
2776 tic6x_default_mem_ref (&mem);
2777 if (mem.offset_is_reg)
2778 {
2779 if (mem.scaled != tic6x_offset_scaled)
2780 abort ();
2781 value = mem.offset.reg.num;
2782 }
2783 else
2784 {
2785 int scale;
2786
2787 if (mem.offset.exp.X_op != O_constant)
2788 abort ();
2789 switch (mem.scaled)
2790 {
2791 case tic6x_offset_scaled:
2792 scale = 1;
2793 break;
2794
2795 case tic6x_offset_unscaled:
2796 scale = opct->operand_info[opno].size;
2797 if (scale != 1 && scale != 2 && scale != 4 && scale != 8)
2798 abort ();
2799 break;
2800
2801 default:
2802 abort ();
2803 }
2804 if (mem.offset.exp.X_add_number < 0
2805 || mem.offset.exp.X_add_number >= (1 << fldd->width) * scale)
2806 {
2807 if (print_errors)
2808 as_bad (_("offset in operand %u of '%.*s' out of range"),
2809 opno + 1, opc_len, str);
2810 *ok = FALSE;
2811 return 0;
2812 }
2813 if (mem.offset.exp.X_add_number % scale)
2814 {
2815 if (print_errors)
2816 as_bad (_("offset in operand %u of '%.*s' not "
2817 "divisible by %u"),
2818 opno + 1, opc_len, str, scale);
2819 *ok = FALSE;
2820 return 0;
2821 }
2822 value = mem.offset.exp.X_add_number / scale;
2823 }
2824 break;
2825
2826 case tic6x_coding_mem_offset_noscale:
2827 if (operands[opno].form != TIC6X_OP_MEM_UNREG)
2828 abort ();
2829 mem = operands[opno].value.mem;
2830 tic6x_default_mem_ref (&mem);
2831 if (mem.offset_is_reg)
2832 value = mem.offset.reg.num;
2833 else
2834 {
2835 if (mem.offset.exp.X_op != O_constant)
2836 abort ();
2837 if (mem.offset.exp.X_add_number < 0
2838 || mem.offset.exp.X_add_number >= (1 << fldd->width))
2839 {
2840 if (print_errors)
2841 as_bad (_("offset in operand %u of '%.*s' out of range"),
2842 opno + 1, opc_len, str);
2843 *ok = FALSE;
2844 return 0;
2845 }
2846 value = mem.offset.exp.X_add_number;
2847 }
2848 break;
2849
2850 case tic6x_coding_mem_mode:
2851 if (operands[opno].form != TIC6X_OP_MEM_NOUNREG
2852 && operands[opno].form != TIC6X_OP_MEM_UNREG)
2853 abort ();
2854 mem = operands[opno].value.mem;
2855 tic6x_default_mem_ref (&mem);
2856 switch (mem.mod)
2857 {
2858 case tic6x_mem_mod_plus:
2859 value = 1;
2860 break;
2861
2862 case tic6x_mem_mod_minus:
2863 value = 0;
2864 break;
2865
2866 case tic6x_mem_mod_preinc:
2867 value = 9;
2868 break;
2869
2870 case tic6x_mem_mod_predec:
2871 value = 8;
2872 break;
2873
2874 case tic6x_mem_mod_postinc:
2875 value = 11;
2876 break;
2877
2878 case tic6x_mem_mod_postdec:
2879 value = 10;
2880 break;
2881
2882 default:
2883 abort ();
2884 }
2885 value += (mem.offset_is_reg ? 4 : 0);
2886 break;
2887
2888 case tic6x_coding_scaled:
2889 if (operands[opno].form != TIC6X_OP_MEM_UNREG)
2890 abort ();
2891 mem = operands[opno].value.mem;
2892 tic6x_default_mem_ref (&mem);
2893 switch (mem.scaled)
2894 {
2895 case tic6x_offset_unscaled:
2896 value = 0;
2897 break;
2898
2899 case tic6x_offset_scaled:
2900 value = 1;
2901 break;
2902
2903 default:
2904 abort ();
2905 }
2906 break;
2907
2908 case tic6x_coding_spmask:
2909 /* The position of such a field is hardcoded in the handling
2910 of "||^". */
2911 if (fldd->low_pos != 18)
2912 abort ();
2913 value = 0;
2914 for (opno = 0; opno < num_operands; opno++)
2915 {
2916 unsigned int v;
2917
2918 v = tic6x_encode_spmask (operands[opno].value.func_unit.base,
2919 operands[opno].value.func_unit.side);
2920 if (value & v)
2921 {
2922 if (print_errors)
2923 as_bad (_("functional unit already masked for operand "
2924 "%u of '%.*s'"), opno + 1, opc_len, str);
2925 *ok = FALSE;
2926 return 0;
2927 }
2928 value |= v;
2929 }
2930 break;
2931
2932 case tic6x_coding_reg_unused:
2933 /* This is a placeholder; correct handling goes along with
2934 resource constraint checks. */
2935 value = 0;
2936 break;
2937
2938 case tic6x_coding_fstg:
2939 case tic6x_coding_fcyc:
2940 if (operands[opno].form != TIC6X_OP_EXP)
2941 abort ();
2942 if (operands[opno].value.exp.X_op != O_constant)
2943 abort ();
2944 if (!sploop_ii)
2945 {
2946 if (print_errors)
2947 as_bad (_("'%.*s' instruction not in a software "
2948 "pipelined loop"),
2949 opc_len, str);
2950 *ok = FALSE;
2951 return 0;
2952 }
2953
2954 if (sploop_ii <= 1)
2955 fcyc_bits = 0;
2956 else if (sploop_ii <= 2)
2957 fcyc_bits = 1;
2958 else if (sploop_ii <= 4)
2959 fcyc_bits = 2;
2960 else if (sploop_ii <= 8)
2961 fcyc_bits = 3;
2962 else if (sploop_ii <= 14)
2963 fcyc_bits = 4;
2964 else
2965 abort ();
2966 if (fcyc_bits > fldd->width)
2967 abort ();
2968
2969 if (opct->variable_fields[fld].coding_method == tic6x_coding_fstg)
2970 {
2971 int i, t;
2972 if (operands[opno].value.exp.X_add_number < 0
2973 || (operands[opno].value.exp.X_add_number
2974 >= (1 << (fldd->width - fcyc_bits))))
2975 {
2976 if (print_errors)
2977 as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
2978 opc_len, str);
2979 *ok = FALSE;
2980 return 0;
2981 }
2982 value = operands[opno].value.exp.X_add_number;
2983 for (t = 0, i = fcyc_bits; i < fldd->width; i++)
2984 {
2985 t = (t << 1) | (value & 1);
2986 value >>= 1;
2987 }
2988 value = t << fcyc_bits;
2989 }
2990 else
2991 {
2992 if (operands[opno].value.exp.X_add_number < 0
2993 || (operands[opno].value.exp.X_add_number >= sploop_ii))
2994 {
2995 if (print_errors)
2996 as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
2997 opc_len, str);
2998 *ok = FALSE;
2999 return 0;
3000 }
3001 value = operands[opno].value.exp.X_add_number;
3002 }
3003 break;
3004
3005 case tic6x_coding_fu:
3006 value = func_unit_side == 2 ? 1 : 0;
3007 break;
3008
3009 case tic6x_coding_data_fu:
3010 value = func_unit_data_side == 2 ? 1 : 0;
3011 break;
3012
3013 case tic6x_coding_xpath:
3014 value = func_unit_cross;
3015 break;
3016
3017 default:
3018 abort ();
3019 }
3020
3021 for (ffld = 0; ffld < opct->num_fixed_fields; ffld++)
3022 if ((opct->fixed_fields[ffld].field_id
3023 == opct->variable_fields[fld].field_id)
3024 && (value < opct->fixed_fields[ffld].min_val
3025 || value > opct->fixed_fields[ffld].max_val))
3026 {
3027 if (print_errors)
3028 as_bad (_("operand %u of '%.*s' out of range"), opno + 1,
3029 opc_len, str);
3030 *ok = FALSE;
3031 return 0;
3032 }
3033
3034 opcode_value |= value << fldd->low_pos;
3035 }
3036
3037 if (this_line_creg)
3038 {
3039 const tic6x_insn_field *creg;
3040 const tic6x_insn_field *z;
3041
3042 creg = tic6x_field_from_fmt (fmt, tic6x_field_creg);
3043 if (creg == NULL)
3044 {
3045 if (print_errors)
3046 as_bad (_("instruction '%.*s' cannot be predicated"),
3047 opc_len, str);
3048 *ok = FALSE;
3049 return 0;
3050 }
3051 z = tic6x_field_from_fmt (fmt, tic6x_field_z);
3052 /* If there is a creg field, there must be a z field; otherwise
3053 there is an error in the format table. */
3054 if (z == NULL)
3055 abort ();
3056
3057 opcode_value |= this_line_creg << creg->low_pos;
3058 opcode_value |= this_line_z << z->low_pos;
3059 }
3060
3061 *ok = TRUE;
3062 return opcode_value;
3063 }
3064
3065 /* Convert the target integer stored in N bytes in BUF to a host
3066 integer, returning that value. */
3067
3068 static valueT
3069 md_chars_to_number (char *buf, int n)
3070 {
3071 valueT result = 0;
3072 unsigned char *p = (unsigned char *) buf;
3073
3074 if (target_big_endian)
3075 {
3076 while (n--)
3077 {
3078 result <<= 8;
3079 result |= (*p++ & 0xff);
3080 }
3081 }
3082 else
3083 {
3084 while (n--)
3085 {
3086 result <<= 8;
3087 result |= (p[n] & 0xff);
3088 }
3089 }
3090
3091 return result;
3092 }
3093
3094 /* Assemble the instruction starting at STR (an opcode, with the
3095 opcode name all-lowercase). */
3096
3097 void
3098 md_assemble (char *str)
3099 {
3100 char *p;
3101 int opc_len;
3102 bfd_boolean this_line_parallel;
3103 bfd_boolean this_line_spmask;
3104 unsigned int this_line_creg;
3105 unsigned int this_line_z;
3106 tic6x_label_list *this_insn_label_list;
3107 segment_info_type *seginfo;
3108 tic6x_opcode_list *opc_list, *opc;
3109 tic6x_func_unit_base func_unit_base = tic6x_func_unit_nfu;
3110 unsigned int func_unit_side = 0;
3111 unsigned int func_unit_cross = 0;
3112 unsigned int cross_side = 0;
3113 unsigned int func_unit_data_side = 0;
3114 unsigned int max_matching_opcodes, num_matching_opcodes;
3115 tic6x_opcode_id *opcm = NULL;
3116 unsigned int opc_rank[TIC6X_NUM_PREFER];
3117 const tic6x_opcode *opct = NULL;
3118 int min_rank, try_rank, max_rank;
3119 bfd_boolean num_operands_permitted[TIC6X_MAX_SOURCE_OPERANDS + 1]
3120 = { FALSE };
3121 unsigned int operand_forms[TIC6X_MAX_SOURCE_OPERANDS] = { 0 };
3122 tic6x_operand operands[TIC6X_MAX_SOURCE_OPERANDS];
3123 unsigned int max_num_operands;
3124 unsigned int num_operands_read;
3125 bfd_boolean ok_this_arch, ok_this_fu, ok_this_arch_fu;
3126 bfd_boolean bad_operands = FALSE;
3127 unsigned int opcode_value;
3128 bfd_boolean encoded_ok;
3129 bfd_boolean fix_needed = FALSE;
3130 expressionS *fix_exp = NULL;
3131 int fix_pcrel = 0;
3132 bfd_reloc_code_real_type fx_r_type = BFD_RELOC_UNUSED;
3133 bfd_boolean fix_adda = FALSE;
3134 fragS *insn_frag;
3135 char *output;
3136
3137 p = str;
3138 while (*p && !is_end_of_line[(unsigned char) *p] && *p != ' ')
3139 p++;
3140
3141 /* This function should only have been called when there is actually
3142 an instruction to assemble. */
3143 if (p == str)
3144 abort ();
3145
3146 /* Now an instruction has been seen, architecture attributes from
3147 .arch directives merge with rather than overriding the previous
3148 value. */
3149 tic6x_seen_insns = TRUE;
3150 /* If no .arch directives or -march options have been seen, we are
3151 assessing instruction validity based on the C674X default, so set
3152 the attribute accordingly. */
3153 if (tic6x_arch_attribute == C6XABI_Tag_ISA_none)
3154 tic6x_arch_attribute = C6XABI_Tag_ISA_C674X;
3155
3156 /* Reset global settings for parallel bars and predicates now to
3157 avoid extra errors if there are problems with this opcode. */
3158 this_line_parallel = tic6x_line_parallel;
3159 this_line_spmask = tic6x_line_spmask;
3160 this_line_creg = tic6x_line_creg;
3161 this_line_z = tic6x_line_z;
3162 tic6x_line_parallel = FALSE;
3163 tic6x_line_spmask = FALSE;
3164 tic6x_line_creg = 0;
3165 tic6x_line_z = 0;
3166 seginfo = seg_info (now_seg);
3167 this_insn_label_list = seginfo->tc_segment_info_data.label_list;
3168 seginfo->tc_segment_info_data.label_list = NULL;
3169
3170 opc_list = hash_find_n (opcode_hash, str, p - str);
3171 if (opc_list == NULL)
3172 {
3173 char c = *p;
3174 *p = 0;
3175 as_bad (_("unknown opcode '%s'"), str);
3176 *p = c;
3177 return;
3178 }
3179
3180 opc_len = p - str;
3181 skip_whitespace (p);
3182
3183 /* See if there is something that looks like a functional unit
3184 specifier. */
3185 if (*p == '.')
3186 {
3187 bfd_boolean good_func_unit;
3188 tic6x_func_unit_base maybe_base = tic6x_func_unit_nfu;
3189 unsigned int maybe_side = 0;
3190 unsigned int maybe_cross = 0;
3191 unsigned int maybe_data_side = 0;
3192
3193 good_func_unit = tic6x_parse_func_unit_base (p + 1, &maybe_base,
3194 &maybe_side);
3195
3196 if (good_func_unit)
3197 {
3198 if (p[3] == ' ' || is_end_of_line[(unsigned char) p[3]])
3199 p += 3;
3200 else if ((p[3] == 'x' || p[3] == 'X')
3201 && (p[4] == ' ' || is_end_of_line[(unsigned char) p[4]]))
3202 {
3203 maybe_cross = 1;
3204 p += 4;
3205 }
3206 else if (maybe_base == tic6x_func_unit_d
3207 && (p[3] == 't' || p[3] == 'T')
3208 && (p[4] == '1' || p[4] == '2')
3209 && (p[5] == ' ' || is_end_of_line[(unsigned char) p[5]]))
3210 {
3211 maybe_data_side = p[4] - '0';
3212 p += 5;
3213 }
3214 else
3215 good_func_unit = FALSE;
3216 }
3217
3218 if (good_func_unit)
3219 {
3220 func_unit_base = maybe_base;
3221 func_unit_side = maybe_side;
3222 func_unit_cross = maybe_cross;
3223 cross_side = (func_unit_cross ? 3 - func_unit_side : func_unit_side);
3224 func_unit_data_side = maybe_data_side;
3225 }
3226
3227 skip_whitespace (p);
3228 }
3229
3230 /* Determine which entries in the opcode table match, and the
3231 associated permitted forms of operands. */
3232 max_matching_opcodes = 0;
3233 for (opc = opc_list; opc; opc = opc->next)
3234 max_matching_opcodes++;
3235 num_matching_opcodes = 0;
3236 opcm = xmalloc (max_matching_opcodes * sizeof (*opcm));
3237 max_num_operands = 0;
3238 ok_this_arch = FALSE;
3239 ok_this_fu = FALSE;
3240 ok_this_arch_fu = FALSE;
3241 for (opc = opc_list; opc; opc = opc->next)
3242 {
3243 unsigned int num_operands;
3244 unsigned int i;
3245 bfd_boolean this_opc_arch_ok = TRUE;
3246 bfd_boolean this_opc_fu_ok = TRUE;
3247
3248 if (tic6x_insn_format_table[tic6x_opcode_table[opc->id].format].num_bits
3249 != 32)
3250 continue;
3251 if (!(tic6x_opcode_table[opc->id].isa_variants & tic6x_features))
3252 this_opc_arch_ok = FALSE;
3253 if (tic6x_opcode_table[opc->id].func_unit != func_unit_base)
3254 this_opc_fu_ok = FALSE;
3255 if (func_unit_side == 1
3256 && (tic6x_opcode_table[opc->id].flags & TIC6X_FLAG_SIDE_B_ONLY))
3257 this_opc_fu_ok = FALSE;
3258 if (func_unit_cross
3259 && (tic6x_opcode_table[opc->id].flags & TIC6X_FLAG_NO_CROSS))
3260 this_opc_fu_ok = FALSE;
3261 if (!func_unit_data_side
3262 && (tic6x_opcode_table[opc->id].flags
3263 & (TIC6X_FLAG_LOAD | TIC6X_FLAG_STORE)))
3264 this_opc_fu_ok = FALSE;
3265 if (func_unit_data_side
3266 && !(tic6x_opcode_table[opc->id].flags
3267 & (TIC6X_FLAG_LOAD | TIC6X_FLAG_STORE)))
3268 this_opc_fu_ok = FALSE;
3269 if (func_unit_data_side == 1
3270 && (tic6x_opcode_table[opc->id].flags & TIC6X_FLAG_SIDE_T2_ONLY))
3271 this_opc_fu_ok = FALSE;
3272 if (this_opc_arch_ok)
3273 ok_this_arch = TRUE;
3274 if (this_opc_fu_ok)
3275 ok_this_fu = TRUE;
3276 if (!this_opc_arch_ok || !this_opc_fu_ok)
3277 continue;
3278 ok_this_arch_fu = TRUE;
3279 opcm[num_matching_opcodes] = opc->id;
3280 num_matching_opcodes++;
3281 num_operands = tic6x_opcode_table[opc->id].num_operands;
3282
3283 if (tic6x_opcode_table[opc->id].flags & TIC6X_FLAG_SPMASK)
3284 {
3285 if (num_operands != 1
3286 || (tic6x_opcode_table[opc->id].operand_info[0].form
3287 != tic6x_operand_func_unit))
3288 abort ();
3289 num_operands = 8;
3290 for (i = 0; i < num_operands; i++)
3291 {
3292 operand_forms[i]
3293 |= tic6x_coarse_operand_form (tic6x_operand_func_unit);
3294 num_operands_permitted[i] = TRUE;
3295 }
3296 }
3297 else
3298 {
3299 for (i = 0; i < num_operands; i++)
3300 {
3301 tic6x_operand_form f
3302 = tic6x_opcode_table[opc->id].operand_info[i].form;
3303
3304 operand_forms[i] |= tic6x_coarse_operand_form (f);
3305 }
3306 }
3307 num_operands_permitted[num_operands] = TRUE;
3308 if (num_operands > max_num_operands)
3309 max_num_operands = num_operands;
3310 }
3311
3312 if (!ok_this_arch)
3313 {
3314 as_bad (_("'%.*s' instruction not supported on this architecture"),
3315 opc_len, str);
3316 free (opcm);
3317 return;
3318 }
3319
3320 if (!ok_this_fu)
3321 {
3322 as_bad (_("'%.*s' instruction not supported on this functional unit"),
3323 opc_len, str);
3324 free (opcm);
3325 return;
3326 }
3327
3328 if (!ok_this_arch_fu)
3329 {
3330 as_bad (_("'%.*s' instruction not supported on this functional unit"
3331 " for this architecture"),
3332 opc_len, str);
3333 free (opcm);
3334 return;
3335 }
3336
3337 /* If there were no instructions matching the above availability
3338 checks, we should now have given an error and returned. */
3339 if (num_matching_opcodes == 0)
3340 abort ();
3341
3342 num_operands_read = 0;
3343 while (TRUE)
3344 {
3345 skip_whitespace (p);
3346 if (is_end_of_line[(unsigned char) *p])
3347 {
3348 if (num_operands_read > 0)
3349 {
3350 as_bad (_("missing operand after comma"));
3351 bad_operands = TRUE;
3352 }
3353 break;
3354 }
3355
3356 if (max_num_operands == 0)
3357 {
3358 as_bad (_("too many operands to '%.*s'"), opc_len, str);
3359 bad_operands = TRUE;
3360 break;
3361 }
3362
3363 if (!tic6x_parse_operand (&p, &operands[num_operands_read],
3364 operand_forms[num_operands_read], str, opc_len,
3365 num_operands_read + 1))
3366 bad_operands = TRUE;
3367 num_operands_read++;
3368
3369 if (is_end_of_line[(unsigned char) *p])
3370 break;
3371 else if (*p == ',')
3372 {
3373 p++;
3374 if (num_operands_read == max_num_operands)
3375 {
3376 as_bad (_("too many operands to '%.*s'"), opc_len, str);
3377 bad_operands = TRUE;
3378 break;
3379 }
3380 continue;
3381 }
3382 else
3383 /* Operand parsing should consume whole operands. */
3384 abort ();
3385 }
3386
3387 if (!bad_operands && !num_operands_permitted[num_operands_read])
3388 {
3389 as_bad (_("bad number of operands to '%.*s'"), opc_len, str);
3390 bad_operands = TRUE;
3391 }
3392
3393 if (!bad_operands)
3394 {
3395 /* Each operand is of the right syntactic form for some opcode
3396 choice, and the number of operands is valid. Check that each
3397 operand is OK in detail for some opcode choice with the right
3398 number of operands. */
3399 unsigned int i;
3400
3401 for (i = 0; i < num_operands_read; i++)
3402 {
3403 bfd_boolean coarse_ok = FALSE;
3404 bfd_boolean fine_ok = FALSE;
3405 tic6x_operand_match fine_failure = tic6x_match_matches;
3406 unsigned int j;
3407
3408 for (j = 0; j < num_matching_opcodes; j++)
3409 {
3410 tic6x_operand_form f;
3411 tic6x_rw rw;
3412 unsigned int cf;
3413 tic6x_operand_match this_fine_failure;
3414
3415 if (tic6x_opcode_table[opcm[j]].flags & TIC6X_FLAG_SPMASK)
3416 {
3417 f = tic6x_operand_func_unit;
3418 rw = tic6x_rw_none;
3419 }
3420 else
3421 {
3422 if (tic6x_opcode_table[opcm[j]].num_operands
3423 != num_operands_read)
3424 continue;
3425
3426 f = tic6x_opcode_table[opcm[j]].operand_info[i].form;
3427 rw = tic6x_opcode_table[opcm[j]].operand_info[i].rw;
3428 }
3429 cf = tic6x_coarse_operand_form (f);
3430
3431 if (operands[i].form != cf)
3432 continue;
3433
3434 coarse_ok = TRUE;
3435 this_fine_failure
3436 = tic6x_operand_matches_form (&operands[i], f, rw,
3437 func_unit_side,
3438 cross_side,
3439 func_unit_data_side);
3440 if (this_fine_failure == tic6x_match_matches)
3441 {
3442 fine_ok = TRUE;
3443 break;
3444 }
3445 if (fine_failure == tic6x_match_matches
3446 || fine_failure > this_fine_failure)
3447 fine_failure = this_fine_failure;
3448 }
3449
3450 /* No instructions should have operand syntactic forms only
3451 acceptable with certain numbers of operands, so no
3452 diagnostic for this case. */
3453 if (!coarse_ok)
3454 abort ();
3455
3456 if (!fine_ok)
3457 {
3458 switch (fine_failure)
3459 {
3460 case tic6x_match_non_const:
3461 as_bad (_("operand %u of '%.*s' not constant"),
3462 i + 1, opc_len, str);
3463 break;
3464
3465 case tic6x_match_wrong_side:
3466 as_bad (_("operand %u of '%.*s' on wrong side"),
3467 i + 1, opc_len, str);
3468 break;
3469
3470 case tic6x_match_bad_return:
3471 as_bad (_("operand %u of '%.*s' not a valid return "
3472 "address register"),
3473 i + 1, opc_len, str);
3474 break;
3475
3476 case tic6x_match_ctrl_write_only:
3477 as_bad (_("operand %u of '%.*s' is write-only"),
3478 i + 1, opc_len, str);
3479 break;
3480
3481 case tic6x_match_ctrl_read_only:
3482 as_bad (_("operand %u of '%.*s' is read-only"),
3483 i + 1, opc_len, str);
3484 break;
3485
3486 case tic6x_match_bad_mem:
3487 as_bad (_("operand %u of '%.*s' not a valid memory "
3488 "reference"),
3489 i + 1, opc_len, str);
3490 break;
3491
3492 case tic6x_match_bad_address:
3493 as_bad (_("operand %u of '%.*s' not a valid base "
3494 "address register"),
3495 i + 1, opc_len, str);
3496 break;
3497
3498 default:
3499 abort ();
3500 }
3501 bad_operands = TRUE;
3502 break;
3503 }
3504 }
3505 }
3506
3507 if (!bad_operands)
3508 {
3509 /* Each operand is OK for some opcode choice, and the number of
3510 operands is valid. Check whether there is an opcode choice
3511 for which all operands are simultaneously valid. */
3512 unsigned int i;
3513 bfd_boolean found_match = FALSE;
3514
3515 for (i = 0; i < TIC6X_NUM_PREFER; i++)
3516 opc_rank[i] = (unsigned int) -1;
3517
3518 min_rank = TIC6X_NUM_PREFER - 1;
3519 max_rank = 0;
3520
3521 for (i = 0; i < num_matching_opcodes; i++)
3522 {
3523 unsigned int j;
3524 bfd_boolean this_matches = TRUE;
3525
3526 if (!(tic6x_opcode_table[opcm[i]].flags & TIC6X_FLAG_SPMASK)
3527 && tic6x_opcode_table[opcm[i]].num_operands != num_operands_read)
3528 continue;
3529
3530 for (j = 0; j < num_operands_read; j++)
3531 {
3532 tic6x_operand_form f;
3533 tic6x_rw rw;
3534
3535 if (tic6x_opcode_table[opcm[i]].flags & TIC6X_FLAG_SPMASK)
3536 {
3537 f = tic6x_operand_func_unit;
3538 rw = tic6x_rw_none;
3539 }
3540 else
3541 {
3542 f = tic6x_opcode_table[opcm[i]].operand_info[j].form;
3543 rw = tic6x_opcode_table[opcm[i]].operand_info[j].rw;
3544 }
3545 if (tic6x_operand_matches_form (&operands[j], f, rw,
3546 func_unit_side,
3547 cross_side,
3548 func_unit_data_side)
3549 != tic6x_match_matches)
3550 {
3551 this_matches = FALSE;
3552 break;
3553 }
3554 }
3555
3556 if (this_matches)
3557 {
3558 int rank = TIC6X_PREFER_VAL (tic6x_opcode_table[opcm[i]].flags);
3559
3560 if (rank < min_rank)
3561 min_rank = rank;
3562 if (rank > max_rank)
3563 max_rank = rank;
3564
3565 if (opc_rank[rank] == (unsigned int) -1)
3566 opc_rank[rank] = i;
3567 else
3568 /* The opcode table should provide a total ordering
3569 for all cases where multiple matches may get
3570 here. */
3571 abort ();
3572
3573 found_match = TRUE;
3574 }
3575 }
3576
3577 if (!found_match)
3578 {
3579 as_bad (_("bad operand combination for '%.*s'"), opc_len, str);
3580 bad_operands = TRUE;
3581 }
3582 }
3583
3584 if (bad_operands)
3585 {
3586 free (opcm);
3587 return;
3588 }
3589
3590 opcode_value = 0;
3591 encoded_ok = FALSE;
3592 for (try_rank = max_rank; try_rank >= min_rank; try_rank--)
3593 {
3594 fix_needed = FALSE;
3595
3596 if (opc_rank[try_rank] == (unsigned int) -1)
3597 continue;
3598
3599 opcode_value = tic6x_try_encode (opcm[opc_rank[try_rank]], operands,
3600 num_operands_read, this_line_creg,
3601 this_line_z, func_unit_side,
3602 func_unit_cross, func_unit_data_side,
3603 seginfo->tc_segment_info_data.sploop_ii,
3604 &fix_exp, &fix_pcrel, &fx_r_type,
3605 &fix_adda, &fix_needed, &encoded_ok,
3606 (try_rank == min_rank ? TRUE : FALSE),
3607 str, opc_len);
3608 if (encoded_ok)
3609 {
3610 opct = &tic6x_opcode_table[opcm[opc_rank[try_rank]]];
3611 break;
3612 }
3613 }
3614
3615 free (opcm);
3616
3617 if (!encoded_ok)
3618 return;
3619
3620 if (this_line_parallel)
3621 {
3622 insn_frag = seginfo->tc_segment_info_data.execute_packet_frag;
3623 if (insn_frag == NULL)
3624 {
3625 as_bad (_("parallel instruction not following another instruction"));
3626 return;
3627 }
3628
3629 if (insn_frag->fr_fix >= 32)
3630 {
3631 as_bad (_("too many instructions in execute packet"));
3632 return;
3633 }
3634
3635 if (this_insn_label_list != NULL)
3636 as_bad (_("label not at start of execute packet"));
3637
3638 if (opct->flags & TIC6X_FLAG_FIRST)
3639 as_bad (_("'%.*s' instruction not at start of execute packet"),
3640 opc_len, str);
3641
3642 *seginfo->tc_segment_info_data.last_insn_lsb |= 0x1;
3643 output = insn_frag->fr_literal + insn_frag->fr_fix;
3644 }
3645 else
3646 {
3647 tic6x_label_list *l;
3648
3649 seginfo->tc_segment_info_data.spmask_addr = NULL;
3650 seginfo->tc_segment_info_data.func_units_used = 0;
3651
3652 /* Start a new frag for this execute packet. */
3653 if (frag_now_fix () != 0)
3654 {
3655 if (frag_now->fr_type != rs_machine_dependent)
3656 frag_wane (frag_now);
3657
3658 frag_new (0);
3659 }
3660 frag_grow (32);
3661 insn_frag = seginfo->tc_segment_info_data.execute_packet_frag = frag_now;
3662 for (l = this_insn_label_list; l; l = l->next)
3663 {
3664 symbol_set_frag (l->label, frag_now);
3665 S_SET_VALUE (l->label, 0);
3666 S_SET_SEGMENT (l->label, now_seg);
3667 }
3668 tic6x_free_label_list (this_insn_label_list);
3669 dwarf2_emit_insn (0);
3670 output = frag_var (rs_machine_dependent, 32, 32, 0, NULL, 0, NULL);
3671 /* This must be the same as the frag to which a pointer was just
3672 saved. */
3673 if (output != insn_frag->fr_literal)
3674 abort ();
3675 insn_frag->tc_frag_data.is_insns = TRUE;
3676 insn_frag->tc_frag_data.can_cross_fp_boundary
3677 = tic6x_can_cross_fp_boundary;
3678 }
3679
3680 if (func_unit_base != tic6x_func_unit_nfu)
3681 {
3682 unsigned int func_unit_enc;
3683
3684 func_unit_enc = tic6x_encode_spmask (func_unit_base, func_unit_side);
3685
3686 if (seginfo->tc_segment_info_data.func_units_used & func_unit_enc)
3687 as_bad (_("functional unit already used in this execute packet"));
3688
3689 seginfo->tc_segment_info_data.func_units_used |= func_unit_enc;
3690 }
3691
3692 if (opct->flags & TIC6X_FLAG_SPLOOP)
3693 {
3694 if (seginfo->tc_segment_info_data.sploop_ii)
3695 as_bad (_("nested software pipelined loop"));
3696 if (num_operands_read != 1
3697 || operands[0].form != TIC6X_OP_EXP
3698 || operands[0].value.exp.X_op != O_constant)
3699 abort ();
3700 seginfo->tc_segment_info_data.sploop_ii
3701 = operands[0].value.exp.X_add_number;
3702 }
3703 else if (opct->flags & TIC6X_FLAG_SPKERNEL)
3704 {
3705 if (!seginfo->tc_segment_info_data.sploop_ii)
3706 as_bad (_("'%.*s' instruction not in a software pipelined loop"),
3707 opc_len, str);
3708 seginfo->tc_segment_info_data.sploop_ii = 0;
3709 }
3710
3711 if (this_line_spmask)
3712 {
3713 if (seginfo->tc_segment_info_data.spmask_addr == NULL)
3714 as_bad (_("'||^' without previous SPMASK"));
3715 else if (func_unit_base == tic6x_func_unit_nfu)
3716 as_bad (_("cannot mask instruction using no functional unit"));
3717 else
3718 {
3719 unsigned int spmask_opcode;
3720 unsigned int mask_bit;
3721
3722 spmask_opcode
3723 = md_chars_to_number (seginfo->tc_segment_info_data.spmask_addr,
3724 4);
3725 mask_bit = tic6x_encode_spmask (func_unit_base, func_unit_side);
3726 mask_bit <<= 18;
3727 if (spmask_opcode & mask_bit)
3728 as_bad (_("functional unit already masked"));
3729 spmask_opcode |= mask_bit;
3730 md_number_to_chars (seginfo->tc_segment_info_data.spmask_addr,
3731 spmask_opcode, 4);
3732 }
3733 }
3734
3735 record_alignment (now_seg, 5);
3736 md_number_to_chars (output, opcode_value, 4);
3737 if (fix_needed)
3738 tic6x_fix_new_exp (insn_frag, output - insn_frag->fr_literal, 4, fix_exp,
3739 fix_pcrel, fx_r_type, fix_adda);
3740 insn_frag->fr_fix += 4;
3741 insn_frag->fr_var -= 4;
3742 seginfo->tc_segment_info_data.last_insn_lsb
3743 = (target_big_endian ? output + 3 : output);
3744 if (opct->flags & TIC6X_FLAG_SPMASK)
3745 seginfo->tc_segment_info_data.spmask_addr = output;
3746 }
3747
3748 /* Modify NEWVAL (32-bit) by inserting VALUE, shifted right by SHIFT
3749 and the least significant BITS bits taken, at position POS. */
3750 #define MODIFY_VALUE(NEWVAL, VALUE, SHIFT, POS, BITS) \
3751 do { \
3752 (NEWVAL) &= 0xffffffffU & ~(((1U << (BITS)) - 1) << (POS)); \
3753 (NEWVAL) |= (((VALUE) >> (SHIFT)) & ((1U << (BITS)) - 1)) << (POS); \
3754 } while (0)
3755
3756 /* Apply a fixup to the object file. */
3757
3758 void
3759 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
3760 {
3761 offsetT value = *valP;
3762 char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
3763
3764 value = SEXT (value);
3765 *valP = value;
3766
3767 fixP->fx_offset = SEXT (fixP->fx_offset);
3768
3769 if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
3770 fixP->fx_done = 1;
3771
3772 /* We do our own overflow checks. */
3773 fixP->fx_no_overflow = 1;
3774
3775 switch (fixP->fx_r_type)
3776 {
3777 case BFD_RELOC_NONE:
3778 case BFD_RELOC_C6000_EHTYPE:
3779 /* Force output to the object file. */
3780 fixP->fx_done = 0;
3781 break;
3782
3783 case BFD_RELOC_32:
3784 if (fixP->fx_done || !seg->use_rela_p)
3785 md_number_to_chars (buf, value, 4);
3786 break;
3787
3788 case BFD_RELOC_16:
3789 if (fixP->fx_done || !seg->use_rela_p)
3790 {
3791 if (value < -0x8000 || value > 0xffff)
3792 as_bad_where (fixP->fx_file, fixP->fx_line,
3793 _("value too large for 2-byte field"));
3794 md_number_to_chars (buf, value, 2);
3795 }
3796 break;
3797
3798 case BFD_RELOC_8:
3799 if (fixP->fx_done || !seg->use_rela_p)
3800 {
3801 if (value < -0x80 || value > 0xff)
3802 as_bad_where (fixP->fx_file, fixP->fx_line,
3803 _("value too large for 1-byte field"));
3804 md_number_to_chars (buf, value, 1);
3805 }
3806 break;
3807
3808 case BFD_RELOC_C6000_ABS_S16:
3809 case BFD_RELOC_C6000_ABS_L16:
3810 case BFD_RELOC_C6000_SBR_S16:
3811 case BFD_RELOC_C6000_SBR_L16_B:
3812 case BFD_RELOC_C6000_SBR_L16_H:
3813 case BFD_RELOC_C6000_SBR_L16_W:
3814 case BFD_RELOC_C6000_SBR_GOT_L16_W:
3815 if (fixP->fx_done || !seg->use_rela_p)
3816 {
3817 offsetT newval = md_chars_to_number (buf, 4);
3818 int shift;
3819
3820 switch (fixP->fx_r_type)
3821 {
3822 case BFD_RELOC_C6000_SBR_L16_H:
3823 shift = 1;
3824 break;
3825
3826 case BFD_RELOC_C6000_SBR_L16_W:
3827 case BFD_RELOC_C6000_SBR_GOT_L16_W:
3828 shift = 2;
3829 break;
3830
3831 default:
3832 shift = 0;
3833 break;
3834 }
3835
3836 MODIFY_VALUE (newval, value, shift, 7, 16);
3837 if ((value < -0x8000 || value > 0x7fff)
3838 && (fixP->fx_r_type == BFD_RELOC_C6000_ABS_S16
3839 || fixP->fx_r_type == BFD_RELOC_C6000_SBR_S16))
3840 as_bad_where (fixP->fx_file, fixP->fx_line,
3841 _("immediate offset out of range"));
3842
3843 md_number_to_chars (buf, newval, 4);
3844 }
3845 if (fixP->fx_done
3846 && fixP->fx_r_type != BFD_RELOC_C6000_ABS_S16
3847 && fixP->fx_r_type != BFD_RELOC_C6000_ABS_L16)
3848 abort ();
3849 break;
3850
3851 case BFD_RELOC_C6000_ABS_H16:
3852 case BFD_RELOC_C6000_SBR_H16_B:
3853 case BFD_RELOC_C6000_SBR_H16_H:
3854 case BFD_RELOC_C6000_SBR_H16_W:
3855 case BFD_RELOC_C6000_SBR_GOT_H16_W:
3856 if (fixP->fx_done || !seg->use_rela_p)
3857 {
3858 offsetT newval = md_chars_to_number (buf, 4);
3859 int shift;
3860
3861 switch (fixP->fx_r_type)
3862 {
3863 case BFD_RELOC_C6000_SBR_H16_H:
3864 shift = 17;
3865 break;
3866
3867 case BFD_RELOC_C6000_SBR_H16_W:
3868 case BFD_RELOC_C6000_SBR_GOT_H16_W:
3869 shift = 18;
3870 break;
3871
3872 default:
3873 shift = 16;
3874 break;
3875 }
3876
3877 MODIFY_VALUE (newval, value, shift, 7, 16);
3878
3879 md_number_to_chars (buf, newval, 4);
3880 }
3881 if (fixP->fx_done && fixP->fx_r_type != BFD_RELOC_C6000_ABS_H16)
3882 abort ();
3883 break;
3884
3885 case BFD_RELOC_C6000_PCR_H16:
3886 case BFD_RELOC_C6000_PCR_L16:
3887 if (fixP->fx_done || !seg->use_rela_p)
3888 {
3889 offsetT newval = md_chars_to_number (buf, 4);
3890 int shift = fixP->fx_r_type == BFD_RELOC_C6000_PCR_H16 ? 16 : 0;
3891
3892 MODIFY_VALUE (newval, value, shift, 7, 16);
3893
3894 md_number_to_chars (buf, newval, 4);
3895 }
3896 break;
3897
3898 case BFD_RELOC_C6000_SBR_U15_B:
3899 if (fixP->fx_done || !seg->use_rela_p)
3900 {
3901 offsetT newval = md_chars_to_number (buf, 4);
3902
3903 MODIFY_VALUE (newval, value, 0, 8, 15);
3904 if (value < 0 || value > 0x7fff)
3905 as_bad_where (fixP->fx_file, fixP->fx_line,
3906 _("immediate offset out of range"));
3907
3908 md_number_to_chars (buf, newval, 4);
3909 }
3910 break;
3911
3912 case BFD_RELOC_C6000_SBR_U15_H:
3913 if (fixP->fx_done || !seg->use_rela_p)
3914 {
3915 offsetT newval = md_chars_to_number (buf, 4);
3916
3917 /* Constant ADDA operands, processed as constant when the
3918 instruction is parsed, are encoded as-is rather than
3919 shifted. If the operand of an ADDA instruction is now
3920 constant (for example, the difference between two labels
3921 found after the instruction), ensure it is encoded the
3922 same way it would have been if the constant value had
3923 been known when the instruction was parsed. */
3924 if (fixP->tc_fix_data.fix_adda && fixP->fx_done)
3925 value <<= 1;
3926
3927 MODIFY_VALUE (newval, value, 1, 8, 15);
3928 if (value & 1)
3929 as_bad_where (fixP->fx_file, fixP->fx_line,
3930 _("immediate offset not 2-byte-aligned"));
3931 if (value < 0 || value > 0xfffe)
3932 as_bad_where (fixP->fx_file, fixP->fx_line,
3933 _("immediate offset out of range"));
3934
3935 md_number_to_chars (buf, newval, 4);
3936 }
3937 break;
3938
3939 case BFD_RELOC_C6000_SBR_U15_W:
3940 case BFD_RELOC_C6000_SBR_GOT_U15_W:
3941 if (fixP->fx_done || !seg->use_rela_p)
3942 {
3943 offsetT newval = md_chars_to_number (buf, 4);
3944
3945 /* Constant ADDA operands, processed as constant when the
3946 instruction is parsed, are encoded as-is rather than
3947 shifted. If the operand of an ADDA instruction is now
3948 constant (for example, the difference between two labels
3949 found after the instruction), ensure it is encoded the
3950 same way it would have been if the constant value had
3951 been known when the instruction was parsed. */
3952 if (fixP->tc_fix_data.fix_adda && fixP->fx_done)
3953 value <<= 2;
3954
3955 MODIFY_VALUE (newval, value, 2, 8, 15);
3956 if (value & 3)
3957 as_bad_where (fixP->fx_file, fixP->fx_line,
3958 _("immediate offset not 4-byte-aligned"));
3959 if (value < 0 || value > 0x1fffc)
3960 as_bad_where (fixP->fx_file, fixP->fx_line,
3961 _("immediate offset out of range"));
3962
3963 md_number_to_chars (buf, newval, 4);
3964 }
3965 if (fixP->fx_done && fixP->fx_r_type != BFD_RELOC_C6000_SBR_U15_W)
3966 abort ();
3967 break;
3968
3969 case BFD_RELOC_C6000_DSBT_INDEX:
3970 if (value != 0)
3971 as_bad_where (fixP->fx_file, fixP->fx_line,
3972 _("addend used with $DSBT_INDEX"));
3973 if (fixP->fx_done)
3974 abort ();
3975 break;
3976
3977 case BFD_RELOC_C6000_PCR_S21:
3978 if (fixP->fx_done || !seg->use_rela_p)
3979 {
3980 offsetT newval = md_chars_to_number (buf, 4);
3981
3982 MODIFY_VALUE (newval, value, 2, 7, 21);
3983
3984 if (value & 3)
3985 as_bad_where (fixP->fx_file, fixP->fx_line,
3986 _("PC-relative offset not 4-byte-aligned"));
3987 if (value < -0x400000 || value > 0x3ffffc)
3988 as_bad_where (fixP->fx_file, fixP->fx_line,
3989 _("PC-relative offset out of range"));
3990
3991 md_number_to_chars (buf, newval, 4);
3992 }
3993 break;
3994
3995 case BFD_RELOC_C6000_PCR_S12:
3996 if (fixP->fx_done || !seg->use_rela_p)
3997 {
3998 offsetT newval = md_chars_to_number (buf, 4);
3999
4000 MODIFY_VALUE (newval, value, 2, 16, 12);
4001
4002 if (value & 3)
4003 as_bad_where (fixP->fx_file, fixP->fx_line,
4004 _("PC-relative offset not 4-byte-aligned"));
4005 if (value < -0x2000 || value > 0x1ffc)
4006 as_bad_where (fixP->fx_file, fixP->fx_line,
4007 _("PC-relative offset out of range"));
4008
4009 md_number_to_chars (buf, newval, 4);
4010 }
4011 break;
4012
4013 case BFD_RELOC_C6000_PCR_S10:
4014 if (fixP->fx_done || !seg->use_rela_p)
4015 {
4016 offsetT newval = md_chars_to_number (buf, 4);
4017
4018 MODIFY_VALUE (newval, value, 2, 13, 10);
4019
4020 if (value & 3)
4021 as_bad_where (fixP->fx_file, fixP->fx_line,
4022 _("PC-relative offset not 4-byte-aligned"));
4023 if (value < -0x800 || value > 0x7fc)
4024 as_bad_where (fixP->fx_file, fixP->fx_line,
4025 _("PC-relative offset out of range"));
4026
4027 md_number_to_chars (buf, newval, 4);
4028 }
4029 break;
4030
4031 case BFD_RELOC_C6000_PCR_S7:
4032 if (fixP->fx_done || !seg->use_rela_p)
4033 {
4034 offsetT newval = md_chars_to_number (buf, 4);
4035
4036 MODIFY_VALUE (newval, value, 2, 16, 7);
4037
4038 if (value & 3)
4039 as_bad_where (fixP->fx_file, fixP->fx_line,
4040 _("PC-relative offset not 4-byte-aligned"));
4041 if (value < -0x100 || value > 0xfc)
4042 as_bad_where (fixP->fx_file, fixP->fx_line,
4043 _("PC-relative offset out of range"));
4044
4045 md_number_to_chars (buf, newval, 4);
4046 }
4047 break;
4048
4049 case BFD_RELOC_C6000_PREL31:
4050 /* Force output to the object file. */
4051 fixP->fx_done = 0;
4052 break;
4053
4054 default:
4055 abort ();
4056 }
4057 }
4058
4059 /* Convert a floating-point number to target (IEEE) format. */
4060
4061 char *
4062 md_atof (int type, char *litP, int *sizeP)
4063 {
4064 return ieee_md_atof (type, litP, sizeP, target_big_endian);
4065 }
4066
4067 /* Adjust the frags in SECTION (see tic6x_end). */
4068
4069 static void
4070 tic6x_adjust_section (bfd *abfd ATTRIBUTE_UNUSED, segT section,
4071 void *dummy ATTRIBUTE_UNUSED)
4072 {
4073 segment_info_type *info;
4074 frchainS *frchp;
4075 fragS *fragp;
4076 bfd_boolean have_code = FALSE;
4077 bfd_boolean have_non_code = FALSE;
4078
4079 info = seg_info (section);
4080 if (info == NULL)
4081 return;
4082
4083 for (frchp = info->frchainP; frchp; frchp = frchp->frch_next)
4084 for (fragp = frchp->frch_root; fragp; fragp = fragp->fr_next)
4085 switch (fragp->fr_type)
4086 {
4087 case rs_machine_dependent:
4088 if (fragp->tc_frag_data.is_insns)
4089 have_code = TRUE;
4090 break;
4091
4092 case rs_dummy:
4093 case rs_fill:
4094 if (fragp->fr_fix > 0)
4095 have_non_code = TRUE;
4096 break;
4097
4098 default:
4099 have_non_code = TRUE;
4100 break;
4101 }
4102
4103 /* Process alignment requirements in a code-only section. */
4104 if (have_code && !have_non_code)
4105 {
4106 /* If we need to insert an odd number of instructions to meet an
4107 alignment requirement, there must have been an odd number of
4108 instructions since the last 8-byte-aligned execute packet
4109 boundary. So there must have been an execute packet with an
4110 odd number (and so a number fewer than 8) of instructions
4111 into which we can insert a NOP without breaking any previous
4112 alignments.
4113
4114 If then we need to insert a number 2 mod 4 of instructions,
4115 the number of instructions since the last 16-byte-aligned
4116 execute packet boundary must be 2 mod 4. So between that
4117 boundary and the following 8-byte-aligned boundary there must
4118 either be at least one execute packet with 2-mod-4
4119 instructions, or at least two with an odd number of
4120 instructions; again, greedily inserting NOPs as soon as
4121 possible suffices to meet the alignment requirement.
4122
4123 If then we need to insert 4 instructions, we look between the
4124 last 32-byte-aligned boundary and the following
4125 16-byte-aligned boundary. The sizes of the execute packets
4126 in this range total 4 instructions mod 8, so again there is
4127 room for greedy insertion of NOPs to meet the alignment
4128 requirement, and before any intermediate point with 8-byte
4129 (2-instruction) alignment requirement the sizes of execute
4130 packets (and so the room for NOPs) will total 2 instructions
4131 mod 4 so greedy insertion will not break such alignments.
4132
4133 So we can always meet these alignment requirements by
4134 inserting NOPs in parallel with existing execute packets, and
4135 by induction the approach described above inserts the minimum
4136 number of such NOPs. */
4137
4138 /* The number of NOPs we are currently looking to insert, if we
4139 have gone back to insert NOPs. */
4140 unsigned int want_insert = 0;
4141
4142 /* Out of that number, the number inserted so far in the current
4143 stage of the above algorithm. */
4144 unsigned int want_insert_done_so_far = 0;
4145
4146 /* The position mod 32 at the start of the current frag. */
4147 unsigned int pos = 0;
4148
4149 /* The locations in the frag chain of the most recent frags at
4150 the start of which there is the given alignment. */
4151 frchainS *frchp_last32, *frchp_last16, *frchp_last8;
4152 fragS *fragp_last32, *fragp_last16, *fragp_last8;
4153 unsigned int pos_last32, pos_last16, pos_last8;
4154
4155 frchp_last32 = frchp_last16 = frchp_last8 = info->frchainP;
4156 fragp_last32 = fragp_last16 = fragp_last8 = info->frchainP->frch_root;
4157 pos_last32 = pos_last16 = pos_last8 = 0;
4158
4159 for (frchp = info->frchainP; frchp; frchp = frchp->frch_next)
4160 for (fragp = frchp->frch_root; fragp; fragp = fragp->fr_next)
4161 look_at_frag:
4162 {
4163 bfd_boolean go_back = FALSE;
4164 frchainS *frchp_next;
4165 fragS *fragp_next;
4166
4167 if (fragp->fr_type != rs_machine_dependent)
4168 continue;
4169
4170 if (fragp->tc_frag_data.is_insns
4171 && pos + fragp->fr_fix > 32
4172 && !fragp->tc_frag_data.can_cross_fp_boundary)
4173 {
4174 /* As described above, we should always have met an
4175 alignment requirement by the time we come back to
4176 it. */
4177 if (want_insert)
4178 abort ();
4179
4180 if (pos & 3)
4181 abort ();
4182 want_insert = (32 - pos) >> 2;
4183 if (want_insert > 7)
4184 abort ();
4185 want_insert_done_so_far = 0;
4186 go_back = TRUE;
4187 }
4188
4189 if (!fragp->tc_frag_data.is_insns)
4190 {
4191 unsigned int would_insert_bytes;
4192
4193 if (!(pos & ((1 << fragp->fr_offset) - 1)))
4194 /* This alignment requirement is already met. */
4195 continue;
4196
4197 /* As described above, we should always have met an
4198 alignment requirement by the time we come back to
4199 it. */
4200 if (want_insert)
4201 abort ();
4202
4203 /* We may not be able to meet this requirement within
4204 the given number of characters. */
4205 would_insert_bytes
4206 = ((1 << fragp->fr_offset)
4207 - (pos & ((1 << fragp->fr_offset) - 1)));
4208
4209 if (fragp->fr_subtype != 0
4210 && would_insert_bytes > fragp->fr_subtype)
4211 continue;
4212
4213 /* An unmet alignment must be 8, 16 or 32 bytes;
4214 smaller ones must always be met within code-only
4215 sections and larger ones cause the section not to
4216 be code-only. */
4217 if (fragp->fr_offset != 3
4218 && fragp->fr_offset != 4
4219 && fragp->fr_offset != 5)
4220 abort ();
4221
4222 if (would_insert_bytes & 3)
4223 abort ();
4224 want_insert = would_insert_bytes >> 2;
4225 if (want_insert > 7)
4226 abort ();
4227 want_insert_done_so_far = 0;
4228 go_back = TRUE;
4229 }
4230 else if (want_insert && !go_back)
4231 {
4232 unsigned int num_insns = fragp->fr_fix >> 2;
4233 unsigned int max_poss_nops = 8 - num_insns;
4234
4235 if (max_poss_nops)
4236 {
4237 unsigned int cur_want_nops, max_want_nops, do_nops, i;
4238
4239 if (want_insert & 1)
4240 cur_want_nops = 1;
4241 else if (want_insert & 2)
4242 cur_want_nops = 2;
4243 else if (want_insert & 4)
4244 cur_want_nops = 4;
4245 else
4246 abort ();
4247
4248 max_want_nops = cur_want_nops - want_insert_done_so_far;
4249
4250 do_nops = (max_poss_nops < max_want_nops
4251 ? max_poss_nops
4252 : max_want_nops);
4253 for (i = 0; i < do_nops; i++)
4254 {
4255 md_number_to_chars (fragp->fr_literal + fragp->fr_fix,
4256 0, 4);
4257 if (target_big_endian)
4258 fragp->fr_literal[fragp->fr_fix - 1] |= 0x1;
4259 else
4260 fragp->fr_literal[fragp->fr_fix - 4] |= 0x1;
4261 fragp->fr_fix += 4;
4262 fragp->fr_var -= 4;
4263 }
4264 want_insert_done_so_far += do_nops;
4265 if (want_insert_done_so_far == cur_want_nops)
4266 {
4267 want_insert -= want_insert_done_so_far;
4268 want_insert_done_so_far = 0;
4269 if (want_insert)
4270 go_back = TRUE;
4271 }
4272 }
4273 }
4274 if (go_back)
4275 {
4276 if (want_insert & 1)
4277 {
4278 frchp = frchp_last8;
4279 fragp = fragp_last8;
4280 pos = pos_last8;
4281 }
4282 else if (want_insert & 2)
4283 {
4284 frchp = frchp_last8 = frchp_last16;
4285 fragp = fragp_last8 = fragp_last16;
4286 pos = pos_last8 = pos_last16;
4287 }
4288 else if (want_insert & 4)
4289 {
4290 frchp = frchp_last8 = frchp_last16 = frchp_last32;
4291 fragp = fragp_last8 = fragp_last16 = fragp_last32;
4292 pos = pos_last8 = pos_last16 = pos_last32;
4293 }
4294 else
4295 abort ();
4296
4297 goto look_at_frag;
4298 }
4299
4300 /* Update current position for moving past a code
4301 frag. */
4302 pos += fragp->fr_fix;
4303 pos &= 31;
4304 frchp_next = frchp;
4305 fragp_next = fragp->fr_next;
4306 if (fragp_next == NULL)
4307 {
4308 frchp_next = frchp->frch_next;
4309 if (frchp_next != NULL)
4310 fragp_next = frchp_next->frch_root;
4311 }
4312 if (!(pos & 7))
4313 {
4314 frchp_last8 = frchp_next;
4315 fragp_last8 = fragp_next;
4316 pos_last8 = pos;
4317 }
4318 if (!(pos & 15))
4319 {
4320 frchp_last16 = frchp_next;
4321 fragp_last16 = fragp_next;
4322 pos_last16 = pos;
4323 }
4324 if (!(pos & 31))
4325 {
4326 frchp_last32 = frchp_next;
4327 fragp_last32 = fragp_next;
4328 pos_last32 = pos;
4329 }
4330 }
4331 }
4332
4333 /* Now convert the machine-dependent frags to machine-independent
4334 ones. */
4335 for (frchp = info->frchainP; frchp; frchp = frchp->frch_next)
4336 for (fragp = frchp->frch_root; fragp; fragp = fragp->fr_next)
4337 {
4338 if (fragp->fr_type == rs_machine_dependent)
4339 {
4340 if (fragp->tc_frag_data.is_insns)
4341 frag_wane (fragp);
4342 else
4343 {
4344 fragp->fr_type = rs_align_code;
4345 fragp->fr_var = 1;
4346 *fragp->fr_literal = 0;
4347 }
4348 }
4349 }
4350 }
4351
4352 /* Initialize the machine-dependent parts of a frag. */
4353
4354 void
4355 tic6x_frag_init (fragS *fragp)
4356 {
4357 fragp->tc_frag_data.is_insns = FALSE;
4358 fragp->tc_frag_data.can_cross_fp_boundary = FALSE;
4359 }
4360
4361 /* Set an attribute if it has not already been set by the user. */
4362
4363 static void
4364 tic6x_set_attribute_int (int tag, int value)
4365 {
4366 if (tag < 1
4367 || tag >= NUM_KNOWN_OBJ_ATTRIBUTES)
4368 abort ();
4369 if (!tic6x_attributes_set_explicitly[tag])
4370 bfd_elf_add_proc_attr_int (stdoutput, tag, value);
4371 }
4372
4373 /* Set object attributes deduced from the input file and command line
4374 rather than given explicitly. */
4375 static void
4376 tic6x_set_attributes (void)
4377 {
4378 if (tic6x_arch_attribute == C6XABI_Tag_ISA_none)
4379 tic6x_arch_attribute = C6XABI_Tag_ISA_C674X;
4380
4381 tic6x_set_attribute_int (Tag_ISA, tic6x_arch_attribute);
4382 tic6x_set_attribute_int (Tag_ABI_DSBT, tic6x_dsbt);
4383 tic6x_set_attribute_int (Tag_ABI_PID, tic6x_pid);
4384 tic6x_set_attribute_int (Tag_ABI_PIC, tic6x_pic);
4385 }
4386
4387 /* Do machine-dependent manipulations of the frag chains after all
4388 input has been read and before the machine-independent sizing and
4389 relaxing. */
4390
4391 void
4392 tic6x_end (void)
4393 {
4394 /* Set object attributes at this point if not explicitly set. */
4395 tic6x_set_attributes ();
4396
4397 /* Meeting alignment requirements may require inserting NOPs in
4398 parallel in execute packets earlier in the segment. Future
4399 16-bit instruction generation involves whole-segment optimization
4400 to determine the best choice and ordering of 32-bit or 16-bit
4401 instructions. This doesn't fit will in the general relaxation
4402 framework, so handle alignment and 16-bit instruction generation
4403 here. */
4404 bfd_map_over_sections (stdoutput, tic6x_adjust_section, NULL);
4405 }
4406
4407 /* No machine-dependent frags at this stage; all converted in
4408 tic6x_end. */
4409
4410 void
4411 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec ATTRIBUTE_UNUSED,
4412 fragS *fragp ATTRIBUTE_UNUSED)
4413 {
4414 abort ();
4415 }
4416
4417 /* No machine-dependent frags at this stage; all converted in
4418 tic6x_end. */
4419
4420 int
4421 md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED,
4422 segT seg ATTRIBUTE_UNUSED)
4423 {
4424 abort ();
4425 }
4426
4427 /* Put a number into target byte order. */
4428
4429 void
4430 md_number_to_chars (char *buf, valueT val, int n)
4431 {
4432 if (target_big_endian)
4433 number_to_chars_bigendian (buf, val, n);
4434 else
4435 number_to_chars_littleendian (buf, val, n);
4436 }
4437
4438 /* Machine-dependent operand parsing not currently needed. */
4439
4440 void
4441 md_operand (expressionS *op ATTRIBUTE_UNUSED)
4442 {
4443 }
4444
4445 /* PC-relative operands are relative to the start of the fetch
4446 packet. */
4447
4448 long
4449 tic6x_pcrel_from_section (fixS *fixp, segT sec)
4450 {
4451 if (fixp->fx_addsy != NULL
4452 && (!S_IS_DEFINED (fixp->fx_addsy)
4453 || S_GET_SEGMENT (fixp->fx_addsy) != sec))
4454 return 0;
4455 return (fixp->fx_where + fixp->fx_frag->fr_address) & ~(long) 0x1f;
4456 }
4457
4458 /* Round up a section size to the appropriate boundary. */
4459
4460 valueT
4461 md_section_align (segT segment ATTRIBUTE_UNUSED,
4462 valueT size)
4463 {
4464 /* Round up section sizes to ensure that text sections consist of
4465 whole fetch packets. */
4466 int align = bfd_get_section_alignment (stdoutput, segment);
4467 return ((size + (1 << align) - 1) & ((valueT) -1 << align));
4468 }
4469
4470 /* No special undefined symbol handling needed for now. */
4471
4472 symbolS *
4473 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
4474 {
4475 return NULL;
4476 }
4477
4478 /* Translate internal representation of relocation info to BFD target
4479 format. */
4480
4481 arelent *
4482 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
4483 {
4484 arelent *reloc;
4485 asymbol *symbol;
4486 bfd_reloc_code_real_type r_type;
4487
4488 reloc = xmalloc (sizeof (arelent));
4489 reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
4490 symbol = symbol_get_bfdsym (fixp->fx_addsy);
4491 *reloc->sym_ptr_ptr = symbol;
4492 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
4493 reloc->addend = (tic6x_generate_rela ? fixp->fx_offset : 0);
4494 r_type = fixp->fx_r_type;
4495 reloc->howto = bfd_reloc_type_lookup (stdoutput, r_type);
4496
4497 if (reloc->howto == NULL)
4498 {
4499 as_bad_where (fixp->fx_file, fixp->fx_line,
4500 _("Cannot represent relocation type %s"),
4501 bfd_get_reloc_code_name (r_type));
4502 return NULL;
4503 }
4504
4505 /* Correct for adjustments bfd_install_relocation will make. */
4506 if (reloc->howto->pcrel_offset && reloc->howto->partial_inplace)
4507 {
4508 reloc->addend += reloc->address;
4509 if (!bfd_is_com_section (symbol))
4510 reloc->addend -= symbol->value;
4511 }
4512 if (r_type == BFD_RELOC_C6000_PCR_H16
4513 || r_type == BFD_RELOC_C6000_PCR_L16)
4514 {
4515 symbolS *t = fixp->tc_fix_data.fix_subsy;
4516 segT sub_symbol_segment;
4517
4518 resolve_symbol_value (t);
4519 sub_symbol_segment = S_GET_SEGMENT (t);
4520 if (sub_symbol_segment == undefined_section)
4521 as_bad_where (fixp->fx_file, fixp->fx_line,
4522 _("undefined symbol %s in PCR relocation"),
4523 S_GET_NAME (t));
4524 else
4525 {
4526 reloc->addend = reloc->address & ~0x1F;
4527 reloc->addend -= S_GET_VALUE (t);
4528 }
4529 }
4530 return reloc;
4531 }
4532
4533 /* Convert REGNAME to a DWARF-2 register number. */
4534
4535 int
4536 tic6x_regname_to_dw2regnum (char *regname)
4537 {
4538 bfd_boolean reg_ok;
4539 tic6x_register reg;
4540 char *rq = regname;
4541
4542 reg_ok = tic6x_parse_register (&rq, &reg);
4543
4544 if (!reg_ok)
4545 return -1;
4546
4547 switch (reg.side)
4548 {
4549 case 1: /* A regs. */
4550 if (reg.num < 16)
4551 return reg.num;
4552 else if (reg.num < 32)
4553 return (reg.num - 16) + 37;
4554 else
4555 return -1;
4556
4557 case 2: /* B regs. */
4558 if (reg.num < 16)
4559 return reg.num + 16;
4560 else if (reg.num < 32)
4561 return (reg.num - 16) + 53;
4562 else
4563 return -1;
4564
4565 default:
4566 return -1;
4567 }
4568 }
4569
4570 /* Initialize the DWARF-2 unwind information for this procedure. */
4571
4572 void
4573 tic6x_frame_initial_instructions (void)
4574 {
4575 /* CFA is initial stack pointer (B15). */
4576 cfi_add_CFA_def_cfa (31, 0);
4577 }
4578
4579 /* Start an exception table entry. If idx is nonzero this is an index table
4580 entry. */
4581
4582 static void
4583 tic6x_start_unwind_section (const segT text_seg, int idx)
4584 {
4585 tic6x_unwind_info *unwind = tic6x_get_unwind ();
4586 const char * text_name;
4587 const char * prefix;
4588 const char * prefix_once;
4589 const char * group_name;
4590 size_t prefix_len;
4591 size_t text_len;
4592 char * sec_name;
4593 size_t sec_name_len;
4594 int type;
4595 int flags;
4596 int linkonce;
4597
4598 if (idx)
4599 {
4600 prefix = ELF_STRING_C6000_unwind;
4601 prefix_once = ELF_STRING_C6000_unwind_once;
4602 type = SHT_C6000_UNWIND;
4603 }
4604 else
4605 {
4606 prefix = ELF_STRING_C6000_unwind_info;
4607 prefix_once = ELF_STRING_C6000_unwind_info_once;
4608 type = SHT_PROGBITS;
4609 }
4610
4611 text_name = segment_name (text_seg);
4612 if (streq (text_name, ".text"))
4613 text_name = "";
4614
4615 if (strncmp (text_name, ".gnu.linkonce.t.",
4616 strlen (".gnu.linkonce.t.")) == 0)
4617 {
4618 prefix = prefix_once;
4619 text_name += strlen (".gnu.linkonce.t.");
4620 }
4621
4622 prefix_len = strlen (prefix);
4623 text_len = strlen (text_name);
4624 sec_name_len = prefix_len + text_len;
4625 sec_name = (char *) xmalloc (sec_name_len + 1);
4626 memcpy (sec_name, prefix, prefix_len);
4627 memcpy (sec_name + prefix_len, text_name, text_len);
4628 sec_name[prefix_len + text_len] = '\0';
4629
4630 flags = SHF_ALLOC;
4631 linkonce = 0;
4632 group_name = 0;
4633
4634 /* Handle COMDAT group. */
4635 if (prefix != prefix_once && (text_seg->flags & SEC_LINK_ONCE) != 0)
4636 {
4637 group_name = elf_group_name (text_seg);
4638 if (group_name == NULL)
4639 {
4640 as_bad (_("group section `%s' has no group signature"),
4641 segment_name (text_seg));
4642 ignore_rest_of_line ();
4643 return;
4644 }
4645 flags |= SHF_GROUP;
4646 linkonce = 1;
4647 }
4648
4649 obj_elf_change_section (sec_name, type, flags, 0, group_name, linkonce, 0);
4650
4651 /* Set the section link for index tables. */
4652 if (idx)
4653 elf_linked_to_section (now_seg) = text_seg;
4654
4655 seg_info (now_seg)->tc_segment_info_data.text_unwind = unwind;
4656 }
4657
4658
4659 static const int
4660 tic6x_unwind_frame_regs[TIC6X_NUM_UNWIND_REGS] =
4661 /* A15 B15 B14 B13 B12 B11 B10 B3 A14 A13 A12 A11 A10. */
4662 { 15, 31, 30, 29, 28, 27, 26, 19, 14, 13, 12, 11, 10 };
4663
4664 /* Register save offsets for __c6xabi_push_rts. */
4665 static const int
4666 tic6x_pop_rts_offset_little[TIC6X_NUM_UNWIND_REGS] =
4667 /* A15 B15 B14 B13 B12 B11 B10 B3 A14 A13 A12 A11 A10. */
4668 { -1, 1, 0, -3, -4, -7, -8,-11, -2, -5, -6, -9,-10};
4669
4670 static const int
4671 tic6x_pop_rts_offset_big[TIC6X_NUM_UNWIND_REGS] =
4672 /* A15 B15 B14 B13 B12 B11 B10 B3 A14 A13 A12 A11 A10. */
4673 { -2, 1, 0, -4, -3, -8, -7,-12, -1, -6, -5,-10, -9};
4674
4675 /* Map from dwarf register number to unwind frame register number. */
4676 static int
4677 tic6x_unwind_reg_from_dwarf (int dwarf)
4678 {
4679 int reg;
4680
4681 for (reg = 0; reg < TIC6X_NUM_UNWIND_REGS; reg++)
4682 {
4683 if (tic6x_unwind_frame_regs[reg] == dwarf)
4684 return reg;
4685 }
4686
4687 return -1;
4688 }
4689
4690 /* Unwinding bytecode definitions. */
4691 #define UNWIND_OP_ADD_SP 0x00
4692 #define UNWIND_OP_ADD_SP2 0xd2
4693 #define UNWIND_OP2_POP 0x8000
4694 #define UNWIND_OP2_POP_COMPACT 0xa000
4695 #define UNWIND_OP_POP_REG 0xc0
4696 #define UNWIND_OP_MV_FP 0xd0
4697 #define UNWIND_OP_POP_RTS 0xd1
4698 #define UNWIND_OP_RET 0xe0
4699
4700 /* Maximum stack adjustment for __c6xabi_unwind_cpp_pr3/4 */
4701 #define MAX_COMPACT_SP_OFFSET (0x7f << 3)
4702
4703 static void
4704 tic6x_flush_unwind_word (valueT data)
4705 {
4706 tic6x_unwind_info *unwind = tic6x_get_unwind ();
4707 char *ptr;
4708
4709 /* Create EXTAB entry if it does not exist. */
4710 if (unwind->table_entry == NULL)
4711 {
4712 tic6x_start_unwind_section (unwind->saved_seg, 0);
4713 frag_align (2, 0, 0);
4714 record_alignment (now_seg, 2);
4715 unwind->table_entry = expr_build_dot ();
4716 ptr = frag_more (4);
4717 unwind->frag_start = ptr;
4718 }
4719 else
4720 {
4721 /* Append additional word of data. */
4722 ptr = frag_more (4);
4723 }
4724
4725 md_number_to_chars (ptr, data, 4);
4726 }
4727
4728 /* Add a single byte of unwinding data. */
4729
4730 static void
4731 tic6x_unwind_byte (int byte)
4732 {
4733 tic6x_unwind_info *unwind = tic6x_get_unwind ();
4734
4735 unwind->data_bytes++;
4736 /* Only flush the first word after we know multiple words are required. */
4737 if (unwind->data_bytes == 5)
4738 {
4739 if (unwind->personality_index == -1)
4740 {
4741 /* At this point we know we are too big for pr0. */
4742 unwind->personality_index = 1;
4743 tic6x_flush_unwind_word (0x81000000 | ((unwind->data >> 8) & 0xffff));
4744 unwind->data = ((unwind->data & 0xff) << 8) | byte;
4745 unwind->data_bytes++;
4746 }
4747 else
4748 {
4749 tic6x_flush_unwind_word (unwind->data);
4750 unwind->data = byte;
4751 }
4752 }
4753 else
4754 {
4755 unwind->data = (unwind->data << 8) | byte;
4756 if ((unwind->data_bytes & 3) == 0 && unwind->data_bytes > 4)
4757 {
4758 tic6x_flush_unwind_word (unwind->data);
4759 unwind->data = 0;
4760 }
4761 }
4762 }
4763
4764 /* Add a two-byte unwinding opcode. */
4765 static void
4766 tic6x_unwind_2byte (int bytes)
4767 {
4768 tic6x_unwind_byte (bytes >> 8);
4769 tic6x_unwind_byte (bytes & 0xff);
4770 }
4771
4772 static void
4773 tic6x_unwind_uleb (offsetT offset)
4774 {
4775 while (offset > 0x7f)
4776 {
4777 tic6x_unwind_byte ((offset & 0x7f) | 0x80);
4778 offset >>= 7;
4779 }
4780 tic6x_unwind_byte (offset);
4781 }
4782
4783 void
4784 tic6x_cfi_startproc (void)
4785 {
4786 tic6x_unwind_info *unwind = tic6x_get_unwind ();
4787
4788 unwind->personality_index = -1;
4789 unwind->personality_routine = NULL;
4790 if (unwind->table_entry)
4791 as_bad (_("missing .endp before .cfi_startproc"));
4792
4793 unwind->table_entry = NULL;
4794 unwind->data_bytes = -1;
4795 }
4796
4797 static void
4798 tic6x_output_exidx_entry (void)
4799 {
4800 char *ptr;
4801 long where;
4802 unsigned int marked_pr_dependency;
4803 segT old_seg;
4804 subsegT old_subseg;
4805 tic6x_unwind_info *unwind = tic6x_get_unwind ();
4806
4807 old_seg = now_seg;
4808 old_subseg = now_subseg;
4809
4810 /* Add index table entry. This is two words. */
4811 tic6x_start_unwind_section (unwind->saved_seg, 1);
4812 frag_align (2, 0, 0);
4813 record_alignment (now_seg, 2);
4814
4815 ptr = frag_more (8);
4816 where = frag_now_fix () - 8;
4817
4818 /* Self relative offset of the function start. */
4819 fix_new (frag_now, where, 4, unwind->function_start, 0, 1,
4820 BFD_RELOC_C6000_PREL31);
4821
4822 /* Indicate dependency on ABI-defined personality routines to the
4823 linker, if it hasn't been done already. */
4824 marked_pr_dependency
4825 = seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency;
4826 if (unwind->personality_index >= 0 && unwind->personality_index < 5
4827 && !(marked_pr_dependency & (1 << unwind->personality_index)))
4828 {
4829 static const char *const name[] =
4830 {
4831 "__c6xabi_unwind_cpp_pr0",
4832 "__c6xabi_unwind_cpp_pr1",
4833 "__c6xabi_unwind_cpp_pr2",
4834 "__c6xabi_unwind_cpp_pr3",
4835 "__c6xabi_unwind_cpp_pr4"
4836 };
4837 symbolS *pr = symbol_find_or_make (name[unwind->personality_index]);
4838 fix_new (frag_now, where, 0, pr, 0, 1, BFD_RELOC_NONE);
4839 seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency
4840 |= 1 << unwind->personality_index;
4841 }
4842
4843 if (unwind->table_entry)
4844 {
4845 /* Self relative offset of the table entry. */
4846 fix_new (frag_now, where + 4, 4, unwind->table_entry, 0, 1,
4847 BFD_RELOC_C6000_PREL31);
4848 }
4849 else
4850 {
4851 /* Inline exception table entry. */
4852 md_number_to_chars (ptr + 4, unwind->data, 4);
4853 }
4854
4855 /* Restore the original section. */
4856 subseg_set (old_seg, old_subseg);
4857 }
4858
4859 static void
4860 tic6x_output_unwinding (bfd_boolean need_extab)
4861 {
4862 tic6x_unwind_info *unwind = tic6x_get_unwind ();
4863 unsigned safe_mask = unwind->safe_mask;
4864 unsigned compact_mask = unwind->compact_mask;
4865 unsigned reg_saved_mask = unwind->reg_saved_mask;
4866 offsetT cfa_offset = unwind->cfa_offset;
4867 long where;
4868 int reg;
4869
4870 if (unwind->personality_index == -2)
4871 {
4872 /* Function can not be unwound. */
4873 unwind->data = 1;
4874 tic6x_output_exidx_entry ();
4875 return;
4876 }
4877
4878 if (unwind->personality_index == -1 && unwind->personality_routine == NULL)
4879 {
4880 /* Auto-select a personality routine if none specified. */
4881 if (reg_saved_mask || cfa_offset >= MAX_COMPACT_SP_OFFSET)
4882 unwind->personality_index = -1;
4883 else if (safe_mask)
4884 unwind->personality_index = 3;
4885 else
4886 unwind->personality_index = 4;
4887 }
4888
4889 /* Calculate unwinding opcodes, and emit to EXTAB if necessary. */
4890 unwind->table_entry = NULL;
4891 if (unwind->personality_index == 3 || unwind->personality_index == 4)
4892 {
4893 if (cfa_offset >= MAX_COMPACT_SP_OFFSET)
4894 {
4895 as_bad (_("stack pointer offset too large for personality routine"));
4896 return;
4897 }
4898 if (reg_saved_mask
4899 || (unwind->personality_index == 3 && compact_mask != 0)
4900 || (unwind->personality_index == 4 && safe_mask != 0))
4901 {
4902 as_bad (_("stack frame layout does not match personality routine"));
4903 return;
4904 }
4905
4906 unwind->data = (1u << 31) | (unwind->personality_index << 24);
4907 if (unwind->cfa_reg == 15)
4908 unwind->data |= 0x7f << 17;
4909 else
4910 unwind->data |= cfa_offset << (17 - 3);
4911
4912 if (unwind->personality_index == 3)
4913 unwind->data |= safe_mask << 4;
4914 else
4915 unwind->data |= compact_mask << 4;
4916 unwind->data |= unwind->return_reg;
4917 unwind->data_bytes = 4;
4918 }
4919 else
4920 {
4921 if (unwind->personality_routine)
4922 {
4923 unwind->data = 0;
4924 unwind->data_bytes = 5;
4925 tic6x_flush_unwind_word (0);
4926 /* First word is personality routine. */
4927 where = frag_now_fix () - 4;
4928 fix_new (frag_now, where, 4, unwind->personality_routine, 0, 1,
4929 BFD_RELOC_C6000_PREL31);
4930 }
4931 else if (unwind->personality_index > 0)
4932 {
4933 unwind->data = 0x8000 | (unwind->personality_index << 8);
4934 unwind->data_bytes = 2;
4935 }
4936 else /* pr0 or undecided */
4937 {
4938 unwind->data = 0x80;
4939 unwind->data_bytes = 1;
4940 }
4941
4942 if (unwind->return_reg != UNWIND_B3)
4943 {
4944 tic6x_unwind_byte (UNWIND_OP_RET | unwind->return_reg);
4945 }
4946
4947 if (unwind->cfa_reg == 15)
4948 {
4949 tic6x_unwind_byte (UNWIND_OP_MV_FP);
4950 }
4951 else if (cfa_offset != 0)
4952 {
4953 cfa_offset >>= 3;
4954 if (cfa_offset > 0x80)
4955 {
4956 tic6x_unwind_byte (UNWIND_OP_ADD_SP2);
4957 tic6x_unwind_uleb (cfa_offset - 0x81);
4958 }
4959 else if (cfa_offset > 0x40)
4960 {
4961 tic6x_unwind_byte (UNWIND_OP_ADD_SP | 0x3f);
4962 tic6x_unwind_byte (UNWIND_OP_ADD_SP | (cfa_offset - 0x40));
4963 }
4964 else
4965 {
4966 tic6x_unwind_byte (UNWIND_OP_ADD_SP | (cfa_offset - 1));
4967 }
4968 }
4969
4970 if (safe_mask)
4971 tic6x_unwind_2byte (UNWIND_OP2_POP | unwind->safe_mask);
4972 else if (unwind->pop_rts)
4973 tic6x_unwind_byte (UNWIND_OP_POP_RTS);
4974 else if (compact_mask)
4975 tic6x_unwind_2byte (UNWIND_OP2_POP_COMPACT | unwind->compact_mask);
4976 else if (reg_saved_mask)
4977 {
4978 offsetT cur_offset;
4979 int val;
4980 int last_val;
4981
4982 tic6x_unwind_byte (UNWIND_OP_POP_REG | unwind->saved_reg_count);
4983 last_val = 0;
4984 for (cur_offset = 0; unwind->saved_reg_count > 0; cur_offset -= 4)
4985 {
4986 val = 0xf;
4987 for (reg = 0; reg < TIC6X_NUM_UNWIND_REGS; reg++)
4988 {
4989 if (!unwind->reg_saved[reg])
4990 continue;
4991
4992 if (unwind->reg_offset[reg] == cur_offset)
4993 {
4994 unwind->saved_reg_count--;
4995 val = reg;
4996 break;
4997 }
4998 }
4999 if ((cur_offset & 4) == 4)
5000 tic6x_unwind_byte ((last_val << 4) | val);
5001 else
5002 last_val = val;
5003 }
5004 if ((cur_offset & 4) == 4)
5005 tic6x_unwind_byte ((last_val << 4) | 0xf);
5006 }
5007
5008 /* Pad with RETURN opcodes. */
5009 while ((unwind->data_bytes & 3) != 0)
5010 tic6x_unwind_byte (UNWIND_OP_RET | UNWIND_B3);
5011
5012 if (unwind->personality_index == -1 && unwind->personality_routine == NULL)
5013 unwind->personality_index = 0;
5014 }
5015
5016 /* Force creation of an EXTAB entry if an LSDA is required. */
5017 if (need_extab && !unwind->table_entry)
5018 {
5019 if (unwind->data_bytes != 4)
5020 abort ();
5021
5022 tic6x_flush_unwind_word (unwind->data);
5023 }
5024 else if (unwind->table_entry && !need_extab)
5025 {
5026 /* Add an empty descriptor if there is no user-specified data. */
5027 char *ptr = frag_more (4);
5028 md_number_to_chars (ptr, 0, 4);
5029 }
5030
5031 /* Fill in length of unwinding bytecode. */
5032 if (unwind->table_entry)
5033 {
5034 valueT tmp;
5035 if (unwind->data_bytes > 0x400)
5036 as_bad (_("too many unwinding instructions"));
5037
5038 if (unwind->personality_index == -1)
5039 {
5040 tmp = md_chars_to_number (unwind->frag_start + 4, 4);
5041 tmp |= ((unwind->data_bytes - 8) >> 2) << 24;
5042 md_number_to_chars (unwind->frag_start + 4, tmp, 4);
5043 }
5044 else if (unwind->personality_index == 1 || unwind->personality_index == 2)
5045 {
5046 tmp = md_chars_to_number (unwind->frag_start, 4);
5047 tmp |= ((unwind->data_bytes - 4) >> 2) << 16;
5048 md_number_to_chars (unwind->frag_start, tmp, 4);
5049 }
5050 }
5051 tic6x_output_exidx_entry ();
5052 }
5053
5054 /* FIXME: This will get horribly confused if cfi directives are emitted for
5055 function epilogue. */
5056 void
5057 tic6x_cfi_endproc (struct fde_entry *fde)
5058 {
5059 tic6x_unwind_info *unwind = tic6x_get_unwind ();
5060 struct cfi_insn_data *insn;
5061 int reg;
5062 unsigned safe_mask = 0;
5063 unsigned compact_mask = 0;
5064 unsigned reg_saved_mask = 0;
5065 offsetT cfa_offset = 0;
5066 offsetT save_offset = 0;
5067
5068 unwind->cfa_reg = 31;
5069 unwind->return_reg = UNWIND_B3;
5070 unwind->saved_reg_count = 0;
5071 unwind->pop_rts = FALSE;
5072
5073 unwind->saved_seg = now_seg;
5074 unwind->saved_subseg = now_subseg;
5075
5076 for (reg = 0; reg < TIC6X_NUM_UNWIND_REGS; reg++)
5077 unwind->reg_saved[reg] = FALSE;
5078
5079 /* Scan FDE instructions to build up stack frame layout. */
5080 for (insn = fde->data; insn; insn = insn->next)
5081 {
5082 switch (insn->insn)
5083 {
5084 case DW_CFA_advance_loc:
5085 break;
5086
5087 case DW_CFA_def_cfa:
5088 unwind->cfa_reg = insn->u.ri.reg;
5089 cfa_offset = insn->u.ri.offset;
5090 break;
5091
5092 case DW_CFA_def_cfa_register:
5093 unwind->cfa_reg = insn->u.r;
5094 break;
5095
5096 case DW_CFA_def_cfa_offset:
5097 cfa_offset = insn->u.i;
5098 break;
5099
5100 case DW_CFA_undefined:
5101 case DW_CFA_same_value:
5102 reg = tic6x_unwind_reg_from_dwarf (insn->u.r);
5103 if (reg >= 0)
5104 unwind->reg_saved[reg] = FALSE;
5105 break;
5106
5107 case DW_CFA_offset:
5108 reg = tic6x_unwind_reg_from_dwarf (insn->u.ri.reg);
5109 if (reg < 0)
5110 {
5111 as_bad (_("unable to generate unwinding opcode for reg %d"),
5112 insn->u.ri.reg);
5113 return;
5114 }
5115 unwind->reg_saved[reg] = TRUE;
5116 unwind->reg_offset[reg] = insn->u.ri.offset;
5117 if (insn->u.ri.reg == UNWIND_B3)
5118 unwind->return_reg = UNWIND_B3;
5119 break;
5120
5121 case DW_CFA_register:
5122 if (insn->u.rr.reg1 != 19)
5123 {
5124 as_bad (_("unable to generate unwinding opcode for reg %d"),
5125 insn->u.rr.reg1);
5126 return;
5127 }
5128
5129 reg = tic6x_unwind_reg_from_dwarf (insn->u.rr.reg2);
5130 if (reg < 0)
5131 {
5132 as_bad (_("unable to generate unwinding opcode for reg %d"),
5133 insn->u.rr.reg2);
5134 return;
5135 }
5136
5137 unwind->return_reg = reg;
5138 unwind->reg_saved[UNWIND_B3] = FALSE;
5139 if (unwind->reg_saved[reg])
5140 {
5141 as_bad (_("unable to restore return address from "
5142 "previously restored reg"));
5143 return;
5144 }
5145 break;
5146
5147 case DW_CFA_restore:
5148 case DW_CFA_remember_state:
5149 case DW_CFA_restore_state:
5150 case DW_CFA_GNU_window_save:
5151 case CFI_escape:
5152 case CFI_val_encoded_addr:
5153 as_bad (_("unhandled CFA insn for unwinding (%d)"), insn->insn);
5154 break;
5155
5156 default:
5157 abort ();
5158 }
5159 }
5160
5161 if (unwind->cfa_reg != 15 && unwind->cfa_reg != 31)
5162 {
5163 as_bad (_("unable to generate unwinding opcode for frame pointer reg %d"),
5164 unwind->cfa_reg);
5165 return;
5166 }
5167
5168 if (unwind->cfa_reg == 15)
5169 {
5170 if (cfa_offset != 0)
5171 {
5172 as_bad (_("unable to generate unwinding opcode for "
5173 "frame pointer offset"));
5174 return;
5175 }
5176 }
5177 else
5178 {
5179 if ((cfa_offset & 7) != 0)
5180 {
5181 as_bad (_("unwound stack pointer not doubleword aligned"));
5182 return;
5183 }
5184 }
5185
5186 for (reg = 0; reg < TIC6X_NUM_UNWIND_REGS; reg++)
5187 {
5188 if (unwind->reg_saved[reg])
5189 reg_saved_mask |= 1 << (TIC6X_NUM_UNWIND_REGS - (reg + 1));
5190 }
5191
5192 /* Check for standard "safe debug" frame layout */
5193 if (reg_saved_mask)
5194 {
5195 save_offset = 0;
5196 for (reg = 0; reg < TIC6X_NUM_UNWIND_REGS; reg++)
5197 {
5198 if (!unwind->reg_saved[reg])
5199 continue;
5200
5201 if (target_big_endian
5202 && reg < TIC6X_NUM_UNWIND_REGS - 1
5203 && unwind->reg_saved[reg + 1]
5204 && tic6x_unwind_frame_regs[reg]
5205 == tic6x_unwind_frame_regs[reg + 1] + 1
5206 && (tic6x_unwind_frame_regs[reg] & 1) == 1
5207 && (save_offset & 4) == 4)
5208 {
5209 /* Swapped pair */
5210 if (save_offset != unwind->reg_offset[reg + 1]
5211 || save_offset - 4 != unwind->reg_offset[reg])
5212 break;
5213 save_offset -= 8;
5214 reg++;
5215 }
5216 else
5217 {
5218 if (save_offset != unwind->reg_offset[reg])
5219 break;
5220 save_offset -= 4;
5221 }
5222 }
5223 if (reg == TIC6X_NUM_UNWIND_REGS)
5224 {
5225 safe_mask = reg_saved_mask;
5226 reg_saved_mask = 0;
5227 }
5228 }
5229
5230 /* Check for compact frame layout. */
5231 if (reg_saved_mask)
5232 {
5233 save_offset = 0;
5234 for (reg = 0; reg < TIC6X_NUM_UNWIND_REGS; reg++)
5235 {
5236 int reg2;
5237
5238 if (!unwind->reg_saved[reg])
5239 continue;
5240
5241 if (reg < TIC6X_NUM_UNWIND_REGS - 1)
5242 {
5243 reg2 = reg + 1;
5244
5245 if (!unwind->reg_saved[reg2]
5246 || tic6x_unwind_frame_regs[reg]
5247 != tic6x_unwind_frame_regs[reg2] + 1
5248 || (tic6x_unwind_frame_regs[reg2] & 1) != 0
5249 || save_offset == 0)
5250 reg2 = -1;
5251 }
5252 else
5253 reg2 = -1;
5254
5255 if (reg2 >= 0)
5256 {
5257 int high_offset;
5258 if (target_big_endian)
5259 high_offset = 4; /* lower address = positive stack offset. */
5260 else
5261 high_offset = 0;
5262
5263 if (save_offset + 4 - high_offset != unwind->reg_offset[reg]
5264 || save_offset + high_offset != unwind->reg_offset[reg2])
5265 {
5266 break;
5267 }
5268 reg++;
5269 }
5270 else
5271 {
5272 if (save_offset != unwind->reg_offset[reg])
5273 break;
5274 }
5275 save_offset -= 8;
5276 }
5277
5278 if (reg == TIC6X_NUM_UNWIND_REGS)
5279 {
5280 compact_mask = reg_saved_mask;
5281 reg_saved_mask = 0;
5282 }
5283 }
5284
5285 /* Check for __c6xabi_pop_rts format */
5286 if (reg_saved_mask == 0x17ff)
5287 {
5288 const int *pop_rts_offset = target_big_endian
5289 ? tic6x_pop_rts_offset_big
5290 : tic6x_pop_rts_offset_little;
5291
5292 save_offset = 0;
5293 for (reg = 0; reg < TIC6X_NUM_UNWIND_REGS; reg++)
5294 {
5295 if (reg == UNWIND_B15)
5296 continue;
5297
5298 if (unwind->reg_offset[reg] != pop_rts_offset[reg] * 4)
5299 break;
5300 }
5301
5302 if (reg == TIC6X_NUM_UNWIND_REGS)
5303 {
5304 unwind->pop_rts = TRUE;
5305 reg_saved_mask = 0;
5306 }
5307 }
5308 /* If all else fails then describe the frame manually. */
5309 if (reg_saved_mask)
5310 {
5311 save_offset = 0;
5312
5313 for (reg = 0; reg < TIC6X_NUM_UNWIND_REGS; reg++)
5314 {
5315 if (!unwind->reg_saved[reg])
5316 continue;
5317
5318 unwind->saved_reg_count++;
5319 /* Encoding uses 4 bits per word, so size of unwinding opcode data
5320 limits the save area size. The exact cap will be figured out
5321 later due to overflow, the 0x800 here is just a quick sanity
5322 check to weed out obviously excessive offsets. */
5323 if (unwind->reg_offset[reg] > 0 || unwind->reg_offset[reg] < -0x800
5324 || (unwind->reg_offset[reg] & 3) != 0)
5325 {
5326 as_bad (_("stack frame layout too complex for unwinder"));
5327 return;
5328 }
5329
5330 if (unwind->reg_offset[reg] < save_offset)
5331 save_offset = unwind->reg_offset[reg] - 4;
5332 }
5333 }
5334
5335 /* Align to 8-byte boundary (stack grows towards negative offsets). */
5336 save_offset &= ~7;
5337
5338 if (unwind->cfa_reg == 31 && !reg_saved_mask)
5339 {
5340 cfa_offset += save_offset;
5341 if (cfa_offset < 0)
5342 {
5343 as_bad (_("unwound frame has negative size"));
5344 return;
5345 }
5346 }
5347
5348 unwind->safe_mask = safe_mask;
5349 unwind->compact_mask = compact_mask;
5350 unwind->reg_saved_mask = reg_saved_mask;
5351 unwind->cfa_offset = cfa_offset;
5352 unwind->function_start = fde->start_address;
5353 }
This page took 0.20024 seconds and 5 git commands to generate.